Re: [PATCH v4 2/2] usb: dwc3: dwc3-generic-plat: Add Renesas R-Car Gen5 DWC3 xHCI USB controller glue
Thinh Nguyen <[email protected]>
| Newsgroups | org.kernel.vger.linux-renesas-soc,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-usb |
|---|---|
| Message-ID | <ao4yJCNXAHDYm8Bf@vbox> |
Hi, On Wed, Aug 19, 2026, Marek Vasut wrote: > From: Thanh Quan <[email protected]> > > The Renesas R-Car Gen5 SoC contains multiple instances of DWC3 USB > controller with glue logic wrapper around them. Extend the generic > DWC3 platform driver with Renesas R-Car Gen5 glue logic specifics. > > Signed-off-by: Thanh Quan <[email protected]> > Co-developed-by: Marek Vasut <[email protected]> > Signed-off-by: Marek Vasut <[email protected]> > --- > Cc: Conor Dooley <[email protected]> > Cc: Geert Uytterhoeven <[email protected]> > Cc: Greg Kroah-Hartman <[email protected]> > Cc: Krzysztof Kozlowski <[email protected]> > Cc: Rob Herring <[email protected]> > Cc: Thinh Nguyen <[email protected]> > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > --- > V2: Extend dwc3-generic-plat driver instead > V3: Handle maximum-speed as optional property, test for USB 3 PHY > non-presence to determine whether the controller is USB 2 only, > consider optional maximum-speed DT property, but if it is missing > then default to maximum controller capabilities based on the > presence of PHY phandles. > V4: No change > --- > drivers/usb/dwc3/dwc3-generic-plat.c | 60 ++++++++++++++++++++++++++++ > 1 file changed, 60 insertions(+) > > diff --git a/drivers/usb/dwc3/dwc3-generic-plat.c b/drivers/usb/dwc3/dwc3-generic-plat.c > index ca69ac0eb07ce..dec89b068291a 100644 > --- a/drivers/usb/dwc3/dwc3-generic-plat.c > +++ b/drivers/usb/dwc3/dwc3-generic-plat.c > @@ -71,6 +71,60 @@ static int dwc3_eic7700_init(struct dwc3_generic *dwc3g) > return 0; > } > > +static int dwc3_renesas_rcar_gen5_init(struct dwc3_generic *dwc3g) > +{ > + struct device *dev = dwc3g->dev; > + struct platform_device *pdev = to_platform_device(dev); > + enum usb_device_speed speed = usb_get_maximum_speed(dev); > + bool usb2only = false; > + void __iomem *glue; > + > + /* Wireless USB is not supported */ > + if (speed == USB_SPEED_WIRELESS) > + return dev_err_probe(dev, -EINVAL, "Wireless USB not supported\n"); > + > + /* No USB 3 PHY in DT means this is surely USB 2 controller */ > + if (device_property_match_string(dev, "phy-names", "usb3-phy") < 0) > + usb2only = true; > + > + /* > + * Controller can be limited to USB 2 via optional maximum-speed DT > + * property. If the DT property is not present, default to maximum > + * controller capabilities. > + */ Minor nit: This comment does not give any new info than what's documented in the maximum-speed property, do we need to repeat it here? > + if (speed >= USB_SPEED_LOW && speed <= USB_SPEED_HIGH) > + usb2only = true; We don't support low speed or wireless, just check for speed <= USB_SPEED_HIGH should be sufficient. The rest looks fine. Thanks, Thinh > + > + glue = devm_platform_ioremap_resource_byname(pdev, "glue"); > + if (IS_ERR(glue)) > + return PTR_ERR(glue); > + > + /* > + * The datasheet describes initialization procedure without full > + * information about the registers. Therefore, the source code is > + * based on the bare metal code shared by the board team. > + */ > + writew(0x211, glue + 0x26); > + > + /* USB2 does need additional register programming. */ > + if (!usb2only) > + return 0; > + > + writew(0x11, glue + 0x81c); > + writew(0x0, glue + 0x81a); > + writew(0x1, glue + 0x802); > + > + usleep_range(10000, 20000); > + > + writew(0x0, glue + 0x802); > + writew(0x1, glue + 0x2a); > + writew(0x1, glue + 0x81a); > + > + usleep_range(10000, 20000); > + > + return 0; > +} > + > static int dwc3_spacemit_k1_init(struct dwc3_generic *dwc3g) > { > struct device *dev = dwc3g->dev; > @@ -231,11 +285,17 @@ static const struct dwc3_generic_config eic7700_dwc3 = { > .properties = DWC3_DEFAULT_PROPERTIES, > }; > > +static const struct dwc3_generic_config renesas_rcar_gen5_dwc3 = { > + .init = dwc3_renesas_rcar_gen5_init, > + .properties = DWC3_DEFAULT_PROPERTIES, > +}; > + > static const struct of_device_id dwc3_generic_of_match[] = { > { .compatible = "spacemit,k1-dwc3", &spacemit_k1_dwc3}, > { .compatible = "spacemit,k3-dwc3", }, > { .compatible = "fsl,ls1028a-dwc3", &fsl_ls1028_dwc3}, > { .compatible = "eswin,eic7700-dwc3", &eic7700_dwc3}, > + { .compatible = "renesas,rcar-gen5-dwc3", &renesas_rcar_gen5_dwc3}, > { .compatible = "starfive,jhb100-dwc3", }, > { /* sentinel */ } > }; > -- > 2.53.0 >