diff options
Diffstat (limited to 'drivers/net/can/flexcan.c')
| -rw-r--r-- | drivers/net/can/flexcan.c | 24 | 
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 971ada36e37f..134c05757a3b 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -701,7 +701,7 @@ static int flexcan_chip_freeze(struct flexcan_priv *priv)  	u32 reg;  	reg = priv->read(®s->mcr); -	reg |= FLEXCAN_MCR_HALT; +	reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT;  	priv->write(reg, ®s->mcr);  	while (timeout-- && !(priv->read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) @@ -1480,10 +1480,13 @@ static int flexcan_chip_start(struct net_device *dev)  	flexcan_set_bittiming(dev); +	/* set freeze, halt */ +	err = flexcan_chip_freeze(priv); +	if (err) +		goto out_chip_disable; +  	/* MCR  	 * -	 * enable freeze -	 * halt now  	 * only supervisor access  	 * enable warning int  	 * enable individual RX masking @@ -1492,9 +1495,8 @@ static int flexcan_chip_start(struct net_device *dev)  	 */  	reg_mcr = priv->read(®s->mcr);  	reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); -	reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | -		FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | FLEXCAN_MCR_IDAM_C | -		FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); +	reg_mcr |= FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | +		FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(priv->tx_mb_idx);  	/* MCR  	 * @@ -1865,10 +1867,14 @@ static int register_flexcandev(struct net_device *dev)  	if (err)  		goto out_chip_disable; -	/* set freeze, halt and activate FIFO, restrict register access */ +	/* set freeze, halt */ +	err = flexcan_chip_freeze(priv); +	if (err) +		goto out_chip_disable; + +	/* activate FIFO, restrict register access */  	reg = priv->read(®s->mcr); -	reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | -		FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; +	reg |=  FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV;  	priv->write(reg, ®s->mcr);  	/* Currently we only support newer versions of this core  | 
