On Fri, Jun 29, 2012 at 01:15:14PM +0200, Marc Kleine-Budde wrote: > On 06/29/2012 11:49 AM, Richard Zhao wrote: > > This patch supports only the host-mode functionality so far. > > > > Signed-off-by: Richard Zhao <richard.zhao@xxxxxxxxxxxxx> > > Signed-off-by: Marek Vasut <marex@xxxxxxx> > > Cc: Peter Chen <peter.chen@xxxxxxxxxxxxx> > > Cc: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > > Cc: Felipe Balbi <balbi@xxxxxx> > > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > > Tested-by: Subodh Nijsure <snijsure@xxxxxxxxxxxx> > > --- > > .../devicetree/bindings/usb/ci13xxx-imx.txt | 18 ++ > > drivers/usb/chipidea/Makefile | 3 + > > drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++++++++++++++++ > > 3 files changed, 219 insertions(+) > > create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt > > create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c > > > > diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt > > new file mode 100644 > > index 0000000..2c29041 > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt > > @@ -0,0 +1,18 @@ > > +* Freescale i.MX ci13xxx usb controllers > > + > > +Required properties: > > +- compatible: Should be "fsl,imx27-usb" > > +- reg: Should contain registers location and length > > +- interrupts: Should contain controller interrupt > > + > > +Optional properties: > > +- fsl,usbphy: phandler of usb phy that connects to the only one port > > +- vbus-supply: regulator for vbus > > + > > +Examples: > > +usb@02184000 { /* USB OTG */ > > + compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; > > + reg = <0x02184000 0x200>; > > + interrupts = <0 43 0x04>; > > + fsl,usbphy = <&usbphy1>; > > +}; > > diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile > > index b69900a..5c66d9c 100644 > > --- a/drivers/usb/chipidea/Makefile > > +++ b/drivers/usb/chipidea/Makefile > > @@ -14,3 +14,6 @@ ifneq ($(CONFIG_PCI),) > > obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_pci.o > > endif > > > > +ifneq ($(CONFIG_OF_DEVICE),) > > + obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o > > +endif > > diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c > > new file mode 100644 > > index 0000000..ef60d06 > > --- /dev/null > > +++ b/drivers/usb/chipidea/ci13xxx_imx.c > > @@ -0,0 +1,198 @@ > > +/* > > + * Copyright 2012 Freescale Semiconductor, Inc. > > + * Copyright (C) 2012 Marek Vasut <marex@xxxxxxx> > > + * on behalf of DENX Software Engineering GmbH > > + * > > + * The code contained herein is licensed under the GNU General Public > > + * License. You may obtain a copy of the GNU General Public License > > + * Version 2 or later at the following locations: > > + * > > + * http://www.opensource.org/licenses/gpl-license.html > > + * http://www.gnu.org/copyleft/gpl.html > > + */ > > + > > +#include <linux/module.h> > > +#include <linux/of_platform.h> > > +#include <linux/of_gpio.h> > > +#include <linux/platform_device.h> > > +#include <linux/pm_runtime.h> > > +#include <linux/dma-mapping.h> > > +#include <linux/usb/chipidea.h> > > +#include <linux/clk.h> > > +#include <linux/regulator/consumer.h> > > + > > +#include "ci.h" > > + > > +#define pdev_to_phy(pdev) \ > > + ((struct usb_phy *)platform_get_drvdata(pdev)) > > + > > +struct ci13xxx_imx_data { > > + struct device_node *phy_np; > > + struct usb_phy *phy; > > + struct platform_device *ci_pdev; > > + struct clk *clk; > > + struct regulator *reg_vbus; > > +}; > > + > > +static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = { > > + .name = "ci13xxx_imx", > > + .flags = CI13XXX_REQUIRE_TRANSCEIVER | > > + CI13XXX_PULLUP_ON_VBUS | > > + CI13XXX_DISABLE_STREAMING, > > + .capoffset = DEF_CAPOFFSET, > > +}; > > + > > +static int __devinit ci13xxx_imx_probe(struct platform_device *pdev) > > +{ > > + struct ci13xxx_imx_data *data; > > + struct platform_device *plat_ci, *phy_pdev; > > + struct device_node *phy_np; > > + struct resource *res; > > + struct regulator *reg_vbus; > > + int ret; > > + > > + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); > > + if (!data) { > > + dev_err(&pdev->dev, "Failed to allocate CI13xxx-IMX data!\n"); > > + return -ENOMEM; > > + } > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + if (!res) { > > + dev_err(&pdev->dev, "Can't get device resources!\n"); > > + return -ENOENT; > > + } > > + > > + data->clk = devm_clk_get(&pdev->dev, NULL); > > + if (IS_ERR(data->clk)) { > > + dev_err(&pdev->dev, > > + "Failed to get clock, err=%ld\n", PTR_ERR(data->clk)); > > + return PTR_ERR(data->clk); > > + } > > + > > + ret = clk_prepare_enable(data->clk); > > + if (ret) { > > + dev_err(&pdev->dev, > > + "Failed to prepare or enable clock, err=%d\n", ret); > > + return ret; > > + } > > + > > + phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0); > > + if (phy_np) { > > + data->phy_np = phy_np; > > + phy_pdev = of_find_device_by_node(phy_np); > > + if (phy_pdev) { > > + struct usb_phy *phy; > > + phy = pdev_to_phy(phy_pdev); > > + if (phy && > > + try_module_get(phy_pdev->dev.driver->owner)) { > > + usb_phy_init(phy); > > + data->phy = phy; > > + } > > + } > > + } > > what about using devm_usb_get_phy_by_phandle() as proposed in Kishon's > patch: "drivers: usb: otg: add device tree support to otg library". I won't use it until it's accepted. Thanks Richard > > Marc > -- 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