can: ctucanfd: CTU CAN FD open-source IP core - platform/SoC support.
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>
This commit is contained in:
parent
792a5b678e
commit
e8f0c23a24
@ -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 .
|
||||
|
@ -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
|
||||
|
132
drivers/net/can/ctucanfd/ctucanfd_platform.c
Normal file
132
drivers/net/can/ctucanfd/ctucanfd_platform.c
Normal file
@ -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");
|
Loading…
x
Reference in New Issue
Block a user