Skip to contentSkip to conversation

arm64: dts: qcom: Add initial Motorola Moto G10 support

PATCH Superseded Michael McAllister 3 participants 5 messages Oct 22 – Oct 23

Subsystems (3)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

cover arm64: dts: qcom: Add initial Motorola Moto G10 support

This series adds an initial device tree for the Motorola Moto G10 (capri), based on the Qualcomm Snapdragon 460 (SM4250). It adds the board compatible and describes eMMC, USB-C, power and volume keys, the firmware framebuffer, regulators, GPU, Wi-Fi, Bluetooth and remote processors.

The board uses the shared PM6125 and PMI632 definitions, with its own reserved-memory layout and firmware PSCI state IDs. Modem, ADSP and GPU firmware paths are namespaced under qcom/motorola/capri/.

Native panel, touchscreen, speaker and battery support need separate driver and binding submissions and are outside this series.

Based on Qualcomm arm64-for-7.4 (Linux 7.3-rc1). Binding and full DT schema checks pass. The W=1 DTB build reports an inherited unused DSI address/size- cells warning in sm6115.dtsi, also reproduced with OnePlus Billie2.

Runtime checks covered booting with all eight CPUs, read-only eMMC access and USB ECM transfers. simpledrm and the power/volume input devices registered. Thermal readings and an active watchdog were observed. Physical button events and visible framebuffer output remain unconfirmed. GPU, Wi-Fi, Bluetooth, remote processors and suspend were not exercised; the minimal RAM image contained no wireless/DSP firmware or modules.

The test ran without a panic or warning backtrace. A PSCI PC-mode firmware warning also occurs with the phone's installed kernel; suspend and deeper idle states remain untested.

For the stock Android bootloader, testing used out-of-tree handoff code to select this DTB while retaining the firmware RAM map, initramfs and factory Wi-Fi address, plus an arm64 Image alignment wrapper. That code is not included here. No other device-specific driver patches were used.

Michael McAllister (2):
dt-bindings: arm: qcom: Add Motorola Moto G10
arm64: dts: qcom: Add Motorola Moto G10

 .../devicetree/bindings/arm/qcom.yaml         |   1 +
 arch/arm64/boot/dts/qcom/Makefile             |   1 +
 .../boot/dts/qcom/sm4250-motorola-capri.dts   | 452 ++++++++++++++++++
 3 files changed, 454 insertions(+)
 create mode 100644 arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts

base-commit: d053e38e614fb2e383b298ce8fc308a780d7f209

#1 lore raw

PATCH 1/2 dt-bindings: arm: qcom: Add Motorola Moto G10

Document the Motorola Moto G10 (capri), a smartphone based on the Qualcomm Snapdragon 460 (SM4250).

---
 Documentation/devicetree/bindings/arm/qcom.yaml | 1 +
 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/arm/qcom.yaml +1 -0
index 121ca557ce..963fd482be 100644
@@ -1051,6 +1051,7 @@ properties:
 
       - items:
           - enum:
+              - motorola,capri
               - oneplus,billie2
           - const: qcom,sm4250
 
#2 lore raw

PATCH 2/2 arm64: dts: qcom: Add Motorola Moto G10

In reply to Michael McAllister

Add an initial board description for the SM4250-based Motorola Moto G10 (codenamed capri), including eMMC, USB-C, buttons, GPU, Wi-Fi and Bluetooth. Use the firmware framebuffer until native panel support is available.

Describe the board-specific firmware carveouts and PSCI state IDs, and use the shared PM6125 and PMI632 definitions. Put the modem, ADSP and GPU firmware paths under qcom/motorola/capri/.

Panel, touchscreen, amplifier, sound-card and battery-monitor support still depend on local drivers and are left for separate submissions.

---
 arch/arm64/boot/dts/qcom/Makefile             |   1 +
 .../boot/dts/qcom/sm4250-motorola-capri.dts   | 452 ++++++++++++++++++
 2 files changed, 453 insertions(+)
 create mode 100644 arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts
arch/arm64/boot/dts/qcom/Makefile +1 -0
index 88230c4e00..6f2dd88a14 100644
@@ -383,6 +383,7 @@ shikra-iqs-evk-imx577-camera-dtbs	:= shikra-iqs-evk.dtb shikra-iqs-evk-imx577-ca
 dtb-$(CONFIG_ARCH_QCOM)	+= shikra-cqm-evk-imx577-camera.dtb
 dtb-$(CONFIG_ARCH_QCOM)	+= shikra-cqs-evk-imx577-camera.dtb
 dtb-$(CONFIG_ARCH_QCOM)	+= shikra-iqs-evk-imx577-camera.dtb
+dtb-$(CONFIG_ARCH_QCOM)	+= sm4250-motorola-capri.dtb
 dtb-$(CONFIG_ARCH_QCOM)	+= sm4250-oneplus-billie2.dtb
 dtb-$(CONFIG_ARCH_QCOM)	+= sm4450-qrd.dtb
 dtb-$(CONFIG_ARCH_QCOM)	+= sm6115-fxtec-pro1x.dtb
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +452 -0

452 lines not on this page · raw message

#3 lore raw

Re: [PATCH 2/2] arm64: dts: qcom: Add Motorola Moto G10

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [High] arm64: dts: qcom: capri simple-framebuffer missing display clocks and GDSC - [Medium] arm64: dts…

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] arm64: dts: qcom: capri simple-framebuffer missing display clocks and GDSC
- [Medium] arm64: dts: qcom: sm4250-motorola-capri: wcn3950-bt never powers off in qca_power_off() --

commit af8b8ef25e8fb618354806c36e99ddefd993ffb6
Author: Michael McAllister <[email protected]>

arm64: dts: qcom: Add Motorola Moto G10

This patch adds an initial device tree for the Motorola Moto G10 (capri) smartphone, enabling storage, usb type-c, buttons, graphics, wireless, bluetooth, and a simple-framebuffer display node.

Quoted 6 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +0 -0
new file mode 100644
index 0000000000000..b079f0cdc800b
@@ -0,0 +1,452 @@

[ ... ]

Quoted 8 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +8 -0
+	chosen {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		stdout-path = "display0";
+
+		framebuffer0: framebuffer@5c000000 {

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 48

Quoted 10 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +10 -0
+			compatible = "simple-framebuffer";
+			reg = <0 0x5c000000 0 (720 * 1600 * 4)>;
+			display = <&mdss>;
+			format = "a8r8g8b8";
+			height = <1600>;
+			stride = <(720 * 4)>;
+			vddio-supply = <&vreg_l9a>;
+			width = <720>;
+		};
+	};

[Severity: High]
Will the display stay powered and clocked after late_initcall cleanup when booting with this simple-framebuffer node?

In arch/arm64/boot/dts/qcom/sm6115.dtsi, mdss is disabled by default while both gcc and dispcc are enabled:

arch/arm64/boot/dts/qcom/sm6115.dtsi:

		dispcc: clock-controller@5f00000 {
			compatible = "qcom,sm6115-dispcc";
			...
		};

Because mdss is disabled and simple-framebuffer does not claim clocks or power domains through the display = <&mdss> phandle, nothing claims gcc_disp_hf_axi_clk in drivers/clk/qcom/gcc-sm6115.c or the display clocks and mdss_gdsc power domain registered by disp_cc_sm6115_probe() in drivers/clk/qcom/dispcc-sm6115.c:

drivers/clk/qcom/gcc-sm6115.c:

static struct clk_branch gcc_disp_hf_axi_clk = {
	.halt_reg = 0x17020,
	.halt_check = BRANCH_HALT,
	...
};

drivers/clk/qcom/dispcc-sm6115.c:

static struct gdsc mdss_gdsc = {
	.gdscr = 0x3000,
	.pd = {
		.name = "mdss_gdsc",
	},
	.pwrsts = PWRSTS_OFF_ON,
	.flags = HW_CTRL,
};

When clk_disable_unused() and pm_genpd_poweroff_unused() run during boot, won't they disable gcc_disp_hf_axi_clk, the dispcc branch clocks, and mdss_gdsc, shutting down the active display scanout and stdout-path console?

For comparison, arch/arm64/boot/dts/qcom/sm6115-xiaomi-lemon.dts keeps gcc_disp_hf_axi_clk enabled in framebuffer0 and disables dispcc until the panel driver is wired up:

arch/arm64/boot/dts/qcom/sm6115-xiaomi-lemon.dts:

		framebuffer0: framebuffer@5c000000 {
			...
			clocks = <&gcc GCC_DISP_HF_AXI_CLK>;
		};
...
&dispcc {
	/* Prevent simplefb from dying until we wire panel driver */
	status = "disabled";
};

Should framebuffer0 reference gcc_disp_hf_axi_clk (and either disable dispcc or claim the dispcc clocks and mdss_gdsc) here as well?

[ ... ]

Quoted 8 lines

+&uart3 {

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +7 -0
+	interrupts-extended = <&intc GIC_SPI 330 IRQ_TYPE_LEVEL_HIGH>,
+			      <&tlmm 11 IRQ_TYPE_EDGE_FALLING>;
+	pinctrl-0 = <&bt_uart_default>;
+	pinctrl-1 = <&bt_uart_sleep>;
+	pinctrl-names = "default", "sleep";
+
+	status = "okay";

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 411

Quoted 10 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +10 -0
+
+	bluetooth {
+		compatible = "qcom,wcn3950-bt";
+		max-speed = <3000000>;
+		vddch0-supply = <&vreg_l23a>;
+		vddio-supply = <&vreg_l9a>;
+		vddrf-supply = <&vreg_l17a>;
+		vddxo-supply = <&vreg_l16a>;
+	};
+};

[Severity: Medium]
Can the bluetooth controller power off cleanly on this board when using qcom,wcn3950-bt with direct regulator supplies instead of a power sequencer?

In drivers/bluetooth/hci_qca.c, qca_serdev_probe() falls back to direct regulator control via qca_init_regulators() when devm_pwrseq_get() does not find a bluetooth power sequencer. While qca_power_on() and qca_regulator_init() handle the wcn3950 soc_type, both switch statements in qca_power_off() and the cleanup check in qca_serdev_remove() omit it:

drivers/bluetooth/hci_qca.c:qca_power_off() {
	switch (soc_type) {
	case QCA_WCN3988:
	case QCA_WCN3990:
	case QCA_WCN3991:
	case QCA_WCN3998:
		host_set_baudrate(hu, 2400);
		qca_send_power_pulse(hu, false);
		break;
	default:
		break;
	}

	if (power && power->pwrseq) {
		pwrseq_disable(power->pwrseq);
		set_bit(QCA_BT_OFF, &qca->flags);
		return;
	}

	switch (soc_type) {
	case QCA_WCN3988:
	case QCA_WCN3990:
	case QCA_WCN3991:
	case QCA_WCN3998:
		qca_regulator_disable(qcadev);
		break;
	...
}
drivers/bluetooth/hci_qca.c:qca_serdev_remove() {
	switch (qcadev->btsoc_type) {
	case QCA_WCN3988:
	case QCA_WCN3990:
	case QCA_WCN3991:
	case QCA_WCN3998:
	case QCA_WCN6750:
	case QCA_WCN6855:
	case QCA_WCN7850:
		if (power->vregs_on)
			qca_power_off(&qcadev->serdev_hu);
		break;
	default:
		break;
	}
}

Without a power-sequencer node (or wcn3950 handling in qca_power_off() and qca_serdev_remove()), won't powering off bluetooth or unbinding the serdev driver skip both qca_send_power_pulse(hu, false) and qca_regulator_disable(qcadev), leaving vddch0, vddio, vddrf, and vddxo permanently enabled?

Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=2
#4 lore raw

Re: [PATCH 2/2] arm64: dts: qcom: Add Motorola Moto G10

In reply to Michael McAllister
Quoted 4 lines · Michael McAllister

Add an initial board description for the SM4250-based Motorola Moto G10 (codenamed capri), including eMMC, USB-C, buttons, GPU, Wi-Fi and Bluetooth. Use the firmware framebuffer until native panel support is available.

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 6

Quoted 6 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +6 -0
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (c) 2026 Michael McAllister <[email protected]>
+ *
+ * PM6125 regulator definitions derived from sm4250-oneplus-billie2.dts:
+ * Copyright (c) 2021 Iskren Chernev <[email protected]>

Did you adjust them to match your specific device? Otherwise you risk some magic smoke..

Quoted 6 lines

+ */

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +5 -0
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 22

Quoted 10 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +10 -0
+#include "sm4250.dtsi"
+#include "pm6125.dtsi"
+#include "pmi632.dtsi"
+
+/ {
+	model = "Motorola Moto G10";
+	compatible = "motorola,capri", "qcom,sm4250";
+
+	/* Used by the bootloader to select the board. */
+	qcom,msm-id = <0x1a1 0x10000>;

Please add a line to socinfo (this is SM4250 as you said), include that header and use the define here

[...]

Quoted 6 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +6 -0
+/* The stock firmware uses CPU mode 3 and affinity level 1 for these states. */
+&cluster_0_sleep_0 {
+	arm,psci-suspend-param = <0x41000023>;
+};
+
+&cluster_0_sleep_1 {

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 80

Quoted 10 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +10 -0
+	arm,psci-suspend-param = <0x41000043>;
+};
+
+&cluster_1_sleep_0 {
+	arm,psci-suspend-param = <0x41000023>;
+};
+
+&cluster_1_sleep_1 {
+	arm,psci-suspend-param = <0x41000043>;
+};

This isn't customized per-device. I've confirmed these values are right, please update them in the SoC DTSI in a preceding patch.

We also have this state:

system_sleep_0: system-sleep-0 {
	compatible = "domain-idle-state";
	arm,psci-suspend-param = <0x42000343>;
	entry-latency-us = <10831>;
	exit-latency-us = <4506>;
	min-residency-us = <15338>;
};

but this is definitely going to stay pending on this series:

https://lore.kernel.org/linux-arm-msm/20261015-b4-shikra_lpm_addition-v2-0-ac7f1a0d5638@oss.qualcomm.com/

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 161

Quoted 5 lines

+&reserved_memory {

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +4 -0
+	/delete-node/ memory@53800000;
+	/delete-node/ memory@56100000;
+	/delete-node/ memory@56110000;
+	/delete-node/ memory@56115000;

Please remove these nodes via a &label_reference at the top of the file instead, so the compiler will do some more checking

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 184

Quoted 1 line
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +1 -0
+	/* Bootloader debug data. */

Ultra nit: usually comments don't end in a period

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 244

Quoted 2 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +2 -0
+		vreg_l8a: l8 {
+			/* Handset ICNSS DT overrides CX/MX to 640 mV. */

This is presumably CX/MX for the bluetooth chip?
I find this comment a bit more on the confusing side rather than helping

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 252

Quoted 8 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +8 -0
+			regulator-min-microvolt = <640000>;
+			regulator-max-microvolt = <640000>;
+		};
+
+		vreg_l9a: l9 {
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			/* Display and touch share this rail with Bluetooth. */

This will become self-evident as you add support for these pieces

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 287

Quoted 2 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +2 -0
+		vreg_l16a: l16 {
+			/* ICNSS WCN3990 XO supply setting. */

This comment feels likewise a little strange

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 351

Quoted 2 lines

+&tlmm {

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +1 -0
+	gpio-reserved-ranges = <14 4>;

Do we know what these map to? Usually that's NFC eSE or a fingerprint scanner. If you do, please add a comment, like in glymur-crd.dtsi

[...]

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 421

Quoted 2 lines

+&usb_dwc3 {

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +1 -0
+	dr_mode = "otg";

OTG is the default, you can drop this line

arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts line 425

Quoted 4 lines
arch/arm64/boot/dts/qcom/sm4250-motorola-capri.dts new file +4 -0
+	maximum-speed = "high-speed";
+	phy-names = "usb2-phy";
+	phys = <&usb_hsphy>;
+	role-switch-default-mode = "peripheral";

And this is the default too

Konrad