[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