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


Reply via email to