usb: cdns3: imx: add power lost support for system resume
authorFrank Li <frank.li@nxp.com>
Thu, 18 Feb 2021 22:51:09 +0000 (16:51 -0600)
committerPeter Chen <peter.chen@kernel.org>
Mon, 12 Apr 2021 12:19:21 +0000 (20:19 +0800)
imx need special handle when controller lost power

Signed-off-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Frank Li <frank.li@nxp.com>
Signed-off-by: Peter Chen <peter.chen@kernel.org>
drivers/usb/cdns3/cdns3-imx.c

index 8f88eec..708b51c 100644 (file)
@@ -361,6 +361,39 @@ static int cdns_imx_suspend(struct device *dev)
 
        return 0;
 }
+
+
+/* Indicate if the controller was power lost before */
+static inline bool cdns_imx_is_power_lost(struct cdns_imx *data)
+{
+       u32 value;
+
+       value = cdns_imx_readl(data, USB3_CORE_CTRL1);
+       if ((value & SW_RESET_MASK) == ALL_SW_RESET)
+               return true;
+       else
+               return false;
+}
+
+static int cdns_imx_system_resume(struct device *dev)
+{
+       struct cdns_imx *data = dev_get_drvdata(dev);
+       int ret;
+
+       ret = cdns_imx_resume(dev);
+       if (ret)
+               return ret;
+
+       if (cdns_imx_is_power_lost(data)) {
+               dev_dbg(dev, "resume from power lost\n");
+               ret = cdns_imx_noncore_init(data);
+               if (ret)
+                       cdns_imx_suspend(dev);
+       }
+
+       return ret;
+}
+
 #else
 static int cdns_imx_platform_suspend(struct device *dev,
        bool suspend, bool wakeup)
@@ -372,6 +405,7 @@ static int cdns_imx_platform_suspend(struct device *dev,
 
 static const struct dev_pm_ops cdns_imx_pm_ops = {
        SET_RUNTIME_PM_OPS(cdns_imx_suspend, cdns_imx_resume, NULL)
+       SET_SYSTEM_SLEEP_PM_OPS(cdns_imx_suspend, cdns_imx_system_resume)
 };
 
 static const struct of_device_id cdns_imx_of_match[] = {