Message ID | 20191212161536.23264-1-dmurphy@ti.com |
---|---|
State | Accepted |
Commit | 5a1f8f5e5efa8d536d75ab532714ec248dd6da2b |
Headers | show |
Series | [linux-can/testing] can: tcan4x5x: Disable the INH pin device-state GPIO is unavailable | expand |
On 12/12/19 5:15 PM, Dan Murphy wrote: > If the device state GPIO is not connected to the host then disable the > INH output from the TCAN device per section 8.3.5 of the data sheet. > > Signed-off-by: Dan Murphy <dmurphy@ti.com> > --- Applied to linux-can. With some changes... > drivers/net/can/m_can/tcan4x5x.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c > index b5d2ea0999c1..6a1f242d1876 100644 > --- a/drivers/net/can/m_can/tcan4x5x.c > +++ b/drivers/net/can/m_can/tcan4x5x.c > @@ -102,6 +102,7 @@ > #define TCAN4X5X_MODE_NORMAL BIT(7) > > #define TCAN4X5X_DISABLE_WAKE_MSK (BIT(31) | BIT(30)) > +#define TCAN4X5X_DISABLE_INH_MSK BIT(9) > > #define TCAN4X5X_SW_RESET BIT(2) > > @@ -360,6 +361,15 @@ static int tcan4x5x_disable_wake(struct m_can_classdev *cdev) > TCAN4X5X_DISABLE_WAKE_MSK, 0x00); > } > > +static int tcan4x5x_disable_state(struct m_can_classdev *cdev) > +{ > + struct tcan4x5x_priv *tcan4x5x = cdev->device_data; > + > + return regmap_update_bits(tcan4x5x->regmap, TCAN4X5X_CONFIG, > + TCAN4X5X_DISABLE_INH_MSK, 0x01); > + Removed the stray line while applying. > +} > + > static int tcan4x5x_parse_config(struct m_can_classdev *cdev) > { > struct tcan4x5x_priv *tcan4x5x = cdev->device_data; > @@ -383,8 +393,10 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) > tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, > "device-state", > GPIOD_IN); > - if (IS_ERR(tcan4x5x->device_state_gpio)) > + if (IS_ERR(tcan4x5x->device_state_gpio)) { > tcan4x5x->device_state_gpio = NULL; > + tcan4x5x_disable_state(cdev); > + } For some reason, this hunk doesn't apply, due to the additional: >> tcan4x5x->power = devm_regulator_get_optional(cdev->dev, >> "vsup"); I've applied the patch manually. > > return 0; > } > Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
On 12/29/19 4:32 PM, Marc Kleine-Budde wrote: > On 12/12/19 5:15 PM, Dan Murphy wrote: >> static int tcan4x5x_parse_config(struct m_can_classdev *cdev) >> { >> struct tcan4x5x_priv *tcan4x5x = cdev->device_data; >> @@ -383,8 +393,10 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) >> tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, >> "device-state", >> GPIOD_IN); >> - if (IS_ERR(tcan4x5x->device_state_gpio)) >> + if (IS_ERR(tcan4x5x->device_state_gpio)) { >> tcan4x5x->device_state_gpio = NULL; >> + tcan4x5x_disable_state(cdev); >> + } > For some reason, this hunk doesn't apply, due to the additional: > >>> tcan4x5x->power = devm_regulator_get_optional(cdev->dev, >>> "vsup"); ...which was my fault. :) Please have a look at https://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git/log/?h=testing ...if I've collected every m_can related patch. Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c index b5d2ea0999c1..6a1f242d1876 100644 --- a/drivers/net/can/m_can/tcan4x5x.c +++ b/drivers/net/can/m_can/tcan4x5x.c @@ -102,6 +102,7 @@ #define TCAN4X5X_MODE_NORMAL BIT(7) #define TCAN4X5X_DISABLE_WAKE_MSK (BIT(31) | BIT(30)) +#define TCAN4X5X_DISABLE_INH_MSK BIT(9) #define TCAN4X5X_SW_RESET BIT(2) @@ -360,6 +361,15 @@ static int tcan4x5x_disable_wake(struct m_can_classdev *cdev) TCAN4X5X_DISABLE_WAKE_MSK, 0x00); } +static int tcan4x5x_disable_state(struct m_can_classdev *cdev) +{ + struct tcan4x5x_priv *tcan4x5x = cdev->device_data; + + return regmap_update_bits(tcan4x5x->regmap, TCAN4X5X_CONFIG, + TCAN4X5X_DISABLE_INH_MSK, 0x01); + +} + static int tcan4x5x_parse_config(struct m_can_classdev *cdev) { struct tcan4x5x_priv *tcan4x5x = cdev->device_data; @@ -383,8 +393,10 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, "device-state", GPIOD_IN); - if (IS_ERR(tcan4x5x->device_state_gpio)) + if (IS_ERR(tcan4x5x->device_state_gpio)) { tcan4x5x->device_state_gpio = NULL; + tcan4x5x_disable_state(cdev); + } return 0; }
If the device state GPIO is not connected to the host then disable the INH output from the TCAN device per section 8.3.5 of the data sheet. Signed-off-by: Dan Murphy <dmurphy@ti.com> --- drivers/net/can/m_can/tcan4x5x.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) -- 2.23.0