if (udc->clocked)
                return;
        udc->clocked = 1;
+
+       if (IS_ENABLED(CONFIG_COMMON_CLK)) {
+               clk_set_rate(udc->uclk, 48000000);
+               clk_prepare_enable(udc->uclk);
+       }
        clk_prepare_enable(udc->iclk);
        clk_prepare_enable(udc->fclk);
 }
        udc->gadget.speed = USB_SPEED_UNKNOWN;
        clk_disable_unprepare(udc->fclk);
        clk_disable_unprepare(udc->iclk);
+       if (IS_ENABLED(CONFIG_COMMON_CLK))
+               clk_disable_unprepare(udc->uclk);
 }
 
 /*
        /* get interface and function clocks */
        udc->iclk = clk_get(dev, "udc_clk");
        udc->fclk = clk_get(dev, "udpck");
-       if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk)) {
+       if (IS_ENABLED(CONFIG_COMMON_CLK))
+               udc->uclk = clk_get(dev, "usb_clk");
+       if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk) ||
+           (IS_ENABLED(CONFIG_COMMON_CLK) && IS_ERR(udc->uclk))) {
                DBG("clocks missing\n");
                retval = -ENODEV;
-               /* NOTE: we "know" here that refcounts on these are NOPs */
                goto fail1;
        }
 
 fail2:
        free_irq(udc->udp_irq, udc);
 fail1:
+       if (IS_ENABLED(CONFIG_COMMON_CLK) && !IS_ERR(udc->uclk))
+               clk_put(udc->uclk);
        if (!IS_ERR(udc->fclk))
                clk_put(udc->fclk);
        if (!IS_ERR(udc->iclk))
 
        clk_put(udc->iclk);
        clk_put(udc->fclk);
+       if (IS_ENABLED(CONFIG_COMMON_CLK))
+               clk_put(udc->uclk);
 
        return 0;
 }
 
        unsigned                        active_suspend:1;
        u8                              addr;
        struct at91_udc_data            board;
-       struct clk                      *iclk, *fclk;
+       struct clk                      *iclk, *fclk, *uclk;
        struct platform_device          *pdev;
        struct proc_dir_entry           *pde;
        void __iomem                    *udp_baseaddr;