On 07/31/2015 04:10 AM, Sasha Levin wrote: > From: Heiko Carstens <heiko.carstens@xxxxxxxxxx> > > This patch has been added to the 3.18 stable tree. If you have any > objections, please let us know. > > =============== > > [ Upstream commit 033365191136c97f88c81b7bd0011414db28bb4e ] > > The previous change 3973c526ae9c (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@xxxxxxxxxx> > Signed-off-by: Roger Quadros <rogerq@xxxxxx> > Reviewed-by: Grygorii Strashko <grygorii.strashko@xxxxxx> > Cc: linux-stable <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > Signed-off-by: Sasha Levin <sasha.levin@xxxxxxxxxx> > --- > arch/s390/kernel/process.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c > index ed84cc2..9b72e68 100644 > --- a/arch/s390/kernel/process.c > +++ b/arch/s390/kernel/process.c > @@ -171,7 +171,7 @@ asmlinkage void execve_tail(void) > { > current->thread.fp_regs.fpc = 0; > if (MACHINE_HAS_IEEE) > - asm volatile("sfpc %0,%0" : : "d" (0)); > + asm volatile("sfpc %0" : : "d" (0)); > } > > /* > The original upstream patch looked like this: diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index 041525d2595c..5d214d135332 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c @@ -592,6 +592,7 @@ static int c_can_start(struct net_device *dev) { struct c_can_priv *priv = netdev_priv(dev); int err; + struct pinctrl *p; /* basic c_can configuration */ err = c_can_chip_config(dev); @@ -604,8 +605,13 @@ static int c_can_start(struct net_device *dev) priv->can.state = CAN_STATE_ERROR_ACTIVE; - /* activate pins */ - pinctrl_pm_select_default_state(dev->dev.parent); + /* Attempt to use "active" if available else use "default" */ + p = pinctrl_get_select(priv->device, "active"); + if (!IS_ERR(p)) + pinctrl_put(p); + else + pinctrl_pm_select_default_state(priv->device); + return 0; } Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
Attachment:
signature.asc
Description: OpenPGP digital signature