diff options
Diffstat (limited to 'drivers/net/can/rcar/rcar_can.c')
-rw-r--r-- | drivers/net/can/rcar/rcar_can.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c index ac52288fa3bf..8d9e3210da7e 100644 --- a/drivers/net/can/rcar/rcar_can.c +++ b/drivers/net/can/rcar/rcar_can.c @@ -15,6 +15,7 @@ #include <linux/can/led.h> #include <linux/can/dev.h> #include <linux/clk.h> +#include <linux/clk-provider.h> #include <linux/of.h> #define RCAR_CAN_DRV_NAME "rcar_can" @@ -235,11 +236,8 @@ static void rcar_can_error(struct net_device *ndev) if (eifr & (RCAR_CAN_EIFR_EWIF | RCAR_CAN_EIFR_EPIF)) { txerr = readb(&priv->regs->tecr); rxerr = readb(&priv->regs->recr); - if (skb) { + if (skb) cf->can_id |= CAN_ERR_CRTL; - cf->data[6] = txerr; - cf->data[7] = rxerr; - } } if (eifr & RCAR_CAN_EIFR_BEIF) { int rx_errors = 0, tx_errors = 0; @@ -339,6 +337,9 @@ static void rcar_can_error(struct net_device *ndev) can_bus_off(ndev); if (skb) cf->can_id |= CAN_ERR_BUSOFF; + } else if (skb) { + cf->data[6] = txerr; + cf->data[7] = rxerr; } if (eifr & RCAR_CAN_EIFR_ORIF) { netdev_dbg(priv->ndev, "Receive overrun error interrupt\n"); @@ -861,7 +862,9 @@ static int __maybe_unused rcar_can_suspend(struct device *dev) writew(ctlr, &priv->regs->ctlr); priv->can.state = CAN_STATE_SLEEPING; - clk_disable(priv->clk); + if(__clk_is_enabled(priv->clk)) + clk_disable(priv->clk); + return 0; } |