]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: cdns3: Add quirk flag to enable suspend residency
authorRoger Quadros <rogerq@kernel.org>
Thu, 16 May 2024 04:45:36 +0000 (10:15 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Jun 2024 13:41:10 +0000 (15:41 +0200)
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>
drivers/usb/cdns3/core.h
drivers/usb/cdns3/drd.c
drivers/usb/cdns3/drd.h

index 81a9c9d6be08b9faa2558f3bc5595397d313feb7..57d47348dc193b1060f4543c2ef22905f464293b 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 8b936a2e93a0d43a775bd76249aeb2d92f8e6542..84fb38a5723a3bac598969f6b6710bb7ae107408 100644 (file)
@@ -389,7 +389,7 @@ static irqreturn_t cdns_drd_irq(int irq, void *data)
 int cdns_drd_init(struct cdns *cdns)
 {
        void __iomem *regs;
-       u32 state;
+       u32 state, reg;
        int ret;
 
        regs = devm_ioremap_resource(cdns->dev, &cdns->otg_res);
@@ -433,6 +433,14 @@ int cdns_drd_init(struct cdns *cdns)
                        cdns->otg_irq_regs = (struct cdns_otg_irq_regs __iomem *)
                                              &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;
                } else {
                        dev_err(cdns->dev, "not supported DID=0x%08x\n", state);
index d72370c321d3929fc477854585d9e46be6848fef..1e2aee14d6293a1f7f757f8ab6f20bff43b76c5d 100644 (file)
@@ -193,6 +193,9 @@ struct cdns_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 */