Commit 5670c2a5 authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Russell King

ARM: 8201/1: amba: Don't unprepare the clocks if device driver wants IRQ safe runtime PM v12

The AMBA bus driver defines runtime Power Management functions which
disable and unprepare AMBA bus clock. This is problematic for runtime PM
because unpreparing a clock might sleep so it is not interrupt safe.

However some drivers may want to implement runtime PM functions in
interrupt-safe way (see pm_runtime_irq_safe()). In such case the AMBA
bus driver should only disable/enable the clock in runtime suspend and
resume callbacks.
Signed-off-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent f560e322
...@@ -95,8 +95,12 @@ static int amba_pm_runtime_suspend(struct device *dev) ...@@ -95,8 +95,12 @@ static int amba_pm_runtime_suspend(struct device *dev)
struct amba_device *pcdev = to_amba_device(dev); struct amba_device *pcdev = to_amba_device(dev);
int ret = pm_generic_runtime_suspend(dev); int ret = pm_generic_runtime_suspend(dev);
if (ret == 0 && dev->driver) if (ret == 0 && dev->driver) {
clk_disable_unprepare(pcdev->pclk); if (pm_runtime_is_irq_safe(dev))
clk_disable(pcdev->pclk);
else
clk_disable_unprepare(pcdev->pclk);
}
return ret; return ret;
} }
...@@ -107,7 +111,10 @@ static int amba_pm_runtime_resume(struct device *dev) ...@@ -107,7 +111,10 @@ static int amba_pm_runtime_resume(struct device *dev)
int ret; int ret;
if (dev->driver) { if (dev->driver) {
ret = clk_prepare_enable(pcdev->pclk); if (pm_runtime_is_irq_safe(dev))
ret = clk_enable(pcdev->pclk);
else
ret = clk_prepare_enable(pcdev->pclk);
/* Failure is probably fatal to the system, but... */ /* Failure is probably fatal to the system, but... */
if (ret) if (ret)
return ret; return ret;
...@@ -115,7 +122,7 @@ static int amba_pm_runtime_resume(struct device *dev) ...@@ -115,7 +122,7 @@ static int amba_pm_runtime_resume(struct device *dev)
return pm_generic_runtime_resume(dev); return pm_generic_runtime_resume(dev);
} }
#endif #endif /* CONFIG_PM */
static const struct dev_pm_ops amba_pm = { static const struct dev_pm_ops amba_pm = {
.suspend = pm_generic_suspend, .suspend = pm_generic_suspend,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment