|
@@ -2277,35 +2277,7 @@ pl022_remove(struct amba_device *adev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_PM
|
|
|
-/*
|
|
|
- * These two functions are used from both suspend/resume and
|
|
|
- * the runtime counterparts to handle external resources like
|
|
|
- * clocks, pins and regulators when going to sleep.
|
|
|
- */
|
|
|
-static void pl022_suspend_resources(struct pl022 *pl022, bool runtime)
|
|
|
-{
|
|
|
- clk_disable_unprepare(pl022->clk);
|
|
|
-
|
|
|
- if (runtime)
|
|
|
- pinctrl_pm_select_idle_state(&pl022->adev->dev);
|
|
|
- else
|
|
|
- pinctrl_pm_select_sleep_state(&pl022->adev->dev);
|
|
|
-}
|
|
|
-
|
|
|
-static void pl022_resume_resources(struct pl022 *pl022, bool runtime)
|
|
|
-{
|
|
|
- /* First go to the default state */
|
|
|
- pinctrl_pm_select_default_state(&pl022->adev->dev);
|
|
|
- if (!runtime)
|
|
|
- /* Then let's idle the pins until the next transfer happens */
|
|
|
- pinctrl_pm_select_idle_state(&pl022->adev->dev);
|
|
|
-
|
|
|
- clk_prepare_enable(pl022->clk);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_SUSPEND
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
|
static int pl022_suspend(struct device *dev)
|
|
|
{
|
|
|
struct pl022 *pl022 = dev_get_drvdata(dev);
|
|
@@ -2317,8 +2289,13 @@ static int pl022_suspend(struct device *dev)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- pm_runtime_get_sync(dev);
|
|
|
- pl022_suspend_resources(pl022, false);
|
|
|
+ ret = pm_runtime_force_suspend(dev);
|
|
|
+ if (ret) {
|
|
|
+ spi_master_resume(pl022->master);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ pinctrl_pm_select_sleep_state(dev);
|
|
|
|
|
|
dev_dbg(dev, "suspended\n");
|
|
|
return 0;
|
|
@@ -2329,8 +2306,9 @@ static int pl022_resume(struct device *dev)
|
|
|
struct pl022 *pl022 = dev_get_drvdata(dev);
|
|
|
int ret;
|
|
|
|
|
|
- pl022_resume_resources(pl022, false);
|
|
|
- pm_runtime_put(dev);
|
|
|
+ ret = pm_runtime_force_resume(dev);
|
|
|
+ if (ret)
|
|
|
+ dev_err(dev, "problem resuming\n");
|
|
|
|
|
|
/* Start the queue running */
|
|
|
ret = spi_master_resume(pl022->master);
|
|
@@ -2341,14 +2319,16 @@ static int pl022_resume(struct device *dev)
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-#endif /* CONFIG_PM */
|
|
|
+#endif
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
|
static int pl022_runtime_suspend(struct device *dev)
|
|
|
{
|
|
|
struct pl022 *pl022 = dev_get_drvdata(dev);
|
|
|
|
|
|
- pl022_suspend_resources(pl022, true);
|
|
|
+ clk_disable_unprepare(pl022->clk);
|
|
|
+ pinctrl_pm_select_idle_state(dev);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2356,7 +2336,9 @@ static int pl022_runtime_resume(struct device *dev)
|
|
|
{
|
|
|
struct pl022 *pl022 = dev_get_drvdata(dev);
|
|
|
|
|
|
- pl022_resume_resources(pl022, true);
|
|
|
+ pinctrl_pm_select_default_state(dev);
|
|
|
+ clk_prepare_enable(pl022->clk);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
#endif
|