diff options
Diffstat (limited to 'arch/arm/mach-at91/arm920t/clock.c')
| -rw-r--r-- | arch/arm/mach-at91/arm920t/clock.c | 38 | 
1 files changed, 38 insertions, 0 deletions
| diff --git a/arch/arm/mach-at91/arm920t/clock.c b/arch/arm/mach-at91/arm920t/clock.c index 2813bf78216..8aa21005d0a 100644 --- a/arch/arm/mach-at91/arm920t/clock.c +++ b/arch/arm/mach-at91/arm920t/clock.c @@ -18,6 +18,8 @@  # error You need to define CONFIG_AT91FAMILY in your board config!  #endif +#define EN_PLLB_TIMEOUT	500 +  DECLARE_GLOBAL_DATA_PTR;  static unsigned long at91_css_to_rate(unsigned long css) @@ -155,3 +157,39 @@ int at91_clock_init(unsigned long main_clock)  	return 0;  } + +int at91_pllb_clk_enable(u32 pllbr) +{ +	struct at91_pmc *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; +	ulong start_time, tmp_time; + +	start_time = get_timer(0); +	writel(pllbr, &pmc->pllbr); +	while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB) { +		tmp_time = get_timer(0); +		if ((tmp_time - start_time) > EN_PLLB_TIMEOUT) { +			printf("ERROR: failed to enable PLLB\n"); +			return -1; +		} +	} + +	return 0; +} + +int at91_pllb_clk_disable(void) +{ +	struct at91_pmc *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; +	ulong start_time, tmp_time; + +	start_time = get_timer(0); +	writel(0, &pmc->pllbr); +	while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0) { +		tmp_time = get_timer(0); +		if ((tmp_time - start_time) > EN_PLLB_TIMEOUT) { +			printf("ERROR: failed to disable PLLB\n"); +			return -1; +		} +	} + +	return 0; +} | 
