On Wed, Jun 13, 2012 at 08:40:43PM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@xxxxxxxxxxxxx> > > With the new common clock infrastructure, the following clocks should be > used on i.MX drivers: ipg, per and ahb. > > Adapt fsl_mxc_udc to follow this new behaviour to fix the following probe error: > > Freescale High-Speed USB SOC Device Controller driver (Apr 20, 2007) > fsl-usb2-udc fsl-usb2-udc: clk_get("usb") failed > fsl-usb2-udc: probe of fsl-usb2-udc failed with error -2 > > Reported-by: Christoph Fritz <chf.fritz@xxxxxxxxxxxxxx> > Signed-off-by: Fabio Estevam <fabio.estevam@xxxxxxxxxxxxx> Looks good for me now. Acked-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > Changes since v4: > - Avoid unbalanced clk_disable_uprepare calls for mxc_per_clk > Changes since v3: > - Remove some cpu_is_ functions > - Simplify error handling > Changes since v2: > - Fix one more error in the mxc_ipg_clk path > Changes since v1: > - Fix error path for mxc_ipg_clk > - Use clk_disable_unprepare in other locations as well > drivers/usb/gadget/fsl_mxc_udc.c | 76 ++++++++++++++++---------------------- > 1 files changed, 32 insertions(+), 44 deletions(-) > > diff --git a/drivers/usb/gadget/fsl_mxc_udc.c b/drivers/usb/gadget/fsl_mxc_udc.c > index dcbc0a2..adb6cb8 100644 > --- a/drivers/usb/gadget/fsl_mxc_udc.c > +++ b/drivers/usb/gadget/fsl_mxc_udc.c > @@ -21,7 +21,8 @@ > #include <mach/hardware.h> > > static struct clk *mxc_ahb_clk; > -static struct clk *mxc_usb_clk; > +static struct clk *mxc_per_clk; > +static struct clk *mxc_ipg_clk; > > /* workaround ENGcm09152 for i.MX35 */ > #define USBPHYCTRL_OTGBASE_OFFSET 0x608 > @@ -35,28 +36,31 @@ int fsl_udc_clk_init(struct platform_device *pdev) > > pdata = pdev->dev.platform_data; > > - if (!cpu_is_mx35() && !cpu_is_mx25()) { > - mxc_ahb_clk = clk_get(&pdev->dev, "usb_ahb"); > - if (IS_ERR(mxc_ahb_clk)) > - return PTR_ERR(mxc_ahb_clk); > - > - ret = clk_enable(mxc_ahb_clk); > - if (ret < 0) { > - dev_err(&pdev->dev, "clk_enable(\"usb_ahb\") failed\n"); > - goto eenahb; > - } > + mxc_ipg_clk = devm_clk_get(&pdev->dev, "ipg"); > + if (IS_ERR(mxc_ipg_clk)) { > + dev_err(&pdev->dev, "clk_get(\"ipg\") failed\n"); > + return PTR_ERR(mxc_ipg_clk); > } > > - /* make sure USB_CLK is running at 60 MHz +/- 1000 Hz */ > - mxc_usb_clk = clk_get(&pdev->dev, "usb"); > - if (IS_ERR(mxc_usb_clk)) { > - dev_err(&pdev->dev, "clk_get(\"usb\") failed\n"); > - ret = PTR_ERR(mxc_usb_clk); > - goto egusb; > + mxc_ahb_clk = devm_clk_get(&pdev->dev, "ahb"); > + if (IS_ERR(mxc_ahb_clk)) { > + dev_err(&pdev->dev, "clk_get(\"ahb\") failed\n"); > + return PTR_ERR(mxc_ahb_clk); > } > + > + mxc_per_clk = devm_clk_get(&pdev->dev, "per"); > + if (IS_ERR(mxc_per_clk)) { > + dev_err(&pdev->dev, "clk_get(\"per\") failed\n"); > + return PTR_ERR(mxc_per_clk); > + } > + > + clk_prepare_enable(mxc_ipg_clk); > + clk_prepare_enable(mxc_ahb_clk); > + clk_prepare_enable(mxc_per_clk); > > + /* make sure USB_CLK is running at 60 MHz +/- 1000 Hz */ > if (!cpu_is_mx51()) { > - freq = clk_get_rate(mxc_usb_clk); > + freq = clk_get_rate(mxc_per_clk); > if (pdata->phy_mode != FSL_USB2_PHY_ULPI && > (freq < 59999000 || freq > 60001000)) { > dev_err(&pdev->dev, "USB_CLK=%lu, should be 60MHz\n", freq); > @@ -65,24 +69,13 @@ int fsl_udc_clk_init(struct platform_device *pdev) > } > } > > - ret = clk_enable(mxc_usb_clk); > - if (ret < 0) { > - dev_err(&pdev->dev, "clk_enable(\"usb_clk\") failed\n"); > - goto eenusb; > - } > - > return 0; > > -eenusb: > eclkrate: > - clk_put(mxc_usb_clk); > - mxc_usb_clk = NULL; > -egusb: > - if (!cpu_is_mx35()) > - clk_disable(mxc_ahb_clk); > -eenahb: > - if (!cpu_is_mx35()) > - clk_put(mxc_ahb_clk); > + clk_disable_unprepare(mxc_ipg_clk); > + clk_disable_unprepare(mxc_ahb_clk); > + clk_disable_unprepare(mxc_per_clk); > + mxc_per_clk = NULL; > return ret; > } > > @@ -104,20 +97,15 @@ void fsl_udc_clk_finalize(struct platform_device *pdev) > > /* ULPI transceivers don't need usbpll */ > if (pdata->phy_mode == FSL_USB2_PHY_ULPI) { > - clk_disable(mxc_usb_clk); > - clk_put(mxc_usb_clk); > - mxc_usb_clk = NULL; > + clk_disable_unprepare(mxc_per_clk); > + mxc_per_clk = NULL; > } > } > > void fsl_udc_clk_release(void) > { > - if (mxc_usb_clk) { > - clk_disable(mxc_usb_clk); > - clk_put(mxc_usb_clk); > - } > - if (!cpu_is_mx35()) { > - clk_disable(mxc_ahb_clk); > - clk_put(mxc_ahb_clk); > - } > + if (mxc_per_clk) > + clk_disable_unprepare(mxc_per_clk); > + clk_disable_unprepare(mxc_ahb_clk); > + clk_disable_unprepare(mxc_ipg_clk); > } > -- > 1.7.1 > > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html