|
@@ -99,6 +99,8 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
|
|
static int __init omap4_pm_init(void)
|
|
static int __init omap4_pm_init(void)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
|
|
+ struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm;
|
|
|
|
+ struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
|
|
|
|
|
|
if (!cpu_is_omap44xx())
|
|
if (!cpu_is_omap44xx())
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
@@ -111,6 +113,34 @@ static int __init omap4_pm_init(void)
|
|
goto err2;
|
|
goto err2;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The dynamic dependency between MPUSS -> MEMIF and
|
|
|
|
+ * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
|
|
|
|
+ * expected. The hardware recommendation is to enable static
|
|
|
|
+ * dependencies for these to avoid system lock ups or random crashes.
|
|
|
|
+ */
|
|
|
|
+ mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
|
|
|
|
+ emif_clkdm = clkdm_lookup("l3_emif_clkdm");
|
|
|
|
+ l3_1_clkdm = clkdm_lookup("l3_1_clkdm");
|
|
|
|
+ l3_2_clkdm = clkdm_lookup("l3_2_clkdm");
|
|
|
|
+ l4_per_clkdm = clkdm_lookup("l4_per_clkdm");
|
|
|
|
+ ducati_clkdm = clkdm_lookup("ducati_clkdm");
|
|
|
|
+ if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) ||
|
|
|
|
+ (!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm))
|
|
|
|
+ goto err2;
|
|
|
|
+
|
|
|
|
+ ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
|
|
|
|
+ ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
|
|
|
|
+ ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm);
|
|
|
|
+ ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm);
|
|
|
|
+ ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
|
|
|
|
+ ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
|
|
|
|
+ if (ret) {
|
|
|
|
+ pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 "
|
|
|
|
+ "wakeup dependency\n");
|
|
|
|
+ goto err2;
|
|
|
|
+ }
|
|
|
|
+
|
|
#ifdef CONFIG_SUSPEND
|
|
#ifdef CONFIG_SUSPEND
|
|
suspend_set_ops(&omap_pm_ops);
|
|
suspend_set_ops(&omap_pm_ops);
|
|
#endif /* CONFIG_SUSPEND */
|
|
#endif /* CONFIG_SUSPEND */
|