Skip to contentSkip to conversation

Introduce Nuvoton Arbel NPCM8XX BMC SoC

PATCH Superseded Tomer Maimon 4 participants 32 messages Jun 19, 2022 – Jun 21, 2022

Subsystems (9)

v3 of 28 Superseded Latest is v28 →

lore
Share & tools
lore

Tomer Maimon

author maintainer
#0 lore raw

v3 cover Introduce Nuvoton Arbel NPCM8XX BMC SoC

This patchset adds initial support for the Nuvoton Arbel NPCM8XX Board Management controller (BMC) SoC family.

The Nuvoton Arbel NPCM8XX SoC is a fourth-generation BMC. The NPCM8XX computing subsystem comprises a quadcore ARM Cortex A35 ARM-V8 architecture.

This patchset adds minimal architecture and drivers such as:
Clocksource, Clock, Reset, and WD.

Some of the Arbel NPCM8XX peripherals are based on Poleg NPCM7XX.

This patchset was tested on the Arbel NPCM8XX evaluation board.

Addressed comments from:
- Arnd Bergmann : https://www.spinics.net/lists/arm-kernel/msg986516.html

		   https://www.spinics.net/lists/arm-kernel/msg986540.html
 - Stephen Boyd: https://www.spinics.net/lists/devicetree/msg507280.html
 - Krzysztof Kozlowski: https://www.spinics.net/lists/kernel/msg4389776.html
			https://www.spinics.net/lists/arm-kernel/msg986462.html
			https://www.spinics.net/lists/linux-clk/msg71589.html
			https://www.spinics.net/lists/arm-kernel/msg987286.html
			https://www.spinics.net/lists/arm-kernel/msg987099.html
			https://www.spinics.net/lists/kernel/msg4389821.html

- Rob Herring : https://www.spinics.net/lists/arm-kernel/msg986655.html

Changes since version 2:
- Remove NPCM8xx WDT compatible patch.
- Remove NPCM8xx UART compatible patch.
- NPCM8XX clock driver
- Add debug new line.
- Add 25M fixed rate clock.
- Remove unused clocks and clock name from dt-binding.
- NPCM reset driver
- Revert to npcm7xx dt-binding.
- Skip dt binding quotes.
- Adding DTS backward compatibility.
- Remove NPCM8xx binding include file.
- Warp commit message.
- NPCM8XX device tree:
- Remove unused clock nodes (used in the clock driver)
- Modify gcr and rst node names.

Changes since version 1:
- NPCM8XX clock driver
- Modify dt-binding.
- Remove unsed definition and include.
- Include alphabetically.
- Use clock devm.
- NPCM reset driver
- Modify dt-binding.
- Modify syscon name.
- Add syscon support to NPCM7XX dts reset node.
- use data structure.
- NPCM8XX device tree:
- Modify evb compatible name.
- Add NPCM7xx compatible.
- Remove disable nodes from the EVB DTS.

Tomer Maimon (18):
dt-bindings: timer: npcm: Add npcm845 compatible string
clocksource: timer-npcm7xx: Add NPCM845 timer support
dt-bindings: serial: 8250: Add npcm845 compatible string
dt-bindings: watchdog: npcm: Add npcm845 compatible string
dt-binding: clk: npcm845: Add binding for Nuvoton NPCM8XX Clock
clk: npcm8xx: add clock controller
dt-bindings: reset: npcm: add GCR syscon property
ARM: dts: nuvoton: add reset syscon property
reset: npcm: using syscon instead of device data
dt-bindings: reset: npcm: Add support for NPCM8XX
reset: npcm: Add NPCM8XX support
dt-bindings: arm: npcm: Add maintainer
dt-bindings: arm: npcm: Add nuvoton,npcm845 compatible string
dt-bindings: arm: npcm: Add nuvoton,npcm845 GCR compatible string
arm64: npcm: Add support for Nuvoton NPCM8XX BMC SoC
arm64: dts: nuvoton: Add initial NPCM8XX device tree
arm64: dts: nuvoton: Add initial NPCM845 EVB device tree
arm64: defconfig: Add Nuvoton NPCM family support

 .../devicetree/bindings/arm/npcm/npcm.yaml    |   7 +
 .../bindings/arm/npcm/nuvoton,gcr.yaml        |   2 +
 .../bindings/clock/nuvoton,npcm845-clk.yaml   |  49 ++
 .../bindings/reset/nuvoton,npcm750-reset.yaml |   9 +-
 .../devicetree/bindings/serial/8250.yaml      |   1 +
 .../bindings/timer/nuvoton,npcm7xx-timer.yaml |   2 +
 .../bindings/watchdog/nuvoton,npcm-wdt.txt    |   3 +-
 MAINTAINERS                                   |   2 +
 arch/arm/boot/dts/nuvoton-common-npcm7xx.dtsi |   1 +
 arch/arm64/Kconfig.platforms                  |  11 +
 arch/arm64/boot/dts/Makefile                  |   1 +
 arch/arm64/boot/dts/nuvoton/Makefile          |   2 +
 .../dts/nuvoton/nuvoton-common-npcm8xx.dtsi   | 170 ++++
 .../boot/dts/nuvoton/nuvoton-npcm845-evb.dts  |  30 +
 .../boot/dts/nuvoton/nuvoton-npcm845.dtsi     |  76 ++
 arch/arm64/configs/defconfig                  |   3 +
 drivers/clk/Kconfig                           |   6 +
 drivers/clk/Makefile                          |   1 +
 drivers/clk/clk-npcm8xx.c                     | 760 ++++++++++++++++++
 drivers/clocksource/timer-npcm7xx.c           |   1 +
 drivers/reset/reset-npcm.c                    | 206 ++++-
 .../dt-bindings/clock/nuvoton,npcm8xx-clock.h |  49 ++
 22 files changed, 1356 insertions(+), 36 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml
 create mode 100644 arch/arm64/boot/dts/nuvoton/Makefile
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-common-npcm8xx.dtsi
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-npcm845-evb.dts
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-npcm845.dtsi
 create mode 100644 drivers/clk/clk-npcm8xx.c
 create mode 100644 include/dt-bindings/clock/nuvoton,npcm8xx-clock.h
Signature · 1 line
2.33.0
author maintainer
#1 lore raw

PATCH v3 1/18 dt-bindings: timer: npcm: Add npcm845 compatible string

Add a compatible string for Nuvoton BMC NPCM845 timer.

---
 .../devicetree/bindings/timer/nuvoton,npcm7xx-timer.yaml        | 2 ++
 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/timer/nuvoton,npcm7xx-timer.yaml +2 -0
index 0cbc26a72151..737af78ad70c 100644
@@ -8,12 +8,14 @@ title: Nuvoton NPCM7xx timer
 
 maintainers:
   - Jonathan Neuschäfer <[email protected]>
+  - Tomer Maimon <[email protected]>
 
 properties:
   compatible:
     enum:
       - nuvoton,wpcm450-timer  # for Hermon WPCM450
       - nuvoton,npcm750-timer  # for Poleg NPCM750
+      - nuvoton,npcm845-timer  # for Arbel NPCM845
 
   reg:
     maxItems: 1
Signature · 1 line
2.33.0
author maintainer
#2 lore raw

PATCH v3 2/18 clocksource: timer-npcm7xx: Add NPCM845 timer support

In reply to Tomer Maimon

Add Nuvoton BMC NPCM845 timer support, The NPCM845 uses the same timer controller as the NPCM750.

---
 drivers/clocksource/timer-npcm7xx.c | 1 +
 1 file changed, 1 insertion(+)
drivers/clocksource/timer-npcm7xx.c +1 -0
index a00520cbb660..1630daad4df5 100644
@@ -210,4 +210,5 @@ static int __init npcm7xx_timer_init(struct device_node *np)
 
 TIMER_OF_DECLARE(wpcm450, "nuvoton,wpcm450-timer", npcm7xx_timer_init);
 TIMER_OF_DECLARE(npcm7xx, "nuvoton,npcm750-timer", npcm7xx_timer_init);
+TIMER_OF_DECLARE(npcm8xx, "nuvoton,npcm845-timer", npcm7xx_timer_init);
 
Signature · 1 line
2.33.0
author maintainer
#3 lore raw

PATCH v3 3/18 dt-bindings: serial: 8250: Add npcm845 compatible string

In reply to Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 UART.

---
 Documentation/devicetree/bindings/serial/8250.yaml | 1 +
 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/serial/8250.yaml +1 -0
index 5f6b113d378f..6258f5f59b19 100644
@@ -62,6 +62,7 @@ properties:
       - const: mrvl,pxa-uart
       - const: nuvoton,wpcm450-uart
       - const: nuvoton,npcm750-uart
+      - const: nuvoton,npcm845-uart
       - const: nvidia,tegra20-uart
       - const: nxp,lpc3220-uart
       - items:
Signature · 1 line
2.33.0
author maintainer
#4 lore raw

PATCH v3 4/18 dt-bindings: watchdog: npcm: Add npcm845 compatible string

In reply to Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 watchdog.

---
 .../devicetree/bindings/watchdog/nuvoton,npcm-wdt.txt          | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/watchdog/nuvoton,npcm-wdt.txt +2 -1
index 9059f54dc023..866a958b8a2b 100644
@@ -6,7 +6,8 @@ expiry.
 
 Required properties:
 - compatible      : "nuvoton,npcm750-wdt" for NPCM750 (Poleg), or
-                    "nuvoton,wpcm450-wdt" for WPCM450 (Hermon).
+                    "nuvoton,wpcm450-wdt" for WPCM450 (Hermon), or
+                    "nuvoton,npcm845-wdt" for NPCM845 (Arbel).
 - reg             : Offset and length of the register set for the device.
 - interrupts      : Contain the timer interrupt with flags for
                     falling edge.
Signature · 1 line
2.33.0
author maintainer
#5 lore raw

PATCH v3 5/18 dt-binding: clk: npcm845: Add binding for Nuvoton NPCM8XX Clock

In reply to Tomer Maimon

Add binding for the Arbel BMC NPCM8XX Clock controller.

---
 .../bindings/clock/nuvoton,npcm845-clk.yaml   | 49 +++++++++++++++++++
 .../dt-bindings/clock/nuvoton,npcm8xx-clock.h | 49 +++++++++++++++++++
 2 files changed, 98 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml
 create mode 100644 include/dt-bindings/clock/nuvoton,npcm8xx-clock.h
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +49 -0
new file mode 100644
index 000000000000..3d4fddc090ca
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/nuvoton,npcm845-clk.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Nuvoton NPCM8XX Clock Controller Binding
+
+maintainers:
+  - Tomer Maimon <[email protected]>
+
+description: |
+  Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller, which
+  generates and supplies clocks to all modules within the BMC.
+
+properties:
+  compatible:
+    enum:
+      - nuvoton,npcm845-clk
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+    description:
+      See include/dt-bindings/clock/nuvoton,npcm8xx-clock.h for the full
+      list of NPCM8XX clock IDs.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    ahb {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        clock-controller@f0801000 {
+            compatible = "nuvoton,npcm845-clk";
+            reg = <0x0 0xf0801000 0x0 0x1000>;
+            #clock-cells = <1>;
+        };
+    };
+...
include/dt-bindings/clock/nuvoton,npcm8xx-clock.h new file +49 -0

49 lines not on this page · raw message

Signature · 1 line
2.33.0
#6 lore raw

Re: [PATCH v3 05/18] dt-binding: clk: npcm845: Add binding for Nuvoton NPCM8XX Clock

Quoted 39 lines · Tomer Maimon

Add binding for the Arbel BMC NPCM8XX Clock controller.

---
 .../bindings/clock/nuvoton,npcm845-clk.yaml   | 49 +++++++++++++++++++
 .../dt-bindings/clock/nuvoton,npcm8xx-clock.h | 49 +++++++++++++++++++
 2 files changed, 98 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml
 create mode 100644 include/dt-bindings/clock/nuvoton,npcm8xx-clock.h
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +23 -0
new file mode 100644
index 000000000000..3d4fddc090ca
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/nuvoton,npcm845-clk.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Nuvoton NPCM8XX Clock Controller Binding
+
+maintainers:
+  - Tomer Maimon <[email protected]>
+
+description: |
+  Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller, which
+  generates and supplies clocks to all modules within the BMC.
+
+properties:
+  compatible:
+    enum:
+      - nuvoton,npcm845-clk
+
+  reg:
+    maxItems: 1
+

Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml line 33

Quoted 10 lines
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +10 -0
+  '#clock-cells':
+    const: 1
+    description:
+      See include/dt-bindings/clock/nuvoton,npcm8xx-clock.h for the full
+      list of NPCM8XX clock IDs.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"

Use same quotes through your patchset - either " or '. Do not mix.

Quoted 22 lines
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +16 -0
+
+additionalProperties: false
+
+examples:
+  - |
+    ahb {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        clock-controller@f0801000 {
+            compatible = "nuvoton,npcm845-clk";
+            reg = <0x0 0xf0801000 0x0 0x1000>;
+            #clock-cells = <1>;
+        };
+    };
+...
include/dt-bindings/clock/nuvoton,npcm8xx-clock.h new file +0 -0
new file mode 100644
index 000000000000..e5cce08b00e1

include/dt-bindings/clock/nuvoton,npcm8xx-clock.h line 1

Quoted 1 line
include/dt-bindings/clock/nuvoton,npcm8xx-clock.h new file +1 -0
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */

My comment about filename is still waiting to be resolved. I asked for same filename as bindings in v1.

https://lore.kernel.org/all/CAP6Zq1gXEqqquKzxTHoxYnvh2LCGt-ES+k=aX61FKyHW5WB62w@mail.gmail.com/

I am still going to NAK it if it is not implemented.

Best regards,
Krzysztof

author maintainer
#7 lore raw

Re: [PATCH v3 05/18] dt-binding: clk: npcm845: Add binding for Nuvoton NPCM8XX Clock

Hi Krzysztof,

Quoted 72 lines · Krzysztof Kozlowski
Quoted 39 lines · Tomer Maimon

Add binding for the Arbel BMC NPCM8XX Clock controller.

---
 .../bindings/clock/nuvoton,npcm845-clk.yaml   | 49 +++++++++++++++++++
 .../dt-bindings/clock/nuvoton,npcm8xx-clock.h | 49 +++++++++++++++++++
 2 files changed, 98 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml
 create mode 100644 include/dt-bindings/clock/nuvoton,npcm8xx-clock.h
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +23 -0
new file mode 100644
index 000000000000..3d4fddc090ca
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/nuvoton,npcm845-clk.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Nuvoton NPCM8XX Clock Controller Binding
+
+maintainers:
+  - Tomer Maimon <[email protected]>
+
+description: |
+  Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller, which
+  generates and supplies clocks to all modules within the BMC.
+
+properties:
+  compatible:
+    enum:
+      - nuvoton,npcm845-clk
+
+  reg:
+    maxItems: 1
+

Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml line 33

Quoted 10 lines
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +10 -0
+  '#clock-cells':
+    const: 1
+    description:
+      See include/dt-bindings/clock/nuvoton,npcm8xx-clock.h for the full
+      list of NPCM8XX clock IDs.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"

Use same quotes through your patchset - either " or '. Do not mix.

Quoted 18 lines
Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml new file +16 -0
+
+additionalProperties: false
+
+examples:
+  - |
+    ahb {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        clock-controller@f0801000 {
+            compatible = "nuvoton,npcm845-clk";
+            reg = <0x0 0xf0801000 0x0 0x1000>;
+            #clock-cells = <1>;
+        };
+    };
+...
include/dt-bindings/clock/nuvoton,npcm8xx-clock.h new file +0 -0
new file mode 100644
Quoted 8 lines

include/dt-bindings/clock/nuvoton,npcm8xx-clock.h line 1

Quoted 5 lines

index 000000000000..e5cce08b00e1

include/dt-bindings/clock/nuvoton,npcm8xx-clock.h new file +1 -0
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */

My comment about filename is still waiting to be resolved. I asked for same filename as bindings in v1.

Right, forgot to modify the file name will be done in next version.

Quoted 7 lines

https://lore.kernel.org/all/CAP6Zq1gXEqqquKzxTHoxYnvh2LCGt-ES+k=aX61FKyHW5WB62w@mail.gmail.com/

I am still going to NAK it if it is not implemented.

Best regards,
Krzysztof

Best regards,

Tomer

author maintainer
#8 lore raw

PATCH v3 6/18 clk: npcm8xx: add clock controller

In reply to Tomer Maimon

Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller which generates and supplies clocks to all modules within the BMC.

---
 drivers/clk/Kconfig       |   6 +
 drivers/clk/Makefile      |   1 +
 drivers/clk/clk-npcm8xx.c | 760 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 767 insertions(+)
 create mode 100644 drivers/clk/clk-npcm8xx.c
drivers/clk/Kconfig +6 -0
index 48f8f4221e21..9aa915f6e233 100644
@@ -428,6 +428,12 @@ config COMMON_CLK_K210
 	help
 	  Support for the Canaan Kendryte K210 RISC-V SoC clocks.
 
+config COMMON_CLK_NPCM8XX
+	tristate "Clock driver for the NPCM8XX SoC Family"
+	depends on ARCH_NPCM || COMPILE_TEST
+	help
+          This driver supports the clocks on the Nuvoton BMC NPCM8XX SoC Family.
+
 source "drivers/clk/actions/Kconfig"
 source "drivers/clk/analogbits/Kconfig"
 source "drivers/clk/baikal-t1/Kconfig"
drivers/clk/Makefile +1 -0
index d5db170d38d2..b0ec1184a744 100644
@@ -49,6 +49,7 @@ obj-$(CONFIG_ARCH_MILBEAUT_M10V)	+= clk-milbeaut.o
 obj-$(CONFIG_ARCH_MOXART)		+= clk-moxart.o
 obj-$(CONFIG_ARCH_NOMADIK)		+= clk-nomadik.o
 obj-$(CONFIG_ARCH_NPCM7XX)	    	+= clk-npcm7xx.o
+obj-$(CONFIG_COMMON_CLK_NPCM8XX)	+= clk-npcm8xx.o
 obj-$(CONFIG_ARCH_NSPIRE)		+= clk-nspire.o
 obj-$(CONFIG_COMMON_CLK_OXNAS)		+= clk-oxnas.o
 obj-$(CONFIG_COMMON_CLK_PALMAS)		+= clk-palmas.o
drivers/clk/clk-npcm8xx.c new file +760 -0

760 lines not on this page · raw message

Signature · 1 line
2.33.0
#9 lore raw

Re: [PATCH v3 06/18] clk: npcm8xx: add clock controller

Le 19/06/2022 à 17:12, Tomer Maimon a écrit :

Quoted 11 lines

Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller which generates and supplies clocks to all modules within the BMC.

---
  drivers/clk/Kconfig       |   6 +
  drivers/clk/Makefile      |   1 +
  drivers/clk/clk-npcm8xx.c | 760 ++++++++++++++++++++++++++++++++++++++
  3 files changed, 767 insertions(+)

create mode 100644 drivers/clk/clk-npcm8xx.c

[...]

Hi, below a few comments related to error handling and possible dev_err_probe() usage to savec a few LoC.

CJ

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static struct clk_hw *
+npcm8xx_clk_register_pll(struct device *dev, void __iomem *pllcon,
+			 const char *name, const char *parent_name,
+			 unsigned long flags)
+{
+	struct npcm8xx_clk_pll *pll;
+	struct clk_init_data init;
+	struct clk_hw *hw;
+	int ret;
+
+	pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+	if (!pll)
+		return ERR_PTR(-ENOMEM);
+
+	pr_debug("%s reg, name=%s, p=%s\n", __func__, name, parent_name);
+
+	init.name = name;
+	init.ops = &npcm8xx_clk_pll_ops;
+	init.parent_names = &parent_name;
+	init.num_parents = 1;

drivers/clk/clk-npcm8xx.c line 100

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+	init.flags = flags;
+
+	pll->pllcon = pllcon;
+	pll->hw.init = &init;
+
+	hw = &pll->hw;
+
+	ret = devm_clk_hw_register(dev, hw);
+	if (ret) {
+		kfree(pll);

Hi,

there is no other kfree(() in this patch. It is handled by the framework once the clk is registered or should there be another kfree() somewhere or should pll be devm_alloc()'ed?

Quoted 6 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+		return ERR_PTR(ret);
+	}
+
+	return hw;
+}
+

[...]

Quoted 15 lines
drivers/clk/clk-npcm8xx.c new file +15 -0
+static int npcm8xx_clk_probe(struct platform_device *pdev)
+{
+	struct clk_hw_onecell_data *npcm8xx_clk_data;
+	struct device *dev = &pdev->dev;
+	void __iomem *clk_base;
+	struct clk_hw *hw;
+	int i;
+
+	npcm8xx_clk_data = devm_kzalloc(dev, struct_size(npcm8xx_clk_data, hws,
+							 NPCM8XX_NUM_CLOCKS),
+					GFP_KERNEL);
+	if (!npcm8xx_clk_data)
+		return -ENOMEM;
+
+	clk_base = devm_platform_ioremap_resource(pdev, 0);

drivers/clk/clk-npcm8xx.c line 636

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+	if (IS_ERR(clk_base))
+		return PTR_ERR(clk_base);
+
+	npcm8xx_clk_data->num = NPCM8XX_NUM_CLOCKS;
+
+	for (i = 0; i < NPCM8XX_NUM_CLOCKS; i++)
+		npcm8xx_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
+
+	/* Reference 25MHz clock */
+	hw = clk_hw_register_fixed_rate(dev, "refclk", NULL, 0, NPCM8XX_REF_CLK);

Other resoruces are managed, but not this one.
Is it on purpose?
Is an error handling path needed or a devm_add_action_or_reset()?

Quoted 17 lines
drivers/clk/clk-npcm8xx.c new file +17 -0
+	if (IS_ERR(hw))
+		return PTR_ERR(hw);
+	npcm8xx_clk_data->hws[NPCM8XX_CLK_REFCLK] = hw;
+
+	/* Register plls */
+	for (i = 0; i < ARRAY_SIZE(npcm8xx_plls); i++) {
+		const struct npcm8xx_clk_pll_data *pll_data = &npcm8xx_plls[i];
+
+		hw = npcm8xx_clk_register_pll(dev, clk_base + pll_data->reg,
+					      pll_data->name,
+					      pll_data->parent_name,
+					      pll_data->flags);
+		if (IS_ERR(hw)) {
+			dev_err(dev, "npcm8xx_clk: Can't register pll\n");
+			return PTR_ERR(hw);
+		}
+

drivers/clk/clk-npcm8xx.c line 663

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+		if (pll_data->onecell_idx >= 0)
+			npcm8xx_clk_data->hws[pll_data->onecell_idx] = hw;
+	}
+
+	/* Register fixed dividers */
+	hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL1_DIV2,
+					       NPCM8XX_CLK_S_PLL1, 0, 1, 2);
+	if (IS_ERR(hw)) {
+		dev_err(dev, "npcm8xx_clk: Can't register fixed div\n");
+		return PTR_ERR(hw);

return dev_err_probe()?

drivers/clk/clk-npcm8xx.c line 670

Quoted 7 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+	}
+
+	hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL2_DIV2,
+					       NPCM8XX_CLK_S_PLL2, 0, 1, 2);
+	if (IS_ERR(hw)) {
+		dev_err(dev, "npcm8xx_clk: Can't register pll div2\n");
+		return PTR_ERR(hw);

Same here and in other calls below.

Quoted 27 lines
drivers/clk/clk-npcm8xx.c new file +27 -0
+	}
+
+	hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PRE_CLK,
+					       NPCM8XX_CLK_S_CPU_MUX, 0, 1, 2);
+	if (IS_ERR(hw)) {
+		dev_err(dev, "npcm8xx_clk: Can't register ckclk div2\n");
+		return PTR_ERR(hw);
+	}
+
+	hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_AXI,
+					       NPCM8XX_CLK_S_TH, 0, 1, 2);
+	if (IS_ERR(hw)) {
+		dev_err(dev, "npcm8xx_clk: Can't register axi div2\n");
+		return PTR_ERR(hw);
+	}
+
+	hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_ATB,
+					       NPCM8XX_CLK_S_AXI, 0, 1, 2);
+	if (IS_ERR(hw)) {
+		dev_err(dev, "npcm8xx_clk: Can't register atb div2\n");
+		return PTR_ERR(hw);
+	}
+
+	/* Register muxes */
+	for (i = 0; i < ARRAY_SIZE(npcm8xx_muxes); i++) {
+		const struct npcm8xx_clk_mux_data *mux_data = &npcm8xx_muxes[i];
+

drivers/clk/clk-npcm8xx.c line 707

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+		hw = clk_hw_register_mux_table(dev, mux_data->name,
+					       mux_data->parent_names,
+					       mux_data->num_parents,
+					       mux_data->flags,
+					       clk_base + NPCM8XX_CLKSEL,
+					       mux_data->shift,
+					       mux_data->mask, 0,
+					       mux_data->table,
+					       &npcm8xx_clk_lock);
+

Same here. Error handling?

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+		if (IS_ERR(hw)) {
+			dev_err(dev, "npcm8xx_clk: Can't register mux\n");
+			return PTR_ERR(hw);
+		}
+
+		if (mux_data->onecell_idx >= 0)
+			npcm8xx_clk_data->hws[mux_data->onecell_idx] = hw;
+	}
+
+	/* Register clock dividers specified in npcm8xx_divs */

drivers/clk/clk-npcm8xx.c line 727

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+	for (i = 0; i < ARRAY_SIZE(npcm8xx_divs); i++) {
+		const struct npcm8xx_clk_div_data *div_data = &npcm8xx_divs[i];
+
+		hw = clk_hw_register_divider(dev, div_data->name,
+					     div_data->parent_name,
+					     div_data->flags,
+					     clk_base + div_data->reg,
+					     div_data->shift, div_data->width,
+					     div_data->clk_divider_flags,
+					     &npcm8xx_clk_lock);

devm_clk_hw_register_divider()?

Quoted 33 lines
drivers/clk/clk-npcm8xx.c new file +33 -0
+		if (IS_ERR(hw)) {
+			dev_err(dev, "npcm8xx_clk: Can't register div table\n");
+			return PTR_ERR(hw);
+		}
+
+		if (div_data->onecell_idx >= 0)
+			npcm8xx_clk_data->hws[div_data->onecell_idx] = hw;
+	}
+
+	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
+					   npcm8xx_clk_data);
+}
+
+static const struct of_device_id npcm8xx_clk_dt_ids[] = {
+	{ .compatible = "nuvoton,npcm845-clk", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, npcm8xx_clk_dt_ids);
+
+static struct platform_driver npcm8xx_clk_driver = {
+	.probe  = npcm8xx_clk_probe,
+	.driver = {
+		.name = "npcm8xx_clk",
+		.of_match_table = npcm8xx_clk_dt_ids,
+	},
+};
+
+static int __init npcm8xx_clk_driver_init(void)
+{
+	return platform_driver_register(&npcm8xx_clk_driver);
+}
+arch_initcall(npcm8xx_clk_driver_init);
+
author maintainer
#10 lore raw

Re: [PATCH v3 06/18] clk: npcm8xx: add clock controller

Hi Christophe,

Thanks for your comments.

Quoted 54 lines · Christophe JAILLET
Quoted 11 lines · Tomer Maimon

Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller which generates and supplies clocks to all modules within the BMC.

---
  drivers/clk/Kconfig       |   6 +
  drivers/clk/Makefile      |   1 +
  drivers/clk/clk-npcm8xx.c | 760 ++++++++++++++++++++++++++++++++++++++
  3 files changed, 767 insertions(+)

create mode 100644 drivers/clk/clk-npcm8xx.c

[...]

Hi, below a few comments related to error handling and possible dev_err_probe() usage to savec a few LoC.

CJ

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static struct clk_hw *
+npcm8xx_clk_register_pll(struct device *dev, void __iomem *pllcon,
+                      const char *name, const char *parent_name,
+                      unsigned long flags)
+{
+     struct npcm8xx_clk_pll *pll;
+     struct clk_init_data init;
+     struct clk_hw *hw;
+     int ret;
+
+     pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+     if (!pll)
+             return ERR_PTR(-ENOMEM);
+
+     pr_debug("%s reg, name=%s, p=%s\n", __func__, name, parent_name);
+
+     init.name = name;
+     init.ops = &npcm8xx_clk_pll_ops;
+     init.parent_names = &parent_name;
+     init.num_parents = 1;

drivers/clk/clk-npcm8xx.c line 100

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+     init.flags = flags;
+
+     pll->pllcon = pllcon;
+     pll->hw.init = &init;
+
+     hw = &pll->hw;
+
+     ret = devm_clk_hw_register(dev, hw);
+     if (ret) {
+             kfree(pll);

Hi,

Quoted 3 lines

there is no other kfree(() in this patch. It is handled by the framework once the clk is registered or should there be another kfree() somewhere or should pll be devm_alloc()'ed?

Could use the devm_kzalloc but the hw is sent to the devm function and not the pll struct.

Quoted 31 lines
Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+             return ERR_PTR(ret);
+     }
+
+     return hw;
+}
+

[...]

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static int npcm8xx_clk_probe(struct platform_device *pdev)
+{
+     struct clk_hw_onecell_data *npcm8xx_clk_data;
+     struct device *dev = &pdev->dev;
+     void __iomem *clk_base;
+     struct clk_hw *hw;
+     int i;
+
+     npcm8xx_clk_data = devm_kzalloc(dev, struct_size(npcm8xx_clk_data, hws,
+                                                      NPCM8XX_NUM_CLOCKS),
+                                     GFP_KERNEL);
+     if (!npcm8xx_clk_data)
+             return -ENOMEM;
+
+     clk_base = devm_platform_ioremap_resource(pdev, 0);
+     if (IS_ERR(clk_base))
+             return PTR_ERR(clk_base);
+
+     npcm8xx_clk_data->num = NPCM8XX_NUM_CLOCKS;
+
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 636

Quoted 5 lines
drivers/clk/clk-npcm8xx.c new file +5 -0
+     for (i = 0; i < NPCM8XX_NUM_CLOCKS; i++)
+             npcm8xx_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
+
+     /* Reference 25MHz clock */
+     hw = clk_hw_register_fixed_rate(dev, "refclk", NULL, 0, NPCM8XX_REF_CLK);

Other resoruces are managed, but not this one.
Is it on purpose?

This is the fixed clock - the SoC Reference clock, what do you mean by not managed?

Quoted 23 lines

Is an error handling path needed or a devm_add_action_or_reset()?

Quoted 21 lines
drivers/clk/clk-npcm8xx.c new file +21 -0
+     if (IS_ERR(hw))
+             return PTR_ERR(hw);
+     npcm8xx_clk_data->hws[NPCM8XX_CLK_REFCLK] = hw;
+
+     /* Register plls */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_plls); i++) {
+             const struct npcm8xx_clk_pll_data *pll_data = &npcm8xx_plls[i];
+
+             hw = npcm8xx_clk_register_pll(dev, clk_base + pll_data->reg,
+                                           pll_data->name,
+                                           pll_data->parent_name,
+                                           pll_data->flags);
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register pll\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (pll_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[pll_data->onecell_idx] = hw;
+     }
+
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 663

Quoted 6 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+     /* Register fixed dividers */
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL1_DIV2,
+                                            NPCM8XX_CLK_S_PLL1, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register fixed div\n");
+             return PTR_ERR(hw);

return dev_err_probe()?

it will save online but still enter to a bigger function, I am not sure that the error will be EPROBE_DEFER, and we have returned the error in the code.

Quoted 41 lines

drivers/clk/clk-npcm8xx.c line 670

Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL2_DIV2,
+                                            NPCM8XX_CLK_S_PLL2, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register pll div2\n");
+             return PTR_ERR(hw);

Same here and in other calls below.

Quoted 30 lines
drivers/clk/clk-npcm8xx.c new file +30 -0
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PRE_CLK,
+                                            NPCM8XX_CLK_S_CPU_MUX, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register ckclk div2\n");
+             return PTR_ERR(hw);
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_AXI,
+                                            NPCM8XX_CLK_S_TH, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register axi div2\n");
+             return PTR_ERR(hw);
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_ATB,
+                                            NPCM8XX_CLK_S_AXI, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register atb div2\n");
+             return PTR_ERR(hw);
+     }
+
+     /* Register muxes */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_muxes); i++) {
+             const struct npcm8xx_clk_mux_data *mux_data = &npcm8xx_muxes[i];
+
+             hw = clk_hw_register_mux_table(dev, mux_data->name,
+                                            mux_data->parent_names,
+                                            mux_data->num_parents,
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 707

Quoted 7 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+                                            mux_data->flags,
+                                            clk_base + NPCM8XX_CLKSEL,
+                                            mux_data->shift,
+                                            mux_data->mask, 0,
+                                            mux_data->table,
+                                            &npcm8xx_clk_lock);
+

Same here. Error handling?

what do you mean?

Quoted 15 lines
Quoted 15 lines
drivers/clk/clk-npcm8xx.c new file +14 -0
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register mux\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (mux_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[mux_data->onecell_idx] = hw;
+     }
+
+     /* Register clock dividers specified in npcm8xx_divs */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_divs); i++) {
+             const struct npcm8xx_clk_div_data *div_data = &npcm8xx_divs[i];
+
+             hw = clk_hw_register_divider(dev, div_data->name,
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 727

Quoted 6 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+                                          div_data->parent_name,
+                                          div_data->flags,
+                                          clk_base + div_data->reg,
+                                          div_data->shift, div_data->width,
+                                          div_data->clk_divider_flags,
+                                          &npcm8xx_clk_lock);

devm_clk_hw_register_divider()?

Will do.

Quoted 26 lines
Quoted 26 lines
drivers/clk/clk-npcm8xx.c new file +25 -0
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register div table\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (div_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[div_data->onecell_idx] = hw;
+     }
+
+     return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
+                                        npcm8xx_clk_data);
+}
+
+static const struct of_device_id npcm8xx_clk_dt_ids[] = {
+     { .compatible = "nuvoton,npcm845-clk", },
+     { }
+};
+MODULE_DEVICE_TABLE(of, npcm8xx_clk_dt_ids);
+
+static struct platform_driver npcm8xx_clk_driver = {
+     .probe  = npcm8xx_clk_probe,
+     .driver = {
+             .name = "npcm8xx_clk",
+             .of_match_table = npcm8xx_clk_dt_ids,
+     },
Quoted 9 lines

drivers/clk/clk-npcm8xx.c line 760

Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +8 -0
+};
+
+static int __init npcm8xx_clk_driver_init(void)
+{
+     return platform_driver_register(&npcm8xx_clk_driver);
+}
+arch_initcall(npcm8xx_clk_driver_init);
+

Best regards,

Tomer

#11 lore raw

Re: [PATCH v3 06/18] clk: npcm8xx: add clock controller

Le 20/06/2022 à 14:48, Tomer Maimon a écrit :

Quoted 60 lines

Hi Christophe,

Thanks for your comments.

Quoted 54 lines · Christophe JAILLET
Quoted 11 lines · Tomer Maimon

Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller which generates and supplies clocks to all modules within the BMC.

---
   drivers/clk/Kconfig       |   6 +
   drivers/clk/Makefile      |   1 +
   drivers/clk/clk-npcm8xx.c | 760 ++++++++++++++++++++++++++++++++++++++
   3 files changed, 767 insertions(+)

create mode 100644 drivers/clk/clk-npcm8xx.c

[...]

Hi, below a few comments related to error handling and possible dev_err_probe() usage to savec a few LoC.

CJ

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static struct clk_hw *
+npcm8xx_clk_register_pll(struct device *dev, void __iomem *pllcon,
+                      const char *name, const char *parent_name,
+                      unsigned long flags)
+{
+     struct npcm8xx_clk_pll *pll;
+     struct clk_init_data init;
+     struct clk_hw *hw;
+     int ret;
+
+     pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+     if (!pll)
+             return ERR_PTR(-ENOMEM);
+
+     pr_debug("%s reg, name=%s, p=%s\n", __func__, name, parent_name);
+
+     init.name = name;
+     init.ops = &npcm8xx_clk_pll_ops;
+     init.parent_names = &parent_name;
+     init.num_parents = 1;

drivers/clk/clk-npcm8xx.c line 100

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+     init.flags = flags;
+
+     pll->pllcon = pllcon;
+     pll->hw.init = &init;
+
+     hw = &pll->hw;
+
+     ret = devm_clk_hw_register(dev, hw);
+     if (ret) {
+             kfree(pll);

Hi,

Quoted 5 lines
Quoted 3 lines

there is no other kfree(() in this patch. It is handled by the framework once the clk is registered or should there be another kfree() somewhere or should pll be devm_alloc()'ed?

Could use the devm_kzalloc but the hw is sent to the devm function and not the pll struct.

My point, as explained below is that some resources are managed (i.e. allocated by a devm_ function and released by the framework if the probe fails or if the driver is removed), but not all.

I think that it is not consistent and that maybe the release of the corresponding resources should be handled in a way or another.

Quoted 39 lines
Quoted 31 lines
Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+             return ERR_PTR(ret);
+     }
+
+     return hw;
+}
+

[...]

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static int npcm8xx_clk_probe(struct platform_device *pdev)
+{
+     struct clk_hw_onecell_data *npcm8xx_clk_data;
+     struct device *dev = &pdev->dev;
+     void __iomem *clk_base;
+     struct clk_hw *hw;
+     int i;
+
+     npcm8xx_clk_data = devm_kzalloc(dev, struct_size(npcm8xx_clk_data, hws,
+                                                      NPCM8XX_NUM_CLOCKS),
+                                     GFP_KERNEL);
+     if (!npcm8xx_clk_data)
+             return -ENOMEM;
+
+     clk_base = devm_platform_ioremap_resource(pdev, 0);
+     if (IS_ERR(clk_base))
+             return PTR_ERR(clk_base);
+
+     npcm8xx_clk_data->num = NPCM8XX_NUM_CLOCKS;
+
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 636

Quoted 5 lines
drivers/clk/clk-npcm8xx.c new file +5 -0
+     for (i = 0; i < NPCM8XX_NUM_CLOCKS; i++)
+             npcm8xx_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
+
+     /* Reference 25MHz clock */
+     hw = clk_hw_register_fixed_rate(dev, "refclk", NULL, 0, NPCM8XX_REF_CLK);

Other resoruces are managed, but not this one.
Is it on purpose?

Quoted 2 lines

This is the fixed clock - the SoC Reference clock, what do you mean by not managed?

clk_hw_register_fixed_rate() allocates some memory. If an error occures later on or if the driver is .remove()'ed, this memory will leak. (unless I missed something).

Most of your other function calls use some devm_ variant, so the corresponding resources are released automatically in case of error or if the driver is unloaed.

Quoted 31 lines
Quoted 23 lines

Is an error handling path needed or a devm_add_action_or_reset()?

Quoted 21 lines
drivers/clk/clk-npcm8xx.c new file +21 -0
+     if (IS_ERR(hw))
+             return PTR_ERR(hw);
+     npcm8xx_clk_data->hws[NPCM8XX_CLK_REFCLK] = hw;
+
+     /* Register plls */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_plls); i++) {
+             const struct npcm8xx_clk_pll_data *pll_data = &npcm8xx_plls[i];
+
+             hw = npcm8xx_clk_register_pll(dev, clk_base + pll_data->reg,
+                                           pll_data->name,
+                                           pll_data->parent_name,
+                                           pll_data->flags);
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register pll\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (pll_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[pll_data->onecell_idx] = hw;
+     }
+
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 663

Quoted 6 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+     /* Register fixed dividers */
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL1_DIV2,
+                                            NPCM8XX_CLK_S_PLL1, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register fixed div\n");
+             return PTR_ERR(hw);

return dev_err_probe()?

Quoted 3 lines

it will save online but still enter to a bigger function, I am not sure that the error will be EPROBE_DEFER, and we have returned the error in the code.

It is mostly a matter of taste, so if you don't think my proposal improves anything, just forget about it.

Quoted 49 lines
Quoted 41 lines

drivers/clk/clk-npcm8xx.c line 670

Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL2_DIV2,
+                                            NPCM8XX_CLK_S_PLL2, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register pll div2\n");
+             return PTR_ERR(hw);

Same here and in other calls below.

Quoted 30 lines
drivers/clk/clk-npcm8xx.c new file +30 -0
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PRE_CLK,
+                                            NPCM8XX_CLK_S_CPU_MUX, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register ckclk div2\n");
+             return PTR_ERR(hw);
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_AXI,
+                                            NPCM8XX_CLK_S_TH, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register axi div2\n");
+             return PTR_ERR(hw);
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_ATB,
+                                            NPCM8XX_CLK_S_AXI, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register atb div2\n");
+             return PTR_ERR(hw);
+     }
+
+     /* Register muxes */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_muxes); i++) {
+             const struct npcm8xx_clk_mux_data *mux_data = &npcm8xx_muxes[i];
+
+             hw = clk_hw_register_mux_table(dev, mux_data->name,
+                                            mux_data->parent_names,
+                                            mux_data->num_parents,
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 707

Quoted 7 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+                                            mux_data->flags,
+                                            clk_base + NPCM8XX_CLKSEL,
+                                            mux_data->shift,
+                                            mux_data->mask, 0,
+                                            mux_data->table,
+                                            &npcm8xx_clk_lock);
+

Same here. Error handling?

Quoted 1 line

what do you mean?

I mean the same as above. clk_hw_register_mux_table() allocates some memory. If an error occures later on or if the driver is .remove()'ed, this memory will leak. (unless I missed something).

Error handling was not a really good wording. You should read "should the resources allocated by this function be released if an error occures below"

Quoted 23 lines
Quoted 15 lines
Quoted 15 lines
drivers/clk/clk-npcm8xx.c new file +14 -0
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register mux\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (mux_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[mux_data->onecell_idx] = hw;
+     }
+
+     /* Register clock dividers specified in npcm8xx_divs */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_divs); i++) {
+             const struct npcm8xx_clk_div_data *div_data = &npcm8xx_divs[i];
+
+             hw = clk_hw_register_divider(dev, div_data->name,
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 727

Quoted 6 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+                                          div_data->parent_name,
+                                          div_data->flags,
+                                          clk_base + div_data->reg,
+                                          div_data->shift, div_data->width,
+                                          div_data->clk_divider_flags,
+                                          &npcm8xx_clk_lock);

devm_clk_hw_register_divider()?

Quoted 1 line

Will do.

Here, the devm_ alternative exist. But my point is the same as above. (release of resources in cae of error or if the driver is removed)

Quoted 40 lines
Quoted 26 lines
Quoted 26 lines
drivers/clk/clk-npcm8xx.c new file +25 -0
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register div table\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (div_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[div_data->onecell_idx] = hw;
+     }
+
+     return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
+                                        npcm8xx_clk_data);
+}
+
+static const struct of_device_id npcm8xx_clk_dt_ids[] = {
+     { .compatible = "nuvoton,npcm845-clk", },
+     { }
+};
+MODULE_DEVICE_TABLE(of, npcm8xx_clk_dt_ids);
+
+static struct platform_driver npcm8xx_clk_driver = {
+     .probe  = npcm8xx_clk_probe,
+     .driver = {
+             .name = "npcm8xx_clk",
+             .of_match_table = npcm8xx_clk_dt_ids,
+     },
Quoted 9 lines

drivers/clk/clk-npcm8xx.c line 760

Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +8 -0
+};
+
+static int __init npcm8xx_clk_driver_init(void)
+{
+     return platform_driver_register(&npcm8xx_clk_driver);
+}
+arch_initcall(npcm8xx_clk_driver_init);
+

Best regards,

Tomer

author maintainer
#12 lore raw

Re: [PATCH v3 06/18] clk: npcm8xx: add clock controller

Hi Christophe,

Quoted 68 lines · Christophe JAILLET
Quoted 60 lines · Tomer Maimon

Hi Christophe,

Thanks for your comments.

Quoted 54 lines · Christophe JAILLET
Quoted 11 lines · Tomer Maimon

Nuvoton Arbel BMC NPCM8XX contains an integrated clock controller which generates and supplies clocks to all modules within the BMC.

---
   drivers/clk/Kconfig       |   6 +
   drivers/clk/Makefile      |   1 +
   drivers/clk/clk-npcm8xx.c | 760 ++++++++++++++++++++++++++++++++++++++
   3 files changed, 767 insertions(+)

create mode 100644 drivers/clk/clk-npcm8xx.c

[...]

Hi, below a few comments related to error handling and possible dev_err_probe() usage to savec a few LoC.

CJ

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static struct clk_hw *
+npcm8xx_clk_register_pll(struct device *dev, void __iomem *pllcon,
+                      const char *name, const char *parent_name,
+                      unsigned long flags)
+{
+     struct npcm8xx_clk_pll *pll;
+     struct clk_init_data init;
+     struct clk_hw *hw;
+     int ret;
+
+     pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+     if (!pll)
+             return ERR_PTR(-ENOMEM);
+
+     pr_debug("%s reg, name=%s, p=%s\n", __func__, name, parent_name);
+
+     init.name = name;
+     init.ops = &npcm8xx_clk_pll_ops;
+     init.parent_names = &parent_name;
+     init.num_parents = 1;

drivers/clk/clk-npcm8xx.c line 100

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+     init.flags = flags;
+
+     pll->pllcon = pllcon;
+     pll->hw.init = &init;
+
+     hw = &pll->hw;
+
+     ret = devm_clk_hw_register(dev, hw);
+     if (ret) {
+             kfree(pll);

Hi,

Quoted 5 lines
Quoted 3 lines

there is no other kfree(() in this patch. It is handled by the framework once the clk is registered or should there be another kfree() somewhere or should pll be devm_alloc()'ed?

Could use the devm_kzalloc but the hw is sent to the devm function and not the pll struct.

Quoted 6 lines

My point, as explained below is that some resources are managed (i.e. allocated by a devm_ function and released by the framework if the probe fails or if the driver is removed), but not all.

I think that it is not consistent and that maybe the release of the corresponding resources should be handled in a way or another.

Thanks for your clarification will Address in V4

Quoted 43 lines
Quoted 40 lines
Quoted 32 lines
Quoted 9 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+             return ERR_PTR(ret);
+     }
+
+     return hw;
+}
+

[...]

Quoted 20 lines
drivers/clk/clk-npcm8xx.c new file +20 -0
+static int npcm8xx_clk_probe(struct platform_device *pdev)
+{
+     struct clk_hw_onecell_data *npcm8xx_clk_data;
+     struct device *dev = &pdev->dev;
+     void __iomem *clk_base;
+     struct clk_hw *hw;
+     int i;
+
+     npcm8xx_clk_data = devm_kzalloc(dev, struct_size(npcm8xx_clk_data, hws,
+                                                      NPCM8XX_NUM_CLOCKS),
+                                     GFP_KERNEL);
+     if (!npcm8xx_clk_data)
+             return -ENOMEM;
+
+     clk_base = devm_platform_ioremap_resource(pdev, 0);
+     if (IS_ERR(clk_base))
+             return PTR_ERR(clk_base);
+
+     npcm8xx_clk_data->num = NPCM8XX_NUM_CLOCKS;
+
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 636

Quoted 5 lines
drivers/clk/clk-npcm8xx.c new file +5 -0
+     for (i = 0; i < NPCM8XX_NUM_CLOCKS; i++)
+             npcm8xx_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
+
+     /* Reference 25MHz clock */
+     hw = clk_hw_register_fixed_rate(dev, "refclk", NULL, 0, NPCM8XX_REF_CLK);

Other resoruces are managed, but not this one.
Is it on purpose?

Quoted 2 lines

This is the fixed clock - the SoC Reference clock, what do you mean by not managed?

Quoted 7 lines

clk_hw_register_fixed_rate() allocates some memory. If an error occures later on or if the driver is .remove()'ed, this memory will leak. (unless I missed something).

Most of your other function calls use some devm_ variant, so the corresponding resources are released automatically in case of error or if the driver is unloaed.

Thanks for your clarification will Address in V4

Quoted 90 lines
Quoted 32 lines
Quoted 24 lines

Is an error handling path needed or a devm_add_action_or_reset()?

Quoted 21 lines
drivers/clk/clk-npcm8xx.c new file +21 -0
+     if (IS_ERR(hw))
+             return PTR_ERR(hw);
+     npcm8xx_clk_data->hws[NPCM8XX_CLK_REFCLK] = hw;
+
+     /* Register plls */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_plls); i++) {
+             const struct npcm8xx_clk_pll_data *pll_data = &npcm8xx_plls[i];
+
+             hw = npcm8xx_clk_register_pll(dev, clk_base + pll_data->reg,
+                                           pll_data->name,
+                                           pll_data->parent_name,
+                                           pll_data->flags);
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register pll\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (pll_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[pll_data->onecell_idx] = hw;
+     }
+
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 663

Quoted 6 lines
drivers/clk/clk-npcm8xx.c new file +6 -0
+     /* Register fixed dividers */
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL1_DIV2,
+                                            NPCM8XX_CLK_S_PLL1, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register fixed div\n");
+             return PTR_ERR(hw);

return dev_err_probe()?

Quoted 3 lines

it will save online but still enter to a bigger function, I am not sure that the error will be EPROBE_DEFER, and we have returned the error in the code.

It is mostly a matter of taste, so if you don't think my proposal improves anything, just forget about it.

Quoted 49 lines
Quoted 41 lines

drivers/clk/clk-npcm8xx.c line 670

Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PLL2_DIV2,
+                                            NPCM8XX_CLK_S_PLL2, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register pll div2\n");
+             return PTR_ERR(hw);

Same here and in other calls below.

Quoted 30 lines
drivers/clk/clk-npcm8xx.c new file +30 -0
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_PRE_CLK,
+                                            NPCM8XX_CLK_S_CPU_MUX, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register ckclk div2\n");
+             return PTR_ERR(hw);
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_AXI,
+                                            NPCM8XX_CLK_S_TH, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register axi div2\n");
+             return PTR_ERR(hw);
+     }
+
+     hw = devm_clk_hw_register_fixed_factor(dev, NPCM8XX_CLK_S_ATB,
+                                            NPCM8XX_CLK_S_AXI, 0, 1, 2);
+     if (IS_ERR(hw)) {
+             dev_err(dev, "npcm8xx_clk: Can't register atb div2\n");
+             return PTR_ERR(hw);
+     }
+
+     /* Register muxes */
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_muxes); i++) {
+             const struct npcm8xx_clk_mux_data *mux_data = &npcm8xx_muxes[i];
+
+             hw = clk_hw_register_mux_table(dev, mux_data->name,
+                                            mux_data->parent_names,
+                                            mux_data->num_parents,
Quoted 8 lines

drivers/clk/clk-npcm8xx.c line 707

Quoted 7 lines
drivers/clk/clk-npcm8xx.c new file +7 -0
+                                            mux_data->flags,
+                                            clk_base + NPCM8XX_CLKSEL,
+                                            mux_data->shift,
+                                            mux_data->mask, 0,
+                                            mux_data->table,
+                                            &npcm8xx_clk_lock);
+

Same here. Error handling?

Quoted 1 line

what do you mean?

Quoted 7 lines

I mean the same as above. clk_hw_register_mux_table() allocates some memory. If an error occures later on or if the driver is .remove()'ed, this memory will leak. (unless I missed something).

Error handling was not a really good wording. You should read "should the resources allocated by this function be released if an error occures below"

Thanks for your clarification will Address in V4

Quoted 24 lines
Quoted 24 lines
Quoted 24 lines
Quoted 12 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register mux\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (mux_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[mux_data->onecell_idx] = hw;
+     }
+
+     /* Register clock dividers specified in npcm8xx_divs */

drivers/clk/clk-npcm8xx.c line 727

Quoted 10 lines
drivers/clk/clk-npcm8xx.c new file +10 -0
+     for (i = 0; i < ARRAY_SIZE(npcm8xx_divs); i++) {
+             const struct npcm8xx_clk_div_data *div_data = &npcm8xx_divs[i];
+
+             hw = clk_hw_register_divider(dev, div_data->name,
+                                          div_data->parent_name,
+                                          div_data->flags,
+                                          clk_base + div_data->reg,
+                                          div_data->shift, div_data->width,
+                                          div_data->clk_divider_flags,
+                                          &npcm8xx_clk_lock);

devm_clk_hw_register_divider()?

Quoted 46 lines
Quoted 1 line

Will do.

Here, the devm_ alternative exist. But my point is the same as above. (release of resources in cae of error or if the driver is removed)

Quoted 40 lines
Quoted 26 lines
Quoted 26 lines
drivers/clk/clk-npcm8xx.c new file +25 -0
+             if (IS_ERR(hw)) {
+                     dev_err(dev, "npcm8xx_clk: Can't register div table\n");
+                     return PTR_ERR(hw);
+             }
+
+             if (div_data->onecell_idx >= 0)
+                     npcm8xx_clk_data->hws[div_data->onecell_idx] = hw;
+     }
+
+     return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
+                                        npcm8xx_clk_data);
+}
+
+static const struct of_device_id npcm8xx_clk_dt_ids[] = {
+     { .compatible = "nuvoton,npcm845-clk", },
+     { }
+};
+MODULE_DEVICE_TABLE(of, npcm8xx_clk_dt_ids);
+
+static struct platform_driver npcm8xx_clk_driver = {
+     .probe  = npcm8xx_clk_probe,
+     .driver = {
+             .name = "npcm8xx_clk",
+             .of_match_table = npcm8xx_clk_dt_ids,
+     },
Quoted 9 lines

drivers/clk/clk-npcm8xx.c line 760

Quoted 8 lines
drivers/clk/clk-npcm8xx.c new file +8 -0
+};
+
+static int __init npcm8xx_clk_driver_init(void)
+{
+     return platform_driver_register(&npcm8xx_clk_driver);
+}
+arch_initcall(npcm8xx_clk_driver_init);
+

Best regards,

Tomer

Best regards,

Tomer

#13 lore raw

Re: [PATCH v3 06/18] clk: npcm8xx: add clock controller

In reply to Tomer Maimon
I love your patch! Perhaps something to improve:

Hi Tomer,

I love your patch! Perhaps something to improve:

[auto build test WARNING on robh/for-next]
[also build test WARNING on pza/reset/next clk/clk-next linus/master v5.19-rc2 next-20220617] [If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Tomer-Maimon/Introduce-Nuvoton-Arbel-NPCM8XX-BMC-SoC/20220619-231717
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: arm64-randconfig-r013-20220620 (https://download.01.org/0day-ci/archive/20220620/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project af6d2a0b6825e71965f3e2701a63c239fa0ad70f)

reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/d7bd2f3034704914b803bcbc64785cacca9aab80
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Tomer-Maimon/Introduce-Nuvoton-Arbel-NPCM8XX-BMC-SoC/20220619-231717 git checkout d7bd2f3034704914b803bcbc64785cacca9aab80
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/clk/

If you fix the issue, kindly add following tag where applicable

All warnings (new ones prefixed by >>):

>> drivers/clk/clk-npcm8xx.c:380:48: warning: unused variable 'npcm8xx_divs_fx' [-Wunused-const-variable]
   static const struct npcm8xx_clk_div_fixed_data npcm8xx_divs_fx[] = {
                                                  ^
>> drivers/clk/clk-npcm8xx.c:474:43: warning: unused variable 'npcm8xx_gates' [-Wunused-const-variable]
   static const struct npcm8xx_clk_gate_data npcm8xx_gates[] = {
                                             ^

2 warnings generated.

vim +/npcm8xx_divs_fx +380 drivers/clk/clk-npcm8xx.c

378
379 /* fixed ratio dividers (no register): */

 > 380	static const struct npcm8xx_clk_div_fixed_data npcm8xx_divs_fx[] = {
   381		{ 1, 2, NPCM8XX_CLK_S_MC, NPCM8XX_CLK_S_MC_MUX, 0, NPCM8XX_CLK_MC},
   382		{ 1, 2, NPCM8XX_CLK_S_AXI, NPCM8XX_CLK_S_TH, 0, NPCM8XX_CLK_AXI},
   383		{ 1, 2, NPCM8XX_CLK_S_ATB, NPCM8XX_CLK_S_AXI, 0, NPCM8XX_CLK_ATB},
   384		{ 1, 2, NPCM8XX_CLK_S_PRE_CLK, NPCM8XX_CLK_S_CPU_MUX, 0, -1},
   385		{ 1, 2, NPCM8XX_CLK_S_PLL1_DIV2, NPCM8XX_CLK_S_PLL1, 0, -1},
   386		{ 1, 2, NPCM8XX_CLK_S_PLL2_DIV2, NPCM8XX_CLK_S_PLL2, 0, -1},
   387	};
   388	
   389	/* configurable dividers: */
   390	static const struct npcm8xx_clk_div_data npcm8xx_divs[] = {
   391		{NPCM8XX_CLKDIV1, 28, 3, NPCM8XX_CLK_S_ADC, NPCM8XX_CLK_S_PRE_ADC,
   392			CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0,
   393			NPCM8XX_CLK_ADC},
   394		/* bit 30-28 ADCCKDIV*/
   395		{NPCM8XX_CLKDIV1, 26, 2, NPCM8XX_CLK_S_AHB, NPCM8XX_CLK_S_PRE_CLK,
   396			CLK_DIVIDER_READ_ONLY, CLK_IS_CRITICAL, NPCM8XX_CLK_AHB},
   397		/* bit 28-26 CLK4DIV*/
   398		{NPCM8XX_CLKDIV1, 21, 5, NPCM8XX_CLK_S_PRE_ADC,
   399		NPCM8XX_CLK_S_ADC_MUX, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_PRE_ADC},
   400		/* bit 25-21 PRE-ADCCKDIV*/
   401		{NPCM8XX_CLKDIV1, 16, 5, NPCM8XX_CLK_S_UART,
   402		NPCM8XX_CLK_S_UART_MUX, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_UART},
   403		/* bit 20-16 UARTDIV*/
   404		{NPCM8XX_CLKDIV1, 11, 5, NPCM8XX_CLK_S_MMC,
   405		NPCM8XX_CLK_S_SD_MUX, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_MMC},
   406		/* bit 15-11 MMCCKDIV*/
   407		{NPCM8XX_CLKDIV1, 6, 5, NPCM8XX_CLK_S_SPI3,
   408		NPCM8XX_CLK_S_AHB, 0, 0, NPCM8XX_CLK_SPI3},
   409		/* bit 10-6 AHB3CKDIV*/
   410		{NPCM8XX_CLKDIV1, 2, 4, NPCM8XX_CLK_S_PCI,
   411		NPCM8XX_CLK_S_GFX_MUX, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_PCI},
   412		/* bit 5-2 PCICKDIV*/
   413	
   414		{NPCM8XX_CLKDIV2, 30, 2, NPCM8XX_CLK_S_APB4, NPCM8XX_CLK_S_AHB,
   415			CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0,
   416			NPCM8XX_CLK_APB4},
   417		/* bit 31-30 APB4CKDIV*/
   418		{NPCM8XX_CLKDIV2, 28, 2, NPCM8XX_CLK_S_APB3, NPCM8XX_CLK_S_AHB,
   419			CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0,
   420			NPCM8XX_CLK_APB3},
   421		/* bit 29-28 APB3CKDIV*/
   422		{NPCM8XX_CLKDIV2, 26, 2, NPCM8XX_CLK_S_APB2, NPCM8XX_CLK_S_AHB,
   423			CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0,
   424			NPCM8XX_CLK_APB2},
   425		/* bit 28-26 APB2CKDIV*/
   426		{NPCM8XX_CLKDIV2, 24, 2, NPCM8XX_CLK_S_APB1, NPCM8XX_CLK_S_AHB,
   427			CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0,
   428			NPCM8XX_CLK_APB1},
   429		/* bit 25-24 APB1CKDIV*/
   430		{NPCM8XX_CLKDIV2, 22, 2, NPCM8XX_CLK_S_APB5, NPCM8XX_CLK_S_AHB,
   431			CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0,
   432			NPCM8XX_CLK_APB5},
   433		/* bit 23-22 APB5CKDIV*/
   434		{NPCM8XX_CLKDIV2, 16, 5, NPCM8XX_CLK_S_CLKOUT, NPCM8XX_CLK_S_CLKOUT_MUX,
   435			 CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_CLKOUT},
   436		/* bit 20-16 CLKOUTDIV*/
   437		{NPCM8XX_CLKDIV2, 13, 3, NPCM8XX_CLK_S_GFX, NPCM8XX_CLK_S_GFX_MUX,
   438			CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_GFX},
   439		/* bit 15-13 GFXCKDIV*/
   440		{NPCM8XX_CLKDIV2, 8, 5, NPCM8XX_CLK_S_USB_BRIDGE, NPCM8XX_CLK_S_SU_MUX,
   441			CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_SU},
   442		/* bit 12-8 SUCKDIV*/
   443		{NPCM8XX_CLKDIV2, 4, 4, NPCM8XX_CLK_S_USB_HOST, NPCM8XX_CLK_S_SU_MUX,
   444			CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_SU48},
   445		/* bit 8-4 SU48CKDIV*/
   446		{NPCM8XX_CLKDIV2, 0, 4, NPCM8XX_CLK_S_SDHC,
   447		NPCM8XX_CLK_S_SD_MUX, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_SDHC}
   448		,/* bit 3-0 SD1CKDIV*/
   449	
   450		{NPCM8XX_CLKDIV3, 16, 8, NPCM8XX_CLK_S_SPI1,
   451		NPCM8XX_CLK_S_AHB, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_SPI1},
   452		/* bit 23-16 SPI1CKDV*/
   453		{NPCM8XX_CLKDIV3, 11, 5, NPCM8XX_CLK_S_UART2,
   454		NPCM8XX_CLK_S_UART_MUX, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_UART2},
   455		/* bit 15-11 UARTDIV2*/
   456		{NPCM8XX_CLKDIV3, 6, 5, NPCM8XX_CLK_S_SPI0,
   457		NPCM8XX_CLK_S_AHB, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_SPI0},
   458		/* bit 10-6 SPI0CKDV*/
   459		{NPCM8XX_CLKDIV3, 1, 5, NPCM8XX_CLK_S_SPIX,
   460		NPCM8XX_CLK_S_AHB, CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_SPIX},
   461	
   462		/* bit 5-1 SPIXCKDV*/
   463		{NPCM8XX_CLKDIV4, 28, 4, NPCM8XX_CLK_S_RG, NPCM8XX_CLK_S_RG_MUX,
   464		CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_RG},
   465		/* bit 31-28 RGREFDIV*/
   466		{NPCM8XX_CLKDIV4, 12, 4, NPCM8XX_CLK_S_RCP, NPCM8XX_CLK_S_RCP_MUX,
   467		CLK_DIVIDER_READ_ONLY, 0, NPCM8XX_CLK_RCP},
   468		/* bit 15-12 RCPREFDIV*/
   469		{NPCM8XX_THRTL_CNT, 0, 2, NPCM8XX_CLK_S_TH, NPCM8XX_CLK_S_CPU_MUX,
   470		CLK_DIVIDER_READ_ONLY | CLK_DIVIDER_POWER_OF_TWO, 0, NPCM8XX_CLK_TH},
   471		/* bit 1-0 TH_DIV*/
   472	};
   473	
 > 474	static const struct npcm8xx_clk_gate_data npcm8xx_gates[] = {

475 {NPCM8XX_CLKEN1, 31, "smb1-gate", NPCM8XX_CLK_S_APB2, 0},
476 {NPCM8XX_CLKEN1, 30, "smb0-gate", NPCM8XX_CLK_S_APB2, 0},
477 {NPCM8XX_CLKEN1, 29, "smb7-gate", NPCM8XX_CLK_S_APB2, 0},
478 {NPCM8XX_CLKEN1, 28, "smb6-gate", NPCM8XX_CLK_S_APB2, 0},
479 {NPCM8XX_CLKEN1, 27, "adc-gate", NPCM8XX_CLK_S_APB1, 0},
480 {NPCM8XX_CLKEN1, 26, "wdt-gate", NPCM8XX_CLK_S_TIMER, 0},
481 {NPCM8XX_CLKEN1, 25, "usbdev3-gate", NPCM8XX_CLK_S_AHB, 0},
482 {NPCM8XX_CLKEN1, 24, "usbdev6-gate", NPCM8XX_CLK_S_AHB, 0},
483 {NPCM8XX_CLKEN1, 23, "usbdev5-gate", NPCM8XX_CLK_S_AHB, 0},
484 {NPCM8XX_CLKEN1, 22, "usbdev4-gate", NPCM8XX_CLK_S_AHB, 0},
485 {NPCM8XX_CLKEN1, 21, "gmac4-gate", NPCM8XX_CLK_S_AHB, 0},
486 {NPCM8XX_CLKEN1, 20, "timer5_9-gate", NPCM8XX_CLK_S_APB1, 0},
487 {NPCM8XX_CLKEN1, 19, "timer0_4-gate", NPCM8XX_CLK_S_APB1, 0},
488 {NPCM8XX_CLKEN1, 18, "pwmm0-gate", NPCM8XX_CLK_S_APB3, 0},
489 {NPCM8XX_CLKEN1, 17, "huart-gate", NPCM8XX_CLK_S_UART, 0},
490 {NPCM8XX_CLKEN1, 16, "smb5-gate", NPCM8XX_CLK_S_APB2, 0},
491 {NPCM8XX_CLKEN1, 15, "smb4-gate", NPCM8XX_CLK_S_APB2, 0},
492 {NPCM8XX_CLKEN1, 14, "smb3-gate", NPCM8XX_CLK_S_APB2, 0},
493 {NPCM8XX_CLKEN1, 13, "smb2-gate", NPCM8XX_CLK_S_APB2, 0},
494 {NPCM8XX_CLKEN1, 12, "mc-gate", NPCM8XX_CLK_S_MC, 0},
495 {NPCM8XX_CLKEN1, 11, "uart01-gate", NPCM8XX_CLK_S_APB1, 0},
496 {NPCM8XX_CLKEN1, 10, "aes-gate", NPCM8XX_CLK_S_AHB, 0},
497 {NPCM8XX_CLKEN1, 9, "peci-gate", NPCM8XX_CLK_S_APB3, 0},
498 {NPCM8XX_CLKEN1, 8, "usbdev2-gate", NPCM8XX_CLK_S_AHB, 0},
499 {NPCM8XX_CLKEN1, 7, "uart23-gate", NPCM8XX_CLK_S_APB1, 0},
500 {NPCM8XX_CLKEN1, 6, "gmac3-gate", NPCM8XX_CLK_S_AHB, 0},
501 {NPCM8XX_CLKEN1, 5, "usbdev1-gate", NPCM8XX_CLK_S_AHB, 0},
502 {NPCM8XX_CLKEN1, 4, "shm-gate", NPCM8XX_CLK_S_AHB, 0},
503 {NPCM8XX_CLKEN1, 3, "gdma0-gate", NPCM8XX_CLK_S_AHB, 0},
504 {NPCM8XX_CLKEN1, 2, "kcs-gate", NPCM8XX_CLK_S_APB1, 0},
505 {NPCM8XX_CLKEN1, 1, "spi3-gate", NPCM8XX_CLK_S_AHB, 0},
506 {NPCM8XX_CLKEN1, 0, "spi0-gate", NPCM8XX_CLK_S_AHB, 0},
507
508 {NPCM8XX_CLKEN2, 31, "cp-gate", NPCM8XX_CLK_S_AHB, 0},
509 {NPCM8XX_CLKEN2, 30, "tock-gate", NPCM8XX_CLK_S_TOCK, 0},
510 /* bit 29 is reserved */
511 {NPCM8XX_CLKEN2, 28, "gmac1-gate", NPCM8XX_CLK_S_AHB, 0},
512 {NPCM8XX_CLKEN2, 27, "usbif-gate", NPCM8XX_CLK_S_USBIF, 0},
513 {NPCM8XX_CLKEN2, 26, "usbhost1-gate", NPCM8XX_CLK_S_AHB, 0},
514 {NPCM8XX_CLKEN2, 25, "gmac2-gate", NPCM8XX_CLK_S_AHB, 0},
515 {NPCM8XX_CLKEN2, 24, "spi1-gate", NPCM8XX_CLK_S_APB5, 0},
516 {NPCM8XX_CLKEN2, 23, "pspi2-gate", NPCM8XX_CLK_S_APB5, 0},
517 /* bit 22 is reserved */
518 {NPCM8XX_CLKEN2, 21, "3des-gate", NPCM8XX_CLK_S_AHB, 0},
519 {NPCM8XX_CLKEN2, 20, "bt-gate", NPCM8XX_CLK_S_APB3, 0},
520 {NPCM8XX_CLKEN2, 19, "siox2-gate", NPCM8XX_CLK_S_APB3, 0},
521 {NPCM8XX_CLKEN2, 18, "siox1-gate", NPCM8XX_CLK_S_APB3, 0},
522 {NPCM8XX_CLKEN2, 17, "viruart2-gate", NPCM8XX_CLK_S_APB5, 0},
523 {NPCM8XX_CLKEN2, 16, "viruart1-gate", NPCM8XX_CLK_S_APB5, 0},
524 /* bit 15 is reserved */
525 {NPCM8XX_CLKEN2, 14, "vcd-gate", NPCM8XX_CLK_S_AHB, 0},
526 {NPCM8XX_CLKEN2, 13, "ece-gate", NPCM8XX_CLK_S_AHB, 0},
527 {NPCM8XX_CLKEN2, 12, "vdma-gate", NPCM8XX_CLK_S_AHB, 0},
528 {NPCM8XX_CLKEN2, 11, "ahbpcibrg-gate", NPCM8XX_CLK_S_AHB, 0},
529 {NPCM8XX_CLKEN2, 10, "gfxsys-gate", NPCM8XX_CLK_S_APB1, 0},
530 //{NPCM8XX_CLKEN2, 9, "sdhc-gate", NPCM8XX_CLK_S_AHB, 0},
531 /* bit 9 is reserved */
532 {NPCM8XX_CLKEN2, 8, "mmc-gate", NPCM8XX_CLK_S_AHB, 0},
533 {NPCM8XX_CLKEN2, 7, "mft7-gate", NPCM8XX_CLK_S_APB4, 0},
534 {NPCM8XX_CLKEN2, 6, "mft6-gate", NPCM8XX_CLK_S_APB4, 0},
535 {NPCM8XX_CLKEN2, 5, "mft5-gate", NPCM8XX_CLK_S_APB4, 0},
536 {NPCM8XX_CLKEN2, 4, "mft4-gate", NPCM8XX_CLK_S_APB4, 0},
537 {NPCM8XX_CLKEN2, 3, "mft3-gate", NPCM8XX_CLK_S_APB4, 0},
538 {NPCM8XX_CLKEN2, 2, "mft2-gate", NPCM8XX_CLK_S_APB4, 0},
539 {NPCM8XX_CLKEN2, 1, "mft1-gate", NPCM8XX_CLK_S_APB4, 0},
540 {NPCM8XX_CLKEN2, 0, "mft0-gate", NPCM8XX_CLK_S_APB4, 0},
541
542 {NPCM8XX_CLKEN3, 31, "gpiom7-gate", NPCM8XX_CLK_S_APB1, 0},
543 {NPCM8XX_CLKEN3, 30, "gpiom6-gate", NPCM8XX_CLK_S_APB1, 0},
544 {NPCM8XX_CLKEN3, 29, "gpiom5-gate", NPCM8XX_CLK_S_APB1, 0},
545 {NPCM8XX_CLKEN3, 28, "gpiom4-gate", NPCM8XX_CLK_S_APB1, 0},
546 {NPCM8XX_CLKEN3, 27, "gpiom3-gate", NPCM8XX_CLK_S_APB1, 0},
547 {NPCM8XX_CLKEN3, 26, "gpiom2-gate", NPCM8XX_CLK_S_APB1, 0},
548 {NPCM8XX_CLKEN3, 25, "gpiom1-gate", NPCM8XX_CLK_S_APB1, 0},
549 {NPCM8XX_CLKEN3, 24, "gpiom0-gate", NPCM8XX_CLK_S_APB1, 0},
550 {NPCM8XX_CLKEN3, 23, "espi-gate", NPCM8XX_CLK_S_APB2, 0},
551 {NPCM8XX_CLKEN3, 22, "smb11-gate", NPCM8XX_CLK_S_APB2, 0},
552 {NPCM8XX_CLKEN3, 21, "smb10-gate", NPCM8XX_CLK_S_APB2, 0},
553 {NPCM8XX_CLKEN3, 20, "smb9-gate", NPCM8XX_CLK_S_APB2, 0},
554 {NPCM8XX_CLKEN3, 19, "smb8-gate", NPCM8XX_CLK_S_APB2, 0},
555 {NPCM8XX_CLKEN3, 18, "smb15-gate", NPCM8XX_CLK_S_APB2, 0},
556 {NPCM8XX_CLKEN3, 17, "rng-gate", NPCM8XX_CLK_S_APB1, 0},
557 {NPCM8XX_CLKEN3, 16, "timer10_14-gate", NPCM8XX_CLK_S_APB1, 0},
558 {NPCM8XX_CLKEN3, 15, "pcirc-gate", NPCM8XX_CLK_S_AHB, 0},
559 {NPCM8XX_CLKEN3, 14, "sececc-gate", NPCM8XX_CLK_S_AHB, 0},
560 {NPCM8XX_CLKEN3, 13, "sha-gate", NPCM8XX_CLK_S_AHB, 0},
561 {NPCM8XX_CLKEN3, 12, "smb14-gate", NPCM8XX_CLK_S_APB2, 0},
562 {NPCM8XX_CLKEN3, 11, "gdma2-gate", NPCM8XX_CLK_S_AHB, 0},
563 {NPCM8XX_CLKEN3, 10, "gdma1-gate", NPCM8XX_CLK_S_AHB, 0},
564 {NPCM8XX_CLKEN3, 9, "pcimbx-gate", NPCM8XX_CLK_S_AHB, 0},
565 /* bit 8 is reserved */
566 {NPCM8XX_CLKEN3, 7, "usbdev9-gate", NPCM8XX_CLK_S_AHB, 0},
567 {NPCM8XX_CLKEN3, 6, "usbdev8-gate", NPCM8XX_CLK_S_AHB, 0},
568 {NPCM8XX_CLKEN3, 5, "usbdev7-gate", NPCM8XX_CLK_S_AHB, 0},
569 {NPCM8XX_CLKEN3, 4, "usbdev0-gate", NPCM8XX_CLK_S_AHB, 0},
570 {NPCM8XX_CLKEN3, 3, "smb13-gate", NPCM8XX_CLK_S_APB2, 0},
571 {NPCM8XX_CLKEN3, 2, "spix-gate", NPCM8XX_CLK_S_AHB, 0},
572 {NPCM8XX_CLKEN3, 1, "smb12-gate", NPCM8XX_CLK_S_APB2, 0},
573 {NPCM8XX_CLKEN3, 0, "pwmm1-gate", NPCM8XX_CLK_S_APB3, 0},
574
575 {NPCM8XX_CLKEN4, 31, "usbhost2-gate", NPCM8XX_CLK_S_AHB, 0},
576 {NPCM8XX_CLKEN4, 30, "jtm2-gate", NPCM8XX_CLK_S_APB5, 0},
577 {NPCM8XX_CLKEN4, 29, "jtm1-gate", NPCM8XX_CLK_S_APB5, 0},
578 {NPCM8XX_CLKEN4, 28, "pwmm2-gate", NPCM8XX_CLK_S_APB3, 0},
579 /* bit 27 is reserved */
580 /* bit 26 is reserved */
581 /* bit 25 is reserved */
582 {NPCM8XX_CLKEN4, 24, "smb26-gate", NPCM8XX_CLK_S_APB19, 0},
583 {NPCM8XX_CLKEN4, 23, "smb25-gate", NPCM8XX_CLK_S_APB19, 0},
584 {NPCM8XX_CLKEN4, 22, "smb24-gate", NPCM8XX_CLK_S_APB19, 0},
585 /* bit 21 is reserved */
586 /* bit 20 is reserved */
587 {NPCM8XX_CLKEN4, 19, "pcimbx2-gate", NPCM8XX_CLK_S_AHB, 0},
588 {NPCM8XX_CLKEN4, 18, "uart6-gate", NPCM8XX_CLK_S_APB1, 0},
589 {NPCM8XX_CLKEN4, 17, "uart5-gate", NPCM8XX_CLK_S_APB1, 0},
590 {NPCM8XX_CLKEN4, 16, "uart4-gate", NPCM8XX_CLK_S_APB1, 0},
591 /* bit 15 is reserved */
592 /* bit 14 is reserved */
593 {NPCM8XX_CLKEN4, 13, "i3c5-gate", NPCM8XX_CLK_S_APB19, 0},
594 {NPCM8XX_CLKEN4, 12, "i3c4-gate", NPCM8XX_CLK_S_APB19, 0},
595 {NPCM8XX_CLKEN4, 11, "i3c3-gate", NPCM8XX_CLK_S_APB19, 0},
596 {NPCM8XX_CLKEN4, 10, "i3c2-gate", NPCM8XX_CLK_S_APB19, 0},
597 {NPCM8XX_CLKEN4, 9, "i3c1-gate", NPCM8XX_CLK_S_APB19, 0},
598 {NPCM8XX_CLKEN4, 8, "i3c0-gate", NPCM8XX_CLK_S_APB19, 0},
599 {NPCM8XX_CLKEN4, 7, "smb23-gate", NPCM8XX_CLK_S_APB19, 0},
600 {NPCM8XX_CLKEN4, 6, "smb22-gate", NPCM8XX_CLK_S_APB19, 0},
601 {NPCM8XX_CLKEN4, 5, "smb21-gate", NPCM8XX_CLK_S_APB19, 0},
602 {NPCM8XX_CLKEN4, 4, "smb20-gate", NPCM8XX_CLK_S_APB19, 0},
603 {NPCM8XX_CLKEN4, 3, "smb19-gate", NPCM8XX_CLK_S_APB19, 0},
604 {NPCM8XX_CLKEN4, 2, "smb18-gate", NPCM8XX_CLK_S_APB19, 0},
605 {NPCM8XX_CLKEN4, 1, "smb17-gate", NPCM8XX_CLK_S_APB19, 0},
606 {NPCM8XX_CLKEN4, 0, "smb16-gate", NPCM8XX_CLK_S_APB19, 0},
607

Signature · 2 lines
0-DAY CI Kernel Test Service
https://01.org/lkp
author maintainer
#14 lore raw

PATCH v3 7/18 dt-bindings: reset: npcm: add GCR syscon property

In reply to Tomer Maimon

Describe syscon property that handles general control registers (GCR) in Nuvoton BMC NPCM reset driver.

---
 .../devicetree/bindings/reset/nuvoton,npcm750-reset.yaml     | 5 +++++
 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +5 -0
index fa5e4ea6400e..7ba3a6ff82ed 100644
@@ -19,6 +19,9 @@ properties:
   '#reset-cells':
     const: 2
 
+  nuvoton,sysgcr:
+    description: a phandle to access GCR registers.
+
   nuvoton,sw-reset-number:
     $ref: /schemas/types.yaml#/definitions/uint32
     minimum: 1
@@ -31,6 +34,7 @@ required:
   - compatible
   - reg
   - '#reset-cells'
+  - nuvoton,sysgcr
 
 additionalProperties: false
 
@@ -41,6 +45,7 @@ examples:
         compatible = "nuvoton,npcm750-reset";
         reg = <0xf0801000 0x70>;
         #reset-cells = <2>;
+        nuvoton,sysgcr = <&gcr>;
         nuvoton,sw-reset-number = <2>;
     };
 
Signature · 1 line
2.33.0
#15 lore raw

Re: [PATCH v3 07/18] dt-bindings: reset: npcm: add GCR syscon property

Quoted 13 lines · Tomer Maimon

Describe syscon property that handles general control registers (GCR) in Nuvoton BMC NPCM reset driver.

---
 .../devicetree/bindings/reset/nuvoton,npcm750-reset.yaml     | 5 +++++
 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +0 -0
index fa5e4ea6400e..7ba3a6ff82ed 100644

Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml properties: · line 23

Quoted 5 lines
Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +2 -0
@@ -19,6 +19,9 @@ properties:
   '#reset-cells':
     const: 2
 
+  nuvoton,sysgcr:
+    description: a phandle to access GCR registers.

That's not valid. You miss here ref. My comment was to skip quotes and you removed entire ref.

Best regards,
Krzysztof

author maintainer
#16 lore raw

Re: [PATCH v3 07/18] dt-bindings: reset: npcm: add GCR syscon property

Hi Krzysztof,

Quoted 18 lines · Krzysztof Kozlowski
Quoted 16 lines · Tomer Maimon

Describe syscon property that handles general control registers (GCR) in Nuvoton BMC NPCM reset driver.

---
 .../devicetree/bindings/reset/nuvoton,npcm750-reset.yaml     | 5 +++++
 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +0 -0
index fa5e4ea6400e..7ba3a6ff82ed 100644
@@ -19,6 +19,9 @@ properties:
   '#reset-cells':
     const: 2
 
Quoted 5 lines

Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml properties: · line 23

Quoted 2 lines
Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +2 -0
+  nuvoton,sysgcr:
+    description: a phandle to access GCR registers.

That's not valid. You miss here ref. My comment was to skip quotes and you removed entire ref.

Will add the ref next version.

Quoted 3 lines

Best regards,
Krzysztof

Best regards,

Tomer

author maintainer
#17 lore raw

PATCH v3 8/18 ARM: dts: nuvoton: add reset syscon property

In reply to Tomer Maimon

Add nuvoton,sysgcr syscon property to the reset node to handle the general control registers.

---
 arch/arm/boot/dts/nuvoton-common-npcm7xx.dtsi | 1 +
 1 file changed, 1 insertion(+)
arch/arm/boot/dts/nuvoton-common-npcm7xx.dtsi +1 -0
index 3696980a3da1..8a2f29016291 100644
@@ -110,6 +110,7 @@ rstc: rstc@f0801000 {
 			compatible = "nuvoton,npcm750-reset";
 			reg = <0xf0801000 0x70>;
 			#reset-cells = <2>;
+			nuvoton,sysgcr = <&gcr>;
 		};
 
 		clk: clock-controller@f0801000 {
Signature · 1 line
2.33.0
author maintainer
#18 lore raw

PATCH v3 9/18 reset: npcm: using syscon instead of device data

In reply to Tomer Maimon

Using syscon device tree property instead of device data to handle the NPCM general control registers.

In case the syscon not found the code still search for nuvoton,npcm750-gcr to support DTS backward compatibility.

---
 drivers/reset/reset-npcm.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/reset/reset-npcm.c +8 -9
index 2ea4d3136e15..431ff2b602c5 100644
@@ -138,8 +138,7 @@ static int npcm_reset_xlate(struct reset_controller_dev *rcdev,
 }
 
 static const struct of_device_id npcm_rc_match[] = {
-	{ .compatible = "nuvoton,npcm750-reset",
-		.data = (void *)"nuvoton,npcm750-gcr" },
+	{ .compatible = "nuvoton,npcm750-reset"},
 	{ }
 };
 
@@ -155,15 +154,15 @@ static int npcm_usb_reset(struct platform_device *pdev, struct npcm_rc_data *rc)
 	u32 ipsrst1_bits = 0;
 	u32 ipsrst2_bits = NPCM_IPSRST2_USB_HOST;
 	u32 ipsrst3_bits = 0;
-	const char *gcr_dt;
 
-	gcr_dt = (const char *)
-	of_match_device(dev->driver->of_match_table, dev)->data;
-
-	gcr_regmap = syscon_regmap_lookup_by_compatible(gcr_dt);
+	gcr_regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "nuvoton,sysgcr");
 	if (IS_ERR(gcr_regmap)) {
-		dev_err(&pdev->dev, "Failed to find %s\n", gcr_dt);
-		return PTR_ERR(gcr_regmap);
+		dev_warn(&pdev->dev, "Failed to find nuvoton,sysgcr search for nuvoton,npcm750-gcr for Poleg backward compatibility");
+		gcr_regmap = syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr");
+		if (IS_ERR(gcr_regmap)) {
+			dev_err(&pdev->dev, "Failed to find nuvoton,npcm750-gcr");
+			return PTR_ERR(gcr_regmap);
+		}
 	}
 
 	/* checking which USB device is enabled */
Signature · 1 line
2.33.0
author maintainer
#19 lore raw

PATCH v3 10/18 dt-bindings: reset: npcm: Add support for NPCM8XX

In reply to Tomer Maimon

Add binding document and device tree binding constants for Nuvoton BMC NPCM8XX reset controller.

---
 .../devicetree/bindings/reset/nuvoton,npcm750-reset.yaml      | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +3 -1
index 7ba3a6ff82ed..7ad2b8c592ee 100644
@@ -11,7 +11,9 @@ maintainers:
 
 properties:
   compatible:
-    const: nuvoton,npcm750-reset
+    enum:
+      - nuvoton,npcm750-reset        # Poleg NPCM7XX SoC
+      - nuvoton,npcm845-reset        # Arbel NPCM8XX SoC
 
   reg:
     maxItems: 1
Signature · 1 line
2.33.0
author maintainer
#21 lore raw

PATCH v3 11/18 reset: npcm: Add NPCM8XX support

In reply to Tomer Maimon

Updated the NPCM reset driver to add
support for Nuvoton BMC NPCM8XX SoC.
As part of adding NPCM8XX support
- Add NPCM8XX specific compatible string.
- Add NPCM8XX USB reset.
- Add data to handle architecture-specific reset parameters.
- Some of the Reset Id and number of resets are different from NPCM7XX.

---
 drivers/reset/reset-npcm.c | 205 +++++++++++++++++++++++++++++++------
 1 file changed, 172 insertions(+), 33 deletions(-)
drivers/reset/reset-npcm.c +172 -33
index 431ff2b602c5..e4801f2950fd 100644
@@ -17,13 +17,20 @@
 
 /* NPCM7xx GCR registers */
 #define NPCM_MDLR_OFFSET	0x7C
-#define NPCM_MDLR_USBD0		BIT(9)
-#define NPCM_MDLR_USBD1		BIT(8)
-#define NPCM_MDLR_USBD2_4	BIT(21)
-#define NPCM_MDLR_USBD5_9	BIT(22)
+#define NPCM7XX_MDLR_USBD0	BIT(9)
+#define NPCM7XX_MDLR_USBD1	BIT(8)
+#define NPCM7XX_MDLR_USBD2_4	BIT(21)
+#define NPCM7XX_MDLR_USBD5_9	BIT(22)
+
+/* NPCM8xx MDLR bits */
+#define NPCM8XX_MDLR_USBD0_3	BIT(9)
+#define NPCM8XX_MDLR_USBD4_7	BIT(22)
+#define NPCM8XX_MDLR_USBD8	BIT(24)
+#define NPCM8XX_MDLR_USBD9	BIT(21)
 
 #define NPCM_USB1PHYCTL_OFFSET	0x140
 #define NPCM_USB2PHYCTL_OFFSET	0x144
+#define NPCM_USB3PHYCTL_OFFSET	0x148
 #define NPCM_USBXPHYCTL_RS	BIT(28)
 
 /* NPCM7xx Reset registers */
@@ -49,12 +56,38 @@
 #define NPCM_IPSRST3_USBPHY1	BIT(24)
 #define NPCM_IPSRST3_USBPHY2	BIT(25)
 
+#define NPCM_IPSRST4		0x74
+#define NPCM_IPSRST4_USBPHY3	BIT(25)
+#define NPCM_IPSRST4_USB_HOST2	BIT(31)
+
 #define NPCM_RC_RESETS_PER_REG	32
 #define NPCM_MASK_RESETS	GENMASK(4, 0)
 
+enum {
+	BMC_NPCM7XX = 0,
+	BMC_NPCM8XX,
+};
+
+static const u32 npxm7xx_ipsrst[] = {NPCM_IPSRST1, NPCM_IPSRST2, NPCM_IPSRST3};
+static const u32 npxm8xx_ipsrst[] = {NPCM_IPSRST1, NPCM_IPSRST2, NPCM_IPSRST3,
+	NPCM_IPSRST4};
+
+struct npcm_reset_info {
+	u32 bmc_id;
+	u32 num_ipsrst;
+	const u32 *ipsrst;
+};
+
+static const struct npcm_reset_info npxm7xx_reset_info[] = {
+	{.bmc_id = BMC_NPCM7XX, .num_ipsrst = 3, .ipsrst = npxm7xx_ipsrst}};
+static const struct npcm_reset_info npxm8xx_reset_info[] = {
+	{.bmc_id = BMC_NPCM8XX, .num_ipsrst = 4, .ipsrst = npxm8xx_ipsrst}};
+
 struct npcm_rc_data {
 	struct reset_controller_dev rcdev;
 	struct notifier_block restart_nb;
+	const struct npcm_reset_info *info;
+	struct regmap *gcr_regmap;
 	u32 sw_reset_number;
 	void __iomem *base;
 	spinlock_t lock;
@@ -120,14 +153,24 @@ static int npcm_rc_status(struct reset_controller_dev *rcdev,
 static int npcm_reset_xlate(struct reset_controller_dev *rcdev,
 			    const struct of_phandle_args *reset_spec)
 {
+	struct npcm_rc_data *rc = to_rc_data(rcdev);
 	unsigned int offset, bit;
+	bool offset_found = false;
+	int off_num;
 
 	offset = reset_spec->args[0];
-	if (offset != NPCM_IPSRST1 && offset != NPCM_IPSRST2 &&
-	    offset != NPCM_IPSRST3) {
+	for (off_num = 0 ; off_num < rc->info->num_ipsrst ; off_num++) {
+		if (offset == rc->info->ipsrst[off_num]) {
+			offset_found = true;
+			break;
+		}
+	}
+
+	if (!offset_found) {
 		dev_err(rcdev->dev, "Error reset register (0x%x)\n", offset);
 		return -EINVAL;
 	}
+
 	bit = reset_spec->args[1];
 	if (bit >= NPCM_RC_RESETS_PER_REG) {
 		dev_err(rcdev->dev, "Error reset number (%d)\n", bit);
@@ -138,44 +181,29 @@ static int npcm_reset_xlate(struct reset_controller_dev *rcdev,
 }
 
 static const struct of_device_id npcm_rc_match[] = {
-	{ .compatible = "nuvoton,npcm750-reset"},
+	{ .compatible = "nuvoton,npcm750-reset", .data = &npxm7xx_reset_info},
+	{ .compatible = "nuvoton,npcm845-reset", .data = &npxm8xx_reset_info},
 	{ }
 };
 
-/*
- *  The following procedure should be observed in USB PHY, USB device and
- *  USB host initialization at BMC boot
- */
-static int npcm_usb_reset(struct platform_device *pdev, struct npcm_rc_data *rc)
+static void npcm_usb_reset_npcm7xx(struct npcm_rc_data *rc)
 {
 	u32 mdlr, iprst1, iprst2, iprst3;
-	struct device *dev = &pdev->dev;
-	struct regmap *gcr_regmap;
 	u32 ipsrst1_bits = 0;
 	u32 ipsrst2_bits = NPCM_IPSRST2_USB_HOST;
 	u32 ipsrst3_bits = 0;
 
-	gcr_regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "nuvoton,sysgcr");
-	if (IS_ERR(gcr_regmap)) {
-		dev_warn(&pdev->dev, "Failed to find nuvoton,sysgcr search for nuvoton,npcm750-gcr for Poleg backward compatibility");
-		gcr_regmap = syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr");
-		if (IS_ERR(gcr_regmap)) {
-			dev_err(&pdev->dev, "Failed to find nuvoton,npcm750-gcr");
-			return PTR_ERR(gcr_regmap);
-		}
-	}
-
 	/* checking which USB device is enabled */
-	regmap_read(gcr_regmap, NPCM_MDLR_OFFSET, &mdlr);
-	if (!(mdlr & NPCM_MDLR_USBD0))
+	regmap_read(rc->gcr_regmap, NPCM_MDLR_OFFSET, &mdlr);
+	if (!(mdlr & NPCM7XX_MDLR_USBD0))
 		ipsrst3_bits |= NPCM_IPSRST3_USBD0;
-	if (!(mdlr & NPCM_MDLR_USBD1))
+	if (!(mdlr & NPCM7XX_MDLR_USBD1))
 		ipsrst1_bits |= NPCM_IPSRST1_USBD1;
-	if (!(mdlr & NPCM_MDLR_USBD2_4))
+	if (!(mdlr & NPCM7XX_MDLR_USBD2_4))
 		ipsrst1_bits |= (NPCM_IPSRST1_USBD2 |
 				 NPCM_IPSRST1_USBD3 |
 				 NPCM_IPSRST1_USBD4);
-	if (!(mdlr & NPCM_MDLR_USBD0)) {
+	if (!(mdlr & NPCM7XX_MDLR_USBD0)) {
 		ipsrst1_bits |= (NPCM_IPSRST1_USBD5 |
 				 NPCM_IPSRST1_USBD6);
 		ipsrst3_bits |= (NPCM_IPSRST3_USBD7 |
@@ -198,9 +226,9 @@ static int npcm_usb_reset(struct platform_device *pdev, struct npcm_rc_data *rc)
 	writel(iprst3, rc->base + NPCM_IPSRST3);
 
 	/* clear USB PHY RS bit */
-	regmap_update_bits(gcr_regmap, NPCM_USB1PHYCTL_OFFSET,
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB1PHYCTL_OFFSET,
 			   NPCM_USBXPHYCTL_RS, 0);
-	regmap_update_bits(gcr_regmap, NPCM_USB2PHYCTL_OFFSET,
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB2PHYCTL_OFFSET,
 			   NPCM_USBXPHYCTL_RS, 0);
 
 	/* deassert reset USB PHY */
@@ -210,19 +238,130 @@ static int npcm_usb_reset(struct platform_device *pdev, struct npcm_rc_data *rc)
 	udelay(50);
 
 	/* set USB PHY RS bit */
-	regmap_update_bits(gcr_regmap, NPCM_USB1PHYCTL_OFFSET,
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB1PHYCTL_OFFSET,
+			   NPCM_USBXPHYCTL_RS, NPCM_USBXPHYCTL_RS);
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB2PHYCTL_OFFSET,
+			   NPCM_USBXPHYCTL_RS, NPCM_USBXPHYCTL_RS);
+
+	/* deassert reset USB devices*/
+	iprst1 &= ~ipsrst1_bits;
+	iprst2 &= ~ipsrst2_bits;
+	iprst3 &= ~ipsrst3_bits;
+
+	writel(iprst1, rc->base + NPCM_IPSRST1);
+	writel(iprst2, rc->base + NPCM_IPSRST2);
+	writel(iprst3, rc->base + NPCM_IPSRST3);
+}
+
+static void npcm_usb_reset_npcm8xx(struct npcm_rc_data *rc)
+{
+	u32 mdlr, iprst1, iprst2, iprst3, iprst4;
+	u32 ipsrst1_bits = 0;
+	u32 ipsrst2_bits = NPCM_IPSRST2_USB_HOST;
+	u32 ipsrst3_bits = 0;
+	u32 ipsrst4_bits = NPCM_IPSRST4_USB_HOST2 | NPCM_IPSRST4_USBPHY3;
+
+	/* checking which USB device is enabled */
+	regmap_read(rc->gcr_regmap, NPCM_MDLR_OFFSET, &mdlr);
+	if (!(mdlr & NPCM8XX_MDLR_USBD0_3)) {
+		ipsrst3_bits |= NPCM_IPSRST3_USBD0;
+		ipsrst1_bits |= (NPCM_IPSRST1_USBD1 |
+				 NPCM_IPSRST1_USBD2 |
+				 NPCM_IPSRST1_USBD3);
+	}
+	if (!(mdlr & NPCM8XX_MDLR_USBD4_7)) {
+		ipsrst1_bits |= (NPCM_IPSRST1_USBD4 |
+				 NPCM_IPSRST1_USBD5 |
+				 NPCM_IPSRST1_USBD6);
+		ipsrst3_bits |= NPCM_IPSRST3_USBD7;
+	}
+
+	if (!(mdlr & NPCM8XX_MDLR_USBD8))
+		ipsrst3_bits |= NPCM_IPSRST3_USBD8;
+	if (!(mdlr & NPCM8XX_MDLR_USBD9))
+		ipsrst3_bits |= NPCM_IPSRST3_USBD9;
+
+	/* assert reset USB PHY and USB devices */
+	iprst1 = readl(rc->base + NPCM_IPSRST1);
+	iprst2 = readl(rc->base + NPCM_IPSRST2);
+	iprst3 = readl(rc->base + NPCM_IPSRST3);
+	iprst4 = readl(rc->base + NPCM_IPSRST4);
+
+	iprst1 |= ipsrst1_bits;
+	iprst2 |= ipsrst2_bits;
+	iprst3 |= (ipsrst3_bits | NPCM_IPSRST3_USBPHY1 |
+		   NPCM_IPSRST3_USBPHY2);
+	iprst2 |= ipsrst4_bits;
+
+	writel(iprst1, rc->base + NPCM_IPSRST1);
+	writel(iprst2, rc->base + NPCM_IPSRST2);
+	writel(iprst3, rc->base + NPCM_IPSRST3);
+	writel(iprst4, rc->base + NPCM_IPSRST4);
+
+	/* clear USB PHY RS bit */
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB1PHYCTL_OFFSET,
+			   NPCM_USBXPHYCTL_RS, 0);
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB2PHYCTL_OFFSET,
+			   NPCM_USBXPHYCTL_RS, 0);
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB3PHYCTL_OFFSET,
+			   NPCM_USBXPHYCTL_RS, 0);
+
+	/* deassert reset USB PHY */
+	iprst3 &= ~(NPCM_IPSRST3_USBPHY1 | NPCM_IPSRST3_USBPHY2);
+	writel(iprst3, rc->base + NPCM_IPSRST3);
+	iprst4 &= ~NPCM_IPSRST4_USBPHY3;
+	writel(iprst4, rc->base + NPCM_IPSRST4);
+
+	/* set USB PHY RS bit */
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB1PHYCTL_OFFSET,
 			   NPCM_USBXPHYCTL_RS, NPCM_USBXPHYCTL_RS);
-	regmap_update_bits(gcr_regmap, NPCM_USB2PHYCTL_OFFSET,
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB2PHYCTL_OFFSET,
+			   NPCM_USBXPHYCTL_RS, NPCM_USBXPHYCTL_RS);
+	regmap_update_bits(rc->gcr_regmap, NPCM_USB3PHYCTL_OFFSET,
 			   NPCM_USBXPHYCTL_RS, NPCM_USBXPHYCTL_RS);
 
 	/* deassert reset USB devices*/
 	iprst1 &= ~ipsrst1_bits;
 	iprst2 &= ~ipsrst2_bits;
 	iprst3 &= ~ipsrst3_bits;
+	iprst4 &= ~ipsrst4_bits;
 
 	writel(iprst1, rc->base + NPCM_IPSRST1);
 	writel(iprst2, rc->base + NPCM_IPSRST2);
 	writel(iprst3, rc->base + NPCM_IPSRST3);
+	writel(iprst4, rc->base + NPCM_IPSRST4);
+}
+
+/*
+ *  The following procedure should be observed in USB PHY, USB device and
+ *  USB host initialization at BMC boot
+ */
+static int npcm_usb_reset(struct platform_device *pdev, struct npcm_rc_data *rc)
+{
+	struct device *dev = &pdev->dev;
+
+	rc->gcr_regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "nuvoton,sysgcr");
+	if (IS_ERR(rc->gcr_regmap)) {
+		dev_warn(&pdev->dev, "Failed to find nuvoton,sysgcr search for nuvoton,npcm750-gcr for Poleg backward compatibility");
+		rc->gcr_regmap = syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr");
+		if (IS_ERR(rc->gcr_regmap)) {
+			dev_err(&pdev->dev, "Failed to find nuvoton,npcm750-gcr");
+			return PTR_ERR(rc->gcr_regmap);
+		}
+	}
+
+	rc->info = (const struct npcm_reset_info *)
+			of_match_device(dev->driver->of_match_table, dev)->data;
+	switch (rc->info->bmc_id) {
+	case BMC_NPCM7XX:
+		npcm_usb_reset_npcm7xx(rc);
+		break;
+	case BMC_NPCM8XX:
+		npcm_usb_reset_npcm8xx(rc);
+		break;
+	default:
+		return -ENODEV;
+	}
 
 	return 0;
 }
Signature · 1 line
2.33.0
author maintainer
#22 lore raw

PATCH v3 12/18 dt-bindings: arm: npcm: Add maintainer

In reply to Tomer Maimon

Add Tomer Maimon to the maintainers list.

---
 Documentation/devicetree/bindings/arm/npcm/npcm.yaml        | 1 +
 Documentation/devicetree/bindings/arm/npcm/nuvoton,gcr.yaml | 1 +
 2 files changed, 2 insertions(+)
Documentation/devicetree/bindings/arm/npcm/npcm.yaml +1 -0
index 95e51378089c..ea9c3103761d 100644
@@ -8,6 +8,7 @@ title: NPCM Platforms Device Tree Bindings
 
 maintainers:
   - Jonathan Neuschäfer <[email protected]>
+  - Tomer Maimon <[email protected]>
 
 properties:
   $nodename:
Documentation/devicetree/bindings/arm/npcm/nuvoton,gcr.yaml +1 -0
index fcb211add7d3..aad7c85e787f 100644
@@ -8,6 +8,7 @@ title: Global Control Registers block in Nuvoton SoCs
 
 maintainers:
   - Jonathan Neuschäfer <[email protected]>
+  - Tomer Maimon <[email protected]>
 
 description:
   The Global Control Registers (GCR) are a block of registers in Nuvoton SoCs
Signature · 1 line
2.33.0
author maintainer
#23 lore raw

PATCH v3 13/18 dt-bindings: arm: npcm: Add nuvoton,npcm845 compatible string

In reply to Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 SoC and a board specific device tree for the NPCM845 (Arbel) evaluation board.

---
 Documentation/devicetree/bindings/arm/npcm/npcm.yaml | 6 ++++++
 1 file changed, 6 insertions(+)
Documentation/devicetree/bindings/arm/npcm/npcm.yaml +6 -0
index ea9c3103761d..43409e5721d5 100644
@@ -27,4 +27,10 @@ properties:
               - nuvoton,npcm750-evb         # NPCM750 evaluation board
           - const: nuvoton,npcm750
 
+      - description: NPCM845 based boards
+        items:
+          - enum:
+              - nuvoton,npcm845-evb         # NPCM845 evaluation board
+          - const: nuvoton,npcm845
+
 additionalProperties: true
Signature · 1 line
2.33.0
author maintainer
#24 lore raw

PATCH v3 14/18 dt-bindings: arm: npcm: Add nuvoton,npcm845 GCR compatible string

In reply to Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 global control registers.

---
 Documentation/devicetree/bindings/arm/npcm/nuvoton,gcr.yaml | 1 +
 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/arm/npcm/nuvoton,gcr.yaml +1 -0
index aad7c85e787f..94e72f25b331 100644
@@ -21,6 +21,7 @@ properties:
       - enum:
           - nuvoton,wpcm450-gcr
           - nuvoton,npcm750-gcr
+          - nuvoton,npcm845-gcr
       - const: syscon
       - const: simple-mfd
 
Signature · 1 line
2.33.0
author maintainer
#25 lore raw

PATCH v3 15/18 arm64: npcm: Add support for Nuvoton NPCM8XX BMC SoC

In reply to Tomer Maimon

This adds support for the Nuvoton NPCM8XX Board Management controller (BMC) SoC family.

The NPCM8XX based quad-core Cortex-A35 ARMv8 architecture.

---
 MAINTAINERS                  |  2 ++
 arch/arm64/Kconfig.platforms | 11 +++++++++++
 2 files changed, 13 insertions(+)
MAINTAINERS +2 -0
index f52543aedd61..69cb86b913cf 100644
@@ -2448,9 +2448,11 @@ F:	Documentation/devicetree/bindings/*/*npcm*
 F:	Documentation/devicetree/bindings/arm/npcm/*
 F:	arch/arm/boot/dts/nuvoton-npcm*
 F:	arch/arm/mach-npcm/
+F:	arch/arm64/boot/dts/nuvoton/
 F:	drivers/*/*npcm*
 F:	drivers/*/*/*npcm*
 F:	include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
+F:	include/dt-bindings/clock/nuvoton,npcm8xx-clock.h
 
 ARM/NUVOTON WPCM450 ARCHITECTURE
 M:	Jonathan Neuschäfer <[email protected]>
arch/arm64/Kconfig.platforms +11 -0
index 4e6d635a1731..c68d1b4f8975 100644
@@ -202,6 +202,17 @@ config ARCH_MXC
 	  This enables support for the ARMv8 based SoCs in the
 	  NXP i.MX family.
 
+config ARCH_NPCM
+	bool "Nuvoton NPCM Architecture"
+	select PINCTRL
+	select GPIOLIB
+	select NPCM7XX_TIMER
+	select RESET_CONTROLLER
+	select MFD_SYSCON
+	help
+	  General support for NPCM8xx BMC (Arbel).
+	  Nuvoton NPCM8xx BMC based on the Cortex A35.
+
 config ARCH_QCOM
 	bool "Qualcomm Platforms"
 	select GPIOLIB
Signature · 1 line
2.33.0
author maintainer
#26 lore raw

PATCH v3 16/18 arm64: dts: nuvoton: Add initial NPCM8XX device tree

In reply to Tomer Maimon

This adds initial device tree support for the Nuvoton NPCM845 Board Management controller (BMC) SoC family.

The NPCM845 based quad-core Cortex-A35 ARMv8 architecture and have various peripheral IPs.

---
 arch/arm64/boot/dts/Makefile                  |   1 +
 .../dts/nuvoton/nuvoton-common-npcm8xx.dtsi   | 170 ++++++++++++++++++
 .../boot/dts/nuvoton/nuvoton-npcm845.dtsi     |  76 ++++++++
 3 files changed, 247 insertions(+)
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-common-npcm8xx.dtsi
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-npcm845.dtsi
arch/arm64/boot/dts/Makefile +1 -0
index 1ba04e31a438..7b107fa7414b 100644
@@ -19,6 +19,7 @@ subdir-y += lg
 subdir-y += marvell
 subdir-y += mediatek
 subdir-y += microchip
+subdir-y += nuvoton
 subdir-y += nvidia
 subdir-y += qcom
 subdir-y += realtek
arch/arm64/boot/dts/nuvoton/nuvoton-common-npcm8xx.dtsi new file +170 -0

170 lines not on this page · raw message

arch/arm64/boot/dts/nuvoton/nuvoton-npcm845.dtsi new file +76 -0

76 lines not on this page · raw message

Signature · 1 line
2.33.0
Reviewed-by on v3 16/18
#27 lore raw

Re: [PATCH v3 16/18] arm64: dts: nuvoton: Add initial NPCM8XX device tree

Quoted 7 lines · Tomer Maimon

This adds initial device tree support for the Nuvoton NPCM845 Board Management controller (BMC) SoC family.

The NPCM845 based quad-core Cortex-A35 ARMv8 architecture and have various peripheral IPs.

Best regards,
Krzysztof

author maintainer
#28 lore raw

PATCH v3 17/18 arm64: dts: nuvoton: Add initial NPCM845 EVB device tree

In reply to Tomer Maimon

Add initial Nuvoton NPCM845 evaluation board device tree.

---
 arch/arm64/boot/dts/nuvoton/Makefile          |  2 ++
 .../boot/dts/nuvoton/nuvoton-npcm845-evb.dts  | 30 +++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 arch/arm64/boot/dts/nuvoton/Makefile
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-npcm845-evb.dts
arch/arm64/boot/dts/nuvoton/Makefile new file +2 -0
new file mode 100644
index 000000000000..a99dab90472a
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0
+dtb-$(CONFIG_ARCH_NPCM) += nuvoton-npcm845-evb.dtb
arch/arm64/boot/dts/nuvoton/nuvoton-npcm845-evb.dts new file +30 -0
new file mode 100644
index 000000000000..a5ab2bc0f835
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2021 Nuvoton Technology [email protected]
+
+/dts-v1/;
+#include "nuvoton-npcm845.dtsi"
+
+/ {
+	model = "Nuvoton npcm845 Development Board (Device Tree)";
+	compatible = "nuvoton,npcm845-evb", "nuvoton,npcm845";
+
+	aliases {
+		serial0 = &serial0;
+	};
+
+	chosen {
+		stdout-path = &serial0;
+	};
+
+	memory {
+		reg = <0x0 0x0 0x0 0x40000000>;
+	};
+};
+
+&serial0 {
+	status = "okay";
+};
+
+&watchdog1 {
+	status = "okay";
+};
Signature · 1 line
2.33.0
Reviewed-by on v3 17/18
#29 lore raw

Re: [PATCH v3 17/18] arm64: dts: nuvoton: Add initial NPCM845 EVB device tree

Quoted 9 lines · Tomer Maimon

Add initial Nuvoton NPCM845 evaluation board device tree.

---
 arch/arm64/boot/dts/nuvoton/Makefile          |  2 ++
 .../boot/dts/nuvoton/nuvoton-npcm845-evb.dts  | 30 +++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 arch/arm64/boot/dts/nuvoton/Makefile
 create mode 100644 arch/arm64/boot/dts/nuvoton/nuvoton-npcm845-evb.dts

Best regards,
Krzysztof

author maintainer
#30 lore raw

PATCH v3 18/18 arm64: defconfig: Add Nuvoton NPCM family support

In reply to Tomer Maimon

Enable basic drivers for NPCM8XX booting up support: Architecture, Clock, and WD.

---
 arch/arm64/configs/defconfig | 3 +++
 1 file changed, 3 insertions(+)
arch/arm64/configs/defconfig +3 -0
index 7d1105343bc2..c4a237a84efa 100644
@@ -49,6 +49,7 @@ CONFIG_ARCH_MEDIATEK=y
 CONFIG_ARCH_MESON=y
 CONFIG_ARCH_MVEBU=y
 CONFIG_ARCH_MXC=y
+CONFIG_ARCH_NPCM=y
 CONFIG_ARCH_QCOM=y
 CONFIG_ARCH_RENESAS=y
 CONFIG_ARCH_ROCKCHIP=y
@@ -627,6 +628,7 @@ CONFIG_RENESAS_RZG2LWDT=y
 CONFIG_UNIPHIER_WATCHDOG=y
 CONFIG_PM8916_WATCHDOG=m
 CONFIG_BCM2835_WDT=y
+CONFIG_NPCM7XX_WATCHDOG=y
 CONFIG_MFD_ALTERA_SYSMGR=y
 CONFIG_MFD_BD9571MWV=y
 CONFIG_MFD_AXP20X_I2C=y
@@ -1021,6 +1023,7 @@ CONFIG_COMMON_CLK_FSL_SAI=y
 CONFIG_COMMON_CLK_S2MPS11=y
 CONFIG_COMMON_CLK_PWM=y
 CONFIG_COMMON_CLK_VC5=y
+CONFIG_COMMON_CLK_NPCM8XX=y
 CONFIG_COMMON_CLK_BD718XX=m
 CONFIG_CLK_RASPBERRYPI=m
 CONFIG_CLK_IMX8MM=y
Signature · 1 line
2.33.0