This adds device tree support to the chipidea-imx driver. There is no way to set flags or enable ULPI yet. Only host mode is supported for now. Signed-off-by: Philipp Zabel <philipp.zabel@xxxxxxxxx> --- drivers/usb/imx/chipidea-imx.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/drivers/usb/imx/chipidea-imx.c b/drivers/usb/imx/chipidea-imx.c index 1570f90..87e6a9d 100644 --- a/drivers/usb/imx/chipidea-imx.c +++ b/drivers/usb/imx/chipidea-imx.c @@ -29,11 +29,11 @@ static int imx_chipidea_port_init(void *drvdata) struct imxusb_platformdata *pdata = dev->platform_data; int ret; - ret = imx_usbmisc_port_init(dev->id, pdata->flags); + ret = imx_usbmisc_port_init(dev->id, pdata ? pdata->flags : 0); if (ret) dev_err(dev, "misc init failed: %s\n", strerror(-ret)); - if (pdata->init) + if (pdata && pdata->init) pdata->init(dev->id); return ret; @@ -45,7 +45,7 @@ static int imx_chipidea_port_post_init(void *drvdata) struct imxusb_platformdata *pdata = dev->platform_data; int ret; - ret = imx_usbmisc_port_post_init(dev->id, pdata->flags); + ret = imx_usbmisc_port_post_init(dev->id, pdata ? pdata->flags : 0); if (ret) dev_err(dev, "post misc init failed: %s\n", strerror(-ret)); @@ -60,7 +60,16 @@ static int imx_chipidea_probe(struct device_d *dev) struct ehci_data data = {}; uint32_t portsc; - if (!pdata) { + if (IS_ENABLED(CONFIG_OFDEVICE) && dev->device_node) { + const void *args; + + ret = of_parse_phandles_with_args(dev->device_node, + "fsl,usbmisc", "#index-cells", 0, NULL, &args); + if (ret < 0) + return -EINVAL; + + dev->id = be32_to_cpu(*((__be32 *)args)); + } else if (!pdata) { dev_err(dev, "no pdata!\n"); return -EINVAL; } @@ -75,12 +84,13 @@ static int imx_chipidea_probe(struct device_d *dev) portsc = readl(base + 0x184); portsc &= ~MXC_EHCI_PORTSC_MASK; - portsc |= pdata->flags & MXC_EHCI_PORTSC_MASK; + if (pdata) + portsc |= pdata->flags & MXC_EHCI_PORTSC_MASK; writel(portsc, base + 0x184); imx_chipidea_port_init(dev); - if ((pdata->flags & MXC_EHCI_PORTSC_MASK) == MXC_EHCI_MODE_ULPI) { + if (pdata && ((pdata->flags & MXC_EHCI_PORTSC_MASK) == MXC_EHCI_MODE_ULPI)) { dev_dbg(dev, "using ULPI phy\n"); if (IS_ENABLED(CONFIG_USB_ULPI)) { ret = ulpi_setup(base + 0x170, 1); @@ -97,7 +107,7 @@ static int imx_chipidea_probe(struct device_d *dev) data.hcor = base + 0x140; data.flags = EHCI_HAS_TT; - if (pdata->mode == IMX_USB_MODE_HOST && IS_ENABLED(CONFIG_USB_EHCI)) { + if (!pdata || (pdata->mode == IMX_USB_MODE_HOST && IS_ENABLED(CONFIG_USB_EHCI))) { ret = ehci_register(dev, &data); } else if (pdata->mode == IMX_USB_MODE_DEVICE && IS_ENABLED(CONFIG_USB_GADGET_DRIVER_ARC)) { ret = ci_udc_register(dev, base); @@ -109,8 +119,17 @@ static int imx_chipidea_probe(struct device_d *dev) return ret; }; +static __maybe_unused struct of_device_id imx_chipidea_dt_ids[] = { + { + .compatible = "fsl,imx27-usb", + }, { + /* sentinel */ + } +}; + static struct driver_d imx_chipidea_driver = { .name = "imx-usb", .probe = imx_chipidea_probe, + .of_compatible = DRV_OF_COMPAT(imx_chipidea_dt_ids), }; device_platform_driver(imx_chipidea_driver); -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox