Re: [PATCH v2 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-usb,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-renesas-soc |
|---|---|
| Message-ID | <anZpZIW76RzmyiIi@vbox> |
On Thu, Aug 06, 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]> > 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 Great! This seems to fit in nicely for dwc3-generic-plat. > --- > drivers/usb/dwc3/dwc3-generic-plat.c | 52 ++++++++++++++++++++++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/drivers/usb/dwc3/dwc3-generic-plat.c b/drivers/usb/dwc3/dwc3-generic-plat.c > index ca69ac0eb07ce..518bb40d1372c 100644 > --- a/drivers/usb/dwc3/dwc3-generic-plat.c > +++ b/drivers/usb/dwc3/dwc3-generic-plat.c > @@ -71,6 +71,52 @@ 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); > + const char *maximum_speed; > + bool use_usb3_flow; > + void __iomem *glue; > + int ret; > + > + glue = devm_platform_ioremap_resource_byname(pdev, "glue"); > + if (IS_ERR(glue)) > + return PTR_ERR(glue); > + > + ret = of_property_read_string(dev->of_node, "maximum-speed", &maximum_speed); > + if (ret) > + return dev_err_probe(dev, -ENODEV, "Failed to determine maximum speed\n"); We shouldn't overload the generic "maximum-speed" definition. Can we check for the presence of the "usb3-phy" instead? BR, Thinh > + > + use_usb3_flow = !strcmp(maximum_speed, "super-speed-plus") || > + !strcmp(maximum_speed, "super-speed"); > + > + /* > + * 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); > + > + /* USB3 does not need additional register programming. */ > + if (use_usb3_flow) > + 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 +277,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 >