[PATCH] usb: dwc3-generic: Fix the iMX8MQ support
Bedel, Alban
alban.bedel at aerq.com
Tue Apr 19 17:11:28 CEST 2022
On Tue, 2022-04-19 at 07:34 -0700, Angus Ainslie wrote:
> Hi Alban,
>
> On 2022-04-19 01:07, Alban Bedel wrote:
> > The binding of iMX8MQ USB controller doesn't use child nodes like the
> > other devices supported in this driver. To support it split the child
> > nodes parsing to its own function and add a field to the platform
> > data
> > to indicate that we should just use the top node.
> >
>
> I'm not clear on what this is fixing. Doesn't the original code deal
> with a devicetree stanza that has the information in either the node or
> the parent.
>
> Which case does this fix ?
It fix the case where there is no top glue node and only a standalone
node. The driver currently do nothing in this case as it only act on
the sub nodes.
Now looking at the binding[1] we could as well just replace
"fsl,imx8mq-dwc3" with "snps,dwc3" in the OF match list as nothing
specific to the iMX8MQ is done in the code.
Regards,
Alban
1: https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/usb/snps%2Cdwc3.yaml
> Thanks
> Angus
>
> > Signed-off-by: Alban Bedel <alban.bedel at aerq.com>
> > ---
> > drivers/usb/dwc3/dwc3-generic.c | 95 +++++++++++++++++++------------
> > --
> > 1 file changed, 56 insertions(+), 39 deletions(-)
> >
> > diff --git a/drivers/usb/dwc3/dwc3-generic.c
> > b/drivers/usb/dwc3/dwc3-generic.c
> > index 01bd0ca190e3..defef43ff503 100644
> > --- a/drivers/usb/dwc3/dwc3-generic.c
> > +++ b/drivers/usb/dwc3/dwc3-generic.c
> > @@ -221,6 +221,7 @@ U_BOOT_DRIVER(dwc3_generic_host) = {
> > struct dwc3_glue_ops {
> > void (*select_dr_mode)(struct udevice *dev, int index,
> > enum usb_dr_mode mode);
> > + int single_node;
> > };
> >
> > void dwc3_ti_select_dr_mode(struct udevice *dev, int index,
> > @@ -307,54 +308,66 @@ struct dwc3_glue_ops ti_ops = {
> > .select_dr_mode = dwc3_ti_select_dr_mode,
> > };
> >
> > +static int dwc3_glue_bind_node(struct udevice *parent, ofnode node,
> > + enum usb_dr_mode dr_mode)
> > +{
> > + const char *name = ofnode_get_name(node);
> > + const char *driver = NULL;
> > + struct udevice *dev;
> > + int ret;
> > +
> > + debug("%s: subnode name: %s\n", __func__, name);
> > +
> > + /* if the parent node doesn't have a mode check the leaf */
> > + if (!dr_mode)
> > + dr_mode = usb_get_dr_mode(node);
> > +
> > + switch (dr_mode) {
> > + case USB_DR_MODE_PERIPHERAL:
> > + case USB_DR_MODE_OTG:
> > +#if CONFIG_IS_ENABLED(DM_USB_GADGET)
> > + debug("%s: dr_mode: OTG or Peripheral\n", __func__);
> > + driver = "dwc3-generic-peripheral";
> > +#endif
> > + break;
> > +#if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
> > + case USB_DR_MODE_HOST:
> > + debug("%s: dr_mode: HOST\n", __func__);
> > + driver = "dwc3-generic-host";
> > + break;
> > +#endif
> > + default:
> > + debug("%s: unsupported dr_mode\n", __func__);
> > + return -ENODEV;
> > + };
> > +
> > + if (!driver)
> > + return 0;
> > +
> > + ret = device_bind_driver_to_node(parent, driver, name,
> > + node, &dev);
> > + if (ret)
> > + debug("%s: not able to bind usb device mode\n",
> > + __func__);
> > + return ret;
> > +}
> > +
> > static int dwc3_glue_bind(struct udevice *parent)
> > {
> > + struct dwc3_glue_ops *ops = (struct dwc3_glue_ops
> > *)dev_get_driver_data(parent);
> > ofnode node;
> > int ret;
> > enum usb_dr_mode dr_mode;
> >
> > + if (ops->single_node)
> > + return dwc3_glue_bind_node(parent,
> > dev_ofnode(parent), 0);
> > +
> > dr_mode = usb_get_dr_mode(dev_ofnode(parent));
> >
> > ofnode_for_each_subnode(node, dev_ofnode(parent)) {
> > - const char *name = ofnode_get_name(node);
> > - struct udevice *dev;
> > - const char *driver = NULL;
> > -
> > - debug("%s: subnode name: %s\n", __func__, name);
> > -
> > - /* if the parent node doesn't have a mode check the
> > leaf */
> > - if (!dr_mode)
> > - dr_mode = usb_get_dr_mode(node);
> > -
> > - switch (dr_mode) {
> > - case USB_DR_MODE_PERIPHERAL:
> > - case USB_DR_MODE_OTG:
> > -#if CONFIG_IS_ENABLED(DM_USB_GADGET)
> > - debug("%s: dr_mode: OTG or Peripheral\n",
> > __func__);
> > - driver = "dwc3-generic-peripheral";
> > -#endif
> > - break;
> > -#if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
> > - case USB_DR_MODE_HOST:
> > - debug("%s: dr_mode: HOST\n", __func__);
> > - driver = "dwc3-generic-host";
> > - break;
> > -#endif
> > - default:
> > - debug("%s: unsupported dr_mode\n", __func__);
> > - return -ENODEV;
> > - };
> > -
> > - if (!driver)
> > - continue;
> > -
> > - ret = device_bind_driver_to_node(parent, driver,
> > name,
> > - node, &dev);
> > - if (ret) {
> > - debug("%s: not able to bind usb device
> > mode\n",
> > - __func__);
> > + ret = dwc3_glue_bind_node(parent, node, dr_mode);
> > + if (ret)
> > return ret;
> > - }
> > }
> >
> > return 0;
> > @@ -454,6 +467,10 @@ static int dwc3_glue_remove(struct udevice *dev)
> > return 0;
> > }
> >
> > +struct dwc3_glue_ops single_node_ops = {
> > + .single_node = 1,
> > +};
> > +
> > static const struct udevice_id dwc3_glue_ids[] = {
> > { .compatible = "xlnx,zynqmp-dwc3" },
> > { .compatible = "xlnx,versal-dwc3" },
> > @@ -464,7 +481,7 @@ static const struct udevice_id dwc3_glue_ids[] =
> > {
> > { .compatible = "rockchip,rk3328-dwc3" },
> > { .compatible = "rockchip,rk3399-dwc3" },
> > { .compatible = "qcom,dwc3" },
> > - { .compatible = "fsl,imx8mq-dwc3" },
> > + { .compatible = "fsl,imx8mq-dwc3", .data =
> > (ulong)&single_node_ops },
> > { .compatible = "intel,tangier-dwc3" },
> > { }
> > };
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3627 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20220419/8c20efb4/attachment.bin>
More information about the U-Boot
mailing list