Eric, can you please take a look at this? The current code only setups the LPM on pxa2xx_mfp_config() or pxa2xx_set_lpm(), if we dont save PGSR the board code needs to call mfp_set_lpm for each pin it wants LPM on the suspend() function, otherwise the LPM configuration will only be valid on the first suspend.
This is a regression introduced by commit 5a3d96519040f9736b9f8089e2a1e33a81a6eafe, and it is broken since september. My board uses GPIO4 falling edge to ask the PMIC to poweroff, without this patch i can only suspend/resume once, the second attempt results on a poweroff because GPIO4 goes low on suspend. Em Sáb, 2009-05-02 às 15:05 -0300, Daniel Ribeiro escreveu: > Signed-off-by: Daniel Ribeiro <drw...@gmail.com> > > diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c > b/arch/arm/mach-pxa/mfp-pxa2xx.c > index 7ffb91d..6ae5060 100644 > --- a/arch/arm/mach-pxa/mfp-pxa2xx.c > +++ b/arch/arm/mach-pxa/mfp-pxa2xx.c > @@ -322,6 +322,7 @@ static inline void pxa27x_mfp_init(void) {} > #ifdef CONFIG_PM > static unsigned long saved_gafr[2][4]; > static unsigned long saved_gpdr[4]; > +static unsigned long saved_pgsr[4]; > > static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state) > { > @@ -332,6 +333,7 @@ static int pxa2xx_mfp_suspend(struct sys_device *d, > pm_message_t state) > saved_gafr[0][i] = GAFR_L(i); > saved_gafr[1][i] = GAFR_U(i); > saved_gpdr[i] = GPDR(i * 32); > + saved_pgsr[i] = PGSR(i); > > GPDR(i * 32) = gpdr_lpm[i]; > } > @@ -346,6 +348,7 @@ static int pxa2xx_mfp_resume(struct sys_device *d) > GAFR_L(i) = saved_gafr[0][i]; > GAFR_U(i) = saved_gafr[1][i]; > GPDR(i * 32) = saved_gpdr[i]; > + PGSR(i) = saved_pgsr[i]; > } > PSSR = PSSR_RDH | PSSR_PH; > return 0; > -- Daniel Ribeiro