|
|
@@ -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,
|