2023-08-12 15:51:01

by Keguang Zhang

[permalink] [raw]
Subject: [PATCH 0/5] Move Loongson1 MAC arch-code to the driver dir

From: Kelvin Zhang <[email protected]>

In order to convert Loongson1 MAC platform devices to the devicetree
nodes, Loongson1 MAC arch-code should be moved to the driver dir.

In other words, this patchset is a preparation for converting
Loongson1 platform devices to devicetree.

Keguang Zhang (5):
MIPS: loongson32: Remove Loongson1 MAC arch-code
dt-bindings: mfd: syscon: Add compatibles for Loongson-1 syscon
dt-bindings: net: Add Loongson-1 DWMAC glue layer
net: stmmac: Add glue layer for Loongson-1 SoC
MAINTAINERS: Add entry for Loongson-1 DWMAC

.../devicetree/bindings/mfd/syscon.yaml | 2 +
.../bindings/net/loongson,ls1x-dwmac.yaml | 98 +++++++
.../devicetree/bindings/net/snps,dwmac.yaml | 2 +
MAINTAINERS | 2 +
arch/mips/loongson32/common/platform.c | 127 ++-------
drivers/net/ethernet/stmicro/stmmac/Kconfig | 11 +
drivers/net/ethernet/stmicro/stmmac/Makefile | 1 +
.../ethernet/stmicro/stmmac/dwmac-loongson1.c | 257 ++++++++++++++++++
8 files changed, 396 insertions(+), 104 deletions(-)
create mode 100644 Documentation/devicetree/bindings/net/loongson,ls1x-dwmac.yaml
create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c


base-commit: 21ef7b1e17d039053edaeaf41142423810572741
--
2.39.2



2023-08-12 15:51:18

by Keguang Zhang

[permalink] [raw]
Subject: [PATCH 3/5] dt-bindings: net: Add Loongson-1 DWMAC glue layer

Add devicetree binding document for Loongson-1 DWMAC glue layer.

Signed-off-by: Keguang Zhang <[email protected]>
---
.../bindings/net/loongson,ls1x-dwmac.yaml | 98 +++++++++++++++++++
.../devicetree/bindings/net/snps,dwmac.yaml | 2 +
2 files changed, 100 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/loongson,ls1x-dwmac.yaml

diff --git a/Documentation/devicetree/bindings/net/loongson,ls1x-dwmac.yaml b/Documentation/devicetree/bindings/net/loongson,ls1x-dwmac.yaml
new file mode 100644
index 000000000000..150799460599
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/loongson,ls1x-dwmac.yaml
@@ -0,0 +1,98 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/net/loongson,ls1x-dwmac.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Loongson-1 DWMAC glue layer
+
+maintainers:
+ - Keguang Zhang <[email protected]>
+
+select:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - loongson,ls1b-dwmac
+ - loongson,ls1c-dwmac
+ required:
+ - compatible
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - loongson,ls1b-dwmac
+ - loongson,ls1c-dwmac
+ - const: snps,dwmac-3.50a
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ clock-names:
+ const: stmmaceth
+
+ interrupts:
+ maxItems: 1
+
+ interrupt-names:
+ const: macirq
+
+ syscon:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description:
+ Phandle to the syscon containing some extra configurations
+ including PHY interface mode.
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+ - interrupts
+ - interrupt-names
+ - phy-handle
+ - phy-mode
+ - syscon
+
+allOf:
+ - $ref: snps,dwmac.yaml#
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/loongson,ls1x-clk.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+
+ gmac0: ethernet@1fe10000 {
+ compatible = "loongson,ls1b-dwmac", "snps,dwmac-3.50a";
+ reg = <0x1fe10000 0x10000>;
+
+ clocks = <&clkc LS1X_CLKID_AHB>;
+ clock-names = "stmmaceth";
+
+ interrupt-parent = <&intc1>;
+ interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "macirq";
+
+ phy-handle = <&phy0>;
+ phy-mode = "mii";
+
+ snps,pbl = <1>;
+ syscon = <&syscon>;
+
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "snps,dwmac-mdio";
+
+ phy0: ethernet-phy@0 {
+ reg = <0x0>;
+ };
+ };
+ };
diff --git a/Documentation/devicetree/bindings/net/snps,dwmac.yaml b/Documentation/devicetree/bindings/net/snps,dwmac.yaml
index ddf9522a5dc2..e1a956cf171e 100644
--- a/Documentation/devicetree/bindings/net/snps,dwmac.yaml
+++ b/Documentation/devicetree/bindings/net/snps,dwmac.yaml
@@ -66,6 +66,8 @@ properties:
- ingenic,x2000-mac
- loongson,ls2k-dwmac
- loongson,ls7a-dwmac
+ - loongson,ls1b-dwmac
+ - loongson,ls1c-dwmac
- qcom,qcs404-ethqos
- qcom,sa8775p-ethqos
- qcom,sc8280xp-ethqos
--
2.39.2


2023-08-12 15:56:01

by Keguang Zhang

[permalink] [raw]
Subject: [PATCH 2/5] dt-bindings: mfd: syscon: Add compatibles for Loongson-1 syscon

Add Loongson LS1B and LS1C compatibles for system controller.

Signed-off-by: Keguang Zhang <[email protected]>
---
Documentation/devicetree/bindings/mfd/syscon.yaml | 2 ++
1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/mfd/syscon.yaml b/Documentation/devicetree/bindings/mfd/syscon.yaml
index 8103154bbb52..c77d7b155a4c 100644
--- a/Documentation/devicetree/bindings/mfd/syscon.yaml
+++ b/Documentation/devicetree/bindings/mfd/syscon.yaml
@@ -49,6 +49,8 @@ properties:
- hisilicon,peri-subctrl
- hpe,gxp-sysreg
- intel,lgm-syscon
+ - loongson,ls1b-syscon
+ - loongson,ls1c-syscon
- marvell,armada-3700-usb2-host-misc
- mediatek,mt8135-pctl-a-syscfg
- mediatek,mt8135-pctl-b-syscfg
--
2.39.2


2023-08-12 16:09:10

by Keguang Zhang

[permalink] [raw]
Subject: [PATCH 5/5] MAINTAINERS: Add entry for Loongson-1 DWMAC

Update MAINTAINERS to add Loongson-1 DWMAC entry.

Signed-off-by: Keguang Zhang <[email protected]>
---
MAINTAINERS | 2 ++
1 file changed, 2 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 02a3192195af..3f47f2a43b41 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14309,9 +14309,11 @@ MIPS/LOONGSON1 ARCHITECTURE
M: Keguang Zhang <[email protected]>
L: [email protected]
S: Maintained
+F: Documentation/devicetree/bindings/*/loongson,ls1x-*.yaml
F: arch/mips/include/asm/mach-loongson32/
F: arch/mips/loongson32/
F: drivers/*/*loongson1*
+F: drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c

MIPS/LOONGSON2EF ARCHITECTURE
M: Jiaxun Yang <[email protected]>
--
2.39.2


2023-08-12 16:17:58

by Keguang Zhang

[permalink] [raw]
Subject: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC

This glue driver is created based on the arch-code
implemented earlier with the platform-specific settings.

Use syscon for SYSCON register access.

Partialy based on the previous work by Serge Semin.

Signed-off-by: Keguang Zhang <[email protected]>
---
drivers/net/ethernet/stmicro/stmmac/Kconfig | 11 +
drivers/net/ethernet/stmicro/stmmac/Makefile | 1 +
.../ethernet/stmicro/stmmac/dwmac-loongson1.c | 257 ++++++++++++++++++
3 files changed, 269 insertions(+)
create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c

diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 06c6871f8788..a2b9e289aa36 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -239,6 +239,17 @@ config DWMAC_INTEL_PLAT
the stmmac device driver. This driver is used for the Intel Keem Bay
SoC.

+config DWMAC_LOONGSON1
+ tristate "Loongson1 GMAC support"
+ default MACH_LOONGSON32
+ depends on OF && (MACH_LOONGSON32 || COMPILE_TEST)
+ help
+ Support for ethernet controller on Loongson1 SoC.
+
+ This selects Loongson1 SoC glue layer support for the stmmac
+ device driver. This driver is used for Loongson1-based boards
+ like Loongson LS1B/LS1C.
+
config DWMAC_TEGRA
tristate "NVIDIA Tegra MGBE support"
depends on ARCH_TEGRA || COMPILE_TEST
diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile
index 5b57aee19267..80e598bd4255 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -29,6 +29,7 @@ obj-$(CONFIG_DWMAC_SUNXI) += dwmac-sunxi.o
obj-$(CONFIG_DWMAC_SUN8I) += dwmac-sun8i.o
obj-$(CONFIG_DWMAC_DWC_QOS_ETH) += dwmac-dwc-qos-eth.o
obj-$(CONFIG_DWMAC_INTEL_PLAT) += dwmac-intel-plat.o
+obj-$(CONFIG_DWMAC_LOONGSON1) += dwmac-loongson1.o
obj-$(CONFIG_DWMAC_GENERIC) += dwmac-generic.o
obj-$(CONFIG_DWMAC_IMX8) += dwmac-imx.o
obj-$(CONFIG_DWMAC_TEGRA) += dwmac-tegra.o
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
new file mode 100644
index 000000000000..368d6cd2cb78
--- /dev/null
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
@@ -0,0 +1,257 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Loongson-1 DWMAC glue layer
+ *
+ * Copyright (C) 2011-2023 Keguang Zhang <[email protected]>
+ */
+
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/phy.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include "stmmac.h"
+#include "stmmac_platform.h"
+
+/* Loongson-1 SYSCON Registers */
+#define LS1X_SYSCON0 (0x0)
+#define LS1X_SYSCON1 (0x4)
+
+struct ls1x_dwmac_syscon {
+ const struct reg_field *reg_fields;
+ unsigned int nr_reg_fields;
+ int (*syscon_init)(struct plat_stmmacenet_data *plat);
+};
+
+struct ls1x_dwmac {
+ struct device *dev;
+ struct plat_stmmacenet_data *plat_dat;
+ const struct ls1x_dwmac_syscon *syscon;
+ struct regmap *regmap;
+ struct regmap_field *regmap_fields[];
+};
+
+enum ls1b_dwmac_syscon_regfield {
+ GMAC1_USE_UART1,
+ GMAC1_USE_UART0,
+ GMAC1_SHUT,
+ GMAC0_SHUT,
+ GMAC1_USE_TXCLK,
+ GMAC0_USE_TXCLK,
+ GMAC1_USE_PWM23,
+ GMAC0_USE_PWM01,
+};
+
+enum ls1c_dwmac_syscon_regfield {
+ GMAC_SHUT,
+ PHY_INTF_SELI,
+};
+
+const struct reg_field ls1b_dwmac_syscon_regfields[] = {
+ [GMAC1_USE_UART1] = REG_FIELD(LS1X_SYSCON0, 4, 4),
+ [GMAC1_USE_UART0] = REG_FIELD(LS1X_SYSCON0, 3, 3),
+ [GMAC1_SHUT] = REG_FIELD(LS1X_SYSCON1, 13, 13),
+ [GMAC0_SHUT] = REG_FIELD(LS1X_SYSCON1, 12, 12),
+ [GMAC1_USE_TXCLK] = REG_FIELD(LS1X_SYSCON1, 3, 3),
+ [GMAC0_USE_TXCLK] = REG_FIELD(LS1X_SYSCON1, 2, 2),
+ [GMAC1_USE_PWM23] = REG_FIELD(LS1X_SYSCON1, 1, 1),
+ [GMAC0_USE_PWM01] = REG_FIELD(LS1X_SYSCON1, 0, 0)
+};
+
+const struct reg_field ls1c_dwmac_syscon_regfields[] = {
+ [GMAC_SHUT] = REG_FIELD(LS1X_SYSCON0, 6, 6),
+ [PHY_INTF_SELI] = REG_FIELD(LS1X_SYSCON1, 28, 30)
+};
+
+static int ls1b_dwmac_syscon_init(struct plat_stmmacenet_data *plat)
+{
+ struct ls1x_dwmac *dwmac = plat->bsp_priv;
+ struct regmap_field **regmap_fields = dwmac->regmap_fields;
+
+ if (plat->bus_id) {
+ regmap_field_write(regmap_fields[GMAC1_USE_UART1], 1);
+ regmap_field_write(regmap_fields[GMAC1_USE_UART0], 1);
+
+ switch (plat->phy_interface) {
+ case PHY_INTERFACE_MODE_RGMII:
+ regmap_field_write(regmap_fields[GMAC1_USE_TXCLK], 0);
+ regmap_field_write(regmap_fields[GMAC1_USE_PWM23], 0);
+ break;
+ case PHY_INTERFACE_MODE_MII:
+ regmap_field_write(regmap_fields[GMAC1_USE_TXCLK], 1);
+ regmap_field_write(regmap_fields[GMAC1_USE_PWM23], 1);
+ break;
+ default:
+ dev_err(dwmac->dev, "Unsupported PHY mode %u\n",
+ plat->phy_interface);
+ return -EOPNOTSUPP;
+ }
+
+ regmap_field_write(regmap_fields[GMAC1_SHUT], 0);
+ } else {
+ switch (plat->phy_interface) {
+ case PHY_INTERFACE_MODE_RGMII:
+ regmap_field_write(regmap_fields[GMAC0_USE_TXCLK], 0);
+ regmap_field_write(regmap_fields[GMAC0_USE_PWM01], 0);
+ break;
+ case PHY_INTERFACE_MODE_MII:
+ regmap_field_write(regmap_fields[GMAC0_USE_TXCLK], 1);
+ regmap_field_write(regmap_fields[GMAC0_USE_PWM01], 1);
+ break;
+ default:
+ dev_err(dwmac->dev, "Unsupported PHY mode %u\n",
+ plat->phy_interface);
+ return -EOPNOTSUPP;
+ }
+
+ regmap_field_write(regmap_fields[GMAC0_SHUT], 0);
+ }
+
+ return 0;
+}
+
+static int ls1c_dwmac_syscon_init(struct plat_stmmacenet_data *plat)
+{
+ struct ls1x_dwmac *dwmac = plat->bsp_priv;
+ struct regmap_field **regmap_fields = dwmac->regmap_fields;
+
+ if (plat->phy_interface == PHY_INTERFACE_MODE_RMII) {
+ regmap_field_write(regmap_fields[PHY_INTF_SELI], 0x4);
+ } else {
+ dev_err(dwmac->dev, "Unsupported PHY-mode %u\n",
+ plat->phy_interface);
+ return -EOPNOTSUPP;
+ }
+
+ regmap_field_write(regmap_fields[GMAC_SHUT], 0);
+
+ return 0;
+}
+
+static const struct ls1x_dwmac_syscon ls1b_dwmac_syscon = {
+ .reg_fields = ls1b_dwmac_syscon_regfields,
+ .nr_reg_fields = ARRAY_SIZE(ls1b_dwmac_syscon_regfields),
+ .syscon_init = ls1b_dwmac_syscon_init,
+};
+
+static const struct ls1x_dwmac_syscon ls1c_dwmac_syscon = {
+ .reg_fields = ls1c_dwmac_syscon_regfields,
+ .nr_reg_fields = ARRAY_SIZE(ls1c_dwmac_syscon_regfields),
+ .syscon_init = ls1c_dwmac_syscon_init,
+};
+
+static int ls1x_dwmac_init(struct platform_device *pdev, void *priv)
+{
+ struct ls1x_dwmac *dwmac = priv;
+ int ret;
+
+ ret = devm_regmap_field_bulk_alloc(dwmac->dev, dwmac->regmap,
+ dwmac->regmap_fields,
+ dwmac->syscon->reg_fields,
+ dwmac->syscon->nr_reg_fields);
+ if (ret)
+ return ret;
+
+ if (dwmac->syscon->syscon_init) {
+ ret = dwmac->syscon->syscon_init(dwmac->plat_dat);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct of_device_id ls1x_dwmac_syscon_match[] = {
+ { .compatible = "loongson,ls1b-syscon", .data = &ls1b_dwmac_syscon },
+ { .compatible = "loongson,ls1c-syscon", .data = &ls1c_dwmac_syscon },
+ { }
+};
+
+static int ls1x_dwmac_probe(struct platform_device *pdev)
+{
+ struct plat_stmmacenet_data *plat_dat;
+ struct stmmac_resources stmmac_res;
+ struct device_node *syscon_np;
+ const struct of_device_id *match;
+ struct regmap *regmap;
+ struct ls1x_dwmac *dwmac;
+ const struct ls1x_dwmac_syscon *syscon;
+ size_t size;
+ int ret;
+
+ ret = stmmac_get_platform_resources(pdev, &stmmac_res);
+ if (ret)
+ return ret;
+
+ /* Probe syscon */
+ syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
+ if (!syscon_np)
+ return -ENODEV;
+
+ match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
+ if (!match) {
+ of_node_put(syscon_np);
+ return -EINVAL;
+ }
+ syscon = (const struct ls1x_dwmac_syscon *)match->data;
+
+ regmap = syscon_node_to_regmap(syscon_np);
+ of_node_put(syscon_np);
+ if (IS_ERR(regmap)) {
+ ret = PTR_ERR(regmap);
+ dev_err(&pdev->dev, "Unable to map syscon: %d\n", ret);
+ return ret;
+ }
+
+ size = syscon->nr_reg_fields * sizeof(struct regmap_field *);
+ dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac) + size, GFP_KERNEL);
+ if (!dwmac)
+ return -ENOMEM;
+
+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+ if (IS_ERR(plat_dat)) {
+ dev_err(&pdev->dev, "dt configuration failed\n");
+ return PTR_ERR(plat_dat);
+ }
+
+ plat_dat->bsp_priv = dwmac;
+ plat_dat->init = ls1x_dwmac_init;
+ dwmac->dev = &pdev->dev;
+ dwmac->plat_dat = plat_dat;
+ dwmac->syscon = syscon;
+ dwmac->regmap = regmap;
+
+ ret = stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
+ if (ret)
+ goto err_remove_config_dt;
+
+ return 0;
+
+err_remove_config_dt:
+ if (pdev->dev.of_node)
+ stmmac_remove_config_dt(pdev, plat_dat);
+
+ return ret;
+}
+
+static const struct of_device_id ls1x_dwmac_match[] = {
+ { .compatible = "loongson,ls1b-dwmac" },
+ { .compatible = "loongson,ls1c-dwmac" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ls1x_dwmac_match);
+
+static struct platform_driver ls1x_dwmac_driver = {
+ .probe = ls1x_dwmac_probe,
+ .remove_new = stmmac_pltfr_remove,
+ .driver = {
+ .name = "loongson1-dwmac",
+ .of_match_table = ls1x_dwmac_match,
+ },
+};
+module_platform_driver(ls1x_dwmac_driver);
+
+MODULE_AUTHOR("Keguang Zhang <[email protected]>");
+MODULE_DESCRIPTION("Loongson1 DWMAC glue layer");
+MODULE_LICENSE("GPL");
--
2.39.2


2023-08-12 16:37:12

by Keguang Zhang

[permalink] [raw]
Subject: [PATCH 1/5] MIPS: loongson32: Remove Loongson1 MAC arch-code

Loongson1 MAC arch-code should be moved to the driver dir.
Therefore, remove the deprecated implementation.

Signed-off-by: Keguang Zhang <[email protected]>
---
arch/mips/loongson32/common/platform.c | 127 +++++--------------------
1 file changed, 23 insertions(+), 104 deletions(-)

diff --git a/arch/mips/loongson32/common/platform.c b/arch/mips/loongson32/common/platform.c
index 8075590a9f83..37dcda402680 100644
--- a/arch/mips/loongson32/common/platform.c
+++ b/arch/mips/loongson32/common/platform.c
@@ -10,7 +10,6 @@
#include <linux/sizes.h>
#include <linux/phy.h>
#include <linux/serial_8250.h>
-#include <linux/stmmac.h>
#include <linux/usb/ehci_pdriver.h>

#include <platform.h>
@@ -62,87 +61,7 @@ void __init ls1x_serial_set_uartclk(struct platform_device *pdev)
}

/* Synopsys Ethernet GMAC */
-static struct stmmac_mdio_bus_data ls1x_mdio_bus_data = {
- .phy_mask = 0,
-};
-
-static struct stmmac_dma_cfg ls1x_eth_dma_cfg = {
- .pbl = 1,
-};
-
-int ls1x_eth_mux_init(struct platform_device *pdev, void *priv)
-{
- struct plat_stmmacenet_data *plat_dat = NULL;
- u32 val;
-
- val = __raw_readl(LS1X_MUX_CTRL1);
-
-#if defined(CONFIG_LOONGSON1_LS1B)
- plat_dat = dev_get_platdata(&pdev->dev);
- if (plat_dat->bus_id) {
- __raw_writel(__raw_readl(LS1X_MUX_CTRL0) | GMAC1_USE_UART1 |
- GMAC1_USE_UART0, LS1X_MUX_CTRL0);
- switch (plat_dat->phy_interface) {
- case PHY_INTERFACE_MODE_RGMII:
- val &= ~(GMAC1_USE_TXCLK | GMAC1_USE_PWM23);
- break;
- case PHY_INTERFACE_MODE_MII:
- val |= (GMAC1_USE_TXCLK | GMAC1_USE_PWM23);
- break;
- default:
- pr_err("unsupported mii mode %d\n",
- plat_dat->phy_interface);
- return -ENOTSUPP;
- }
- val &= ~GMAC1_SHUT;
- } else {
- switch (plat_dat->phy_interface) {
- case PHY_INTERFACE_MODE_RGMII:
- val &= ~(GMAC0_USE_TXCLK | GMAC0_USE_PWM01);
- break;
- case PHY_INTERFACE_MODE_MII:
- val |= (GMAC0_USE_TXCLK | GMAC0_USE_PWM01);
- break;
- default:
- pr_err("unsupported mii mode %d\n",
- plat_dat->phy_interface);
- return -ENOTSUPP;
- }
- val &= ~GMAC0_SHUT;
- }
- __raw_writel(val, LS1X_MUX_CTRL1);
-#elif defined(CONFIG_LOONGSON1_LS1C)
- plat_dat = dev_get_platdata(&pdev->dev);
-
- val &= ~PHY_INTF_SELI;
- if (plat_dat->phy_interface == PHY_INTERFACE_MODE_RMII)
- val |= 0x4 << PHY_INTF_SELI_SHIFT;
- __raw_writel(val, LS1X_MUX_CTRL1);
-
- val = __raw_readl(LS1X_MUX_CTRL0);
- __raw_writel(val & (~GMAC_SHUT), LS1X_MUX_CTRL0);
-#endif
-
- return 0;
-}
-
-static struct plat_stmmacenet_data ls1x_eth0_pdata = {
- .bus_id = 0,
- .phy_addr = -1,
-#if defined(CONFIG_LOONGSON1_LS1B)
- .phy_interface = PHY_INTERFACE_MODE_MII,
-#elif defined(CONFIG_LOONGSON1_LS1C)
- .phy_interface = PHY_INTERFACE_MODE_RMII,
-#endif
- .mdio_bus_data = &ls1x_mdio_bus_data,
- .dma_cfg = &ls1x_eth_dma_cfg,
- .has_gmac = 1,
- .tx_coe = 1,
- .rx_queues_to_use = 1,
- .tx_queues_to_use = 1,
- .init = ls1x_eth_mux_init,
-};
-
+#ifdef CONFIG_LOONGSON1_LS1B
static struct resource ls1x_eth0_resources[] = {
[0] = {
.start = LS1X_GMAC0_BASE,
@@ -157,27 +76,10 @@ static struct resource ls1x_eth0_resources[] = {
};

struct platform_device ls1x_eth0_pdev = {
- .name = "stmmaceth",
+ .name = "loongson,ls1b-dwmac",
.id = 0,
.num_resources = ARRAY_SIZE(ls1x_eth0_resources),
.resource = ls1x_eth0_resources,
- .dev = {
- .platform_data = &ls1x_eth0_pdata,
- },
-};
-
-#ifdef CONFIG_LOONGSON1_LS1B
-static struct plat_stmmacenet_data ls1x_eth1_pdata = {
- .bus_id = 1,
- .phy_addr = -1,
- .phy_interface = PHY_INTERFACE_MODE_MII,
- .mdio_bus_data = &ls1x_mdio_bus_data,
- .dma_cfg = &ls1x_eth_dma_cfg,
- .has_gmac = 1,
- .tx_coe = 1,
- .rx_queues_to_use = 1,
- .tx_queues_to_use = 1,
- .init = ls1x_eth_mux_init,
};

static struct resource ls1x_eth1_resources[] = {
@@ -194,15 +96,32 @@ static struct resource ls1x_eth1_resources[] = {
};

struct platform_device ls1x_eth1_pdev = {
- .name = "stmmaceth",
+ .name = "loongson,ls1b-dwmac",
.id = 1,
.num_resources = ARRAY_SIZE(ls1x_eth1_resources),
.resource = ls1x_eth1_resources,
- .dev = {
- .platform_data = &ls1x_eth1_pdata,
+};
+#elif defined(CONFIG_LOONGSON1_LS1C)
+static struct resource ls1x_eth0_resources[] = {
+ [0] = {
+ .start = LS1X_GMAC0_BASE,
+ .end = LS1X_GMAC0_BASE + SZ_64K - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .name = "macirq",
+ .start = LS1X_GMAC0_IRQ,
+ .flags = IORESOURCE_IRQ,
},
};
-#endif /* CONFIG_LOONGSON1_LS1B */
+
+struct platform_device ls1x_eth0_pdev = {
+ .name = "loongson,ls1c-dwmac",
+ .id = 0,
+ .num_resources = ARRAY_SIZE(ls1x_eth0_resources),
+ .resource = ls1x_eth0_resources,
+};
+#endif

/* GPIO */
static struct resource ls1x_gpio0_resources[] = {
--
2.39.2


2023-08-12 22:09:02

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC

Hi Keguang,

kernel test robot noticed the following build warnings:

[auto build test WARNING on 21ef7b1e17d039053edaeaf41142423810572741]

url: https://github.com/intel-lab-lkp/linux/commits/Keguang-Zhang/MIPS-loongson32-Remove-Loongson1-MAC-arch-code/20230812-231420
base: 21ef7b1e17d039053edaeaf41142423810572741
patch link: https://lore.kernel.org/r/20230812151135.1028780-5-keguang.zhang%40gmail.com
patch subject: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC
config: parisc-allyesconfig (https://download.01.org/0day-ci/archive/20230813/[email protected]/config)
compiler: hppa-linux-gcc (GCC) 12.3.0
reproduce: (https://download.01.org/0day-ci/archive/20230813/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c: In function 'ls1x_dwmac_probe':
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:188:21: error: implicit declaration of function 'of_parse_phandle' [-Werror=implicit-function-declaration]
188 | syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
| ^~~~~~~~~~~~~~~~
>> drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:188:19: warning: assignment to 'struct device_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
188 | syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
| ^
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:192:17: error: implicit declaration of function 'of_match_node'; did you mean 'for_each_node'? [-Werror=implicit-function-declaration]
192 | match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
| ^~~~~~~~~~~~~
| for_each_node
>> drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:192:15: warning: assignment to 'const struct of_device_id *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
192 | match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
| ^
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:194:17: error: implicit declaration of function 'of_node_put'; did you mean 'bpf_module_put'? [-Werror=implicit-function-declaration]
194 | of_node_put(syscon_np);
| ^~~~~~~~~~~
| bpf_module_put
cc1: some warnings being treated as errors


vim +188 drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c

170
171 static int ls1x_dwmac_probe(struct platform_device *pdev)
172 {
173 struct plat_stmmacenet_data *plat_dat;
174 struct stmmac_resources stmmac_res;
175 struct device_node *syscon_np;
176 const struct of_device_id *match;
177 struct regmap *regmap;
178 struct ls1x_dwmac *dwmac;
179 const struct ls1x_dwmac_syscon *syscon;
180 size_t size;
181 int ret;
182
183 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
184 if (ret)
185 return ret;
186
187 /* Probe syscon */
> 188 syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
189 if (!syscon_np)
190 return -ENODEV;
191
> 192 match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
193 if (!match) {
194 of_node_put(syscon_np);
195 return -EINVAL;
196 }
197 syscon = (const struct ls1x_dwmac_syscon *)match->data;
198
199 regmap = syscon_node_to_regmap(syscon_np);
200 of_node_put(syscon_np);
201 if (IS_ERR(regmap)) {
202 ret = PTR_ERR(regmap);
203 dev_err(&pdev->dev, "Unable to map syscon: %d\n", ret);
204 return ret;
205 }
206
207 size = syscon->nr_reg_fields * sizeof(struct regmap_field *);
208 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac) + size, GFP_KERNEL);
209 if (!dwmac)
210 return -ENOMEM;
211
212 plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
213 if (IS_ERR(plat_dat)) {
214 dev_err(&pdev->dev, "dt configuration failed\n");
215 return PTR_ERR(plat_dat);
216 }
217
218 plat_dat->bsp_priv = dwmac;
219 plat_dat->init = ls1x_dwmac_init;
220 dwmac->dev = &pdev->dev;
221 dwmac->plat_dat = plat_dat;
222 dwmac->syscon = syscon;
223 dwmac->regmap = regmap;
224
225 ret = stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
226 if (ret)
227 goto err_remove_config_dt;
228
229 return 0;
230
231 err_remove_config_dt:
232 if (pdev->dev.of_node)
233 stmmac_remove_config_dt(pdev, plat_dat);
234
235 return ret;
236 }
237

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2023-08-13 09:52:16

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC

Hi Keguang,

kernel test robot noticed the following build errors:

[auto build test ERROR on 21ef7b1e17d039053edaeaf41142423810572741]

url: https://github.com/intel-lab-lkp/linux/commits/Keguang-Zhang/MIPS-loongson32-Remove-Loongson1-MAC-arch-code/20230812-231420
base: 21ef7b1e17d039053edaeaf41142423810572741
patch link: https://lore.kernel.org/r/20230812151135.1028780-5-keguang.zhang%40gmail.com
patch subject: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC
config: parisc-allyesconfig (https://download.01.org/0day-ci/archive/20230813/[email protected]/config)
compiler: hppa-linux-gcc (GCC) 12.3.0
reproduce: (https://download.01.org/0day-ci/archive/20230813/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c: In function 'ls1x_dwmac_probe':
>> drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:188:21: error: implicit declaration of function 'of_parse_phandle' [-Werror=implicit-function-declaration]
188 | syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
| ^~~~~~~~~~~~~~~~
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:188:19: warning: assignment to 'struct device_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
188 | syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
| ^
>> drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:192:17: error: implicit declaration of function 'of_match_node'; did you mean 'for_each_node'? [-Werror=implicit-function-declaration]
192 | match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
| ^~~~~~~~~~~~~
| for_each_node
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:192:15: warning: assignment to 'const struct of_device_id *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
192 | match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
| ^
>> drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c:194:17: error: implicit declaration of function 'of_node_put'; did you mean 'bpf_module_put'? [-Werror=implicit-function-declaration]
194 | of_node_put(syscon_np);
| ^~~~~~~~~~~
| bpf_module_put
cc1: some warnings being treated as errors


vim +/of_parse_phandle +188 drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c

170
171 static int ls1x_dwmac_probe(struct platform_device *pdev)
172 {
173 struct plat_stmmacenet_data *plat_dat;
174 struct stmmac_resources stmmac_res;
175 struct device_node *syscon_np;
176 const struct of_device_id *match;
177 struct regmap *regmap;
178 struct ls1x_dwmac *dwmac;
179 const struct ls1x_dwmac_syscon *syscon;
180 size_t size;
181 int ret;
182
183 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
184 if (ret)
185 return ret;
186
187 /* Probe syscon */
> 188 syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
189 if (!syscon_np)
190 return -ENODEV;
191
> 192 match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
193 if (!match) {
> 194 of_node_put(syscon_np);
195 return -EINVAL;
196 }
197 syscon = (const struct ls1x_dwmac_syscon *)match->data;
198
199 regmap = syscon_node_to_regmap(syscon_np);
200 of_node_put(syscon_np);
201 if (IS_ERR(regmap)) {
202 ret = PTR_ERR(regmap);
203 dev_err(&pdev->dev, "Unable to map syscon: %d\n", ret);
204 return ret;
205 }
206
207 size = syscon->nr_reg_fields * sizeof(struct regmap_field *);
208 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac) + size, GFP_KERNEL);
209 if (!dwmac)
210 return -ENOMEM;
211
212 plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
213 if (IS_ERR(plat_dat)) {
214 dev_err(&pdev->dev, "dt configuration failed\n");
215 return PTR_ERR(plat_dat);
216 }
217
218 plat_dat->bsp_priv = dwmac;
219 plat_dat->init = ls1x_dwmac_init;
220 dwmac->dev = &pdev->dev;
221 dwmac->plat_dat = plat_dat;
222 dwmac->syscon = syscon;
223 dwmac->regmap = regmap;
224
225 ret = stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
226 if (ret)
227 goto err_remove_config_dt;
228
229 return 0;
230
231 err_remove_config_dt:
232 if (pdev->dev.of_node)
233 stmmac_remove_config_dt(pdev, plat_dat);
234
235 return ret;
236 }
237

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2023-08-13 15:49:55

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH 0/5] Move Loongson1 MAC arch-code to the driver dir

On Sat, Aug 12, 2023 at 11:11:30PM +0800, Keguang Zhang wrote:
> From: Kelvin Zhang <[email protected]>
>
> In order to convert Loongson1 MAC platform devices to the devicetree
> nodes, Loongson1 MAC arch-code should be moved to the driver dir.
>
> In other words, this patchset is a preparation for converting
> Loongson1 platform devices to devicetree.

It is a long time since i converted an ARM system from platform data
to DT. But what we tended to do was to allow both for a period of
time.

Does a system using platform data still work after this change? The
first patch seems to delete a lot of code, not just move it around.

Can you restructure this patchset to add the glue layer and DT binding
in parallel with platform data. Then have a patchset which convert all
in tree machines to using DT. And then a patchset, submitted in maybe
6 months time, to remove support for platform data.

Andrew

2023-08-13 19:09:34

by Simon Horman

[permalink] [raw]
Subject: Re: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC

On Sat, Aug 12, 2023 at 11:11:34PM +0800, Keguang Zhang wrote:
> This glue driver is created based on the arch-code
> implemented earlier with the platform-specific settings.
>
> Use syscon for SYSCON register access.
>
> Partialy based on the previous work by Serge Semin.
>
> Signed-off-by: Keguang Zhang <[email protected]>

...

Hi Keguang Zhang,

some minor feedback from my side.

> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c

...

> +const struct reg_field ls1b_dwmac_syscon_regfields[] = {
> + [GMAC1_USE_UART1] = REG_FIELD(LS1X_SYSCON0, 4, 4),
> + [GMAC1_USE_UART0] = REG_FIELD(LS1X_SYSCON0, 3, 3),
> + [GMAC1_SHUT] = REG_FIELD(LS1X_SYSCON1, 13, 13),
> + [GMAC0_SHUT] = REG_FIELD(LS1X_SYSCON1, 12, 12),
> + [GMAC1_USE_TXCLK] = REG_FIELD(LS1X_SYSCON1, 3, 3),
> + [GMAC0_USE_TXCLK] = REG_FIELD(LS1X_SYSCON1, 2, 2),
> + [GMAC1_USE_PWM23] = REG_FIELD(LS1X_SYSCON1, 1, 1),
> + [GMAC0_USE_PWM01] = REG_FIELD(LS1X_SYSCON1, 0, 0)
> +};

nit: Perhaps ls1b_dwmac_syscon_regfields should be static.

> +
> +const struct reg_field ls1c_dwmac_syscon_regfields[] = {
> + [GMAC_SHUT] = REG_FIELD(LS1X_SYSCON0, 6, 6),
> + [PHY_INTF_SELI] = REG_FIELD(LS1X_SYSCON1, 28, 30)
> +};

Likewise, perhaps ls1c_dwmac_syscon_regfields should be static.

...

> +static const struct of_device_id ls1x_dwmac_syscon_match[] = {
> + { .compatible = "loongson,ls1b-syscon", .data = &ls1b_dwmac_syscon },
> + { .compatible = "loongson,ls1c-syscon", .data = &ls1c_dwmac_syscon },
> + { }
> +};o

I am seeing a warning about ls1x_dwmac_syscon_match being unused.
I think this is due to CONFIG_OF being unset.

> +
> +static int ls1x_dwmac_probe(struct platform_device *pdev)
> +{
> + struct plat_stmmacenet_data *plat_dat;
> + struct stmmac_resources stmmac_res;
> + struct device_node *syscon_np;
> + const struct of_device_id *match;
> + struct regmap *regmap;
> + struct ls1x_dwmac *dwmac;
> + const struct ls1x_dwmac_syscon *syscon;
> + size_t size;
> + int ret;
> +
> + ret = stmmac_get_platform_resources(pdev, &stmmac_res);
> + if (ret)
> + return ret;
> +
> + /* Probe syscon */
> + syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
> + if (!syscon_np)
> + return -ENODEV;
> +
> + match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
> + if (!match) {
> + of_node_put(syscon_np);
> + return -EINVAL;
> + }
> + syscon = (const struct ls1x_dwmac_syscon *)match->data;
> +
> + regmap = syscon_node_to_regmap(syscon_np);
> + of_node_put(syscon_np);
> + if (IS_ERR(regmap)) {
> + ret = PTR_ERR(regmap);
> + dev_err(&pdev->dev, "Unable to map syscon: %d\n", ret);
> + return ret;
> + }
> +
> + size = syscon->nr_reg_fields * sizeof(struct regmap_field *);
> + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac) + size, GFP_KERNEL);
> + if (!dwmac)
> + return -ENOMEM;
> +
> + plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
> + if (IS_ERR(plat_dat)) {
> + dev_err(&pdev->dev, "dt configuration failed\n");
> + return PTR_ERR(plat_dat);
> + }
> +
> + plat_dat->bsp_priv = dwmac;
> + plat_dat->init = ls1x_dwmac_init;
> + dwmac->dev = &pdev->dev;
> + dwmac->plat_dat = plat_dat;
> + dwmac->syscon = syscon;
> + dwmac->regmap = regmap;
> +
> + ret = stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
> + if (ret)
> + goto err_remove_config_dt;
> +
> + return 0;
> +
> +err_remove_config_dt:
> + if (pdev->dev.of_node)
> + stmmac_remove_config_dt(pdev, plat_dat);
> +
> + return ret;
> +}

...

2023-08-14 03:03:21

by Keguang Zhang

[permalink] [raw]
Subject: Re: [PATCH 0/5] Move Loongson1 MAC arch-code to the driver dir

On Sun, Aug 13, 2023 at 11:24 PM Andrew Lunn <[email protected]> wrote:
>
> On Sat, Aug 12, 2023 at 11:11:30PM +0800, Keguang Zhang wrote:
> > From: Kelvin Zhang <[email protected]>
> >
> > In order to convert Loongson1 MAC platform devices to the devicetree
> > nodes, Loongson1 MAC arch-code should be moved to the driver dir.
> >
> > In other words, this patchset is a preparation for converting
> > Loongson1 platform devices to devicetree.
>
> It is a long time since i converted an ARM system from platform data
> to DT. But what we tended to do was to allow both for a period of
> time.
>
> Does a system using platform data still work after this change? The
> first patch seems to delete a lot of code, not just move it around.
>
> Can you restructure this patchset to add the glue layer and DT binding
> in parallel with platform data. Then have a patchset which convert all
> in tree machines to using DT. And then a patchset, submitted in maybe
> 6 months time, to remove support for platform data.
>
Sure, I will keep the platform data from the next version.
Thanks!

> Andrew



--
Best regards,

Keguang Zhang

2023-08-14 12:44:54

by Keguang Zhang

[permalink] [raw]
Subject: Re: [PATCH 4/5] net: stmmac: Add glue layer for Loongson-1 SoC

On Mon, Aug 14, 2023 at 2:24 AM Simon Horman <[email protected]> wrote:
>
> On Sat, Aug 12, 2023 at 11:11:34PM +0800, Keguang Zhang wrote:
> > This glue driver is created based on the arch-code
> > implemented earlier with the platform-specific settings.
> >
> > Use syscon for SYSCON register access.
> >
> > Partialy based on the previous work by Serge Semin.
> >
> > Signed-off-by: Keguang Zhang <[email protected]>
>
> ...
>
> Hi Keguang Zhang,
>
> some minor feedback from my side.
>
> > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
>
> ...
>
> > +const struct reg_field ls1b_dwmac_syscon_regfields[] = {
> > + [GMAC1_USE_UART1] = REG_FIELD(LS1X_SYSCON0, 4, 4),
> > + [GMAC1_USE_UART0] = REG_FIELD(LS1X_SYSCON0, 3, 3),
> > + [GMAC1_SHUT] = REG_FIELD(LS1X_SYSCON1, 13, 13),
> > + [GMAC0_SHUT] = REG_FIELD(LS1X_SYSCON1, 12, 12),
> > + [GMAC1_USE_TXCLK] = REG_FIELD(LS1X_SYSCON1, 3, 3),
> > + [GMAC0_USE_TXCLK] = REG_FIELD(LS1X_SYSCON1, 2, 2),
> > + [GMAC1_USE_PWM23] = REG_FIELD(LS1X_SYSCON1, 1, 1),
> > + [GMAC0_USE_PWM01] = REG_FIELD(LS1X_SYSCON1, 0, 0)
> > +};
>
> nit: Perhaps ls1b_dwmac_syscon_regfields should be static.
>
> > +
> > +const struct reg_field ls1c_dwmac_syscon_regfields[] = {
> > + [GMAC_SHUT] = REG_FIELD(LS1X_SYSCON0, 6, 6),
> > + [PHY_INTF_SELI] = REG_FIELD(LS1X_SYSCON1, 28, 30)
> > +};
>
> Likewise, perhaps ls1c_dwmac_syscon_regfields should be static.
>
Will do.
Thanks!
> ...
>
> > +static const struct of_device_id ls1x_dwmac_syscon_match[] = {
> > + { .compatible = "loongson,ls1b-syscon", .data = &ls1b_dwmac_syscon },
> > + { .compatible = "loongson,ls1c-syscon", .data = &ls1c_dwmac_syscon },
> > + { }
> > +};o
>
> I am seeing a warning about ls1x_dwmac_syscon_match being unused.
> I think this is due to CONFIG_OF being unset.

Will fix these warnings.
>
> > +
> > +static int ls1x_dwmac_probe(struct platform_device *pdev)
> > +{
> > + struct plat_stmmacenet_data *plat_dat;
> > + struct stmmac_resources stmmac_res;
> > + struct device_node *syscon_np;
> > + const struct of_device_id *match;
> > + struct regmap *regmap;
> > + struct ls1x_dwmac *dwmac;
> > + const struct ls1x_dwmac_syscon *syscon;
> > + size_t size;
> > + int ret;
> > +
> > + ret = stmmac_get_platform_resources(pdev, &stmmac_res);
> > + if (ret)
> > + return ret;
> > +
> > + /* Probe syscon */
> > + syscon_np = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
> > + if (!syscon_np)
> > + return -ENODEV;
> > +
> > + match = of_match_node(ls1x_dwmac_syscon_match, syscon_np);
> > + if (!match) {
> > + of_node_put(syscon_np);
> > + return -EINVAL;
> > + }
> > + syscon = (const struct ls1x_dwmac_syscon *)match->data;
> > +
> > + regmap = syscon_node_to_regmap(syscon_np);
> > + of_node_put(syscon_np);
> > + if (IS_ERR(regmap)) {
> > + ret = PTR_ERR(regmap);
> > + dev_err(&pdev->dev, "Unable to map syscon: %d\n", ret);
> > + return ret;
> > + }
> > +
> > + size = syscon->nr_reg_fields * sizeof(struct regmap_field *);
> > + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac) + size, GFP_KERNEL);
> > + if (!dwmac)
> > + return -ENOMEM;
> > +
> > + plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
> > + if (IS_ERR(plat_dat)) {
> > + dev_err(&pdev->dev, "dt configuration failed\n");
> > + return PTR_ERR(plat_dat);
> > + }
> > +
> > + plat_dat->bsp_priv = dwmac;
> > + plat_dat->init = ls1x_dwmac_init;
> > + dwmac->dev = &pdev->dev;
> > + dwmac->plat_dat = plat_dat;
> > + dwmac->syscon = syscon;
> > + dwmac->regmap = regmap;
> > +
> > + ret = stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
> > + if (ret)
> > + goto err_remove_config_dt;
> > +
> > + return 0;
> > +
> > +err_remove_config_dt:
> > + if (pdev->dev.of_node)
> > + stmmac_remove_config_dt(pdev, plat_dat);
> > +
> > + return ret;
> > +}
>
> ...



--
Best regards,

Keguang Zhang

2023-08-19 16:28:30

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 2/5] dt-bindings: mfd: syscon: Add compatibles for Loongson-1 syscon

On 12/08/2023 17:11, Keguang Zhang wrote:
> Add Loongson LS1B and LS1C compatibles for system controller.
>
> Signed-off-by: Keguang Zhang <[email protected]>
> ---
> Documentation/devicetree/bindings/mfd/syscon.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mfd/syscon.yaml b/Documentation/devicetree/bindings/mfd/syscon.yaml
> index 8103154bbb52..c77d7b155a4c 100644
> --- a/Documentation/devicetree/bindings/mfd/syscon.yaml
> +++ b/Documentation/devicetree/bindings/mfd/syscon.yaml
> @@ -49,6 +49,8 @@ properties:
> - hisilicon,peri-subctrl
> - hpe,gxp-sysreg
> - intel,lgm-syscon
> + - loongson,ls1b-syscon
> + - loongson,ls1c-syscon

It seems each SoC has multiple syscons so using the same compatible is
wrong. Different devices should have different compatibles.

Best regards,
Krzysztof