diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2014-02-28 14:16:59 (GMT) |
---|---|---|
committer | Matthew Weigel <Matthew.Weigel@freescale.com> | 2014-12-11 18:38:25 (GMT) |
commit | 748c627c4efdb58ff657da7e3932e2e90e6d7688 (patch) | |
tree | d0a3d521ce9da3af0961c72194baeb9c97782f35 | |
parent | 4fe9734eacc884b7ceec18a0d1d304d85c227572 (diff) | |
download | linux-fsl-qoriq-748c627c4efdb58ff657da7e3932e2e90e6d7688.tar.xz |
can: flexcan: factor out soft reset into seperate funtion
This patch moves the soft reset into a seperate function.
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
Cherry-picked from Linux-next: 4b5b82274a17f0ebbf02378df2ba7f36a3f5af19
Change-Id: I52b4dabb58e6b9af6b5a1825bb20d40d0a8a91a7
Reviewed-on: http://git.am.freescale.net:8181/21838
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Zhengxiong Jin <Jason.Jin@freescale.com>
-rw-r--r-- | drivers/net/can/flexcan.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 6378122..1444c1a 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -360,6 +360,21 @@ static int flexcan_chip_unfreeze(struct flexcan_priv *priv) return 0; } +static int flexcan_chip_softreset(struct flexcan_priv *priv) +{ + struct flexcan_regs __iomem *regs = priv->base; + unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; + + flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); + while (timeout-- && (flexcan_read(®s->mcr) & FLEXCAN_MCR_SOFTRST)) + usleep_range(10, 20); + + if (flexcan_read(®s->mcr) & FLEXCAN_MCR_SOFTRST) + return -ETIMEDOUT; + + return 0; +} + static int flexcan_get_berr_counter(const struct net_device *dev, struct can_berr_counter *bec) { @@ -783,16 +798,9 @@ static int flexcan_chip_start(struct net_device *dev) return err; /* soft reset */ - flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); - udelay(10); - - reg_mcr = flexcan_read(®s->mcr); - if (reg_mcr & FLEXCAN_MCR_SOFTRST) { - netdev_err(dev, "Failed to softreset can module (mcr=0x%08x)\n", - reg_mcr); - err = -ENODEV; + err = flexcan_chip_softreset(priv); + if (err) goto out_chip_disable; - } flexcan_set_bittiming(dev); |