|
@@ -28,6 +28,124 @@
|
|
*/
|
|
*/
|
|
#define DPLL5_FREQ_FOR_USBHOST 120000000
|
|
#define DPLL5_FREQ_FOR_USBHOST 120000000
|
|
|
|
|
|
|
|
+#define OMAP3430ES2_ST_DSS_IDLE_SHIFT 1
|
|
|
|
+#define OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT 5
|
|
|
|
+#define OMAP3430ES2_ST_SSI_IDLE_SHIFT 8
|
|
|
|
+
|
|
|
|
+#define OMAP34XX_CM_IDLEST_VAL 1
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
|
|
|
|
+ * @clk: struct clk * being enabled
|
|
|
|
+ * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
|
|
|
|
+ * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
|
|
|
|
+ * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
|
|
|
|
+ *
|
|
|
|
+ * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift
|
|
|
|
+ * from the CM_{I,F}CLKEN bit. Pass back the correct info via
|
|
|
|
+ * @idlest_reg and @idlest_bit. No return value.
|
|
|
|
+ */
|
|
|
|
+static void omap3430es2_clk_ssi_find_idlest(struct clk_hw_omap *clk,
|
|
|
|
+ void __iomem **idlest_reg,
|
|
|
|
+ u8 *idlest_bit,
|
|
|
|
+ u8 *idlest_val)
|
|
|
|
+{
|
|
|
|
+ u32 r;
|
|
|
|
+
|
|
|
|
+ r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
|
|
|
|
+ *idlest_reg = (__force void __iomem *)r;
|
|
|
|
+ *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT;
|
|
|
|
+ *idlest_val = OMAP34XX_CM_IDLEST_VAL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const struct clk_hw_omap_ops clkhwops_omap3430es2_ssi_wait = {
|
|
|
|
+ .find_idlest = omap3430es2_clk_ssi_find_idlest,
|
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_ssi_wait = {
|
|
|
|
+ .allow_idle = omap2_clkt_iclk_allow_idle,
|
|
|
|
+ .deny_idle = omap2_clkt_iclk_deny_idle,
|
|
|
|
+ .find_idlest = omap3430es2_clk_ssi_find_idlest,
|
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
|
|
|
|
+ * @clk: struct clk * being enabled
|
|
|
|
+ * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
|
|
|
|
+ * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
|
|
|
|
+ * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
|
|
|
|
+ *
|
|
|
|
+ * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
|
|
|
|
+ * target IDLEST bits. For our purposes, we are concerned with the
|
|
|
|
+ * target IDLEST bits, which exist at a different bit position than
|
|
|
|
+ * the *CLKEN bit position for these modules (DSS and USBHOST) (The
|
|
|
|
+ * default find_idlest code assumes that they are at the same
|
|
|
|
+ * position.) No return value.
|
|
|
|
+ */
|
|
|
|
+static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk_hw_omap *clk,
|
|
|
|
+ void __iomem **idlest_reg,
|
|
|
|
+ u8 *idlest_bit,
|
|
|
|
+ u8 *idlest_val)
|
|
|
|
+{
|
|
|
|
+ u32 r;
|
|
|
|
+
|
|
|
|
+ r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
|
|
|
|
+ *idlest_reg = (__force void __iomem *)r;
|
|
|
|
+ /* USBHOST_IDLE has same shift */
|
|
|
|
+ *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT;
|
|
|
|
+ *idlest_val = OMAP34XX_CM_IDLEST_VAL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const struct clk_hw_omap_ops clkhwops_omap3430es2_dss_usbhost_wait = {
|
|
|
|
+ .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest,
|
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_dss_usbhost_wait = {
|
|
|
|
+ .allow_idle = omap2_clkt_iclk_allow_idle,
|
|
|
|
+ .deny_idle = omap2_clkt_iclk_deny_idle,
|
|
|
|
+ .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest,
|
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
|
|
|
|
+ * @clk: struct clk * being enabled
|
|
|
|
+ * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
|
|
|
|
+ * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
|
|
|
|
+ * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
|
|
|
|
+ *
|
|
|
|
+ * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
|
|
|
|
+ * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via
|
|
|
|
+ * @idlest_reg and @idlest_bit. No return value.
|
|
|
|
+ */
|
|
|
|
+static void omap3430es2_clk_hsotgusb_find_idlest(struct clk_hw_omap *clk,
|
|
|
|
+ void __iomem **idlest_reg,
|
|
|
|
+ u8 *idlest_bit,
|
|
|
|
+ u8 *idlest_val)
|
|
|
|
+{
|
|
|
|
+ u32 r;
|
|
|
|
+
|
|
|
|
+ r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
|
|
|
|
+ *idlest_reg = (__force void __iomem *)r;
|
|
|
|
+ *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT;
|
|
|
|
+ *idlest_val = OMAP34XX_CM_IDLEST_VAL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_hsotgusb_wait = {
|
|
|
|
+ .allow_idle = omap2_clkt_iclk_allow_idle,
|
|
|
|
+ .deny_idle = omap2_clkt_iclk_deny_idle,
|
|
|
|
+ .find_idlest = omap3430es2_clk_hsotgusb_find_idlest,
|
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const struct clk_hw_omap_ops clkhwops_omap3430es2_hsotgusb_wait = {
|
|
|
|
+ .find_idlest = omap3430es2_clk_hsotgusb_find_idlest,
|
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
|
+};
|
|
|
|
+
|
|
static struct ti_dt_clk omap3xxx_clks[] = {
|
|
static struct ti_dt_clk omap3xxx_clks[] = {
|
|
DT_CLK(NULL, "apb_pclk", "dummy_apb_pclk"),
|
|
DT_CLK(NULL, "apb_pclk", "dummy_apb_pclk"),
|
|
DT_CLK(NULL, "omap_32k_fck", "omap_32k_fck"),
|
|
DT_CLK(NULL, "omap_32k_fck", "omap_32k_fck"),
|