* [PATCH v2 02/24] dt-bindings: arm: Add ZTE ZX279128S platform descriptions
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 7:20 ` [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings Navid Ghahremani
` (11 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Lorenzo Pieralisi, devicetree,
linux-kernel
Describe the SoC board compatibility, SRAM used by the parked second CPU
and the SMP enable method.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
Documentation/devicetree/bindings/arm/cpus.yaml | 1 +
Documentation/devicetree/bindings/arm/zte.yaml | 8 +++++++-
Documentation/devicetree/bindings/sram/sram.yaml | 1 +
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/arm/cpus.yaml b/Documentation/devicetree/bindings/arm/cpus.yaml
index 5be89c5840..25a141f80b 100644
--- a/Documentation/devicetree/bindings/arm/cpus.yaml
+++ b/Documentation/devicetree/bindings/arm/cpus.yaml
@@ -284,6 +284,7 @@ properties:
- ste,dbx500-smp
- ti,am3352
- ti,am4372
+ - zte,zx279128s-smp
cpu-release-addr:
oneOf:
diff --git a/Documentation/devicetree/bindings/arm/zte.yaml b/Documentation/devicetree/bindings/arm/zte.yaml
index f028d2cec7..a1a3742219 100644
--- a/Documentation/devicetree/bindings/arm/zte.yaml
+++ b/Documentation/devicetree/bindings/arm/zte.yaml
@@ -11,7 +11,8 @@ maintainers:
description: |
ARM platforms using SoCs designed by ZTE. Currently this supports devices
- based on the zx297520v3 SoC which is found in LTE routers.
+ based on the zx297520v3 SoC which is found in LTE routers, and on the
+ zx279128s SoC which is found in home gateways.
properties:
$nodename:
@@ -23,4 +24,9 @@ properties:
- dlink,dwr932m
- const: zte,zx297520v3
+ - items:
+ - enum:
+ - zte,zxhn-h3600
+ - const: zte,zx279128s
+
additionalProperties: true
diff --git a/Documentation/devicetree/bindings/sram/sram.yaml b/Documentation/devicetree/bindings/sram/sram.yaml
index b83fc68319..d1389156c1 100644
--- a/Documentation/devicetree/bindings/sram/sram.yaml
+++ b/Documentation/devicetree/bindings/sram/sram.yaml
@@ -104,6 +104,7 @@ patternProperties:
- samsung,exynos4210-sysram-ns
- socionext,milbeaut-smp-sram
- stericsson,u8500-esram
+ - zte,zx279128s-smp-sram
reg:
description:
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
2026-10-14 7:20 ` [PATCH v2 02/24] dt-bindings: arm: Add ZTE ZX279128S platform descriptions Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 21:48 ` Stefan Dösinger
` (3 more replies)
2026-10-14 7:20 ` [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings Navid Ghahremani
` (10 subsequent siblings)
12 siblings, 4 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Stephen Boyd,
Brian Masney, Jerome Brunet, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-clk, devicetree, linux-kernel
Add Device Tree binding schemas for the ZTE ZX279128S clock controllers:
topcrm, lspcrpm, and crm2. Define fixed clock lists and simple-mfd
for child nodes inside topcrm.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/clock/zte,zx279128s-crm2.yaml | 48 +++++++++
.../bindings/clock/zte,zx279128s-lspcrpm.yaml | 101 ++++++++++++++++++
.../bindings/clock/zte,zx279128s-topcrm.yaml | 86 +++++++++++++++
include/dt-bindings/clock/zte,zx279128s-crm.h | 51 +++++++++
4 files changed, 286 insertions(+)
create mode 100644 Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml
create mode 100644 Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml
create mode 100644 Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
create mode 100644 include/dt-bindings/clock/zte,zx279128s-crm.h
diff --git a/Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml b/Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml
new file mode 100644
index 0000000000..aa90ad15d1
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml
@@ -0,0 +1,48 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/zte,zx279128s-crm2.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE ZX279128S CRM2 clock and reset controller
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ Top CRM 2 (clock and reset module 2) provides clocks and resets for
+ PCIe controllers on the ZTE ZX279128S SoC.
+
+properties:
+ compatible:
+ oneOf:
+ - const: zte,zx279128s-crm2
+ - items:
+ - const: zte,zx279128s-crm2
+ - const: syscon
+
+ reg:
+ maxItems: 1
+
+ "#clock-cells":
+ const: 1
+
+ "#reset-cells":
+ const: 1
+
+required:
+ - compatible
+ - reg
+ - "#clock-cells"
+ - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ clock-controller@94100000 {
+ compatible = "zte,zx279128s-crm2";
+ reg = <0x94100000 0x1000>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ };
diff --git a/Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml b/Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml
new file mode 100644
index 0000000000..3448829a69
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/zte,zx279128s-lspcrpm.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE ZX279128S Low Speed Peripheral Clock Modules
+
+maintainers:
+ - Stefan Dösinger <stefandoesinger@gmail.com>
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description: |
+ Each of the two groups of low speed peripherals (LSP) has a peripheral clock
+ module (LSP CRPM) of its own, fed by the top CRM.
+
+properties:
+ compatible:
+ enum:
+ - zte,zx279128s-lsp0crpm
+ - zte,zx279128s-lsp1crpm
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ minItems: 4
+ maxItems: 5
+
+ clock-names:
+ minItems: 4
+ maxItems: 5
+
+ '#clock-cells':
+ const: 1
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+ - '#clock-cells'
+
+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: zte,zx279128s-lsp0crpm
+ then:
+ properties:
+ clocks:
+ items:
+ - description: register (APB) clock of the group
+ - description: 25 MHz work clock
+ - description: 32.768 kHz work clock
+ - description: 100 MHz work clock
+ clock-names:
+ items:
+ - const: pclk
+ - const: wclk25m
+ - const: wclk32k
+ - const: wclk100m
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: zte,zx279128s-lsp1crpm
+ then:
+ properties:
+ clocks:
+ items:
+ - description: register (APB) clock of the group
+ - description: AXI clock of the group
+ - description: 25 MHz work clock
+ - description: 49.152 MHz work clock
+ - description: 100 MHz work clock
+ clock-names:
+ items:
+ - const: pclk
+ - const: aclk
+ - const: wclk25m
+ - const: wclk49m
+ - const: wclk100m
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+
+ clock-controller@94400000 {
+ compatible = "zte,zx279128s-lsp0crpm";
+ reg = <0x94400000 0x1000>;
+ clocks = <&topcrm ZX279128S_TOP_LSP0_PCLK>,
+ <&topcrm ZX279128S_TOP_LSP0_25M>,
+ <&topcrm ZX279128S_TOP_LSP0_32K>,
+ <&topcrm ZX279128S_TOP_LSP0_100M>;
+ clock-names = "pclk", "wclk25m", "wclk32k", "wclk100m";
+ #clock-cells = <1>;
+ };
diff --git a/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml b/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
new file mode 100644
index 0000000000..9466661929
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
@@ -0,0 +1,86 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/zte,zx279128s-topcrm.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE ZX279128S Top Clock and Reset Module
+
+maintainers:
+ - Stefan Dösinger <stefandoesinger@gmail.com>
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description: |
+ The top clock and reset module (CRM) of the ZTE ZX279128S holds the PLLs,
+ bus clocks, peripheral clocks and the reset controller.
+
+properties:
+ compatible:
+ items:
+ - const: zte,zx279128s-topcrm
+ - const: syscon
+ - const: simple-mfd
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: 25 MHz crystal oscillator
+
+ clock-names:
+ items:
+ - const: osc
+
+ '#clock-cells':
+ const: 1
+
+ '#reset-cells':
+ const: 1
+
+ '#address-cells':
+ const: 1
+
+ '#size-cells':
+ const: 0
+
+ reboot:
+ type: object
+ $ref: /schemas/power/reset/syscon-reboot.yaml#
+ description: System reboot controller child node
+
+patternProperties:
+ "^phy@[01]$":
+ type: object
+ description: PCIe PHY child nodes
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+ - '#clock-cells'
+ - '#reset-cells'
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+ #include <dt-bindings/reset/zte,zx279128s-reset.h>
+
+ topcrm: clock-controller@94000000 {
+ compatible = "zte,zx279128s-topcrm", "syscon", "simple-mfd";
+ reg = <0x94000000 0x1000>;
+ clocks = <&osc>;
+ clock-names = "osc";
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+
+ reboot {
+ compatible = "syscon-reboot";
+ offset = <0x44>;
+ mask = <0x1>;
+ value = <0x1>;
+ };
+ };
diff --git a/include/dt-bindings/clock/zte,zx279128s-crm.h b/include/dt-bindings/clock/zte,zx279128s-crm.h
new file mode 100644
index 0000000000..dadb2cd007
--- /dev/null
+++ b/include/dt-bindings/clock/zte,zx279128s-crm.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (C) 2026 Navid Ghahremani <ghahramani.navid@gmail.com>
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_ZTE_ZX279128S_CRM_H
+#define _DT_BINDINGS_CLOCK_ZTE_ZX279128S_CRM_H
+
+/* Top CRM */
+#define ZX279128S_TOP_PLL_A9 0
+#define ZX279128S_TOP_PLL_LSP 1
+#define ZX279128S_TOP_CPU 2
+#define ZX279128S_TOP_A9_PERIPH 3
+#define ZX279128S_TOP_MATRIX_ACLK 4
+#define ZX279128S_TOP_MATRIX_HCLK 5
+#define ZX279128S_TOP_MATRIX_PCLK 6
+#define ZX279128S_TOP_LSP0_PCLK 7
+#define ZX279128S_TOP_LSP0_25M 8
+#define ZX279128S_TOP_LSP0_32K 9
+#define ZX279128S_TOP_LSP0_100M 10
+#define ZX279128S_TOP_LSP1_PCLK 11
+#define ZX279128S_TOP_LSP1_ACLK 12
+#define ZX279128S_TOP_LSP1_25M 13
+#define ZX279128S_TOP_LSP1_49M 14
+#define ZX279128S_TOP_LSP1_100M 15
+#define ZX279128S_TOP_IRAM_ACLK 16
+#define ZX279128S_TOP_IROM_ACLK 17
+#define ZX279128S_TOP_SYS_CTRL_PCLK 18
+#define ZX279128S_TOP_USB_ACLK 19
+#define ZX279128S_TOP_USB_SUSPEND 20
+#define ZX279128S_TOP_USB_REF 21
+
+
+/* Low speed peripherals 0 */
+#define ZX279128S_LSP0_UART0_WCLK 0
+#define ZX279128S_LSP0_UART0_PCLK 1
+#define ZX279128S_LSP0_UART1_WCLK 2
+#define ZX279128S_LSP0_UART1_PCLK 3
+#define ZX279128S_LSP0_SPI_WCLK 4
+#define ZX279128S_LSP0_SPI_PCLK 5
+#define ZX279128S_LSP0_GPIO_PCLK 6
+
+/* Low speed peripherals 1 */
+#define ZX279128S_LSP1_MDIO_WCLK 0
+#define ZX279128S_LSP1_MDIO_PCLK 1
+
+/* Top CRM 2 */
+#define ZX279128S_CRM2_PCIE0_CLK 0
+#define ZX279128S_CRM2_PCIE1_CLK 1
+
+#endif
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings
2026-10-14 7:20 ` [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings Navid Ghahremani
@ 2026-10-14 21:48 ` Stefan Dösinger
2026-10-15 7:24 ` sashiko-bot
` (2 subsequent siblings)
3 siblings, 0 replies; 28+ messages in thread
From: Stefan Dösinger @ 2026-10-14 21:48 UTC (permalink / raw)
To: linux-arm-kernel, Navid Ghahremani
Cc: arnd, krzk, Navid Ghahremani, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
linux-clk, devicetree, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 4300 bytes --]
Am Mittwoch, 14. Oktober 2026, 09:20:44 Mitteleuropäische Sommerzeit schrieb
Navid Ghahremani:
> Add Device Tree binding schemas for the ZTE ZX279128S clock controllers:
> topcrm, lspcrpm, and crm2. Define fixed clock lists and simple-mfd
> for child nodes inside topcrm.
This would be easier to review if it were split in 3 patches, one yaml per
patch. I'll try to comment on the details anyway.
> +properties:
> + compatible:
> + oneOf:
> + - const: zte,zx279128s-crm2
> + - items:
> + - const: zte,zx279128s-crm2
> + - const: syscon
Afaiu this makes "syscon" optional. Why do you need syscon? Why might you not
need syscon?
The goal should be to avoid "syscon" as much as possible. The meaning of the
syscon compatible is that a different driver will access these registers
directly instead of going through a properly exported interface like #clock-
cells. Is there anything in crm2 that is not a clock or reset?
> a/Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml
> b/Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml new
> +maintainers:
> + - Stefan Dösinger <stefandoesinger@gmail.com>
> + - Navid Ghahremani <ghahramani.navid@gmail.com>
I think you should be the maintainer alone here, I don't have the hardware to
do proper testing of patches.
> +description: |
> + Each of the two groups of low speed peripherals (LSP) has a peripheral
> clock + module (LSP CRPM) of its own, fed by the top CRM.
> +
> +properties:
> + compatible:
> + enum:
> + - zte,zx279128s-lsp0crpm
> + - zte,zx279128s-lsp1crpm
I think splitting those into different bindings is still a viable choice. Yeah,
ZTE gave them very similar names, but from what I can see the two controllers
have nothing in common.
> +patternProperties:
> + "^phy@[01]$":
> + type: object
> + description: PCIe PHY child nodes
You can drop the phy child node and just add "#phy-cells=1". See https://
docs.kernel.org/devicetree/bindings/writing-bindings.html : "DON’T create
nodes just for the sake of instantiating drivers. Multi-function devices only
need child nodes when the child nodes have their own DT resources. A single
node can be multiple providers (e.g. clocks and resets)."
In practical terms, putting a child node into the DT makes this a public ABI
contract. The alternative is to split the device with an MFD driver or using
the aux bus. In the latter case, what components a device consists of is a
driver implementation detail that can easily be changed later.
The PHY subsystem has a quirk that devm_of_phy_provider_register wants the
device node to have a DT node, which is not the case if the device is an MFD
child. device_set_of_node_from_dev(dev, dev->parent); helps.
The other purpose of having a DT child node is if a sub-component is likely to
be used in a different piece of hardware. syscon-reboot is a pretty generic
example of that.
> --- /dev/null
> +++ b/include/dt-bindings/clock/zte,zx279128s-crm.h
I'd suggest to rename clock/zte,zx279128s-crm.h to clock/zte,zx279128s-clk.h.
"CRM" implies clock-reset-manager, but the -reset.h header has the reset
handles, so the "crm.h" header won't have them.
> +#define ZX279128S_TOP_PLL_A9 0
> +#define ZX279128S_TOP_PLL_LSP 1
> +#define ZX279128S_TOP_CPU 2
Do they all need to be exported? You only need those that will be used for a
clock = <&topcrm ZX279128S_TOP_SOMETHING> handle. That could e.g. be the CPU
wclk and pclk, but the parent PLL itself can remain a driver detail. Most
likely all your device clocks have a gate somewhere. In my zx29 case I only
export gates from the clock driver, with the exception of the Cortex M0 mux -
the Cortex M0 can't be turned off, so it has no gate.
I realize that a lot of devices may be missing from the DTSI in patch 23.
> +/* Low speed peripherals 0 */
> +#define ZX279128S_LSP0_UART0_WCLK 0
> +#define ZX279128S_LSP0_UART0_PCLK 1
> +#define ZX279128S_LSP0_UART1_WCLK 2
> +#define ZX279128S_LSP0_UART1_PCLK 3
> +#define ZX279128S_LSP0_SPI_WCLK 4
> +#define ZX279128S_LSP0_SPI_PCLK 5
> +#define ZX279128S_LSP0_GPIO_PCLK 6
E.g. exporting those intuitively makes sense.
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 870 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings
2026-10-14 7:20 ` [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings Navid Ghahremani
2026-10-14 21:48 ` Stefan Dösinger
@ 2026-10-15 7:24 ` sashiko-bot
2026-10-15 9:25 ` Krzysztof Kozlowski
2026-10-15 9:26 ` Krzysztof Kozlowski
3 siblings, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-15 7:24 UTC (permalink / raw)
To: Navid Ghahremani; +Cc: linux-clk, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Low] dt-bindings: missing reset header include breaks dt_binding_check
- [Low] dt-bindings: topcrm PHY child node lacks $ref or compatible constraint
--
commit 2a48341d23f9ed02596c916c05af28f44dc6b0bb
Author: Navid Ghahremani <ghahramani.navid@gmail.com>
dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings
Add Device Tree binding schemas for the ZTE ZX279128S clock controllers:
topcrm, lspcrpm, and crm2. Define fixed clock lists and simple-mfd
for child nodes inside topcrm.
> diff --git a/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml b/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
> new file mode 100644
> index 0000000000000..9466661929f03
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
[ ... ]
> +patternProperties:
> + "^phy@[01]$":
> + type: object
> + description: PCIe PHY child nodes
[Severity: Low]
Does this node definition allow malformed PHY child nodes to silently pass
validation?
Because type: object imposes no constraints by default and there is no
$ref: /schemas/phy/phy-provider.yaml# (nor a requirement for a compatible
string), dt-schema will not apply the necessary structural checks to the
child node.
[ ... ]
> +examples:
> + - |
> + #include <dt-bindings/clock/zte,zx279128s-crm.h>
> + #include <dt-bindings/reset/zte,zx279128s-reset.h>
[Severity: Low]
Does this missing header break dt_binding_check?
The missing header <dt-bindings/reset/zte,zx279128s-reset.h> is introduced in
the very next patch of this series.
Any developer running schema checks on this exact commit will hit a 'No such
file or directory' error, which breaks git bisect for anyone validating
schemas.
Each commit in a series must build independently without introducing regressions
to preserve bisectability.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014072109.1759502-1-ghahramani.navid@gmail.com?part=4
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings
2026-10-14 7:20 ` [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings Navid Ghahremani
2026-10-14 21:48 ` Stefan Dösinger
2026-10-15 7:24 ` sashiko-bot
@ 2026-10-15 9:25 ` Krzysztof Kozlowski
2026-10-15 9:26 ` Krzysztof Kozlowski
3 siblings, 0 replies; 28+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-15 9:25 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, Stephen Boyd,
Brian Masney, Jerome Brunet, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-clk, devicetree, linux-kernel
On Wed, Oct 14, 2026 at 08:20:44AM +0100, Navid Ghahremani wrote:
> Add Device Tree binding schemas for the ZTE ZX279128S clock controllers:
> topcrm, lspcrpm, and crm2. Define fixed clock lists and simple-mfd
> for child nodes inside topcrm.
>
> Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
> ---
> .../bindings/clock/zte,zx279128s-crm2.yaml | 48 +++++++++
> .../bindings/clock/zte,zx279128s-lspcrpm.yaml | 101 ++++++++++++++++++
> .../bindings/clock/zte,zx279128s-topcrm.yaml | 86 +++++++++++++++
> include/dt-bindings/clock/zte,zx279128s-crm.h | 51 +++++++++
> 4 files changed, 286 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml
> create mode 100644 Documentation/devicetree/bindings/clock/zte,zx279128s-lspcrpm.yaml
> create mode 100644 Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
> create mode 100644 include/dt-bindings/clock/zte,zx279128s-crm.h
>
> diff --git a/Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml b/Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml
> new file mode 100644
> index 0000000000..aa90ad15d1
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/clock/zte,zx279128s-crm2.yaml
> @@ -0,0 +1,48 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/clock/zte,zx279128s-crm2.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: ZTE ZX279128S CRM2 clock and reset controller
> +
> +maintainers:
> + - Navid Ghahremani <ghahramani.navid@gmail.com>
> +
> +description:
> + Top CRM 2 (clock and reset module 2) provides clocks and resets for
> + PCIe controllers on the ZTE ZX279128S SoC.
> +
> +properties:
> + compatible:
> + oneOf:
> + - const: zte,zx279128s-crm2
> + - items:
> + - const: zte,zx279128s-crm2
> + - const: syscon
This is odd. Device is specific, fixed. It either is or is not
compatible, not both.
> +
> + reg:
> + maxItems: 1
> +
> + "#clock-cells":
> + const: 1
...
> diff --git a/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml b/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
> new file mode 100644
> index 0000000000..9466661929
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml
> @@ -0,0 +1,86 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/clock/zte,zx279128s-topcrm.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: ZTE ZX279128S Top Clock and Reset Module
> +
> +maintainers:
> + - Stefan Dösinger <stefandoesinger@gmail.com>
> + - Navid Ghahremani <ghahramani.navid@gmail.com>
> +
> +description: |
Do not need '|' unless you need to preserve formatting.
> + The top clock and reset module (CRM) of the ZTE ZX279128S holds the PLLs,
> + bus clocks, peripheral clocks and the reset controller.
> +
> +properties:
> + compatible:
> + items:
> + - const: zte,zx279128s-topcrm
> + - const: syscon
> + - const: simple-mfd
> +
> + reg:
> + maxItems: 1
> +
> + clocks:
> + items:
> + - description: 25 MHz crystal oscillator
> +
> + clock-names:
> + items:
> + - const: osc
> +
> + '#clock-cells':
> + const: 1
> +
> + '#reset-cells':
> + const: 1
> +
> + '#address-cells':
> + const: 1
> +
> + '#size-cells':
> + const: 0
> +
> + reboot:
> + type: object
> + $ref: /schemas/power/reset/syscon-reboot.yaml#
> + description: System reboot controller child node
> +
> +patternProperties:
> + "^phy@[01]$":
phy-0
phy-1
because your reboot node does not have unit address.
> + type: object
> + description: PCIe PHY child nodes
Missing description, compatibles with additionalProperties: true or
full schema with 'false'
So the PHY does not need any resources from the parent? It gets its own
clocks? See explanation of simple-mfd.
> +
> +required:
> + - compatible
> + - reg
> + - clocks
> + - clock-names
> + - '#clock-cells'
> + - '#reset-cells'
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/clock/zte,zx279128s-crm.h>
> + #include <dt-bindings/reset/zte,zx279128s-reset.h>
> +
> + topcrm: clock-controller@94000000 {
> + compatible = "zte,zx279128s-topcrm", "syscon", "simple-mfd";
> + reg = <0x94000000 0x1000>;
> + clocks = <&osc>;
> + clock-names = "osc";
> + #clock-cells = <1>;
> + #reset-cells = <1>;
> +
> + reboot {
> + compatible = "syscon-reboot";
> + offset = <0x44>;
> + mask = <0x1>;
> + value = <0x1>;
Incomplete example.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings
2026-10-14 7:20 ` [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings Navid Ghahremani
` (2 preceding siblings ...)
2026-10-15 9:25 ` Krzysztof Kozlowski
@ 2026-10-15 9:26 ` Krzysztof Kozlowski
3 siblings, 0 replies; 28+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-15 9:26 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, Stephen Boyd,
Brian Masney, Jerome Brunet, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-clk, devicetree, linux-kernel
On Wed, Oct 14, 2026 at 08:20:44AM +0100, Navid Ghahremani wrote:
> Add Device Tree binding schemas for the ZTE ZX279128S clock controllers:
> topcrm, lspcrpm, and crm2. Define fixed clock lists and simple-mfd
> for child nodes inside topcrm.
>
> Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
> ---
Also:
A nit, subject: drop second/last, redundant "bindings". The
"dt-bindings" prefix is already stating that these are bindings.
See also:
https://elixir.bootlin.com/linux/v7.1-rc7/source/Documentation/devicetree/bindings/submitting-patches.rst#L23
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
2026-10-14 7:20 ` [PATCH v2 02/24] dt-bindings: arm: Add ZTE ZX279128S platform descriptions Navid Ghahremani
2026-10-14 7:20 ` [PATCH v2 04/24] dt-bindings: clock: Add ZTE ZX279128S CRM clock bindings Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-15 7:24 ` sashiko-bot
2026-10-15 9:27 ` Krzysztof Kozlowski
2026-10-14 7:20 ` [PATCH v2 07/24] dt-bindings: gpio: Add ZTE ZX279128S GPIO controller Navid Ghahremani
` (9 subsequent siblings)
12 siblings, 2 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Philipp Zabel,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-kernel,
devicetree
Define logical reset indices (0, 1, 2...) for the topcrm and crm2
reset controllers on ZTE ZX279128S SoCs.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../dt-bindings/reset/zte,zx279128s-reset.h | 26 +++++++++++++++++++
1 file changed, 26 insertions(+)
create mode 100644 include/dt-bindings/reset/zte,zx279128s-reset.h
diff --git a/include/dt-bindings/reset/zte,zx279128s-reset.h b/include/dt-bindings/reset/zte,zx279128s-reset.h
new file mode 100644
index 0000000000..5b580bcda8
--- /dev/null
+++ b/include/dt-bindings/reset/zte,zx279128s-reset.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (C) 2026 Navid Ghahremani <ghahramani.navid@gmail.com>
+ */
+
+#ifndef _DT_BINDINGS_RESET_ZTE_ZX279128S_RESET_H
+#define _DT_BINDINGS_RESET_ZTE_ZX279128S_RESET_H
+
+/*
+ * Top CRM logical reset lines. Mapped by drivers/clk/zte/clk-zx279128s.c
+ * to hardware register offsets and bit shifts.
+ */
+#define ZX279128S_RESET_USB_B9 0
+#define ZX279128S_RESET_USB_B10 1
+#define ZX279128S_RESET_USB_B11 2
+#define ZX279128S_RESET_USB_B14 3
+#define ZX279128S_RESET_COUNT 4
+
+/*
+ * Top CRM 2 logical reset lines.
+ */
+#define ZX279128S_CRM2_RESET_PCIE0 0
+#define ZX279128S_CRM2_RESET_PCIE1 1
+#define ZX279128S_CRM2_RESET_COUNT 2
+
+#endif
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings
2026-10-14 7:20 ` [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings Navid Ghahremani
@ 2026-10-15 7:24 ` sashiko-bot
2026-10-15 9:27 ` Krzysztof Kozlowski
1 sibling, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-15 7:24 UTC (permalink / raw)
To: Navid Ghahremani; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Low] dt-bindings: reset: unstable ABI via _COUNT macros
- [Low] dt-bindings: clock/reset: patch ordering breaks git bisect
--
commit 964ebb4388d7c67dbfa57a9fa7d74c6b1cd7fe12
Author: Navid Ghahremani <ghahramani.navid@gmail.com>
dt-bindings: reset: Add ZTE ZX279128S reset controller bindings
Define logical reset indices (0, 1, 2...) for the topcrm and crm2
reset controllers on ZTE ZX279128S SoCs.
[Severity: Low]
Does this patch ordering break git bisect?
The preceding commit in the series introduces
Documentation/devicetree/bindings/clock/zte,zx279128s-topcrm.yaml, which
explicitly includes <dt-bindings/reset/zte,zx279128s-reset.h> in its
examples section. However, that header file is not introduced until this
current patch.
This dependency violation causes a missing header error when building the DT
bindings at the previous commit. Should the patch defining the header be
ordered before the patch that references it?
> diff --git a/include/dt-bindings/reset/zte,zx279128s-reset.h b/include/dt-bindings/reset/zte,zx279128s-reset.h
> new file mode 100644
> index 0000000000000..5b580bcda865d
> --- /dev/null
> +++ b/include/dt-bindings/reset/zte,zx279128s-reset.h
> @@ -0,0 +1,26 @@
[ ... ]
> +/*
> + * Top CRM logical reset lines. Mapped by drivers/clk/zte/clk-zx279128s.c
> + * to hardware register offsets and bit shifts.
> + */
> +#define ZX279128S_RESET_USB_B9 0
> +#define ZX279128S_RESET_USB_B10 1
> +#define ZX279128S_RESET_USB_B11 2
> +#define ZX279128S_RESET_USB_B14 3
> +#define ZX279128S_RESET_COUNT 4
[Severity: Low]
Does exporting this upper bound macro to the stable ABI header create an
unstable ABI?
Device tree binding headers define the stable ABI between the device tree
and the kernel. Defining macros like ZX279128S_RESET_COUNT encourages
downstream or future code to use them for bounding. If new reset lines are
added in future hardware revisions, these bounds change, breaking backward
compatibility.
Since the driver correctly infers the reset count using ARRAY_SIZE() on its
internal mapping arrays later in the series, is it possible to drop this
macro and keep array sizes and upper bounds strictly inside the driver code?
> +
> +/*
> + * Top CRM 2 logical reset lines.
> + */
> +#define ZX279128S_CRM2_RESET_PCIE0 0
> +#define ZX279128S_CRM2_RESET_PCIE1 1
> +#define ZX279128S_CRM2_RESET_COUNT 2
[Severity: Low]
Similarly, could ZX279128S_CRM2_RESET_COUNT also be removed from the stable
binding header to preserve backward compatibility if new resets are
introduced later?
> +
> +#endif
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014072109.1759502-1-ghahramani.navid@gmail.com?part=5
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings
2026-10-14 7:20 ` [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings Navid Ghahremani
2026-10-15 7:24 ` sashiko-bot
@ 2026-10-15 9:27 ` Krzysztof Kozlowski
1 sibling, 0 replies; 28+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-15 9:27 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, Philipp Zabel,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-kernel,
devicetree
On Wed, Oct 14, 2026 at 08:20:45AM +0100, Navid Ghahremani wrote:
> Define logical reset indices (0, 1, 2...) for the topcrm and crm2
> reset controllers on ZTE ZX279128S SoCs.
>
> Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
> ---
> .../dt-bindings/reset/zte,zx279128s-reset.h | 26 +++++++++++++++++++
This belongs to the patch with bindings/schema.
> 1 file changed, 26 insertions(+)
> create mode 100644 include/dt-bindings/reset/zte,zx279128s-reset.h
>
> diff --git a/include/dt-bindings/reset/zte,zx279128s-reset.h b/include/dt-bindings/reset/zte,zx279128s-reset.h
> new file mode 100644
> index 0000000000..5b580bcda8
> --- /dev/null
> +++ b/include/dt-bindings/reset/zte,zx279128s-reset.h
> @@ -0,0 +1,26 @@
> +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
> +/*
> + * Copyright (C) 2026 Navid Ghahremani <ghahramani.navid@gmail.com>
> + */
> +
> +#ifndef _DT_BINDINGS_RESET_ZTE_ZX279128S_RESET_H
> +#define _DT_BINDINGS_RESET_ZTE_ZX279128S_RESET_H
> +
> +/*
> + * Top CRM logical reset lines. Mapped by drivers/clk/zte/clk-zx279128s.c
> + * to hardware register offsets and bit shifts.
> + */
> +#define ZX279128S_RESET_USB_B9 0
> +#define ZX279128S_RESET_USB_B10 1
> +#define ZX279128S_RESET_USB_B11 2
> +#define ZX279128S_RESET_USB_B14 3
> +#define ZX279128S_RESET_COUNT 4
Drop, not a binding.
> +
> +/*
> + * Top CRM 2 logical reset lines.
> + */
> +#define ZX279128S_CRM2_RESET_PCIE0 0
> +#define ZX279128S_CRM2_RESET_PCIE1 1
> +#define ZX279128S_CRM2_RESET_COUNT 2
Drop.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 07/24] dt-bindings: gpio: Add ZTE ZX279128S GPIO controller
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (2 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 05/24] dt-bindings: reset: Add ZTE ZX279128S reset controller bindings Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 7:20 ` [PATCH v2 09/24] dt-bindings: pinctrl: pinctrl-single: Add ZTE ZX279128S pin mux Navid Ghahremani
` (8 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Linus Walleij,
Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-kernel
Describe the register-clock consumer and GPIO banks.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/gpio/zte,zx279128s-gpio.yaml | 53 +++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 Documentation/devicetree/bindings/gpio/zte,zx279128s-gpio.yaml
diff --git a/Documentation/devicetree/bindings/gpio/zte,zx279128s-gpio.yaml b/Documentation/devicetree/bindings/gpio/zte,zx279128s-gpio.yaml
new file mode 100644
index 0000000000..132c7126fd
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/zte,zx279128s-gpio.yaml
@@ -0,0 +1,53 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/gpio/zte,zx279128s-gpio.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE zx279128s GPIO controller
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ The ZTE zx279128s has several identical GPIO banks. Each bank has 16
+ lines and is described by its own node.
+
+properties:
+ compatible:
+ const: zte,zx279128s-gpio
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ gpio-controller: true
+
+ '#gpio-cells':
+ const: 2
+
+ gpio-line-names:
+ maxItems: 16
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - gpio-controller
+ - '#gpio-cells'
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+
+ gpio@94407000 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x94407000 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* [PATCH v2 09/24] dt-bindings: pinctrl: pinctrl-single: Add ZTE ZX279128S pin mux
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (3 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 07/24] dt-bindings: gpio: Add ZTE ZX279128S GPIO controller Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 7:20 ` [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding Navid Ghahremani
` (7 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Linus Walleij,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Tony Lindgren,
linux-gpio, devicetree, linux-kernel
Use pinctrl-single for the verified PCIe and external-PHY bit selections
without guessing the unverified field layout.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
Documentation/devicetree/bindings/pinctrl/pinctrl-single.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-single.yaml b/Documentation/devicetree/bindings/pinctrl/pinctrl-single.yaml
index afe7329a1d..bd57b41f1e 100644
--- a/Documentation/devicetree/bindings/pinctrl/pinctrl-single.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-single.yaml
@@ -33,6 +33,7 @@ properties:
- ti,omap4-padconf
- ti,omap5-padconf
- ti,j7200-padconf
+ - zte,zx279128s-pinmux
- const: pinctrl-single
- items:
- enum:
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (4 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 09/24] dt-bindings: pinctrl: pinctrl-single: Add ZTE ZX279128S pin mux Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-15 7:24 ` sashiko-bot
2026-10-15 9:29 ` Krzysztof Kozlowski
2026-10-14 7:20 ` [PATCH v2 12/24] dt-bindings: PCI: Add ZTE ZX279128S host controller Navid Ghahremani
` (6 subsequent siblings)
12 siblings, 2 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Vinod Koul,
Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-phy, devicetree,
linux-kernel
Add Device Tree binding for the PCIe SerDes PHY found inside the
topcrm block of the ZTE ZX279128S SoC.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/phy/zte,zx279128s-pcie-phy.yaml | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
diff --git a/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml b/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
new file mode 100644
index 0000000000..7bfa363294
--- /dev/null
+++ b/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
@@ -0,0 +1,40 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/phy/zte,zx279128s-pcie-phy.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE ZX279128S PCIe PHY
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ PCIe PHY block inside the ZTE ZX279128S Top CRM.
+
+properties:
+ compatible:
+ const: zte,zx279128s-pcie-phy
+
+ reg:
+ description: Port index (0 or 1)
+ items:
+ - enum: [0, 1]
+
+ "#phy-cells":
+ const: 0
+
+required:
+ - compatible
+ - reg
+ - "#phy-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ phy@0 {
+ compatible = "zte,zx279128s-pcie-phy";
+ reg = <0>;
+ #phy-cells = <0>;
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding
2026-10-14 7:20 ` [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding Navid Ghahremani
@ 2026-10-15 7:24 ` sashiko-bot
2026-10-15 9:29 ` Krzysztof Kozlowski
1 sibling, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-15 7:24 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-phy, devicetree, robh, conor+dt, vkoul, neil.armstrong,
olteanv
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Low] dt-bindings: dt_binding_check reg_format failure in example due to missing parent context
- [Low] dt-bindings: phy: Invalid reg property enum constraint
--
commit 7ff99fb8ef3161ab6ed95f85e757575452c473c6
Author: Navid Ghahremani <ghahramani.navid@gmail.com>
dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding
Add Device Tree binding for the PCIe SerDes PHY found inside the
topcrm block of the ZTE ZX279128S SoC.
> diff --git a/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml b/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
> new file mode 100644
> index 0000000000000..7bfa363294c05
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
[ ... ]
> +properties:
> + compatible:
> + const: zte,zx279128s-pcie-phy
> +
> + reg:
> + description: Port index (0 or 1)
> + items:
> + - enum: [0, 1]
[Severity: Low]
Will this schema definition for the reg property pass validation?
The dt-schema tool translates reg properties into arrays of arrays (matrices).
Enforcing a scalar enum against the array tuple guarantees a schema validation
failure, as a list cannot equal an integer. Could this be corrected by setting
maxItems to 1 instead of specifying items with an enum list?
> +
> + "#phy-cells":
> + const: 0
> +
> +required:
> + - compatible
> + - reg
> + - "#phy-cells"
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + phy@0 {
> + compatible = "zte,zx279128s-pcie-phy";
> + reg = <0>;
[Severity: Low]
Could this standalone example trigger a compilation warning during make
dt_binding_check?
Because the phy@0 node is placed at the root level without a parent container,
dtc applies the default #address-cells = <1> and #size-cells = <1>. A
size-cells value of 1 requires the reg property to consist of both an address
and a length (2 cells in total).
The 1-cell reg property shown here triggers a reg_format warning in dtc,
causing make dt_binding_check to fail as warnings are treated as errors.
Should the example be enclosed in a parent node (such as soc { ... }) that
sets #address-cells = <1> and #size-cells = <0>?
> + #phy-cells = <0>;
> + };
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014072109.1759502-1-ghahramani.navid@gmail.com?part=10
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding
2026-10-14 7:20 ` [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding Navid Ghahremani
2026-10-15 7:24 ` sashiko-bot
@ 2026-10-15 9:29 ` Krzysztof Kozlowski
1 sibling, 0 replies; 28+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-15 9:29 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, Vinod Koul,
Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-phy, devicetree,
linux-kernel
On Wed, Oct 14, 2026 at 08:20:50AM +0100, Navid Ghahremani wrote:
> Add Device Tree binding for the PCIe SerDes PHY found inside the
> topcrm block of the ZTE ZX279128S SoC.
>
> Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
> ---
> .../bindings/phy/zte,zx279128s-pcie-phy.yaml | 40 +++++++++++++++++++
> 1 file changed, 40 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
>
> diff --git a/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml b/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
> new file mode 100644
> index 0000000000..7bfa363294
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/phy/zte,zx279128s-pcie-phy.yaml
> @@ -0,0 +1,40 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/phy/zte,zx279128s-pcie-phy.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: ZTE ZX279128S PCIe PHY
> +
> +maintainers:
> + - Navid Ghahremani <ghahramani.navid@gmail.com>
> +
> +description:
> + PCIe PHY block inside the ZTE ZX279128S Top CRM.
> +
> +properties:
> + compatible:
> + const: zte,zx279128s-pcie-phy
> +
> + reg:
> + description: Port index (0 or 1)
> + items:
> + - enum: [0, 1]
No, that's pointless. What is this index meaning on the bus?
> +
> + "#phy-cells":
> + const: 0
> +
No other resources? Then this belongs to the parent node.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 12/24] dt-bindings: PCI: Add ZTE ZX279128S host controller
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (5 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 10/24] dt-bindings: phy: Add ZTE ZX279128S PCIe PHY binding Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-15 7:24 ` sashiko-bot
2026-10-14 7:20 ` [PATCH v2 14/24] dt-bindings: net: Add ZTE ZX279128S MDIO controller Navid Ghahremani
` (5 subsequent siblings)
12 siblings, 1 reply; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-pci, devicetree, linux-kernel
Add Device Tree binding for the DesignWare PCIe host controller on the
ZTE ZX279128S SoC, using standard clocks, resets, and phys properties.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/pci/zte,zx279128s-pcie.yaml | 121 ++++++++++++++++++
1 file changed, 121 insertions(+)
create mode 100644 Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml
diff --git a/Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml b/Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml
new file mode 100644
index 0000000000..dc0214511f
--- /dev/null
+++ b/Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml
@@ -0,0 +1,121 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pci/zte,zx279128s-pcie.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE zx279128s PCIe host controller
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ The ZTE zx279128s has two PCIe host controllers based on the Synopsys
+ DesignWare PCIe IP, each with one lane. Their clocks, resets and PHYs are
+ controlled through the SoC's Top CRM blocks.
+
+allOf:
+ - $ref: /schemas/pci/pci-host-bridge.yaml#
+ - $ref: /schemas/pci/snps,dw-pcie-common.yaml#
+
+properties:
+ compatible:
+ const: zte,zx279128s-pcie
+
+ reg:
+ items:
+ - description: Data Bus Interface (DBI) registers
+ - description: Controller wrapper registers
+ - description: PCIe configuration space region
+
+ reg-names:
+ items:
+ - const: dbi
+ - const: ctrl
+ - const: config
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: PCIe controller clock
+
+ clock-names:
+ items:
+ - const: pcie
+
+ resets:
+ items:
+ - description: PCIe controller reset
+
+ reset-names:
+ items:
+ - const: core
+
+ phys:
+ maxItems: 1
+
+ phy-names:
+ items:
+ - const: pcie
+
+ reset-gpios:
+ maxItems: 1
+ description: Optional board GPIO reset line for downstream endpoints.
+
+ enable-gpios:
+ maxItems: 1
+ description: Optional second board GPIO enable line driven together with reset-gpios.
+
+required:
+ - reg
+ - reg-names
+ - interrupts
+ - '#interrupt-cells'
+ - interrupt-map
+ - interrupt-map-mask
+ - clocks
+ - clock-names
+ - resets
+ - reset-names
+ - phys
+ - phy-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+ #include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/reset/zte,zx279128s-reset.h>
+
+ pcie@f000000 {
+ compatible = "zte,zx279128s-pcie";
+ reg = <0x0f000000 0x4000>,
+ <0x09500000 0x1000>,
+ <0x1c000000 0x200000>;
+ reg-names = "dbi", "ctrl", "config";
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ bus-range = <0x00 0xff>;
+ ranges = <0x82000000 0 0x10000000 0x10000000 0 0x08000000>;
+ interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0 0 0 7>;
+ interrupt-map = <0 0 0 1 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 2 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 3 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 4 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+ linux,pci-domain = <0>;
+ clocks = <&crm2 ZX279128S_CRM2_PCIE0_CLK>;
+ clock-names = "pcie";
+ resets = <&crm2 ZX279128S_CRM2_RESET_PCIE0>;
+ reset-names = "core";
+ phys = <&pcie0_phy>;
+ phy-names = "pcie";
+ reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
+ enable-gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 12/24] dt-bindings: PCI: Add ZTE ZX279128S host controller
2026-10-14 7:20 ` [PATCH v2 12/24] dt-bindings: PCI: Add ZTE ZX279128S host controller Navid Ghahremani
@ 2026-10-15 7:24 ` sashiko-bot
0 siblings, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-15 7:24 UTC (permalink / raw)
To: Navid Ghahremani; +Cc: linux-pci, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] dt-bindings: pci: custom enable-gpios bypasses regulator framework
--
commit 4e7065d52cc5c001e2bd9b479582baa2dabea3c6
Author: Navid Ghahremani <ghahramani.navid@gmail.com>
dt-bindings: PCI: Add ZTE ZX279128S host controller
This commit adds the Device Tree binding for the DesignWare PCIe host
controller on the ZTE ZX279128S SoC. It defines the required registers,
interrupts, clocks, resets, and PHYs. It also introduces optional board-level
GPIOs for resets and enable lines.
> diff --git a/Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml b/Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml
> new file mode 100644
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pci/zte,zx279128s-pcie.yaml
[ ... ]
> + reset-gpios:
> + maxItems: 1
> + description: Optional board GPIO reset line for downstream endpoints.
> +
> + enable-gpios:
> + maxItems: 1
> + description: Optional second board GPIO enable line driven together with reset-gpios.
[Severity: Low]
Does this custom enable-gpios property bypass the regulator framework?
In Device Tree, board power or enable lines should typically be modeled using
standard regulator bindings (such as vpcie-supply) linked to a regulator-fixed
node, rather than using hardcoded raw GPIO properties directly in the PCIe
controller node.
A review of existing PCI bindings shows no other uses of enable-gpios. Could
this be modeled with a standard regulator instead?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014072109.1759502-1-ghahramani.navid@gmail.com?part=12
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 14/24] dt-bindings: net: Add ZTE ZX279128S MDIO controller
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (6 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 12/24] dt-bindings: PCI: Add ZTE ZX279128S host controller Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 7:20 ` [PATCH v2 17/24] dt-bindings: net: Add ZTE ZX279128S Ethernet switch Navid Ghahremani
` (4 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, netdev,
devicetree, linux-kernel
Describe the MDIO register block and its work/register clocks. External-
PHY pin selections use pinctrl rather than direct syscon writes.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/net/zte,zx279128s-mdio.yaml | 65 +++++++++++++++++++
1 file changed, 65 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/zte,zx279128s-mdio.yaml
diff --git a/Documentation/devicetree/bindings/net/zte,zx279128s-mdio.yaml b/Documentation/devicetree/bindings/net/zte,zx279128s-mdio.yaml
new file mode 100644
index 0000000000..fb12414ab3
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/zte,zx279128s-mdio.yaml
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/net/zte,zx279128s-mdio.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE zx279128s MDIO controller
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ The MDIO controller of the ZTE zx279128s reaches the PHYs of the integrated
+ switch and an optional external PHY. On boards with an external PHY, the
+ default pin state connects the interface to it.
+
+allOf:
+ - $ref: mdio.yaml#
+
+properties:
+ compatible:
+ const: zte,zx279128s-mdio
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: work clock, the source of the management clock (MDC)
+ - description: register (APB) clock
+
+ clock-names:
+ items:
+ - const: wclk
+ - const: pclk
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+
+ mdio@9a101000 {
+ compatible = "zte,zx279128s-mdio";
+ reg = <0x9a101000 0x18>;
+ clocks = <&lsp1crpm ZX279128S_LSP1_MDIO_WCLK>,
+ <&lsp1crpm ZX279128S_LSP1_MDIO_PCLK>;
+ clock-names = "wclk", "pclk";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ethernet-phy@8 {
+ reg = <8>;
+ };
+
+ ethernet-phy@a {
+ reg = <10>;
+ };
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* [PATCH v2 17/24] dt-bindings: net: Add ZTE ZX279128S Ethernet switch
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (7 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 14/24] dt-bindings: net: Add ZTE ZX279128S MDIO controller Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 7:20 ` [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding Navid Ghahremani
` (3 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, netdev,
devicetree, linux-kernel
Describe the switch, receive interrupt and per-port PHY modes and MAC
addresses.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/net/zte,zx279128s-gmac.yaml | 125 ++++++++++++++++++
1 file changed, 125 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/zte,zx279128s-gmac.yaml
diff --git a/Documentation/devicetree/bindings/net/zte,zx279128s-gmac.yaml b/Documentation/devicetree/bindings/net/zte,zx279128s-gmac.yaml
new file mode 100644
index 0000000000..fcbdbafa76
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/zte,zx279128s-gmac.yaml
@@ -0,0 +1,125 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/net/zte,zx279128s-gmac.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE zx279128s Ethernet switch
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ The ZTE zx279128s has a five-port gigabit Ethernet switch with a traffic
+ manager, a buffer manager and a DMA engine that connects it to the CPU.
+ Each port is described by a child node of ethernet-ports and becomes its
+ own network interface, with the MAC address given in that node.
+
+properties:
+ compatible:
+ const: zte,zx279128s-gmac
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+ description: The traffic manager's interrupt, which signals frames
+ received for the CPU.
+
+ ethernet-ports:
+ type: object
+ additionalProperties: false
+
+ properties:
+ '#address-cells':
+ const: 1
+ '#size-cells':
+ const: 0
+
+ patternProperties:
+ "^port@[0-4]$":
+ type: object
+ $ref: /schemas/net/ethernet-controller.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ reg:
+ description: Switch port number
+ maximum: 4
+
+ label: true
+
+ phy-handle: true
+
+ phy-mode:
+ description: internal for the SoC's own PHYs of ports 0-3, gmii
+ for an external PHY.
+ enum: [gmii, internal]
+
+ required:
+ - reg
+ - phy-handle
+ - phy-mode
+
+ required:
+ - '#address-cells'
+ - '#size-cells'
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - ethernet-ports
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ phy8: ethernet-phy@8 {
+ reg = <8>;
+ };
+
+ phy10: ethernet-phy@a {
+ reg = <10>;
+ };
+ };
+
+ macaddr: nvmem {
+ #nvmem-cell-cells = <1>;
+ };
+
+ ethernet@92000000 {
+ compatible = "zte,zx279128s-gmac";
+ reg = <0x92000000 0x400000>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+
+ ethernet-ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ label = "lan1";
+ phy-handle = <&phy10>;
+ phy-mode = "internal";
+ nvmem-cells = <&macaddr 0>;
+ nvmem-cell-names = "mac-address";
+ };
+
+ port@4 {
+ reg = <4>;
+ label = "wan";
+ phy-handle = <&phy8>;
+ phy-mode = "gmii";
+ nvmem-cells = <&macaddr 1>;
+ nvmem-cell-names = "mac-address";
+ };
+ };
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (8 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 17/24] dt-bindings: net: Add ZTE ZX279128S Ethernet switch Navid Ghahremani
@ 2026-10-14 7:20 ` Navid Ghahremani
2026-10-14 20:33 ` Stefan Dösinger
` (2 more replies)
2026-10-14 7:21 ` [PATCH v2 21/24] dt-bindings: usb: Add ZTE ZX279128S DWC3 controller Navid Ghahremani
` (2 subsequent siblings)
12 siblings, 3 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:20 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Mark Brown,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-spi,
devicetree, linux-kernel
Add Device Tree binding for the ZTE ZX family SPI flash controller,
supporting both ZX29 and ZX279128S SoCs.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/spi/zte,zx279128s-spifc.yaml | 72 +++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 Documentation/devicetree/bindings/spi/zte,zx279128s-spifc.yaml
diff --git a/Documentation/devicetree/bindings/spi/zte,zx279128s-spifc.yaml b/Documentation/devicetree/bindings/spi/zte,zx279128s-spifc.yaml
new file mode 100644
index 0000000000..201fe46b2f
--- /dev/null
+++ b/Documentation/devicetree/bindings/spi/zte,zx279128s-spifc.yaml
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/spi/zte,zx279128s-spifc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE zx279128s SPI flash controller
+
+maintainers:
+ - Stefan Dösinger <stefandoesinger@gmail.com>
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ The SPI flash controller of the ZTE zx279128s runs flash operations (an
+ opcode with optional address, dummy and data phases) on one chip select.
+ The data phase can use one, two or four lines.
+
+allOf:
+ - $ref: spi-controller.yaml#
+
+properties:
+ compatible:
+ enum:
+ - zte,zx29-qspi
+ - zte,zx279128s-spifc
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: work clock, the source of the SPI clock
+ - description: register (APB) clock
+
+ clock-names:
+ items:
+ - const: wclk
+ - const: pclk
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+ spi@94406000 {
+ compatible = "zte,zx279128s-spifc";
+ reg = <0x94406000 0x1000>;
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_SPI_WCLK>,
+ <&lsp0crpm ZX279128S_LSP0_SPI_PCLK>;
+ clock-names = "wclk", "pclk";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ flash@0 {
+ compatible = "spi-nand";
+ reg = <0>;
+ spi-max-frequency = <50000000>;
+ spi-rx-bus-width = <2>;
+ };
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding
2026-10-14 7:20 ` [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding Navid Ghahremani
@ 2026-10-14 20:33 ` Stefan Dösinger
2026-10-15 9:35 ` Krzysztof Kozlowski
2026-10-15 9:36 ` Krzysztof Kozlowski
2 siblings, 0 replies; 28+ messages in thread
From: Stefan Dösinger @ 2026-10-14 20:33 UTC (permalink / raw)
To: linux-arm-kernel, Navid Ghahremani
Cc: arnd, krzk, Navid Ghahremani, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-spi, devicetree,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1494 bytes --]
Am Mittwoch, 14. Oktober 2026, 09:20:59 Mitteleuropäische Sommerzeit schrieb
Navid Ghahremani:
> + - zte,zx29-qspi
> + - zte,zx279128s-spifc
Unless there is a hardware difference that matters to the driver I think one
compatible should be enough. Probably zte,zx-qspi. Although since this
controller is very specific for flash chips zte,zx-spifc or zte,spifc are worthy
considerations too. As far as I can see this controller only has flash memory
ops and can't even send a generic byte stream.
Note that at least my board, and probably yours too, has a "normal" SPI
controller too. In my case it can talk to SPI displays or a SLIC analog phone
controller. It has a different hardware interface and needs a separate driver.
> +
> + clocks:
> + items:
> + - description: work clock, the source of the SPI clock
> + - description: register (APB) clock
> +
> + clock-names:
> + items:
> + - const: wclk
> + - const: pclk
> +
> +required:
> + - compatible
> + - reg
> + - clocks
> + - clock-names
I think the interrupt should be required by the binding too. The driver is
still free to ignore it, but the binding is supposed to describe the hardware,
not the driver.
My hardware has two DMA lines too. I don't know if they are always there. For
pragmatic reasons (the DMA controller is its own beast and for usability less
important than the flash controller) I'd make the DMA properties optional.
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 870 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding
2026-10-14 7:20 ` [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding Navid Ghahremani
2026-10-14 20:33 ` Stefan Dösinger
@ 2026-10-15 9:35 ` Krzysztof Kozlowski
2026-10-15 9:36 ` Krzysztof Kozlowski
2 siblings, 0 replies; 28+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-15 9:35 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-spi, devicetree,
linux-kernel
On Wed, Oct 14, 2026 at 08:20:59AM +0100, Navid Ghahremani wrote:
> +allOf:
> + - $ref: spi-controller.yaml#
> +
> +properties:
> + compatible:
> + enum:
> + - zte,zx29-qspi
> + - zte,zx279128s-spifc
> +
> + reg:
> + maxItems: 1
> +
> + interrupts:
> + maxItems: 1
> +
> + clocks:
> + items:
> + - description: work clock, the source of the SPI clock
> + - description: register (APB) clock
> +
> + clock-names:
> + items:
> + - const: wclk
> + - const: pclk
Where are all other properties your driver is using? DMAs? Resets and
whatnot?
Did you actually test your DTS against bindings?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding
2026-10-14 7:20 ` [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding Navid Ghahremani
2026-10-14 20:33 ` Stefan Dösinger
2026-10-15 9:35 ` Krzysztof Kozlowski
@ 2026-10-15 9:36 ` Krzysztof Kozlowski
2 siblings, 0 replies; 28+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-15 9:36 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-spi, devicetree,
linux-kernel
On Wed, Oct 14, 2026 at 08:20:59AM +0100, Navid Ghahremani wrote:
> Add Device Tree binding for the ZTE ZX family SPI flash controller,
> supporting both ZX29 and ZX279128S SoCs.
>
> Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
> ---
half of your patches carry redundant binding, half not...
A nit, subject: drop second/last, redundant "bindings". The
"dt-bindings" prefix is already stating that these are bindings.
See also:
https://elixir.bootlin.com/linux/v7.1-rc7/source/Documentation/devicetree/bindings/submitting-patches.rst#L23
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 21/24] dt-bindings: usb: Add ZTE ZX279128S DWC3 controller
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (9 preceding siblings ...)
2026-10-14 7:20 ` [PATCH v2 19/24] dt-bindings: spi: Add ZTE ZX family SPI flash controller binding Navid Ghahremani
@ 2026-10-14 7:21 ` Navid Ghahremani
2026-10-15 7:24 ` sashiko-bot
2026-10-14 7:21 ` [PATCH v2 23/24] ARM: dts: zte: Add ZX279128S SoC description Navid Ghahremani
2026-10-14 7:21 ` [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board Navid Ghahremani
12 siblings, 1 reply; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:21 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Greg Kroah-Hartman,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-usb,
devicetree, linux-kernel
Describe the USB host integration with three CRM clocks and four reset
bits.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
.../bindings/usb/zte,zx279128s-dwc3.yaml | 76 +++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml
diff --git a/Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml b/Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml
new file mode 100644
index 0000000000..2fd9fe0cc7
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml
@@ -0,0 +1,76 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/usb/zte,zx279128s-dwc3.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ZTE zx279128s DWC3 USB controller
+
+maintainers:
+ - Navid Ghahremani <ghahramani.navid@gmail.com>
+
+description:
+ The ZTE zx279128s has a DesignWare USB3 controller (DWC_usb3 2.80a) with
+ integrated USB 2.0 and USB 3.0 PHYs, used as a host. Its clocks and resets
+ come from the top clock and reset module.
+
+allOf:
+ - $ref: snps,dwc3-common.yaml#
+
+properties:
+ compatible:
+ const: zte,zx279128s-dwc3
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: 20 MHz reference clock
+ - description: bus (AXI) clock
+ - description: 32.768 kHz suspend clock
+
+ clock-names:
+ items:
+ - const: ref
+ - const: bus_early
+ - const: suspend
+
+ resets:
+ description: The four reset bits of the controller and its PHYs, in the
+ order they are released.
+ minItems: 4
+ maxItems: 4
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - clocks
+ - clock-names
+ - resets
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/zte,zx279128s-crm.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+ usb@9100000 {
+ compatible = "zte,zx279128s-dwc3";
+ reg = <0x09100000 0x100000>;
+ interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&topcrm ZX279128S_TOP_USB_REF>,
+ <&topcrm ZX279128S_TOP_USB_ACLK>,
+ <&topcrm ZX279128S_TOP_USB_SUSPEND>;
+ clock-names = "ref", "bus_early", "suspend";
+ resets = <&topcrm ZX279128S_TOP_RST_USB_B11>,
+ <&topcrm ZX279128S_TOP_RST_USB_B14>,
+ <&topcrm ZX279128S_TOP_RST_USB_B9>,
+ <&topcrm ZX279128S_TOP_RST_USB_B10>;
+ dr_mode = "host";
+ };
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 21/24] dt-bindings: usb: Add ZTE ZX279128S DWC3 controller
2026-10-14 7:21 ` [PATCH v2 21/24] dt-bindings: usb: Add ZTE ZX279128S DWC3 controller Navid Ghahremani
@ 2026-10-15 7:24 ` sashiko-bot
0 siblings, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-15 7:24 UTC (permalink / raw)
To: Navid Ghahremani; +Cc: linux-usb, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] dt-bindings: usb: missing reset header and incorrect macros in example
--
commit 4b49967364799b06d338b499b3fff468b97de327
Author: Navid Ghahremani <ghahramani.navid@gmail.com>
dt-bindings: usb: Add ZTE ZX279128S DWC3 controller
Describe the USB host integration with three CRM clocks and four reset
bits.
> diff --git a/Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml b/Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml
> new file mode 100644
> index 0000000000000..2fd9fe0cc74bd
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/zte,zx279128s-dwc3.yaml
[ ... ]
> +examples:
> + - |
> + #include <dt-bindings/clock/zte,zx279128s-crm.h>
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> + usb@9100000 {
> + compatible = "zte,zx279128s-dwc3";
> + reg = <0x09100000 0x100000>;
> + interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
> + clocks = <&topcrm ZX279128S_TOP_USB_REF>,
> + <&topcrm ZX279128S_TOP_USB_ACLK>,
> + <&topcrm ZX279128S_TOP_USB_SUSPEND>;
> + clock-names = "ref", "bus_early", "suspend";
> + resets = <&topcrm ZX279128S_TOP_RST_USB_B11>,
> + <&topcrm ZX279128S_TOP_RST_USB_B14>,
> + <&topcrm ZX279128S_TOP_RST_USB_B9>,
> + <&topcrm ZX279128S_TOP_RST_USB_B10>;
[Severity: Low]
Will this example pass make dt_binding_check?
The example is missing an include for <dt-bindings/reset/zte,zx279128s-reset.h>.
Additionally, the macros used here (e.g., ZX279128S_TOP_RST_USB_B11) appear
to be misspelled. The actual macros defined in the reset header are prefixed
with ZX279128S_RESET_ (e.g., ZX279128S_RESET_USB_B11).
This discrepancy will result in a build failure when validating the schema.
> + dr_mode = "host";
> + };
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014072109.1759502-1-ghahramani.navid@gmail.com?part=21
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 23/24] ARM: dts: zte: Add ZX279128S SoC description
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (10 preceding siblings ...)
2026-10-14 7:21 ` [PATCH v2 21/24] dt-bindings: usb: Add ZTE ZX279128S DWC3 controller Navid Ghahremani
@ 2026-10-14 7:21 ` Navid Ghahremani
2026-10-14 7:21 ` [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board Navid Ghahremani
12 siblings, 0 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:21 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, devicetree, linux-kernel
Add the base device tree for the dual Cortex-A9 ZTE ZX279128S SoC,
including GIC, arch timer, CRM clock and reset controllers, GPIO,
pin control, Ethernet switch, MDIO, PCIe PHYs and controllers, SPI,
and DWC3 USB.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
arch/arm/boot/dts/zte/zx279128s.dtsi | 416 +++++++++++++++++++++++++++
1 file changed, 416 insertions(+)
create mode 100644 arch/arm/boot/dts/zte/zx279128s.dtsi
diff --git a/arch/arm/boot/dts/zte/zx279128s.dtsi b/arch/arm/boot/dts/zte/zx279128s.dtsi
new file mode 100644
index 0000000000..8896a8b067
--- /dev/null
+++ b/arch/arm/boot/dts/zte/zx279128s.dtsi
@@ -0,0 +1,416 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/*
+ * ZTE zx279128s SoC: dual Cortex-A9 with an L2C-310 cache controller, a
+ * five-port gigabit switch, two PCIe controllers and a SPI NAND controller.
+ *
+ * Copyright (C) 2026 Navid Ghahremani <ghahramani.navid@gmail.com>
+ */
+
+#include <dt-bindings/clock/zte,zx279128s-crm.h>
+#include <dt-bindings/reset/zte,zx279128s-reset.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "zte,zx279128s";
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ enable-method = "zte,zx279128s-smp";
+
+ cpu@0 {
+ compatible = "arm,cortex-a9";
+ device_type = "cpu";
+ next-level-cache = <&l2cc>;
+ reg = <0>;
+ };
+
+ cpu@1 {
+ compatible = "arm,cortex-a9";
+ device_type = "cpu";
+ next-level-cache = <&l2cc>;
+ reg = <1>;
+ };
+ };
+
+ osc: clock-25000000 {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <25000000>;
+ };
+
+
+ soc {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "simple-bus";
+ interrupt-parent = <&gic>;
+ ranges;
+
+ sram@200800 {
+ compatible = "mmio-sram";
+ reg = <0x00200800 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0x00200800 0x1000>;
+
+ /* the parked second core jumps here on every wake-up */
+ smp-sram@0 {
+ compatible = "zte,zx279128s-smp-sram";
+ reg = <0x0 0x8>;
+ };
+ };
+
+ scu@800000 {
+ compatible = "arm,cortex-a9-scu";
+ reg = <0x00800000 0x100>;
+ };
+
+ timer@800200 {
+ compatible = "arm,cortex-a9-global-timer";
+ reg = <0x00800200 0x20>;
+ interrupts = <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_EDGE_RISING)>;
+ clocks = <&topcrm ZX279128S_TOP_A9_PERIPH>;
+ };
+
+ timer@800600 {
+ compatible = "arm,cortex-a9-twd-timer";
+ reg = <0x00800600 0x20>;
+ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_EDGE_RISING)>;
+ clocks = <&topcrm ZX279128S_TOP_A9_PERIPH>;
+ };
+
+ watchdog@800620 {
+ compatible = "arm,cortex-a9-twd-wdt";
+ reg = <0x00800620 0x20>;
+ interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_EDGE_RISING)>;
+ clocks = <&topcrm ZX279128S_TOP_A9_PERIPH>;
+ status = "disabled";
+ };
+
+ gic: interrupt-controller@801000 {
+ compatible = "arm,cortex-a9-gic";
+ #address-cells = <0>;
+ #interrupt-cells = <3>;
+ interrupt-controller;
+ reg = <0x00801000 0x1000>,
+ <0x00800100 0x0100>;
+ };
+
+ l2cc: cache-controller@c00000 {
+ compatible = "arm,pl310-cache";
+ reg = <0x00c00000 0x1000>;
+ cache-unified;
+ cache-level = <2>;
+ arm,data-latency = <2 2 2>;
+ arm,tag-latency = <2 2 2>;
+ /*
+ * As the stock firmware (AUX_CTRL 0x76430001). Without
+ * shared-override the PL310 turns normal non-cacheable
+ * shared accesses (dma_alloc_coherent buffers) into
+ * cacheable ones, so devices and CPUs see stale data.
+ */
+ arm,shared-override;
+ prefetch-data = <1>;
+ prefetch-instr = <1>;
+ arm,double-linefill = <1>;
+ arm,double-linefill-incr = <0>;
+ };
+
+ usb: usb@9100000 {
+ compatible = "zte,zx279128s-dwc3";
+ reg = <0x09100000 0x100000>;
+ interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&topcrm ZX279128S_TOP_USB_REF>,
+ <&topcrm ZX279128S_TOP_USB_ACLK>,
+ <&topcrm ZX279128S_TOP_USB_SUSPEND>;
+ clock-names = "ref", "bus_early", "suspend";
+ /* in the order the vendor firmware releases them */
+ resets = <&topcrm ZX279128S_RESET_USB_B11>,
+ <&topcrm ZX279128S_RESET_USB_B14>,
+ <&topcrm ZX279128S_RESET_USB_B9>,
+ <&topcrm ZX279128S_RESET_USB_B10>;
+ dr_mode = "host";
+ status = "disabled";
+ };
+
+ pcie0: pcie@f000000 {
+ compatible = "zte,zx279128s-pcie";
+ reg = <0x0f000000 0x4000>,
+ <0x09500000 0x1000>,
+ <0x1c000000 0x200000>;
+ reg-names = "dbi", "ctrl", "config";
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ bus-range = <0x00 0xff>;
+ ranges = <0x82000000 0 0x10000000 0x10000000 0 0x08000000>;
+ dma-ranges = <0x43000000 0 0x40000000 0x40000000 0 0x20000000>;
+ interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0 0 0 7>;
+ interrupt-map = <0 0 0 1 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 2 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 3 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 4 &gic GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+ linux,pci-domain = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pcie0_pins>;
+ clocks = <&crm2 ZX279128S_CRM2_PCIE0_CLK>;
+ clock-names = "pcie";
+ resets = <&crm2 ZX279128S_CRM2_RESET_PCIE0>;
+ reset-names = "core";
+ phys = <&pcie0_phy>;
+ phy-names = "pcie";
+ status = "disabled";
+ };
+
+ pcie1: pcie@f100000 {
+ compatible = "zte,zx279128s-pcie";
+ reg = <0x0f100000 0x4000>,
+ <0x09600000 0x1000>,
+ <0x2c000000 0x200000>;
+ reg-names = "dbi", "ctrl", "config";
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ bus-range = <0x00 0xff>;
+ ranges = <0x82000000 0 0x20000000 0x20000000 0 0x08000000>;
+ dma-ranges = <0x43000000 0 0x40000000 0x40000000 0 0x20000000>;
+ interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0 0 0 7>;
+ interrupt-map = <0 0 0 1 &gic GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 2 &gic GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 3 &gic GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 4 &gic GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+ linux,pci-domain = <1>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pcie1_pins>;
+ clocks = <&crm2 ZX279128S_CRM2_PCIE1_CLK>;
+ clock-names = "pcie";
+ resets = <&crm2 ZX279128S_CRM2_RESET_PCIE1>;
+ reset-names = "core";
+ phys = <&pcie1_phy>;
+ phy-names = "pcie";
+ status = "disabled";
+ };
+
+ gmac: ethernet@92000000 {
+ compatible = "zte,zx279128s-gmac";
+ reg = <0x92000000 0x400000>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+
+ ethernet-ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ gmac_port0: port@0 {
+ reg = <0>;
+ status = "disabled";
+ };
+
+ gmac_port1: port@1 {
+ reg = <1>;
+ status = "disabled";
+ };
+
+ gmac_port2: port@2 {
+ reg = <2>;
+ status = "disabled";
+ };
+
+ gmac_port3: port@3 {
+ reg = <3>;
+ status = "disabled";
+ };
+
+ gmac_port4: port@4 {
+ reg = <4>;
+ status = "disabled";
+ };
+ };
+ };
+
+ topcrm: clock-controller@94000000 {
+ compatible = "zte,zx279128s-topcrm", "syscon", "simple-mfd";
+ reg = <0x94000000 0x1000>;
+ clocks = <&osc>;
+ clock-names = "osc";
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ reboot {
+ compatible = "syscon-reboot";
+ offset = <0x44>;
+ mask = <0x1>;
+ value = <0x1>;
+ };
+
+ pcie0_phy: phy@0 {
+ compatible = "zte,zx279128s-pcie-phy";
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+
+ pcie1_phy: phy@1 {
+ compatible = "zte,zx279128s-pcie-phy";
+ reg = <1>;
+ #phy-cells = <0>;
+ };
+ };
+
+ crm2: clock-controller@94100000 {
+ compatible = "zte,zx279128s-crm2", "syscon";
+ reg = <0x94100000 0x1000>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ };
+
+ /*
+ * The pin mux. What most of its bits select isn't known, so each
+ * bit is a pin of its own.
+ */
+ pinmux: pinctrl@94200000 {
+ compatible = "zte,zx279128s-pinmux", "pinctrl-single";
+ reg = <0x94200000 0x10>;
+ #pinctrl-cells = <2>;
+ pinctrl-single,bit-per-mux;
+ pinctrl-single,register-width = <32>;
+ pinctrl-single,function-mask = <0x1>;
+
+ /* the interface to an external Ethernet PHY */
+ ext_phy_pins: ext-phy-pins {
+ pinctrl-single,bits = <0x0c 0x0 0x00180800>;
+ };
+
+ pcie0_pins: pcie0-pins {
+ pinctrl-single,bits = <0x0c 0x0 0x00004000>;
+ };
+
+ pcie1_pins: pcie1-pins {
+ pinctrl-single,bits = <0x0c 0x0 0x00000002>;
+ };
+ };
+
+ lsp0crpm: clock-controller@94400000 {
+ compatible = "zte,zx279128s-lsp0crpm";
+ reg = <0x94400000 0x1000>;
+ clocks = <&topcrm ZX279128S_TOP_LSP0_PCLK>,
+ <&topcrm ZX279128S_TOP_LSP0_25M>,
+ <&topcrm ZX279128S_TOP_LSP0_32K>,
+ <&topcrm ZX279128S_TOP_LSP0_100M>;
+ clock-names = "pclk", "wclk25m", "wclk32k", "wclk100m";
+ #clock-cells = <1>;
+ };
+
+ serial0: serial@94404000 {
+ compatible = "arm,pl011", "arm,primecell";
+ arm,primecell-periphid = <0x0018c011>;
+ reg = <0x94404000 0x1000>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_UART0_WCLK>,
+ <&lsp0crpm ZX279128S_LSP0_UART0_PCLK>;
+ clock-names = "uartclk", "apb_pclk";
+ status = "disabled";
+ };
+
+ serial1: serial@94405000 {
+ compatible = "arm,pl011", "arm,primecell";
+ arm,primecell-periphid = <0x0018c011>;
+ reg = <0x94405000 0x1000>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_UART1_WCLK>,
+ <&lsp0crpm ZX279128S_LSP0_UART1_PCLK>;
+ clock-names = "uartclk", "apb_pclk";
+ status = "disabled";
+ };
+
+ spifc: spi@94406000 {
+ compatible = "zte,zx279128s-spifc";
+ reg = <0x94406000 0x1000>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_SPI_WCLK>,
+ <&lsp0crpm ZX279128S_LSP0_SPI_PCLK>;
+ clock-names = "wclk", "pclk";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ gpio0: gpio@94407000 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x94407000 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gpio1: gpio@94407040 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x94407040 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gpio2: gpio@94407080 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x94407080 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gpio3: gpio@944070c0 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x944070c0 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gpio4: gpio@94407100 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x94407100 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gpio5: gpio@94407140 {
+ compatible = "zte,zx279128s-gpio";
+ reg = <0x94407140 0x40>;
+ clocks = <&lsp0crpm ZX279128S_LSP0_GPIO_PCLK>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ lsp1crpm: clock-controller@9a100000 {
+ compatible = "zte,zx279128s-lsp1crpm";
+ reg = <0x9a100000 0x1000>;
+ clocks = <&topcrm ZX279128S_TOP_LSP1_PCLK>,
+ <&topcrm ZX279128S_TOP_LSP1_ACLK>,
+ <&topcrm ZX279128S_TOP_LSP1_25M>,
+ <&topcrm ZX279128S_TOP_LSP1_49M>,
+ <&topcrm ZX279128S_TOP_LSP1_100M>;
+ clock-names = "pclk", "aclk", "wclk25m", "wclk49m", "wclk100m";
+ #clock-cells = <1>;
+ };
+
+ mdio: mdio@9a101000 {
+ compatible = "zte,zx279128s-mdio";
+ reg = <0x9a101000 0x18>;
+ clocks = <&lsp1crpm ZX279128S_LSP1_MDIO_WCLK>,
+ <&lsp1crpm ZX279128S_LSP1_MDIO_PCLK>;
+ clock-names = "wclk", "pclk";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+ };
+};
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board
[not found] <20261014072109.1759502-1-ghahramani.navid@gmail.com>
` (11 preceding siblings ...)
2026-10-14 7:21 ` [PATCH v2 23/24] ARM: dts: zte: Add ZX279128S SoC description Navid Ghahremani
@ 2026-10-14 7:21 ` Navid Ghahremani
2026-10-14 12:52 ` Andrew Lunn
2026-10-15 7:24 ` sashiko-bot
12 siblings, 2 replies; 28+ messages in thread
From: Navid Ghahremani @ 2026-10-14 7:21 UTC (permalink / raw)
To: linux-arm-kernel
Cc: arnd, stefandoesinger, krzk, Navid Ghahremani, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, devicetree, linux-kernel
Add the device tree for the ZTE ZXHN H3600 Wi-Fi 6 home gateway router.
Configure the internal Gigabit switch ports, external Sanechips ZX5201
WAN PHY, SPI NAND flash on the SPI controller, LEDs, buttons, and
MediaTek MT7915 Wi-Fi cards on PCIe ports 0 and 1.
Signed-off-by: Navid Ghahremani <ghahramani.navid@gmail.com>
---
arch/arm/boot/dts/zte/Makefile | 2 +
.../boot/dts/zte/zx279128s-zte-zxhn-h3600.dts | 364 ++++++++++++++++++
2 files changed, 366 insertions(+)
create mode 100644 arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts
diff --git a/arch/arm/boot/dts/zte/Makefile b/arch/arm/boot/dts/zte/Makefile
index f052cfbd63..29cc864459 100644
--- a/arch/arm/boot/dts/zte/Makefile
+++ b/arch/arm/boot/dts/zte/Makefile
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only
dtb-$(CONFIG_SOC_ZX297520V3) += \
zx297520v3-dlink-dwr932m.dtb
+
+dtb-$(CONFIG_SOC_ZX279128S) += zx279128s-zte-zxhn-h3600.dtb
diff --git a/arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts b/arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts
new file mode 100644
index 0000000000..d46390f075
--- /dev/null
+++ b/arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts
@@ -0,0 +1,364 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/*
+ * ZTE ZXHN H3600 (also sold as ZXHN H1600): home gateway with four LAN ports,
+ * a WAN port and an MT7915 Wi-Fi 6 chip on both PCIe controllers.
+ *
+ * Copyright (C) 2026 Navid Ghahremani <ghahramani.navid@gmail.com>
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+#include "zx279128s.dtsi"
+
+/ {
+ model = "ZTE ZXHN H3600";
+ compatible = "zte,zxhn-h3600", "zte,zx279128s";
+
+ aliases {
+ serial0 = &serial0;
+ serial1 = &serial1;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ memory@40000000 {
+ device_type = "memory";
+ reg = <0x40000000 0x20000000>;
+ };
+
+ reserved-memory {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ /*
+ * The stock kernel reserves the top 38 MiB for the packet
+ * processor. Keep Linux, and in particular DMA buffers, out.
+ */
+ pp@5da00000 {
+ reg = <0x5da00000 0x2600000>;
+ no-map;
+ };
+ };
+
+ /* All LEDs are active low. Colours only where seen on the panel. */
+ leds {
+ compatible = "gpio-leds";
+
+ /* One power LED with two elements: both on shows orange */
+ led_power_red: led-power-red {
+ color = <LED_COLOR_ID_RED>;
+ function = LED_FUNCTION_POWER;
+ gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
+ default-state = "on";
+ };
+
+ led_power_green: led-power-green {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_POWER;
+ gpios = <&gpio2 7 GPIO_ACTIVE_LOW>;
+ };
+
+ led_wlan_2g: led-wlan-2g {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WLAN_2GHZ;
+ gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
+ };
+
+ led_broadband: led-broadband {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WAN;
+ gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
+ };
+
+ led_phone1: led-phone1 {
+ color = <LED_COLOR_ID_GREEN>;
+ function = "phone";
+ function-enumerator = <1>;
+ gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
+ };
+
+ led_phone2: led-phone2 {
+ color = <LED_COLOR_ID_GREEN>;
+ function = "phone";
+ function-enumerator = <2>;
+ gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
+ };
+
+ led_wlan_5g: led-wlan-5g {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WLAN_5GHZ;
+ gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
+ };
+
+ led_usb: led-usb {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_USB;
+ gpios = <&gpio2 9 GPIO_ACTIVE_LOW>;
+ };
+
+ led_internet_red: led-internet-red {
+ color = <LED_COLOR_ID_RED>;
+ function = LED_FUNCTION_WAN_ONLINE;
+ gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
+ };
+
+ led_internet_green: led-internet-green {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WAN_ONLINE;
+ gpios = <&gpio3 1 GPIO_ACTIVE_LOW>;
+ };
+
+ led_wps: led-wps {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WPS;
+ gpios = <&gpio3 2 GPIO_ACTIVE_LOW>;
+ };
+ };
+
+ /* Polled: the GPIO driver does not support interrupts */
+ keys {
+ compatible = "gpio-keys-polled";
+ poll-interval = <50>;
+
+ key-reset {
+ label = "reset";
+ gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_RESTART>;
+ debounce-interval = <60>;
+ };
+
+ key-wps {
+ label = "wps";
+ gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_WPS_BUTTON>;
+ debounce-interval = <60>;
+ };
+
+ key-wifi {
+ label = "rfkill";
+ gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_RFKILL>;
+ debounce-interval = <60>;
+ };
+
+ key-led {
+ label = "led";
+ gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_LIGHTS_TOGGLE>;
+ debounce-interval = <60>;
+ };
+ };
+};
+
+&gmac {
+ status = "okay";
+};
+
+&gmac_port0 {
+ label = "lan1";
+ phy-handle = <&phy10>;
+ phy-mode = "internal";
+ nvmem-cells = <&macaddr_tag_1e 0>;
+ nvmem-cell-names = "mac-address";
+ status = "okay";
+};
+
+&gmac_port1 {
+ label = "lan2";
+ phy-handle = <&phy11>;
+ phy-mode = "internal";
+ nvmem-cells = <&macaddr_tag_1e 0>;
+ nvmem-cell-names = "mac-address";
+ status = "okay";
+};
+
+&gmac_port2 {
+ label = "lan3";
+ phy-handle = <&phy12>;
+ phy-mode = "internal";
+ nvmem-cells = <&macaddr_tag_1e 0>;
+ nvmem-cell-names = "mac-address";
+ status = "okay";
+};
+
+&gmac_port3 {
+ label = "lan4";
+ phy-handle = <&phy13>;
+ phy-mode = "internal";
+ nvmem-cells = <&macaddr_tag_1e 0>;
+ nvmem-cell-names = "mac-address";
+ status = "okay";
+};
+
+&gmac_port4 {
+ label = "wan";
+ phy-handle = <&phy8>;
+ phy-mode = "gmii";
+ nvmem-cells = <&macaddr_tag_1e 1>;
+ nvmem-cell-names = "mac-address";
+ status = "okay";
+};
+
+&mdio {
+ /* the ZX5201 WAN PHY */
+ pinctrl-names = "default";
+ pinctrl-0 = <&ext_phy_pins>;
+ status = "okay";
+
+ /* external Sanechips ZX5201; its SerDes answers on address 9 */
+ phy8: ethernet-phy@8 {
+ reg = <8>;
+ };
+
+ phy10: ethernet-phy@a {
+ reg = <10>;
+ };
+
+ phy11: ethernet-phy@b {
+ reg = <11>;
+ };
+
+ phy12: ethernet-phy@c {
+ reg = <12>;
+ };
+
+ phy13: ethernet-phy@d {
+ reg = <13>;
+ };
+};
+
+/* MT7915: main interface on pcie0, second interface (HIF2) on pcie1 */
+/*
+ * The two lines reset the whole MT7915, which is behind both controllers.
+ * Whichever controller starts first releases it.
+ */
+&pcie0 {
+ reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
+ enable-gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&pcie1 {
+ reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
+ enable-gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&serial0 {
+ status = "okay";
+};
+
+&usb {
+ status = "okay";
+};
+
+&serial1 {
+ status = "okay";
+};
+
+&spifc {
+ status = "okay";
+
+ flash@0 {
+ compatible = "spi-nand";
+ reg = <0>;
+ spi-max-frequency = <50000000>;
+ spi-rx-bus-width = <2>;
+ spi-tx-bus-width = <1>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "bootloader";
+ reg = <0x0000000 0x0100000>;
+ read-only;
+ };
+
+ partition@100000 {
+ label = "tag";
+ reg = <0x0100000 0x0100000>;
+ read-only;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ /* the LAN ports' MAC; the WAN port uses the next one */
+ macaddr_tag_1e: macaddr@1e {
+ compatible = "mac-base";
+ reg = <0x1e 0x6>;
+ #nvmem-cell-cells = <1>;
+ };
+ };
+ };
+
+ partition@200000 {
+ label = "wifi";
+ reg = <0x0200000 0x0100000>;
+ read-only;
+ };
+
+ partition@300000 {
+ label = "usercfg";
+ reg = <0x0300000 0x0200000>;
+ read-only;
+ };
+
+ partition@500000 {
+ label = "defcfg";
+ reg = <0x0500000 0x0200000>;
+ read-only;
+ };
+
+ /*
+ * Slot 0 of the boot loader, up to its slot 1 at
+ * 0x2700000: it reads the kernel from the start, stepping
+ * over bad blocks, and finds the slot header, which
+ * holds the kernel's length and CRC. A rootfs length of 0
+ * makes it check nothing else.
+ */
+ partition@700000 {
+ label = "kernel";
+ reg = <0x0700000 0x0400000>;
+ };
+
+ partition@b00000 {
+ /* Erase old rootfs/UBI headers during migration. */
+ label = "slot0_gap";
+ reg = <0x0b00000 0x1b00000>;
+ };
+
+ partition@2600000 {
+ label = "trailer";
+ reg = <0x2600000 0x0100000>;
+ };
+
+ partition@2700000 {
+ label = "stock";
+ reg = <0x2700000 0x2000000>;
+ read-only;
+ };
+
+ /*
+ * Keep slot 1 (0x2700000..0x4700000) intact. cspboot
+ * mistakes UBI erase-counter headers for boot headers;
+ * its scan must find both firmware headers before UBI.
+ */
+ partition@4700000 {
+ label = "ubi";
+ reg = <0x4700000 0x3900000>;
+ };
+ };
+ };
+};
--
2.55.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board
2026-10-14 7:21 ` [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board Navid Ghahremani
@ 2026-10-14 12:52 ` Andrew Lunn
2026-10-15 7:24 ` sashiko-bot
1 sibling, 0 replies; 28+ messages in thread
From: Andrew Lunn @ 2026-10-14 12:52 UTC (permalink / raw)
To: Navid Ghahremani
Cc: linux-arm-kernel, arnd, stefandoesinger, krzk, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, devicetree, linux-kernel
> +&gmac_port4 {
> + label = "wan";
> + phy-handle = <&phy8>;
> + phy-mode = "gmii";
> + nvmem-cells = <&macaddr_tag_1e 1>;
> + nvmem-cell-names = "mac-address";
> + status = "okay";
> +};
> +
> +&mdio {
> + /* the ZX5201 WAN PHY */
> + pinctrl-names = "default";
> + pinctrl-0 = <&ext_phy_pins>;
> + status = "okay";
> +
> + /* external Sanechips ZX5201; its SerDes answers on address 9 */
> + phy8: ethernet-phy@8 {
> + reg = <8>;
> + };
You have phy-mode == gmii. Such a PHY does not need a SERDES. We need
a better understanding of what is actually used here.
Andrew
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board
2026-10-14 7:21 ` [PATCH v2 24/24] ARM: dts: zte: Add ZTE ZXHN H3600 board Navid Ghahremani
2026-10-14 12:52 ` Andrew Lunn
@ 2026-10-15 7:24 ` sashiko-bot
1 sibling, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-15 7:24 UTC (permalink / raw)
To: Navid Ghahremani; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] nvmem: missing mac-base layout handler causes MAC collisions
--
commit c6cd707e15e55e65e91c2a8c00f74a09830fe8da
Author: Navid Ghahremani <ghahramani.navid@gmail.com>
ARM: dts: zte: Add ZTE ZXHN H3600 board
Add the device tree for the ZTE ZXHN H3600 Wi-Fi 6 home gateway router.
Configure the internal Gigabit switch ports, external Sanechips ZX5201
WAN PHY, SPI NAND flash on the SPI controller, LEDs, buttons, and
MediaTek MT7915 Wi-Fi cards on PCIe ports 0 and 1.
> diff --git a/arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts b/arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts
> new file mode 100644
> index 0000000000000..d46390f0754cb
> --- /dev/null
> +++ b/arch/arm/boot/dts/zte/zx279128s-zte-zxhn-h3600.dts
[ ... ]
> +&gmac_port0 {
> + label = "lan1";
> + phy-handle = <&phy10>;
> + phy-mode = "internal";
> + nvmem-cells = <&macaddr_tag_1e 0>;
> + nvmem-cell-names = "mac-address";
> + status = "okay";
> +};
[ ... ]
> +&gmac_port4 {
> + label = "wan";
> + phy-handle = <&phy8>;
> + phy-mode = "gmii";
> + nvmem-cells = <&macaddr_tag_1e 1>;
> + nvmem-cell-names = "mac-address";
> + status = "okay";
> +};
[ ... ]
> + partition@100000 {
> + label = "tag";
> + reg = <0x0100000 0x0100000>;
> + read-only;
> +
> + nvmem-layout {
> + compatible = "fixed-layout";
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + /* the LAN ports' MAC; the WAN port uses the next one */
> + macaddr_tag_1e: macaddr@1e {
> + compatible = "mac-base";
> + reg = <0x1e 0x6>;
> + #nvmem-cell-cells = <1>;
> + };
[Severity: High]
Will the WAN and LAN interfaces end up with the exact same MAC address here?
Since the kernel currently lacks an NVMEM layout driver that binds to the
"mac-base" compatible string, there appears to be no read_post_process hook
to handle the NVMEM cell index offset.
When of_nvmem_cell_get() parses these entries during device probe,
__nvmem_cell_read() will fall back to simply reading 6 bytes at offset 0x1e
for both ports, completely ignoring the cell index of 0 for LAN and 1 for WAN.
Could this lead to L2 network collisions and broken routing on this board?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014072109.1759502-1-ghahramani.navid@gmail.com?part=24
^ permalink raw reply [flat|nested] 28+ messages in thread