123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- From 7c82049adb0460985dd6a1e5c9b6954d901247d2 Mon Sep 17 00:00:00 2001
- From: Samin Guo <[email protected]>
- Date: Fri, 3 Mar 2023 16:50:58 +0800
- Subject: [PATCH 044/122] net: stmmac: Add glue layer for StarFive JH7110 SoC
- This adds StarFive dwmac driver support on the StarFive JH7110 SoC.
- Tested-by: Tommaso Merciai <[email protected]>
- Co-developed-by: Emil Renner Berthing <[email protected]>
- Signed-off-by: Emil Renner Berthing <[email protected]>
- Signed-off-by: Paolo Abeni <[email protected]>
- Signed-off-by: Samin Guo <[email protected]>
- ---
- MAINTAINERS | 1 +
- drivers/net/ethernet/stmicro/stmmac/Kconfig | 12 ++
- drivers/net/ethernet/stmicro/stmmac/Makefile | 1 +
- .../ethernet/stmicro/stmmac/dwmac-starfive.c | 123 ++++++++++++++++++
- 4 files changed, 137 insertions(+)
- create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c
- --- a/MAINTAINERS
- +++ b/MAINTAINERS
- @@ -19655,6 +19655,7 @@ M: Emil Renner Berthing <[email protected]
- M: Samin Guo <[email protected]>
- S: Maintained
- F: Documentation/devicetree/bindings/net/starfive,jh7110-dwmac.yaml
- +F: drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c
-
- STARFIVE JH7110 PLL CLOCK DRIVER
- M: Xingyu Wu <[email protected]>
- --- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
- +++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
- @@ -165,6 +165,18 @@ config DWMAC_SOCFPGA
- for the stmmac device driver. This driver is used for
- arria5 and cyclone5 FPGA SoCs.
-
- +config DWMAC_STARFIVE
- + tristate "StarFive dwmac support"
- + depends on OF && (ARCH_STARFIVE || COMPILE_TEST)
- + select MFD_SYSCON
- + default m if ARCH_STARFIVE
- + help
- + Support for ethernet controllers on StarFive RISC-V SoCs
- +
- + This selects the StarFive platform specific glue layer support for
- + the stmmac device driver. This driver is used for StarFive JH7110
- + ethernet controller.
- +
- config DWMAC_STI
- tristate "STi GMAC support"
- default ARCH_STI
- --- a/drivers/net/ethernet/stmicro/stmmac/Makefile
- +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
- @@ -23,6 +23,7 @@ obj-$(CONFIG_DWMAC_OXNAS) += dwmac-oxnas
- obj-$(CONFIG_DWMAC_QCOM_ETHQOS) += dwmac-qcom-ethqos.o
- obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o
- obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o
- +obj-$(CONFIG_DWMAC_STARFIVE) += dwmac-starfive.o
- obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o
- obj-$(CONFIG_DWMAC_STM32) += dwmac-stm32.o
- obj-$(CONFIG_DWMAC_SUNXI) += dwmac-sunxi.o
- --- /dev/null
- +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c
- @@ -0,0 +1,123 @@
- +// SPDX-License-Identifier: GPL-2.0+
- +/*
- + * StarFive DWMAC platform driver
- + *
- + * Copyright (C) 2021 Emil Renner Berthing <[email protected]>
- + * Copyright (C) 2022 StarFive Technology Co., Ltd.
- + *
- + */
- +
- +#include <linux/mfd/syscon.h>
- +#include <linux/of_device.h>
- +#include <linux/regmap.h>
- +
- +#include "stmmac_platform.h"
- +
- +struct starfive_dwmac {
- + struct device *dev;
- + struct clk *clk_tx;
- +};
- +
- +static void starfive_dwmac_fix_mac_speed(void *priv, unsigned int speed)
- +{
- + struct starfive_dwmac *dwmac = priv;
- + unsigned long rate;
- + int err;
- +
- + rate = clk_get_rate(dwmac->clk_tx);
- +
- + switch (speed) {
- + case SPEED_1000:
- + rate = 125000000;
- + break;
- + case SPEED_100:
- + rate = 25000000;
- + break;
- + case SPEED_10:
- + rate = 2500000;
- + break;
- + default:
- + dev_err(dwmac->dev, "invalid speed %u\n", speed);
- + break;
- + }
- +
- + err = clk_set_rate(dwmac->clk_tx, rate);
- + if (err)
- + dev_err(dwmac->dev, "failed to set tx rate %lu\n", rate);
- +}
- +
- +static int starfive_dwmac_probe(struct platform_device *pdev)
- +{
- + struct plat_stmmacenet_data *plat_dat;
- + struct stmmac_resources stmmac_res;
- + struct starfive_dwmac *dwmac;
- + struct clk *clk_gtx;
- + int err;
- +
- + err = stmmac_get_platform_resources(pdev, &stmmac_res);
- + if (err)
- + return dev_err_probe(&pdev->dev, err,
- + "failed to get resources\n");
- +
- + plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- + if (IS_ERR(plat_dat))
- + return dev_err_probe(&pdev->dev, PTR_ERR(plat_dat),
- + "dt configuration failed\n");
- +
- + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
- + if (!dwmac)
- + return -ENOMEM;
- +
- + dwmac->clk_tx = devm_clk_get_enabled(&pdev->dev, "tx");
- + if (IS_ERR(dwmac->clk_tx))
- + return dev_err_probe(&pdev->dev, PTR_ERR(dwmac->clk_tx),
- + "error getting tx clock\n");
- +
- + clk_gtx = devm_clk_get_enabled(&pdev->dev, "gtx");
- + if (IS_ERR(clk_gtx))
- + return dev_err_probe(&pdev->dev, PTR_ERR(clk_gtx),
- + "error getting gtx clock\n");
- +
- + /* Generally, the rgmii_tx clock is provided by the internal clock,
- + * which needs to match the corresponding clock frequency according
- + * to different speeds. If the rgmii_tx clock is provided by the
- + * external rgmii_rxin, there is no need to configure the clock
- + * internally, because rgmii_rxin will be adaptively adjusted.
- + */
- + if (!device_property_read_bool(&pdev->dev, "starfive,tx-use-rgmii-clk"))
- + plat_dat->fix_mac_speed = starfive_dwmac_fix_mac_speed;
- +
- + dwmac->dev = &pdev->dev;
- + plat_dat->bsp_priv = dwmac;
- + plat_dat->dma_cfg->dche = true;
- +
- + err = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
- + if (err) {
- + stmmac_remove_config_dt(pdev, plat_dat);
- + return err;
- + }
- +
- + return 0;
- +}
- +
- +static const struct of_device_id starfive_dwmac_match[] = {
- + { .compatible = "starfive,jh7110-dwmac" },
- + { /* sentinel */ }
- +};
- +MODULE_DEVICE_TABLE(of, starfive_dwmac_match);
- +
- +static struct platform_driver starfive_dwmac_driver = {
- + .probe = starfive_dwmac_probe,
- + .remove = stmmac_pltfr_remove,
- + .driver = {
- + .name = "starfive-dwmac",
- + .pm = &stmmac_pltfr_pm_ops,
- + .of_match_table = starfive_dwmac_match,
- + },
- +};
- +module_platform_driver(starfive_dwmac_driver);
- +
- +MODULE_LICENSE("GPL");
- +MODULE_DESCRIPTION("StarFive DWMAC platform driver");
- +MODULE_AUTHOR("Emil Renner Berthing <[email protected]>");
- +MODULE_AUTHOR("Samin Guo <[email protected]>");
|