|
@@ -200,3 +200,41 @@ static int omap3xxx_clkdm_sleep(struct clockdomain *clkdm)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int omap3xxx_clkdm_wakeup(struct clockdomain *clkdm)
|
|
|
|
+{
|
|
|
|
+ omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs,
|
|
|
|
+ clkdm->clktrctrl_mask);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void omap3xxx_clkdm_allow_idle(struct clockdomain *clkdm)
|
|
|
|
+{
|
|
|
|
+ if (atomic_read(&clkdm->usecount) > 0)
|
|
|
|
+ _clkdm_add_autodeps(clkdm);
|
|
|
|
+
|
|
|
|
+ omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
|
|
|
|
+ clkdm->clktrctrl_mask);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void omap3xxx_clkdm_deny_idle(struct clockdomain *clkdm)
|
|
|
|
+{
|
|
|
|
+ omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
|
|
|
|
+ clkdm->clktrctrl_mask);
|
|
|
|
+
|
|
|
|
+ if (atomic_read(&clkdm->usecount) > 0)
|
|
|
|
+ _clkdm_del_autodeps(clkdm);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm)
|
|
|
|
+{
|
|
|
|
+ bool hwsup = false;
|
|
|
|
+
|
|
|
|
+ if (!clkdm->clktrctrl_mask)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * The CLKDM_MISSING_IDLE_REPORTING flag documentation has
|
|
|
|
+ * more details on the unpleasant problem this is working
|
|
|
|
+ * around
|
|
|
|
+ */
|
|
|
|
+ if ((clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) &&
|