From: Lee Jones <lee.jones@linaro.org>
To: Jon Hunter <jonathanh@nvidia.com>
Cc: linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org
Subject: Re: [PATCH V2] mfd: as3722: Handle interrupts on suspend
Date: Tue, 24 Nov 2015 16:23:44 +0000 [thread overview]
Message-ID: <20151124162344.GG807@x1> (raw)
In-Reply-To: <1448016660-18819-1-git-send-email-jonathanh@nvidia.com>
On Fri, 20 Nov 2015, Jon Hunter wrote:
> The as3722 device is registered as an irqchip and the as3722-rtc interrupt
> is one of it's interrupt sources. When using the as3722-rtc as a wake-up
> device from suspend, the following is seen:
>
> PM: Syncing filesystems ... done.
> Freezing user space processes ... (elapsed 0.001 seconds) done.
> Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
> Suspending console(s) (use no_console_suspend to debug)
> PM: suspend of devices complete after 161.119 msecs
> PM: late suspend of devices complete after 1.048 msecs
> PM: noirq suspend of devices complete after 0.756 msecs
> Disabling non-boot CPUs ...
> CPU1: shutdown
> CPU2: shutdown
> CPU3: shutdown
> Entering suspend state LP1
> Enabling non-boot CPUs ...
> CPU1 is up
> CPU2 is up
> CPU3 is up
> PM: noirq resume of devices complete after 0.487 msecs
> as3722 4-0040: Failed to read IRQ status: -16
> as3722 4-0040: Failed to read IRQ status: -16
> as3722 4-0040: Failed to read IRQ status: -16
> as3722 4-0040: Failed to read IRQ status: -16
> ...
>
> The reason why the as3722 interrupt status cannot be read is because the
> as3722 interrupt is not masked during suspend and when the as3722-rtc
> interrupt occurs, to wake-up the device, the interrupt is seen before the
> i2c controller has been resumed in order to read the as3722 interrupt
> status.
>
> The as3722-rtc driver sets it's interrupt as a wake-up source during
> suspend, which gets propagated to the parent as3722 interrupt. However,
> the as3722-rtc driver cannot disable it's interrupt during suspend
> otherwise we would never be woken up and so the as3722 must disable it's
> interrupt instead.
>
> Fix this by disabling the as3722 interrupt during suspend. To ensure that
> a wake-up event from the as3722 is not missing, enable the as3722 interrupt
> as a wake-up source before disabling the interrupt on entering suspend.
>
> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
> ---
>
> v2 changes:
> - Re-enabled the interrupt in resume before disabling the wake-up.
>
> drivers/mfd/as3722.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
Looks reasonable.
Applied, thanks.
> diff --git a/drivers/mfd/as3722.c b/drivers/mfd/as3722.c
> index 924ea90494ae..3b21eb4bc480 100644
> --- a/drivers/mfd/as3722.c
> +++ b/drivers/mfd/as3722.c
> @@ -405,6 +405,8 @@ static int as3722_i2c_probe(struct i2c_client *i2c,
> goto scrub;
> }
>
> + device_init_wakeup(as3722->dev, true);
> +
> dev_dbg(as3722->dev, "AS3722 core driver initialized successfully\n");
> return 0;
>
> @@ -422,6 +424,29 @@ static int as3722_i2c_remove(struct i2c_client *i2c)
> return 0;
> }
>
> +static int as3722_i2c_suspend(struct device *dev)
> +{
> + struct as3722 *as3722 = dev_get_drvdata(dev);
> +
> + if (device_may_wakeup(dev))
> + enable_irq_wake(as3722->chip_irq);
> + disable_irq(as3722->chip_irq);
> +
> + return 0;
> +}
> +
> +static int as3722_i2c_resume(struct device *dev)
> +{
> + struct as3722 *as3722 = dev_get_drvdata(dev);
> +
> + enable_irq(as3722->chip_irq);
> +
> + if (device_may_wakeup(dev))
> + disable_irq_wake(as3722->chip_irq);
> +
> + return 0;
> +}
> +
> static const struct of_device_id as3722_of_match[] = {
> { .compatible = "ams,as3722", },
> {},
> @@ -434,10 +459,15 @@ static const struct i2c_device_id as3722_i2c_id[] = {
> };
> MODULE_DEVICE_TABLE(i2c, as3722_i2c_id);
>
> +static const struct dev_pm_ops as3722_pm_ops = {
> + SET_SYSTEM_SLEEP_PM_OPS(as3722_i2c_suspend, as3722_i2c_resume)
> +};
> +
> static struct i2c_driver as3722_i2c_driver = {
> .driver = {
> .name = "as3722",
> .of_match_table = as3722_of_match,
> + .pm = &as3722_pm_ops,
> },
> .probe = as3722_i2c_probe,
> .remove = as3722_i2c_remove,
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
prev parent reply other threads:[~2015-11-24 16:23 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-20 10:51 [PATCH V2] mfd: as3722: Handle interrupts on suspend Jon Hunter
2015-11-20 10:51 ` Jon Hunter
2015-11-24 16:23 ` Lee Jones [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151124162344.GG807@x1 \
--to=lee.jones@linaro.org \
--cc=jonathanh@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.