usb: cdns3: Enable workaround for USB2.0 PHY Rx compliance test PHY lockup
authorPawel Laszczak <pawell@cadence.com>
Tue, 15 Sep 2020 11:45:43 +0000 (14:45 +0300)
committerFelipe Balbi <balbi@kernel.org>
Fri, 2 Oct 2020 06:57:39 +0000 (09:57 +0300)
USB2.0 PHY hangs in Rx Compliance test when the incoming packet
amplitude is varied below and above the Squelch Level of
Receiver during the active packet multiple times.

Version 1 of the controller allows PHY to be reset when RX fail condition
is detected to work around the above issue. This feature is
disabled by default and needs to be enabled using a bit from
the newly added PHYRST_CFG register. This patch enables the workaround.

There is no way to know controller version before device controller
is started and the workaround needs to be applied for both host and
device modes, so we rely on a DT property do decide when to
apply the workaround.

Signed-off-by: Pawel Laszczak <pawell@cadence.com>
Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
drivers/usb/cdns3/core.c
drivers/usb/cdns3/core.h
drivers/usb/cdns3/drd.c
drivers/usb/cdns3/drd.h

index 4cf815882c5f34edb3fae9558834ec8906e334ac..4c1445cf2ad06956db2ee3fee01faa88868bdac6 100644 (file)
@@ -488,6 +488,8 @@ static int cdns3_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
+       cdns->phyrst_a_enable = device_property_read_bool(dev, "cdns,phyrst-a-enable");
+
        cdns->otg_res = *res;
 
        cdns->wakeup_irq = platform_get_irq_byname_optional(pdev, "wakeup");
index 1b1707796db2de2e6361911a1235ccede4ae1c06..8a40d53d5edebda888560be21b0bea769169804a 100644 (file)
@@ -87,6 +87,7 @@ struct cdns3 {
 #define CDNS3_CONTROLLER_V0    0
 #define CDNS3_CONTROLLER_V1    1
        u32                             version;
+       bool                            phyrst_a_enable;
 
        int                             otg_irq;
        int                             dev_irq;
index 5f2685cadf5ea3287b734ed46c28ab0c8b34f444..fcd295f566b2dbf2ba7c8e135e0c3a5da7a636bf 100644 (file)
@@ -42,6 +42,18 @@ int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
                        reg = readl(&cdns->otg_v1_regs->override);
                        reg |= OVERRIDE_IDPULLUP;
                        writel(reg, &cdns->otg_v1_regs->override);
+
+                       /*
+                        * Enable work around feature built into the
+                        * controller to address issue with RX Sensitivity
+                        * est (EL_17) for USB2 PHY. The issue only occures
+                        * for 0x0002450D controller version.
+                        */
+                       if (cdns->phyrst_a_enable) {
+                               reg = readl(&cdns->otg_v1_regs->phyrst_cfg);
+                               reg |= PHYRST_CFG_PHYRST_A_ENABLE;
+                               writel(reg, &cdns->otg_v1_regs->phyrst_cfg);
+                       }
                } else {
                        reg = readl(&cdns->otg_v0_regs->ctrl1);
                        reg |= OVERRIDE_IDPULLUP_V0;
index 7e7cf7fa2dd3d2680a00cbc545b40688f01a5c2b..f1ccae285a16dbd40e03ec3a4607b4140025dde5 100644 (file)
@@ -31,7 +31,7 @@ struct cdns3_otg_regs {
        __le32 simulate;
        __le32 override;
        __le32 susp_ctrl;
-       __le32 reserved4;
+       __le32 phyrst_cfg;
        __le32 anasts;
        __le32 adp_ramp_time;
        __le32 ctrl1;
@@ -153,6 +153,9 @@ struct cdns3_otg_common_regs {
 /* Only for CDNS3_CONTROLLER_V0 version */
 #define OVERRIDE_IDPULLUP_V0           BIT(24)
 
+/* PHYRST_CFG - bitmasks */
+#define PHYRST_CFG_PHYRST_A_ENABLE     BIT(0)
+
 #define CDNS3_ID_PERIPHERAL            1
 #define CDNS3_ID_HOST                  0