|
@@ -225,3 +225,92 @@ void am33xx_cm_clkdm_force_wakeup(s16 inst, u16 cdoffs)
|
|
/*
|
|
/*
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * am33xx_cm_wait_module_ready - wait for a module to be in 'func' state
|
|
|
|
+ * @inst: CM instance register offset (*_INST macro)
|
|
|
|
+ * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
|
|
|
|
+ * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
|
|
|
|
+ *
|
|
|
|
+ * Wait for the module IDLEST to be functional. If the idle state is in any
|
|
|
|
+ * the non functional state (trans, idle or disabled), module and thus the
|
|
|
|
+ * sysconfig cannot be accessed and will probably lead to an "imprecise
|
|
|
|
+ * external abort"
|
|
|
|
+ */
|
|
|
|
+int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs)
|
|
|
|
+{
|
|
|
|
+ int i = 0;
|
|
|
|
+
|
|
|
|
+ if (!clkctrl_offs)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ omap_test_timeout(_is_module_ready(inst, cdoffs, clkctrl_offs),
|
|
|
|
+ MAX_MODULE_READY_TIME, i);
|
|
|
|
+
|
|
|
|
+ return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * am33xx_cm_wait_module_idle - wait for a module to be in 'disabled'
|
|
|
|
+ * state
|
|
|
|
+ * @inst: CM instance register offset (*_INST macro)
|
|
|
|
+ * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
|
|
|
|
+ * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
|
|
|
|
+ *
|
|
|
|
+ * Wait for the module IDLEST to be disabled. Some PRCM transition,
|
|
|
|
+ * like reset assertion or parent clock de-activation must wait the
|
|
|
|
+ * module to be fully disabled.
|
|
|
|
+ */
|
|
|
|
+int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, u16 clkctrl_offs)
|
|
|
|
+{
|
|
|
|
+ int i = 0;
|
|
|
|
+
|
|
|
|
+ if (!clkctrl_offs)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ omap_test_timeout((_clkctrl_idlest(inst, cdoffs, clkctrl_offs) ==
|
|
|
|
+ CLKCTRL_IDLEST_DISABLED),
|
|
|
|
+ MAX_MODULE_READY_TIME, i);
|
|
|
|
+
|
|
|
|
+ return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * am33xx_cm_module_enable - Enable the modulemode inside CLKCTRL
|
|
|
|
+ * @mode: Module mode (SW or HW)
|
|
|
|
+ * @inst: CM instance register offset (*_INST macro)
|
|
|
|
+ * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
|
|
|
|
+ * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
|
|
|
|
+ *
|
|
|
|
+ * No return value.
|
|
|
|
+ */
|
|
|
|
+void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, u16 clkctrl_offs)
|
|
|
|
+{
|
|
|
|
+ u32 v;
|
|
|
|
+
|
|
|
|
+ v = am33xx_cm_read_reg(inst, clkctrl_offs);
|
|
|
|
+ v &= ~AM33XX_MODULEMODE_MASK;
|
|
|
|
+ v |= mode << AM33XX_MODULEMODE_SHIFT;
|
|
|
|
+ am33xx_cm_write_reg(v, inst, clkctrl_offs);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * am33xx_cm_module_disable - Disable the module inside CLKCTRL
|
|
|
|
+ * @inst: CM instance register offset (*_INST macro)
|
|
|
|
+ * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
|
|
|
|
+ * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
|
|
|
|
+ *
|
|
|
|
+ * No return value.
|
|
|
|
+ */
|
|
|
|
+void am33xx_cm_module_disable(u16 inst, s16 cdoffs, u16 clkctrl_offs)
|
|
|
|
+{
|
|
|
|
+ u32 v;
|
|
|
|
+
|
|
|
|
+ v = am33xx_cm_read_reg(inst, clkctrl_offs);
|
|
|
|
+ v &= ~AM33XX_MODULEMODE_MASK;
|
|
|
|
+ am33xx_cm_write_reg(v, inst, clkctrl_offs);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Clockdomain low-level functions
|
|
|
|
+ */
|