Takashi Iwai 31f33a
From 6e2fe01dd6f98da6cae8b07cd5cfa67abc70d97d Mon Sep 17 00:00:00 2001
Takashi Iwai 31f33a
From: Tong Zhang <ztong0001@gmail.com>
Takashi Iwai 31f33a
Date: Mon, 1 Mar 2021 21:55:40 -0500
Takashi Iwai 31f33a
Subject: [PATCH] can: c_can: move runtime PM enable/disable to c_can_platform
Takashi Iwai 31f33a
Mime-version: 1.0
Takashi Iwai 31f33a
Content-type: text/plain; charset=UTF-8
Takashi Iwai 31f33a
Content-transfer-encoding: 8bit
Takashi Iwai 31f33a
Git-commit: 6e2fe01dd6f98da6cae8b07cd5cfa67abc70d97d
Takashi Iwai 31f33a
Patch-mainline: v5.12-rc5
Takashi Iwai 31f33a
References: git-fixes
Takashi Iwai 31f33a
Takashi Iwai 31f33a
Currently doing modprobe c_can_pci will make the kernel complain:
Takashi Iwai 31f33a
Takashi Iwai 31f33a
    Unbalanced pm_runtime_enable!
Takashi Iwai 31f33a
Takashi Iwai 31f33a
this is caused by pm_runtime_enable() called before pm is initialized.
Takashi Iwai 31f33a
Takashi Iwai 31f33a
This fix is similar to 227619c3ff7c, move those pm_enable/disable code
Takashi Iwai 31f33a
to c_can_platform.
Takashi Iwai 31f33a
Takashi Iwai 31f33a
Fixes: 4cdd34b26826 ("can: c_can: Add runtime PM support to Bosch C_CAN/D_CAN controller")
Takashi Iwai 31f33a
Link: http://lore.kernel.org/r/20210302025542.987600-1-ztong0001@gmail.com
Takashi Iwai 31f33a
Signed-off-by: Tong Zhang <ztong0001@gmail.com>
Takashi Iwai 31f33a
Tested-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Takashi Iwai 31f33a
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Takashi Iwai 31f33a
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 31f33a
Takashi Iwai 31f33a
---
Takashi Iwai 31f33a
 drivers/net/can/c_can/c_can.c          | 24 +-----------------------
Takashi Iwai 31f33a
 drivers/net/can/c_can/c_can_platform.c |  6 +++++-
Takashi Iwai 31f33a
 2 files changed, 6 insertions(+), 24 deletions(-)
Takashi Iwai 31f33a
Takashi Iwai 31f33a
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
Takashi Iwai 31f33a
index ef474bae47a1..6958830cb983 100644
Takashi Iwai 31f33a
--- a/drivers/net/can/c_can/c_can.c
Takashi Iwai 31f33a
+++ b/drivers/net/can/c_can/c_can.c
Takashi Iwai 31f33a
@@ -212,18 +212,6 @@ static const struct can_bittiming_const c_can_bittiming_const = {
Takashi Iwai 31f33a
 	.brp_inc = 1,
Takashi Iwai 31f33a
 };
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
-static inline void c_can_pm_runtime_enable(const struct c_can_priv *priv)
Takashi Iwai 31f33a
-{
Takashi Iwai 31f33a
-	if (priv->device)
Takashi Iwai 31f33a
-		pm_runtime_enable(priv->device);
Takashi Iwai 31f33a
-}
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
-static inline void c_can_pm_runtime_disable(const struct c_can_priv *priv)
Takashi Iwai 31f33a
-{
Takashi Iwai 31f33a
-	if (priv->device)
Takashi Iwai 31f33a
-		pm_runtime_disable(priv->device);
Takashi Iwai 31f33a
-}
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
 static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv)
Takashi Iwai 31f33a
 {
Takashi Iwai 31f33a
 	if (priv->device)
Takashi Iwai 31f33a
@@ -1335,7 +1323,6 @@ static const struct net_device_ops c_can_netdev_ops = {
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 int register_c_can_dev(struct net_device *dev)
Takashi Iwai 31f33a
 {
Takashi Iwai 31f33a
-	struct c_can_priv *priv = netdev_priv(dev);
Takashi Iwai 31f33a
 	int err;
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 	/* Deactivate pins to prevent DRA7 DCAN IP from being
Takashi Iwai 31f33a
@@ -1345,28 +1332,19 @@ int register_c_can_dev(struct net_device *dev)
Takashi Iwai 31f33a
 	 */
Takashi Iwai 31f33a
 	pinctrl_pm_select_sleep_state(dev->dev.parent);
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
-	c_can_pm_runtime_enable(priv);
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
 	dev->flags |= IFF_ECHO;	/* we support local echo */
Takashi Iwai 31f33a
 	dev->netdev_ops = &c_can_netdev_ops;
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 	err = register_candev(dev);
Takashi Iwai 31f33a
-	if (err)
Takashi Iwai 31f33a
-		c_can_pm_runtime_disable(priv);
Takashi Iwai 31f33a
-	else
Takashi Iwai 31f33a
+	if (!err)
Takashi Iwai 31f33a
 		devm_can_led_init(dev);
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
 	return err;
Takashi Iwai 31f33a
 }
Takashi Iwai 31f33a
 EXPORT_SYMBOL_GPL(register_c_can_dev);
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 void unregister_c_can_dev(struct net_device *dev)
Takashi Iwai 31f33a
 {
Takashi Iwai 31f33a
-	struct c_can_priv *priv = netdev_priv(dev);
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
 	unregister_candev(dev);
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
-	c_can_pm_runtime_disable(priv);
Takashi Iwai 31f33a
 }
Takashi Iwai 31f33a
 EXPORT_SYMBOL_GPL(unregister_c_can_dev);
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c
Takashi Iwai 31f33a
index 05f425ceb53a..47b251b1607c 100644
Takashi Iwai 31f33a
--- a/drivers/net/can/c_can/c_can_platform.c
Takashi Iwai 31f33a
+++ b/drivers/net/can/c_can/c_can_platform.c
Takashi Iwai 31f33a
@@ -29,6 +29,7 @@
Takashi Iwai 31f33a
 #include <linux/list.h>
Takashi Iwai 31f33a
 #include <linux/io.h>
Takashi Iwai 31f33a
 #include <linux/platform_device.h>
Takashi Iwai 31f33a
+#include <linux/pm_runtime.h>
Takashi Iwai 31f33a
 #include <linux/clk.h>
Takashi Iwai 31f33a
 #include <linux/of.h>
Takashi Iwai 31f33a
 #include <linux/of_device.h>
Takashi Iwai 31f33a
@@ -386,6 +387,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
Takashi Iwai 31f33a
 	platform_set_drvdata(pdev, dev);
Takashi Iwai 31f33a
 	SET_NETDEV_DEV(dev, &pdev->dev);
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
+	pm_runtime_enable(priv->device);
Takashi Iwai 31f33a
 	ret = register_c_can_dev(dev);
Takashi Iwai 31f33a
 	if (ret) {
Takashi Iwai 31f33a
 		dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
Takashi Iwai 31f33a
@@ -398,6 +400,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
Takashi Iwai 31f33a
 	return 0;
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 exit_free_device:
Takashi Iwai 31f33a
+	pm_runtime_disable(priv->device);
Takashi Iwai 31f33a
 	free_c_can_dev(dev);
Takashi Iwai 31f33a
 exit:
Takashi Iwai 31f33a
 	dev_err(&pdev->dev, "probe failed\n");
Takashi Iwai 31f33a
@@ -408,9 +411,10 @@ static int c_can_plat_probe(struct platform_device *pdev)
Takashi Iwai 31f33a
 static int c_can_plat_remove(struct platform_device *pdev)
Takashi Iwai 31f33a
 {
Takashi Iwai 31f33a
 	struct net_device *dev = platform_get_drvdata(pdev);
Takashi Iwai 31f33a
+	struct c_can_priv *priv = netdev_priv(dev);
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 	unregister_c_can_dev(dev);
Takashi Iwai 31f33a
-
Takashi Iwai 31f33a
+	pm_runtime_disable(priv->device);
Takashi Iwai 31f33a
 	free_c_can_dev(dev);
Takashi Iwai 31f33a
 
Takashi Iwai 31f33a
 	return 0;
Takashi Iwai 31f33a
-- 
Takashi Iwai 31f33a
2.26.2
Takashi Iwai 31f33a