It's a good idea to reset a ip-block/spi device before using it, this patch will reset the device. Added a generic reset function if needed elsewhere. Signed-off-by: Sean Nyekjaer <sean@xxxxxxxxxx> Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> --- Changes v3: - added reset if the reset_gpio is not avaliable drivers/net/can/m_can/tcan4x5x.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c index b6b2feca9e8f..960a16aca7ca 100644 --- a/drivers/net/can/m_can/tcan4x5x.c +++ b/drivers/net/can/m_can/tcan4x5x.c @@ -166,6 +166,21 @@ static void tcan4x5x_check_wake(struct tcan4x5x_priv *priv) } } +static void tcan4x5x_reset(struct tcan4x5x_priv *priv) +{ + if (priv->reset_gpio) { + gpiod_set_value(priv->reset_gpio, 1); + + /* tpulse_width minimum 30us */ + usleep_range(30, 100); + gpiod_set_value(priv->reset_gpio, 0); + } else { + regmap_write(priv->regmap, TCAN4X5X_CONFIG, TCAN4X5X_SW_RESET); + } + + usleep_range(700, 1000); +} + static int regmap_spi_gather_write(void *context, const void *reg, size_t reg_len, const void *val, size_t val_len) @@ -365,8 +380,8 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) GPIOD_OUT_LOW); if (IS_ERR(tcan4x5x->reset_gpio)) tcan4x5x->reset_gpio = NULL; - - usleep_range(700, 1000); + else + tcan4x5x_reset(tcan4x5x); tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, "device-state", -- 2.24.0