It's a good idea to reset a ip-block/spi device before using it, this patch will reset the device. And a generic reset function if needed elsewhere. Signed-off-by: Sean Nyekjaer <sean@xxxxxxxxxx> --- Changes since v2: - added reset function drivers/net/can/m_can/tcan4x5x.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c index 1f04fec7723d..b5d2ea0999c1 100644 --- a/drivers/net/can/m_can/tcan4x5x.c +++ b/drivers/net/can/m_can/tcan4x5x.c @@ -166,6 +166,18 @@ 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); + 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 +377,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