Devicetree
 help / color / mirror / Atom feed
* [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse
@ 2026-09-27 15:10 Pablo Mazzini
  2026-09-27 15:10 ` [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288 Pablo Mazzini
                   ` (7 more replies)
  0 siblings, 8 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Chen-Yu Tsai, Jernej Skrabec, Samuel Holland
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-clk,
	linux-gpio, linux-i2c, linux-kernel, linux-mmc, linux-rtc,
	linux-sunxi

The Allwinner B288 (sun8iw10p1) is a dual Cortex-A7 SoC used in e-book
readers. This series adds the CCU and pin controller drivers, the RTC,
I2C, MMC and NMI compatibles, the SoC .dtsi, and one board: the
PocketBook Verse (PB629), a 6" reader.

The B288 is closest to the A64: most of its PLLs are bit-identical.
The clock and pin descriptions come from Allwinner's BSP, cross-checked
against ccu-sun50i-a64.c. Tested on a PB629, boots to userspace.

Changes since v1:
  - Add this cover letter.
  - Drop both new bindings; add the compatibles to the existing
    allwinner,sun4i-a10-{ccu,pinctrl}.yaml instead.
  - Rewrite the pinctrl driver in the DT-provided pinmux style.

Pablo Mazzini (11):
  dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288
  clk: sunxi-ng: add Allwinner B288 CCU driver
  dt-bindings: pinctrl: sun4i-a10: add Allwinner B288
  pinctrl: sunxi: add Allwinner B288 pin controller driver
  dt-bindings: rtc: sun6i-a31: add Allwinner B288
  rtc: sun6i: add Allwinner B288 compatible
  dt-bindings: i2c: mv64xxx: add Allwinner B288
  dt-bindings: mmc: sun4i-a10-mmc: add Allwinner B288
  dt-bindings: interrupt-controller: add Allwinner B288 NMI
  dt-bindings: arm: sunxi: add PocketBook Verse
  ARM: sunxi: add B288 and the PocketBook Verse board

 .../devicetree/bindings/arm/sunxi.yaml        |   5 +
 .../clock/allwinner,sun4i-a10-ccu.yaml        |   1 +
 .../bindings/i2c/marvell,mv64xxx-i2c.yaml     |   1 +
 .../allwinner,sun7i-a20-sc-nmi.yaml           |   1 +
 .../bindings/mmc/allwinner,sun4i-a10-mmc.yaml |   2 +
 .../pinctrl/allwinner,sun4i-a10-pinctrl.yaml  |  23 +
 .../bindings/rtc/allwinner,sun6i-a31-rtc.yaml |   2 +
 arch/arm/boot/dts/allwinner/Makefile          |   1 +
 .../allwinner/sun8i-b288-pocketbook-verse.dts | 122 ++++
 arch/arm/boot/dts/allwinner/sun8i-b288.dtsi   | 304 ++++++++
 arch/arm/mach-sunxi/sunxi.c                   |   1 +
 drivers/clk/sunxi-ng/Kconfig                  |   5 +
 drivers/clk/sunxi-ng/Makefile                 |   1 +
 drivers/clk/sunxi-ng/ccu-sun8i-b288.c         | 660 ++++++++++++++++++
 drivers/clk/sunxi-ng/ccu-sun8i-b288.h         |  10 +
 drivers/pinctrl/sunxi/Kconfig                 |  10 +
 drivers/pinctrl/sunxi/Makefile                |   1 +
 drivers/pinctrl/sunxi/pinctrl-sun8i-b288.c    |  53 ++
 drivers/rtc/rtc-sun6i.c                       |   1 +
 include/dt-bindings/clock/sun8i-b288-ccu.h    |  88 +++
 include/dt-bindings/reset/sun8i-b288-ccu.h    |  45 ++
 21 files changed, 1337 insertions(+)
 create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
 create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
 create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-b288.c
 create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-b288.h
 create mode 100644 drivers/pinctrl/sunxi/pinctrl-sun8i-b288.c
 create mode 100644 include/dt-bindings/clock/sun8i-b288-ccu.h
 create mode 100644 include/dt-bindings/reset/sun8i-b288-ccu.h

-- 
2.53.0


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

* [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-30 10:08   ` Krzysztof Kozlowski
  2026-09-27 15:10 ` [PATCH v2 03/11] dt-bindings: pinctrl: sun4i-a10: " Pablo Mazzini
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Brian Masney, Chen-Yu Tsai, Conor Dooley, Jernej Skrabec,
	Jerome Brunet, Krzysztof Kozlowski, Maxime Ripard, Philipp Zabel,
	Rob Herring, Samuel Holland, Stephen Boyd
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-clk,
	linux-kernel, linux-sunxi

The B288 (sun8iw10p1) is a dual Cortex-A7 SoC used in e-book readers.
Its CCU needs only the two oscillator inputs, so it fits the existing
schema without changes.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 .../clock/allwinner,sun4i-a10-ccu.yaml        |  1 +
 include/dt-bindings/clock/sun8i-b288-ccu.h    | 88 +++++++++++++++++++
 include/dt-bindings/reset/sun8i-b288-ccu.h    | 45 ++++++++++
 3 files changed, 134 insertions(+)
 create mode 100644 include/dt-bindings/clock/sun8i-b288-ccu.h
 create mode 100644 include/dt-bindings/reset/sun8i-b288-ccu.h

diff --git a/Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ccu.yaml b/Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ccu.yaml
index 1690b9d99c3d..cc3f62d3554c 100644
--- a/Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ccu.yaml
+++ b/Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ccu.yaml
@@ -28,6 +28,7 @@ properties:
       - allwinner,sun8i-a33-ccu
       - allwinner,sun8i-a83t-ccu
       - allwinner,sun8i-a83t-r-ccu
+      - allwinner,sun8i-b288-ccu
       - allwinner,sun8i-h3-ccu
       - allwinner,sun8i-h3-r-ccu
       - allwinner,sun8i-r40-ccu
diff --git a/include/dt-bindings/clock/sun8i-b288-ccu.h b/include/dt-bindings/clock/sun8i-b288-ccu.h
new file mode 100644
index 000000000000..8983c6d2f362
--- /dev/null
+++ b/include/dt-bindings/clock/sun8i-b288-ccu.h
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
+#ifndef _DT_BINDINGS_CLK_SUN8I_B288_H_
+#define _DT_BINDINGS_CLK_SUN8I_B288_H_
+
+#define CLK_PLL_CPUX	0
+#define CLK_PLL_AUDIO_BASE	1
+#define CLK_PLL_VIDEO0	2
+#define CLK_PLL_DDR0	3
+#define CLK_PLL_PERIPH0	4
+#define CLK_PLL_VIDEO1	5
+#define CLK_PLL_24M	6
+#define CLK_PLL_PERIPH1	7
+#define CLK_PLL_DE	8
+#define CLK_PLL_DDR1	9
+
+#define CLK_PLL_PERIPH0_2X	10
+#define CLK_PLL_PERIPH1_2X	11
+#define CLK_CPUX	12
+#define CLK_AXI	13
+#define CLK_CPUAPB	14
+#define CLK_AHB1	15
+#define CLK_APB1	16
+#define CLK_APB2	17
+
+#define CLK_NAND	18
+#define CLK_MMC0	19
+#define CLK_MMC1	20
+#define CLK_MMC2	21
+#define CLK_MMC3	22
+#define CLK_SPI0	23
+#define CLK_SPI1	24
+#define CLK_SPI2	25
+#define CLK_DRAM	26
+#define CLK_DE	27
+#define CLK_EE	28
+#define CLK_EDMA	29
+#define CLK_TCON0	30
+#define CLK_MBUS	31
+
+#define CLK_BUS_THS	32
+#define CLK_BUS_NAND	33
+#define CLK_BUS_SDMMC0_BUS	34
+#define CLK_BUS_SDMMC1_BUS	35
+#define CLK_BUS_SDMMC2_BUS	36
+#define CLK_BUS_SDMMC3_BUS	37
+#define CLK_BUS_SPI0	38
+#define CLK_BUS_SPI1	39
+#define CLK_BUS_SPI2	40
+#define CLK_BUS_I2S0	41
+#define CLK_BUS_I2S1	42
+#define CLK_BUS_SPDIF	43
+#define CLK_BUS_DSD	44
+#define CLK_BUS_DMIC	45
+#define CLK_BUS_USBOHCI0	46
+#define CLK_BUS_USBEHCI0	47
+#define CLK_BUS_USBOTG	48
+#define CLK_BUS_DE	49
+#define CLK_BUS_EE	50
+#define CLK_BUS_TCON0	51
+#define CLK_BUS_CSI	52
+#define CLK_BUS_ADDA	53
+#define CLK_BUS_SDRAM	54
+#define CLK_BUS_PSRAM	55
+#define CLK_BUS_DMA	56
+#define CLK_BUS_UART0	57
+#define CLK_BUS_UART1	58
+#define CLK_BUS_UART2	59
+#define CLK_BUS_UART3	60
+#define CLK_BUS_UART4	61
+#define CLK_BUS_UART5	62
+#define CLK_BUS_TWI0	63
+#define CLK_BUS_TWI1	64
+#define CLK_BUS_TWI2	65
+#define CLK_BUS_PIO	66
+#define CLK_BUS_GPADC	67
+#define CLK_BUS_KEYADC	68
+
+/*
+ * mmc0 and mmc1 are v4p1x controllers driven in the old timing mode, which
+ * needs the sample and output phase clocks. mmc2 and mmc3 are newer blocks
+ * that do their own delay calibration and have none.
+ */
+#define CLK_MMC0_SAMPLE	69
+#define CLK_MMC0_OUTPUT	70
+#define CLK_MMC1_SAMPLE	71
+#define CLK_MMC1_OUTPUT	72
+
+#endif
diff --git a/include/dt-bindings/reset/sun8i-b288-ccu.h b/include/dt-bindings/reset/sun8i-b288-ccu.h
new file mode 100644
index 000000000000..675145654548
--- /dev/null
+++ b/include/dt-bindings/reset/sun8i-b288-ccu.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
+#ifndef _DT_BINDINGS_RST_SUN8I_B288_H_
+#define _DT_BINDINGS_RST_SUN8I_B288_H_
+
+#define RST_BUS_THS	0
+#define RST_BUS_NAND	1
+#define RST_BUS_MMC0	2
+#define RST_BUS_MMC1	3
+#define RST_BUS_MMC2	4
+#define RST_BUS_MMC3	5
+#define RST_BUS_SPI0	6
+#define RST_BUS_SPI1	7
+#define RST_BUS_SPI2	8
+#define RST_BUS_I2S0	9
+#define RST_BUS_I2S1	10
+#define RST_BUS_SPDIF	11
+#define RST_BUS_DSD	12
+#define RST_BUS_DMIC	13
+#define RST_USBPHY0	14
+#define RST_BUS_OHCI0	15
+#define RST_BUS_EHCI0	16
+#define RST_BUS_OTG	17
+#define RST_BUS_DE	18
+#define RST_BUS_EE	19
+#define RST_BUS_TCON0	20
+#define RST_BUS_CSI	21
+#define RST_BUS_ADDA	22
+#define RST_BUS_WLAN	23
+#define RST_MBUS	24
+#define RST_BUS_DRAM	25
+#define RST_BUS_PSRAM	26
+#define RST_BUS_DMA	27
+#define RST_BUS_UART0	28
+#define RST_BUS_UART1	29
+#define RST_BUS_UART2	30
+#define RST_BUS_UART3	31
+#define RST_BUS_UART4	32
+#define RST_BUS_UART5	33
+#define RST_BUS_I2C0	34
+#define RST_BUS_I2C1	35
+#define RST_BUS_I2C2	36
+#define RST_BUS_GPADC	37
+#define RST_BUS_KEYADC	38
+
+#endif
-- 
2.53.0


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

* [PATCH v2 03/11] dt-bindings: pinctrl: sun4i-a10: add Allwinner B288
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
  2026-09-27 15:10 ` [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288 Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-27 15:18   ` sashiko-bot
  2026-09-27 15:10 ` [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: " Pablo Mazzini
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Linus Walleij, Maxime Ripard, Rob Herring, Samuel Holland
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-gpio,
	linux-kernel, linux-sunxi

The B288 driver takes its mux values from the DT, so allwinner,pinmux
becomes an allowed property here, required for this compatible only.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 .../pinctrl/allwinner,sun4i-a10-pinctrl.yaml  | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml
index 45b7a0b6c626..6fe3b6410734 100644
--- a/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml
@@ -39,6 +39,7 @@ properties:
       - allwinner,sun8i-a33-pinctrl
       - allwinner,sun8i-a83t-pinctrl
       - allwinner,sun8i-a83t-r-pinctrl
+      - allwinner,sun8i-b288-pinctrl
       - allwinner,sun8i-h3-pinctrl
       - allwinner,sun8i-h3-r-pinctrl
       - allwinner,sun8i-r40-pinctrl
@@ -120,6 +121,15 @@ patternProperties:
         $ref: /schemas/types.yaml#/definitions/uint32
         enum: [10, 20, 30, 40]
 
+      allwinner,pinmux:
+        $ref: /schemas/types.yaml#/definitions/uint32-array
+        description:
+          Pinmux selector value, for each pin. Only used by SoCs whose
+          driver takes the mux values from the DT instead of an in-driver
+          table. Almost every time this value is the same for all pins, so
+          any array shorter than the number of pins will repeat the last
+          value, to allow just specifying a single cell, for all cells.
+
     required:
       - pins
       - function
@@ -144,6 +154,19 @@ allOf:
   # warnings.
 
   - $ref: pinctrl.yaml#
+
+  # The B288 driver has no in-driver pin table, so the mux values have to
+  # come from the DT.
+  - if:
+      properties:
+        compatible:
+          const: allwinner,sun8i-b288-pinctrl
+
+    then:
+      patternProperties:
+        "^([rs]-)?(([a-z0-9]{3,}|[a-oq-z0-9][a-z0-9]*?)?-)+?(p[a-ilm][0-9]*?-)??pins?$":
+          required:
+            - allwinner,pinmux
   - if:
       not:
         properties:
-- 
2.53.0


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

* [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: add Allwinner B288
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
  2026-09-27 15:10 ` [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288 Pablo Mazzini
  2026-09-27 15:10 ` [PATCH v2 03/11] dt-bindings: pinctrl: sun4i-a10: " Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-27 15:17   ` sashiko-bot
  2026-09-30 10:10   ` Krzysztof Kozlowski
  2026-09-27 15:10 ` [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: " Pablo Mazzini
                   ` (4 subsequent siblings)
  7 siblings, 2 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Alexandre Belloni, Chen-Yu Tsai, Conor Dooley, Jernej Skrabec,
	Krzysztof Kozlowski, Maxime Ripard, Rob Herring, Samuel Holland
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-kernel,
	linux-rtc, linux-sunxi

The B288 RTC wires one alarm interrupt, not two.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 .../devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml        | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml b/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
index f2b91186ed37..1699e3576b91 100644
--- a/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
+++ b/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
@@ -19,6 +19,7 @@ properties:
       - enum:
           - allwinner,sun6i-a31-rtc
           - allwinner,sun8i-a23-rtc
+          - allwinner,sun8i-b288-rtc
           - allwinner,sun8i-h3-rtc
           - allwinner,sun8i-r40-rtc
           - allwinner,sun8i-v3-rtc
@@ -162,6 +163,7 @@ allOf:
         compatible:
           contains:
             enum:
+              - allwinner,sun8i-b288-rtc
               - allwinner,sun8i-r40-rtc
               - allwinner,sun50i-h616-rtc
               - allwinner,sun50i-r329-rtc
-- 
2.53.0


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

* [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: add Allwinner B288
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
                   ` (2 preceding siblings ...)
  2026-09-27 15:10 ` [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: " Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-28 10:00   ` Andi Shyti
  2026-09-30 10:11   ` Krzysztof Kozlowski
  2026-09-27 15:10 ` [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: " Pablo Mazzini
                   ` (3 subsequent siblings)
  7 siblings, 2 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Andi Shyti, Conor Dooley, Gregory CLEMENT, Krzysztof Kozlowski,
	Rob Herring
  Cc: Pablo Mazzini, devicetree, linux-i2c, linux-kernel

The B288 controller follows the existing Allwinner variant.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml b/Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml
index c4efcef59133..d3b6f7668621 100644
--- a/Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml
+++ b/Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml
@@ -21,6 +21,7 @@ properties:
           - enum:
               - allwinner,suniv-f1c100s-i2c
               - allwinner,sun8i-a23-i2c
+              - allwinner,sun8i-b288-i2c
               - allwinner,sun8i-a83t-i2c
               - allwinner,sun8i-v536-i2c
               - allwinner,sun50i-a64-i2c
-- 
2.53.0


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

* [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: add Allwinner B288
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
                   ` (3 preceding siblings ...)
  2026-09-27 15:10 ` [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: " Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-30 10:15   ` Krzysztof Kozlowski
  2026-09-30 16:04   ` Ulf Hansson
  2026-09-27 15:10 ` [PATCH v2 09/11] dt-bindings: interrupt-controller: add Allwinner B288 NMI Pablo Mazzini
                   ` (2 subsequent siblings)
  7 siblings, 2 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Maxime Ripard, Rob Herring, Samuel Holland, Ulf Hansson
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-kernel,
	linux-mmc, linux-sunxi

Add the MMC and eMMC compatibles.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 .../devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml        | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml b/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml
index 9e9610bb1eda..c2ec7151dccf 100644
--- a/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml
+++ b/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml
@@ -32,10 +32,12 @@ properties:
       - items:
           - enum:
               - allwinner,sun8i-a83t-mmc
+              - allwinner,sun8i-b288-mmc
               - allwinner,suniv-f1c100s-mmc
           - const: allwinner,sun7i-a20-mmc
       - items:
           - enum:
+              - allwinner,sun8i-b288-emmc
               - allwinner,sun8i-r40-emmc
               - allwinner,sun50i-h5-emmc
               - allwinner,sun50i-h6-emmc
-- 
2.53.0


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

* [PATCH v2 09/11] dt-bindings: interrupt-controller: add Allwinner B288 NMI
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
                   ` (4 preceding siblings ...)
  2026-09-27 15:10 ` [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: " Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-30 10:17   ` Krzysztof Kozlowski
  2026-09-27 15:10 ` [PATCH v2 10/11] dt-bindings: arm: sunxi: add PocketBook Verse Pablo Mazzini
  2026-09-27 15:10 ` [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board Pablo Mazzini
  7 siblings, 1 reply; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Maxime Ripard, Radu Rendec, Rob Herring, Samuel Holland,
	Thomas Gleixner
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-kernel,
	linux-sunxi

Same register layout as the sun9i-a80 NMI, like the V3s.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 .../interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml         | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml b/Documentation/devicetree/bindings/interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml
index bb9273ec2457..179e7842bf46 100644
--- a/Documentation/devicetree/bindings/interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml
+++ b/Documentation/devicetree/bindings/interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml
@@ -29,6 +29,7 @@ properties:
       - const: allwinner,sun55i-a523-nmi
       - items:
           - enum:
+              - allwinner,sun8i-b288-nmi
               - allwinner,sun8i-v3s-nmi
               - allwinner,sun50i-a100-nmi
               - allwinner,sun50i-h616-nmi
-- 
2.53.0


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

* [PATCH v2 10/11] dt-bindings: arm: sunxi: add PocketBook Verse
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
                   ` (5 preceding siblings ...)
  2026-09-27 15:10 ` [PATCH v2 09/11] dt-bindings: interrupt-controller: add Allwinner B288 NMI Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-27 15:27   ` sashiko-bot
  2026-09-27 15:10 ` [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board Pablo Mazzini
  7 siblings, 1 reply; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Maxime Ripard, Rob Herring, Samuel Holland
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-kernel,
	linux-sunxi

A 6" e-book reader built around the Allwinner B288.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 Documentation/devicetree/bindings/arm/sunxi.yaml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/sunxi.yaml b/Documentation/devicetree/bindings/arm/sunxi.yaml
index f04db28c630a..f66c681d3788 100644
--- a/Documentation/devicetree/bindings/arm/sunxi.yaml
+++ b/Documentation/devicetree/bindings/arm/sunxi.yaml
@@ -811,6 +811,11 @@ properties:
           - const: pocketbook,614-plus
           - const: allwinner,sun5i-a13
 
+      - description: PocketBook Verse (PB629)
+        items:
+          - const: pocketbook,verse
+          - const: allwinner,sun8i-b288
+
       - description: Point of View Protab2-IPS9
         items:
           - const: pov,protab2-ips9
-- 
2.53.0


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

* [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board
  2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
                   ` (6 preceding siblings ...)
  2026-09-27 15:10 ` [PATCH v2 10/11] dt-bindings: arm: sunxi: add PocketBook Verse Pablo Mazzini
@ 2026-09-27 15:10 ` Pablo Mazzini
  2026-09-27 15:29   ` sashiko-bot
  2026-09-30 12:01   ` Andre Przywara
  7 siblings, 2 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-27 15:10 UTC (permalink / raw)
  To: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Rob Herring, Samuel Holland
  Cc: Pablo Mazzini, devicetree, linux-arm-kernel, linux-kernel,
	linux-sunxi

arm,cpu-registers-not-fw-configured is required: Allwinner's boot0 sets
neither CNTFRQ nor CNTVOFF, so the virtual timer storms. Same reason as
commit 121b96cd9d7e ("ARM: sun6i: Enable ARM arch timers").

The watchdog interrupt was measured on hardware via GICD_ISPENDR.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 arch/arm/boot/dts/allwinner/Makefile          |   1 +
 .../allwinner/sun8i-b288-pocketbook-verse.dts | 122 +++++++
 arch/arm/boot/dts/allwinner/sun8i-b288.dtsi   | 304 ++++++++++++++++++
 arch/arm/mach-sunxi/sunxi.c                   |   1 +
 4 files changed, 428 insertions(+)
 create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
 create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288.dtsi

diff --git a/arch/arm/boot/dts/allwinner/Makefile b/arch/arm/boot/dts/allwinner/Makefile
index 75b2b6a2f7a6..2dfdc01e4825 100644
--- a/arch/arm/boot/dts/allwinner/Makefile
+++ b/arch/arm/boot/dts/allwinner/Makefile
@@ -227,6 +227,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \
 	sun8i-a83t-bananapi-m3.dtb \
 	sun8i-a83t-cubietruck-plus.dtb \
 	sun8i-a83t-tbs-a711.dtb \
+	sun8i-b288-pocketbook-verse.dtb \
 	sun8i-h2-plus-bananapi-m2-zero.dtb \
 	sun8i-h2-plus-libretech-all-h3-cc.dtb \
 	sun8i-h2-plus-orangepi-r1.dtb \
diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
new file mode 100644
index 000000000000..91c89d5a097e
--- /dev/null
+++ b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * PocketBook Verse (PB629), an Allwinner B288 based e-reader.
+ */
+
+/dts-v1/;
+#include "sun8i-b288.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+	model = "PocketBook Verse";
+	compatible = "pocketbook,verse", "allwinner,sun8i-b288";
+
+	aliases {
+		serial0 = &uart0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+
+	memory@40000000 {
+		device_type = "memory";
+		reg = <0x40000000 0x20000000>;
+	};
+};
+
+&uart0 {
+	status = "okay";
+};
+
+&mmc0 {
+	vmmc-supply = <&reg_dldo2>;
+	bus-width = <4>;
+	cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;	/* PF6 */
+	status = "okay";
+};
+
+&mmc3 {
+	vmmc-supply = <&reg_dcdc1>;
+	vqmmc-supply = <&reg_dldo1>;
+	bus-width = <8>;
+	non-removable;
+	cap-mmc-hw-reset;
+	status = "okay";
+};
+
+&pio {
+	vcc-pc-supply = <&reg_dldo1>;
+	vcc-pd-supply = <&reg_dldo1>;
+	/*
+	 * PC and PD are named in the vendor rail list; PF is not. It is not
+	 * on dldo2: with that rail off, a pull-up on PF6 still reads card
+	 * detect correctly, so the bank has its own supply. dcdc1 is the
+	 * only remaining candidate, carrying vcc-io and vcc-card. Derived
+	 * from the rail naming plus that measurement, not from a schematic.
+	 */
+	vcc-pf-supply = <&reg_dcdc1>;
+};
+
+&i2c0 {
+	status = "okay";
+
+	axp22x: pmic@34 {
+		compatible = "x-powers,axp221";
+		reg = <0x34>;
+		interrupt-parent = <&nmi_intc>;
+		interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+	};
+};
+
+#include "axp22x.dtsi"
+
+&reg_dcdc1 {
+	regulator-always-on;
+	regulator-min-microvolt = <3000000>;
+	regulator-max-microvolt = <3000000>;
+	regulator-name = "vcc-io";
+};
+
+&reg_dcdc2 {
+	regulator-always-on;
+	regulator-min-microvolt = <1260000>;
+	regulator-max-microvolt = <1260000>;
+	regulator-name = "vdd-cpu";
+};
+
+&reg_dcdc4 {
+	regulator-always-on;
+	regulator-min-microvolt = <1100000>;
+	regulator-max-microvolt = <1100000>;
+	regulator-name = "vdd-sys";
+};
+
+&reg_dcdc5 {
+	regulator-always-on;
+	regulator-min-microvolt = <1350000>;
+	regulator-max-microvolt = <1350000>;
+	regulator-name = "vcc-dram";
+};
+
+&reg_aldo3 {
+	regulator-always-on;
+	regulator-min-microvolt = <3000000>;
+	regulator-max-microvolt = <3000000>;
+	regulator-name = "avcc";
+};
+
+&reg_dldo1 {
+	regulator-always-on;
+	regulator-min-microvolt = <1800000>;
+	regulator-max-microvolt = <1800000>;
+	regulator-name = "vcc-pc";
+};
+
+&reg_dldo2 {
+	/* Powers the microSD slot (slot pin 4), switched per card scan. */
+	regulator-min-microvolt = <3300000>;
+	regulator-max-microvolt = <3300000>;
+	regulator-name = "vcc-sdcv";
+};
diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
new file mode 100644
index 000000000000..f5feec87defc
--- /dev/null
+++ b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
@@ -0,0 +1,304 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Allwinner B288 (sun8iw10p1) SoC
+ *
+ * Addresses and interrupts come from the PocketBook Verse (PB629) vendor
+ * device tree, cross-checked against the BSP clk-sun8iw10.c.
+ */
+
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/sun8i-b288-ccu.h>
+#include <dt-bindings/reset/sun8i-b288-ccu.h>
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+	interrupt-parent = <&gic>;
+
+	clocks {
+		osc24M: osc24M-clk {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-frequency = <24000000>;
+			clock-output-names = "osc24M";
+		};
+
+		osc32k: osc32k-clk {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-frequency = <32768>;
+			clock-output-names = "osc32k";
+		};
+	};
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu0: cpu@0 {
+			compatible = "arm,cortex-a7";
+			device_type = "cpu";
+			reg = <0>;
+			clocks = <&ccu CLK_CPUX>;
+			clock-names = "cpu";
+		};
+
+		cpu1: cpu@1 {
+			compatible = "arm,cortex-a7";
+			device_type = "cpu";
+			reg = <1>;
+			clocks = <&ccu CLK_CPUX>;
+			clock-names = "cpu";
+		};
+	};
+
+	timer {
+		compatible = "arm,armv7-timer";
+		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
+		clock-frequency = <24000000>;
+		arm,cpu-registers-not-fw-configured;
+	};
+
+	soc {
+		compatible = "simple-bus";
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		/*
+		 * mmc0 is a v4p1x controller, so it runs in the old timing
+		 * mode and needs the sample and output phase clocks. Do not
+		 * give it the sun50i-a64-mmc fallback: that selects the new
+		 * timing mode, which this block does not implement.
+		 */
+		nmi_intc: interrupt-controller@1c000d0 {
+			compatible = "allwinner,sun8i-b288-nmi",
+				     "allwinner,sun9i-a80-nmi";
+			interrupt-controller;
+			#interrupt-cells = <2>;
+			reg = <0x01c000d0 0x0c>;
+			interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+		};
+
+		mmc0: mmc@1c0f000 {
+			compatible = "allwinner,sun8i-b288-mmc",
+				     "allwinner,sun7i-a20-mmc";
+			reg = <0x01c0f000 0x1000>;
+			clocks = <&ccu CLK_BUS_SDMMC0_BUS>,
+				 <&ccu CLK_MMC0>,
+				 <&ccu CLK_MMC0_OUTPUT>,
+				 <&ccu CLK_MMC0_SAMPLE>;
+			clock-names = "ahb", "mmc", "output", "sample";
+			resets = <&ccu RST_BUS_MMC0>;
+			reset-names = "ahb";
+			interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+			pinctrl-names = "default";
+			pinctrl-0 = <&mmc0_pins>;
+			status = "disabled";
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+
+		/* SDXC v4.5. The soldered eMMC; shares the PC pads with mmc2. */
+		mmc3: mmc@1c12000 {
+			compatible = "allwinner,sun8i-b288-emmc",
+				     "allwinner,sun50i-a64-emmc";
+			reg = <0x01c12000 0x1000>;
+			clocks = <&ccu CLK_BUS_SDMMC3_BUS>, <&ccu CLK_MMC3>;
+			clock-names = "ahb", "mmc";
+			resets = <&ccu RST_BUS_MMC3>;
+			reset-names = "ahb";
+			interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+			pinctrl-names = "default";
+			pinctrl-0 = <&mmc3_pins>;
+			status = "disabled";
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+
+		/*
+		 * mmc2 (0x01c11000) is an SDHCI-style controller, not SDXC, and
+		 * has no upstream binding. It loses the PC pad arbitration to
+		 * mmc3 and is unused here, so it is left undescribed rather than
+		 * given a wrong compatible.
+		 */
+
+		ccu: clock-controller@1c20000 {
+			compatible = "allwinner,sun8i-b288-ccu";
+			reg = <0x01c20000 0x400>;
+			clocks = <&osc24M>, <&osc32k>;
+			clock-names = "hosc", "losc";
+			#clock-cells = <1>;
+			#reset-cells = <1>;
+		};
+
+		rtc: rtc@1c20400 {
+			compatible = "allwinner,sun8i-b288-rtc";
+			reg = <0x01c20400 0x400>;
+			interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+			clock-output-names = "osc32k";
+			clocks = <&osc32k>;
+			#clock-cells = <1>;
+		};
+
+		pio: pinctrl@1c20800 {
+			compatible = "allwinner,sun8i-b288-pinctrl";
+			reg = <0x01c20800 0x400>;
+			interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
+			clock-names = "apb", "hosc", "losc";
+			gpio-controller;
+			#gpio-cells = <3>;
+			interrupt-controller;
+			#interrupt-cells = <3>;
+
+			mmc0_pins: mmc0-pins {
+				pins = "PF0", "PF1", "PF2",
+				       "PF3", "PF4", "PF5";
+				function = "sdc0";
+				allwinner,pinmux = <2>;
+				drive-strength = <30>;
+				bias-pull-up;
+			};
+
+			i2c0_pins: i2c0-pins {
+				pins = "PB6", "PB7";
+				function = "twi0";
+				allwinner,pinmux = <2>;
+			};
+
+			mmc3_pins: mmc3-pins {
+				pins = "PC1", "PC4", "PC5", "PC6",
+				       "PC7", "PC8", "PC9", "PC10",
+				       "PC11", "PC12", "PC13", "PC14";
+				function = "sdc3";
+				allwinner,pinmux = <5>;
+				drive-strength = <40>;
+				bias-pull-up;
+			};
+
+			uart0_pb_pins: uart0-pb-pins {
+				pins = "PB4", "PB5";
+				function = "uart0";
+				allwinner,pinmux = <2>;
+			};
+		};
+
+		wdt: watchdog@1c20ca0 {
+			compatible = "allwinner,sun6i-a31-wdt";
+			reg = <0x01c20ca0 0x20>;
+			interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&osc24M>;
+		};
+
+		uart0: serial@1c28000 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0x01c28000 0x400>;
+			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&ccu CLK_BUS_UART0>;
+			resets = <&ccu RST_BUS_UART0>;
+			status = "disabled";
+		};
+
+		uart1: serial@1c28400 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0x01c28400 0x400>;
+			interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&ccu CLK_BUS_UART1>;
+			resets = <&ccu RST_BUS_UART1>;
+			status = "disabled";
+		};
+
+		uart2: serial@1c28800 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0x01c28800 0x400>;
+			interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&ccu CLK_BUS_UART2>;
+			resets = <&ccu RST_BUS_UART2>;
+			status = "disabled";
+		};
+
+		uart3: serial@1c28c00 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0x01c28c00 0x400>;
+			interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&ccu CLK_BUS_UART3>;
+			resets = <&ccu RST_BUS_UART3>;
+			status = "disabled";
+		};
+
+		uart4: serial@1c29000 {
+			compatible = "snps,dw-apb-uart";
+			reg = <0x01c29000 0x400>;
+			interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+			reg-shift = <2>;
+			reg-io-width = <4>;
+			clocks = <&ccu CLK_BUS_UART4>;
+			resets = <&ccu RST_BUS_UART4>;
+			status = "disabled";
+		};
+
+		i2c0: i2c@1c2ac00 {
+			compatible = "allwinner,sun8i-b288-i2c",
+				     "allwinner,sun6i-a31-i2c";
+			reg = <0x01c2ac00 0x400>;
+			interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&ccu CLK_BUS_TWI0>;
+			resets = <&ccu RST_BUS_I2C0>;
+			pinctrl-names = "default";
+			pinctrl-0 = <&i2c0_pins>;
+			status = "disabled";
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+
+		i2c1: i2c@1c2b000 {
+			compatible = "allwinner,sun8i-b288-i2c",
+				     "allwinner,sun6i-a31-i2c";
+			reg = <0x01c2b000 0x400>;
+			interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&ccu CLK_BUS_TWI1>;
+			resets = <&ccu RST_BUS_I2C1>;
+			status = "disabled";
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+
+		i2c2: i2c@1c2b400 {
+			compatible = "allwinner,sun8i-b288-i2c",
+				     "allwinner,sun6i-a31-i2c";
+			reg = <0x01c2b400 0x400>;
+			interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&ccu CLK_BUS_TWI2>;
+			resets = <&ccu RST_BUS_I2C2>;
+			status = "disabled";
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+
+		gic: interrupt-controller@1c81000 {
+			compatible = "arm,gic-400";
+			reg = <0x01c81000 0x1000>,
+			      <0x01c82000 0x2000>,
+			      <0x01c84000 0x2000>,
+			      <0x01c86000 0x2000>;
+			interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
+			interrupt-controller;
+			#interrupt-cells = <3>;
+		};
+	};
+};
diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c
index e1b7945aac99..c5b19d0e63f9 100644
--- a/arch/arm/mach-sunxi/sunxi.c
+++ b/arch/arm/mach-sunxi/sunxi.c
@@ -61,6 +61,7 @@ MACHINE_END
 static const char * const sun8i_board_dt_compat[] = {
 	"allwinner,sun8i-a23",
 	"allwinner,sun8i-a33",
+	"allwinner,sun8i-b288",
 	"allwinner,sun8i-h2-plus",
 	"allwinner,sun8i-h3",
 	"allwinner,sun8i-r40",
-- 
2.53.0


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

* Re: [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: " Pablo Mazzini
@ 2026-09-27 15:17   ` sashiko-bot
  2026-09-30 10:10   ` Krzysztof Kozlowski
  1 sibling, 0 replies; 23+ messages in thread
From: sashiko-bot @ 2026-09-27 15:17 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Alexandre Belloni, linux-sunxi, robh, conor+dt, devicetree,
	linux-rtc

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] dt-bindings: rtc: missing clock-output-names constraints for sun8i-b288-rtc
--

commit dc864843d6f807d8dbbd6c391ac70a1992bc2e0f
Author: Pablo Mazzini <pmazzini@gmail.com>

dt-bindings: rtc: sun6i-a31: add Allwinner B288

The B288 RTC wires one alarm interrupt, not two.

> diff --git a/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml b/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
> index f2b91186ed377..1699e3576b915 100644
> --- a/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
> +++ b/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml

[ ... ]

> @@ -162,6 +163,7 @@ allOf:
>          compatible:
>            contains:
>              enum:
> +              - allwinner,sun8i-b288-rtc
>                - allwinner,sun8i-r40-rtc
>                - allwinner,sun50i-h616-rtc
>                - allwinner,sun50i-r329-rtc

[Severity: Low]
Does the new allwinner,sun8i-b288-rtc compatible string need to be added to
one of the clock-output-names conditional blocks as well?

Because it is omitted from the earlier conditional blocks in the allOf
section that strictly enforce clock-output-names constraints for all other
compatibles, it falls back to the default allowing 1 to 3 items.

This could allow an incorrect number of clock-output-names in a device tree
configuration to silently pass dtbs_check.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260927151016.186493-1-pmazzini@gmail.com?part=5

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

* Re: [PATCH v2 03/11] dt-bindings: pinctrl: sun4i-a10: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 03/11] dt-bindings: pinctrl: sun4i-a10: " Pablo Mazzini
@ 2026-09-27 15:18   ` sashiko-bot
  0 siblings, 0 replies; 23+ messages in thread
From: sashiko-bot @ 2026-09-27 15:18 UTC (permalink / raw)
  To: Pablo Mazzini; +Cc: robh, linux-sunxi, devicetree, conor+dt

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] dt-bindings: pinctrl: sunxi: missing b288 interrupts constraint validation
--

commit 5d0ff1f67ca22e7e0aeb81a6bb9183820225e5b3
Author: Pablo Mazzini <pmazzini@gmail.com>

dt-bindings: pinctrl: sun4i-a10: add Allwinner B288

The B288 driver takes its mux values from the DT, so allwinner,pinmux
becomes an allowed property here, required for this compatible only.

> diff --git a/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml
> index 45b7a0b6c626d..6fe3b64107349 100644
> --- a/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml
> +++ b/Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml
> @@ -39,6 +39,7 @@ properties:
>        - allwinner,sun8i-a33-pinctrl
>        - allwinner,sun8i-a83t-pinctrl
>        - allwinner,sun8i-a83t-r-pinctrl
> +      - allwinner,sun8i-b288-pinctrl

[Severity: Medium]
Since this compatible is for hardware with exactly 4 interrupt banks, shouldn't
it also be added to the later allOf constraints block in this file that
enforces exact hardware limits for interrupts?

For example:

  - if:
      properties:
        compatible:
          enum:
            - allwinner,sun6i-a31-pinctrl
            - allwinner,sun6i-a31s-pinctrl
            - allwinner,sun50i-h6-pinctrl
            - allwinner,sun8i-b288-pinctrl
    then:
      properties:
        interrupts:
          minItems: 4
          maxItems: 4

Without this, validation for this variant falls back to the broad global default
of 1 to 8 interrupts.

Does this allow a device tree with an incorrect number of interrupts for the
B288 to silently pass validation?

>        - allwinner,sun8i-h3-pinctrl
>        - allwinner,sun8i-h3-r-pinctrl
>        - allwinner,sun8i-r40-pinctrl

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260927151016.186493-1-pmazzini@gmail.com?part=3

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

* Re: [PATCH v2 10/11] dt-bindings: arm: sunxi: add PocketBook Verse
  2026-09-27 15:10 ` [PATCH v2 10/11] dt-bindings: arm: sunxi: add PocketBook Verse Pablo Mazzini
@ 2026-09-27 15:27   ` sashiko-bot
  0 siblings, 0 replies; 23+ messages in thread
From: sashiko-bot @ 2026-09-27 15:27 UTC (permalink / raw)
  To: Pablo Mazzini; +Cc: linux-sunxi, robh, devicetree, conor+dt

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Medium] rtc: sun6i: missing clock provider initialization for sun8i-b288-rtc
- [Low] dt-bindings: pinctrl: missing interrupts array constraint for sun8i-b288-pinctrl
- [Low] dt-bindings: pinctrl: allwinner,pinmux property allowed across all sunxi SoCs
- [Low] dt-bindings: rtc: missing clock-output-names constraint for sun8i-b288-rtc
--

commit 52bfb11b9f38d6aaa40748a8fbc5e4f1f1b2ec66
Author: Pablo Mazzini <pmazzini@gmail.com>

dt-bindings: arm: sunxi: add PocketBook Verse

This commit adds a new compatible string for the PocketBook Verse (PB629),
a 6" e-book reader built around the Allwinner B288 SoC.

> diff --git a/Documentation/devicetree/bindings/arm/sunxi.yaml b/Documentation/devicetree/bindings/arm/sunxi.yaml
> index f04db28c630ac..f66c681d3788a 100644
> --- a/Documentation/devicetree/bindings/arm/sunxi.yaml
> +++ b/Documentation/devicetree/bindings/arm/sunxi.yaml
> @@ -811,6 +811,11 @@ properties:
>            - const: pocketbook,614-plus
>            - const: allwinner,sun5i-a13
>  
> +      - description: PocketBook Verse (PB629)
> +        items:
> +          - const: pocketbook,verse
> +          - const: allwinner,sun8i-b288

[Severity: Medium]
Is there a missing clock provider initialization for the sun8i-b288-rtc
companion driver?

Looking at sun6i_rtc_dt_ids() in drivers/rtc/rtc-sun6i.c, the compatible
string is registered:

    { .compatible = "allwinner,sun8i-b288-rtc" },

but it lacks the necessary CLK_OF_DECLARE_DRIVER() block to actually
initialize early clock structures. This omission means the RTC driver fails
to register as a clock provider. Any driver attempting to acquire <&rtc 0>
via of_clk_get() or similar will trigger an EPROBE_DEFER.

[Severity: Low]
Does the sun8i-b288-pinctrl compatible also need to be added to the
interrupts constraint block in the pinctrl schema?

In Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml:

  - if:
      properties:
        compatible:
          enum:
            - allwinner,sun6i-a31-pinctrl
            - allwinner,sun6i-a31s-pinctrl
            - allwinner,sun50i-h6-pinctrl

    then:
      properties:
        interrupts:
          minItems: 4
          maxItems: 4

This conditional block restricts the interrupts array size to exactly 4.
Without including the new sun8i-b288-pinctrl compatible, the schema permits
incorrect interrupt arrays (defaulting to 1 to 8 items) for the b288 pinctrl,
bypassing strict validation.

[Severity: Low]
Does this allow the b288-specific allwinner,pinmux property to leak into the
global sunxi pinctrl namespace?

In the same allwinner,sun4i-a10-pinctrl.yaml file, the allOf block includes:

    then:
      patternProperties:
        "^([rs]-)?(([a-z0-9]{3,}|[a-oq-z0-9][a-z0-9]*?)?-)+?(p[a-ilm][0-9]*?-)??pins?$":
          required:
            - allwinner,pinmux

This makes the property required for b288 without rejecting it for all other
compatibles. Adding the property to any non-b288 board device tree would
incorrectly pass dt_binding_check. An additional conditional block rejecting
this property for non-b288 devices must be added after this block to prevent
schema bypass.

[Severity: Low]
Are we missing a clock-output-names constraint for the sun8i-b288-rtc?

In Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml,
the allOf block contains constraints like:

  - if:
      properties:
        compatible:
          contains:
            const: allwinner,sun6i-a31-rtc

The sun8i-b288-rtc compatible must be added to one of these conditional
blocks to restrict its clock-output-names length. Because it is omitted,
the schema incorrectly allows 1 to 3 clock output names for the b288 RTC
instead of strictly enforcing 1.

> +
>        - description: Point of View Protab2-IPS9
>          items:
>            - const: pov,protab2-ips9

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260927151016.186493-1-pmazzini@gmail.com?part=10

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

* Re: [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board
  2026-09-27 15:10 ` [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board Pablo Mazzini
@ 2026-09-27 15:29   ` sashiko-bot
  2026-09-30 12:01   ` Andre Przywara
  1 sibling, 0 replies; 23+ messages in thread
From: sashiko-bot @ 2026-09-27 15:29 UTC (permalink / raw)
  To: Pablo Mazzini; +Cc: conor+dt, devicetree, robh, linux-sunxi

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] arm: missing SMP enable-method prevents secondary CPU boot
- [Low] serial: missing pinctrl assignment for uart0
--

commit 5bd2057523d9c0e8b398682ab9b915f189883892
Author: Pablo Mazzini <pmazzini@gmail.com>

ARM: sunxi: add B288 and the PocketBook Verse board

This commit introduces device tree support for the Allwinner B288 SoC and
the PocketBook Verse board. It configures the CPU, timers, and basic
peripherals like MMC, I2C, and UART.

> diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
> new file mode 100644
> index 0000000000000..91c89d5a097e6
> --- /dev/null
> +++ b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts

[ ... ]

> +&uart0 {
> +	status = "okay";
> +};

[Severity: Low]
Is the pin control configuration missing here? The uart0 node is enabled, but
it lacks the pinctrl-names and pinctrl-0 properties. 

There is a uart0_pb_pins group defined in sun8i-b288.dtsi, but it appears to be
unreferenced. Without explicit pinctrl properties, the kernel might rely on the
bootloader's initial pin state, which could lead to a broken serial console
after suspend/resume cycles.

[ ... ]

> diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> new file mode 100644
> index 0000000000000..f5feec87defcc
> --- /dev/null
> +++ b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi

[ ... ]

> +	cpus {
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +
> +		cpu0: cpu@0 {
> +			compatible = "arm,cortex-a7";
> +			device_type = "cpu";
> +			reg = <0>;
> +			clocks = <&ccu CLK_CPUX>;
> +			clock-names = "cpu";
> +		};
> +
> +		cpu1: cpu@1 {
> +			compatible = "arm,cortex-a7";
> +			device_type = "cpu";
> +			reg = <1>;
> +			clocks = <&ccu CLK_CPUX>;
> +			clock-names = "cpu";
> +		};
> +	};

[Severity: Medium]
Does the cpus block or the cpu1 node need an enable-method property to
properly bring up the secondary core? 

Because this board uses Allwinner's boot0 rather than PSCI, the kernel's
smp_init() sequence may not have the necessary operations to wake this
secondary core if a custom enable-method isn't defined, which would result in
the loss of SMP functionality.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260927151016.186493-1-pmazzini@gmail.com?part=11

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

* Re: [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: " Pablo Mazzini
@ 2026-09-28 10:00   ` Andi Shyti
  2026-09-30 10:11   ` Krzysztof Kozlowski
  1 sibling, 0 replies; 23+ messages in thread
From: Andi Shyti @ 2026-09-28 10:00 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Conor Dooley, Gregory CLEMENT, Krzysztof Kozlowski, Rob Herring,
	devicetree, linux-i2c, linux-kernel

Hi Pablo,

On Sun, Sep 27, 2026 at 04:10:12PM +0100, Pablo Mazzini wrote:
> The B288 controller follows the existing Allwinner variant.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>

Acked-by: Andi Shyti <andi.shyti@kernel.org>

Thanks,
Andi

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

* Re: [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288 Pablo Mazzini
@ 2026-09-30 10:08   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 23+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-30 10:08 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Brian Masney, Chen-Yu Tsai, Conor Dooley, Jernej Skrabec,
	Jerome Brunet, Krzysztof Kozlowski, Maxime Ripard, Philipp Zabel,
	Rob Herring, Samuel Holland, Stephen Boyd, devicetree,
	linux-arm-kernel, linux-clk, linux-kernel, linux-sunxi

On Sun, Sep 27, 2026 at 04:10:06PM +0100, Pablo Mazzini wrote:
> The B288 (sun8iw10p1) is a dual Cortex-A7 SoC used in e-book readers.
> Its CCU needs only the two oscillator inputs, so it fits the existing
> schema without changes.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Best regards,
Krzysztof


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

* Re: [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: " Pablo Mazzini
  2026-09-27 15:17   ` sashiko-bot
@ 2026-09-30 10:10   ` Krzysztof Kozlowski
  2026-09-30 10:47     ` Pablo Mazzini
  1 sibling, 1 reply; 23+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-30 10:10 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Alexandre Belloni, Chen-Yu Tsai, Conor Dooley, Jernej Skrabec,
	Krzysztof Kozlowski, Maxime Ripard, Rob Herring, Samuel Holland,
	devicetree, linux-arm-kernel, linux-kernel, linux-rtc,
	linux-sunxi

On Sun, Sep 27, 2026 at 04:10:10PM +0100, Pablo Mazzini wrote:
> The B288 RTC wires one alarm interrupt, not two.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> ---
>  .../devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml        | 2 ++
>  1 file changed, 2 insertions(+)
> 

Seems like valid and unaddressed comment from Sashiko, so dropping from
DT Patchwork.

Best regards,
Krzysztof


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

* Re: [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: " Pablo Mazzini
  2026-09-28 10:00   ` Andi Shyti
@ 2026-09-30 10:11   ` Krzysztof Kozlowski
  1 sibling, 0 replies; 23+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-30 10:11 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Andi Shyti, Conor Dooley, Gregory CLEMENT, Krzysztof Kozlowski,
	Rob Herring, devicetree, linux-i2c, linux-kernel

On Sun, Sep 27, 2026 at 04:10:12PM +0100, Pablo Mazzini wrote:
> The B288 controller follows the existing Allwinner variant.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> ---
>  Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml | 1 +
>  1 file changed, 1 insertion(+)

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Best regards,
Krzysztof


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

* Re: [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: " Pablo Mazzini
@ 2026-09-30 10:15   ` Krzysztof Kozlowski
  2026-09-30 16:04   ` Ulf Hansson
  1 sibling, 0 replies; 23+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-30 10:15 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Maxime Ripard, Rob Herring, Samuel Holland, Ulf Hansson,
	devicetree, linux-arm-kernel, linux-kernel, linux-mmc,
	linux-sunxi

On Sun, Sep 27, 2026 at 04:10:13PM +0100, Pablo Mazzini wrote:
> Add the MMC and eMMC compatibles.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> ---
>  .../devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml        | 2 ++
>  1 file changed, 2 insertions(+)

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Best regards,
Krzysztof


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

* Re: [PATCH v2 09/11] dt-bindings: interrupt-controller: add Allwinner B288 NMI
  2026-09-27 15:10 ` [PATCH v2 09/11] dt-bindings: interrupt-controller: add Allwinner B288 NMI Pablo Mazzini
@ 2026-09-30 10:17   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 23+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-30 10:17 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Maxime Ripard, Radu Rendec, Rob Herring, Samuel Holland,
	Thomas Gleixner, devicetree, linux-arm-kernel, linux-kernel,
	linux-sunxi

On Sun, Sep 27, 2026 at 04:10:14PM +0100, Pablo Mazzini wrote:
> Same register layout as the sun9i-a80 NMI, like the V3s.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> ---
>  .../interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml         | 1 +
>  1 file changed, 1 insertion(+)

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Best regards,
Krzysztof


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

* Re: [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: add Allwinner B288
  2026-09-30 10:10   ` Krzysztof Kozlowski
@ 2026-09-30 10:47     ` Pablo Mazzini
  0 siblings, 0 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-30 10:47 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Alexandre Belloni, Chen-Yu Tsai, Conor Dooley, Jernej Skrabec,
	Krzysztof Kozlowski, Maxime Ripard, Rob Herring, Samuel Holland,
	devicetree, linux-arm-kernel, linux-kernel, linux-rtc,
	linux-sunxi

Hi Krzysztof,

Thanks, will fix in v3.

Regards,
Pablo



On Wed, Sep 30, 2026 at 11:10 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On Sun, Sep 27, 2026 at 04:10:10PM +0100, Pablo Mazzini wrote:
> > The B288 RTC wires one alarm interrupt, not two.
> >
> > Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> > ---
> >  .../devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml        | 2 ++
> >  1 file changed, 2 insertions(+)
> >
>
> Seems like valid and unaddressed comment from Sashiko, so dropping from
> DT Patchwork.
>
> Best regards,
> Krzysztof
>

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

* Re: [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board
  2026-09-27 15:10 ` [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board Pablo Mazzini
  2026-09-27 15:29   ` sashiko-bot
@ 2026-09-30 12:01   ` Andre Przywara
  2026-09-30 17:52     ` Pablo Mazzini
  1 sibling, 1 reply; 23+ messages in thread
From: Andre Przywara @ 2026-09-30 12:01 UTC (permalink / raw)
  To: Pablo Mazzini, Chen-Yu Tsai, Conor Dooley, Jernej Skrabec,
	Krzysztof Kozlowski, Rob Herring, Samuel Holland
  Cc: devicetree, linux-arm-kernel, linux-kernel, linux-sunxi

Hi,

many thanks for cobbling this together, I do understand that this is 
tricky without schematics or even a manual.

On 9/27/26 17:10, Pablo Mazzini wrote:
> arm,cpu-registers-not-fw-configured is required: Allwinner's boot0 sets
> neither CNTFRQ nor CNTVOFF, so the virtual timer storms. Same reason as
> commit 121b96cd9d7e ("ARM: sun6i: Enable ARM arch timers").

Are you planning on going ahead with just boot0 in the long run? Given 
the age of the platform, and it being close to the A64, I expect a 
U-Boot port being pretty straight-forward. Chances are the DRAM 
controller (the biggest hurdle here) is very similar to the H3/A64/R40 
generation, for which we already have a unified driver.

And in general: how do you boot this device, then? I guess you somehow 
trick boot0 into booting a mainline kernel? Is there some documentation 
about this?
Can you please create a wiki page about the device, and describe your 
device-specific findings in there? There is 
https://linux-sunxi.org/PocketBook_Basic_Lux_4_(PB618) already, which 
you can use as inspiration. Or maybe, if they are very similar, use that 
very page, even.

> The watchdog interrupt was measured on hardware via GICD_ISPENDR.
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> ---
>   arch/arm/boot/dts/allwinner/Makefile          |   1 +
>   .../allwinner/sun8i-b288-pocketbook-verse.dts | 122 +++++++
>   arch/arm/boot/dts/allwinner/sun8i-b288.dtsi   | 304 ++++++++++++++++++
>   arch/arm/mach-sunxi/sunxi.c                   |   1 +
>   4 files changed, 428 insertions(+)
>   create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
>   create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> 
> diff --git a/arch/arm/boot/dts/allwinner/Makefile b/arch/arm/boot/dts/allwinner/Makefile
> index 75b2b6a2f7a6..2dfdc01e4825 100644
> --- a/arch/arm/boot/dts/allwinner/Makefile
> +++ b/arch/arm/boot/dts/allwinner/Makefile
> @@ -227,6 +227,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \
>   	sun8i-a83t-bananapi-m3.dtb \
>   	sun8i-a83t-cubietruck-plus.dtb \
>   	sun8i-a83t-tbs-a711.dtb \
> +	sun8i-b288-pocketbook-verse.dtb \
>   	sun8i-h2-plus-bananapi-m2-zero.dtb \
>   	sun8i-h2-plus-libretech-all-h3-cc.dtb \
>   	sun8i-h2-plus-orangepi-r1.dtb \
> diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
> new file mode 100644
> index 000000000000..91c89d5a097e
> --- /dev/null
> +++ b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
> @@ -0,0 +1,122 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * PocketBook Verse (PB629), an Allwinner B288 based e-reader.
> + */
> +
> +/dts-v1/;
> +#include "sun8i-b288.dtsi"
> +
> +#include <dt-bindings/gpio/gpio.h>
> +
> +/ {
> +	model = "PocketBook Verse";
> +	compatible = "pocketbook,verse", "allwinner,sun8i-b288";
> +
> +	aliases {
> +		serial0 = &uart0;
> +	};
> +
> +	chosen {
> +		stdout-path = "serial0:115200n8";
> +	};
> +
> +	memory@40000000 {

We typically don't hardcode memory nodes in the DT, but leave this up to 
the bootloader to populate, based on either detection or hard-coding 
*there*.
I guess this eBook reader only comes in this one configuration?
Maybe we could allow this node in here, then, to increase compatiblity? 
Depends a bit on how involved this boot0 setup is, I guess.

> +		device_type = "memory";
> +		reg = <0x40000000 0x20000000>;
> +	};
> +};
> +
> +&uart0 {
> +	status = "okay";
> +};
> +
> +&mmc0 {
> +	vmmc-supply = <&reg_dldo2>;
> +	bus-width = <4>;
> +	cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;	/* PF6 */

I guess this is microSD, so without a write-protection switch? Then 
please add the "disable-wp;" property.
Also this is missing the pinctrl properties, to describe the pinmux 
used. As you describe the PortB UART0 pins in the .dtsi, just reference 
them here.

And are you sure the vmmc-supply is dldo2? Does the VCC pin on the SD 
card slot go to 0V when you turn that regulator off?
Just asking because on this generation of devices we most often see 
DCDC1 supplying the SD card, as it needs to be powered at reset time, to 
allow the BROM reading from the SD card.

> +	status = "okay";
> +};
> +
> +&mmc3 {
> +	vmmc-supply = <&reg_dcdc1>;
> +	vqmmc-supply = <&reg_dldo1>;

If this is a 1.8V eMMC, then please add the 1.8V properties:
         mmc-ddr-1_8v;
         mmc-hs200-1_8v;
(given that these modes work).
And again the pinctrl nodes are missing.

> +	bus-width = <8>;
> +	non-removable;
> +	cap-mmc-hw-reset;
> +	status = "okay";
> +};
> +
> +&pio {
> +	vcc-pc-supply = <&reg_dldo1>;
> +	vcc-pd-supply = <&reg_dldo1>;
> +	/*
> +	 * PC and PD are named in the vendor rail list; PF is not. It is not
> +	 * on dldo2: with that rail off, a pull-up on PF6 still reads card
> +	 * detect correctly, so the bank has its own supply. dcdc1 is the
> +	 * only remaining candidate, carrying vcc-io and vcc-card. Derived
> +	 * from the rail naming plus that measurement, not from a schematic.
> +	 */
> +	vcc-pf-supply = <&reg_dcdc1>;

Yes, on older SoCs PortF is internally powered by the VCC-IO pin, and is 
fixed at 3.3V. Compare the datasheets from the A64 and H3, for instance.
And VCC-IO is traditionally powered by DCDC1, since it needs the most juice.
In any case, I think we don't need the comment, since it's a common setup.

> +};
> +
> +&i2c0 {
> +	status = "okay";
> +
> +	axp22x: pmic@34 {

Can you add a comment here that this is labelled as AXP227?

> +		compatible = "x-powers,axp221";
> +		reg = <0x34>;
> +		interrupt-parent = <&nmi_intc>;
> +		interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
> +	};
> +};
> +
> +#include "axp22x.dtsi"
> +
> +&reg_dcdc1 {
> +	regulator-always-on;
> +	regulator-min-microvolt = <3000000>;
> +	regulator-max-microvolt = <3000000>;
> +	regulator-name = "vcc-io";
> +};
> +
> +&reg_dcdc2 {
> +	regulator-always-on;
> +	regulator-min-microvolt = <1260000>;
> +	regulator-max-microvolt = <1260000>;
> +	regulator-name = "vdd-cpu";
> +};
> +
> +&reg_dcdc4 {
> +	regulator-always-on;
> +	regulator-min-microvolt = <1100000>;
> +	regulator-max-microvolt = <1100000>;
> +	regulator-name = "vdd-sys";
> +};
> +
> +&reg_dcdc5 {
> +	regulator-always-on;
> +	regulator-min-microvolt = <1350000>;
> +	regulator-max-microvolt = <1350000>;
> +	regulator-name = "vcc-dram";
> +};
> +
> +&reg_aldo3 {
> +	regulator-always-on;
> +	regulator-min-microvolt = <3000000>;
> +	regulator-max-microvolt = <3000000>;
> +	regulator-name = "avcc";
> +};
> +
> +&reg_dldo1 {
> +	regulator-always-on;

Do you really need the always-on here?
Does it power more than the eMMC? Can you boot from SD card and use the 
system with that property removed, and the kernel turning it off?

> +	regulator-min-microvolt = <1800000>;
> +	regulator-max-microvolt = <1800000>;
> +	regulator-name = "vcc-pc";
> +};
> +
> +&reg_dldo2 {
> +	/* Powers the microSD slot (slot pin 4), switched per card scan. */

What does "switched per card scan" mean?
And it's rather uncommon to see the SD card powered by a separate PMIC 
line, since it needs to be on at reset, to allow the BROM to access it.
According to the AXP221 datasheet, dldo2 is off at reset, so can you 
please somehow check this? It might be different on the AXP227, but 
worth a try, I think.

> +	regulator-min-microvolt = <3300000>;
> +	regulator-max-microvolt = <3300000>;
> +	regulator-name = "vcc-sdcv";
> +};
> diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> new file mode 100644
> index 000000000000..f5feec87defc
> --- /dev/null
> +++ b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> @@ -0,0 +1,304 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Allwinner B288 (sun8iw10p1) SoC
> + *
> + * Addresses and interrupts come from the PocketBook Verse (PB629) vendor
> + * device tree, cross-checked against the BSP clk-sun8iw10.c.
> + */
> +
> +#include <dt-bindings/interrupt-controller/arm-gic.h>
> +#include <dt-bindings/clock/sun8i-b288-ccu.h>
> +#include <dt-bindings/reset/sun8i-b288-ccu.h>
> +
> +/ {
> +	#address-cells = <1>;
> +	#size-cells = <1>;
> +	interrupt-parent = <&gic>;
> +
> +	clocks {

I don't think we put the crystals in their own node anymore. I see that 
we did this for the 32-bit Allwinner SoCs, but it's pointless.

> +		osc24M: osc24M-clk {
> +			#clock-cells = <0>;
> +			compatible = "fixed-clock";
> +			clock-frequency = <24000000>;
> +			clock-output-names = "osc24M";
> +		};
> +
> +		osc32k: osc32k-clk {
> +			#clock-cells = <0>;
> +			compatible = "fixed-clock";
> +			clock-frequency = <32768>;
> +			clock-output-names = "osc32k";
> +		};
> +	};
> +
> +	cpus {
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +
> +		cpu0: cpu@0 {
> +			compatible = "arm,cortex-a7";
> +			device_type = "cpu";
> +			reg = <0>;
> +			clocks = <&ccu CLK_CPUX>;
> +			clock-names = "cpu";
> +		};
> +
> +		cpu1: cpu@1 {
> +			compatible = "arm,cortex-a7";
> +			device_type = "cpu";
> +			reg = <1>;
> +			clocks = <&ccu CLK_CPUX>;
> +			clock-names = "cpu";
> +		};
> +	};


So how does SMP work here, exactly? For the later 32-bit SoCs, we rely 
on a PSCI implmenetation in U-Boot, and I would strongly recommend doing 
so here as well.

> +
> +	timer {
> +		compatible = "arm,armv7-timer";
> +		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
> +			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
> +			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
> +			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
> +		clock-frequency = <24000000>;
> +		arm,cpu-registers-not-fw-configured;

Meh, as the comments in the binding say: please fix your firmware ;-)
I am not completely against it if boot0 is the firmware to use for a 
while, but if we go with U-Boot, it would be nicely fixed there.

> +	};
> +
> +	soc {
> +		compatible = "simple-bus";
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		/*
> +		 * mmc0 is a v4p1x controller, so it runs in the old timing
> +		 * mode and needs the sample and output phase clocks.

I think the comment can end here.
But it would need to be moved below, above the actual mmc0 node.

>		Do not
> +		 * give it the sun50i-a64-mmc fallback: that selects the new
> +		 * timing mode, which this block does not implement.
> +		 */
> +		nmi_intc: interrupt-controller@1c000d0 {
> +			compatible = "allwinner,sun8i-b288-nmi",
> +				     "allwinner,sun9i-a80-nmi";
> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +			reg = <0x01c000d0 0x0c>;
> +			interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
> +		};
> +
> +		mmc0: mmc@1c0f000 {
> +			compatible = "allwinner,sun8i-b288-mmc",
> +				     "allwinner,sun7i-a20-mmc";
> +			reg = <0x01c0f000 0x1000>;
> +			clocks = <&ccu CLK_BUS_SDMMC0_BUS>,
> +				 <&ccu CLK_MMC0>,
> +				 <&ccu CLK_MMC0_OUTPUT>,
> +				 <&ccu CLK_MMC0_SAMPLE>;
> +			clock-names = "ahb", "mmc", "output", "sample";
> +			resets = <&ccu RST_BUS_MMC0>;
> +			reset-names = "ahb";
> +			interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
> +			pinctrl-names = "default";
> +			pinctrl-0 = <&mmc0_pins>;
> +			status = "disabled";
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +		};
> +
> +		/* SDXC v4.5. The soldered eMMC; shares the PC pads with mmc2. */

This comment should go. Pinmuxing is described separately, and "the 
soldered eMMC" does not belong into a .dtsi file, since it's board specific.
If you really want to document some of your findings, you can do so in 
the commit message.

> +		mmc3: mmc@1c12000 {
> +			compatible = "allwinner,sun8i-b288-emmc",
> +				     "allwinner,sun50i-a64-emmc";
> +			reg = <0x01c12000 0x1000>;
> +			clocks = <&ccu CLK_BUS_SDMMC3_BUS>, <&ccu CLK_MMC3>;
> +			clock-names = "ahb", "mmc";
> +			resets = <&ccu RST_BUS_MMC3>;
> +			reset-names = "ahb";
> +			interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
> +			pinctrl-names = "default";
> +			pinctrl-0 = <&mmc3_pins>;
> +			status = "disabled";
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +		};
> +
> +		/*
> +		 * mmc2 (0x01c11000) is an SDHCI-style controller, not SDXC, and
> +		 * has no upstream binding. It loses the PC pad arbitration to
> +		 * mmc3 and is unused here, so it is left undescribed rather than
> +		 * given a wrong compatible.
> +		 */

You can shorten the comment to:
	"mc2 @0x01c11000 is an unsupported SDHCI-style controller."

> +
> +		ccu: clock-controller@1c20000 {
> +			compatible = "allwinner,sun8i-b288-ccu";
> +			reg = <0x01c20000 0x400>;
> +			clocks = <&osc24M>, <&osc32k>;
> +			clock-names = "hosc", "losc";
> +			#clock-cells = <1>;
> +			#reset-cells = <1>;
> +		};
> +
> +		rtc: rtc@1c20400 {
> +			compatible = "allwinner,sun8i-b288-rtc";
> +			reg = <0x01c20400 0x400>;
> +			interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
> +			clock-output-names = "osc32k";
> +			clocks = <&osc32k>;
> +			#clock-cells = <1>;
> +		};
> +
> +		pio: pinctrl@1c20800 {
> +			compatible = "allwinner,sun8i-b288-pinctrl";
> +			reg = <0x01c20800 0x400>;
> +			interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
> +				     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
> +				     <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
> +				     <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
> +			clock-names = "apb", "hosc", "losc";
> +			gpio-controller;
> +			#gpio-cells = <3>;
> +			interrupt-controller;
> +			#interrupt-cells = <3>;
> +
> +			mmc0_pins: mmc0-pins {
> +				pins = "PF0", "PF1", "PF2",
> +				       "PF3", "PF4", "PF5";
> +				function = "sdc0";

We do not use the BSP function naming, but "mmc0" instead.

> +				allwinner,pinmux = <2>;
> +				drive-strength = <30>;
> +				bias-pull-up;
> +			};
> +
> +			i2c0_pins: i2c0-pins {
> +				pins = "PB6", "PB7";
> +				function = "twi0";

Same here, "i2c0" please.

> +				allwinner,pinmux = <2>;
> +			};
> +
> +			mmc3_pins: mmc3-pins {
> +				pins = "PC1", "PC4", "PC5", "PC6",
> +				       "PC7", "PC8", "PC9", "PC10",
> +				       "PC11", "PC12", "PC13", "PC14";
> +				function = "sdc3";

function = "mmc3";

> +				allwinner,pinmux = <5>;
> +				drive-strength = <40>;
> +				bias-pull-up;
> +			};
> +
> +			uart0_pb_pins: uart0-pb-pins {
> +				pins = "PB4", "PB5";
> +				function = "uart0";
> +				allwinner,pinmux = <2>;
> +			};
> +		};
> +
> +		wdt: watchdog@1c20ca0 {
> +			compatible = "allwinner,sun6i-a31-wdt";

I think lately we used this as a fallback, paired with a SoC specific 
compatible first.
In many aspects the more recent DTs under the arch/arm64 directory are 
more modern and a better source to copy from.
> +			reg = <0x01c20ca0 0x20>;
> +			interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&osc24M>;
> +		};
> +
> +		uart0: serial@1c28000 {
> +			compatible = "snps,dw-apb-uart";
> +			reg = <0x01c28000 0x400>;
> +			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&ccu CLK_BUS_UART0>;
> +			resets = <&ccu RST_BUS_UART0>;
> +			status = "disabled";
> +		};
> +
> +		uart1: serial@1c28400 {
> +			compatible = "snps,dw-apb-uart";
> +			reg = <0x01c28400 0x400>;
> +			interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&ccu CLK_BUS_UART1>;
> +			resets = <&ccu RST_BUS_UART1>;
> +			status = "disabled";
> +		};
> +
> +		uart2: serial@1c28800 {
> +			compatible = "snps,dw-apb-uart";
> +			reg = <0x01c28800 0x400>;
> +			interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&ccu CLK_BUS_UART2>;
> +			resets = <&ccu RST_BUS_UART2>;
> +			status = "disabled";
> +		};
> +
> +		uart3: serial@1c28c00 {
> +			compatible = "snps,dw-apb-uart";
> +			reg = <0x01c28c00 0x400>;
> +			interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&ccu CLK_BUS_UART3>;
> +			resets = <&ccu RST_BUS_UART3>;
> +			status = "disabled";
> +		};
> +
> +		uart4: serial@1c29000 {
> +			compatible = "snps,dw-apb-uart";
> +			reg = <0x01c29000 0x400>;
> +			interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&ccu CLK_BUS_UART4>;
> +			resets = <&ccu RST_BUS_UART4>;
> +			status = "disabled";
> +		};
> +
> +		i2c0: i2c@1c2ac00 {
> +			compatible = "allwinner,sun8i-b288-i2c",
> +				     "allwinner,sun6i-a31-i2c";
> +			reg = <0x01c2ac00 0x400>;
> +			interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&ccu CLK_BUS_TWI0>;
> +			resets = <&ccu RST_BUS_I2C0>;
> +			pinctrl-names = "default";
> +			pinctrl-0 = <&i2c0_pins>;
> +			status = "disabled";
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +		};
> +
> +		i2c1: i2c@1c2b000 {
> +			compatible = "allwinner,sun8i-b288-i2c",
> +				     "allwinner,sun6i-a31-i2c";
> +			reg = <0x01c2b000 0x400>;
> +			interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&ccu CLK_BUS_TWI1>;
> +			resets = <&ccu RST_BUS_I2C1>;
> +			status = "disabled";
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +		};
> +
> +		i2c2: i2c@1c2b400 {
> +			compatible = "allwinner,sun8i-b288-i2c",
> +				     "allwinner,sun6i-a31-i2c";
> +			reg = <0x01c2b400 0x400>;
> +			interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&ccu CLK_BUS_TWI2>;
> +			resets = <&ccu RST_BUS_I2C2>;
> +			status = "disabled";
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +		};
> +
> +		gic: interrupt-controller@1c81000 {
> +			compatible = "arm,gic-400";
> +			reg = <0x01c81000 0x1000>,
> +			      <0x01c82000 0x2000>,
> +			      <0x01c84000 0x2000>,
> +			      <0x01c86000 0x2000>;
> +			interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
> +			interrupt-controller;
> +			#interrupt-cells = <3>;
> +		};
> +	};
> +};
> diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c
> index e1b7945aac99..c5b19d0e63f9 100644
> --- a/arch/arm/mach-sunxi/sunxi.c
> +++ b/arch/arm/mach-sunxi/sunxi.c
> @@ -61,6 +61,7 @@ MACHINE_END
>   static const char * const sun8i_board_dt_compat[] = {
>   	"allwinner,sun8i-a23",
>   	"allwinner,sun8i-a33",
> +	"allwinner,sun8i-b288",

Do we really need that entry? Or at least do we need the timer init part 
of that?
And in any case it doesn't belong into the DT patch, as it's Linux code, 
not DT or binding related.

Cheers,
Andre

>   	"allwinner,sun8i-h2-plus",
>   	"allwinner,sun8i-h3",
>   	"allwinner,sun8i-r40",


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

* Re: [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: add Allwinner B288
  2026-09-27 15:10 ` [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: " Pablo Mazzini
  2026-09-30 10:15   ` Krzysztof Kozlowski
@ 2026-09-30 16:04   ` Ulf Hansson
  1 sibling, 0 replies; 23+ messages in thread
From: Ulf Hansson @ 2026-09-30 16:04 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Maxime Ripard, Rob Herring, Samuel Holland, Ulf Hansson,
	devicetree, linux-arm-kernel, linux-kernel, linux-mmc,
	linux-sunxi

On Sun, Sep 27, 2026 at 5:12 PM Pablo Mazzini <pmazzini@gmail.com> wrote:
>
> Add the MMC and eMMC compatibles.
>
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>

Applied for next, thanks!

Kind regards
Uffe

> ---
>  .../devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml        | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml b/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml
> index 9e9610bb1eda..c2ec7151dccf 100644
> --- a/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml
> +++ b/Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml
> @@ -32,10 +32,12 @@ properties:
>        - items:
>            - enum:
>                - allwinner,sun8i-a83t-mmc
> +              - allwinner,sun8i-b288-mmc
>                - allwinner,suniv-f1c100s-mmc
>            - const: allwinner,sun7i-a20-mmc
>        - items:
>            - enum:
> +              - allwinner,sun8i-b288-emmc
>                - allwinner,sun8i-r40-emmc
>                - allwinner,sun50i-h5-emmc
>                - allwinner,sun50i-h6-emmc
> --
> 2.53.0
>

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

* Re: [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board
  2026-09-30 12:01   ` Andre Przywara
@ 2026-09-30 17:52     ` Pablo Mazzini
  0 siblings, 0 replies; 23+ messages in thread
From: Pablo Mazzini @ 2026-09-30 17:52 UTC (permalink / raw)
  To: Andre Przywara
  Cc: Chen-Yu Tsai, Conor Dooley, Jernej Skrabec, Krzysztof Kozlowski,
	Rob Herring, Samuel Holland, devicetree, linux-arm-kernel,
	linux-kernel, linux-sunxi

Hi Andre,

thanks for the detailed review.

> Are you planning on going ahead with just boot0 in the long run?

No, I'll work on U-Boot, but it needs the DT upstream first.

> And in general: how do you boot this device, then?

Over FEL: SPL, U-Boot and the kernel are loaded over USB.

> Can you please create a wiki page about the device

Will do.

> We typically don't hardcode memory nodes in the DT

Dropped for v3, U-Boot fills it in.

> please add the "disable-wp;" property.
> [...] just reference them here.

Done for v3.

> And are you sure the vmmc-supply is dldo2?

Yes: the vendor's board config maps the microSD vmmc to axp227_dldo2,
which is off at power-on.

> If this is a 1.8V eMMC, then please add the 1.8V properties

Added; the eMMC runs in HS200.

> Can you add a comment here that this is labelled as AXP227?
> Do you really need the always-on here?

Comment added. always-on dropped: the eMMC and the pin controller keep
DLDO1 enabled.

> What does "switched per card scan" mean?

The MMC core switches DLDO2 on only while a card is present. Reworded.

> I don't think we put the crystals in their own node anymore.
> So how does SMP work here, exactly?

Crystals moved out for v3. SMP will use PSCI from U-Boot.

> Meh, as the comments in the binding say: please fix your firmware ;-)

Dropped for v3, U-Boot sets CNTFRQ and CNTVOFF.

> [comments, function names, watchdog compatible, sunxi.c entry]

All done for v3: comments trimmed, mmc0/i2c0/mmc3 function names, a
B288 watchdog compatible with the A31 fallback, and the sunxi.c entry
dropped, as the generic machine works.

Thanks,
Pablo

On Wed, Sep 30, 2026 at 1:01 PM Andre Przywara <andre.przywara@arm.com> wrote:
>
> Hi,
>
> many thanks for cobbling this together, I do understand that this is
> tricky without schematics or even a manual.
>
> On 9/27/26 17:10, Pablo Mazzini wrote:
> > arm,cpu-registers-not-fw-configured is required: Allwinner's boot0 sets
> > neither CNTFRQ nor CNTVOFF, so the virtual timer storms. Same reason as
> > commit 121b96cd9d7e ("ARM: sun6i: Enable ARM arch timers").
>
> Are you planning on going ahead with just boot0 in the long run? Given
> the age of the platform, and it being close to the A64, I expect a
> U-Boot port being pretty straight-forward. Chances are the DRAM
> controller (the biggest hurdle here) is very similar to the H3/A64/R40
> generation, for which we already have a unified driver.
>
> And in general: how do you boot this device, then? I guess you somehow
> trick boot0 into booting a mainline kernel? Is there some documentation
> about this?
> Can you please create a wiki page about the device, and describe your
> device-specific findings in there? There is
> https://linux-sunxi.org/PocketBook_Basic_Lux_4_(PB618) already, which
> you can use as inspiration. Or maybe, if they are very similar, use that
> very page, even.
>
> > The watchdog interrupt was measured on hardware via GICD_ISPENDR.
> >
> > Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
> > ---
> >   arch/arm/boot/dts/allwinner/Makefile          |   1 +
> >   .../allwinner/sun8i-b288-pocketbook-verse.dts | 122 +++++++
> >   arch/arm/boot/dts/allwinner/sun8i-b288.dtsi   | 304 ++++++++++++++++++
> >   arch/arm/mach-sunxi/sunxi.c                   |   1 +
> >   4 files changed, 428 insertions(+)
> >   create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
> >   create mode 100644 arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> >
> > diff --git a/arch/arm/boot/dts/allwinner/Makefile b/arch/arm/boot/dts/allwinner/Makefile
> > index 75b2b6a2f7a6..2dfdc01e4825 100644
> > --- a/arch/arm/boot/dts/allwinner/Makefile
> > +++ b/arch/arm/boot/dts/allwinner/Makefile
> > @@ -227,6 +227,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \
> >       sun8i-a83t-bananapi-m3.dtb \
> >       sun8i-a83t-cubietruck-plus.dtb \
> >       sun8i-a83t-tbs-a711.dtb \
> > +     sun8i-b288-pocketbook-verse.dtb \
> >       sun8i-h2-plus-bananapi-m2-zero.dtb \
> >       sun8i-h2-plus-libretech-all-h3-cc.dtb \
> >       sun8i-h2-plus-orangepi-r1.dtb \
> > diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
> > new file mode 100644
> > index 000000000000..91c89d5a097e
> > --- /dev/null
> > +++ b/arch/arm/boot/dts/allwinner/sun8i-b288-pocketbook-verse.dts
> > @@ -0,0 +1,122 @@
> > +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> > +/*
> > + * PocketBook Verse (PB629), an Allwinner B288 based e-reader.
> > + */
> > +
> > +/dts-v1/;
> > +#include "sun8i-b288.dtsi"
> > +
> > +#include <dt-bindings/gpio/gpio.h>
> > +
> > +/ {
> > +     model = "PocketBook Verse";
> > +     compatible = "pocketbook,verse", "allwinner,sun8i-b288";
> > +
> > +     aliases {
> > +             serial0 = &uart0;
> > +     };
> > +
> > +     chosen {
> > +             stdout-path = "serial0:115200n8";
> > +     };
> > +
> > +     memory@40000000 {
>
> We typically don't hardcode memory nodes in the DT, but leave this up to
> the bootloader to populate, based on either detection or hard-coding
> *there*.
> I guess this eBook reader only comes in this one configuration?
> Maybe we could allow this node in here, then, to increase compatiblity?
> Depends a bit on how involved this boot0 setup is, I guess.
>
> > +             device_type = "memory";
> > +             reg = <0x40000000 0x20000000>;
> > +     };
> > +};
> > +
> > +&uart0 {
> > +     status = "okay";
> > +};
> > +
> > +&mmc0 {
> > +     vmmc-supply = <&reg_dldo2>;
> > +     bus-width = <4>;
> > +     cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;  /* PF6 */
>
> I guess this is microSD, so without a write-protection switch? Then
> please add the "disable-wp;" property.
> Also this is missing the pinctrl properties, to describe the pinmux
> used. As you describe the PortB UART0 pins in the .dtsi, just reference
> them here.
>
> And are you sure the vmmc-supply is dldo2? Does the VCC pin on the SD
> card slot go to 0V when you turn that regulator off?
> Just asking because on this generation of devices we most often see
> DCDC1 supplying the SD card, as it needs to be powered at reset time, to
> allow the BROM reading from the SD card.
>
> > +     status = "okay";
> > +};
> > +
> > +&mmc3 {
> > +     vmmc-supply = <&reg_dcdc1>;
> > +     vqmmc-supply = <&reg_dldo1>;
>
> If this is a 1.8V eMMC, then please add the 1.8V properties:
>          mmc-ddr-1_8v;
>          mmc-hs200-1_8v;
> (given that these modes work).
> And again the pinctrl nodes are missing.
>
> > +     bus-width = <8>;
> > +     non-removable;
> > +     cap-mmc-hw-reset;
> > +     status = "okay";
> > +};
> > +
> > +&pio {
> > +     vcc-pc-supply = <&reg_dldo1>;
> > +     vcc-pd-supply = <&reg_dldo1>;
> > +     /*
> > +      * PC and PD are named in the vendor rail list; PF is not. It is not
> > +      * on dldo2: with that rail off, a pull-up on PF6 still reads card
> > +      * detect correctly, so the bank has its own supply. dcdc1 is the
> > +      * only remaining candidate, carrying vcc-io and vcc-card. Derived
> > +      * from the rail naming plus that measurement, not from a schematic.
> > +      */
> > +     vcc-pf-supply = <&reg_dcdc1>;
>
> Yes, on older SoCs PortF is internally powered by the VCC-IO pin, and is
> fixed at 3.3V. Compare the datasheets from the A64 and H3, for instance.
> And VCC-IO is traditionally powered by DCDC1, since it needs the most juice.
> In any case, I think we don't need the comment, since it's a common setup.
>
> > +};
> > +
> > +&i2c0 {
> > +     status = "okay";
> > +
> > +     axp22x: pmic@34 {
>
> Can you add a comment here that this is labelled as AXP227?
>
> > +             compatible = "x-powers,axp221";
> > +             reg = <0x34>;
> > +             interrupt-parent = <&nmi_intc>;
> > +             interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
> > +     };
> > +};
> > +
> > +#include "axp22x.dtsi"
> > +
> > +&reg_dcdc1 {
> > +     regulator-always-on;
> > +     regulator-min-microvolt = <3000000>;
> > +     regulator-max-microvolt = <3000000>;
> > +     regulator-name = "vcc-io";
> > +};
> > +
> > +&reg_dcdc2 {
> > +     regulator-always-on;
> > +     regulator-min-microvolt = <1260000>;
> > +     regulator-max-microvolt = <1260000>;
> > +     regulator-name = "vdd-cpu";
> > +};
> > +
> > +&reg_dcdc4 {
> > +     regulator-always-on;
> > +     regulator-min-microvolt = <1100000>;
> > +     regulator-max-microvolt = <1100000>;
> > +     regulator-name = "vdd-sys";
> > +};
> > +
> > +&reg_dcdc5 {
> > +     regulator-always-on;
> > +     regulator-min-microvolt = <1350000>;
> > +     regulator-max-microvolt = <1350000>;
> > +     regulator-name = "vcc-dram";
> > +};
> > +
> > +&reg_aldo3 {
> > +     regulator-always-on;
> > +     regulator-min-microvolt = <3000000>;
> > +     regulator-max-microvolt = <3000000>;
> > +     regulator-name = "avcc";
> > +};
> > +
> > +&reg_dldo1 {
> > +     regulator-always-on;
>
> Do you really need the always-on here?
> Does it power more than the eMMC? Can you boot from SD card and use the
> system with that property removed, and the kernel turning it off?
>
> > +     regulator-min-microvolt = <1800000>;
> > +     regulator-max-microvolt = <1800000>;
> > +     regulator-name = "vcc-pc";
> > +};
> > +
> > +&reg_dldo2 {
> > +     /* Powers the microSD slot (slot pin 4), switched per card scan. */
>
> What does "switched per card scan" mean?
> And it's rather uncommon to see the SD card powered by a separate PMIC
> line, since it needs to be on at reset, to allow the BROM to access it.
> According to the AXP221 datasheet, dldo2 is off at reset, so can you
> please somehow check this? It might be different on the AXP227, but
> worth a try, I think.
>
> > +     regulator-min-microvolt = <3300000>;
> > +     regulator-max-microvolt = <3300000>;
> > +     regulator-name = "vcc-sdcv";
> > +};
> > diff --git a/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> > new file mode 100644
> > index 000000000000..f5feec87defc
> > --- /dev/null
> > +++ b/arch/arm/boot/dts/allwinner/sun8i-b288.dtsi
> > @@ -0,0 +1,304 @@
> > +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> > +/*
> > + * Allwinner B288 (sun8iw10p1) SoC
> > + *
> > + * Addresses and interrupts come from the PocketBook Verse (PB629) vendor
> > + * device tree, cross-checked against the BSP clk-sun8iw10.c.
> > + */
> > +
> > +#include <dt-bindings/interrupt-controller/arm-gic.h>
> > +#include <dt-bindings/clock/sun8i-b288-ccu.h>
> > +#include <dt-bindings/reset/sun8i-b288-ccu.h>
> > +
> > +/ {
> > +     #address-cells = <1>;
> > +     #size-cells = <1>;
> > +     interrupt-parent = <&gic>;
> > +
> > +     clocks {
>
> I don't think we put the crystals in their own node anymore. I see that
> we did this for the 32-bit Allwinner SoCs, but it's pointless.
>
> > +             osc24M: osc24M-clk {
> > +                     #clock-cells = <0>;
> > +                     compatible = "fixed-clock";
> > +                     clock-frequency = <24000000>;
> > +                     clock-output-names = "osc24M";
> > +             };
> > +
> > +             osc32k: osc32k-clk {
> > +                     #clock-cells = <0>;
> > +                     compatible = "fixed-clock";
> > +                     clock-frequency = <32768>;
> > +                     clock-output-names = "osc32k";
> > +             };
> > +     };
> > +
> > +     cpus {
> > +             #address-cells = <1>;
> > +             #size-cells = <0>;
> > +
> > +             cpu0: cpu@0 {
> > +                     compatible = "arm,cortex-a7";
> > +                     device_type = "cpu";
> > +                     reg = <0>;
> > +                     clocks = <&ccu CLK_CPUX>;
> > +                     clock-names = "cpu";
> > +             };
> > +
> > +             cpu1: cpu@1 {
> > +                     compatible = "arm,cortex-a7";
> > +                     device_type = "cpu";
> > +                     reg = <1>;
> > +                     clocks = <&ccu CLK_CPUX>;
> > +                     clock-names = "cpu";
> > +             };
> > +     };
>
>
> So how does SMP work here, exactly? For the later 32-bit SoCs, we rely
> on a PSCI implmenetation in U-Boot, and I would strongly recommend doing
> so here as well.
>
> > +
> > +     timer {
> > +             compatible = "arm,armv7-timer";
> > +             interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
> > +                          <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
> > +                          <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
> > +                          <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
> > +             clock-frequency = <24000000>;
> > +             arm,cpu-registers-not-fw-configured;
>
> Meh, as the comments in the binding say: please fix your firmware ;-)
> I am not completely against it if boot0 is the firmware to use for a
> while, but if we go with U-Boot, it would be nicely fixed there.
>
> > +     };
> > +
> > +     soc {
> > +             compatible = "simple-bus";
> > +             #address-cells = <1>;
> > +             #size-cells = <1>;
> > +             ranges;
> > +
> > +             /*
> > +              * mmc0 is a v4p1x controller, so it runs in the old timing
> > +              * mode and needs the sample and output phase clocks.
>
> I think the comment can end here.
> But it would need to be moved below, above the actual mmc0 node.
>
> >               Do not
> > +              * give it the sun50i-a64-mmc fallback: that selects the new
> > +              * timing mode, which this block does not implement.
> > +              */
> > +             nmi_intc: interrupt-controller@1c000d0 {
> > +                     compatible = "allwinner,sun8i-b288-nmi",
> > +                                  "allwinner,sun9i-a80-nmi";
> > +                     interrupt-controller;
> > +                     #interrupt-cells = <2>;
> > +                     reg = <0x01c000d0 0x0c>;
> > +                     interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
> > +             };
> > +
> > +             mmc0: mmc@1c0f000 {
> > +                     compatible = "allwinner,sun8i-b288-mmc",
> > +                                  "allwinner,sun7i-a20-mmc";
> > +                     reg = <0x01c0f000 0x1000>;
> > +                     clocks = <&ccu CLK_BUS_SDMMC0_BUS>,
> > +                              <&ccu CLK_MMC0>,
> > +                              <&ccu CLK_MMC0_OUTPUT>,
> > +                              <&ccu CLK_MMC0_SAMPLE>;
> > +                     clock-names = "ahb", "mmc", "output", "sample";
> > +                     resets = <&ccu RST_BUS_MMC0>;
> > +                     reset-names = "ahb";
> > +                     interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
> > +                     pinctrl-names = "default";
> > +                     pinctrl-0 = <&mmc0_pins>;
> > +                     status = "disabled";
> > +                     #address-cells = <1>;
> > +                     #size-cells = <0>;
> > +             };
> > +
> > +             /* SDXC v4.5. The soldered eMMC; shares the PC pads with mmc2. */
>
> This comment should go. Pinmuxing is described separately, and "the
> soldered eMMC" does not belong into a .dtsi file, since it's board specific.
> If you really want to document some of your findings, you can do so in
> the commit message.
>
> > +             mmc3: mmc@1c12000 {
> > +                     compatible = "allwinner,sun8i-b288-emmc",
> > +                                  "allwinner,sun50i-a64-emmc";
> > +                     reg = <0x01c12000 0x1000>;
> > +                     clocks = <&ccu CLK_BUS_SDMMC3_BUS>, <&ccu CLK_MMC3>;
> > +                     clock-names = "ahb", "mmc";
> > +                     resets = <&ccu RST_BUS_MMC3>;
> > +                     reset-names = "ahb";
> > +                     interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
> > +                     pinctrl-names = "default";
> > +                     pinctrl-0 = <&mmc3_pins>;
> > +                     status = "disabled";
> > +                     #address-cells = <1>;
> > +                     #size-cells = <0>;
> > +             };
> > +
> > +             /*
> > +              * mmc2 (0x01c11000) is an SDHCI-style controller, not SDXC, and
> > +              * has no upstream binding. It loses the PC pad arbitration to
> > +              * mmc3 and is unused here, so it is left undescribed rather than
> > +              * given a wrong compatible.
> > +              */
>
> You can shorten the comment to:
>         "mc2 @0x01c11000 is an unsupported SDHCI-style controller."
>
> > +
> > +             ccu: clock-controller@1c20000 {
> > +                     compatible = "allwinner,sun8i-b288-ccu";
> > +                     reg = <0x01c20000 0x400>;
> > +                     clocks = <&osc24M>, <&osc32k>;
> > +                     clock-names = "hosc", "losc";
> > +                     #clock-cells = <1>;
> > +                     #reset-cells = <1>;
> > +             };
> > +
> > +             rtc: rtc@1c20400 {
> > +                     compatible = "allwinner,sun8i-b288-rtc";
> > +                     reg = <0x01c20400 0x400>;
> > +                     interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
> > +                     clock-output-names = "osc32k";
> > +                     clocks = <&osc32k>;
> > +                     #clock-cells = <1>;
> > +             };
> > +
> > +             pio: pinctrl@1c20800 {
> > +                     compatible = "allwinner,sun8i-b288-pinctrl";
> > +                     reg = <0x01c20800 0x400>;
> > +                     interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
> > +                                  <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
> > +                                  <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
> > +                                  <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
> > +                     clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
> > +                     clock-names = "apb", "hosc", "losc";
> > +                     gpio-controller;
> > +                     #gpio-cells = <3>;
> > +                     interrupt-controller;
> > +                     #interrupt-cells = <3>;
> > +
> > +                     mmc0_pins: mmc0-pins {
> > +                             pins = "PF0", "PF1", "PF2",
> > +                                    "PF3", "PF4", "PF5";
> > +                             function = "sdc0";
>
> We do not use the BSP function naming, but "mmc0" instead.
>
> > +                             allwinner,pinmux = <2>;
> > +                             drive-strength = <30>;
> > +                             bias-pull-up;
> > +                     };
> > +
> > +                     i2c0_pins: i2c0-pins {
> > +                             pins = "PB6", "PB7";
> > +                             function = "twi0";
>
> Same here, "i2c0" please.
>
> > +                             allwinner,pinmux = <2>;
> > +                     };
> > +
> > +                     mmc3_pins: mmc3-pins {
> > +                             pins = "PC1", "PC4", "PC5", "PC6",
> > +                                    "PC7", "PC8", "PC9", "PC10",
> > +                                    "PC11", "PC12", "PC13", "PC14";
> > +                             function = "sdc3";
>
> function = "mmc3";
>
> > +                             allwinner,pinmux = <5>;
> > +                             drive-strength = <40>;
> > +                             bias-pull-up;
> > +                     };
> > +
> > +                     uart0_pb_pins: uart0-pb-pins {
> > +                             pins = "PB4", "PB5";
> > +                             function = "uart0";
> > +                             allwinner,pinmux = <2>;
> > +                     };
> > +             };
> > +
> > +             wdt: watchdog@1c20ca0 {
> > +                     compatible = "allwinner,sun6i-a31-wdt";
>
> I think lately we used this as a fallback, paired with a SoC specific
> compatible first.
> In many aspects the more recent DTs under the arch/arm64 directory are
> more modern and a better source to copy from.
> > +                     reg = <0x01c20ca0 0x20>;
> > +                     interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
> > +                     clocks = <&osc24M>;
> > +             };
> > +
> > +             uart0: serial@1c28000 {
> > +                     compatible = "snps,dw-apb-uart";
> > +                     reg = <0x01c28000 0x400>;
> > +                     interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
> > +                     reg-shift = <2>;
> > +                     reg-io-width = <4>;
> > +                     clocks = <&ccu CLK_BUS_UART0>;
> > +                     resets = <&ccu RST_BUS_UART0>;
> > +                     status = "disabled";
> > +             };
> > +
> > +             uart1: serial@1c28400 {
> > +                     compatible = "snps,dw-apb-uart";
> > +                     reg = <0x01c28400 0x400>;
> > +                     interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
> > +                     reg-shift = <2>;
> > +                     reg-io-width = <4>;
> > +                     clocks = <&ccu CLK_BUS_UART1>;
> > +                     resets = <&ccu RST_BUS_UART1>;
> > +                     status = "disabled";
> > +             };
> > +
> > +             uart2: serial@1c28800 {
> > +                     compatible = "snps,dw-apb-uart";
> > +                     reg = <0x01c28800 0x400>;
> > +                     interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
> > +                     reg-shift = <2>;
> > +                     reg-io-width = <4>;
> > +                     clocks = <&ccu CLK_BUS_UART2>;
> > +                     resets = <&ccu RST_BUS_UART2>;
> > +                     status = "disabled";
> > +             };
> > +
> > +             uart3: serial@1c28c00 {
> > +                     compatible = "snps,dw-apb-uart";
> > +                     reg = <0x01c28c00 0x400>;
> > +                     interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
> > +                     reg-shift = <2>;
> > +                     reg-io-width = <4>;
> > +                     clocks = <&ccu CLK_BUS_UART3>;
> > +                     resets = <&ccu RST_BUS_UART3>;
> > +                     status = "disabled";
> > +             };
> > +
> > +             uart4: serial@1c29000 {
> > +                     compatible = "snps,dw-apb-uart";
> > +                     reg = <0x01c29000 0x400>;
> > +                     interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
> > +                     reg-shift = <2>;
> > +                     reg-io-width = <4>;
> > +                     clocks = <&ccu CLK_BUS_UART4>;
> > +                     resets = <&ccu RST_BUS_UART4>;
> > +                     status = "disabled";
> > +             };
> > +
> > +             i2c0: i2c@1c2ac00 {
> > +                     compatible = "allwinner,sun8i-b288-i2c",
> > +                                  "allwinner,sun6i-a31-i2c";
> > +                     reg = <0x01c2ac00 0x400>;
> > +                     interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
> > +                     clocks = <&ccu CLK_BUS_TWI0>;
> > +                     resets = <&ccu RST_BUS_I2C0>;
> > +                     pinctrl-names = "default";
> > +                     pinctrl-0 = <&i2c0_pins>;
> > +                     status = "disabled";
> > +                     #address-cells = <1>;
> > +                     #size-cells = <0>;
> > +             };
> > +
> > +             i2c1: i2c@1c2b000 {
> > +                     compatible = "allwinner,sun8i-b288-i2c",
> > +                                  "allwinner,sun6i-a31-i2c";
> > +                     reg = <0x01c2b000 0x400>;
> > +                     interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
> > +                     clocks = <&ccu CLK_BUS_TWI1>;
> > +                     resets = <&ccu RST_BUS_I2C1>;
> > +                     status = "disabled";
> > +                     #address-cells = <1>;
> > +                     #size-cells = <0>;
> > +             };
> > +
> > +             i2c2: i2c@1c2b400 {
> > +                     compatible = "allwinner,sun8i-b288-i2c",
> > +                                  "allwinner,sun6i-a31-i2c";
> > +                     reg = <0x01c2b400 0x400>;
> > +                     interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
> > +                     clocks = <&ccu CLK_BUS_TWI2>;
> > +                     resets = <&ccu RST_BUS_I2C2>;
> > +                     status = "disabled";
> > +                     #address-cells = <1>;
> > +                     #size-cells = <0>;
> > +             };
> > +
> > +             gic: interrupt-controller@1c81000 {
> > +                     compatible = "arm,gic-400";
> > +                     reg = <0x01c81000 0x1000>,
> > +                           <0x01c82000 0x2000>,
> > +                           <0x01c84000 0x2000>,
> > +                           <0x01c86000 0x2000>;
> > +                     interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
> > +                     interrupt-controller;
> > +                     #interrupt-cells = <3>;
> > +             };
> > +     };
> > +};
> > diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c
> > index e1b7945aac99..c5b19d0e63f9 100644
> > --- a/arch/arm/mach-sunxi/sunxi.c
> > +++ b/arch/arm/mach-sunxi/sunxi.c
> > @@ -61,6 +61,7 @@ MACHINE_END
> >   static const char * const sun8i_board_dt_compat[] = {
> >       "allwinner,sun8i-a23",
> >       "allwinner,sun8i-a33",
> > +     "allwinner,sun8i-b288",
>
> Do we really need that entry? Or at least do we need the timer init part
> of that?
> And in any case it doesn't belong into the DT patch, as it's Linux code,
> not DT or binding related.
>
> Cheers,
> Andre
>
> >       "allwinner,sun8i-h2-plus",
> >       "allwinner,sun8i-h3",
> >       "allwinner,sun8i-r40",
>

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

end of thread, other threads:[~2026-09-30 17:53 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-27 15:10 [PATCH v2 00/11] ARM: sunxi: add Allwinner B288 and the PocketBook Verse Pablo Mazzini
2026-09-27 15:10 ` [PATCH v2 01/11] dt-bindings: clock: sun4i-a10-ccu: add Allwinner B288 Pablo Mazzini
2026-09-30 10:08   ` Krzysztof Kozlowski
2026-09-27 15:10 ` [PATCH v2 03/11] dt-bindings: pinctrl: sun4i-a10: " Pablo Mazzini
2026-09-27 15:18   ` sashiko-bot
2026-09-27 15:10 ` [PATCH v2 05/11] dt-bindings: rtc: sun6i-a31: " Pablo Mazzini
2026-09-27 15:17   ` sashiko-bot
2026-09-30 10:10   ` Krzysztof Kozlowski
2026-09-30 10:47     ` Pablo Mazzini
2026-09-27 15:10 ` [PATCH v2 07/11] dt-bindings: i2c: mv64xxx: " Pablo Mazzini
2026-09-28 10:00   ` Andi Shyti
2026-09-30 10:11   ` Krzysztof Kozlowski
2026-09-27 15:10 ` [PATCH v2 08/11] dt-bindings: mmc: sun4i-a10-mmc: " Pablo Mazzini
2026-09-30 10:15   ` Krzysztof Kozlowski
2026-09-30 16:04   ` Ulf Hansson
2026-09-27 15:10 ` [PATCH v2 09/11] dt-bindings: interrupt-controller: add Allwinner B288 NMI Pablo Mazzini
2026-09-30 10:17   ` Krzysztof Kozlowski
2026-09-27 15:10 ` [PATCH v2 10/11] dt-bindings: arm: sunxi: add PocketBook Verse Pablo Mazzini
2026-09-27 15:27   ` sashiko-bot
2026-09-27 15:10 ` [PATCH v2 11/11] ARM: sunxi: add B288 and the PocketBook Verse board Pablo Mazzini
2026-09-27 15:29   ` sashiko-bot
2026-09-30 12:01   ` Andre Przywara
2026-09-30 17:52     ` Pablo Mazzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox