aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch b/target/linux/layerscape/patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch
new file mode 100644
index 0000000000..afb5557702
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch
@@ -0,0 +1,93 @@
+From 211c20a459a0fd4868ed22ecfc2b2186d9df6da0 Mon Sep 17 00:00:00 2001
+From: Joakim Zhang <qiangqing.zhang@nxp.com>
+Date: Tue, 30 Jul 2019 14:43:25 +0800
+Subject: [PATCH] can: flexcan: add LPSR mode support for i.MX7D
+
+For i.MX7D LPSR mode, the controller will lost power and got the
+configuration state lost after system resume back.
+So we need to set pinctrl state again and re-start chip to do
+re-configuration after resume.
+
+For wakeup case, it should not set pinctrl to sleep state by
+pinctrl_pm_select_sleep_state.
+For interface is not up before suspend case, we don't need
+re-configure as it will be configured by user later by interface up.
+
+Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
+---
+ drivers/net/can/flexcan.c | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+--- a/drivers/net/can/flexcan.c
++++ b/drivers/net/can/flexcan.c
+@@ -26,6 +26,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/pm_runtime.h>
+ #include <linux/regulator/consumer.h>
++#include <linux/pinctrl/consumer.h>
+ #include <linux/regmap.h>
+
+ #define DRV_NAME "flexcan"
+@@ -1920,7 +1921,7 @@ static int __maybe_unused flexcan_suspen
+ {
+ struct net_device *dev = dev_get_drvdata(device);
+ struct flexcan_priv *priv = netdev_priv(dev);
+- int err = 0;
++ int err;
+
+ if (netif_running(dev)) {
+ /* if wakeup is enabled, enter stop mode
+@@ -1932,25 +1933,27 @@ static int __maybe_unused flexcan_suspen
+ if (err)
+ return err;
+ } else {
+- err = flexcan_chip_disable(priv);
++ flexcan_chip_stop(dev);
++
++ err = pm_runtime_force_suspend(device);
+ if (err)
+ return err;
+
+- err = pm_runtime_force_suspend(device);
++ pinctrl_pm_select_sleep_state(device);
+ }
+ netif_stop_queue(dev);
+ netif_device_detach(dev);
+ }
+ priv->can.state = CAN_STATE_SLEEPING;
+
+- return err;
++ return 0;
+ }
+
+ static int __maybe_unused flexcan_resume(struct device *device)
+ {
+ struct net_device *dev = dev_get_drvdata(device);
+ struct flexcan_priv *priv = netdev_priv(dev);
+- int err = 0;
++ int err;
+
+ priv->can.state = CAN_STATE_ERROR_ACTIVE;
+ if (netif_running(dev)) {
+@@ -1962,15 +1965,19 @@ static int __maybe_unused flexcan_resume
+ if (err)
+ return err;
+ } else {
++ pinctrl_pm_select_default_state(device);
++
+ err = pm_runtime_force_resume(device);
+ if (err)
+ return err;
+
+- err = flexcan_chip_enable(priv);
++ err = flexcan_chip_start(dev);
++ if (err)
++ return err;
+ }
+ }
+
+- return err;
++ return 0;
+ }
+
+ static int __maybe_unused flexcan_runtime_suspend(struct device *device)