[PATCH v2] pxa/hx4700: Fix basic suspend/resume
Philipp Zabel
philipp.zabel at gmail.com
Fri Mar 9 12:34:47 EST 2012
Hi Paul,
On Fri, Mar 9, 2012 at 5:36 PM, Paul Parsons <lost.distance at yahoo.com> wrote:
> Basic suspend/resume is fixed by ensuring that the PGSR registers are set
> correctly before sleep mode is entered. In particular four of the active low
> resets need to be driven high while in sleep mode, otherwise the unit resets
> itself instead of suspending. Another problem was that the PCFR_GPROD bit is set
> by the HTC bootloader; this caused GPIO reset (i.e. the reset button) to fail
> immediately after returning from sleep mode.
>
> Signed-off-by: Paul Parsons <lost.distance at yahoo.com>
> ---
>
> V2:
> Removed comment about mmc driver not resuming properly: 10 months later it does.
> Stopped using the verboten MFP_CFG_OUT().
thanks for the update.
> Changed GPIO88, GPIO72, GPIO96 from KEEP_OUTPUT to DRIVE_HIGH.
The bq24022 GPIOs (72 and 96) should stay KEEP_OUTPUT to allow
charging from the AC adapter while suspended.
> Added GPIO61, GPIO81, GPIO116 to global_gpios[].
> Assign to PCFR instead of masking it, per manual: "Write 0b0 to reserved bits".
> Rebased to linux-3.2-rc6.
>
> diff -uprN clean-3.3-rc6/arch/arm/mach-pxa/hx4700.c linux-3.3-rc6/arch/arm/mach-pxa/hx4700.c
> --- clean-3.3-rc6/arch/arm/mach-pxa/hx4700.c 2012-03-04 01:08:09.000000000 +0000
> +++ linux-3.3-rc6/arch/arm/mach-pxa/hx4700.c 2012-03-09 16:06:31.121359005 +0000
> @@ -121,7 +121,11 @@ static unsigned long hx4700_pin_config[]
> GPIO19_SSP2_SCLK,
> GPIO86_SSP2_RXD,
> GPIO87_SSP2_TXD,
> - GPIO88_GPIO,
> + GPIO88_GPIO | MFP_LPM_DRIVE_HIGH, /* TSC2046_CS */
> +
> + /* BQ24022 Regulator */
> + GPIO72_GPIO | MFP_LPM_DRIVE_HIGH, /* BQ24022_nCHARGE_EN */
> + GPIO96_GPIO | MFP_LPM_DRIVE_HIGH, /* BQ24022_ISET2 */
GPIO72_GPIO | MFP_LPM_KEEP_OUTPUT,
GPIO96_GPIO | MFP_LPM_KEEP_OUTPUT,
> /* HX4700 specific input GPIOs */
> GPIO12_GPIO, /* ASIC3_IRQ */
> @@ -134,6 +138,11 @@ static unsigned long hx4700_pin_config[]
> GPIO108_GPIO, /* GSM_READY */
> GPIO58_GPIO, /* TSC2046_nPENIRQ */
> GPIO66_GPIO, /* nSDIO_IRQ */
> +
> + GPIO61_GPIO | MFP_LPM_DRIVE_HIGH, /* W3220_nRESET */
> + GPIO71_GPIO | MFP_LPM_DRIVE_HIGH, /* ASIC3_nRESET */
> + GPIO81_GPIO | MFP_LPM_DRIVE_HIGH, /* CPU_GP_nRESET */
> + GPIO116_GPIO | MFP_LPM_DRIVE_HIGH, /* CPU_HW_nRESET */
> };
>
> /*
> @@ -828,15 +837,20 @@ static struct gpio global_gpios[] = {
> { GPIO110_HX4700_LCD_LVDD_3V3_ON, GPIOF_OUT_INIT_HIGH, "LCD_LVDD" },
> { GPIO111_HX4700_LCD_AVDD_3V3_ON, GPIOF_OUT_INIT_HIGH, "LCD_AVDD" },
> { GPIO32_HX4700_RS232_ON, GPIOF_OUT_INIT_HIGH, "RS232_ON" },
> + { GPIO61_HX4700_W3220_nRESET, GPIOF_OUT_INIT_HIGH, "W3220_nRESET" },
> { GPIO71_HX4700_ASIC3_nRESET, GPIOF_OUT_INIT_HIGH, "ASIC3_nRESET" },
> + { GPIO81_HX4700_CPU_GP_nRESET, GPIOF_OUT_INIT_HIGH, "CPU_GP_nRESET" },
> { GPIO82_HX4700_EUART_RESET, GPIOF_OUT_INIT_HIGH, "EUART_RESET" },
> { GPIO105_HX4700_nIR_ON, GPIOF_OUT_INIT_HIGH, "nIR_EN" },
> + { GPIO116_HX4700_CPU_HW_nRESET, GPIOF_OUT_INIT_HIGH, "CPU_HW_nRESET" },
> };
>
> static void __init hx4700_init(void)
> {
> int ret;
>
> + PCFR = PCFR_GPR_EN | PCFR_OPDE;
> +
> pxa2xx_mfp_config(ARRAY_AND_SIZE(hx4700_pin_config));
> ret = gpio_request_array(ARRAY_AND_SIZE(global_gpios));
> if (ret)
regards
Philipp
More information about the linux-arm-kernel
mailing list