aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-4.19/950-0726-can-mcp251x-Allow-more-time-after-a-reset.patch
blob: 51acc637bedaef5d9b26f1655b8cf5d0719c5b8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
From c3fc29179a4dbbd9efa90fb462ef5aac7507ec1a Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 1 Aug 2019 08:58:48 +0100
Subject: [PATCH 726/782] can: mcp251x: Allow more time after a reset

Some boards take longer than 5ms to power up after a reset, so allow
a few retry attempts before giving up.

See: https://github.com/raspberrypi/linux/issues/2767

Signed-off-by: Phil Elwell <phil@raspberrypi.org>
---
 drivers/net/can/spi/mcp251x.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

--- a/drivers/net/can/spi/mcp251x.c
+++ b/drivers/net/can/spi/mcp251x.c
@@ -628,6 +628,7 @@ static int mcp251x_hw_reset(struct spi_d
 	struct mcp251x_priv *priv = spi_get_drvdata(spi);
 	u8 reg;
 	int ret;
+	int retries = 10;
 
 	/* Wait for oscillator startup timer after power up */
 	mdelay(MCP251X_OST_DELAY_MS);
@@ -637,10 +638,18 @@ static int mcp251x_hw_reset(struct spi_d
 	if (ret)
 		return ret;
 
-	/* Wait for oscillator startup timer after reset */
-	mdelay(MCP251X_OST_DELAY_MS);
+	/*
+	 * Wait for oscillator startup timer after reset
+	 *
+	 * Some devices can take longer than the expected 5ms to wake
+	 * up, so allow a few retries.
+	 */
+
+	do {
+		mdelay(MCP251X_OST_DELAY_MS);
+		reg = mcp251x_read_reg(spi, CANSTAT);
+	} while (!reg && retries--);
 
-	reg = mcp251x_read_reg(spi, CANSTAT);
 	if ((reg & CANCTRL_REQOP_MASK) != CANCTRL_REQOP_CONF)
 		return -ENODEV;