From 58296d5ed27c19699d35b71c3e10f8fd0a612cb5 Mon Sep 17 00:00:00 2001 From: Joakim Zhang Date: Mon, 8 Apr 2019 13:04:32 +0800 Subject: [PATCH] MLK-21413 can: flexcan: use CBT register to set bitrate for normal mode on i.MX8 We need to add property in DTS node before when we want to use normal mode on i.MX8 platform. Check in RM, we also can use CBT register not must CTRL1 register to set bitrate for normal mode. This patch intends to use CBT register to set bitrate for normal mode on i.MX8. After this, we don't need to modify the DTS node to support normal mode. Signed-off-by: Joakim Zhang --- drivers/net/can/flexcan.c | 59 +++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 2de17d9c53ae..5a52cc24db81 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -1193,7 +1193,7 @@ static void flexcan_set_bittiming(struct net_device *dev) netdev_dbg(dev, "writing ctrl=0x%08x\n", reg); priv->write(reg, ®s->ctrl); - if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { + if (priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) { reg = FLEXCAN_CBT_EPRESDIV(bt->brp - 1) | FLEXCAN_CBT_EPSEG1(bt->phase_seg1 - 1) | FLEXCAN_CBT_EPSEG2(bt->phase_seg2 - 1) | @@ -1206,25 +1206,27 @@ static void flexcan_set_bittiming(struct net_device *dev) bt->brp - 1, bt->phase_seg1 - 1, bt->phase_seg2 - 1, bt->sjw - 1, bt->prop_seg - 1); - reg = FLEXCAN_FDCBT_FPRESDIV(dbt->brp - 1) | - FLEXCAN_FDCBT_FPSEG1(dbt->phase_seg1 - 1) | - FLEXCAN_FDCBT_FPSEG2(dbt->phase_seg2 - 1) | - FLEXCAN_FDCBT_FRJW(dbt->sjw - 1) | - FLEXCAN_FDCBT_FPROPSEG(dbt->prop_seg); - priv->write(reg, ®s->fdcbt); - - if (bt->brp != dbt->brp) - netdev_warn(dev, "PRESDIV not the same, may risk transfer errors\n"); - - netdev_dbg(dev, "fdbt: prediv %d seg1 %d seg2 %d rjw %d propseg %d\n", - dbt->brp - 1, dbt->phase_seg1 - 1, dbt->phase_seg2 - 1, - dbt->sjw - 1, dbt->prop_seg); - - netdev_dbg(dev, "%s: mcr=0x%08x ctrl=0x%08x cbt=0x%08x fdcbt=0x%08x\n", - __func__, priv->read(®s->mcr), - priv->read(®s->ctrl), - priv->read(®s->cbt), - priv->read(®s->fdcbt)); + if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { + reg = FLEXCAN_FDCBT_FPRESDIV(dbt->brp - 1) | + FLEXCAN_FDCBT_FPSEG1(dbt->phase_seg1 - 1) | + FLEXCAN_FDCBT_FPSEG2(dbt->phase_seg2 - 1) | + FLEXCAN_FDCBT_FRJW(dbt->sjw - 1) | + FLEXCAN_FDCBT_FPROPSEG(dbt->prop_seg); + priv->write(reg, ®s->fdcbt); + + if (bt->brp != dbt->brp) + netdev_warn(dev, "PRESDIV not the same, may risk transfer errors\n"); + + netdev_dbg(dev, "fdbt: prediv %d seg1 %d seg2 %d rjw %d propseg %d\n", + dbt->brp - 1, dbt->phase_seg1 - 1, dbt->phase_seg2 - 1, + dbt->sjw - 1, dbt->prop_seg); + + netdev_dbg(dev, "%s: mcr=0x%08x ctrl=0x%08x cbt=0x%08x fdcbt=0x%08x\n", + __func__, priv->read(®s->mcr), + priv->read(®s->ctrl), + priv->read(®s->cbt), + priv->read(®s->fdcbt)); + } } else { reg = priv->read(®s->ctrl); reg &= ~(FLEXCAN_CTRL_PRESDIV(0xff) | @@ -1349,13 +1351,6 @@ static int flexcan_chip_start(struct net_device *dev) * disable Transceiver Delay Compensation * Configure Message Buffer according to CAN FD mode enabled or not */ - if ((priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) && - !(priv->can.ctrlmode & CAN_CTRLMODE_FD)) { - netdev_err(dev, "fd mode must be enabled\n"); - err = -EOPNOTSUPP; - goto out_chip_disable; - } - if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { reg_fdctrl = flexcan_read_le(®s->fdctrl) & ~FLEXCAN_CANFD_MBDSR_MASK; @@ -1370,6 +1365,8 @@ static int flexcan_chip_start(struct net_device *dev) priv->write(reg_ctrl2 | FLEXCAN_CTRL2_ISOCANFDEN, ®s->ctrl2); } + priv->offload.is_canfd = true; + priv->mb_size = FLEXCAN_MB_FD_SIZE; priv->mb_num = FLEXCAN_MB_FD_NUM; } else { @@ -1732,7 +1729,6 @@ static int flexcan_probe(struct platform_device *pdev) { const struct of_device_id *of_id; const struct flexcan_devtype_data *devtype_data; - struct device_node *np = pdev->dev.of_node; struct net_device *dev; struct flexcan_priv *priv; struct regulator *reg_xceiver; @@ -1833,11 +1829,8 @@ static int flexcan_probe(struct platform_device *pdev) if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { if (priv->devtype_data->quirks & FLEXCAN_QUIRK_TIMESTAMP_SUPPORT_FD) { - if (!(of_find_property(np, "disable-fd-mode", NULL))) { - priv->can.ctrlmode_supported = CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO; - priv->can.bittiming_const = &flexcan_fd_bittiming_const; - priv->offload.is_canfd = true; - } + priv->can.ctrlmode_supported |= CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO; + priv->can.bittiming_const = &flexcan_fd_bittiming_const; priv->tx_mb_reserved_idx = FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP_FD; } else { -- 2.17.1