Hi, On 9 August 2016 at 14:35, Paul Burton <paul.burton@xxxxxxxxxx> wrote: > Introduce support for probing the SEAD3 EHCI driver using device tree. > > Signed-off-by: Paul Burton <paul.burton@xxxxxxxxxx> > --- > > drivers/usb/host/ehci-sead3.c | 29 +++++++++++++++++++++++------ > 1 file changed, 23 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/host/ehci-sead3.c b/drivers/usb/host/ehci-sead3.c > index 3d86cc2..05db1ae 100644 > --- a/drivers/usb/host/ehci-sead3.c > +++ b/drivers/usb/host/ehci-sead3.c > @@ -20,6 +20,7 @@ > */ > > #include <linux/err.h> > +#include <linux/of_irq.h> > #include <linux/platform_device.h> > > static int ehci_sead3_setup(struct usb_hcd *hcd) > @@ -96,15 +97,25 @@ static int ehci_hcd_sead3_drv_probe(struct platform_device *pdev) > { > struct usb_hcd *hcd; > struct resource *res; > - int ret; > + int ret, irq; > > if (usb_disabled()) > return -ENODEV; > > - if (pdev->resource[1].flags != IORESOURCE_IRQ) { > - pr_debug("resource[1] is not IORESOURCE_IRQ"); > - return -ENOMEM; > + if (pdev->dev.of_node) { > + irq = irq_of_parse_and_map(pdev->dev.of_node, 0); > + if (!irq) { > + dev_err(&pdev->dev, "failed to map IRQ\n"); > + return -ENODEV; > + } > + } else { > + if (pdev->resource[1].flags != IORESOURCE_IRQ) { > + pr_debug("resource[1] is not IORESOURCE_IRQ"); > + return -ENOMEM; > + } > + irq = pdev->resource[1].start; > } > + Why not just use platform_get_irq(pdev, 0) instead of this whole block? Then you wouldn't need to care anymore whether resource 1 is the IRQ resource (and avoid a potential overrun when the device has only one resource), or if it is probed through of. > hcd = usb_create_hcd(&ehci_sead3_hc_driver, &pdev->dev, "SEAD-3"); > if (!hcd) > return -ENOMEM; > @@ -121,8 +132,7 @@ static int ehci_hcd_sead3_drv_probe(struct platform_device *pdev) > /* Root hub has integrated TT. */ > hcd->has_tt = 1; > > - ret = usb_add_hcd(hcd, pdev->resource[1].start, > - IRQF_SHARED); > + ret = usb_add_hcd(hcd, irq, IRQF_SHARED); > if (ret == 0) { > platform_set_drvdata(pdev, hcd); > device_wakeup_enable(hcd->self.controller); > @@ -172,12 +182,19 @@ static const struct dev_pm_ops sead3_ehci_pmops = { > #define SEAD3_EHCI_PMOPS NULL > #endif > > +static const struct of_device_id sead3_ehci_of_match[] = { > + { .compatible = "mti,sead3-ehci" }, I don't see this compatible documented anywhere, please add binding documentation for it first (and CC devicetree@vger ). > + {}, > +}; > +MODULE_DEVICE_TABLE(of, sead3_ehci_of_match); > + > static struct platform_driver ehci_hcd_sead3_driver = { > .probe = ehci_hcd_sead3_drv_probe, > .remove = ehci_hcd_sead3_drv_remove, > .shutdown = usb_hcd_platform_shutdown, > .driver = { > .name = "sead3-ehci", > + .of_match_table = sead3_ehci_of_match, > .pm = SEAD3_EHCI_PMOPS, > } > }; Regards Jonas