Re: [PATCH V2 2/2] can: flexcan: disable clocks during stop mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 10/12/2019 10.00, Joakim Zhang wrote:
Disable clocks during CAN in stop mode.

Signed-off-by: Joakim Zhang <qiangqing.zhang@xxxxxxx>
Tested-by: Sean Nyekjaer <sean@xxxxxxxxxx>
------
ChangeLog:
	V1->V2: * moving the pm_runtime_force_suspend() call for both
	cases "device_may_wakeup()" and "!device_may_wakeup()" into the
	flexcan_noirq_suspend() handler
---
  drivers/net/can/flexcan.c | 32 +++++++++++++++++++-------------
  1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 6c1ccf9f6c08..63b2f47635cf 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -1718,10 +1718,6 @@ static int __maybe_unused flexcan_suspend(struct device *device)
  			if (err)
  				return err;
- err = pm_runtime_force_suspend(device);
-			if (err)
-				return err;
-
  			err = pinctrl_pm_select_sleep_state(device);
  			if (err)
  				return err;
@@ -1751,10 +1747,6 @@ static int __maybe_unused flexcan_resume(struct device *device)
  			if (err)
  				return err;
- err = pm_runtime_force_resume(device);
-			if (err)
-				return err;
-
  			err = flexcan_chip_start(dev);
  			if (err)
  				return err;
@@ -1786,9 +1778,16 @@ static int __maybe_unused flexcan_noirq_suspend(struct device *device)
  {
  	struct net_device *dev = dev_get_drvdata(device);
  	struct flexcan_priv *priv = netdev_priv(dev);
+	int err;
- if (netif_running(dev) && device_may_wakeup(device))
-		flexcan_enable_wakeup_irq(priv, true);
+	if (netif_running(dev)) {
+		if (device_may_wakeup(device))
+			flexcan_enable_wakeup_irq(priv, true);
+
+		err = pm_runtime_force_suspend(device);
+		if (err)
+			return err;
+	}
return 0;
  }
@@ -1799,11 +1798,18 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device)
  	struct flexcan_priv *priv = netdev_priv(dev);
  	int err;
- if (netif_running(dev) && device_may_wakeup(device)) {
-		flexcan_enable_wakeup_irq(priv, false);
-		err = flexcan_exit_stop_mode(priv);
+	if (netif_running(dev)) {
+		err = pm_runtime_force_resume(device);
  		if (err)
  			return err;
+
+		if (device_may_wakeup(device)) {
+			flexcan_enable_wakeup_irq(priv, false);
+
+			err = flexcan_exit_stop_mode(priv);
+			if (err)
+				return err;
+		}
  	}
return 0;




[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux