[PATCH 02/20] net: xilinx: tsn: add TSN endpoint wrapper driver
Nagadheeraj Rottela <[email protected]>
| Newsgroups | org.kernel.vger.linux-devicetree,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
From: Srinivas Neeli <[email protected]> The TSN Endpoint Ethernet MAC IP groups several sub-nodes under one IP node with a set of IP-wide clocks. Each sub-node needs its own driver, and the shared clocks must be running before any of them probe. Add a thin wrapper platform driver for the IP node. Enable the IP-wide clocks from the device tree and bind each sub-node to its own driver. Signed-off-by: Srinivas Neeli <[email protected]> Co-developed-by: Nagadheeraj Rottela <[email protected]> Signed-off-by: Nagadheeraj Rottela <[email protected]> --- MAINTAINERS | 1 + drivers/net/ethernet/xilinx/Kconfig | 1 + drivers/net/ethernet/xilinx/Makefile | 1 + drivers/net/ethernet/xilinx/tsn/Kconfig | 15 +++ drivers/net/ethernet/xilinx/tsn/Makefile | 2 + .../net/ethernet/xilinx/tsn/xilinx_tsn_main.c | 105 ++++++++++++++++++ 6 files changed, 125 insertions(+) create mode 100644 drivers/net/ethernet/xilinx/tsn/Kconfig create mode 100644 drivers/net/ethernet/xilinx/tsn/Makefile create mode 100644 drivers/net/ethernet/xilinx/tsn/xilinx_tsn_main.c diff --git a/MAINTAINERS b/MAINTAINERS index ba41c224dd02..e5b95b3bfa21 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -29613,6 +29613,7 @@ M: Srinivas Neeli <[email protected]> L: [email protected] S: Maintained F: Documentation/devicetree/bindings/net/xlnx,tsn-endpoint-ethernet-mac.yaml +F: drivers/net/ethernet/xilinx/tsn/ XILINX UARTLITE SERIAL DRIVER M: Peter Korsgaard <[email protected]> diff --git a/drivers/net/ethernet/xilinx/Kconfig b/drivers/net/ethernet/xilinx/Kconfig index 7502214cc7d5..c6d704c8d3d4 100644 --- a/drivers/net/ethernet/xilinx/Kconfig +++ b/drivers/net/ethernet/xilinx/Kconfig @@ -41,4 +41,5 @@ config XILINX_LL_TEMAC This driver supports the Xilinx 10/100/1000 LocalLink TEMAC core used in Xilinx Spartan and Virtex FPGAs +source "drivers/net/ethernet/xilinx/tsn/Kconfig" endif # NET_VENDOR_XILINX diff --git a/drivers/net/ethernet/xilinx/Makefile b/drivers/net/ethernet/xilinx/Makefile index 7d7dc1771423..66dab012650b 100644 --- a/drivers/net/ethernet/xilinx/Makefile +++ b/drivers/net/ethernet/xilinx/Makefile @@ -8,3 +8,4 @@ obj-$(CONFIG_XILINX_LL_TEMAC) += ll_temac.o obj-$(CONFIG_XILINX_EMACLITE) += xilinx_emaclite.o xilinx_emac-objs := xilinx_axienet_main.o xilinx_axienet_mdio.o obj-$(CONFIG_XILINX_AXI_EMAC) += xilinx_emac.o +obj-$(CONFIG_XILINX_TSN) += tsn/ diff --git a/drivers/net/ethernet/xilinx/tsn/Kconfig b/drivers/net/ethernet/xilinx/tsn/Kconfig new file mode 100644 index 000000000000..45af4d3f10e6 --- /dev/null +++ b/drivers/net/ethernet/xilinx/tsn/Kconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Xilinx TSN device configuration +# + +config XILINX_TSN + tristate "Xilinx TSN Ethernet driver" + depends on OF && HAS_IOMEM + help + This driver supports the AMD/Xilinx Time-Sensitive Networking + (TSN) Endpoint Ethernet MAC IP. It provides the wrapper device + and the endpoint MAC that connects the IP to the host CPU. The + three-port switch is supported by NET_DSA_XILINX_TSN. + + If unsure, say N. diff --git a/drivers/net/ethernet/xilinx/tsn/Makefile b/drivers/net/ethernet/xilinx/tsn/Makefile new file mode 100644 index 000000000000..6f99226f3dc8 --- /dev/null +++ b/drivers/net/ethernet/xilinx/tsn/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_XILINX_TSN) += xilinx_tsn.o +xilinx_tsn-y := xilinx_tsn_main.o diff --git a/drivers/net/ethernet/xilinx/tsn/xilinx_tsn_main.c b/drivers/net/ethernet/xilinx/tsn/xilinx_tsn_main.c new file mode 100644 index 000000000000..1ef1b0c2ee6e --- /dev/null +++ b/drivers/net/ethernet/xilinx/tsn/xilinx_tsn_main.c @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Time Sensitive Networking (TSN) Ethernet MAC wrapper driver. + * + * Copyright (C) 2026 Advanced Micro Devices, Inc. + */ + +#include <linux/clk.h> +#include <linux/device.h> +#include <linux/mod_devicetable.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/platform_device.h> +#include <linux/slab.h> +#include <linux/types.h> + +#define TSN_NUM_CLOCKS 6 + +/** + * struct xlnx_tsn_ip - wrapper-private IP state + * @clks: bulk-managed IP clocks + */ +struct xlnx_tsn_ip { + struct clk_bulk_data clks[TSN_NUM_CLOCKS]; +}; + +static const char * const tsn_clk_names[TSN_NUM_CLOCKS] = { + "gtx", + "gtx90", + "host_rxfifo", + "host_txfifo", + "ref", + "s_axi", +}; + +static void tsn_clk_bulk_disable(void *data) +{ + struct xlnx_tsn_ip *w = data; + + clk_bulk_disable_unprepare(TSN_NUM_CLOCKS, w->clks); +} + +static int tsn_ip_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct xlnx_tsn_ip *w; + int ret; + + w = devm_kzalloc(dev, sizeof(*w), GFP_KERNEL); + if (!w) + return -ENOMEM; + + for (int i = 0; i < TSN_NUM_CLOCKS; i++) + w->clks[i].id = tsn_clk_names[i]; + + ret = devm_clk_bulk_get(dev, TSN_NUM_CLOCKS, w->clks); + if (ret) + return dev_err_probe(dev, ret, "failed to get clocks\n"); + + ret = clk_bulk_prepare_enable(TSN_NUM_CLOCKS, w->clks); + if (ret) + return dev_err_probe(dev, ret, "failed to enable clocks\n"); + + ret = devm_add_action_or_reset(dev, tsn_clk_bulk_disable, w); + if (ret) + return ret; + + return devm_of_platform_populate(dev); +} + +static const struct of_device_id tsn_of_match[] = { + { .compatible = "xlnx,tsn-endpoint-ethernet-mac-3.0" }, + { } +}; +MODULE_DEVICE_TABLE(of, tsn_of_match); + +static struct platform_driver tsn_driver = { + .probe = tsn_ip_probe, + .driver = { + .name = "xilinx-tsn", + .of_match_table = tsn_of_match, + }, +}; + +static struct platform_driver * const tsn_drivers[] = { + &tsn_driver, +}; + +static int __init xlnx_tsn_init(void) +{ + return platform_register_drivers(tsn_drivers, ARRAY_SIZE(tsn_drivers)); +} +module_init(xlnx_tsn_init); + +static void __exit xlnx_tsn_exit(void) +{ + platform_unregister_drivers(tsn_drivers, ARRAY_SIZE(tsn_drivers)); +} +module_exit(xlnx_tsn_exit); + +MODULE_AUTHOR("Srinivas Neeli <[email protected]>"); +MODULE_DESCRIPTION("AMD/Xilinx TSN Endpoint Ethernet MAC wrapper driver"); +MODULE_LICENSE("GPL"); -- 2.34.1