From 9f29c6c8865de6f2dc200cb4c59a447d0884a6b3 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 1 Aug 2019 08:58:48 +0100 Subject: [PATCH 726/806] 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 --- 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;