[PATCH v3 2/2] can: m_can: tcan4x5x: reset device before register access

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux