Re: [PATCH v6 2/2] usb: dwc3: dwc3-generic-plat: Add Renesas R-Car Gen5 DWC3 xHCI USB controller glue

From: Marek Vasut

Date: Sat Aug 29 2026 - 23:17:16 EST


On 8/29/26 6:19 PM, Krishna Kurapati wrote:

Hi,

+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;
+

Why not just set the maximum-speed property to "high-speed" instead of checking for "usb3-phy". That would be more clean.

Please see 1/2, maximum-speed DT property and the presence of the usb3-phy are both optional, hence this code. Also, this was discussed in previous version 2 of this patchset already.

+    if (speed >= USB_SPEED_LOW && speed <= USB_SPEED_HIGH)
+        usb2only = true;

And this check can be removed as well if we use "maximum-speed" property in DT.

Please see above.

+
+    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);
+

Use #defines for register offsets and register values like in dwc3_eic7700_init.

Please see the comment above this section, it clarifies why the magic numbers, and it was discussed in previous version 1 of this patchset too.