diff options
| -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 dff4fa472c3a..61376abdab39 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
| @@ -363,6 +363,21 @@ static int flexcan_chip_unfreeze(struct flexcan_priv *priv) | |||
| 363 | return 0; | 363 | return 0; |
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | static int flexcan_chip_softreset(struct flexcan_priv *priv) | ||
| 367 | { | ||
| 368 | struct flexcan_regs __iomem *regs = priv->base; | ||
| 369 | unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
| 370 | |||
| 371 | flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); | ||
| 372 | while (timeout-- && (flexcan_read(®s->mcr) & FLEXCAN_MCR_SOFTRST)) | ||
| 373 | usleep_range(10, 20); | ||
| 374 | |||
| 375 | if (flexcan_read(®s->mcr) & FLEXCAN_MCR_SOFTRST) | ||
| 376 | return -ETIMEDOUT; | ||
| 377 | |||
| 378 | return 0; | ||
| 379 | } | ||
| 380 | |||
| 366 | static int flexcan_get_berr_counter(const struct net_device *dev, | 381 | static int flexcan_get_berr_counter(const struct net_device *dev, |
| 367 | struct can_berr_counter *bec) | 382 | struct can_berr_counter *bec) |
| 368 | { | 383 | { |
| @@ -786,16 +801,9 @@ static int flexcan_chip_start(struct net_device *dev) | |||
| 786 | return err; | 801 | return err; |
| 787 | 802 | ||
| 788 | /* soft reset */ | 803 | /* soft reset */ |
| 789 | flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); | 804 | err = flexcan_chip_softreset(priv); |
| 790 | udelay(10); | 805 | if (err) |
| 791 | |||
| 792 | reg_mcr = flexcan_read(®s->mcr); | ||
| 793 | if (reg_mcr & FLEXCAN_MCR_SOFTRST) { | ||
| 794 | netdev_err(dev, "Failed to softreset can module (mcr=0x%08x)\n", | ||
| 795 | reg_mcr); | ||
| 796 | err = -ENODEV; | ||
| 797 | goto out_chip_disable; | 806 | goto out_chip_disable; |
| 798 | } | ||
| 799 | 807 | ||
| 800 | flexcan_set_bittiming(dev); | 808 | flexcan_set_bittiming(dev); |
| 801 | 809 | ||
