Commit d84ea212 authored by Marc Kleine-Budde's avatar Marc Kleine-Budde

can: mcp251x: mcp251x_hw_reset(): allow more time after a reset

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

Fixes: ff06d611 ("can: mcp251x: Improve mcp251x_hw_reset()")
Cc: linux-stable <stable@vger.kernel.org>
Tested-by: default avatarSean Nyekjaer <sean@geanix.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent af669cd2
...@@ -606,7 +606,7 @@ static int mcp251x_setup(struct net_device *net, struct spi_device *spi) ...@@ -606,7 +606,7 @@ static int mcp251x_setup(struct net_device *net, struct spi_device *spi)
static int mcp251x_hw_reset(struct spi_device *spi) static int mcp251x_hw_reset(struct spi_device *spi)
{ {
struct mcp251x_priv *priv = spi_get_drvdata(spi); struct mcp251x_priv *priv = spi_get_drvdata(spi);
u8 reg; unsigned long timeout;
int ret; int ret;
/* Wait for oscillator startup timer after power up */ /* Wait for oscillator startup timer after power up */
...@@ -620,10 +620,19 @@ static int mcp251x_hw_reset(struct spi_device *spi) ...@@ -620,10 +620,19 @@ static int mcp251x_hw_reset(struct spi_device *spi)
/* Wait for oscillator startup timer after reset */ /* Wait for oscillator startup timer after reset */
mdelay(MCP251X_OST_DELAY_MS); mdelay(MCP251X_OST_DELAY_MS);
reg = mcp251x_read_reg(spi, CANSTAT); /* Wait for reset to finish */
if ((reg & CANCTRL_REQOP_MASK) != CANCTRL_REQOP_CONF) timeout = jiffies + HZ;
return -ENODEV; while ((mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) !=
CANCTRL_REQOP_CONF) {
usleep_range(MCP251X_OST_DELAY_MS * 1000,
MCP251X_OST_DELAY_MS * 1000 * 2);
if (time_after(jiffies, timeout)) {
dev_err(&spi->dev,
"MCP251x didn't enter in conf mode after reset\n");
return -EBUSY;
}
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment