pull-request: can 2015-07-16

4 messages, 2 authors, 2015-07-21 · open the first message on its own page

pull-request: can 2015-07-16

From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: 2015-07-16 08:34:01

Hello David,

this is a pull request of 2 patches by Stefan Agner. He fixes the resume
operation in the mcp251x driver.

regards,
Marc

---

The following changes since commit 15afb10df4a3f1bd781373ffd968e70cc4b21a42:

  Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth (2015-07-15 21:59:23 -0700)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git tags/linux-can-fixes-for-4.2-20150716

for you to fetch changes up to 69da3f2ac528642acbd06ed14564ac1b9a918394:

  can: mcp251x: get regulators optionally (2015-07-16 09:04:22 +0200)

----------------------------------------------------------------
linux-can-fixes-for-4.2-20150716

----------------------------------------------------------------
Stefan Agner (2):
      can: mcp251x: fix resume when device is down
      can: mcp251x: get regulators optionally

 drivers/net/can/spi/mcp251x.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

[PATCH 2/2] can: mcp251x: get regulators optionally

From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: 2015-07-16 08:34:04

From: Stefan Agner <stefan@agner.ch>

The regulators power and transceiver are optional. If those are not
present, the pointer (or error pointer) is correctly handled by the
driver, hence we can use devm_regulator_get_optional safely, which
avoids regulators getting created.

Signed-off-by: Stefan Agner <stefan@agner.ch>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/spi/mcp251x.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c
index 3b2f34e6ba9b..b7e83c212023 100644
--- a/drivers/net/can/spi/mcp251x.c
+++ b/drivers/net/can/spi/mcp251x.c
@@ -1086,8 +1086,8 @@ static int mcp251x_can_probe(struct spi_device *spi)
 	if (ret)
 		goto out_clk;
 
-	priv->power = devm_regulator_get(&spi->dev, "vdd");
-	priv->transceiver = devm_regulator_get(&spi->dev, "xceiver");
+	priv->power = devm_regulator_get_optional(&spi->dev, "vdd");
+	priv->transceiver = devm_regulator_get_optional(&spi->dev, "xceiver");
 	if ((PTR_ERR(priv->power) == -EPROBE_DEFER) ||
 	    (PTR_ERR(priv->transceiver) == -EPROBE_DEFER)) {
 		ret = -EPROBE_DEFER;
-- 
2.1.4

[PATCH 1/2] can: mcp251x: fix resume when device is down

From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: 2015-07-16 08:34:06

From: Stefan Agner <stefan@agner.ch>

If a valid power regulator or a dummy regulator is used (which
happens to be the case when no regulator is specified), restart_work
is queued no matter whether the device was running or not at suspend
time. Since work queues get initialized in the ndo_open callback,
resuming leads to a NULL pointer exception.

Reverse exactly the steps executed at suspend time:
- Enable the power regulator in any case
- Enable the transceiver regulator if the device was running, even in
  case we have a power regulator
- Queue restart_work only in case the device was running

Fixes: bf66f3736a94 ("can: mcp251x: Move to threaded interrupts instead of workqueues.")
Signed-off-by: Stefan Agner <stefan@agner.ch>
Cc: linux-stable <redacted>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/spi/mcp251x.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c
index c1a95a34d62e..3b2f34e6ba9b 100644
--- a/drivers/net/can/spi/mcp251x.c
+++ b/drivers/net/can/spi/mcp251x.c
@@ -1222,17 +1222,16 @@ static int __maybe_unused mcp251x_can_resume(struct device *dev)
 	struct spi_device *spi = to_spi_device(dev);
 	struct mcp251x_priv *priv = spi_get_drvdata(spi);
 
-	if (priv->after_suspend & AFTER_SUSPEND_POWER) {
+	if (priv->after_suspend & AFTER_SUSPEND_POWER)
 		mcp251x_power_enable(priv->power, 1);
+
+	if (priv->after_suspend & AFTER_SUSPEND_UP) {
+		mcp251x_power_enable(priv->transceiver, 1);
 		queue_work(priv->wq, &priv->restart_work);
 	} else {
-		if (priv->after_suspend & AFTER_SUSPEND_UP) {
-			mcp251x_power_enable(priv->transceiver, 1);
-			queue_work(priv->wq, &priv->restart_work);
-		} else {
-			priv->after_suspend = 0;
-		}
+		priv->after_suspend = 0;
 	}
+
 	priv->force_quit = 0;
 	enable_irq(spi->irq);
 	return 0;
-- 
2.1.4

Re: pull-request: can 2015-07-16

From: David Miller <davem@davemloft.net>
Date: 2015-07-21 03:28:59

From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: Thu, 16 Jul 2015 10:33:53 +0200
this is a pull request of 2 patches by Stefan Agner. He fixes the resume
operation in the mcp251x driver.
Pulled, thanks Marc.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help