openbmc.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/5] arm: aspeed: Add UART routing support
@ 2021-09-27  2:30 Chia-Wei Wang
  2021-09-27  2:30 ` [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes Chia-Wei Wang
                   ` (4 more replies)
  0 siblings, 5 replies; 17+ messages in thread
From: Chia-Wei Wang @ 2021-09-27  2:30 UTC (permalink / raw)
  To: robh+dt, joel, andrew, linux-arm-kernel, linux-aspeed,
	linux-kernel, devicetree, openbmc
  Cc: osk

Add UART routing driver and the device tree nodes.

v7:
 - Drop unused 'reg-io-width' properties from LPC nodes
 - Revise LPC bindgins as suggested by Rob

v6:
 - Fix another typo in YAML file
 - Move sysfs description from bindings to ABI document

v5:
 - Fix typo in YAML file to solve the compatible string not found error

v4:
 - Convert aspeed-lpc bindings to YAML schema to resolve dependecy issues

v3:
 - Add individual bindings in YAML
 - Add support for AST24xx (AST25xx shares the same design)
 - Add more explanation for the sysfs ABI

v2:
 - Add dt-bindings
 - Add ABI documents for the exported sysfs interface
 - Revise driver implementation suggested by Joel

Chia-Wei Wang (5):
  ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  dt-bindings: mfd: aspeed-lpc: Convert to YAML schema
  dt-bindings: aspeed: Add UART routing controller
  soc: aspeed: Add UART routing support
  ARM: dts: aspeed: Add uart routing to device tree

 .../testing/sysfs-driver-aspeed-uart-routing  |  27 +
 .../devicetree/bindings/mfd/aspeed-lpc.txt    | 157 -----
 .../devicetree/bindings/mfd/aspeed-lpc.yaml   | 192 ++++++
 .../bindings/soc/aspeed/uart-routing.yaml     |  56 ++
 arch/arm/boot/dts/aspeed-g4.dtsi              |   7 +-
 arch/arm/boot/dts/aspeed-g5.dtsi              |   7 +-
 arch/arm/boot/dts/aspeed-g6.dtsi              |   7 +-
 drivers/soc/aspeed/Kconfig                    |  10 +
 drivers/soc/aspeed/Makefile                   |   9 +-
 drivers/soc/aspeed/aspeed-uart-routing.c      | 603 ++++++++++++++++++
 10 files changed, 911 insertions(+), 164 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
 delete mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
 create mode 100644 Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml
 create mode 100644 drivers/soc/aspeed/aspeed-uart-routing.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-09-27  2:30 [PATCH v7 0/5] arm: aspeed: Add UART routing support Chia-Wei Wang
@ 2021-09-27  2:30 ` Chia-Wei Wang
  2021-10-08  4:35   ` Joel Stanley
  2021-09-27  2:30 ` [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema Chia-Wei Wang
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 17+ messages in thread
From: Chia-Wei Wang @ 2021-09-27  2:30 UTC (permalink / raw)
  To: robh+dt, joel, andrew, linux-arm-kernel, linux-aspeed,
	linux-kernel, devicetree, openbmc
  Cc: osk

The 'reg-io-width' properties are not used by LPC drivers
nor documented as part of bindings. Therefore drop them.

This is in preparation to move aspeed-lpc.txt to YAML schema.

Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
---
 arch/arm/boot/dts/aspeed-g4.dtsi | 1 -
 arch/arm/boot/dts/aspeed-g5.dtsi | 1 -
 arch/arm/boot/dts/aspeed-g6.dtsi | 1 -
 3 files changed, 3 deletions(-)

diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi
index c5aeb3cf3a09..45a25eb4baa4 100644
--- a/arch/arm/boot/dts/aspeed-g4.dtsi
+++ b/arch/arm/boot/dts/aspeed-g4.dtsi
@@ -345,7 +345,6 @@
 			lpc: lpc@1e789000 {
 				compatible = "aspeed,ast2400-lpc-v2", "simple-mfd", "syscon";
 				reg = <0x1e789000 0x1000>;
-				reg-io-width = <4>;
 
 				#address-cells = <1>;
 				#size-cells = <1>;
diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
index 73ca1ec6fc24..8e1d00d8445e 100644
--- a/arch/arm/boot/dts/aspeed-g5.dtsi
+++ b/arch/arm/boot/dts/aspeed-g5.dtsi
@@ -436,7 +436,6 @@
 			lpc: lpc@1e789000 {
 				compatible = "aspeed,ast2500-lpc-v2", "simple-mfd", "syscon";
 				reg = <0x1e789000 0x1000>;
-				reg-io-width = <4>;
 
 				#address-cells = <1>;
 				#size-cells = <1>;
diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
index 1b47be1704f8..0d1aae6887cd 100644
--- a/arch/arm/boot/dts/aspeed-g6.dtsi
+++ b/arch/arm/boot/dts/aspeed-g6.dtsi
@@ -490,7 +490,6 @@
 			lpc: lpc@1e789000 {
 				compatible = "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
 				reg = <0x1e789000 0x1000>;
-				reg-io-width = <4>;
 
 				#address-cells = <1>;
 				#size-cells = <1>;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema
  2021-09-27  2:30 [PATCH v7 0/5] arm: aspeed: Add UART routing support Chia-Wei Wang
  2021-09-27  2:30 ` [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes Chia-Wei Wang
@ 2021-09-27  2:30 ` Chia-Wei Wang
  2021-09-29 22:02   ` Rob Herring
  2021-09-27  2:30 ` [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller Chia-Wei Wang
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 17+ messages in thread
From: Chia-Wei Wang @ 2021-09-27  2:30 UTC (permalink / raw)
  To: robh+dt, joel, andrew, linux-arm-kernel, linux-aspeed,
	linux-kernel, devicetree, openbmc
  Cc: osk

Convert the bindings of Aspeed LPC from text file into YAML schema.

Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
---
 .../devicetree/bindings/mfd/aspeed-lpc.txt    | 157 ---------------
 .../devicetree/bindings/mfd/aspeed-lpc.yaml   | 188 ++++++++++++++++++
 2 files changed, 188 insertions(+), 157 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml

diff --git a/Documentation/devicetree/bindings/mfd/aspeed-lpc.txt b/Documentation/devicetree/bindings/mfd/aspeed-lpc.txt
deleted file mode 100644
index 936aa108eab4..000000000000
--- a/Documentation/devicetree/bindings/mfd/aspeed-lpc.txt
+++ /dev/null
@@ -1,157 +0,0 @@
-======================================================================
-Device tree bindings for the Aspeed Low Pin Count (LPC) Bus Controller
-======================================================================
-
-The LPC bus is a means to bridge a host CPU to a number of low-bandwidth
-peripheral devices, replacing the use of the ISA bus in the age of PCI[0]. The
-primary use case of the Aspeed LPC controller is as a slave on the bus
-(typically in a Baseboard Management Controller SoC), but under certain
-conditions it can also take the role of bus master.
-
-The LPC controller is represented as a multi-function device to account for the
-mix of functionality, which includes, but is not limited to:
-
-* An IPMI Block Transfer[2] Controller
-
-* An LPC Host Controller: Manages LPC functions such as host vs slave mode, the
-  physical properties of some LPC pins, configuration of serial IRQs, and
-  APB-to-LPC bridging amonst other functions.
-
-* An LPC Host Interface Controller: Manages functions exposed to the host such
-  as LPC firmware hub cycles, configuration of the LPC-to-AHB mapping, UART
-  management and bus snoop configuration.
-
-* A set of SuperIO[3] scratch registers: Enables implementation of e.g. custom
-  hardware management protocols for handover between the host and baseboard
-  management controller.
-
-Additionally the state of the LPC controller influences the pinmux
-configuration, therefore the host portion of the controller is exposed as a
-syscon as a means to arbitrate access.
-
-[0] http://www.intel.com/design/chipsets/industry/25128901.pdf
-[1] https://www.renesas.com/en-sg/doc/products/mpumcu/001/rej09b0078_h8s2168.pdf?key=7c88837454702128622bee53acbda8f4
-[2] https://www.intel.com/content/dam/www/public/us/en/documents/product-briefs/ipmi-second-gen-interface-spec-v2-rev1-1.pdf
-[3] https://en.wikipedia.org/wiki/Super_I/O
-
-Required properties
-===================
-
-- compatible:	One of:
-		"aspeed,ast2400-lpc-v2", "simple-mfd", "syscon"
-		"aspeed,ast2500-lpc-v2", "simple-mfd", "syscon"
-		"aspeed,ast2600-lpc-v2", "simple-mfd", "syscon"
-
-- reg:		contains the physical address and length values of the Aspeed
-                LPC memory region.
-
-- #address-cells: <1>
-- #size-cells:	<1>
-- ranges:	Maps 0 to the physical address and length of the LPC memory
-                region
-
-Example:
-
-lpc: lpc@1e789000 {
-	compatible = "aspeed,ast2500-lpc-v2", "simple-mfd", "syscon";
-	reg = <0x1e789000 0x1000>;
-
-	#address-cells = <1>;
-	#size-cells = <1>;
-	ranges = <0x0 0x1e789000 0x1000>;
-
-	lpc_snoop: lpc-snoop@0 {
-		compatible = "aspeed,ast2600-lpc-snoop";
-		reg = <0x0 0x80>;
-		interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
-		snoop-ports = <0x80>;
-	};
-};
-
-
-LPC Host Interface Controller
--------------------
-
-The LPC Host Interface Controller manages functions exposed to the host such as
-LPC firmware hub cycles, configuration of the LPC-to-AHB mapping, UART
-management and bus snoop configuration.
-
-Required properties:
-
-- compatible:	One of:
-		"aspeed,ast2400-lpc-ctrl";
-		"aspeed,ast2500-lpc-ctrl";
-		"aspeed,ast2600-lpc-ctrl";
-
-- reg:		contains offset/length values of the host interface controller
-		memory regions
-
-- clocks:	contains a phandle to the syscon node describing the clocks.
-		There should then be one cell representing the clock to use
-
-Optional properties:
-
-- memory-region: A phandle to a reserved_memory region to be used for the LPC
-		to AHB mapping
-
-- flash:	A phandle to the SPI flash controller containing the flash to
-		be exposed over the LPC to AHB mapping
-
-Example:
-
-lpc_ctrl: lpc-ctrl@80 {
-	compatible = "aspeed,ast2500-lpc-ctrl";
-	reg = <0x80 0x80>;
-	clocks = <&syscon ASPEED_CLK_GATE_LCLK>;
-	memory-region = <&flash_memory>;
-	flash = <&spi>;
-};
-
-LPC Host Controller
--------------------
-
-The Aspeed LPC Host Controller configures the Low Pin Count (LPC) bus behaviour
-between the host and the baseboard management controller. The registers exist
-in the "host" portion of the Aspeed LPC controller, which must be the parent of
-the LPC host controller node.
-
-Required properties:
-
-- compatible:	One of:
-		"aspeed,ast2400-lhc";
-		"aspeed,ast2500-lhc";
-		"aspeed,ast2600-lhc";
-
-- reg:		contains offset/length values of the LHC memory regions. In the
-		AST2400 and AST2500 there are two regions.
-
-Example:
-
-lhc: lhc@a0 {
-	compatible = "aspeed,ast2500-lhc";
-	reg = <0xa0 0x24 0xc8 0x8>;
-};
-
-LPC reset control
------------------
-
-The UARTs present in the ASPEED SoC can have their resets tied to the reset
-state of the LPC bus. Some systems may chose to modify this configuration.
-
-Required properties:
-
- - compatible:		One of:
-			"aspeed,ast2600-lpc-reset";
-			"aspeed,ast2500-lpc-reset";
-			"aspeed,ast2400-lpc-reset";
-
- - reg:			offset and length of the IP in the LHC memory region
- - #reset-controller	indicates the number of reset cells expected
-
-Example:
-
-lpc_reset: reset-controller@98 {
-        compatible = "aspeed,ast2500-lpc-reset";
-        reg = <0x98 0x4>;
-        #reset-cells = <1>;
-};
diff --git a/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml b/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
new file mode 100644
index 000000000000..03d417762752
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
@@ -0,0 +1,188 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# # Copyright (c) 2021 Aspeed Tehchnology Inc.
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/aspeed-lpc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Aspeed Low Pin Count (LPC) Bus Controller
+
+maintainers:
+  - Andrew Jeffery <andrew@aj.id.au>
+  - Chia-Wei Wang <chiawei_wang@aspeedtech.com>
+
+description:
+  The LPC bus is a means to bridge a host CPU to a number of low-bandwidth
+  peripheral devices, replacing the use of the ISA bus in the age of PCI[0]. The
+  primary use case of the Aspeed LPC controller is as a slave on the bus
+  (typically in a Baseboard Management Controller SoC), but under certain
+  conditions it can also take the role of bus master.
+
+  The LPC controller is represented as a multi-function device to account for the
+  mix of functionality, which includes, but is not limited to
+
+  * An IPMI Block Transfer[2] Controller
+
+  * An LPC Host Interface Controller manages functions exposed to the host such
+    as LPC firmware hub cycles, configuration of the LPC-to-AHB mapping, UART
+    management and bus snoop configuration.
+
+  * A set of SuperIO[3] scratch registers enableing implementation of e.g. custom
+    hardware management protocols for handover between the host and baseboard
+    management controller.
+
+  Additionally the state of the LPC controller influences the pinmux
+  configuration, therefore the host portion of the controller is exposed as a
+  syscon as a means to arbitrate access.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - aspeed,ast2400-lpc-v2
+          - aspeed,ast2500-lpc-v2
+          - aspeed,ast2600-lpc-v2
+      - const: simple-mfd
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  "#address-cells":
+    const: 1
+
+  "#size-cells":
+    const: 1
+
+  ranges: true
+
+patternProperties:
+  "^lpc-ctrl@[0-9a-f]+$":
+    type: object
+
+    description: |
+      The LPC Host Interface Controller manages functions exposed to the host such as
+      LPC firmware hub cycles, configuration of the LPC-to-AHB mapping, UART management
+      and bus snoop configuration.
+
+    properties:
+      compatible:
+        items:
+          - enum:
+              - aspeed,ast2400-lpc-ctrl
+              - aspeed,ast2500-lpc-ctrl
+              - aspeed,ast2600-lpc-ctrl
+
+      reg:
+        maxItems: 1
+
+      clocks:
+        maxItems: 1
+
+      memory-region:
+        maxItems: 1
+        description: handle to memory reservation for the LPC to AHB mapping region
+
+      flash:
+        $ref: /schemas/types.yaml#/definitions/phandle
+        description: The SPI flash controller containing the flash to be exposed over the LPC to AHB mapping
+
+    required:
+      - compatible
+      - clocks
+
+  "^reset-controller@[0-9a-f]+$":
+    type: object
+
+    description:
+      The UARTs present in the ASPEED SoC can have their resets tied to the reset
+      state of the LPC bus. Some systems may chose to modify this configuration
+
+    properties:
+      compatible:
+        items:
+          - enum:
+              - aspeed,ast2400-lpc-reset
+              - aspeed,ast2500-lpc-reset
+              - aspeed,ast2600-lpc-reset
+
+      reg:
+        maxItems: 1
+
+    required:
+      - compatible
+
+  "^lpc-snoop@[0-9a-f]+$":
+    type: object
+
+    description:
+      The LPC snoop interface allows the BMC to listen on and record the data
+      bytes written by the Host to the targeted LPC I/O pots.
+
+    properties:
+      compatible:
+        items:
+          - enum:
+              - aspeed,ast2400-lpc-snoop
+              - aspeed,ast2500-lpc-snoop
+              - aspeed,ast2600-lpc-snoop
+
+      reg:
+        maxItems: 1
+
+      interrupts:
+        maxItems: 1
+
+      snoop-ports:
+        $ref: /schemas/types.yaml#/definitions/uint32-array
+        description: The LPC I/O ports to snoop
+
+    required:
+      - compatible
+      - interrupts
+      - snoop-ports
+
+required:
+  - compatible
+  - reg
+  - "#address-cells"
+  - "#size-cells"
+  - ranges
+
+additionalProperties:
+  type: object
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/ast2600-clock.h>
+
+    lpc: lpc@1e789000 {
+        compatible = "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
+        reg = <0x1e789000 0x1000>;
+
+        #address-cells = <1>;
+        #size-cells = <1>;
+        ranges = <0x0 0x1e789000 0x1000>;
+
+        lpc_ctrl: lpc-ctrl@80 {
+            compatible = "aspeed,ast2600-lpc-ctrl";
+            reg = <0x80 0x80>;
+            clocks = <&syscon ASPEED_CLK_GATE_LCLK>;
+            memory-region = <&flash_memory>;
+            flash = <&spi>;
+        };
+
+        lpc_reset: reset-controller@98 {
+            compatible = "aspeed,ast2600-lpc-reset";
+            reg = <0x98 0x4>;
+            #reset-cells = <1>;
+        };
+
+        lpc_snoop: lpc-snoop@90 {
+            compatible = "aspeed,ast2600-lpc-snoop";
+            reg = <0x90 0x8>;
+            interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
+            snoop-ports = <0x80>;
+        };
+    };
-- 
2.17.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller
  2021-09-27  2:30 [PATCH v7 0/5] arm: aspeed: Add UART routing support Chia-Wei Wang
  2021-09-27  2:30 ` [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes Chia-Wei Wang
  2021-09-27  2:30 ` [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema Chia-Wei Wang
@ 2021-09-27  2:30 ` Chia-Wei Wang
  2021-09-29 22:11   ` Rob Herring
  2021-09-27  2:30 ` [PATCH v7 4/5] soc: aspeed: Add UART routing support Chia-Wei Wang
  2021-09-27  2:30 ` [PATCH v7 5/5] ARM: dts: aspeed: Add uart routing to device tree Chia-Wei Wang
  4 siblings, 1 reply; 17+ messages in thread
From: Chia-Wei Wang @ 2021-09-27  2:30 UTC (permalink / raw)
  To: robh+dt, joel, andrew, linux-arm-kernel, linux-aspeed,
	linux-kernel, devicetree, openbmc
  Cc: osk

Add dt-bindings for Aspeed UART routing controller.

Signed-off-by: Oskar Senft <osk@google.com>
Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
Reviewed-by: Rob Herring <robh@kernel.org>
---
 .../devicetree/bindings/mfd/aspeed-lpc.yaml   |  4 ++
 .../bindings/soc/aspeed/uart-routing.yaml     | 56 +++++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml

diff --git a/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml b/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
index 03d417762752..f1538038c045 100644
--- a/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
+++ b/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
@@ -142,6 +142,10 @@ patternProperties:
       - interrupts
       - snoop-ports
 
+  "^uart-routing@[0-9a-f]+$":
+    $ref: /schemas/soc/aspeed/uart-routing.yaml#
+    description: The UART routing control under LPC register space
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml b/Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml
new file mode 100644
index 000000000000..6876407124dc
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml
@@ -0,0 +1,56 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# # Copyright (c) 2018 Google LLC
+# # Copyright (c) 2021 Aspeed Technology Inc.
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/soc/aspeed/uart-routing.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: Aspeed UART Routing Controller
+
+maintainers:
+  - Oskar Senft <osk@google.com>
+  - Chia-Wei Wang <chiawei_wang@aspeedtech.com>
+
+description:
+  The Aspeed UART routing control allow to dynamically route the inputs for
+  the built-in UARTS and physical serial I/O ports.
+
+  This allows, for example, to connect the output of UART to another UART.
+  This can be used to enable Host <-> BMC communication via UARTs, e.g. to
+  allow access to the Host's serial console.
+
+  This driver is for the BMC side. The sysfs files allow the BMC userspace
+  which owns the system configuration policy, to configure how UARTs and
+  physical serial I/O ports are routed.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - aspeed,ast2400-uart-routing
+          - aspeed,ast2500-uart-routing
+          - aspeed,ast2600-uart-routing
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+
+additionalProperties: false
+
+examples:
+  - |
+    lpc: lpc@1e789000 {
+        compatible = "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
+        reg = <0x1e789000 0x1000>;
+
+        #address-cells = <1>;
+        #size-cells = <1>;
+        ranges = <0x0 0x1e789000 0x1000>;
+
+        uart_routing: uart-routing@98 {
+            compatible = "aspeed,ast2600-uart-routing";
+            reg = <0x98 0x8>;
+        };
+    };
-- 
2.17.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v7 4/5] soc: aspeed: Add UART routing support
  2021-09-27  2:30 [PATCH v7 0/5] arm: aspeed: Add UART routing support Chia-Wei Wang
                   ` (2 preceding siblings ...)
  2021-09-27  2:30 ` [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller Chia-Wei Wang
@ 2021-09-27  2:30 ` Chia-Wei Wang
  2021-10-08  4:47   ` Joel Stanley
  2021-09-27  2:30 ` [PATCH v7 5/5] ARM: dts: aspeed: Add uart routing to device tree Chia-Wei Wang
  4 siblings, 1 reply; 17+ messages in thread
From: Chia-Wei Wang @ 2021-09-27  2:30 UTC (permalink / raw)
  To: robh+dt, joel, andrew, linux-arm-kernel, linux-aspeed,
	linux-kernel, devicetree, openbmc
  Cc: osk

Add driver support for the UART routing control. Users can perform
runtime configuration of the RX muxes among the UART controllers and
the UART IO pins.

The sysfs interface is also exported for the convenience of routing paths
check and update.

Signed-off-by: Oskar Senft <osk@google.com>
Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
Tested-by: Lei YU <yulei.sh@bytedance.com>
---
 .../testing/sysfs-driver-aspeed-uart-routing  |  27 +
 drivers/soc/aspeed/Kconfig                    |  10 +
 drivers/soc/aspeed/Makefile                   |   9 +-
 drivers/soc/aspeed/aspeed-uart-routing.c      | 603 ++++++++++++++++++
 4 files changed, 645 insertions(+), 4 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
 create mode 100644 drivers/soc/aspeed/aspeed-uart-routing.c

diff --git a/Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing b/Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
new file mode 100644
index 000000000000..b363827da437
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
@@ -0,0 +1,27 @@
+What:		/sys/bus/platform/drivers/aspeed-uart-routing/*/uart*
+Date:		September 2021
+Contact:	Oskar Senft <osk@google.com>
+		Chia-Wei Wang <chiawei_wang@aspeedtech.com>
+Description:	Selects the RX source of the UARTx device.
+
+		When read, each file shows the list of available options with currently
+		selected option marked by brackets "[]". The list of available options
+		depends on the selected file.
+
+		e.g.
+		cat /sys/bus/platform/drivers/aspeed-uart-routing/*.uart_routing/uart1
+		[io1] io2 io3 io4 uart2 uart3 uart4 io6
+
+		In this case, UART1 gets its input from IO1 (physical serial port 1).
+
+Users:		OpenBMC.  Proposed changes should be mailed to
+		openbmc@lists.ozlabs.org
+
+What:		/sys/bus/platform/drivers/aspeed-uart-routing/*/io*
+Date:		September 2021
+Contact:	Oskar Senft <osk@google.com>
+		Chia-Wei Wang <chiawei_wang@aspeedtech.com>
+Description:	Selects the RX source of IOx serial port. The current selection
+		will be marked by brackets "[]".
+Users:		OpenBMC.  Proposed changes should be mailed to
+		openbmc@lists.ozlabs.org
diff --git a/drivers/soc/aspeed/Kconfig b/drivers/soc/aspeed/Kconfig
index 243ca196e6ad..f579ee0b5afa 100644
--- a/drivers/soc/aspeed/Kconfig
+++ b/drivers/soc/aspeed/Kconfig
@@ -24,6 +24,16 @@ config ASPEED_LPC_SNOOP
 	  allows the BMC to listen on and save the data written by
 	  the host to an arbitrary LPC I/O port.
 
+config ASPEED_UART_ROUTING
+	tristate "ASPEED uart routing control"
+	select REGMAP
+	select MFD_SYSCON
+	default ARCH_ASPEED
+	help
+	  Provides a driver to control the UART routing paths, allowing
+	  users to perform runtime configuration of the RX muxes among
+	  the UART controllers and I/O pins.
+
 config ASPEED_P2A_CTRL
 	tristate "ASPEED P2A (VGA MMIO to BMC) bridge control"
 	select REGMAP
diff --git a/drivers/soc/aspeed/Makefile b/drivers/soc/aspeed/Makefile
index fcab7192e1a4..b35d74592964 100644
--- a/drivers/soc/aspeed/Makefile
+++ b/drivers/soc/aspeed/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
-obj-$(CONFIG_ASPEED_LPC_CTRL)	+= aspeed-lpc-ctrl.o
-obj-$(CONFIG_ASPEED_LPC_SNOOP)	+= aspeed-lpc-snoop.o
-obj-$(CONFIG_ASPEED_P2A_CTRL)	+= aspeed-p2a-ctrl.o
-obj-$(CONFIG_ASPEED_SOCINFO)	+= aspeed-socinfo.o
+obj-$(CONFIG_ASPEED_LPC_CTRL)		+= aspeed-lpc-ctrl.o
+obj-$(CONFIG_ASPEED_LPC_SNOOP)		+= aspeed-lpc-snoop.o
+obj-$(CONFIG_ASPEED_UART_ROUTING)	+= aspeed-uart-routing.o
+obj-$(CONFIG_ASPEED_P2A_CTRL)		+= aspeed-p2a-ctrl.o
+obj-$(CONFIG_ASPEED_SOCINFO)		+= aspeed-socinfo.o
diff --git a/drivers/soc/aspeed/aspeed-uart-routing.c b/drivers/soc/aspeed/aspeed-uart-routing.c
new file mode 100644
index 000000000000..ef8b24fd1851
--- /dev/null
+++ b/drivers/soc/aspeed/aspeed-uart-routing.c
@@ -0,0 +1,603 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2018 Google LLC
+ * Copyright (c) 2021 Aspeed Technology Inc.
+ */
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
+#include <linux/platform_device.h>
+
+/* register offsets */
+#define HICR9	0x98
+#define HICRA	0x9c
+
+/* attributes options */
+#define UART_ROUTING_IO1	"io1"
+#define UART_ROUTING_IO2	"io2"
+#define UART_ROUTING_IO3	"io3"
+#define UART_ROUTING_IO4	"io4"
+#define UART_ROUTING_IO5	"io5"
+#define UART_ROUTING_IO6	"io6"
+#define UART_ROUTING_IO10	"io10"
+#define UART_ROUTING_UART1	"uart1"
+#define UART_ROUTING_UART2	"uart2"
+#define UART_ROUTING_UART3	"uart3"
+#define UART_ROUTING_UART4	"uart4"
+#define UART_ROUTING_UART5	"uart5"
+#define UART_ROUTING_UART6	"uart6"
+#define UART_ROUTING_UART10	"uart10"
+#define UART_ROUTING_RES	"reserved"
+
+struct aspeed_uart_routing {
+	struct regmap *map;
+	struct attribute_group const *attr_grp;
+};
+
+struct aspeed_uart_routing_selector {
+	struct device_attribute	dev_attr;
+	uint8_t reg;
+	uint8_t mask;
+	uint8_t shift;
+	const char *const options[];
+};
+
+#define to_routing_selector(_dev_attr)					\
+	container_of(_dev_attr, struct aspeed_uart_routing_selector, dev_attr)
+
+static ssize_t aspeed_uart_routing_show(struct device *dev,
+					struct device_attribute *attr,
+					char *buf);
+
+static ssize_t aspeed_uart_routing_store(struct device *dev,
+					 struct device_attribute *attr,
+					 const char *buf, size_t count);
+
+#define ROUTING_ATTR(_name) {					\
+	.attr = {.name = _name,					\
+		 .mode = VERIFY_OCTAL_PERMISSIONS(0644) },	\
+	.show = aspeed_uart_routing_show,			\
+	.store = aspeed_uart_routing_store,			\
+}
+
+/* routing selector for AST25xx */
+static struct aspeed_uart_routing_selector ast2500_io6_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO6),
+	.reg = HICR9,
+	.shift = 8,
+	.mask = 0xf,
+	.options = {
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART5,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO5,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_uart5_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART5),
+	.reg = HICRA,
+	.shift = 28,
+	.mask = 0xf,
+	.options = {
+		    UART_ROUTING_IO5,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_uart4_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
+	.reg = HICRA,
+	.shift = 25,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_IO6,
+		    NULL,
+	},
+};
+
+static struct aspeed_uart_routing_selector ast2500_uart3_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
+	.reg = HICRA,
+	.shift = 22,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_uart2_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
+	.reg = HICRA,
+	.shift = 19,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_uart1_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
+	.reg = HICRA,
+	.shift = 16,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_io5_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO5),
+	.reg = HICRA,
+	.shift = 12,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART5,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_io4_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
+	.reg = HICRA,
+	.shift = 9,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART5,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_io3_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
+	.reg = HICRA,
+	.shift = 6,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART5,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_io2_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
+	.reg = HICRA,
+	.shift = 3,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART5,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2500_io1_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
+	.reg = HICRA,
+	.shift = 0,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART5,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO6,
+		    NULL,
+		    },
+};
+
+static struct attribute *ast2500_uart_routing_attrs[] = {
+	&ast2500_io6_sel.dev_attr.attr,
+	&ast2500_uart5_sel.dev_attr.attr,
+	&ast2500_uart4_sel.dev_attr.attr,
+	&ast2500_uart3_sel.dev_attr.attr,
+	&ast2500_uart2_sel.dev_attr.attr,
+	&ast2500_uart1_sel.dev_attr.attr,
+	&ast2500_io5_sel.dev_attr.attr,
+	&ast2500_io4_sel.dev_attr.attr,
+	&ast2500_io3_sel.dev_attr.attr,
+	&ast2500_io2_sel.dev_attr.attr,
+	&ast2500_io1_sel.dev_attr.attr,
+	NULL,
+};
+
+static const struct attribute_group ast2500_uart_routing_attr_group = {
+	.attrs = ast2500_uart_routing_attrs,
+};
+
+/* routing selector for AST26xx */
+static struct aspeed_uart_routing_selector ast2600_uart10_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART10),
+	.reg = HICR9,
+	.shift = 12,
+	.mask = 0xf,
+	.options = {
+		    UART_ROUTING_IO10,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+			UART_ROUTING_RES,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_io10_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO10),
+	.reg = HICR9,
+	.shift = 8,
+	.mask = 0xf,
+	.options = {
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+			UART_ROUTING_RES,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+			UART_ROUTING_RES,
+		    UART_ROUTING_UART10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_uart4_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
+	.reg = HICRA,
+	.shift = 25,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_IO10,
+		    NULL,
+	},
+};
+
+static struct aspeed_uart_routing_selector ast2600_uart3_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
+	.reg = HICRA,
+	.shift = 22,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_uart2_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
+	.reg = HICRA,
+	.shift = 19,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_uart1_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
+	.reg = HICRA,
+	.shift = 16,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_io4_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
+	.reg = HICRA,
+	.shift = 9,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART10,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_io3_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
+	.reg = HICRA,
+	.shift = 6,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART10,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_IO1,
+		    UART_ROUTING_IO2,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_io2_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
+	.reg = HICRA,
+	.shift = 3,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART10,
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct aspeed_uart_routing_selector ast2600_io1_sel = {
+	.dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
+	.reg = HICRA,
+	.shift = 0,
+	.mask = 0x7,
+	.options = {
+		    UART_ROUTING_UART1,
+		    UART_ROUTING_UART2,
+		    UART_ROUTING_UART3,
+		    UART_ROUTING_UART4,
+		    UART_ROUTING_UART10,
+		    UART_ROUTING_IO3,
+		    UART_ROUTING_IO4,
+		    UART_ROUTING_IO10,
+		    NULL,
+		    },
+};
+
+static struct attribute *ast2600_uart_routing_attrs[] = {
+	&ast2600_uart10_sel.dev_attr.attr,
+	&ast2600_io10_sel.dev_attr.attr,
+	&ast2600_uart4_sel.dev_attr.attr,
+	&ast2600_uart3_sel.dev_attr.attr,
+	&ast2600_uart2_sel.dev_attr.attr,
+	&ast2600_uart1_sel.dev_attr.attr,
+	&ast2600_io4_sel.dev_attr.attr,
+	&ast2600_io3_sel.dev_attr.attr,
+	&ast2600_io2_sel.dev_attr.attr,
+	&ast2600_io1_sel.dev_attr.attr,
+	NULL,
+};
+
+static const struct attribute_group ast2600_uart_routing_attr_group = {
+	.attrs = ast2600_uart_routing_attrs,
+};
+
+static ssize_t aspeed_uart_routing_show(struct device *dev,
+					struct device_attribute *attr,
+					char *buf)
+{
+	struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
+	struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
+	int val, pos, len;
+
+	regmap_read(uart_routing->map, sel->reg, &val);
+	val = (val >> sel->shift) & sel->mask;
+
+	len = 0;
+	for (pos = 0; sel->options[pos] != NULL; ++pos) {
+		if (pos == val)
+			len += sysfs_emit_at(buf, len, "[%s] ", sel->options[pos]);
+		else
+			len += sysfs_emit_at(buf, len, "%s ", sel->options[pos]);
+	}
+
+	if (val >= pos)
+		len += sysfs_emit_at(buf, len, "[unknown(%d)]", val);
+
+	len += sysfs_emit_at(buf, len, "\n");
+
+	return len;
+}
+
+static ssize_t aspeed_uart_routing_store(struct device *dev,
+					 struct device_attribute *attr,
+					 const char *buf, size_t count)
+{
+	struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
+	struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
+	int val;
+
+	val = match_string(sel->options, -1, buf);
+	if (val < 0) {
+		dev_err(dev, "invalid value \"%s\"\n", buf);
+		return -EINVAL;
+	}
+
+	regmap_update_bits(uart_routing->map, sel->reg,
+			(sel->mask << sel->shift),
+			(val & sel->mask) << sel->shift);
+
+	return count;
+}
+
+static int aspeed_uart_routing_probe(struct platform_device *pdev)
+{
+	int rc;
+	struct device *dev = &pdev->dev;
+	struct aspeed_uart_routing *uart_routing;
+
+	uart_routing = devm_kzalloc(&pdev->dev, sizeof(*uart_routing), GFP_KERNEL);
+	if (!uart_routing)
+		return -ENOMEM;
+
+	uart_routing->map = syscon_node_to_regmap(dev->parent->of_node);
+	if (IS_ERR(uart_routing->map)) {
+		dev_err(dev, "cannot get regmap\n");
+		return PTR_ERR(uart_routing->map);
+	}
+
+	uart_routing->attr_grp = of_device_get_match_data(dev);
+
+	rc = sysfs_create_group(&dev->kobj, uart_routing->attr_grp);
+	if (rc < 0)
+		return rc;
+
+	dev_set_drvdata(dev, uart_routing);
+
+	dev_info(dev, "module loaded\n");
+
+	return 0;
+}
+
+static int aspeed_uart_routing_remove(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct aspeed_uart_routing *uart_routing = platform_get_drvdata(pdev);
+
+	sysfs_remove_group(&dev->kobj, uart_routing->attr_grp);
+
+	return 0;
+}
+
+static const struct of_device_id aspeed_uart_routing_table[] = {
+	{ .compatible = "aspeed,ast2400-uart-routing",
+	  .data = &ast2500_uart_routing_attr_group },
+	{ .compatible = "aspeed,ast2500-uart-routing",
+	  .data = &ast2500_uart_routing_attr_group },
+	{ .compatible = "aspeed,ast2600-uart-routing",
+	  .data = &ast2600_uart_routing_attr_group },
+	{ },
+};
+
+static struct platform_driver aspeed_uart_routing_driver = {
+	.driver = {
+		.name = "aspeed-uart-routing",
+		.of_match_table = aspeed_uart_routing_table,
+	},
+	.probe = aspeed_uart_routing_probe,
+	.remove = aspeed_uart_routing_remove,
+};
+
+module_platform_driver(aspeed_uart_routing_driver);
+
+MODULE_AUTHOR("Oskar Senft <osk@google.com>");
+MODULE_AUTHOR("Chia-Wei Wang <chiawei_wang@aspeedtech.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("Driver to configure Aspeed UART routing");
-- 
2.17.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v7 5/5] ARM: dts: aspeed: Add uart routing to device tree
  2021-09-27  2:30 [PATCH v7 0/5] arm: aspeed: Add UART routing support Chia-Wei Wang
                   ` (3 preceding siblings ...)
  2021-09-27  2:30 ` [PATCH v7 4/5] soc: aspeed: Add UART routing support Chia-Wei Wang
@ 2021-09-27  2:30 ` Chia-Wei Wang
  4 siblings, 0 replies; 17+ messages in thread
From: Chia-Wei Wang @ 2021-09-27  2:30 UTC (permalink / raw)
  To: robh+dt, joel, andrew, linux-arm-kernel, linux-aspeed,
	linux-kernel, devicetree, openbmc
  Cc: osk

Add LPC uart routing to the device tree for Aspeed SoCs.

Signed-off-by: Oskar Senft <osk@google.com>
Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
Tested-by: Lei YU <yulei.sh@bytedance.com>
---
 arch/arm/boot/dts/aspeed-g4.dtsi | 6 ++++++
 arch/arm/boot/dts/aspeed-g5.dtsi | 6 ++++++
 arch/arm/boot/dts/aspeed-g6.dtsi | 6 ++++++
 3 files changed, 18 insertions(+)

diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi
index 45a25eb4baa4..f0eb599e90f1 100644
--- a/arch/arm/boot/dts/aspeed-g4.dtsi
+++ b/arch/arm/boot/dts/aspeed-g4.dtsi
@@ -382,6 +382,12 @@
 					interrupts = <8>;
 					status = "disabled";
 				};
+
+				uart_routing: uart-routing@9c {
+					compatible = "aspeed,ast2400-uart-routing";
+					reg = <0x9c 0x4>;
+					status = "disabled";
+				};
 			};
 
 			uart2: serial@1e78d000 {
diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
index 8e1d00d8445e..c72f9aa13cea 100644
--- a/arch/arm/boot/dts/aspeed-g5.dtsi
+++ b/arch/arm/boot/dts/aspeed-g5.dtsi
@@ -490,6 +490,12 @@
 					#reset-cells = <1>;
 				};
 
+				uart_routing: uart-routing@9c {
+					compatible = "aspeed,ast2500-uart-routing";
+					reg = <0x9c 0x4>;
+					status = "disabled";
+				};
+
 				lhc: lhc@a0 {
 					compatible = "aspeed,ast2500-lhc";
 					reg = <0xa0 0x24 0xc8 0x8>;
diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
index 0d1aae6887cd..136273984b5e 100644
--- a/arch/arm/boot/dts/aspeed-g6.dtsi
+++ b/arch/arm/boot/dts/aspeed-g6.dtsi
@@ -550,6 +550,12 @@
 					#reset-cells = <1>;
 				};
 
+				uart_routing: uart-routing@98 {
+					compatible = "aspeed,ast2600-uart-routing";
+					reg = <0x98 0x8>;
+					status = "disabled";
+				};
+
 				ibt: ibt@140 {
 					compatible = "aspeed,ast2600-ibt-bmc";
 					reg = <0x140 0x18>;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema
  2021-09-27  2:30 ` [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema Chia-Wei Wang
@ 2021-09-29 22:02   ` Rob Herring
  2021-09-30  9:48     ` Lee Jones
  0 siblings, 1 reply; 17+ messages in thread
From: Rob Herring @ 2021-09-29 22:02 UTC (permalink / raw)
  To: Chia-Wei Wang
  Cc: devicetree, linux-aspeed, andrew, openbmc, linux-kernel, robh+dt,
	osk, linux-arm-kernel

On Mon, 27 Sep 2021 10:30:50 +0800, Chia-Wei Wang wrote:
> Convert the bindings of Aspeed LPC from text file into YAML schema.
> 
> Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> ---
>  .../devicetree/bindings/mfd/aspeed-lpc.txt    | 157 ---------------
>  .../devicetree/bindings/mfd/aspeed-lpc.yaml   | 188 ++++++++++++++++++
>  2 files changed, 188 insertions(+), 157 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.txt
>  create mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
> 

Applied, thanks!

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller
  2021-09-27  2:30 ` [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller Chia-Wei Wang
@ 2021-09-29 22:11   ` Rob Herring
  2021-09-30  1:55     ` ChiaWei Wang
  0 siblings, 1 reply; 17+ messages in thread
From: Rob Herring @ 2021-09-29 22:11 UTC (permalink / raw)
  To: Chia-Wei Wang
  Cc: devicetree, linux-aspeed, andrew, openbmc, linux-kernel, robh+dt,
	osk, linux-arm-kernel

On Mon, 27 Sep 2021 10:30:51 +0800, Chia-Wei Wang wrote:
> Add dt-bindings for Aspeed UART routing controller.
> 
> Signed-off-by: Oskar Senft <osk@google.com>
> Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> Reviewed-by: Rob Herring <robh@kernel.org>
> ---
>  .../devicetree/bindings/mfd/aspeed-lpc.yaml   |  4 ++
>  .../bindings/soc/aspeed/uart-routing.yaml     | 56 +++++++++++++++++++
>  2 files changed, 60 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml
> 

Applied, thanks!

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller
  2021-09-29 22:11   ` Rob Herring
@ 2021-09-30  1:55     ` ChiaWei Wang
  0 siblings, 0 replies; 17+ messages in thread
From: ChiaWei Wang @ 2021-09-30  1:55 UTC (permalink / raw)
  To: Rob Herring
  Cc: devicetree, linux-aspeed, andrew, openbmc, linux-kernel, robh+dt,
	osk, linux-arm-kernel

> From: Rob Herring <robh@kernel.org>
> Sent: Thursday, September 30, 2021 6:11 AM
> 
> On Mon, 27 Sep 2021 10:30:51 +0800, Chia-Wei Wang wrote:
> > Add dt-bindings for Aspeed UART routing controller.
> >
> > Signed-off-by: Oskar Senft <osk@google.com>
> > Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> > Reviewed-by: Rob Herring <robh@kernel.org>
> > ---
> >  .../devicetree/bindings/mfd/aspeed-lpc.yaml   |  4 ++
> >  .../bindings/soc/aspeed/uart-routing.yaml     | 56
> +++++++++++++++++++
> >  2 files changed, 60 insertions(+)
> >  create mode 100644
> Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml
> >
> 
> Applied, thanks!

Thanks!

Hi Joel,

Could you help to review the rest patches to see if they are ready to be merged into the linux-aspeed tree?
Thanks.

Regards,
Chiawei

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema
  2021-09-29 22:02   ` Rob Herring
@ 2021-09-30  9:48     ` Lee Jones
  0 siblings, 0 replies; 17+ messages in thread
From: Lee Jones @ 2021-09-30  9:48 UTC (permalink / raw)
  To: Rob Herring
  Cc: devicetree, linux-aspeed, andrew, Chia-Wei Wang, linux-kernel,
	robh+dt, osk, openbmc, linux-arm-kernel

On Wed, 29 Sep 2021, Rob Herring wrote:

> On Mon, 27 Sep 2021 10:30:50 +0800, Chia-Wei Wang wrote:
> > Convert the bindings of Aspeed LPC from text file into YAML schema.
> > 
> > Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> > ---
> >  .../devicetree/bindings/mfd/aspeed-lpc.txt    | 157 ---------------
> >  .../devicetree/bindings/mfd/aspeed-lpc.yaml   | 188 ++++++++++++++++++
> >  2 files changed, 188 insertions(+), 157 deletions(-)
> >  delete mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.txt
> >  create mode 100644 Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
> > 
> 
> Applied, thanks!

Are you taking these now?

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-09-27  2:30 ` [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes Chia-Wei Wang
@ 2021-10-08  4:35   ` Joel Stanley
  2021-10-21  6:28     ` Joel Stanley
  0 siblings, 1 reply; 17+ messages in thread
From: Joel Stanley @ 2021-10-08  4:35 UTC (permalink / raw)
  To: Chia-Wei Wang, Andrew Jeffery
  Cc: devicetree, linux-aspeed, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

On Mon, 27 Sept 2021 at 02:31, Chia-Wei Wang
<chiawei_wang@aspeedtech.com> wrote:
>
> The 'reg-io-width' properties are not used by LPC drivers
> nor documented as part of bindings. Therefore drop them.

I assume they are there due to the lpc having a 'syscon' compatible.
THey are documented in the syscon bindings:

Documentation/devicetree/bindings/mfd/syscon.yaml

Andrew, do you have any comments?

>
> This is in preparation to move aspeed-lpc.txt to YAML schema.
>
> Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> ---
>  arch/arm/boot/dts/aspeed-g4.dtsi | 1 -
>  arch/arm/boot/dts/aspeed-g5.dtsi | 1 -
>  arch/arm/boot/dts/aspeed-g6.dtsi | 1 -
>  3 files changed, 3 deletions(-)
>
> diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi
> index c5aeb3cf3a09..45a25eb4baa4 100644
> --- a/arch/arm/boot/dts/aspeed-g4.dtsi
> +++ b/arch/arm/boot/dts/aspeed-g4.dtsi
> @@ -345,7 +345,6 @@
>                         lpc: lpc@1e789000 {
>                                 compatible = "aspeed,ast2400-lpc-v2", "simple-mfd", "syscon";
>                                 reg = <0x1e789000 0x1000>;
> -                               reg-io-width = <4>;
>
>                                 #address-cells = <1>;
>                                 #size-cells = <1>;
> diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
> index 73ca1ec6fc24..8e1d00d8445e 100644
> --- a/arch/arm/boot/dts/aspeed-g5.dtsi
> +++ b/arch/arm/boot/dts/aspeed-g5.dtsi
> @@ -436,7 +436,6 @@
>                         lpc: lpc@1e789000 {
>                                 compatible = "aspeed,ast2500-lpc-v2", "simple-mfd", "syscon";
>                                 reg = <0x1e789000 0x1000>;
> -                               reg-io-width = <4>;
>
>                                 #address-cells = <1>;
>                                 #size-cells = <1>;
> diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
> index 1b47be1704f8..0d1aae6887cd 100644
> --- a/arch/arm/boot/dts/aspeed-g6.dtsi
> +++ b/arch/arm/boot/dts/aspeed-g6.dtsi
> @@ -490,7 +490,6 @@
>                         lpc: lpc@1e789000 {
>                                 compatible = "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
>                                 reg = <0x1e789000 0x1000>;
> -                               reg-io-width = <4>;
>
>                                 #address-cells = <1>;
>                                 #size-cells = <1>;
> --
> 2.17.1
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 4/5] soc: aspeed: Add UART routing support
  2021-09-27  2:30 ` [PATCH v7 4/5] soc: aspeed: Add UART routing support Chia-Wei Wang
@ 2021-10-08  4:47   ` Joel Stanley
  0 siblings, 0 replies; 17+ messages in thread
From: Joel Stanley @ 2021-10-08  4:47 UTC (permalink / raw)
  To: Chia-Wei Wang, Arnd Bergmann
  Cc: devicetree, linux-aspeed, Andrew Jeffery, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

Hi Arnd,

On Mon, 27 Sept 2021 at 02:31, Chia-Wei Wang
<chiawei_wang@aspeedtech.com> wrote:
>
> Add driver support for the UART routing control. Users can perform
> runtime configuration of the RX muxes among the UART controllers and
> the UART IO pins.
>
> The sysfs interface is also exported for the convenience of routing paths
> check and update.

I would like you to take a look at this one before I put it in the
aspeed tree for v5.16.

This is a BMC specific function, and it's quite specific to the way
the Aspeed part works. I am not a huge fan of the sysfs interface, but
I don't have a better suggestion.

The configuration needs to be runtime, as some systems change where
the serial output appears based on a user connecting to the BMC.

Cheers,

Joel

>
> Signed-off-by: Oskar Senft <osk@google.com>
> Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> Tested-by: Lei YU <yulei.sh@bytedance.com>
> ---
>  .../testing/sysfs-driver-aspeed-uart-routing  |  27 +
>  drivers/soc/aspeed/Kconfig                    |  10 +
>  drivers/soc/aspeed/Makefile                   |   9 +-
>  drivers/soc/aspeed/aspeed-uart-routing.c      | 603 ++++++++++++++++++
>  4 files changed, 645 insertions(+), 4 deletions(-)
>  create mode 100644 Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
>  create mode 100644 drivers/soc/aspeed/aspeed-uart-routing.c
>
> diff --git a/Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing b/Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
> new file mode 100644
> index 000000000000..b363827da437
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing
> @@ -0,0 +1,27 @@
> +What:          /sys/bus/platform/drivers/aspeed-uart-routing/*/uart*
> +Date:          September 2021
> +Contact:       Oskar Senft <osk@google.com>
> +               Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> +Description:   Selects the RX source of the UARTx device.
> +
> +               When read, each file shows the list of available options with currently
> +               selected option marked by brackets "[]". The list of available options
> +               depends on the selected file.
> +
> +               e.g.
> +               cat /sys/bus/platform/drivers/aspeed-uart-routing/*.uart_routing/uart1
> +               [io1] io2 io3 io4 uart2 uart3 uart4 io6
> +
> +               In this case, UART1 gets its input from IO1 (physical serial port 1).
> +
> +Users:         OpenBMC.  Proposed changes should be mailed to
> +               openbmc@lists.ozlabs.org
> +
> +What:          /sys/bus/platform/drivers/aspeed-uart-routing/*/io*
> +Date:          September 2021
> +Contact:       Oskar Senft <osk@google.com>
> +               Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> +Description:   Selects the RX source of IOx serial port. The current selection
> +               will be marked by brackets "[]".
> +Users:         OpenBMC.  Proposed changes should be mailed to
> +               openbmc@lists.ozlabs.org
> diff --git a/drivers/soc/aspeed/Kconfig b/drivers/soc/aspeed/Kconfig
> index 243ca196e6ad..f579ee0b5afa 100644
> --- a/drivers/soc/aspeed/Kconfig
> +++ b/drivers/soc/aspeed/Kconfig
> @@ -24,6 +24,16 @@ config ASPEED_LPC_SNOOP
>           allows the BMC to listen on and save the data written by
>           the host to an arbitrary LPC I/O port.
>
> +config ASPEED_UART_ROUTING
> +       tristate "ASPEED uart routing control"
> +       select REGMAP
> +       select MFD_SYSCON
> +       default ARCH_ASPEED
> +       help
> +         Provides a driver to control the UART routing paths, allowing
> +         users to perform runtime configuration of the RX muxes among
> +         the UART controllers and I/O pins.
> +
>  config ASPEED_P2A_CTRL
>         tristate "ASPEED P2A (VGA MMIO to BMC) bridge control"
>         select REGMAP
> diff --git a/drivers/soc/aspeed/Makefile b/drivers/soc/aspeed/Makefile
> index fcab7192e1a4..b35d74592964 100644
> --- a/drivers/soc/aspeed/Makefile
> +++ b/drivers/soc/aspeed/Makefile
> @@ -1,5 +1,6 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> -obj-$(CONFIG_ASPEED_LPC_CTRL)  += aspeed-lpc-ctrl.o
> -obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o
> -obj-$(CONFIG_ASPEED_P2A_CTRL)  += aspeed-p2a-ctrl.o
> -obj-$(CONFIG_ASPEED_SOCINFO)   += aspeed-socinfo.o
> +obj-$(CONFIG_ASPEED_LPC_CTRL)          += aspeed-lpc-ctrl.o
> +obj-$(CONFIG_ASPEED_LPC_SNOOP)         += aspeed-lpc-snoop.o
> +obj-$(CONFIG_ASPEED_UART_ROUTING)      += aspeed-uart-routing.o
> +obj-$(CONFIG_ASPEED_P2A_CTRL)          += aspeed-p2a-ctrl.o
> +obj-$(CONFIG_ASPEED_SOCINFO)           += aspeed-socinfo.o
> diff --git a/drivers/soc/aspeed/aspeed-uart-routing.c b/drivers/soc/aspeed/aspeed-uart-routing.c
> new file mode 100644
> index 000000000000..ef8b24fd1851
> --- /dev/null
> +++ b/drivers/soc/aspeed/aspeed-uart-routing.c
> @@ -0,0 +1,603 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2018 Google LLC
> + * Copyright (c) 2021 Aspeed Technology Inc.
> + */
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/of_platform.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/regmap.h>
> +#include <linux/platform_device.h>
> +
> +/* register offsets */
> +#define HICR9  0x98
> +#define HICRA  0x9c
> +
> +/* attributes options */
> +#define UART_ROUTING_IO1       "io1"
> +#define UART_ROUTING_IO2       "io2"
> +#define UART_ROUTING_IO3       "io3"
> +#define UART_ROUTING_IO4       "io4"
> +#define UART_ROUTING_IO5       "io5"
> +#define UART_ROUTING_IO6       "io6"
> +#define UART_ROUTING_IO10      "io10"
> +#define UART_ROUTING_UART1     "uart1"
> +#define UART_ROUTING_UART2     "uart2"
> +#define UART_ROUTING_UART3     "uart3"
> +#define UART_ROUTING_UART4     "uart4"
> +#define UART_ROUTING_UART5     "uart5"
> +#define UART_ROUTING_UART6     "uart6"
> +#define UART_ROUTING_UART10    "uart10"
> +#define UART_ROUTING_RES       "reserved"
> +
> +struct aspeed_uart_routing {
> +       struct regmap *map;
> +       struct attribute_group const *attr_grp;
> +};
> +
> +struct aspeed_uart_routing_selector {
> +       struct device_attribute dev_attr;
> +       uint8_t reg;
> +       uint8_t mask;
> +       uint8_t shift;
> +       const char *const options[];
> +};
> +
> +#define to_routing_selector(_dev_attr)                                 \
> +       container_of(_dev_attr, struct aspeed_uart_routing_selector, dev_attr)
> +
> +static ssize_t aspeed_uart_routing_show(struct device *dev,
> +                                       struct device_attribute *attr,
> +                                       char *buf);
> +
> +static ssize_t aspeed_uart_routing_store(struct device *dev,
> +                                        struct device_attribute *attr,
> +                                        const char *buf, size_t count);
> +
> +#define ROUTING_ATTR(_name) {                                  \
> +       .attr = {.name = _name,                                 \
> +                .mode = VERIFY_OCTAL_PERMISSIONS(0644) },      \
> +       .show = aspeed_uart_routing_show,                       \
> +       .store = aspeed_uart_routing_store,                     \
> +}
> +
> +/* routing selector for AST25xx */
> +static struct aspeed_uart_routing_selector ast2500_io6_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO6),
> +       .reg = HICR9,
> +       .shift = 8,
> +       .mask = 0xf,
> +       .options = {
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART5,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO5,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_uart5_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART5),
> +       .reg = HICRA,
> +       .shift = 28,
> +       .mask = 0xf,
> +       .options = {
> +                   UART_ROUTING_IO5,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_uart4_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
> +       .reg = HICRA,
> +       .shift = 25,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +       },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_uart3_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
> +       .reg = HICRA,
> +       .shift = 22,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_uart2_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
> +       .reg = HICRA,
> +       .shift = 19,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_uart1_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
> +       .reg = HICRA,
> +       .shift = 16,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_io5_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO5),
> +       .reg = HICRA,
> +       .shift = 12,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART5,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_io4_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
> +       .reg = HICRA,
> +       .shift = 9,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART5,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_io3_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
> +       .reg = HICRA,
> +       .shift = 6,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART5,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_io2_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
> +       .reg = HICRA,
> +       .shift = 3,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART5,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2500_io1_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
> +       .reg = HICRA,
> +       .shift = 0,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART5,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO6,
> +                   NULL,
> +                   },
> +};
> +
> +static struct attribute *ast2500_uart_routing_attrs[] = {
> +       &ast2500_io6_sel.dev_attr.attr,
> +       &ast2500_uart5_sel.dev_attr.attr,
> +       &ast2500_uart4_sel.dev_attr.attr,
> +       &ast2500_uart3_sel.dev_attr.attr,
> +       &ast2500_uart2_sel.dev_attr.attr,
> +       &ast2500_uart1_sel.dev_attr.attr,
> +       &ast2500_io5_sel.dev_attr.attr,
> +       &ast2500_io4_sel.dev_attr.attr,
> +       &ast2500_io3_sel.dev_attr.attr,
> +       &ast2500_io2_sel.dev_attr.attr,
> +       &ast2500_io1_sel.dev_attr.attr,
> +       NULL,
> +};
> +
> +static const struct attribute_group ast2500_uart_routing_attr_group = {
> +       .attrs = ast2500_uart_routing_attrs,
> +};
> +
> +/* routing selector for AST26xx */
> +static struct aspeed_uart_routing_selector ast2600_uart10_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART10),
> +       .reg = HICR9,
> +       .shift = 12,
> +       .mask = 0xf,
> +       .options = {
> +                   UART_ROUTING_IO10,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                       UART_ROUTING_RES,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_io10_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO10),
> +       .reg = HICR9,
> +       .shift = 8,
> +       .mask = 0xf,
> +       .options = {
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                       UART_ROUTING_RES,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                       UART_ROUTING_RES,
> +                   UART_ROUTING_UART10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_uart4_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
> +       .reg = HICRA,
> +       .shift = 25,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +       },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_uart3_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
> +       .reg = HICRA,
> +       .shift = 22,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_uart2_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
> +       .reg = HICRA,
> +       .shift = 19,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_uart1_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
> +       .reg = HICRA,
> +       .shift = 16,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_io4_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
> +       .reg = HICRA,
> +       .shift = 9,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART10,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_io3_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
> +       .reg = HICRA,
> +       .shift = 6,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART10,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_IO1,
> +                   UART_ROUTING_IO2,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_io2_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
> +       .reg = HICRA,
> +       .shift = 3,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART10,
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct aspeed_uart_routing_selector ast2600_io1_sel = {
> +       .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
> +       .reg = HICRA,
> +       .shift = 0,
> +       .mask = 0x7,
> +       .options = {
> +                   UART_ROUTING_UART1,
> +                   UART_ROUTING_UART2,
> +                   UART_ROUTING_UART3,
> +                   UART_ROUTING_UART4,
> +                   UART_ROUTING_UART10,
> +                   UART_ROUTING_IO3,
> +                   UART_ROUTING_IO4,
> +                   UART_ROUTING_IO10,
> +                   NULL,
> +                   },
> +};
> +
> +static struct attribute *ast2600_uart_routing_attrs[] = {
> +       &ast2600_uart10_sel.dev_attr.attr,
> +       &ast2600_io10_sel.dev_attr.attr,
> +       &ast2600_uart4_sel.dev_attr.attr,
> +       &ast2600_uart3_sel.dev_attr.attr,
> +       &ast2600_uart2_sel.dev_attr.attr,
> +       &ast2600_uart1_sel.dev_attr.attr,
> +       &ast2600_io4_sel.dev_attr.attr,
> +       &ast2600_io3_sel.dev_attr.attr,
> +       &ast2600_io2_sel.dev_attr.attr,
> +       &ast2600_io1_sel.dev_attr.attr,
> +       NULL,
> +};
> +
> +static const struct attribute_group ast2600_uart_routing_attr_group = {
> +       .attrs = ast2600_uart_routing_attrs,
> +};
> +
> +static ssize_t aspeed_uart_routing_show(struct device *dev,
> +                                       struct device_attribute *attr,
> +                                       char *buf)
> +{
> +       struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
> +       struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
> +       int val, pos, len;
> +
> +       regmap_read(uart_routing->map, sel->reg, &val);
> +       val = (val >> sel->shift) & sel->mask;
> +
> +       len = 0;
> +       for (pos = 0; sel->options[pos] != NULL; ++pos) {
> +               if (pos == val)
> +                       len += sysfs_emit_at(buf, len, "[%s] ", sel->options[pos]);
> +               else
> +                       len += sysfs_emit_at(buf, len, "%s ", sel->options[pos]);
> +       }
> +
> +       if (val >= pos)
> +               len += sysfs_emit_at(buf, len, "[unknown(%d)]", val);
> +
> +       len += sysfs_emit_at(buf, len, "\n");
> +
> +       return len;
> +}
> +
> +static ssize_t aspeed_uart_routing_store(struct device *dev,
> +                                        struct device_attribute *attr,
> +                                        const char *buf, size_t count)
> +{
> +       struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
> +       struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
> +       int val;
> +
> +       val = match_string(sel->options, -1, buf);
> +       if (val < 0) {
> +               dev_err(dev, "invalid value \"%s\"\n", buf);
> +               return -EINVAL;
> +       }
> +
> +       regmap_update_bits(uart_routing->map, sel->reg,
> +                       (sel->mask << sel->shift),
> +                       (val & sel->mask) << sel->shift);
> +
> +       return count;
> +}
> +
> +static int aspeed_uart_routing_probe(struct platform_device *pdev)
> +{
> +       int rc;
> +       struct device *dev = &pdev->dev;
> +       struct aspeed_uart_routing *uart_routing;
> +
> +       uart_routing = devm_kzalloc(&pdev->dev, sizeof(*uart_routing), GFP_KERNEL);
> +       if (!uart_routing)
> +               return -ENOMEM;
> +
> +       uart_routing->map = syscon_node_to_regmap(dev->parent->of_node);
> +       if (IS_ERR(uart_routing->map)) {
> +               dev_err(dev, "cannot get regmap\n");
> +               return PTR_ERR(uart_routing->map);
> +       }
> +
> +       uart_routing->attr_grp = of_device_get_match_data(dev);
> +
> +       rc = sysfs_create_group(&dev->kobj, uart_routing->attr_grp);
> +       if (rc < 0)
> +               return rc;
> +
> +       dev_set_drvdata(dev, uart_routing);
> +
> +       dev_info(dev, "module loaded\n");
> +
> +       return 0;
> +}
> +
> +static int aspeed_uart_routing_remove(struct platform_device *pdev)
> +{
> +       struct device *dev = &pdev->dev;
> +       struct aspeed_uart_routing *uart_routing = platform_get_drvdata(pdev);
> +
> +       sysfs_remove_group(&dev->kobj, uart_routing->attr_grp);
> +
> +       return 0;
> +}
> +
> +static const struct of_device_id aspeed_uart_routing_table[] = {
> +       { .compatible = "aspeed,ast2400-uart-routing",
> +         .data = &ast2500_uart_routing_attr_group },
> +       { .compatible = "aspeed,ast2500-uart-routing",
> +         .data = &ast2500_uart_routing_attr_group },
> +       { .compatible = "aspeed,ast2600-uart-routing",
> +         .data = &ast2600_uart_routing_attr_group },
> +       { },
> +};
> +
> +static struct platform_driver aspeed_uart_routing_driver = {
> +       .driver = {
> +               .name = "aspeed-uart-routing",
> +               .of_match_table = aspeed_uart_routing_table,
> +       },
> +       .probe = aspeed_uart_routing_probe,
> +       .remove = aspeed_uart_routing_remove,
> +};
> +
> +module_platform_driver(aspeed_uart_routing_driver);
> +
> +MODULE_AUTHOR("Oskar Senft <osk@google.com>");
> +MODULE_AUTHOR("Chia-Wei Wang <chiawei_wang@aspeedtech.com>");
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("Driver to configure Aspeed UART routing");
> --
> 2.17.1
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-10-08  4:35   ` Joel Stanley
@ 2021-10-21  6:28     ` Joel Stanley
  2021-10-21  6:37       ` ChiaWei Wang
  0 siblings, 1 reply; 17+ messages in thread
From: Joel Stanley @ 2021-10-21  6:28 UTC (permalink / raw)
  To: Chia-Wei Wang, Andrew Jeffery
  Cc: devicetree, linux-aspeed, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

On Fri, 8 Oct 2021 at 04:35, Joel Stanley <joel@jms.id.au> wrote:
>
> On Mon, 27 Sept 2021 at 02:31, Chia-Wei Wang
> <chiawei_wang@aspeedtech.com> wrote:
> >
> > The 'reg-io-width' properties are not used by LPC drivers
> > nor documented as part of bindings. Therefore drop them.
>
> I assume they are there due to the lpc having a 'syscon' compatible.
> THey are documented in the syscon bindings:
>
> Documentation/devicetree/bindings/mfd/syscon.yaml
>
> Andrew, do you have any comments?

Andrew indicated to me that he agreed with my observation: the
properties should be present as they are used by the regmap/syscon.

>
> >
> > This is in preparation to move aspeed-lpc.txt to YAML schema.
> >
> > Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> > ---
> >  arch/arm/boot/dts/aspeed-g4.dtsi | 1 -
> >  arch/arm/boot/dts/aspeed-g5.dtsi | 1 -
> >  arch/arm/boot/dts/aspeed-g6.dtsi | 1 -
> >  3 files changed, 3 deletions(-)
> >
> > diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi
> > index c5aeb3cf3a09..45a25eb4baa4 100644
> > --- a/arch/arm/boot/dts/aspeed-g4.dtsi
> > +++ b/arch/arm/boot/dts/aspeed-g4.dtsi
> > @@ -345,7 +345,6 @@
> >                         lpc: lpc@1e789000 {
> >                                 compatible = "aspeed,ast2400-lpc-v2", "simple-mfd", "syscon";
> >                                 reg = <0x1e789000 0x1000>;
> > -                               reg-io-width = <4>;
> >
> >                                 #address-cells = <1>;
> >                                 #size-cells = <1>;
> > diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
> > index 73ca1ec6fc24..8e1d00d8445e 100644
> > --- a/arch/arm/boot/dts/aspeed-g5.dtsi
> > +++ b/arch/arm/boot/dts/aspeed-g5.dtsi
> > @@ -436,7 +436,6 @@
> >                         lpc: lpc@1e789000 {
> >                                 compatible = "aspeed,ast2500-lpc-v2", "simple-mfd", "syscon";
> >                                 reg = <0x1e789000 0x1000>;
> > -                               reg-io-width = <4>;
> >
> >                                 #address-cells = <1>;
> >                                 #size-cells = <1>;
> > diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
> > index 1b47be1704f8..0d1aae6887cd 100644
> > --- a/arch/arm/boot/dts/aspeed-g6.dtsi
> > +++ b/arch/arm/boot/dts/aspeed-g6.dtsi
> > @@ -490,7 +490,6 @@
> >                         lpc: lpc@1e789000 {
> >                                 compatible = "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
> >                                 reg = <0x1e789000 0x1000>;
> > -                               reg-io-width = <4>;
> >
> >                                 #address-cells = <1>;
> >                                 #size-cells = <1>;
> > --
> > 2.17.1
> >

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-10-21  6:28     ` Joel Stanley
@ 2021-10-21  6:37       ` ChiaWei Wang
  2021-10-21  6:48         ` Joel Stanley
  0 siblings, 1 reply; 17+ messages in thread
From: ChiaWei Wang @ 2021-10-21  6:37 UTC (permalink / raw)
  To: Joel Stanley, Andrew Jeffery
  Cc: devicetree, linux-aspeed, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

> From: Joel Stanley <joel@jms.id.au>
> Sent: Thursday, October 21, 2021 2:29 PM
> 
> On Fri, 8 Oct 2021 at 04:35, Joel Stanley <joel@jms.id.au> wrote:
> >
> > On Mon, 27 Sept 2021 at 02:31, Chia-Wei Wang
> > <chiawei_wang@aspeedtech.com> wrote:
> > >
> > > The 'reg-io-width' properties are not used by LPC drivers nor
> > > documented as part of bindings. Therefore drop them.
> >
> > I assume they are there due to the lpc having a 'syscon' compatible.
> > THey are documented in the syscon bindings:
> >
> > Documentation/devicetree/bindings/mfd/syscon.yaml
> >
> > Andrew, do you have any comments?
> 
> Andrew indicated to me that he agreed with my observation: the properties
> should be present as they are used by the regmap/syscon.

Thanks. Shall we just drop this one and move on with the rest patches?
However, like Rob mentioned, when doing 'make dtbs_check', there is a warning:

/builds/robherring/linux-dt-review/arch/arm/boot/dts/aspeed-ast2500-evb.dt.yaml:
lpc@1e789000: 'ibt@140', 'kcs@114', 'kcs@24', 'kcs@28', 'kcs@2c', 'lhc@a0', 'reg-io-width' do not match any of the regexes:
'^lpc-ctrl@[0-9a-f]+$', '^lpc-snoop@[0-9a-f]+$', '^reset-controller@[0-9a-f]+$', 'pinctrl-[0-9]+'
From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml

As part of this series has been applied, maybe we can fix this later?

Regards,
Chiawei

> 
> >
> > >
> > > This is in preparation to move aspeed-lpc.txt to YAML schema.
> > >
> > > Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> > > ---
> > >  arch/arm/boot/dts/aspeed-g4.dtsi | 1 -
> > > arch/arm/boot/dts/aspeed-g5.dtsi | 1 -
> > > arch/arm/boot/dts/aspeed-g6.dtsi | 1 -
> > >  3 files changed, 3 deletions(-)
> > >
> > > diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi
> > > b/arch/arm/boot/dts/aspeed-g4.dtsi
> > > index c5aeb3cf3a09..45a25eb4baa4 100644
> > > --- a/arch/arm/boot/dts/aspeed-g4.dtsi
> > > +++ b/arch/arm/boot/dts/aspeed-g4.dtsi
> > > @@ -345,7 +345,6 @@
> > >                         lpc: lpc@1e789000 {
> > >                                 compatible =
> "aspeed,ast2400-lpc-v2", "simple-mfd", "syscon";
> > >                                 reg = <0x1e789000 0x1000>;
> > > -                               reg-io-width = <4>;
> > >
> > >                                 #address-cells = <1>;
> > >                                 #size-cells = <1>; diff --git
> > > a/arch/arm/boot/dts/aspeed-g5.dtsi
> > > b/arch/arm/boot/dts/aspeed-g5.dtsi
> > > index 73ca1ec6fc24..8e1d00d8445e 100644
> > > --- a/arch/arm/boot/dts/aspeed-g5.dtsi
> > > +++ b/arch/arm/boot/dts/aspeed-g5.dtsi
> > > @@ -436,7 +436,6 @@
> > >                         lpc: lpc@1e789000 {
> > >                                 compatible =
> "aspeed,ast2500-lpc-v2", "simple-mfd", "syscon";
> > >                                 reg = <0x1e789000 0x1000>;
> > > -                               reg-io-width = <4>;
> > >
> > >                                 #address-cells = <1>;
> > >                                 #size-cells = <1>; diff --git
> > > a/arch/arm/boot/dts/aspeed-g6.dtsi
> > > b/arch/arm/boot/dts/aspeed-g6.dtsi
> > > index 1b47be1704f8..0d1aae6887cd 100644
> > > --- a/arch/arm/boot/dts/aspeed-g6.dtsi
> > > +++ b/arch/arm/boot/dts/aspeed-g6.dtsi
> > > @@ -490,7 +490,6 @@
> > >                         lpc: lpc@1e789000 {
> > >                                 compatible =
> "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
> > >                                 reg = <0x1e789000 0x1000>;
> > > -                               reg-io-width = <4>;
> > >
> > >                                 #address-cells = <1>;
> > >                                 #size-cells = <1>;
> > > --
> > > 2.17.1
> > >

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-10-21  6:37       ` ChiaWei Wang
@ 2021-10-21  6:48         ` Joel Stanley
  2021-10-21  6:54           ` Joel Stanley
  0 siblings, 1 reply; 17+ messages in thread
From: Joel Stanley @ 2021-10-21  6:48 UTC (permalink / raw)
  To: ChiaWei Wang
  Cc: devicetree, linux-aspeed, Andrew Jeffery, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

On Thu, 21 Oct 2021 at 06:37, ChiaWei Wang <chiawei_wang@aspeedtech.com> wrote:
>
> > From: Joel Stanley <joel@jms.id.au>
> > Sent: Thursday, October 21, 2021 2:29 PM
> >
> > On Fri, 8 Oct 2021 at 04:35, Joel Stanley <joel@jms.id.au> wrote:
> > >
> > > On Mon, 27 Sept 2021 at 02:31, Chia-Wei Wang
> > > <chiawei_wang@aspeedtech.com> wrote:
> > > >
> > > > The 'reg-io-width' properties are not used by LPC drivers nor
> > > > documented as part of bindings. Therefore drop them.
> > >
> > > I assume they are there due to the lpc having a 'syscon' compatible.
> > > THey are documented in the syscon bindings:
> > >
> > > Documentation/devicetree/bindings/mfd/syscon.yaml
> > >
> > > Andrew, do you have any comments?
> >
> > Andrew indicated to me that he agreed with my observation: the properties
> > should be present as they are used by the regmap/syscon.
>
> Thanks. Shall we just drop this one and move on with the rest patches?
> However, like Rob mentioned, when doing 'make dtbs_check', there is a warning:
>
> /builds/robherring/linux-dt-review/arch/arm/boot/dts/aspeed-ast2500-evb.dt.yaml:
> lpc@1e789000: 'ibt@140', 'kcs@114', 'kcs@24', 'kcs@28', 'kcs@2c', 'lhc@a0', 'reg-io-width' do not match any of the regexes:
> '^lpc-ctrl@[0-9a-f]+$', '^lpc-snoop@[0-9a-f]+$', '^reset-controller@[0-9a-f]+$', 'pinctrl-[0-9]+'
> From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
>
> As part of this series has been applied, maybe we can fix this later?

Yes, that's a good idea.

I will send a pull request with your driver to the soc maintainers.

Cheers,

Joel

>
> Regards,
> Chiawei
>
> >
> > >
> > > >
> > > > This is in preparation to move aspeed-lpc.txt to YAML schema.
> > > >
> > > > Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> > > > ---
> > > >  arch/arm/boot/dts/aspeed-g4.dtsi | 1 -
> > > > arch/arm/boot/dts/aspeed-g5.dtsi | 1 -
> > > > arch/arm/boot/dts/aspeed-g6.dtsi | 1 -
> > > >  3 files changed, 3 deletions(-)
> > > >
> > > > diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi
> > > > b/arch/arm/boot/dts/aspeed-g4.dtsi
> > > > index c5aeb3cf3a09..45a25eb4baa4 100644
> > > > --- a/arch/arm/boot/dts/aspeed-g4.dtsi
> > > > +++ b/arch/arm/boot/dts/aspeed-g4.dtsi
> > > > @@ -345,7 +345,6 @@
> > > >                         lpc: lpc@1e789000 {
> > > >                                 compatible =
> > "aspeed,ast2400-lpc-v2", "simple-mfd", "syscon";
> > > >                                 reg = <0x1e789000 0x1000>;
> > > > -                               reg-io-width = <4>;
> > > >
> > > >                                 #address-cells = <1>;
> > > >                                 #size-cells = <1>; diff --git
> > > > a/arch/arm/boot/dts/aspeed-g5.dtsi
> > > > b/arch/arm/boot/dts/aspeed-g5.dtsi
> > > > index 73ca1ec6fc24..8e1d00d8445e 100644
> > > > --- a/arch/arm/boot/dts/aspeed-g5.dtsi
> > > > +++ b/arch/arm/boot/dts/aspeed-g5.dtsi
> > > > @@ -436,7 +436,6 @@
> > > >                         lpc: lpc@1e789000 {
> > > >                                 compatible =
> > "aspeed,ast2500-lpc-v2", "simple-mfd", "syscon";
> > > >                                 reg = <0x1e789000 0x1000>;
> > > > -                               reg-io-width = <4>;
> > > >
> > > >                                 #address-cells = <1>;
> > > >                                 #size-cells = <1>; diff --git
> > > > a/arch/arm/boot/dts/aspeed-g6.dtsi
> > > > b/arch/arm/boot/dts/aspeed-g6.dtsi
> > > > index 1b47be1704f8..0d1aae6887cd 100644
> > > > --- a/arch/arm/boot/dts/aspeed-g6.dtsi
> > > > +++ b/arch/arm/boot/dts/aspeed-g6.dtsi
> > > > @@ -490,7 +490,6 @@
> > > >                         lpc: lpc@1e789000 {
> > > >                                 compatible =
> > "aspeed,ast2600-lpc-v2", "simple-mfd", "syscon";
> > > >                                 reg = <0x1e789000 0x1000>;
> > > > -                               reg-io-width = <4>;
> > > >
> > > >                                 #address-cells = <1>;
> > > >                                 #size-cells = <1>;
> > > > --
> > > > 2.17.1
> > > >

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-10-21  6:48         ` Joel Stanley
@ 2021-10-21  6:54           ` Joel Stanley
  2021-10-21  6:59             ` ChiaWei Wang
  0 siblings, 1 reply; 17+ messages in thread
From: Joel Stanley @ 2021-10-21  6:54 UTC (permalink / raw)
  To: ChiaWei Wang
  Cc: devicetree, linux-aspeed, Andrew Jeffery, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

On Thu, 21 Oct 2021 at 06:48, Joel Stanley <joel@jms.id.au> wrote:
>
> On Thu, 21 Oct 2021 at 06:37, ChiaWei Wang <chiawei_wang@aspeedtech.com> wrote:
> > However, like Rob mentioned, when doing 'make dtbs_check', there is a warning:
> >
> > /builds/robherring/linux-dt-review/arch/arm/boot/dts/aspeed-ast2500-evb.dt.yaml:
> > lpc@1e789000: 'ibt@140', 'kcs@114', 'kcs@24', 'kcs@28', 'kcs@2c', 'lhc@a0', 'reg-io-width' do not match any of the regexes:
> > '^lpc-ctrl@[0-9a-f]+$', '^lpc-snoop@[0-9a-f]+$', '^reset-controller@[0-9a-f]+$', 'pinctrl-[0-9]+'
> > From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
> >
> > As part of this series has been applied, maybe we can fix this later?

FWIW, this fixes the warnings for me;

--- a/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
+++ b/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
@@ -56,6 +56,9 @@ properties:

   ranges: true

+  reg-io-width:
+    const: 4
+
 patternProperties:
   "^lpc-ctrl@[0-9a-f]+$":
     type: object
@@ -144,6 +147,9 @@ patternProperties:
         $ref: /schemas/types.yaml#/definitions/uint32-array
         description: The LPC I/O ports to snoop

+      clocks:
+        maxItems: 1
+
     required:
       - compatible
       - interrupts

make ARCH=arm CROSS_COMPILE="arm-linux-gnueabi-" dtbs_check
DT_SCHEMA_FILES=Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml

If you are able to test this and send a patch that would be appreciated.

Cheers,

Joel

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes
  2021-10-21  6:54           ` Joel Stanley
@ 2021-10-21  6:59             ` ChiaWei Wang
  0 siblings, 0 replies; 17+ messages in thread
From: ChiaWei Wang @ 2021-10-21  6:59 UTC (permalink / raw)
  To: Joel Stanley
  Cc: devicetree, linux-aspeed, Andrew Jeffery, OpenBMC Maillist,
	Linux Kernel Mailing List, Rob Herring, Oskar Senft, Linux ARM

> From: Joel Stanley <joel@jms.id.au>
> Sent: Thursday, October 21, 2021 2:54 PM
> 
> On Thu, 21 Oct 2021 at 06:48, Joel Stanley <joel@jms.id.au> wrote:
> >
> > On Thu, 21 Oct 2021 at 06:37, ChiaWei Wang
> <chiawei_wang@aspeedtech.com> wrote:
> > > However, like Rob mentioned, when doing 'make dtbs_check', there is a
> warning:
> > >
> > >
> /builds/robherring/linux-dt-review/arch/arm/boot/dts/aspeed-ast2500-evb.dt.y
> aml:
> > > lpc@1e789000: 'ibt@140', 'kcs@114', 'kcs@24', 'kcs@28', 'kcs@2c',
> 'lhc@a0', 'reg-io-width' do not match any of the regexes:
> > > '^lpc-ctrl@[0-9a-f]+$', '^lpc-snoop@[0-9a-f]+$',
> '^reset-controller@[0-9a-f]+$', 'pinctrl-[0-9]+'
> > > From schema:
> > > /builds/robherring/linux-dt-review/Documentation/devicetree/bindings
> > > /mfd/aspeed-lpc.yaml
> > >
> > > As part of this series has been applied, maybe we can fix this later?
> 
> FWIW, this fixes the warnings for me;
> 
> --- a/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
> +++ b/Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
> @@ -56,6 +56,9 @@ properties:
> 
>    ranges: true
> 
> +  reg-io-width:
> +    const: 4
> +
>  patternProperties:
>    "^lpc-ctrl@[0-9a-f]+$":
>      type: object
> @@ -144,6 +147,9 @@ patternProperties:
>          $ref: /schemas/types.yaml#/definitions/uint32-array
>          description: The LPC I/O ports to snoop
> 
> +      clocks:
> +        maxItems: 1
> +
>      required:
>        - compatible
>        - interrupts
> 
> make ARCH=arm CROSS_COMPILE="arm-linux-gnueabi-" dtbs_check
> DT_SCHEMA_FILES=Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml
> 
> If you are able to test this and send a patch that would be appreciated.

Sure. I will test it and send a standalone patch to fix the warning.
Thanks!

Regards,
Chiawei

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2021-10-21  7:00 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-27  2:30 [PATCH v7 0/5] arm: aspeed: Add UART routing support Chia-Wei Wang
2021-09-27  2:30 ` [PATCH v7 1/5] ARM: dts: aspeed: Drop reg-io-width from LPC nodes Chia-Wei Wang
2021-10-08  4:35   ` Joel Stanley
2021-10-21  6:28     ` Joel Stanley
2021-10-21  6:37       ` ChiaWei Wang
2021-10-21  6:48         ` Joel Stanley
2021-10-21  6:54           ` Joel Stanley
2021-10-21  6:59             ` ChiaWei Wang
2021-09-27  2:30 ` [PATCH v7 2/5] dt-bindings: mfd: aspeed-lpc: Convert to YAML schema Chia-Wei Wang
2021-09-29 22:02   ` Rob Herring
2021-09-30  9:48     ` Lee Jones
2021-09-27  2:30 ` [PATCH v7 3/5] dt-bindings: aspeed: Add UART routing controller Chia-Wei Wang
2021-09-29 22:11   ` Rob Herring
2021-09-30  1:55     ` ChiaWei Wang
2021-09-27  2:30 ` [PATCH v7 4/5] soc: aspeed: Add UART routing support Chia-Wei Wang
2021-10-08  4:47   ` Joel Stanley
2021-09-27  2:30 ` [PATCH v7 5/5] ARM: dts: aspeed: Add uart routing to device tree Chia-Wei Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).