For testing only, not for merging.

Use the clock framework to program DPLL5, DPLL5_M2_CLK.
---
 drivers/usb/host/ehci-omap.c |   57 +++++++++++++++++++++++++++---------------
 1 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index 5252e75..2057f58 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -70,6 +70,8 @@ struct ehci_omap_clock_defs {
        struct clk      *usbhost1_48m_fck_clk;
        struct clk      *usbtll_fck_clk;
        struct clk      *usbtll_ick_clk;
+       struct clk      *dpll5_clk;
+       struct clk      *dpll5_m2_clk;
 };
 
 /* Clock names as per clock framework: May change so keep as #defs */
@@ -163,28 +165,29 @@ static int omap_start_ehc(struct platform_device *dev, 
struct usb_hcd *hcd)
                                ((char *)hcd_to_ehci(hcd)) +
                                        sizeof(struct ehci_hcd));
 
-       /* Start DPLL5 Programming:
-        * Clock Framework is not doing this now:
-        * This will be done in clock framework later
+       /*
+        * Make sure DPLL5 is programmed for 120MHz
+        * XXX should be done at DPLL init time
+        * XXX dpll rates should be assigned to clk->rate at init time
+        * XXX enable DPLL autoidle
         */
-       /* Enable DPLL 5 : Based on Input of 13Mhz*/
-       cm_write_mod_reg((12 << OMAP3430ES2_PERIPH2_DPLL_DIV_SHIFT)|
-                       (120 << OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT),
-                       PLL_MOD, OMAP3430ES2_CM_CLKSEL4);
-
-       cm_write_mod_reg(1 << OMAP3430ES2_DIV_120M_SHIFT,
-                       PLL_MOD, OMAP3430ES2_CM_CLKSEL5);
-
-       cm_write_mod_reg((7 << OMAP3430ES2_PERIPH2_DPLL_FREQSEL_SHIFT) |
-                       (7 << OMAP3430ES2_EN_PERIPH2_DPLL_SHIFT),
-                       PLL_MOD, OMAP3430ES2_CM_CLKEN2);
-
-       while (!(cm_read_mod_reg(PLL_MOD, CM_IDLEST2) &
-                               OMAP3430ES2_ST_PERIPH2_CLK_MASK))
-               dev_dbg(hcd->self.controller,
-                       "idlest2 = 0x%x\n",
-                       cm_read_mod_reg(PLL_MOD, CM_IDLEST2));
-       /* End DPLL5 programming */
+       ehci_clocks->dpll5_clk = clk_get(&dev->dev, "dpll5_ck");
+       if (IS_ERR(ehci_clocks->dpll5_clk)) {
+               WARN_ON(1);
+               return PTR_ERR(ehci_clocks->dpll5_clk);
+       };
+       if (clk_get_rate(ehci_clocks->dpll5_clk) != 120000000)
+               clk_set_rate(ehci_clocks->dpll5_clk, 120000000);
+       clk_enable(ehci_clocks->dpll5_clk);
+
+       /* Program dpll5_m2_clk divider for no division */
+       ehci_clocks->dpll5_m2_clk = clk_get(&dev->dev, "dpll5_m2_ck");
+       if (IS_ERR(ehci_clocks->dpll5_m2_clk)) {
+               WARN_ON(1);
+               return PTR_ERR(ehci_clocks->dpll5_m2_clk);
+       };
+       clk_enable(ehci_clocks->dpll5_m2_clk);
+       clk_set_rate(ehci_clocks->dpll5_m2_clk, 120000000);
 
        /* Enable Clocks for USBHOST */
        ehci_clocks->usbhost_ick_clk = clk_get(&dev->dev,
@@ -375,6 +378,18 @@ static void omap_stop_ehc(struct platform_device *dev, 
struct usb_hcd *hcd)
                ehci_clocks->usbtll_ick_clk = NULL;
        }
 
+       if (ehci_clocks->dpll5_m2_clk != NULL) {
+               clk_disable(ehci_clocks->dpll5_m2_clk);
+               clk_put(ehci_clocks->dpll5_m2_clk);
+               ehci_clocks->dpll5_m2_clk = NULL;
+       }
+
+       if (ehci_clocks->dpll5_clk != NULL) {
+               clk_disable(ehci_clocks->dpll5_clk);
+               clk_put(ehci_clocks->dpll5_clk);
+               ehci_clocks->dpll5_clk = NULL;
+       }
+
 
 #ifdef EXTERNAL_PHY_RESET
        gpio_free(EXT_PHY_RESET_GPIO_PORT1);


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to