Skip to content

Commit 0333651

Browse files
J.D. Schroedermarckleinebudde
authored andcommitted
can: c_can: Fix default pinmux glitch at init
The previous change 3973c52 (net: can: c_can: Disable pins when CAN interface is down) causes a slight glitch on the pinctrl settings when used. Since commit ab78029 (drivers/pinctrl: grab default handles from device core), the device core will automatically set the default pins. This causes the pins to be momentarily set to the default and then to the sleep state in register_c_can_dev(). By adding an optional "enable" state, boards can set the default pin state to be disabled and avoid the glitch when the switch from default to sleep first occurs. If the "enable" state is not available c_can_pinctrl_select_state() falls back to using the "default" pinctrl state. [Roger Q] - Forward port to v4.2 and use pinctrl_get_select(). Signed-off-by: J.D. Schroeder <jay.schroeder@garmin.com> Signed-off-by: Roger Quadros <rogerq@ti.com> Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> Cc: linux-stable <stable@vger.kernel.org> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 585bc2a commit 0333651

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

drivers/net/can/c_can/c_can.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ static int c_can_start(struct net_device *dev)
592592
{
593593
struct c_can_priv *priv = netdev_priv(dev);
594594
int err;
595+
struct pinctrl *p;
595596

596597
/* basic c_can configuration */
597598
err = c_can_chip_config(dev);
@@ -604,8 +605,13 @@ static int c_can_start(struct net_device *dev)
604605

605606
priv->can.state = CAN_STATE_ERROR_ACTIVE;
606607

607-
/* activate pins */
608-
pinctrl_pm_select_default_state(dev->dev.parent);
608+
/* Attempt to use "active" if available else use "default" */
609+
p = pinctrl_get_select(priv->device, "active");
610+
if (!IS_ERR(p))
611+
pinctrl_put(p);
612+
else
613+
pinctrl_pm_select_default_state(priv->device);
614+
609615
return 0;
610616
}
611617

0 commit comments

Comments
 (0)