can: tcan4x5x: tcan4x5x_parse_config(): reset device before register access
[ Upstream commit c3083124e6
]
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@geanix.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
68d199fc8e
commit
db10c64764
|
@ -164,6 +164,28 @@ static void tcan4x5x_check_wake(struct tcan4x5x_priv *priv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int tcan4x5x_reset(struct tcan4x5x_priv *priv)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
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 {
|
||||||
|
ret = regmap_write(priv->regmap, TCAN4X5X_CONFIG,
|
||||||
|
TCAN4X5X_SW_RESET);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep_range(700, 1000);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int regmap_spi_gather_write(void *context, const void *reg,
|
static int regmap_spi_gather_write(void *context, const void *reg,
|
||||||
size_t reg_len, const void *val,
|
size_t reg_len, const void *val,
|
||||||
size_t val_len)
|
size_t val_len)
|
||||||
|
@ -341,6 +363,7 @@ static int tcan4x5x_init(struct m_can_classdev *cdev)
|
||||||
static int tcan4x5x_parse_config(struct m_can_classdev *cdev)
|
static int tcan4x5x_parse_config(struct m_can_classdev *cdev)
|
||||||
{
|
{
|
||||||
struct tcan4x5x_priv *tcan4x5x = cdev->device_data;
|
struct tcan4x5x_priv *tcan4x5x = cdev->device_data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
tcan4x5x->device_wake_gpio = devm_gpiod_get(cdev->dev, "device-wake",
|
tcan4x5x->device_wake_gpio = devm_gpiod_get(cdev->dev, "device-wake",
|
||||||
GPIOD_OUT_HIGH);
|
GPIOD_OUT_HIGH);
|
||||||
|
@ -354,7 +377,9 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev)
|
||||||
if (IS_ERR(tcan4x5x->reset_gpio))
|
if (IS_ERR(tcan4x5x->reset_gpio))
|
||||||
tcan4x5x->reset_gpio = NULL;
|
tcan4x5x->reset_gpio = NULL;
|
||||||
|
|
||||||
usleep_range(700, 1000);
|
ret = tcan4x5x_reset(tcan4x5x);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev,
|
tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev,
|
||||||
"device-state",
|
"device-state",
|
||||||
|
|
Loading…
Reference in New Issue