Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −5
Original line number Original line Diff line number Diff line
@@ -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)
	/* 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;
}
}