usb: gadget: mv_udc: refine the clock relative code
authorNeil Zhang <zhangwm@marvell.com>
Wed, 30 Nov 2011 01:57:15 +0000 (09:57 +0800)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Dec 2011 09:45:24 +0000 (11:45 +0200)
Split the clock relative code from clock gating solution.
Then we can remove some duplicate code, make the code more clean.

Signed-off-by: Neil Zhang <zhangwm@marvell.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/mv_udc_core.c

index 6ff0b6b238accac206a9cea7371fb244e84b707d..77e906556378cbc3e8eae20b57c4547cdec47207 100644 (file)
@@ -1138,11 +1138,11 @@ static int udc_reset(struct mv_udc *udc)
        return 0;
 }
 
-static int mv_udc_enable(struct mv_udc *udc)
+static int mv_udc_enable_internal(struct mv_udc *udc)
 {
        int retval;
 
-       if (udc->clock_gating == 0 || udc->active)
+       if (udc->active)
                return 0;
 
        dev_dbg(&udc->dev->dev, "enable udc\n");
@@ -1161,9 +1161,17 @@ static int mv_udc_enable(struct mv_udc *udc)
        return 0;
 }
 
-static void mv_udc_disable(struct mv_udc *udc)
+static int mv_udc_enable(struct mv_udc *udc)
 {
-       if (udc->clock_gating && udc->active) {
+       if (udc->clock_gating)
+               return mv_udc_enable_internal(udc);
+
+       return 0;
+}
+
+static void mv_udc_disable_internal(struct mv_udc *udc)
+{
+       if (udc->active) {
                dev_dbg(&udc->dev->dev, "disable udc\n");
                if (udc->pdata->phy_deinit)
                        udc->pdata->phy_deinit(udc->phy_regs);
@@ -1172,6 +1180,12 @@ static void mv_udc_disable(struct mv_udc *udc)
        }
 }
 
+static void mv_udc_disable(struct mv_udc *udc)
+{
+       if (udc->clock_gating)
+               mv_udc_disable_internal(udc);
+}
+
 static int mv_udc_get_frame(struct usb_gadget *gadget)
 {
        struct mv_udc *udc;
@@ -2253,14 +2267,9 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
        }
 
        /* we will acces controller register, so enable the clk */
-       udc_clock_enable(udc);
-       if (pdata->phy_init) {
-               retval = pdata->phy_init(udc->phy_regs);
-               if (retval) {
-                       dev_err(&dev->dev, "phy init error %d\n", retval);
-                       goto err_iounmap_phyreg;
-               }
-       }
+       retval = mv_udc_enable_internal(udc);
+       if (retval)
+               goto err_iounmap_phyreg;
 
        udc->op_regs = (struct mv_op_regs __iomem *)((u32)udc->cap_regs
                + (readl(&udc->cap_regs->caplength_hciversion)
@@ -2388,11 +2397,9 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
         * If not, it means that VBUS detection is not supported, we
         * have to enable vbus active all the time to let controller work.
         */
-       if (udc->clock_gating) {
-               if (udc->pdata->phy_deinit)
-                       udc->pdata->phy_deinit(udc->phy_regs);
-               udc_clock_disable(udc);
-       } else
+       if (udc->clock_gating)
+               mv_udc_disable_internal(udc);
+       else
                udc->vbus_active = 1;
 
        retval = usb_add_gadget_udc(&dev->dev, &udc->gadget);
@@ -2422,9 +2429,7 @@ err_free_dma:
        dma_free_coherent(&dev->dev, udc->ep_dqh_size,
                        udc->ep_dqh, udc->ep_dqh_dma);
 err_disable_clock:
-       if (udc->pdata->phy_deinit)
-               udc->pdata->phy_deinit(udc->phy_regs);
-       udc_clock_disable(udc);
+       mv_udc_disable_internal(udc);
 err_iounmap_phyreg:
        iounmap((void *)udc->phy_regs);
 err_iounmap_capreg: