diff mbox

ASoC: jack - check status of GPIO-based pins on resume

Message ID 20170321235043.GA9831@dtor-ws (mailing list archive)
State Accepted
Commit 73548dd316adec41172c31d63a0c35a97bf9577f
Headers show

Commit Message

Dmitry Torokhov March 21, 2017, 11:50 p.m. UTC
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>
---
 include/sound/soc.h  |  1 +
 sound/soc/soc-jack.c | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

Comments

Mark Brown March 24, 2017, 6:51 p.m. UTC | #1
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.
Dmitry Torokhov March 24, 2017, 7:22 p.m. UTC | #2
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.
Mark Brown March 24, 2017, 7:26 p.m. UTC | #3
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.
Dmitry Torokhov March 24, 2017, 7:28 p.m. UTC | #4
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 mbox

Patch

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);