From: Kevin Hilman <khilman@deeprootsystems.com>
To: NeilBrown <neilb@suse.de>
Cc: "Shilimkar, Santosh" <santosh.shilimkar@ti.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>,
Tarun Kanti DebBarma <tarun.kanti@ti.com>,
Tony Lindgren <tony@atomide.com>, Benoit <b-cousson@ti.com>,
Grant Likely <grant.likely@secretlab.ca>,
Felipe Balbi <balbi@ti.com>,
linux-omap@vger.kernel.org, lkml <linux-kernel@vger.kernel.org>,
Jon Hunter <jon-hunter@ti.com>
Subject: Re: [PATCH] OMAP GPIO - don't wake from suspend unless requested.
Date: Mon, 10 Sep 2012 11:17:33 -0700 [thread overview]
Message-ID: <874nn5agjm.fsf@deeprootsystems.com> (raw)
In-Reply-To: <20120910141029.64a8b403@notabene.brown> (NeilBrown's message of "Mon, 10 Sep 2012 14:10:29 +1000")
NeilBrown <neilb@suse.de> writes:
[...]
> Yes, I see that now. Thanks.
>
> follow patch folds those to fixes in.
>
> NeilBrown
>
> From bd9d5e9f8742c9cdc795e3d9b895f74defddb6d9 Mon Sep 17 00:00:00 2001
> From: NeilBrown <neilb@suse.de>
> Date: Mon, 10 Sep 2012 14:09:06 +1000
> Subject: [PATCH] OMAP GPIO - don't wake from suspend unless requested.
>
> Current kernel will wake from suspend on an event an any active
> GPIO event if enable_irq_wake() wasn't called.
>
> There are two reasons that the hardware wake-enable bit should be set:
>
> 1/ while non-suspended the CPU might go into a deep sleep (off_mode)
> in which the wake-enable bit is needed for an interrupt to be
> recognised.
> 2/ while suspended the GPIO interrupt should wake from suspend if and
> only if irq_wake as been enabled.
>
> The code currently doesn't keep these two reasons separate so they get
> confused and sometimes the wakeup flags is set incorrectly.
>
> This patch reverts:
> commit 9c4ed9e6c01e7a8bd9079da8267e1f03cb4761fc
> gpio/omap: remove suspend/resume callbacks
> and
> commit 0aa2727399c0b78225021413022c164cb99fbc5e
> gpio/omap: remove suspend_wakeup field from struct gpio_bank
>
> and makes some minor changes so that we have separate flags for "GPIO
> should wake from deep idle" and "GPIO should wake from suspend".
>
> With this patch, the GPIO from my touch screen doesn't wake my device
> any more, which is what I want.
>
> Cc: Kevin Hilman <khilman@ti.com>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Grant Likely <grant.likely@secretlab.ca>
> Cc: Tarun Kanti DebBarma <tarun.kanti@ti.com>
> Cc: Felipe Balbi <balbi@ti.com>
> Cc: Govindraj.R <govindraj.raja@ti.com>
>
> Signed-off-by: NeilBrown <neilb@suse.de>
>
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 4fbc208..79e1340 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -57,6 +57,7 @@ struct gpio_bank {
> u16 irq;
> int irq_base;
> struct irq_domain *domain;
> + u32 suspend_wakeup;
> u32 non_wakeup_gpios;
> u32 enabled_non_wakeup_gpios;
> struct gpio_regs context;
> @@ -522,11 +523,9 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
>
> spin_lock_irqsave(&bank->lock, flags);
> if (enable)
> - bank->context.wake_en |= gpio_bit;
> + bank->suspend_wakeup |= gpio_bit;
> else
> - bank->context.wake_en &= ~gpio_bit;
> -
> - __raw_writel(bank->context.wake_en, bank->base + bank->regs->wkup_en);
> + bank->suspend_wakeup &= ~gpio_bit;
> spin_unlock_irqrestore(&bank->lock, flags);
>
> return 0;
> @@ -1157,6 +1156,49 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
> #ifdef CONFIG_ARCH_OMAP2PLUS
>
> #if defined(CONFIG_PM_RUNTIME)
> +
> +#if defined(CONFIG_PM_SLEEP)
> +static int omap_gpio_suspend(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct gpio_bank *bank = platform_get_drvdata(pdev);
> + void __iomem *base = bank->base;
> + unsigned long flags;
> +
> + if (!bank->mod_usage ||
> + !bank->regs->wkup_en ||
> + !bank->context.wake_en)
nit: the context->wake_en check isn't really needed here.
> + return 0;
> +
> + spin_lock_irqsave(&bank->lock, flags);
> + _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
> + _gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1);
I know we had the duplicate read/modify/writes here before, but that causes
a bunch of unnecessary register accesses. Simply writing
bank->suspend_wakeup should suffice here...
> + spin_unlock_irqrestore(&bank->lock, flags);
> +
> + return 0;
> +}
> +
> +static int omap_gpio_resume(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct gpio_bank *bank = platform_get_drvdata(pdev);
> + void __iomem *base = bank->base;
> + unsigned long flags;
> +
> + if (!bank->mod_usage ||
> + !bank->regs->wkup_en ||
> + !bank->context.wake_en)
> + return 0;
> +
> + spin_lock_irqsave(&bank->lock, flags);
> + _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
> + _gpio_rmw(base, bank->regs->wkup_en, bank->context.wake_en, 1);
...similarily, simply writing context.wake_en should suffice here (after
removing the check for non-zero wake_en above so that we're sure that
the setting of suspend_wakeup is undone.)
Kevin
> + spin_unlock_irqrestore(&bank->lock, flags);
> +
> + return 0;
> +}
> +#endif /* CONFIG_PM_SLEEP */
> +
> static void omap_gpio_restore_context(struct gpio_bank *bank);
>
> static int omap_gpio_runtime_suspend(struct device *dev)
> @@ -1386,11 +1428,14 @@ static void omap_gpio_restore_context(struct gpio_bank *bank)
> }
> #endif /* CONFIG_PM_RUNTIME */
> #else
> +#define omap_gpio_suspend NULL
> +#define omap_gpio_resume NULL
> #define omap_gpio_runtime_suspend NULL
> #define omap_gpio_runtime_resume NULL
> #endif
>
> static const struct dev_pm_ops gpio_pm_ops = {
> + SET_SYSTEM_SLEEP_PM_OPS(omap_gpio_suspend, omap_gpio_resume)
> SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
> NULL)
> };
WARNING: multiple messages have this Message-ID (diff)
From: Kevin Hilman <khilman@deeprootsystems.com>
To: NeilBrown <neilb@suse.de>
Cc: "Shilimkar\, Santosh" <santosh.shilimkar@ti.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>,
Tarun Kanti DebBarma <tarun.kanti@ti.com>,
Tony Lindgren <tony@atomide.com>, Benoit <b-cousson@ti.com>,
Grant Likely <grant.likely@secretlab.ca>,
Felipe Balbi <balbi@ti.com>,
linux-omap@vger.kernel.org, lkml <linux-kernel@vger.kernel.org>,
Jon Hunter <jon-hunter@ti.com>
Subject: Re: [PATCH] OMAP GPIO - don't wake from suspend unless requested.
Date: Mon, 10 Sep 2012 11:17:33 -0700 [thread overview]
Message-ID: <874nn5agjm.fsf@deeprootsystems.com> (raw)
In-Reply-To: <20120910141029.64a8b403@notabene.brown> (NeilBrown's message of "Mon, 10 Sep 2012 14:10:29 +1000")
NeilBrown <neilb@suse.de> writes:
[...]
> Yes, I see that now. Thanks.
>
> follow patch folds those to fixes in.
>
> NeilBrown
>
> From bd9d5e9f8742c9cdc795e3d9b895f74defddb6d9 Mon Sep 17 00:00:00 2001
> From: NeilBrown <neilb@suse.de>
> Date: Mon, 10 Sep 2012 14:09:06 +1000
> Subject: [PATCH] OMAP GPIO - don't wake from suspend unless requested.
>
> Current kernel will wake from suspend on an event an any active
> GPIO event if enable_irq_wake() wasn't called.
>
> There are two reasons that the hardware wake-enable bit should be set:
>
> 1/ while non-suspended the CPU might go into a deep sleep (off_mode)
> in which the wake-enable bit is needed for an interrupt to be
> recognised.
> 2/ while suspended the GPIO interrupt should wake from suspend if and
> only if irq_wake as been enabled.
>
> The code currently doesn't keep these two reasons separate so they get
> confused and sometimes the wakeup flags is set incorrectly.
>
> This patch reverts:
> commit 9c4ed9e6c01e7a8bd9079da8267e1f03cb4761fc
> gpio/omap: remove suspend/resume callbacks
> and
> commit 0aa2727399c0b78225021413022c164cb99fbc5e
> gpio/omap: remove suspend_wakeup field from struct gpio_bank
>
> and makes some minor changes so that we have separate flags for "GPIO
> should wake from deep idle" and "GPIO should wake from suspend".
>
> With this patch, the GPIO from my touch screen doesn't wake my device
> any more, which is what I want.
>
> Cc: Kevin Hilman <khilman@ti.com>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Grant Likely <grant.likely@secretlab.ca>
> Cc: Tarun Kanti DebBarma <tarun.kanti@ti.com>
> Cc: Felipe Balbi <balbi@ti.com>
> Cc: Govindraj.R <govindraj.raja@ti.com>
>
> Signed-off-by: NeilBrown <neilb@suse.de>
>
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 4fbc208..79e1340 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -57,6 +57,7 @@ struct gpio_bank {
> u16 irq;
> int irq_base;
> struct irq_domain *domain;
> + u32 suspend_wakeup;
> u32 non_wakeup_gpios;
> u32 enabled_non_wakeup_gpios;
> struct gpio_regs context;
> @@ -522,11 +523,9 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
>
> spin_lock_irqsave(&bank->lock, flags);
> if (enable)
> - bank->context.wake_en |= gpio_bit;
> + bank->suspend_wakeup |= gpio_bit;
> else
> - bank->context.wake_en &= ~gpio_bit;
> -
> - __raw_writel(bank->context.wake_en, bank->base + bank->regs->wkup_en);
> + bank->suspend_wakeup &= ~gpio_bit;
> spin_unlock_irqrestore(&bank->lock, flags);
>
> return 0;
> @@ -1157,6 +1156,49 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
> #ifdef CONFIG_ARCH_OMAP2PLUS
>
> #if defined(CONFIG_PM_RUNTIME)
> +
> +#if defined(CONFIG_PM_SLEEP)
> +static int omap_gpio_suspend(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct gpio_bank *bank = platform_get_drvdata(pdev);
> + void __iomem *base = bank->base;
> + unsigned long flags;
> +
> + if (!bank->mod_usage ||
> + !bank->regs->wkup_en ||
> + !bank->context.wake_en)
nit: the context->wake_en check isn't really needed here.
> + return 0;
> +
> + spin_lock_irqsave(&bank->lock, flags);
> + _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
> + _gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1);
I know we had the duplicate read/modify/writes here before, but that causes
a bunch of unnecessary register accesses. Simply writing
bank->suspend_wakeup should suffice here...
> + spin_unlock_irqrestore(&bank->lock, flags);
> +
> + return 0;
> +}
> +
> +static int omap_gpio_resume(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct gpio_bank *bank = platform_get_drvdata(pdev);
> + void __iomem *base = bank->base;
> + unsigned long flags;
> +
> + if (!bank->mod_usage ||
> + !bank->regs->wkup_en ||
> + !bank->context.wake_en)
> + return 0;
> +
> + spin_lock_irqsave(&bank->lock, flags);
> + _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
> + _gpio_rmw(base, bank->regs->wkup_en, bank->context.wake_en, 1);
...similarily, simply writing context.wake_en should suffice here (after
removing the check for non-zero wake_en above so that we're sure that
the setting of suspend_wakeup is undone.)
Kevin
> + spin_unlock_irqrestore(&bank->lock, flags);
> +
> + return 0;
> +}
> +#endif /* CONFIG_PM_SLEEP */
> +
> static void omap_gpio_restore_context(struct gpio_bank *bank);
>
> static int omap_gpio_runtime_suspend(struct device *dev)
> @@ -1386,11 +1428,14 @@ static void omap_gpio_restore_context(struct gpio_bank *bank)
> }
> #endif /* CONFIG_PM_RUNTIME */
> #else
> +#define omap_gpio_suspend NULL
> +#define omap_gpio_resume NULL
> #define omap_gpio_runtime_suspend NULL
> #define omap_gpio_runtime_resume NULL
> #endif
>
> static const struct dev_pm_ops gpio_pm_ops = {
> + SET_SYSTEM_SLEEP_PM_OPS(omap_gpio_suspend, omap_gpio_resume)
> SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
> NULL)
> };
next prev parent reply other threads:[~2012-09-10 18:17 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20120825214459.7333a376@notabene.brown>
2012-08-26 4:17 ` [PATCH] OMAP GPIO - don't wake from suspend unless requested Shilimkar, Santosh
2012-08-26 22:53 ` NeilBrown
2012-08-27 1:29 ` Shilimkar, Santosh
2012-09-04 5:59 ` Shilimkar, Santosh
2012-09-06 3:05 ` NeilBrown
2012-09-06 5:48 ` Shilimkar, Santosh
2012-09-06 7:02 ` NeilBrown
2012-09-06 7:27 ` Shilimkar, Santosh
2012-09-06 7:51 ` NeilBrown
2012-09-06 8:43 ` Shilimkar, Santosh
2012-09-06 13:26 ` Felipe Balbi
2012-09-10 6:58 ` NeilBrown
2012-09-06 14:11 ` Shubhrajyoti
2012-09-07 21:37 ` Kevin Hilman
2012-09-07 21:37 ` Kevin Hilman
2012-09-08 7:55 ` Shilimkar, Santosh
2012-09-10 17:57 ` Kevin Hilman
2012-09-10 17:57 ` Kevin Hilman
2012-12-14 7:05 ` NeilBrown
2012-12-14 9:04 ` anish kumar
2012-12-19 22:20 ` Grant Likely
2013-02-05 19:47 ` Kevin Hilman
2013-02-05 19:47 ` Kevin Hilman
2012-09-10 4:10 ` NeilBrown
2012-09-10 18:17 ` Kevin Hilman [this message]
2012-09-10 18:17 ` Kevin Hilman
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=874nn5agjm.fsf@deeprootsystems.com \
--to=khilman@deeprootsystems.com \
--cc=b-cousson@ti.com \
--cc=balbi@ti.com \
--cc=grant.likely@secretlab.ca \
--cc=jon-hunter@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=neilb@suse.de \
--cc=rjw@sisk.pl \
--cc=santosh.shilimkar@ti.com \
--cc=tarun.kanti@ti.com \
--cc=tony@atomide.com \
/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.