MLK-21409 can: flexcan: enable flexcan driver for i.MX8
authorJoakim Zhang <qiangqing.zhang@nxp.com>
Mon, 8 Apr 2019 04:31:53 +0000 (12:31 +0800)
committerJoakim Zhang <qiangqing.zhang@nxp.com>
Thu, 18 Apr 2019 09:16:19 +0000 (17:16 +0800)
Add support flexcan on imx8 platforms, mailbox as default

Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
drivers/net/can/flexcan.c

index 091c094..b6c68a8 100644 (file)
@@ -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(&regs->ctrl);
-       reg |= FLEXCAN_CTRL_CLK_SRC;
-       priv->write(reg, &regs->ctrl);
+       if (priv->clk_src) {
+               reg = priv->read(&regs->ctrl);
+               reg |= FLEXCAN_CTRL_CLK_SRC;
+               priv->write(reg, &regs->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;