|
@@ -314,3 +314,54 @@ void am33xx_cm_module_disable(u16 inst, s16 cdoffs, u16 clkctrl_offs)
|
|
|
/*
|
|
|
* Clockdomain low-level functions
|
|
|
*/
|
|
|
+
|
|
|
+static int am33xx_clkdm_sleep(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ am33xx_cm_clkdm_force_sleep(clkdm->cm_inst, clkdm->clkdm_offs);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int am33xx_clkdm_wakeup(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ am33xx_cm_clkdm_force_wakeup(clkdm->cm_inst, clkdm->clkdm_offs);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void am33xx_clkdm_allow_idle(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ am33xx_cm_clkdm_enable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs);
|
|
|
+}
|
|
|
+
|
|
|
+static void am33xx_clkdm_deny_idle(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ am33xx_cm_clkdm_disable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs);
|
|
|
+}
|
|
|
+
|
|
|
+static int am33xx_clkdm_clk_enable(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
|
|
|
+ return am33xx_clkdm_wakeup(clkdm);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ bool hwsup = false;
|
|
|
+
|
|
|
+ hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs);
|
|
|
+
|
|
|
+ if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP))
|
|
|
+ am33xx_clkdm_sleep(clkdm);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+struct clkdm_ops am33xx_clkdm_operations = {
|
|
|
+ .clkdm_sleep = am33xx_clkdm_sleep,
|
|
|
+ .clkdm_wakeup = am33xx_clkdm_wakeup,
|
|
|
+ .clkdm_allow_idle = am33xx_clkdm_allow_idle,
|
|
|
+ .clkdm_deny_idle = am33xx_clkdm_deny_idle,
|
|
|
+ .clkdm_clk_enable = am33xx_clkdm_clk_enable,
|
|
|
+ .clkdm_clk_disable = am33xx_clkdm_clk_disable,
|
|
|
+};
|