Re: [PATCHv2 2.6.34-rc7 1/3] mxc: gadget: remove 60mhz clockrequirement for freescale mx51 usb core
From: Guennadi Liakhovetski
Date: Mon May 10 2010 - 14:43:20 EST
On Mon, 10 May 2010, Dinh Nguyen wrote:
> renamed fsl_mx3_udc.c -> fsl_mxc_udc.c
> for mx51, usb core is clocked from sources that are not 60mhz.
>
> This patch applies to 2.6.34-rc7.
For such patches it helps to use the "-M -C" options to "git format
patch," which would then make reviewing your changes easier...
Thanks
Guennadi
>
> Signed-off-by: Dinh Nguyen <Dinh.Nguyen@xxxxxxxxxxxxx>
> ---
> drivers/usb/gadget/Makefile | 2 +-
> drivers/usb/gadget/fsl_mx3_udc.c | 104 -------------------------------------
> drivers/usb/gadget/fsl_mxc_udc.c | 106 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 107 insertions(+), 105 deletions(-)
> delete mode 100644 drivers/usb/gadget/fsl_mx3_udc.c
> create mode 100644 drivers/usb/gadget/fsl_mxc_udc.c
>
> diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile
> index 43b51da..c922eef 100644
> --- a/drivers/usb/gadget/Makefile
> +++ b/drivers/usb/gadget/Makefile
> @@ -20,7 +20,7 @@ obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o
> obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o
> fsl_usb2_udc-objs := fsl_udc_core.o
> ifeq ($(CONFIG_ARCH_MXC),y)
> -fsl_usb2_udc-objs += fsl_mx3_udc.o
> +fsl_usb2_udc-objs += fsl_mxc_udc.o
> endif
> obj-$(CONFIG_USB_M66592) += m66592-udc.o
> obj-$(CONFIG_USB_R8A66597) += r8a66597-udc.o
> diff --git a/drivers/usb/gadget/fsl_mx3_udc.c b/drivers/usb/gadget/fsl_mx3_udc.c
> deleted file mode 100644
> index 20a802e..0000000
> --- a/drivers/usb/gadget/fsl_mx3_udc.c
> +++ /dev/null
> @@ -1,104 +0,0 @@
> -/*
> - * Copyright (C) 2009
> - * Guennadi Liakhovetski, DENX Software Engineering, <lg@xxxxxxx>
> - *
> - * Description:
> - * Helper routines for i.MX3x SoCs from Freescale, needed by the fsl_usb2_udc.c
> - * driver to function correctly on these systems.
> - *
> - * This program is free software; you can redistribute it and/or modify it
> - * under the terms of the GNU General Public License as published by the
> - * Free Software Foundation; either version 2 of the License, or (at your
> - * option) any later version.
> - */
> -#include <linux/clk.h>
> -#include <linux/delay.h>
> -#include <linux/err.h>
> -#include <linux/fsl_devices.h>
> -#include <linux/platform_device.h>
> -
> -#include <mach/hardware.h>
> -
> -static struct clk *mxc_ahb_clk;
> -static struct clk *mxc_usb_clk;
> -
> -int fsl_udc_clk_init(struct platform_device *pdev)
> -{
> - struct fsl_usb2_platform_data *pdata;
> - unsigned long freq;
> - int ret;
> -
> - pdata = pdev->dev.platform_data;
> -
> - if (!cpu_is_mx35()) {
> - 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;
> - }
> - }
> -
> - /* 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;
> - }
> -
> - freq = clk_get_rate(mxc_usb_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);
> - ret = -EINVAL;
> - goto eclkrate;
> - }
> -
> - 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);
> - return ret;
> -}
> -
> -void fsl_udc_clk_finalize(struct platform_device *pdev)
> -{
> - struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
> -
> - /* 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;
> - }
> -}
> -
> -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);
> - }
> -}
> diff --git a/drivers/usb/gadget/fsl_mxc_udc.c b/drivers/usb/gadget/fsl_mxc_udc.c
> new file mode 100644
> index 0000000..d0b8bde
> --- /dev/null
> +++ b/drivers/usb/gadget/fsl_mxc_udc.c
> @@ -0,0 +1,106 @@
> +/*
> + * Copyright (C) 2009
> + * Guennadi Liakhovetski, DENX Software Engineering, <lg@xxxxxxx>
> + *
> + * Description:
> + * Helper routines for i.MX3x SoCs from Freescale, needed by the fsl_usb2_udc.c
> + * driver to function correctly on these systems.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +#include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/fsl_devices.h>
> +#include <linux/platform_device.h>
> +
> +#include <mach/hardware.h>
> +
> +static struct clk *mxc_ahb_clk;
> +static struct clk *mxc_usb_clk;
> +
> +int fsl_udc_clk_init(struct platform_device *pdev)
> +{
> + struct fsl_usb2_platform_data *pdata;
> + unsigned long freq;
> + int ret;
> +
> + pdata = pdev->dev.platform_data;
> +
> + if (!cpu_is_mx35()) {
> + 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;
> + }
> + }
> +
> + /* 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;
> + }
> +
> + if (!cpu_is_mx51()) {
> + freq = clk_get_rate(mxc_usb_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);
> + ret = -EINVAL;
> + goto eclkrate;
> + }
> + }
> +
> + 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);
> + return ret;
> +}
> +
> +void fsl_udc_clk_finalize(struct platform_device *pdev)
> +{
> + struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
> +
> + /* 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;
> + }
> +}
> +
> +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);
> + }
> +}
> --
> 1.6.0.4
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/