Message ID | 20170321235043.GA9831@dtor-ws (mailing list archive) |
---|---|
State | Accepted |
Commit | 73548dd316adec41172c31d63a0c35a97bf9577f |
Headers | show |
On Tue, Mar 21, 2017 at 04:50:43PM -0700, Dmitry Torokhov wrote: > From: Dmitry Torokhov <dtor@chromium.org> > > For GPIO-backed pins that are not configured as wakeup sources, we may > miss change in their state that happens while system is suspended. Let's > use PM notifier to refresh their state upon resume. > > Signed-off-by: Dmitry Torokhov <dtor@chromium.org> > --- Please send patches from the mail account corresponding to the signoff, not doing that makes the patch look like it's missing a signoff (as it's got the From line so more than one signoff is expected but there's only one) which slows down review.
On Fri, Mar 24, 2017 at 06:51:47PM +0000, Mark Brown wrote: > On Tue, Mar 21, 2017 at 04:50:43PM -0700, Dmitry Torokhov wrote: > > From: Dmitry Torokhov <dtor@chromium.org> > > > > For GPIO-backed pins that are not configured as wakeup sources, we may > > miss change in their state that happens while system is suspended. Let's > > use PM notifier to refresh their state upon resume. > > > > Signed-off-by: Dmitry Torokhov <dtor@chromium.org> > > --- > > Please send patches from the mail account corresponding to the signoff, > not doing that makes the patch look like it's missing a signoff (as it's > got the From line so more than one signoff is expected but there's only > one) which slows down review. Resent from @chromium.
On Fri, Mar 24, 2017 at 12:22:09PM -0700, Dmitry Torokhov wrote: > On Fri, Mar 24, 2017 at 06:51:47PM +0000, Mark Brown wrote: > > Please send patches from the mail account corresponding to the signoff, > > not doing that makes the patch look like it's missing a signoff (as it's > > got the From line so more than one signoff is expected but there's only > > one) which slows down review. > Resent from @chromium. Sorry, that was a note for future submissions - I'd already applied when I sent.
On Fri, Mar 24, 2017 at 07:26:29PM +0000, Mark Brown wrote: > On Fri, Mar 24, 2017 at 12:22:09PM -0700, Dmitry Torokhov wrote: > > On Fri, Mar 24, 2017 at 06:51:47PM +0000, Mark Brown wrote: > > > > Please send patches from the mail account corresponding to the signoff, > > > not doing that makes the patch look like it's missing a signoff (as it's > > > got the From line so more than one signoff is expected but there's only > > > one) which slows down review. > > > Resent from @chromium. > > Sorry, that was a note for future submissions - I'd already applied when > I sent. Ah, sorry, well, it was a test for my updated script then ;)
diff --git a/include/sound/soc.h b/include/sound/soc.h index b86168a21d56..c0b8bf463940 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -722,6 +722,7 @@ struct snd_soc_jack_gpio { /* private: */ struct snd_soc_jack *jack; struct delayed_work work; + struct notifier_block pm_notifier; struct gpio_desc *desc; void *data; diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index fbaa1bb41102..d90af94ec1be 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c @@ -19,6 +19,7 @@ #include <linux/workqueue.h> #include <linux/delay.h> #include <linux/export.h> +#include <linux/suspend.h> #include <trace/events/asoc.h> /** @@ -293,6 +294,27 @@ static void gpio_work(struct work_struct *work) snd_soc_jack_gpio_detect(gpio); } +static int snd_soc_jack_pm_notifier(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct snd_soc_jack_gpio *gpio = + container_of(nb, struct snd_soc_jack_gpio, pm_notifier); + + switch (action) { + case PM_POST_SUSPEND: + case PM_POST_HIBERNATION: + case PM_POST_RESTORE: + /* + * Use workqueue so we do not have to care about running + * concurrently with work triggered by the interrupt handler. + */ + queue_delayed_work(system_power_efficient_wq, &gpio->work, 0); + break; + } + + return NOTIFY_DONE; +} + /** * snd_soc_jack_add_gpios - Associate GPIO pins with an ASoC jack * @@ -369,6 +391,13 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, i, ret); } + /* + * Register PM notifier so we do not miss state transitions + * happening while system is asleep. + */ + gpios[i].pm_notifier.notifier_call = snd_soc_jack_pm_notifier; + register_pm_notifier(&gpios[i].pm_notifier); + /* Expose GPIO value over sysfs for diagnostic purposes */ gpiod_export(gpios[i].desc, false); @@ -428,6 +457,7 @@ void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count, for (i = 0; i < count; i++) { gpiod_unexport(gpios[i].desc); + unregister_pm_notifier(&gpios[i].pm_notifier); free_irq(gpiod_to_irq(gpios[i].desc), &gpios[i]); cancel_delayed_work_sync(&gpios[i].work); gpiod_put(gpios[i].desc);