]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: cdns3: Add quirk flag to enable suspend residency
authorRoger Quadros <rogerq@kernel.org>
Sun, 28 Jul 2024 16:09:37 +0000 (12:09 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2025 12:24:51 +0000 (13:24 +0100)
[ Upstream commit 0aca19e4037a4143273e90f1b44666b78b4dde9b ]

Some platforms (e.g. ti,j721e-usb, ti,am64-usb) require
this bit to be set to workaround a lockup issue with PHY
short suspend intervals [1]. Add a platform quirk flag
to indicate if Suspend Residency should be enabled.

[1] - https://www.ti.com/lit/er/sprz457h/sprz457h.pdf
i2409 - USB: USB2 PHY locks up due to short suspend

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Signed-off-by: Ravi Gunasekaran <r-gunasekaran@ti.com>
Acked-by: Peter Chen <peter.chen@kernel.org>
Link: https://lore.kernel.org/r/20240516044537.16801-2-r-gunasekaran@ti.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/cdns3/core.h
drivers/usb/cdns3/drd.c
drivers/usb/cdns3/drd.h

index 0d87871499eaa2f7ed0ca6fece2a80e3ba6d4ce6..1cecc97214239c04f8332c59c504435970490d11 100644 (file)
@@ -44,6 +44,7 @@ struct cdns3_platform_data {
                        bool suspend, bool wakeup);
        unsigned long quirks;
 #define CDNS3_DEFAULT_PM_RUNTIME_ALLOW BIT(0)
+#define CDNS3_DRD_SUSPEND_RESIDENCY_ENABLE     BIT(1)
 };
 
 /**
index 95863d44e3e09eef840ac427d495045a8a9dfad8..7f33fe02c0ea5e21641a80687e8cd7af86827c0b 100644 (file)
@@ -358,7 +358,7 @@ static irqreturn_t cdns3_drd_irq(int irq, void *data)
 int cdns3_drd_init(struct cdns3 *cdns)
 {
        void __iomem *regs;
-       u32 state;
+       u32 state, reg;
        int ret;
 
        regs = devm_ioremap_resource(cdns->dev, &cdns->otg_res);
@@ -400,6 +400,14 @@ int cdns3_drd_init(struct cdns3 *cdns)
                        cdns->otg_irq_regs = (struct cdns3_otg_irq_regs *)
                                              &cdns->otg_v1_regs->ien;
                        writel(1, &cdns->otg_v1_regs->simulate);
+
+                       if (cdns->pdata &&
+                           (cdns->pdata->quirks & CDNS3_DRD_SUSPEND_RESIDENCY_ENABLE)) {
+                               reg = readl(&cdns->otg_v1_regs->susp_ctrl);
+                               reg |= SUSP_CTRL_SUSPEND_RESIDENCY_ENABLE;
+                               writel(reg, &cdns->otg_v1_regs->susp_ctrl);
+                       }
+
                        cdns->version  = CDNS3_CONTROLLER_V1;
                }
 
index a767b6893938c33b793640555b7a0a63ee2caff9..729374f12cd7dda346d1f5c18026e267c527b2f1 100644 (file)
@@ -190,6 +190,9 @@ struct cdns3_otg_irq_regs {
 /* OTGREFCLK - bitmasks */
 #define OTGREFCLK_STB_CLK_SWITCH_EN    BIT(31)
 
+/* SUPS_CTRL - bitmasks */
+#define SUSP_CTRL_SUSPEND_RESIDENCY_ENABLE     BIT(17)
+
 /* OVERRIDE - bitmasks */
 #define OVERRIDE_IDPULLUP              BIT(0)
 /* Only for CDNS3_CONTROLLER_V0 version */