All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] board: rockchip: add Powkiddy X55
@ 2023-12-05 21:39 Chris Morgan
  2023-12-05 22:48 ` Jonas Karlman
  0 siblings, 1 reply; 3+ messages in thread
From: Chris Morgan @ 2023-12-05 21:39 UTC (permalink / raw)
  To: u-boot; +Cc: kever.yang, philipp.tomsich, sjg, Chris Morgan

From: Chris Morgan <macromorgan@hotmail.com>

The Powkiddy X55 is a Rockchip RK3566 based handheld gaming device.
UART, ADC, eMMC, and SDMMC are tested to work.

Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
---
 arch/arm/dts/Makefile                        |   1 +
 arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi |  67 ++
 arch/arm/dts/rk3566-powkiddy-x55.dts         | 926 +++++++++++++++++++
 arch/arm/mach-rockchip/rk3568/Kconfig        |   6 +
 board/powkiddy/x55/Kconfig                   |  15 +
 board/powkiddy/x55/MAINTAINERS               |   8 +
 board/powkiddy/x55/Makefile                  |   6 +
 board/powkiddy/x55/x55.c                     | 101 ++
 configs/powkiddy-x55-rk3566_defconfig        |  86 ++
 doc/board/index.rst                          |   1 +
 doc/board/powkiddy/index.rst                 |   9 +
 doc/board/powkiddy/x55.rst                   |  46 +
 include/configs/powkiddy-x55-rk3566.h        |  12 +
 13 files changed, 1284 insertions(+)
 create mode 100644 arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3566-powkiddy-x55.dts
 create mode 100644 board/powkiddy/x55/Kconfig
 create mode 100644 board/powkiddy/x55/MAINTAINERS
 create mode 100644 board/powkiddy/x55/Makefile
 create mode 100644 board/powkiddy/x55/x55.c
 create mode 100644 configs/powkiddy-x55-rk3566_defconfig
 create mode 100644 doc/board/powkiddy/index.rst
 create mode 100644 doc/board/powkiddy/x55.rst
 create mode 100644 include/configs/powkiddy-x55-rk3566.h

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 1be08c5fdc..9e38bab6eb 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -174,6 +174,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3568) += \
 	rk3566-anbernic-rgxx3.dtb \
 	rk3566-quartz64-a.dtb \
 	rk3566-quartz64-b.dtb \
+	rk3566-powkiddy-x55.dtb \
 	rk3566-radxa-cm3-io.dtb \
 	rk3566-soquartz-blade.dtb \
 	rk3566-soquartz-cm4.dtb \
diff --git a/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
new file mode 100644
index 0000000000..2e3998a65a
--- /dev/null
+++ b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+
+#include "rk356x-u-boot.dtsi"
+
+/ {
+	chosen {
+		stdout-path = &uart2;
+		u-boot,spl-boot-order = "same-as-spl", &sdmmc0, &sdhci;
+	};
+
+	rng: rng@fe388000 {
+		compatible = "rockchip,cryptov2-rng";
+		reg = <0x0 0xfe388000 0x0 0x2000>;
+		status = "okay";
+	};
+};
+
+&cru {
+	assigned-clocks =
+			<&pmucru CLK_RTC_32K>, <&pmucru PLL_PPLL>,
+			<&pmucru PCLK_PMU>, <&cru PLL_CPLL>,
+			<&cru PLL_GPLL>, <&cru PLL_VPLL>,
+			<&cru ACLK_BUS>, <&cru PCLK_BUS>,
+			<&cru ACLK_TOP_HIGH>, <&cru ACLK_TOP_LOW>,
+			<&cru HCLK_TOP>, <&cru PCLK_TOP>,
+			<&cru ACLK_PERIMID>, <&cru HCLK_PERIMID>,
+			<&cru CPLL_500M>, <&cru CPLL_333M>,
+			<&cru CPLL_250M>, <&cru CPLL_125M>,
+			<&cru CPLL_100M>, <&cru CPLL_62P5M>,
+			<&cru CPLL_50M>, <&cru CPLL_25M>;
+		assigned-clock-rates =
+			<32768>, <200000000>,
+			<100000000>, <1000000000>,
+			<1200000000>, <126400000>,
+			<150000000>, <100000000>,
+			<500000000>, <400000000>,
+			<150000000>, <100000000>,
+			<300000000>, <150000000>,
+			<500000000>, <333333333>,
+			<250000000>, <125000000>,
+			<100000000>, <62500000>,
+			<50000000>, <25000000>;
+		assigned-clock-parents =
+			<&pmucru CLK_RTC32K_FRAC>;
+};
+
+&pmucru {
+	assigned-clocks = <&pmucru SCLK_32K_IOE>;
+	assigned-clock-parents = <&pmucru CLK_RTC_32K>;
+};
+
+/*
+ * We don't need the clocks, but if they are present they may cause
+ * probing to fail so we remove them for U-Boot.
+ */
+&rk817 {
+	/delete-property/ assigned-clocks;
+	/delete-property/ assigned-clock-parents;
+	/delete-property/ clocks;
+	/delete-property/ clock-names;
+};
+
+&uart2 {
+	clock-frequency = <24000000>;
+	bootph-all;
+	status = "okay";
+};
diff --git a/arch/arm/dts/rk3566-powkiddy-x55.dts b/arch/arm/dts/rk3566-powkiddy-x55.dts
new file mode 100644
index 0000000000..4786b19fd0
--- /dev/null
+++ b/arch/arm/dts/rk3566-powkiddy-x55.dts
@@ -0,0 +1,926 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/linux-event-codes.h>
+#include <dt-bindings/leds/common.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/soc/rockchip,vop2.h>
+#include "rk3566.dtsi"
+
+/ {
+	model = "Powkiddy x55";
+	compatible = "powkiddy,x55", "rockchip,rk3566";
+
+	aliases {
+		mmc0 = &sdhci;
+		mmc1 = &sdmmc0;
+		mmc2 = &sdmmc2;
+		mmc3 = &sdmmc1;
+	};
+
+	chosen: chosen {
+		stdout-path = "serial2:1500000n8";
+	};
+
+	adc_joystick: adc-joystick {
+		compatible = "adc-joystick";
+		io-channels = <&saradc 0>, <&saradc 1>,
+			      <&saradc 2>, <&saradc 3>;
+		poll-interval = <60>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		axis@0 {
+			reg = <0>;
+			abs-flat = <30>;
+			abs-fuzz = <20>;
+			abs-range = <15 1023>;
+			linux,code = <ABS_X>;
+		};
+
+		axis@1 {
+			reg = <1>;
+			abs-flat = <30>;
+			abs-fuzz = <20>;
+			abs-range = <1023 15>;
+			linux,code = <ABS_Y>;
+		};
+
+		axis@2 {
+			reg = <2>;
+			abs-flat = <30>;
+			abs-fuzz = <20>;
+			abs-range = <15 1023>;
+			linux,code = <ABS_RX>;
+		};
+
+		axis@3 {
+			reg = <3>;
+			abs-flat = <30>;
+			abs-fuzz = <20>;
+			abs-range = <1023 15>;
+			linux,code = <ABS_RY>;
+		};
+	};
+
+	backlight: backlight {
+		compatible = "pwm-backlight";
+		power-supply = <&vcc_sys>;
+		pwms = <&pwm4 0 25000 0>;
+	};
+
+	battery: battery {
+		compatible = "simple-battery";
+		charge-full-design-microamp-hours = <4000000>;
+		charge-term-current-microamp = <300000>;
+		constant-charge-current-max-microamp = <2000000>;
+		constant-charge-voltage-max-microvolt = <4300000>;
+		factory-internal-resistance-micro-ohms = <91000>;
+		voltage-max-design-microvolt = <4138000>;
+		voltage-min-design-microvolt = <3400000>;
+
+		ocv-capacity-celsius = <20>;
+		ocv-capacity-table-0 =  <4138000 100>, <4083000 95>, <4059000 90>, <4044000 85>,
+					<4030000 80>, <4020000 75>, <4006000 70>, <3972000 65>,
+					<3934000 60>, <3904000 55>, <3878000 50>, <3857000 45>,
+					<3843000 40>, <3826000 35>, <3801000 30>, <3768000 25>,
+					<3735000 20>, <3688000 15>, <3621000 10>, <3553000 5>,
+					<3400000 0>;
+	};
+
+	gpio_keys_control: gpio-keys-control {
+		compatible = "gpio-keys";
+		pinctrl-0 = <&btn_pins_ctrl>;
+		pinctrl-names = "default";
+
+		button-a {
+			gpios = <&gpio3 RK_PD3 GPIO_ACTIVE_LOW>;
+			label = "EAST";
+			linux,code = <BTN_EAST>;
+		};
+
+		button-b {
+			gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_LOW>;
+			label = "SOUTH";
+			linux,code = <BTN_SOUTH>;
+		};
+
+		button-down {
+			gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>;
+			label = "DPAD-DOWN";
+			linux,code = <BTN_DPAD_DOWN>;
+		};
+
+		button-l1 {
+			gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_LOW>;
+			label = "TL";
+			linux,code = <BTN_TL>;
+		};
+
+		button-l2 {
+			gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_LOW>;
+			label = "TL2";
+			linux,code = <BTN_TL2>;
+		};
+
+		button-left {
+			gpios = <&gpio3 RK_PD6 GPIO_ACTIVE_LOW>;
+			label = "DPAD-LEFT";
+			linux,code = <BTN_DPAD_LEFT>;
+		};
+
+		button-right {
+			gpios = <&gpio3 RK_PD7 GPIO_ACTIVE_LOW>;
+			label = "DPAD-RIGHT";
+			linux,code = <BTN_DPAD_RIGHT>;
+		};
+
+		button-select {
+			gpios = <&gpio4 RK_PA4 GPIO_ACTIVE_LOW>;
+			label = "SELECT";
+			linux,code = <BTN_SELECT>;
+		};
+
+		button-start {
+			gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_LOW>;
+			label = "START";
+			linux,code = <BTN_START>;
+		};
+
+		button-thumbl {
+			gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_LOW>;
+			label = "THUMBL";
+			linux,code = <BTN_THUMBL>;
+		};
+
+		button-thumbr {
+			gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_LOW>;
+			label = "THUMBR";
+			linux,code = <BTN_THUMBR>;
+		};
+
+		button-r1 {
+			gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_LOW>;
+			label = "TR";
+			linux,code = <BTN_TR>;
+		};
+
+		button-r2 {
+			gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>;
+			label = "TR2";
+			linux,code = <BTN_TR2>;
+		};
+
+		button-up {
+			gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;
+			label = "DPAD-UP";
+			linux,code = <BTN_DPAD_UP>;
+		};
+
+		button-x {
+			gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_LOW>;
+			label = "NORTH";
+			linux,code = <BTN_NORTH>;
+		};
+
+		button-y {
+			gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>;
+			label = "WEST";
+			linux,code = <BTN_WEST>;
+		};
+	};
+
+	gpio_keys_vol: gpio-keys-vol {
+		compatible = "gpio-keys";
+		autorepeat;
+		pinctrl-0 = <&btn_pins_vol>;
+		pinctrl-names = "default";
+
+		button-voldown {
+			gpios = <&gpio4 RK_PA3 GPIO_ACTIVE_LOW>;
+			label = "VOLUMEDOWN";
+			linux,code = <KEY_VOLUMEDOWN>;
+		};
+
+		button-volup {
+			gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_LOW>;
+			label = "VOLUMEUP";
+			linux,code = <KEY_VOLUMEUP>;
+		};
+	};
+
+	gpio_leds: gpio-leds {
+		compatible = "gpio-leds";
+		pinctrl-names = "default";
+		pinctrl-0 = <&led_pins>;
+
+		red_led: led-0 {
+			color = <LED_COLOR_ID_RED>;
+			default-state = "off";
+			gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;
+			function = LED_FUNCTION_STATUS;
+		};
+
+		green_led: led-1 {
+			color = <LED_COLOR_ID_GREEN>;
+			default-state = "on";
+			gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>;
+			function = LED_FUNCTION_POWER;
+		};
+
+		amber_led: led-2 {
+			color = <LED_COLOR_ID_AMBER>;
+			gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
+			function = LED_FUNCTION_CHARGING;
+		};
+
+	};
+
+	hdmi-con {
+		compatible = "hdmi-connector";
+		ddc-i2c-bus = <&i2c5>;
+		type = "c";
+
+		port {
+			hdmi_con_in: endpoint {
+				remote-endpoint = <&hdmi_out_con>;
+			};
+		};
+	};
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		clocks = <&rk817 1>;
+		clock-names = "ext_clock";
+		pinctrl-0 = <&wifi_enable_h>;
+		pinctrl-names = "default";
+		post-power-on-delay-ms = <200>;
+		reset-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>;
+	};
+
+	/* Channels reversed for both headphones and speakers. */
+	sound {
+		compatible = "simple-audio-card";
+		pinctrl-0 = <&hp_det>;
+		pinctrl-names = "default";
+		simple-audio-card,name = "rk817_ext";
+		simple-audio-card,aux-devs = <&spk_amp>;
+		simple-audio-card,format = "i2s";
+		simple-audio-card,hp-det-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,widgets =
+			"Microphone", "Mic Jack",
+			"Headphone", "Headphones",
+			"Speaker", "Internal Speakers";
+		simple-audio-card,routing =
+			"MICL", "Mic Jack",
+			"Headphones", "HPOL",
+			"Headphones", "HPOR",
+			"Internal Speakers", "Speaker Amp OUTL",
+			"Internal Speakers", "Speaker Amp OUTR",
+			"Speaker Amp INL", "HPOL",
+			"Speaker Amp INR", "HPOR";
+		simple-audio-card,pin-switches = "Internal Speakers";
+
+		simple-audio-card,codec {
+			sound-dai = <&rk817>;
+		};
+
+		simple-audio-card,cpu {
+			sound-dai = <&i2s1_8ch>;
+		};
+	};
+
+	spk_amp: audio-amplifier {
+		compatible = "simple-audio-amplifier";
+		enable-gpios = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>;
+		pinctrl-0 = <&spk_amp_enable_h>;
+		pinctrl-names = "default";
+		sound-name-prefix = "Speaker Amp";
+	};
+
+	vcc5v0_host: regulator-vcc5v0-host {
+		compatible = "regulator-fixed";
+		enable-active-high;
+		gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>;
+		pinctrl-0 = <&vcc5v0_host_en>;
+		pinctrl-names = "default";
+		regulator-name = "vcc5v0_host";
+		vin-supply = <&dcdc_boost>;
+	};
+
+	vcc_lcd: regulator-vcc-lcd {
+		compatible = "regulator-fixed";
+		enable-active-high;
+		gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
+		pinctrl-0 = <&vcc_lcd_en>;
+		pinctrl-names = "default";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-name = "vcc_lcd";
+	};
+
+	vcc_sys: regulator-vcc-sys {
+		compatible = "regulator-fixed";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3800000>;
+		regulator-max-microvolt = <3800000>;
+		regulator-name = "vcc_sys";
+	};
+
+	vcc_wifi: regulator-vcc-wifi {
+		compatible = "regulator-fixed";
+		gpio = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
+		pinctrl-0 = <&vcc_wifi_h>;
+		pinctrl-names = "default";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-name = "vcc_wifi";
+	};
+};
+
+&combphy1 {
+	status = "okay";
+};
+
+&cru {
+	assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru PLL_GPLL>,
+			  <&pmucru PLL_PPLL>, <&cru PLL_VPLL>;
+	assigned-clock-rates = <32768>, <1200000000>,
+			       <200000000>, <126400000>;
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu1 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu2 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu3 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&dsi_dphy0 {
+	status = "okay";
+};
+
+&dsi0 {
+	status = "okay";
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	ports {
+		dsi0_in: port@0 {
+			reg = <0>;
+			dsi0_in_vp1: endpoint {
+				remote-endpoint = <&vp1_out_dsi0>;
+			};
+		};
+
+		dsi0_out: port@1 {
+			reg = <1>;
+			mipi_out_panel: endpoint {
+				remote-endpoint = <&mipi_in_panel>;
+			};
+		};
+	};
+
+	panel: panel@0 {
+		compatible = "powkiddy,x55-panel", "himax,hx8394";
+		reg = <0>;
+		backlight = <&backlight>;
+		iovcc-supply = <&vcc_lcd>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&lcd_rst>;
+		reset-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_LOW>;
+		rotation = <270>;
+		vcc-supply = <&vcc_lcd>;
+
+		port {
+			mipi_in_panel: endpoint {
+				remote-endpoint = <&mipi_out_panel>;
+			};
+		};
+	};
+};
+
+&gpu {
+	mali-supply = <&vdd_gpu>;
+	status = "okay";
+};
+
+&hdmi {
+	ddc-i2c-bus = <&i2c5>;
+	pinctrl-0 = <&hdmitxm0_cec>;
+	pinctrl-names = "default";
+	status = "okay";
+};
+
+&hdmi_in {
+	hdmi_in_vp0: endpoint {
+		remote-endpoint = <&vp0_out_hdmi>;
+	};
+};
+
+&hdmi_out {
+	hdmi_out_con: endpoint {
+		remote-endpoint = <&hdmi_con_in>;
+	};
+};
+
+&hdmi_sound {
+	status = "okay";
+};
+
+&i2c0 {
+	status = "okay";
+
+	rk817: pmic@20 {
+		compatible = "rockchip,rk817";
+		reg = <0x20>;
+		assigned-clocks = <&cru I2S1_MCLKOUT_TX>;
+		assigned-clock-parents = <&cru CLK_I2S1_8CH_TX>;
+		clock-names = "mclk";
+		clock-output-names = "rk808-clkout1", "rk808-clkout2";
+		clocks = <&cru I2S1_MCLKOUT_TX>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <RK_PA3 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s1m0_mclk>, <&pmic_int_l>;
+		wakeup-source;
+		#clock-cells = <1>;
+		#sound-dai-cells = <0>;
+
+		vcc1-supply = <&vcc_sys>;
+		vcc2-supply = <&vcc_sys>;
+		vcc3-supply = <&vcc_sys>;
+		vcc4-supply = <&vcc_sys>;
+		vcc5-supply = <&vcc_sys>;
+		vcc6-supply = <&vcc_sys>;
+		vcc7-supply = <&vcc_sys>;
+		vcc8-supply = <&vcc_sys>;
+		vcc9-supply = <&dcdc_boost>;
+
+		regulators {
+			vdd_logic: DCDC_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <500000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vdd_logic";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+					regulator-suspend-microvolt = <900000>;
+				};
+			};
+
+			vdd_gpu: DCDC_REG2 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <500000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vdd_gpu";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_ddr: DCDC_REG3 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vcc_ddr";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+				};
+			};
+
+			vcc_3v3: DCDC_REG4 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vcc_3v3";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcca1v8_pmu: LDO_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-name = "vcca1v8_pmu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vdda_0v9: LDO_REG2 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <900000>;
+				regulator-name = "vdda_0v9";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vdda0v9_pmu: LDO_REG3 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <900000>;
+				regulator-name = "vdda0v9_pmu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <900000>;
+				};
+			};
+
+			vccio_acodec: LDO_REG4 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vccio_acodec";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vccio_sd: LDO_REG5 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vccio_sd";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc3v3_pmu: LDO_REG6 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vcc3v3_pmu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcc_1v8: LDO_REG7 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-name = "vcc_1v8";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc1v8_dvp: LDO_REG8 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-name = "vcc1v8_dvp";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+				};
+			};
+
+			vcc2v8_dvp: LDO_REG9 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vcc2v8_dvp";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			dcdc_boost: BOOST {
+				regulator-min-microvolt = <4700000>;
+				regulator-max-microvolt = <5400000>;
+				regulator-name = "boost";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			otg_switch: OTG_SWITCH {
+				regulator-name = "otg_switch";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+		};
+
+		rk817_charger: charger {
+			monitored-battery = <&battery>;
+			rockchip,resistor-sense-micro-ohms = <10000>;
+			rockchip,sleep-enter-current-microamp = <150000>;
+			rockchip,sleep-filter-current-microamp = <100000>;
+		};
+
+	};
+
+	vdd_cpu: regulator@1c {
+		compatible = "tcs,tcs4525";
+		reg = <0x1c>;
+		fcs,suspend-voltage-selector = <1>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <712500>;
+		regulator-max-microvolt = <1390000>;
+		regulator-name = "vdd_cpu";
+		regulator-ramp-delay = <2300>;
+		vin-supply = <&vcc_sys>;
+		regulator-state-mem {
+			regulator-off-in-suspend;
+		};
+	};
+};
+
+&i2c5 {
+	pinctrl-0 = <&i2c5m1_xfer>;
+	pinctrl-names = "default";
+	status = "okay";
+};
+
+&i2s0_8ch {
+	status = "okay";
+};
+
+&i2s1_8ch {
+	pinctrl-0 = <&i2s1m0_sclktx>, <&i2s1m0_lrcktx>, <&i2s1m0_sdi0>,
+		    <&i2s1m0_sdo0>;
+	pinctrl-names = "default";
+	rockchip,trcm-sync-tx-only;
+	status = "okay";
+};
+
+&pinctrl {
+	audio-amplifier {
+		spk_amp_enable_h: spk-amp-enable-h {
+			rockchip,pins =
+				<4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	gpio-control {
+		btn_pins_ctrl: btn-pins-ctrl {
+			rockchip,pins =
+				<3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD6 RK_FUNC_GPIO &pcfg_pull_up>,
+				<3 RK_PD7 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+
+		btn_pins_vol: btn-pins-vol {
+			rockchip,pins =
+				<4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>,
+				<4 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	gpio-lcd {
+		lcd_rst: lcd-rst {
+			rockchip,pins =
+				<0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	gpio-leds {
+		led_pins: led-pins {
+			rockchip,pins =
+				<4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>,
+				<4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>,
+				<4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	hp-detect {
+		hp_det: hp-det {
+			rockchip,pins =
+				<4 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	pmic {
+		pmic_int_l: pmic-int-l {
+			rockchip,pins =
+				<0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins =
+				<0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	usb {
+		vcc5v0_host_en: vcc5v0-host-en {
+			rockchip,pins =
+				<4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+
+		vcc5v0_otg_en: vcc5v0-otg-en {
+			rockchip,pins =
+				<4 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	vcc-lcd {
+		vcc_lcd_en: vcc-lcd-en {
+			rockchip,pins =
+				<0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	vcc-wifi {
+		vcc_wifi_h: vcc-wifi-h {
+			rockchip,pins =
+				<0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
+
+&pmu_io_domains {
+	status = "okay";
+	pmuio1-supply = <&vcc3v3_pmu>;
+	pmuio2-supply = <&vcca1v8_pmu>;
+	vccio1-supply = <&vccio_acodec>;
+	vccio3-supply = <&vccio_sd>;
+	vccio4-supply = <&vcca1v8_pmu>;
+	vccio5-supply = <&vcc2v8_dvp>;
+	vccio6-supply = <&vcc1v8_dvp>;
+	vccio7-supply = <&vcc_3v3>;
+};
+
+&pwm4 {
+	status = "okay";
+};
+
+&saradc {
+	vref-supply = <&vcc_1v8>;
+	status = "okay";
+};
+
+&sdhci {
+	bus-width = <8>;
+	mmc-hs200-1_8v;
+	non-removable;
+	pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>,
+		    <&emmc_datastrobe>, <&emmc_rstnout>;
+	pinctrl-names = "default";
+	status = "okay";
+};
+
+&sdmmc0 {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	disable-wp;
+	pinctrl-0 = <&sdmmc0_bus4>, <&sdmmc0_clk>, <&sdmmc0_cmd>,
+		    <&sdmmc0_det>;
+	pinctrl-names = "default";
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vccio_sd>;
+	status = "okay";
+};
+
+&sdmmc1 {
+	bus-width = <4>;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	non-removable;
+	pinctrl-0 = <&sdmmc1_bus4>, <&sdmmc1_cmd>, <&sdmmc1_clk>;
+	pinctrl-names = "default";
+	vmmc-supply = <&vcc_wifi>;
+	status = "okay";
+};
+
+&sdmmc2 {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	disable-wp;
+	pinctrl-0 = <&sdmmc2m1_bus4>, <&sdmmc2m1_cmd>, <&sdmmc2m1_clk>,
+		    <&sdmmc2m1_det>;
+	pinctrl-names = "default";
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vcc2v8_dvp>;
+	status = "okay";
+};
+
+&tsadc {
+	rockchip,hw-tshut-mode = <1>;
+	rockchip,hw-tshut-polarity = <0>;
+	status = "okay";
+};
+
+&uart1 {
+	pinctrl-0 = <&uart1m0_xfer>, <&uart1m0_ctsn>, <&uart1m0_rtsn>;
+	pinctrl-names = "default";
+	uart-has-rtscts;
+	status = "okay";
+
+	bluetooth {
+		compatible = "realtek,rtl8821cs-bt", "realtek,rtl8723bs-bt";
+		device-wake-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		enable-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
+		host-wake-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
+	};
+};
+
+&uart2 {
+	status = "okay";
+};
+
+&usb_host0_xhci {
+	phys = <&usb2phy0_otg>;
+	phy-names = "usb2-phy";
+	status = "okay";
+};
+
+&usb_host1_xhci {
+	status = "okay";
+};
+
+&usb2phy0 {
+	status = "okay";
+};
+
+&usb2phy0_otg {
+	status = "okay";
+};
+
+&usb2phy0_host {
+	phy-supply = <&vcc5v0_host>;
+	status = "okay";
+};
+
+&vop {
+	assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>;
+	assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>;
+	status = "okay";
+};
+
+&vop_mmu {
+	status = "okay";
+};
+
+&vp0 {
+	vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 {
+		reg = <ROCKCHIP_VOP2_EP_HDMI0>;
+		remote-endpoint = <&hdmi_in_vp0>;
+	};
+};
+
+&vp1 {
+	vp1_out_dsi0: endpoint@ROCKCHIP_VOP2_EP_MIPI0 {
+		reg = <ROCKCHIP_VOP2_EP_MIPI0>;
+		remote-endpoint = <&dsi0_in_vp1>;
+	};
+};
diff --git a/arch/arm/mach-rockchip/rk3568/Kconfig b/arch/arm/mach-rockchip/rk3568/Kconfig
index baa51349f4..a97da8ae55 100644
--- a/arch/arm/mach-rockchip/rk3568/Kconfig
+++ b/arch/arm/mach-rockchip/rk3568/Kconfig
@@ -22,6 +22,11 @@ config TARGET_ODROID_M1_RK3568
 	help
 	  Hardkernel ODROID-M1 single board computer with a RK3568B2 SoC.
 
+config TARGET_POWKIDDY_X55_RK3566
+	bool "Powkiddy X55"
+	help
+	  Powkiddy X55 handheld gaming console with an RK3566 SoC.
+
 config TARGET_QUARTZ64_RK3566
 	bool "Pine64 Quartz64"
 	help
@@ -45,5 +50,6 @@ source "board/rockchip/evb_rk3568/Kconfig"
 source "board/anbernic/rgxx3_rk3566/Kconfig"
 source "board/hardkernel/odroid_m1/Kconfig"
 source "board/pine64/quartz64_rk3566/Kconfig"
+source "board/powkiddy/x55/Kconfig"
 
 endif
diff --git a/board/powkiddy/x55/Kconfig b/board/powkiddy/x55/Kconfig
new file mode 100644
index 0000000000..a7b3ed4d0d
--- /dev/null
+++ b/board/powkiddy/x55/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_POWKIDDY_X55_RK3566
+
+config SYS_BOARD
+	default "x55"
+
+config SYS_VENDOR
+	default "powkiddy"
+
+config SYS_CONFIG_NAME
+	default "powkiddy-x55-rk3566"
+
+config BOARD_SPECIFIC_OPTIONS
+	def_bool y
+
+endif
diff --git a/board/powkiddy/x55/MAINTAINERS b/board/powkiddy/x55/MAINTAINERS
new file mode 100644
index 0000000000..2c83cd6ee1
--- /dev/null
+++ b/board/powkiddy/x55/MAINTAINERS
@@ -0,0 +1,8 @@
+X55
+M:	Chris Morgan <macromorgan@hotmail.com>
+S:	Maintained
+F:	board/powkiddy/x55
+F:	include/configs/powkiddy-x55-rk3566.h
+F:	configs/powkiddy-x55-rk3566_defconfig
+F:	arch/arm/dts/rk3566-powkiddy-x55.dts
+F:	arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
diff --git a/board/powkiddy/x55/Makefile b/board/powkiddy/x55/Makefile
new file mode 100644
index 0000000000..55c8c16aa1
--- /dev/null
+++ b/board/powkiddy/x55/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier:     GPL-2.0+
+#
+# Copyright (c) 2023 Chris Morgan <macromorgan@hotmail.com>
+#
+
+obj-y += x55.o
diff --git a/board/powkiddy/x55/x55.c b/board/powkiddy/x55/x55.c
new file mode 100644
index 0000000000..5c8d7e2bcd
--- /dev/null
+++ b/board/powkiddy/x55/x55.c
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2023 Chris Morgan <macromorgan@hotmail.com>
+ */
+
+#include <asm/io.h>
+#include <command.h>
+#include <linux/iopoll.h>
+
+#define BOOT_BROM_DOWNLOAD	0xef08a53c
+
+#define GPIO4_BASE		0xfe770000
+#define GPIO_SWPORT_DR_L	0x0000
+#define GPIO_SWPORT_DDR_L	0x0008
+#define GPIO_B4			BIT(12)
+#define GPIO_B5			BIT(13)
+#define GPIO_B6			BIT(14)
+
+#define GPIO_WRITEMASK(bits)	((bits) << 16)
+
+#define SARADC_BASE		0xfe720000
+#define SARADC_DATA		0x0000
+#define SARADC_STAS		0x0004
+#define SARADC_ADC_STATUS	BIT(0)
+#define SARADC_CTRL		0x0008
+#define SARADC_INPUT_SRC_MSK	0x7
+#define SARADC_POWER_CTRL	BIT(3)
+
+/*
+ * Read the function "button" to determine if we need to boot straight
+ * into download mode. In this case a user would hold the left joystick
+ * all the way to the left when powering on the device. This function is
+ * needed because 1) on some devices it may not be possible to bypass the
+ * eMMC in the bootpath and 2) after A-TF loads the device will simply
+ * reboot instead of booting into download mode.
+ */
+void read_func_button(void)
+{
+	int ret;
+	u32 reg;
+
+	/* Turn off SARADC to reset it. */
+	writel(0, (SARADC_BASE + SARADC_CTRL));
+
+	/* Enable channel 0 and power on SARADC. */
+	writel(((0 & SARADC_INPUT_SRC_MSK) | SARADC_POWER_CTRL),
+	       (SARADC_BASE + SARADC_CTRL));
+
+	/*
+	 * Wait for data to be ready. Use timeout of 20000us from
+	 * rockchip_saradc driver.
+	 */
+	ret = readl_poll_timeout((SARADC_BASE + SARADC_STAS), reg,
+				 !(reg & SARADC_ADC_STATUS), 20000);
+	if (ret) {
+		printf("ADC Timeout");
+		return;
+	}
+
+	/* Read the data from the SARADC. */
+	reg = readl((SARADC_BASE + SARADC_DATA));
+
+	/* Turn the SARADC back off so it's ready to be used again. */
+	writel(0, (SARADC_BASE + SARADC_CTRL));
+
+	/*
+	 * If the value is less than 30 the button is being pressed.
+	 * Reset the device back into Rockchip download mode.
+	 */
+	if (reg <= 30) {
+		printf("download key pressed, entering download mode...");
+		writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG);
+		do_reset(NULL, 0, 0, NULL);
+	}
+};
+
+/*
+ * Start LED very early so user knows device is on. Set color
+ * to red.
+ */
+void spl_board_init(void)
+{
+	read_func_button();
+
+	/* Set GPIO4_B4, GPIO4_B5, and GPIO4_B6 to output. */
+	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | \
+	       (GPIO_B6 | GPIO_B5 | GPIO_B4),
+	       (GPIO4_BASE + GPIO_SWPORT_DDR_L));
+	/* Set GPIO4_B5 and GPIO4_B6 to 0 and GPIO4_B4 to 1. */
+	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B4,
+	       (GPIO4_BASE + GPIO_SWPORT_DR_L));
+}
+
+int rk_board_late_init(void)
+{
+	/* Turn off red LED and turn on orange LED. */
+	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B6,
+	       (GPIO4_BASE + GPIO_SWPORT_DR_L));
+
+	return 0;
+}
diff --git a/configs/powkiddy-x55-rk3566_defconfig b/configs/powkiddy-x55-rk3566_defconfig
new file mode 100644
index 0000000000..aa29df04d1
--- /dev/null
+++ b/configs/powkiddy-x55-rk3566_defconfig
@@ -0,0 +1,86 @@
+CONFIG_ARM=y
+CONFIG_SKIP_LOWLEVEL_INIT=y
+CONFIG_COUNTER_FREQUENCY=24000000
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_TEXT_BASE=0x00a00000
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_NR_DRAM_BANKS=2
+CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc00000
+CONFIG_DEFAULT_DEVICE_TREE="rk3566-powkiddy-x55"
+CONFIG_ROCKCHIP_RK3568=y
+CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y
+CONFIG_SPL_ROCKCHIP_COMMON_BOARD=y
+CONFIG_ROCKCHIP_RK8XX_DISABLE_BOOT_ON_POWERON=y
+CONFIG_SPL_MMC=y
+CONFIG_SPL_SERIAL=y
+CONFIG_SPL_STACK_R_ADDR=0x600000
+CONFIG_TARGET_POWKIDDY_X55_RK3566=y
+CONFIG_SPL_STACK=0x400000
+CONFIG_DEBUG_UART_BASE=0xFE660000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_SYS_LOAD_ADDR=0xc00800
+CONFIG_DEBUG_UART=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-powkiddy-x55.dtb"
+# CONFIG_CONSOLE_MUX is not set
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_SPL_MAX_SIZE=0x20000
+CONFIG_SPL_PAD_TO=0x7f8000
+CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
+CONFIG_SPL_BSS_START_ADDR=0x4000000
+CONFIG_SPL_BSS_MAX_SIZE=0x4000
+CONFIG_SPL_BOARD_INIT=y
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
+CONFIG_SPL_STACK_R=y
+CONFIG_SPL_ATF=y
+CONFIG_CMD_PWM=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_MMC=y
+# CONFIG_CMD_SETEXPR is not set
+# CONFIG_CMD_CLS is not set
+# CONFIG_SPL_DOS_PARTITION is not set
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+# CONFIG_NET is not set
+CONFIG_SPL_REGMAP=y
+CONFIG_SPL_SYSCON=y
+CONFIG_SPL_CLK=y
+CONFIG_ARM_SMCCC_FEATURES=y
+CONFIG_SCMI_FIRMWARE=y
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_MISC=y
+CONFIG_SUPPORT_EMMC_RPMB=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_ROCKCHIP=y
+CONFIG_DM_PMIC=y
+CONFIG_DM_PMIC_FAN53555=y
+CONFIG_PMIC_RK8XX=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_REGULATOR_RK8XX=y
+CONFIG_DM_REGULATOR_SCMI=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_SPL_RAM=y
+# CONFIG_RAM_ROCKCHIP_DEBUG is not set
+CONFIG_DM_RNG=y
+CONFIG_RNG_ROCKCHIP=y
+# CONFIG_RNG_SMCCC_TRNG is not set
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550_MEM32=y
+CONFIG_SYSRESET=y
+CONFIG_REGEX=y
+CONFIG_ERRNO_STR=y
+# CONFIG_EFI_LOADER is not set
diff --git a/doc/board/index.rst b/doc/board/index.rst
index 531e547e7e..dd4bce9981 100644
--- a/doc/board/index.rst
+++ b/doc/board/index.rst
@@ -36,6 +36,7 @@ Board-specific doc
    nxp/index
    openpiton/index
    phytec/index
+   powkiddy/index
    purism/index
    qualcomm/index
    renesas/index
diff --git a/doc/board/powkiddy/index.rst b/doc/board/powkiddy/index.rst
new file mode 100644
index 0000000000..b0115a73d4
--- /dev/null
+++ b/doc/board/powkiddy/index.rst
@@ -0,0 +1,9 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Powkiddy
+========
+
+.. toctree::
+   :maxdepth: 2
+
+   x55.rst
diff --git a/doc/board/powkiddy/x55.rst b/doc/board/powkiddy/x55.rst
new file mode 100644
index 0000000000..66d02944c9
--- /dev/null
+++ b/doc/board/powkiddy/x55.rst
@@ -0,0 +1,46 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+U-Boot for Powkiddy X55 Handheld Gaming Console
+===============================================
+
+This allows U-Boot to boot the Powkiddy X55 handheld gaming console.
+The X55 is very similar to the other existing Powkiddy RK3566 based
+devices, except that ADC channels 0-3 are used for the ADC joysticks.
+As a result the same auto detection functionality cannot be used on
+this device as the others.
+
+The indicator LED will change color based on the boot stage. Red means
+the device is powered on but has yet to start U-Boot, amber means the
+device has started U-Boot and is waiting to boot Linux, and when Linux
+has taken over the LED should change to green (or however it has been
+configured by the user).
+
+In the event the device needs to enter Rockchip download mode, a user
+can, starting with the power off, hold the left joystick all the way
+to the left and then power on the device. At this point the USB-C port
+marked DC/OTG should be set to peripheral mode and allow a user to
+manipulate the device with the rkdeveloptool tool.
+
+Building U-Boot
+---------------
+
+.. code-block:: bash
+
+    $ export CROSS_COMPILE=aarch64-linux-gnu-
+    $ export BL31=../rkbin/bin/rk35/rk3568_bl31_v1.34.elf
+    $ export ROCKCHIP_TPL=../rkbin/bin/rk35/rk3568_ddr_1056MHz_v1.13.bin
+    $ make powkiddy-x55-rk3566_defconfig
+    $ make
+
+This will build ``u-boot-rockchip.bin`` which can be written to an SD
+card.
+
+Image installation
+------------------
+
+Write the ``u-boot-rockchip.bin`` to an SD card or the internal eMMC
+offset 32kb from the start.
+
+.. code-block:: bash
+
+    $ dd if=u-boot-rockchip.bin of=/dev/mmcblk0 bs=512 seek=64
diff --git a/include/configs/powkiddy-x55-rk3566.h b/include/configs/powkiddy-x55-rk3566.h
new file mode 100644
index 0000000000..4b25c6a877
--- /dev/null
+++ b/include/configs/powkiddy-x55-rk3566.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __POWKIDDY_X55_RK3566_H
+#define __POWKIDDY_X55_RK3566_H
+
+#include <configs/rk3568_common.h>
+
+#define ROCKCHIP_DEVICE_SETTINGS \
+			"stdout=serial,vidconsole\0" \
+			"stderr=serial,vidconsole\0"
+
+#endif
-- 
2.34.1


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

* Re: [PATCH] board: rockchip: add Powkiddy X55
  2023-12-05 21:39 [PATCH] board: rockchip: add Powkiddy X55 Chris Morgan
@ 2023-12-05 22:48 ` Jonas Karlman
  2023-12-06 14:11   ` Chris Morgan
  0 siblings, 1 reply; 3+ messages in thread
From: Jonas Karlman @ 2023-12-05 22:48 UTC (permalink / raw)
  To: Chris Morgan, Chris Morgan; +Cc: kever.yang, philipp.tomsich, sjg, u-boot

Hi Chris,

On 2023-12-05 22:39, Chris Morgan wrote:
> From: Chris Morgan <macromorgan@hotmail.com>
> 
> The Powkiddy X55 is a Rockchip RK3566 based handheld gaming device.
> UART, ADC, eMMC, and SDMMC are tested to work.
> 
> Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
> ---
>  arch/arm/dts/Makefile                        |   1 +
>  arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi |  67 ++
>  arch/arm/dts/rk3566-powkiddy-x55.dts         | 926 +++++++++++++++++++
>  arch/arm/mach-rockchip/rk3568/Kconfig        |   6 +
>  board/powkiddy/x55/Kconfig                   |  15 +
>  board/powkiddy/x55/MAINTAINERS               |   8 +
>  board/powkiddy/x55/Makefile                  |   6 +
>  board/powkiddy/x55/x55.c                     | 101 ++
>  configs/powkiddy-x55-rk3566_defconfig        |  86 ++
>  doc/board/index.rst                          |   1 +
>  doc/board/powkiddy/index.rst                 |   9 +
>  doc/board/powkiddy/x55.rst                   |  46 +
>  include/configs/powkiddy-x55-rk3566.h        |  12 +
>  13 files changed, 1284 insertions(+)
>  create mode 100644 arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
>  create mode 100644 arch/arm/dts/rk3566-powkiddy-x55.dts
>  create mode 100644 board/powkiddy/x55/Kconfig
>  create mode 100644 board/powkiddy/x55/MAINTAINERS
>  create mode 100644 board/powkiddy/x55/Makefile
>  create mode 100644 board/powkiddy/x55/x55.c
>  create mode 100644 configs/powkiddy-x55-rk3566_defconfig
>  create mode 100644 doc/board/powkiddy/index.rst
>  create mode 100644 doc/board/powkiddy/x55.rst
>  create mode 100644 include/configs/powkiddy-x55-rk3566.h
> 
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 1be08c5fdc..9e38bab6eb 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -174,6 +174,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3568) += \
>  	rk3566-anbernic-rgxx3.dtb \
>  	rk3566-quartz64-a.dtb \
>  	rk3566-quartz64-b.dtb \
> +	rk3566-powkiddy-x55.dtb \
>  	rk3566-radxa-cm3-io.dtb \
>  	rk3566-soquartz-blade.dtb \
>  	rk3566-soquartz-cm4.dtb \
> diff --git a/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
> new file mode 100644
> index 0000000000..2e3998a65a
> --- /dev/null
> +++ b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
> @@ -0,0 +1,67 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +
> +#include "rk356x-u-boot.dtsi"
> +
> +/ {
> +	chosen {
> +		stdout-path = &uart2;
> +		u-boot,spl-boot-order = "same-as-spl", &sdmmc0, &sdhci;

This matches what is set in rk356x-u-boot.dtsi and can be droped.

> +	};
> +
> +	rng: rng@fe388000 {
> +		compatible = "rockchip,cryptov2-rng";
> +		reg = <0x0 0xfe388000 0x0 0x2000>;
> +		status = "okay";
> +	};
> +};
> +
> +&cru {
> +	assigned-clocks =
> +			<&pmucru CLK_RTC_32K>, <&pmucru PLL_PPLL>,
> +			<&pmucru PCLK_PMU>, <&cru PLL_CPLL>,
> +			<&cru PLL_GPLL>, <&cru PLL_VPLL>,
> +			<&cru ACLK_BUS>, <&cru PCLK_BUS>,
> +			<&cru ACLK_TOP_HIGH>, <&cru ACLK_TOP_LOW>,
> +			<&cru HCLK_TOP>, <&cru PCLK_TOP>,
> +			<&cru ACLK_PERIMID>, <&cru HCLK_PERIMID>,
> +			<&cru CPLL_500M>, <&cru CPLL_333M>,
> +			<&cru CPLL_250M>, <&cru CPLL_125M>,
> +			<&cru CPLL_100M>, <&cru CPLL_62P5M>,
> +			<&cru CPLL_50M>, <&cru CPLL_25M>;
> +		assigned-clock-rates =
> +			<32768>, <200000000>,
> +			<100000000>, <1000000000>,
> +			<1200000000>, <126400000>,
> +			<150000000>, <100000000>,
> +			<500000000>, <400000000>,
> +			<150000000>, <100000000>,
> +			<300000000>, <150000000>,
> +			<500000000>, <333333333>,
> +			<250000000>, <125000000>,
> +			<100000000>, <62500000>,
> +			<50000000>, <25000000>;
> +		assigned-clock-parents =
> +			<&pmucru CLK_RTC32K_FRAC>;
> +};
> +
> +&pmucru {
> +	assigned-clocks = <&pmucru SCLK_32K_IOE>;
> +	assigned-clock-parents = <&pmucru CLK_RTC_32K>;
> +};
> +
> +/*
> + * We don't need the clocks, but if they are present they may cause
> + * probing to fail so we remove them for U-Boot.
> + */
> +&rk817 {
> +	/delete-property/ assigned-clocks;
> +	/delete-property/ assigned-clock-parents;
> +	/delete-property/ clocks;
> +	/delete-property/ clock-names;
> +};

You should not need to remove these clock properties, the clk driver has
dummy support for the referenced I2S1_MCLKOUT_TX clock.

> +
> +&uart2 {
> +	clock-frequency = <24000000>;
> +	bootph-all;
> +	status = "okay";
> +};

[...]

> diff --git a/arch/arm/mach-rockchip/rk3568/Kconfig b/arch/arm/mach-rockchip/rk3568/Kconfig
> index baa51349f4..a97da8ae55 100644
> --- a/arch/arm/mach-rockchip/rk3568/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3568/Kconfig
> @@ -22,6 +22,11 @@ config TARGET_ODROID_M1_RK3568
>  	help
>  	  Hardkernel ODROID-M1 single board computer with a RK3568B2 SoC.
>  
> +config TARGET_POWKIDDY_X55_RK3566
> +	bool "Powkiddy X55"
> +	help
> +	  Powkiddy X55 handheld gaming console with an RK3566 SoC.
> +
>  config TARGET_QUARTZ64_RK3566
>  	bool "Pine64 Quartz64"
>  	help
> @@ -45,5 +50,6 @@ source "board/rockchip/evb_rk3568/Kconfig"
>  source "board/anbernic/rgxx3_rk3566/Kconfig"
>  source "board/hardkernel/odroid_m1/Kconfig"
>  source "board/pine64/quartz64_rk3566/Kconfig"
> +source "board/powkiddy/x55/Kconfig"
>  
>  endif
> diff --git a/board/powkiddy/x55/Kconfig b/board/powkiddy/x55/Kconfig
> new file mode 100644
> index 0000000000..a7b3ed4d0d
> --- /dev/null
> +++ b/board/powkiddy/x55/Kconfig
> @@ -0,0 +1,15 @@
> +if TARGET_POWKIDDY_X55_RK3566
> +
> +config SYS_BOARD
> +	default "x55"
> +
> +config SYS_VENDOR
> +	default "powkiddy"
> +
> +config SYS_CONFIG_NAME
> +	default "powkiddy-x55-rk3566"
> +
> +config BOARD_SPECIFIC_OPTIONS
> +	def_bool y
> +
> +endif
> diff --git a/board/powkiddy/x55/MAINTAINERS b/board/powkiddy/x55/MAINTAINERS
> new file mode 100644
> index 0000000000..2c83cd6ee1
> --- /dev/null
> +++ b/board/powkiddy/x55/MAINTAINERS
> @@ -0,0 +1,8 @@
> +X55
> +M:	Chris Morgan <macromorgan@hotmail.com>
> +S:	Maintained
> +F:	board/powkiddy/x55
> +F:	include/configs/powkiddy-x55-rk3566.h
> +F:	configs/powkiddy-x55-rk3566_defconfig
> +F:	arch/arm/dts/rk3566-powkiddy-x55.dts
> +F:	arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi

doc/board/powkiddy/x55.rst should probably also be listed.

> diff --git a/board/powkiddy/x55/Makefile b/board/powkiddy/x55/Makefile
> new file mode 100644
> index 0000000000..55c8c16aa1
> --- /dev/null
> +++ b/board/powkiddy/x55/Makefile
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +# Copyright (c) 2023 Chris Morgan <macromorgan@hotmail.com>
> +#
> +
> +obj-y += x55.o
> diff --git a/board/powkiddy/x55/x55.c b/board/powkiddy/x55/x55.c
> new file mode 100644
> index 0000000000..5c8d7e2bcd
> --- /dev/null
> +++ b/board/powkiddy/x55/x55.c
> @@ -0,0 +1,101 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2023 Chris Morgan <macromorgan@hotmail.com>
> + */
> +
> +#include <asm/io.h>
> +#include <command.h>
> +#include <linux/iopoll.h>
> +
> +#define BOOT_BROM_DOWNLOAD	0xef08a53c
> +
> +#define GPIO4_BASE		0xfe770000
> +#define GPIO_SWPORT_DR_L	0x0000
> +#define GPIO_SWPORT_DDR_L	0x0008
> +#define GPIO_B4			BIT(12)
> +#define GPIO_B5			BIT(13)
> +#define GPIO_B6			BIT(14)
> +
> +#define GPIO_WRITEMASK(bits)	((bits) << 16)
> +
> +#define SARADC_BASE		0xfe720000
> +#define SARADC_DATA		0x0000
> +#define SARADC_STAS		0x0004
> +#define SARADC_ADC_STATUS	BIT(0)
> +#define SARADC_CTRL		0x0008
> +#define SARADC_INPUT_SRC_MSK	0x7
> +#define SARADC_POWER_CTRL	BIT(3)
> +
> +/*
> + * Read the function "button" to determine if we need to boot straight
> + * into download mode. In this case a user would hold the left joystick
> + * all the way to the left when powering on the device. This function is
> + * needed because 1) on some devices it may not be possible to bypass the
> + * eMMC in the bootpath and 2) after A-TF loads the device will simply
> + * reboot instead of booting into download mode.
> + */
> +void read_func_button(void)
> +{
> +	int ret;
> +	u32 reg;
> +
> +	/* Turn off SARADC to reset it. */
> +	writel(0, (SARADC_BASE + SARADC_CTRL));
> +
> +	/* Enable channel 0 and power on SARADC. */
> +	writel(((0 & SARADC_INPUT_SRC_MSK) | SARADC_POWER_CTRL),
> +	       (SARADC_BASE + SARADC_CTRL));
> +
> +	/*
> +	 * Wait for data to be ready. Use timeout of 20000us from
> +	 * rockchip_saradc driver.
> +	 */
> +	ret = readl_poll_timeout((SARADC_BASE + SARADC_STAS), reg,
> +				 !(reg & SARADC_ADC_STATUS), 20000);
> +	if (ret) {
> +		printf("ADC Timeout");
> +		return;
> +	}
> +
> +	/* Read the data from the SARADC. */
> +	reg = readl((SARADC_BASE + SARADC_DATA));
> +
> +	/* Turn the SARADC back off so it's ready to be used again. */
> +	writel(0, (SARADC_BASE + SARADC_CTRL));
> +
> +	/*
> +	 * If the value is less than 30 the button is being pressed.
> +	 * Reset the device back into Rockchip download mode.
> +	 */
> +	if (reg <= 30) {
> +		printf("download key pressed, entering download mode...");
> +		writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG);
> +		do_reset(NULL, 0, 0, NULL);
> +	}
> +};

Would be nice if this could be made more generic for all rockchip boards,
and using a value from devicetree to configure the channel to use.

Possible something like rockchip,brom-download-adc-channel = <0> under
chosen node or something similar could work?

We should also have enough space in SPL to be able to use driver model
for interaction with adc.

> +
> +/*
> + * Start LED very early so user knows device is on. Set color
> + * to red.
> + */
> +void spl_board_init(void)
> +{
> +	read_func_button();
> +
> +	/* Set GPIO4_B4, GPIO4_B5, and GPIO4_B6 to output. */
> +	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | \
> +	       (GPIO_B6 | GPIO_B5 | GPIO_B4),
> +	       (GPIO4_BASE + GPIO_SWPORT_DDR_L));
> +	/* Set GPIO4_B5 and GPIO4_B6 to 0 and GPIO4_B4 to 1. */
> +	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B4,
> +	       (GPIO4_BASE + GPIO_SWPORT_DR_L));
> +}
> +
> +int rk_board_late_init(void)
> +{
> +	/* Turn off red LED and turn on orange LED. */
> +	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B6,
> +	       (GPIO4_BASE + GPIO_SWPORT_DR_L));
> +
> +	return 0;
> +}
> diff --git a/configs/powkiddy-x55-rk3566_defconfig b/configs/powkiddy-x55-rk3566_defconfig
> new file mode 100644
> index 0000000000..aa29df04d1
> --- /dev/null
> +++ b/configs/powkiddy-x55-rk3566_defconfig
> @@ -0,0 +1,86 @@
> +CONFIG_ARM=y
> +CONFIG_SKIP_LOWLEVEL_INIT=y
> +CONFIG_COUNTER_FREQUENCY=24000000
> +CONFIG_ARCH_ROCKCHIP=y
> +CONFIG_TEXT_BASE=0x00a00000
> +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> +CONFIG_SPL_LIBGENERIC_SUPPORT=y
> +CONFIG_NR_DRAM_BANKS=2
> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc00000
> +CONFIG_DEFAULT_DEVICE_TREE="rk3566-powkiddy-x55"
> +CONFIG_ROCKCHIP_RK3568=y
> +CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y

SPL load U-Boot proper from FIT image, so this should not be needed.

> +CONFIG_SPL_ROCKCHIP_COMMON_BOARD=y
> +CONFIG_ROCKCHIP_RK8XX_DISABLE_BOOT_ON_POWERON=y
> +CONFIG_SPL_MMC=y
> +CONFIG_SPL_SERIAL=y
> +CONFIG_SPL_STACK_R_ADDR=0x600000
> +CONFIG_TARGET_POWKIDDY_X55_RK3566=y
> +CONFIG_SPL_STACK=0x400000
> +CONFIG_DEBUG_UART_BASE=0xFE660000
> +CONFIG_DEBUG_UART_CLOCK=24000000
> +CONFIG_SYS_LOAD_ADDR=0xc00800
> +CONFIG_DEBUG_UART=y
> +CONFIG_FIT=y
> +CONFIG_FIT_VERBOSE=y

Recommend adding following for an added integrity check of loaded FIT
images.

CONFIG_SPL_FIT_SIGNATURE=y
CONFIG_LEGACY_IMAGE_FORMAT=y

Try following patch to speed up boot when signature check is enabled.
https://patchwork.ozlabs.org/patch/1802303/

> +CONFIG_SPL_LOAD_FIT=y
> +CONFIG_OF_STDOUT_VIA_ALIAS=y
> +CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-powkiddy-x55.dtb"
> +# CONFIG_CONSOLE_MUX is not set
> +# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_DISPLAY_BOARDINFO_LATE=y
> +CONFIG_SPL_MAX_SIZE=0x20000

Should be 0x40000 not 0x20000

> +CONFIG_SPL_PAD_TO=0x7f8000
> +CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
> +CONFIG_SPL_BSS_START_ADDR=0x4000000
> +CONFIG_SPL_BSS_MAX_SIZE=0x4000
> +CONFIG_SPL_BOARD_INIT=y
> +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
> +# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> +CONFIG_SPL_STACK_R=y
> +CONFIG_SPL_ATF=y
> +CONFIG_CMD_PWM=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_MMC=y
> +# CONFIG_CMD_SETEXPR is not set
> +# CONFIG_CMD_CLS is not set
> +# CONFIG_SPL_DOS_PARTITION is not set
> +CONFIG_SPL_OF_CONTROL=y
> +CONFIG_OF_LIVE=y

Recommend adding following to ensure pinctrl for sdmmc/sdhci is
configured at SPL stage.

CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
CONFIG_SPL_DM_SEQ_ALIAS=y
CONFIG_SPL_PINCTRL=y

> +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
> +# CONFIG_NET is not set
> +CONFIG_SPL_REGMAP=y
> +CONFIG_SPL_SYSCON=y
> +CONFIG_SPL_CLK=y
> +CONFIG_ARM_SMCCC_FEATURES=y
> +CONFIG_SCMI_FIRMWARE=y
> +CONFIG_ROCKCHIP_GPIO=y
> +CONFIG_SYS_I2C_ROCKCHIP=y
> +CONFIG_MISC=y
> +CONFIG_SUPPORT_EMMC_RPMB=y
> +CONFIG_MMC_DW=y
> +CONFIG_MMC_DW_ROCKCHIP=y
> +CONFIG_MMC_SDHCI=y
> +CONFIG_MMC_SDHCI_SDMA=y
> +CONFIG_MMC_SDHCI_ROCKCHIP=y
> +CONFIG_DM_PMIC=y
> +CONFIG_DM_PMIC_FAN53555=y

I do not see fcs,fan53555 compatible in the device tree, this can be
droped.

> +CONFIG_PMIC_RK8XX=y
> +CONFIG_REGULATOR_PWM=y
> +CONFIG_DM_REGULATOR_GPIO=y

I do not see any pwm-regulator or regulator-gpio compatible in the
device tree, these two can be dropped.

> +CONFIG_REGULATOR_RK8XX=y
> +CONFIG_DM_REGULATOR_SCMI=y

SCMI clock protocol is only used to control cpu and gpu clock on rk356x,
this can be droped.

> +CONFIG_PWM_ROCKCHIP=y
> +CONFIG_SPL_RAM=y
> +# CONFIG_RAM_ROCKCHIP_DEBUG is not set
> +CONFIG_DM_RNG=y
> +CONFIG_RNG_ROCKCHIP=y
> +# CONFIG_RNG_SMCCC_TRNG is not set
> +CONFIG_BAUDRATE=1500000
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_SYS_NS16550_MEM32=y
> +CONFIG_SYSRESET=y
> +CONFIG_REGEX=y
> +CONFIG_ERRNO_STR=y
> +# CONFIG_EFI_LOADER is not set
> diff --git a/doc/board/index.rst b/doc/board/index.rst
> index 531e547e7e..dd4bce9981 100644
> --- a/doc/board/index.rst
> +++ b/doc/board/index.rst
> @@ -36,6 +36,7 @@ Board-specific doc
>     nxp/index
>     openpiton/index
>     phytec/index
> +   powkiddy/index
>     purism/index
>     qualcomm/index
>     renesas/index
> diff --git a/doc/board/powkiddy/index.rst b/doc/board/powkiddy/index.rst
> new file mode 100644
> index 0000000000..b0115a73d4
> --- /dev/null
> +++ b/doc/board/powkiddy/index.rst
> @@ -0,0 +1,9 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +
> +Powkiddy
> +========
> +
> +.. toctree::
> +   :maxdepth: 2
> +
> +   x55.rst
> diff --git a/doc/board/powkiddy/x55.rst b/doc/board/powkiddy/x55.rst
> new file mode 100644
> index 0000000000..66d02944c9
> --- /dev/null
> +++ b/doc/board/powkiddy/x55.rst
> @@ -0,0 +1,46 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +
> +U-Boot for Powkiddy X55 Handheld Gaming Console
> +===============================================
> +
> +This allows U-Boot to boot the Powkiddy X55 handheld gaming console.
> +The X55 is very similar to the other existing Powkiddy RK3566 based
> +devices, except that ADC channels 0-3 are used for the ADC joysticks.
> +As a result the same auto detection functionality cannot be used on
> +this device as the others.
> +
> +The indicator LED will change color based on the boot stage. Red means
> +the device is powered on but has yet to start U-Boot, amber means the
> +device has started U-Boot and is waiting to boot Linux, and when Linux
> +has taken over the LED should change to green (or however it has been
> +configured by the user).
> +
> +In the event the device needs to enter Rockchip download mode, a user
> +can, starting with the power off, hold the left joystick all the way
> +to the left and then power on the device. At this point the USB-C port
> +marked DC/OTG should be set to peripheral mode and allow a user to
> +manipulate the device with the rkdeveloptool tool.
> +
> +Building U-Boot
> +---------------
> +
> +.. code-block:: bash
> +
> +    $ export CROSS_COMPILE=aarch64-linux-gnu-
> +    $ export BL31=../rkbin/bin/rk35/rk3568_bl31_v1.34.elf
> +    $ export ROCKCHIP_TPL=../rkbin/bin/rk35/rk3568_ddr_1056MHz_v1.13.bin

I know that the rk3566/rk3568 ddr blobs are identical, but suggest you
reference correct ddr blob here.

> +    $ make powkiddy-x55-rk3566_defconfig
> +    $ make
> +
> +This will build ``u-boot-rockchip.bin`` which can be written to an SD
> +card.
> +
> +Image installation
> +------------------
> +
> +Write the ``u-boot-rockchip.bin`` to an SD card or the internal eMMC
> +offset 32kb from the start.
> +
> +.. code-block:: bash
> +
> +    $ dd if=u-boot-rockchip.bin of=/dev/mmcblk0 bs=512 seek=64

Why just not reference the common Rockchip build and flashing
instructions at doc/board/rockchip/rockchip.rst ? Are they missing
something and could/should be updated?

Also missing addition of this board under the rk3566 heading in that doc.

Regards,
Jonas

> diff --git a/include/configs/powkiddy-x55-rk3566.h b/include/configs/powkiddy-x55-rk3566.h
> new file mode 100644
> index 0000000000..4b25c6a877
> --- /dev/null
> +++ b/include/configs/powkiddy-x55-rk3566.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +
> +#ifndef __POWKIDDY_X55_RK3566_H
> +#define __POWKIDDY_X55_RK3566_H
> +
> +#include <configs/rk3568_common.h>
> +
> +#define ROCKCHIP_DEVICE_SETTINGS \
> +			"stdout=serial,vidconsole\0" \
> +			"stderr=serial,vidconsole\0"
> +
> +#endif


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

* Re: [PATCH] board: rockchip: add Powkiddy X55
  2023-12-05 22:48 ` Jonas Karlman
@ 2023-12-06 14:11   ` Chris Morgan
  0 siblings, 0 replies; 3+ messages in thread
From: Chris Morgan @ 2023-12-06 14:11 UTC (permalink / raw)
  To: Jonas Karlman; +Cc: Chris Morgan, kever.yang, philipp.tomsich, sjg, u-boot

On Tue, Dec 05, 2023 at 11:48:26PM +0100, Jonas Karlman wrote:
> Hi Chris,
> 
> On 2023-12-05 22:39, Chris Morgan wrote:
> > From: Chris Morgan <macromorgan@hotmail.com>
> > 
> > The Powkiddy X55 is a Rockchip RK3566 based handheld gaming device.
> > UART, ADC, eMMC, and SDMMC are tested to work.
> > 
> > Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
> > ---
> >  arch/arm/dts/Makefile                        |   1 +
> >  arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi |  67 ++
> >  arch/arm/dts/rk3566-powkiddy-x55.dts         | 926 +++++++++++++++++++
> >  arch/arm/mach-rockchip/rk3568/Kconfig        |   6 +
> >  board/powkiddy/x55/Kconfig                   |  15 +
> >  board/powkiddy/x55/MAINTAINERS               |   8 +
> >  board/powkiddy/x55/Makefile                  |   6 +
> >  board/powkiddy/x55/x55.c                     | 101 ++
> >  configs/powkiddy-x55-rk3566_defconfig        |  86 ++
> >  doc/board/index.rst                          |   1 +
> >  doc/board/powkiddy/index.rst                 |   9 +
> >  doc/board/powkiddy/x55.rst                   |  46 +
> >  include/configs/powkiddy-x55-rk3566.h        |  12 +
> >  13 files changed, 1284 insertions(+)
> >  create mode 100644 arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
> >  create mode 100644 arch/arm/dts/rk3566-powkiddy-x55.dts
> >  create mode 100644 board/powkiddy/x55/Kconfig
> >  create mode 100644 board/powkiddy/x55/MAINTAINERS
> >  create mode 100644 board/powkiddy/x55/Makefile
> >  create mode 100644 board/powkiddy/x55/x55.c
> >  create mode 100644 configs/powkiddy-x55-rk3566_defconfig
> >  create mode 100644 doc/board/powkiddy/index.rst
> >  create mode 100644 doc/board/powkiddy/x55.rst
> >  create mode 100644 include/configs/powkiddy-x55-rk3566.h
> > 
> > diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> > index 1be08c5fdc..9e38bab6eb 100644
> > --- a/arch/arm/dts/Makefile
> > +++ b/arch/arm/dts/Makefile
> > @@ -174,6 +174,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3568) += \
> >  	rk3566-anbernic-rgxx3.dtb \
> >  	rk3566-quartz64-a.dtb \
> >  	rk3566-quartz64-b.dtb \
> > +	rk3566-powkiddy-x55.dtb \
> >  	rk3566-radxa-cm3-io.dtb \
> >  	rk3566-soquartz-blade.dtb \
> >  	rk3566-soquartz-cm4.dtb \
> > diff --git a/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
> > new file mode 100644
> > index 0000000000..2e3998a65a
> > --- /dev/null
> > +++ b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
> > @@ -0,0 +1,67 @@
> > +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> > +
> > +#include "rk356x-u-boot.dtsi"
> > +
> > +/ {
> > +	chosen {
> > +		stdout-path = &uart2;
> > +		u-boot,spl-boot-order = "same-as-spl", &sdmmc0, &sdhci;
> 
> This matches what is set in rk356x-u-boot.dtsi and can be droped.

Will do, thank you.

> 
> > +	};
> > +
> > +	rng: rng@fe388000 {
> > +		compatible = "rockchip,cryptov2-rng";
> > +		reg = <0x0 0xfe388000 0x0 0x2000>;
> > +		status = "okay";
> > +	};
> > +};
> > +
> > +&cru {
> > +	assigned-clocks =
> > +			<&pmucru CLK_RTC_32K>, <&pmucru PLL_PPLL>,
> > +			<&pmucru PCLK_PMU>, <&cru PLL_CPLL>,
> > +			<&cru PLL_GPLL>, <&cru PLL_VPLL>,
> > +			<&cru ACLK_BUS>, <&cru PCLK_BUS>,
> > +			<&cru ACLK_TOP_HIGH>, <&cru ACLK_TOP_LOW>,
> > +			<&cru HCLK_TOP>, <&cru PCLK_TOP>,
> > +			<&cru ACLK_PERIMID>, <&cru HCLK_PERIMID>,
> > +			<&cru CPLL_500M>, <&cru CPLL_333M>,
> > +			<&cru CPLL_250M>, <&cru CPLL_125M>,
> > +			<&cru CPLL_100M>, <&cru CPLL_62P5M>,
> > +			<&cru CPLL_50M>, <&cru CPLL_25M>;
> > +		assigned-clock-rates =
> > +			<32768>, <200000000>,
> > +			<100000000>, <1000000000>,
> > +			<1200000000>, <126400000>,
> > +			<150000000>, <100000000>,
> > +			<500000000>, <400000000>,
> > +			<150000000>, <100000000>,
> > +			<300000000>, <150000000>,
> > +			<500000000>, <333333333>,
> > +			<250000000>, <125000000>,
> > +			<100000000>, <62500000>,
> > +			<50000000>, <25000000>;
> > +		assigned-clock-parents =
> > +			<&pmucru CLK_RTC32K_FRAC>;
> > +};
> > +
> > +&pmucru {
> > +	assigned-clocks = <&pmucru SCLK_32K_IOE>;
> > +	assigned-clock-parents = <&pmucru CLK_RTC_32K>;
> > +};
> > +
> > +/*
> > + * We don't need the clocks, but if they are present they may cause
> > + * probing to fail so we remove them for U-Boot.
> > + */
> > +&rk817 {
> > +	/delete-property/ assigned-clocks;
> > +	/delete-property/ assigned-clock-parents;
> > +	/delete-property/ clocks;
> > +	/delete-property/ clock-names;
> > +};
> 
> You should not need to remove these clock properties, the clk driver has
> dummy support for the referenced I2S1_MCLKOUT_TX clock.
> 

I'll test without them then and confirm, thank you. Previously this was
necessary.

> > +
> > +&uart2 {
> > +	clock-frequency = <24000000>;
> > +	bootph-all;
> > +	status = "okay";
> > +};
> 
> [...]
> 
> > diff --git a/arch/arm/mach-rockchip/rk3568/Kconfig b/arch/arm/mach-rockchip/rk3568/Kconfig
> > index baa51349f4..a97da8ae55 100644
> > --- a/arch/arm/mach-rockchip/rk3568/Kconfig
> > +++ b/arch/arm/mach-rockchip/rk3568/Kconfig
> > @@ -22,6 +22,11 @@ config TARGET_ODROID_M1_RK3568
> >  	help
> >  	  Hardkernel ODROID-M1 single board computer with a RK3568B2 SoC.
> >  
> > +config TARGET_POWKIDDY_X55_RK3566
> > +	bool "Powkiddy X55"
> > +	help
> > +	  Powkiddy X55 handheld gaming console with an RK3566 SoC.
> > +
> >  config TARGET_QUARTZ64_RK3566
> >  	bool "Pine64 Quartz64"
> >  	help
> > @@ -45,5 +50,6 @@ source "board/rockchip/evb_rk3568/Kconfig"
> >  source "board/anbernic/rgxx3_rk3566/Kconfig"
> >  source "board/hardkernel/odroid_m1/Kconfig"
> >  source "board/pine64/quartz64_rk3566/Kconfig"
> > +source "board/powkiddy/x55/Kconfig"
> >  
> >  endif
> > diff --git a/board/powkiddy/x55/Kconfig b/board/powkiddy/x55/Kconfig
> > new file mode 100644
> > index 0000000000..a7b3ed4d0d
> > --- /dev/null
> > +++ b/board/powkiddy/x55/Kconfig
> > @@ -0,0 +1,15 @@
> > +if TARGET_POWKIDDY_X55_RK3566
> > +
> > +config SYS_BOARD
> > +	default "x55"
> > +
> > +config SYS_VENDOR
> > +	default "powkiddy"
> > +
> > +config SYS_CONFIG_NAME
> > +	default "powkiddy-x55-rk3566"
> > +
> > +config BOARD_SPECIFIC_OPTIONS
> > +	def_bool y
> > +
> > +endif
> > diff --git a/board/powkiddy/x55/MAINTAINERS b/board/powkiddy/x55/MAINTAINERS
> > new file mode 100644
> > index 0000000000..2c83cd6ee1
> > --- /dev/null
> > +++ b/board/powkiddy/x55/MAINTAINERS
> > @@ -0,0 +1,8 @@
> > +X55
> > +M:	Chris Morgan <macromorgan@hotmail.com>
> > +S:	Maintained
> > +F:	board/powkiddy/x55
> > +F:	include/configs/powkiddy-x55-rk3566.h
> > +F:	configs/powkiddy-x55-rk3566_defconfig
> > +F:	arch/arm/dts/rk3566-powkiddy-x55.dts
> > +F:	arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi
> 
> doc/board/powkiddy/x55.rst should probably also be listed.

Acknowledged, thank you.

> 
> > diff --git a/board/powkiddy/x55/Makefile b/board/powkiddy/x55/Makefile
> > new file mode 100644
> > index 0000000000..55c8c16aa1
> > --- /dev/null
> > +++ b/board/powkiddy/x55/Makefile
> > @@ -0,0 +1,6 @@
> > +# SPDX-License-Identifier:     GPL-2.0+
> > +#
> > +# Copyright (c) 2023 Chris Morgan <macromorgan@hotmail.com>
> > +#
> > +
> > +obj-y += x55.o
> > diff --git a/board/powkiddy/x55/x55.c b/board/powkiddy/x55/x55.c
> > new file mode 100644
> > index 0000000000..5c8d7e2bcd
> > --- /dev/null
> > +++ b/board/powkiddy/x55/x55.c
> > @@ -0,0 +1,101 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Copyright (c) 2023 Chris Morgan <macromorgan@hotmail.com>
> > + */
> > +
> > +#include <asm/io.h>
> > +#include <command.h>
> > +#include <linux/iopoll.h>
> > +
> > +#define BOOT_BROM_DOWNLOAD	0xef08a53c
> > +
> > +#define GPIO4_BASE		0xfe770000
> > +#define GPIO_SWPORT_DR_L	0x0000
> > +#define GPIO_SWPORT_DDR_L	0x0008
> > +#define GPIO_B4			BIT(12)
> > +#define GPIO_B5			BIT(13)
> > +#define GPIO_B6			BIT(14)
> > +
> > +#define GPIO_WRITEMASK(bits)	((bits) << 16)
> > +
> > +#define SARADC_BASE		0xfe720000
> > +#define SARADC_DATA		0x0000
> > +#define SARADC_STAS		0x0004
> > +#define SARADC_ADC_STATUS	BIT(0)
> > +#define SARADC_CTRL		0x0008
> > +#define SARADC_INPUT_SRC_MSK	0x7
> > +#define SARADC_POWER_CTRL	BIT(3)
> > +
> > +/*
> > + * Read the function "button" to determine if we need to boot straight
> > + * into download mode. In this case a user would hold the left joystick
> > + * all the way to the left when powering on the device. This function is
> > + * needed because 1) on some devices it may not be possible to bypass the
> > + * eMMC in the bootpath and 2) after A-TF loads the device will simply
> > + * reboot instead of booting into download mode.
> > + */
> > +void read_func_button(void)
> > +{
> > +	int ret;
> > +	u32 reg;
> > +
> > +	/* Turn off SARADC to reset it. */
> > +	writel(0, (SARADC_BASE + SARADC_CTRL));
> > +
> > +	/* Enable channel 0 and power on SARADC. */
> > +	writel(((0 & SARADC_INPUT_SRC_MSK) | SARADC_POWER_CTRL),
> > +	       (SARADC_BASE + SARADC_CTRL));
> > +
> > +	/*
> > +	 * Wait for data to be ready. Use timeout of 20000us from
> > +	 * rockchip_saradc driver.
> > +	 */
> > +	ret = readl_poll_timeout((SARADC_BASE + SARADC_STAS), reg,
> > +				 !(reg & SARADC_ADC_STATUS), 20000);
> > +	if (ret) {
> > +		printf("ADC Timeout");
> > +		return;
> > +	}
> > +
> > +	/* Read the data from the SARADC. */
> > +	reg = readl((SARADC_BASE + SARADC_DATA));
> > +
> > +	/* Turn the SARADC back off so it's ready to be used again. */
> > +	writel(0, (SARADC_BASE + SARADC_CTRL));
> > +
> > +	/*
> > +	 * If the value is less than 30 the button is being pressed.
> > +	 * Reset the device back into Rockchip download mode.
> > +	 */
> > +	if (reg <= 30) {
> > +		printf("download key pressed, entering download mode...");
> > +		writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG);
> > +		do_reset(NULL, 0, 0, NULL);
> > +	}
> > +};
> 
> Would be nice if this could be made more generic for all rockchip boards,
> and using a value from devicetree to configure the channel to use.
> 
> Possible something like rockchip,brom-download-adc-channel = <0> under
> chosen node or something similar could work?
> 
> We should also have enough space in SPL to be able to use driver model
> for interaction with adc.
> 

Will that work prior to A-TF in the SPL stage? One thing I noticed is
that if I call pre A-TF the USB download mode worked as expected, but
post A-TF the device would just reboot (and not into the download
mode). I'll happily make this code generic if I can. Would a suitable
compromise (for now) be to move this into the board specific file for
the rk3568? That would also allow me to remove this (pretty much
identical) code from the rgxx3_rk3566.c board file too. I have some
other code I'm going to submit soon to move the rng_seed code to the
main board.c in mach-rockchip so all boards can benefit. For now the
one requirement I have for this routine is that it runs as early as
possible, since for some devices (but not necessarily this one) it's
the last line of defense against a possible brick.

> > +
> > +/*
> > + * Start LED very early so user knows device is on. Set color
> > + * to red.
> > + */
> > +void spl_board_init(void)
> > +{
> > +	read_func_button();
> > +
> > +	/* Set GPIO4_B4, GPIO4_B5, and GPIO4_B6 to output. */
> > +	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | \
> > +	       (GPIO_B6 | GPIO_B5 | GPIO_B4),
> > +	       (GPIO4_BASE + GPIO_SWPORT_DDR_L));
> > +	/* Set GPIO4_B5 and GPIO4_B6 to 0 and GPIO4_B4 to 1. */
> > +	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B4,
> > +	       (GPIO4_BASE + GPIO_SWPORT_DR_L));
> > +}
> > +
> > +int rk_board_late_init(void)
> > +{
> > +	/* Turn off red LED and turn on orange LED. */
> > +	writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B6,
> > +	       (GPIO4_BASE + GPIO_SWPORT_DR_L));
> > +
> > +	return 0;
> > +}
> > diff --git a/configs/powkiddy-x55-rk3566_defconfig b/configs/powkiddy-x55-rk3566_defconfig
> > new file mode 100644
> > index 0000000000..aa29df04d1
> > --- /dev/null
> > +++ b/configs/powkiddy-x55-rk3566_defconfig
> > @@ -0,0 +1,86 @@
> > +CONFIG_ARM=y
> > +CONFIG_SKIP_LOWLEVEL_INIT=y
> > +CONFIG_COUNTER_FREQUENCY=24000000
> > +CONFIG_ARCH_ROCKCHIP=y
> > +CONFIG_TEXT_BASE=0x00a00000
> > +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> > +CONFIG_SPL_LIBGENERIC_SUPPORT=y
> > +CONFIG_NR_DRAM_BANKS=2
> > +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc00000
> > +CONFIG_DEFAULT_DEVICE_TREE="rk3566-powkiddy-x55"
> > +CONFIG_ROCKCHIP_RK3568=y
> > +CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y
> 
> SPL load U-Boot proper from FIT image, so this should not be needed.
> 

I'll test this and confirm, but thank you.

> > +CONFIG_SPL_ROCKCHIP_COMMON_BOARD=y
> > +CONFIG_ROCKCHIP_RK8XX_DISABLE_BOOT_ON_POWERON=y
> > +CONFIG_SPL_MMC=y
> > +CONFIG_SPL_SERIAL=y
> > +CONFIG_SPL_STACK_R_ADDR=0x600000
> > +CONFIG_TARGET_POWKIDDY_X55_RK3566=y
> > +CONFIG_SPL_STACK=0x400000
> > +CONFIG_DEBUG_UART_BASE=0xFE660000
> > +CONFIG_DEBUG_UART_CLOCK=24000000
> > +CONFIG_SYS_LOAD_ADDR=0xc00800
> > +CONFIG_DEBUG_UART=y
> > +CONFIG_FIT=y
> > +CONFIG_FIT_VERBOSE=y
> 
> Recommend adding following for an added integrity check of loaded FIT
> images.

Will do.

> 
> CONFIG_SPL_FIT_SIGNATURE=y
> CONFIG_LEGACY_IMAGE_FORMAT=y
> 
> Try following patch to speed up boot when signature check is enabled.
> https://patchwork.ozlabs.org/patch/1802303/
> 
> > +CONFIG_SPL_LOAD_FIT=y
> > +CONFIG_OF_STDOUT_VIA_ALIAS=y
> > +CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-powkiddy-x55.dtb"
> > +# CONFIG_CONSOLE_MUX is not set
> > +# CONFIG_DISPLAY_CPUINFO is not set
> > +CONFIG_DISPLAY_BOARDINFO_LATE=y
> > +CONFIG_SPL_MAX_SIZE=0x20000
> 
> Should be 0x40000 not 0x20000
> 

Acknowledged.

> > +CONFIG_SPL_PAD_TO=0x7f8000
> > +CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
> > +CONFIG_SPL_BSS_START_ADDR=0x4000000
> > +CONFIG_SPL_BSS_MAX_SIZE=0x4000
> > +CONFIG_SPL_BOARD_INIT=y
> > +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
> > +# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> > +CONFIG_SPL_STACK_R=y
> > +CONFIG_SPL_ATF=y
> > +CONFIG_CMD_PWM=y
> > +CONFIG_CMD_GPT=y
> > +CONFIG_CMD_MMC=y
> > +# CONFIG_CMD_SETEXPR is not set
> > +# CONFIG_CMD_CLS is not set
> > +# CONFIG_SPL_DOS_PARTITION is not set
> > +CONFIG_SPL_OF_CONTROL=y
> > +CONFIG_OF_LIVE=y
> 
> Recommend adding following to ensure pinctrl for sdmmc/sdhci is
> configured at SPL stage.
> 
> CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
> CONFIG_SPL_DM_SEQ_ALIAS=y
> CONFIG_SPL_PINCTRL=y
> 

Thanks, I'll test it out.

> > +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
> > +# CONFIG_NET is not set
> > +CONFIG_SPL_REGMAP=y
> > +CONFIG_SPL_SYSCON=y
> > +CONFIG_SPL_CLK=y
> > +CONFIG_ARM_SMCCC_FEATURES=y
> > +CONFIG_SCMI_FIRMWARE=y
> > +CONFIG_ROCKCHIP_GPIO=y
> > +CONFIG_SYS_I2C_ROCKCHIP=y
> > +CONFIG_MISC=y
> > +CONFIG_SUPPORT_EMMC_RPMB=y
> > +CONFIG_MMC_DW=y
> > +CONFIG_MMC_DW_ROCKCHIP=y
> > +CONFIG_MMC_SDHCI=y
> > +CONFIG_MMC_SDHCI_SDMA=y
> > +CONFIG_MMC_SDHCI_ROCKCHIP=y
> > +CONFIG_DM_PMIC=y
> > +CONFIG_DM_PMIC_FAN53555=y
> 
> I do not see fcs,fan53555 compatible in the device tree, this can be
> droped.

There is a compatible device. I'll test this out though but I think
either it's there under a different compatible (or more likely I need
to add a new compatible to this driver).

> 
> > +CONFIG_PMIC_RK8XX=y
> > +CONFIG_REGULATOR_PWM=y
> > +CONFIG_DM_REGULATOR_GPIO=y
> 
> I do not see any pwm-regulator or regulator-gpio compatible in the
> device tree, these two can be dropped.

I get confused between regulator-gpio and regulator-fixed, sorry.

> 
> > +CONFIG_REGULATOR_RK8XX=y
> > +CONFIG_DM_REGULATOR_SCMI=y
> 
> SCMI clock protocol is only used to control cpu and gpu clock on rk356x,
> this can be droped.

Ack, thanks.

> 
> > +CONFIG_PWM_ROCKCHIP=y
> > +CONFIG_SPL_RAM=y
> > +# CONFIG_RAM_ROCKCHIP_DEBUG is not set
> > +CONFIG_DM_RNG=y
> > +CONFIG_RNG_ROCKCHIP=y
> > +# CONFIG_RNG_SMCCC_TRNG is not set
> > +CONFIG_BAUDRATE=1500000
> > +CONFIG_DEBUG_UART_SHIFT=2
> > +CONFIG_SYS_NS16550_MEM32=y
> > +CONFIG_SYSRESET=y
> > +CONFIG_REGEX=y
> > +CONFIG_ERRNO_STR=y
> > +# CONFIG_EFI_LOADER is not set
> > diff --git a/doc/board/index.rst b/doc/board/index.rst
> > index 531e547e7e..dd4bce9981 100644
> > --- a/doc/board/index.rst
> > +++ b/doc/board/index.rst
> > @@ -36,6 +36,7 @@ Board-specific doc
> >     nxp/index
> >     openpiton/index
> >     phytec/index
> > +   powkiddy/index
> >     purism/index
> >     qualcomm/index
> >     renesas/index
> > diff --git a/doc/board/powkiddy/index.rst b/doc/board/powkiddy/index.rst
> > new file mode 100644
> > index 0000000000..b0115a73d4
> > --- /dev/null
> > +++ b/doc/board/powkiddy/index.rst
> > @@ -0,0 +1,9 @@
> > +.. SPDX-License-Identifier: GPL-2.0+
> > +
> > +Powkiddy
> > +========
> > +
> > +.. toctree::
> > +   :maxdepth: 2
> > +
> > +   x55.rst
> > diff --git a/doc/board/powkiddy/x55.rst b/doc/board/powkiddy/x55.rst
> > new file mode 100644
> > index 0000000000..66d02944c9
> > --- /dev/null
> > +++ b/doc/board/powkiddy/x55.rst
> > @@ -0,0 +1,46 @@
> > +.. SPDX-License-Identifier: GPL-2.0+
> > +
> > +U-Boot for Powkiddy X55 Handheld Gaming Console
> > +===============================================
> > +
> > +This allows U-Boot to boot the Powkiddy X55 handheld gaming console.
> > +The X55 is very similar to the other existing Powkiddy RK3566 based
> > +devices, except that ADC channels 0-3 are used for the ADC joysticks.
> > +As a result the same auto detection functionality cannot be used on
> > +this device as the others.
> > +
> > +The indicator LED will change color based on the boot stage. Red means
> > +the device is powered on but has yet to start U-Boot, amber means the
> > +device has started U-Boot and is waiting to boot Linux, and when Linux
> > +has taken over the LED should change to green (or however it has been
> > +configured by the user).
> > +
> > +In the event the device needs to enter Rockchip download mode, a user
> > +can, starting with the power off, hold the left joystick all the way
> > +to the left and then power on the device. At this point the USB-C port
> > +marked DC/OTG should be set to peripheral mode and allow a user to
> > +manipulate the device with the rkdeveloptool tool.
> > +
> > +Building U-Boot
> > +---------------
> > +
> > +.. code-block:: bash
> > +
> > +    $ export CROSS_COMPILE=aarch64-linux-gnu-
> > +    $ export BL31=../rkbin/bin/rk35/rk3568_bl31_v1.34.elf
> > +    $ export ROCKCHIP_TPL=../rkbin/bin/rk35/rk3568_ddr_1056MHz_v1.13.bin
> 
> I know that the rk3566/rk3568 ddr blobs are identical, but suggest you
> reference correct ddr blob here.
> 

Will do. In one of my rkbin trees (the one I must have been testing
with) there were no 3566 files, so that might be why I did this. Will
update.

> > +    $ make powkiddy-x55-rk3566_defconfig
> > +    $ make
> > +
> > +This will build ``u-boot-rockchip.bin`` which can be written to an SD
> > +card.
> > +
> > +Image installation
> > +------------------
> > +
> > +Write the ``u-boot-rockchip.bin`` to an SD card or the internal eMMC
> > +offset 32kb from the start.
> > +
> > +.. code-block:: bash
> > +
> > +    $ dd if=u-boot-rockchip.bin of=/dev/mmcblk0 bs=512 seek=64
> 
> Why just not reference the common Rockchip build and flashing
> instructions at doc/board/rockchip/rockchip.rst ? Are they missing
> something and could/should be updated?
> 
> Also missing addition of this board under the rk3566 heading in that doc.

No, this was mostly a cut and paste of docs I wrote for the Anbernic
RGxx3 series. I'll cut this part out and reference that instead.

> 
> Regards,
> Jonas
> 

Thank you for all your feedback. I'll work on a V2 and send it soon.

> > diff --git a/include/configs/powkiddy-x55-rk3566.h b/include/configs/powkiddy-x55-rk3566.h
> > new file mode 100644
> > index 0000000000..4b25c6a877
> > --- /dev/null
> > +++ b/include/configs/powkiddy-x55-rk3566.h
> > @@ -0,0 +1,12 @@
> > +/* SPDX-License-Identifier: GPL-2.0+ */
> > +
> > +#ifndef __POWKIDDY_X55_RK3566_H
> > +#define __POWKIDDY_X55_RK3566_H
> > +
> > +#include <configs/rk3568_common.h>
> > +
> > +#define ROCKCHIP_DEVICE_SETTINGS \
> > +			"stdout=serial,vidconsole\0" \
> > +			"stderr=serial,vidconsole\0"
> > +
> > +#endif
> 

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

end of thread, other threads:[~2023-12-06 14:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-05 21:39 [PATCH] board: rockchip: add Powkiddy X55 Chris Morgan
2023-12-05 22:48 ` Jonas Karlman
2023-12-06 14:11   ` Chris Morgan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.