[PATCH 1/5] Revert "PM / wakeirq: Fix dedicated wakeirq for drivers not using autosuspend"

Paolo Pisati p.pisati at gmail.com
Thu Feb 23 15:46:28 UTC 2017


BugLink: http://bugs.launchpad.net/bugs/1665280

This reverts commit 2ebd9a05e5873dd48b49acb0cb5bdd6964fc039c.

Signed-off-by: Paolo Pisati <paolo.pisati at canonical.com>
---
 drivers/base/power/power.h   | 19 +----------
 drivers/base/power/runtime.c |  8 ++---
 drivers/base/power/wakeirq.c | 76 ++++++--------------------------------------
 3 files changed, 15 insertions(+), 88 deletions(-)

diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h
index 01ac5b1a..998fa6b 100644
--- a/drivers/base/power/power.h
+++ b/drivers/base/power/power.h
@@ -20,22 +20,14 @@ static inline void pm_runtime_early_init(struct device *dev)
 extern void pm_runtime_init(struct device *dev);
 extern void pm_runtime_remove(struct device *dev);
 
-#define WAKE_IRQ_DEDICATED_ALLOCATED	BIT(0)
-#define WAKE_IRQ_DEDICATED_MANAGED	BIT(1)
-#define WAKE_IRQ_DEDICATED_MASK		(WAKE_IRQ_DEDICATED_ALLOCATED | \
-					 WAKE_IRQ_DEDICATED_MANAGED)
-
 struct wake_irq {
 	struct device *dev;
-	unsigned int status;
 	int irq;
+	bool dedicated_irq:1;
 };
 
 extern void dev_pm_arm_wake_irq(struct wake_irq *wirq);
 extern void dev_pm_disarm_wake_irq(struct wake_irq *wirq);
-extern void dev_pm_enable_wake_irq_check(struct device *dev,
-					 bool can_change_status);
-extern void dev_pm_disable_wake_irq_check(struct device *dev);
 
 #ifdef CONFIG_PM_SLEEP
 
@@ -110,15 +102,6 @@ static inline void dev_pm_disarm_wake_irq(struct wake_irq *wirq)
 {
 }
 
-static inline void dev_pm_enable_wake_irq_check(struct device *dev,
-						bool can_change_status)
-{
-}
-
-static inline void dev_pm_disable_wake_irq_check(struct device *dev)
-{
-}
-
 #endif
 
 #ifdef CONFIG_PM_SLEEP
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index a49c0e3..19a5d81 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -515,7 +515,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 
 	callback = RPM_GET_CALLBACK(dev, runtime_suspend);
 
-	dev_pm_enable_wake_irq_check(dev, true);
+	dev_pm_enable_wake_irq(dev);
 	retval = rpm_callback(callback, dev);
 	if (retval)
 		goto fail;
@@ -554,7 +554,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 	return retval;
 
  fail:
-	dev_pm_disable_wake_irq_check(dev);
+	dev_pm_disable_wake_irq(dev);
 	__update_runtime_status(dev, RPM_ACTIVE);
 	dev->power.deferred_resume = false;
 	wake_up_all(&dev->power.wait_queue);
@@ -737,12 +737,12 @@ static int rpm_resume(struct device *dev, int rpmflags)
 
 	callback = RPM_GET_CALLBACK(dev, runtime_resume);
 
-	dev_pm_disable_wake_irq_check(dev);
+	dev_pm_disable_wake_irq(dev);
 	retval = rpm_callback(callback, dev);
 	if (retval) {
 		__update_runtime_status(dev, RPM_SUSPENDED);
 		pm_runtime_cancel_pending(dev);
-		dev_pm_enable_wake_irq_check(dev, false);
+		dev_pm_enable_wake_irq(dev);
 	} else {
  no_callback:
 		__update_runtime_status(dev, RPM_ACTIVE);
diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c
index 404d94c..0d77cd6 100644
--- a/drivers/base/power/wakeirq.c
+++ b/drivers/base/power/wakeirq.c
@@ -110,10 +110,8 @@ void dev_pm_clear_wake_irq(struct device *dev)
 	dev->power.wakeirq = NULL;
 	spin_unlock_irqrestore(&dev->power.lock, flags);
 
-	if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED) {
+	if (wirq->dedicated_irq)
 		free_irq(wirq->irq, wirq);
-		wirq->status &= ~WAKE_IRQ_DEDICATED_MASK;
-	}
 	kfree(wirq);
 }
 EXPORT_SYMBOL_GPL(dev_pm_clear_wake_irq);
@@ -181,6 +179,7 @@ int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq)
 
 	wirq->dev = dev;
 	wirq->irq = irq;
+	wirq->dedicated_irq = true;
 	irq_set_status_flags(irq, IRQ_NOAUTOEN);
 
 	/*
@@ -196,8 +195,6 @@ int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq)
 	if (err)
 		goto err_free_irq;
 
-	wirq->status = WAKE_IRQ_DEDICATED_ALLOCATED;
-
 	return err;
 
 err_free_irq:
@@ -213,9 +210,9 @@ EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq);
  * dev_pm_enable_wake_irq - Enable device wake-up interrupt
  * @dev: Device
  *
- * Optionally called from the bus code or the device driver for
- * runtime_resume() to override the PM runtime core managed wake-up
- * interrupt handling to enable the wake-up interrupt.
+ * Called from the bus code or the device driver for
+ * runtime_suspend() to enable the wake-up interrupt while
+ * the device is running.
  *
  * Note that for runtime_suspend()) the wake-up interrupts
  * should be unconditionally enabled unlike for suspend()
@@ -225,7 +222,7 @@ void dev_pm_enable_wake_irq(struct device *dev)
 {
 	struct wake_irq *wirq = dev->power.wakeirq;
 
-	if (wirq && (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED))
+	if (wirq && wirq->dedicated_irq)
 		enable_irq(wirq->irq);
 }
 EXPORT_SYMBOL_GPL(dev_pm_enable_wake_irq);
@@ -234,73 +231,20 @@ EXPORT_SYMBOL_GPL(dev_pm_enable_wake_irq);
  * dev_pm_disable_wake_irq - Disable device wake-up interrupt
  * @dev: Device
  *
- * Optionally called from the bus code or the device driver for
- * runtime_suspend() to override the PM runtime core managed wake-up
- * interrupt handling to disable the wake-up interrupt.
+ * Called from the bus code or the device driver for
+ * runtime_resume() to disable the wake-up interrupt while
+ * the device is running.
  */
 void dev_pm_disable_wake_irq(struct device *dev)
 {
 	struct wake_irq *wirq = dev->power.wakeirq;
 
-	if (wirq && (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED))
+	if (wirq && wirq->dedicated_irq)
 		disable_irq_nosync(wirq->irq);
 }
 EXPORT_SYMBOL_GPL(dev_pm_disable_wake_irq);
 
 /**
- * dev_pm_enable_wake_irq_check - Checks and enables wake-up interrupt
- * @dev: Device
- * @can_change_status: Can change wake-up interrupt status
- *
- * Enables wakeirq conditionally. We need to enable wake-up interrupt
- * lazily on the first rpm_suspend(). This is needed as the consumer device
- * starts in RPM_SUSPENDED state, and the the first pm_runtime_get() would
- * otherwise try to disable already disabled wakeirq. The wake-up interrupt
- * starts disabled with IRQ_NOAUTOEN set.
- *
- * Should be only called from rpm_suspend() and rpm_resume() path.
- * Caller must hold &dev->power.lock to change wirq->status
- */
-void dev_pm_enable_wake_irq_check(struct device *dev,
-				  bool can_change_status)
-{
-	struct wake_irq *wirq = dev->power.wakeirq;
-
-	if (!wirq || !((wirq->status & WAKE_IRQ_DEDICATED_MASK)))
-		return;
-
-	if (likely(wirq->status & WAKE_IRQ_DEDICATED_MANAGED)) {
-		goto enable;
-	} else if (can_change_status) {
-		wirq->status |= WAKE_IRQ_DEDICATED_MANAGED;
-		goto enable;
-	}
-
-	return;
-
-enable:
-	enable_irq(wirq->irq);
-}
-
-/**
- * dev_pm_disable_wake_irq_check - Checks and disables wake-up interrupt
- * @dev: Device
- *
- * Disables wake-up interrupt conditionally based on status.
- * Should be only called from rpm_suspend() and rpm_resume() path.
- */
-void dev_pm_disable_wake_irq_check(struct device *dev)
-{
-	struct wake_irq *wirq = dev->power.wakeirq;
-
-	if (!wirq || !((wirq->status & WAKE_IRQ_DEDICATED_MASK)))
-		return;
-
-	if (wirq->status & WAKE_IRQ_DEDICATED_MANAGED)
-		disable_irq_nosync(wirq->irq);
-}
-
-/**
  * dev_pm_arm_wake_irq - Arm device wake-up
  * @wirq: Device wake-up interrupt
  *
-- 
2.7.4





More information about the kernel-team mailing list