can: ctucanfd: CTU CAN FD open-source IP core - platform/SoC support.
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Mon, 21 Mar 2022 23:32:32 +0000 (00:32 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 19 Apr 2022 15:12:14 +0000 (17:12 +0200)
Platform bus adaptation for CTU CAN FD open-source IP core.

The core has been tested together with OpenCores SJA1000
modified to be CAN FD frames tolerant on MicroZed Zynq based
MZ_APO education kits designed by Petr Porazil from PiKRON.com
company. FPGA design

  https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top.

The kit description at the Computer Architectures course pages

  https://cw.fel.cvut.cz/wiki/courses/b35apo/documentation/mz_apo/start .

Kit carrier board and mechanics design source files

  https://gitlab.com/pikron/projects/mz_apo/microzed_apo

The work is documented in Martin Jeřábek's diploma theses
Open-source and Open-hardware CAN FD Protocol Support

  https://dspace.cvut.cz/handle/10467/80366
.

Link: https://lore.kernel.org/all/4d5c53499bafe7717815f948801bd5aedaa05c12.1647904780.git.pisa@cmp.felk.cvut.cz
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
Signed-off-by: Martin Jerabek <martin.jerabek01@gmail.com>
Signed-off-by: Ondrej Ille <ondrej.ille@gmail.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/ctucanfd/Kconfig
drivers/net/can/ctucanfd/Makefile
drivers/net/can/ctucanfd/ctucanfd_platform.c [new file with mode: 0644]

index d6e59522f4cf0d8c273256d46eafea82ea5d6c64..48963efc7f19955f91b5b772895ea8a54456ea88 100644 (file)
@@ -20,3 +20,15 @@ config CAN_CTUCANFD_PCI
          The project providing FPGA design for Intel EP4CGX15 based DB4CGX15
          PCIe board with PiKRON.com designed transceiver riser shield is available
          at https://gitlab.fel.cvut.cz/canbus/pcie-ctucanfd .
+
+config CAN_CTUCANFD_PLATFORM
+       tristate "CTU CAN-FD IP core platform (FPGA, SoC) driver"
+       depends on CAN_CTUCANFD
+       depends on OF || COMPILE_TEST
+       help
+         The core has been tested together with OpenCores SJA1000
+         modified to be CAN FD frames tolerant on MicroZed Zynq based
+         MZ_APO education kits designed by Petr Porazil from PiKRON.com
+         company. FPGA design https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top.
+         The kit description at the Computer Architectures course pages
+         https://cw.fel.cvut.cz/wiki/courses/b35apo/documentation/mz_apo/start .
index 48555c3511e7c113c7b2eb808f3590e220534b80..8078f1f2c30fc3022d36ce3ff0a08e411480bd97 100644 (file)
@@ -7,3 +7,4 @@ obj-$(CONFIG_CAN_CTUCANFD) := ctucanfd.o
 ctucanfd-y := ctucanfd_base.o
 
 obj-$(CONFIG_CAN_CTUCANFD_PCI) += ctucanfd_pci.o
+obj-$(CONFIG_CAN_CTUCANFD_PLATFORM) += ctucanfd_platform.o
diff --git a/drivers/net/can/ctucanfd/ctucanfd_platform.c b/drivers/net/can/ctucanfd/ctucanfd_platform.c
new file mode 100644 (file)
index 0000000..5e48060
--- /dev/null
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*******************************************************************************
+ *
+ * CTU CAN FD IP Core
+ *
+ * Copyright (C) 2015-2018 Ondrej Ille <ondrej.ille@gmail.com> FEE CTU
+ * Copyright (C) 2018-2021 Ondrej Ille <ondrej.ille@gmail.com> self-funded
+ * Copyright (C) 2018-2019 Martin Jerabek <martin.jerabek01@gmail.com> FEE CTU
+ * Copyright (C) 2018-2022 Pavel Pisa <pisa@cmp.felk.cvut.cz> FEE CTU/self-funded
+ *
+ * Project advisors:
+ *     Jiri Novak <jnovak@fel.cvut.cz>
+ *     Pavel Pisa <pisa@cmp.felk.cvut.cz>
+ *
+ * Department of Measurement         (http://meas.fel.cvut.cz/)
+ * Faculty of Electrical Engineering (http://www.fel.cvut.cz)
+ * Czech Technical University        (http://www.cvut.cz/)
+ ******************************************************************************/
+
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+
+#include "ctucanfd.h"
+
+#define DRV_NAME       "ctucanfd"
+
+static void ctucan_platform_set_drvdata(struct device *dev,
+                                       struct net_device *ndev)
+{
+       struct platform_device *pdev = container_of(dev, struct platform_device,
+                                                   dev);
+
+       platform_set_drvdata(pdev, ndev);
+}
+
+/**
+ * ctucan_platform_probe - Platform registration call
+ * @pdev:      Handle to the platform device structure
+ *
+ * This function does all the memory allocation and registration for the CAN
+ * device.
+ *
+ * Return: 0 on success and failure value on error
+ */
+static int ctucan_platform_probe(struct platform_device *pdev)
+{
+       struct resource *res; /* IO mem resources */
+       struct device   *dev = &pdev->dev;
+       void __iomem *addr;
+       int ret;
+       unsigned int ntxbufs;
+       int irq;
+
+       /* Get the virtual base address for the device */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       addr = devm_ioremap_resource(dev, res);
+       if (IS_ERR(addr)) {
+               dev_err(dev, "Cannot remap address.\n");
+               ret = PTR_ERR(addr);
+               goto err;
+       }
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(dev, "Cannot find interrupt.\n");
+               ret = irq;
+               goto err;
+       }
+
+       /* Number of tx bufs might be change in HW for future. If so,
+        * it will be passed as property via device tree
+        */
+       ntxbufs = 4;
+       ret = ctucan_probe_common(dev, addr, irq, ntxbufs, 0,
+                                 1, ctucan_platform_set_drvdata);
+
+       if (ret < 0)
+               platform_set_drvdata(pdev, NULL);
+
+err:
+       return ret;
+}
+
+/**
+ * ctucan_platform_remove - Unregister the device after releasing the resources
+ * @pdev:      Handle to the platform device structure
+ *
+ * This function frees all the resources allocated to the device.
+ * Return: 0 always
+ */
+static int ctucan_platform_remove(struct platform_device *pdev)
+{
+       struct net_device *ndev = platform_get_drvdata(pdev);
+       struct ctucan_priv *priv = netdev_priv(ndev);
+
+       netdev_dbg(ndev, "ctucan_remove");
+
+       unregister_candev(ndev);
+       pm_runtime_disable(&pdev->dev);
+       netif_napi_del(&priv->napi);
+       free_candev(ndev);
+
+       return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(ctucan_platform_pm_ops, ctucan_suspend, ctucan_resume);
+
+/* Match table for OF platform binding */
+static const struct of_device_id ctucan_of_match[] = {
+       { .compatible = "ctu,ctucanfd-2", },
+       { .compatible = "ctu,ctucanfd", },
+       { /* end of list */ },
+};
+MODULE_DEVICE_TABLE(of, ctucan_of_match);
+
+static struct platform_driver ctucanfd_driver = {
+       .probe  = ctucan_platform_probe,
+       .remove = ctucan_platform_remove,
+       .driver = {
+               .name = DRV_NAME,
+               .pm = &ctucan_platform_pm_ops,
+               .of_match_table = ctucan_of_match,
+       },
+};
+
+module_platform_driver(ctucanfd_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Martin Jerabek");
+MODULE_DESCRIPTION("CTU CAN FD for platform");