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: Krzysztof Kozlowski <k.kozlowski@samsung.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
f560e32295
commit
5670c2a52f
|
@ -95,8 +95,12 @@ static int amba_pm_runtime_suspend(struct device *dev)
|
|||
struct amba_device *pcdev = to_amba_device(dev);
|
||||
int ret = pm_generic_runtime_suspend(dev);
|
||||
|
||||
if (ret == 0 && dev->driver)
|
||||
clk_disable_unprepare(pcdev->pclk);
|
||||
if (ret == 0 && dev->driver) {
|
||||
if (pm_runtime_is_irq_safe(dev))
|
||||
clk_disable(pcdev->pclk);
|
||||
else
|
||||
clk_disable_unprepare(pcdev->pclk);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -107,7 +111,10 @@ static int amba_pm_runtime_resume(struct device *dev)
|
|||
int ret;
|
||||
|
||||
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... */
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -115,7 +122,7 @@ static int amba_pm_runtime_resume(struct device *dev)
|
|||
|
||||
return pm_generic_runtime_resume(dev);
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static const struct dev_pm_ops amba_pm = {
|
||||
.suspend = pm_generic_suspend,
|
||||
|
|
Loading…
Reference in New Issue