diff options
Diffstat (limited to 'arch/arm/mach-at91/pm.c')
| -rw-r--r-- | arch/arm/mach-at91/pm.c | 41 | 
1 files changed, 17 insertions, 24 deletions
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 1606379ac284..f630250c6b87 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -136,7 +136,7 @@ static int at91_pm_verify_clocks(void)  	unsigned long scsr;  	int i; -	scsr = at91_sys_read(AT91_PMC_SCSR); +	scsr = at91_pmc_read(AT91_PMC_SCSR);  	/* USB must not be using PLLB */  	if (cpu_is_at91rm9200()) { @@ -150,11 +150,6 @@ static int at91_pm_verify_clocks(void)  			pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");  			return 0;  		} -	} else if (cpu_is_at91cap9()) { -		if ((scsr & AT91CAP9_PMC_UHP) != 0) { -			pr_err("AT91: PM - Suspend-to-RAM with USB still active\n"); -			return 0; -		}  	}  #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS @@ -165,7 +160,7 @@ static int at91_pm_verify_clocks(void)  		if ((scsr & (AT91_PMC_PCK0 << i)) == 0)  			continue; -		css = at91_sys_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS; +		css = at91_pmc_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS;  		if (css != AT91_PMC_CSS_SLOW) {  			pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css);  			return 0; @@ -193,23 +188,23 @@ int at91_suspend_entering_slow_clock(void)  EXPORT_SYMBOL(at91_suspend_entering_slow_clock); -static void (*slow_clock)(void); +static void (*slow_clock)(void __iomem *pmc, void __iomem *ramc0, +			  void __iomem *ramc1, int memctrl);  #ifdef CONFIG_AT91_SLOW_CLOCK -extern void at91_slow_clock(void); +extern void at91_slow_clock(void __iomem *pmc, void __iomem *ramc0, +			    void __iomem *ramc1, int memctrl);  extern u32 at91_slow_clock_sz;  #endif -  static int at91_pm_enter(suspend_state_t state)  { -	u32 saved_lpr;  	at91_gpio_suspend();  	at91_irq_suspend();  	pr_debug("AT91: PM - wake mask %08x, pm state %d\n",  			/* remember all the always-wake irqs */ -			(at91_sys_read(AT91_PMC_PCSR) +			(at91_pmc_read(AT91_PMC_PCSR)  					| (1 << AT91_ID_FIQ)  					| (1 << AT91_ID_SYS)  					| (at91_extern_irq)) @@ -234,11 +229,18 @@ static int at91_pm_enter(suspend_state_t state)  			 * turning off the main oscillator; reverse on wakeup.  			 */  			if (slow_clock) { +				int memctrl = AT91_MEMCTRL_SDRAMC; + +				if (cpu_is_at91rm9200()) +					memctrl = AT91_MEMCTRL_MC; +				else if (cpu_is_at91sam9g45()) +					memctrl = AT91_MEMCTRL_DDRSDR;  #ifdef CONFIG_AT91_SLOW_CLOCK  				/* copy slow_clock handler to SRAM, and call it */  				memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz);  #endif -				slow_clock(); +				slow_clock(at91_pmc_base, at91_ramc_base[0], +					   at91_ramc_base[1], memctrl);  				break;  			} else {  				pr_info("AT91: PM - no slow clock mode enabled ...\n"); @@ -259,16 +261,7 @@ static int at91_pm_enter(suspend_state_t state)  			 * For ARM 926 based chips, this requirement is weaker  			 * as at91sam9 can access a RAM in self-refresh mode.  			 */ -			asm volatile (	"mov r0, #0\n\t" -					"b 1f\n\t" -					".align 5\n\t" -					"1: mcr p15, 0, r0, c7, c10, 4\n\t" -					: /* no output */ -					: /* no input */ -					: "r0"); -			saved_lpr = sdram_selfrefresh_enable(); -			wait_for_interrupt_enable(); -			sdram_selfrefresh_disable(saved_lpr); +			at91_standby();  			break;  		case PM_SUSPEND_ON: @@ -316,7 +309,7 @@ static int __init at91_pm_init(void)  #ifdef CONFIG_ARCH_AT91RM9200  	/* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */ -	at91_sys_write(AT91_SDRAMC_LPR, 0); +	at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);  #endif  	suspend_set_ops(&at91_pm_ops);  |