From 8b7cff63ad17e03ddb95206f4767c6b472a00e9b Mon Sep 17 00:00:00 2001 From: Joakim Zhang Date: Mon, 8 Apr 2019 12:31:53 +0800 Subject: [PATCH] MLK-21409 can: flexcan: enable flexcan driver for i.MX8 Add support flexcan on imx8 platforms, mailbox as default Signed-off-by: Joakim Zhang --- drivers/net/can/flexcan.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 091c094c1cf2..b6c68a847a4f 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -372,6 +372,9 @@ struct flexcan_priv { int id; struct flexcan_stop_mode stm; + /* Selects the clock source to CAN Protocol Engine (PE), 1 by default*/ + u32 clk_src; + u32 mb_size; u32 mb_num; }; @@ -396,6 +399,11 @@ static const struct flexcan_devtype_data fsl_imx6q_devtype_data = { FLEXCAN_QUIRK_USE_OFF_TIMESTAMP | FLEXCAN_QUIRK_BROKEN_PERR_STATE, }; +static struct flexcan_devtype_data fsl_imx8qm_devtype_data = { + .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS | + FLEXCAN_QUIRK_USE_OFF_TIMESTAMP | FLEXCAN_QUIRK_BROKEN_PERR_STATE, +}; + static const struct flexcan_devtype_data fsl_vf610_devtype_data = { .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS | FLEXCAN_QUIRK_DISABLE_MECR | FLEXCAN_QUIRK_USE_OFF_TIMESTAMP | @@ -1537,9 +1545,11 @@ static int register_flexcandev(struct net_device *dev) if (err) return err; - reg = priv->read(®s->ctrl); - reg |= FLEXCAN_CTRL_CLK_SRC; - priv->write(reg, ®s->ctrl); + if (priv->clk_src) { + reg = priv->read(®s->ctrl); + reg |= FLEXCAN_CTRL_CLK_SRC; + priv->write(reg, ®s->ctrl); + } err = flexcan_chip_enable(priv); if (err) @@ -1627,6 +1637,7 @@ static int flexcan_of_parse_stop_mode(struct platform_device *pdev) } static const struct of_device_id flexcan_of_match[] = { + { .compatible = "fsl,imx8qm-flexcan", .data = &fsl_imx8qm_devtype_data, }, { .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, }, { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, { .compatible = "fsl,imx53-flexcan", .data = &fsl_imx25_devtype_data, }, @@ -1658,6 +1669,7 @@ static int flexcan_probe(struct platform_device *pdev) struct flexcan_regs __iomem *regs; int err, irq; u32 clock_freq = 0; + u32 clk_src = 1; int wakeup = 1; reg_xceiver = devm_regulator_get(&pdev->dev, "xceiver"); @@ -1666,9 +1678,12 @@ static int flexcan_probe(struct platform_device *pdev) else if (IS_ERR(reg_xceiver)) reg_xceiver = NULL; - if (pdev->dev.of_node) + if (pdev->dev.of_node) { of_property_read_u32(pdev->dev.of_node, "clock-frequency", &clock_freq); + of_property_read_u32(pdev->dev.of_node, + "clk-src", &clk_src); + } if (!clock_freq) { clk_ipg = devm_clk_get(&pdev->dev, "ipg"); @@ -1727,6 +1742,7 @@ static int flexcan_probe(struct platform_device *pdev) } priv->dev = &pdev->dev; + priv->clk_src = clk_src; priv->can.clock.freq = clock_freq; priv->can.bittiming_const = &flexcan_bittiming_const; priv->can.data_bittiming_const = &flexcan_fd_data_bittiming_const; -- 2.17.1