[PATCH 5/8] i2c: nomadik: Fixup system suspend

Ulf Hansson ulf.hansson at linaro.org
Thu Mar 6 02:10:43 EST 2014


On 1 March 2014 11:56, Ulf Hansson <ulf.hansson at linaro.org> wrote:
> For !CONFIG_PM_RUNTIME, the device were never put back into active
> state while resuming.
>
> For CONFIG_PM_RUNTIME, we blindly trusted the device to be inactive
> while we were about to handle it at suspend late, which is just too
> optimistic.
>
> Even if the driver uses pm_runtime_put_sync() after each tranfer to
> return it's runtime PM resources, there are no guarantees this will
> actually mean the device will inactivated. The reason is that the PM
> core will prevent runtime suspend during system suspend, and thus when
> a transfer occurs during the early phases of system suspend the device
> will be kept active after the transfer.
>
> To handle both issues above, use pm_runtime_force_suspend|resume() from
> the system suspend|resume callbacks.
>
> Cc: Alessandro Rubini <rubini at unipv.it>
> Cc: Linus Walleij <linus.walleij at linaro.org>
> Cc: Wolfram Sang <wsa at the-dreams.de>
> Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

Hi Wolfram,

The pm-drivers branch of the linux-pm.git, contains the helper
functions this patch depends on.

If you decide to pull that branch to your tree, to be able to apply
this patch, please let me know. Otherwise I will repost this patch
once 3.15 rc1 is available.

Kind regards
Ulf Hansson

> ---
>  drivers/i2c/busses/i2c-nomadik.c |   14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c
> index 8082f5c..519f5b8 100644
> --- a/drivers/i2c/busses/i2c-nomadik.c
> +++ b/drivers/i2c/busses/i2c-nomadik.c
> @@ -879,19 +879,19 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg)
>  #ifdef CONFIG_PM_SLEEP
>  static int nmk_i2c_suspend_late(struct device *dev)
>  {
> -       pinctrl_pm_select_sleep_state(dev);
> +       int ret;
>
> +       ret = pm_runtime_force_suspend(dev);
> +       if (ret)
> +               return ret;
> +
> +       pinctrl_pm_select_sleep_state(dev);
>         return 0;
>  }
>
>  static int nmk_i2c_resume_early(struct device *dev)
>  {
> -       /* First go to the default state */
> -       pinctrl_pm_select_default_state(dev);
> -       /* Then let's idle the pins until the next transfer happens */
> -       pinctrl_pm_select_idle_state(dev);
> -
> -       return 0;
> +       return pm_runtime_force_resume(dev);
>  }
>  #endif
>
> --
> 1.7.9.5
>



More information about the linux-arm-kernel mailing list