[PATCH v4] arm64: dts: qcom: shikra-iqs: add M.2 Wi-Fi and Bluetooth overlay

From: Linghui Wu

Date: Sun Nov 01 2026 - 23:59:49 EST


Add an overlay for M.2 Key-E Wi-Fi and Bluetooth modules on the Qualcomm
Shikra IQS EVK.

The Shikra product design supports either the onboard Apache WCN3988 path
or the M.2 HSP Cologne path at a time; the two connectivity paths are not
intended to operate simultaneously. The overlay describes the board after
hardware rework selects the M.2 path. Disable the inherited onboard Wi-Fi
and Bluetooth nodes when this overlay is selected.

Describe the PCIe and UART connections through the M.2 connector, the
3.3 V supply, the W_DISABLE signals and the PCIe reset signal.

The Wi-Fi PCIe path was tested with a QCC2072 module. The overlay was
applied, the link trained at Gen2 x1, the endpoint enumerated, and ath12k
started MHI. The Bluetooth UART and HCI path was also tested and the
QCC2072 controller initialized successfully.

Link: https://lore.kernel.org/r/20261020020925.3915548-1.linghui.wu@xxxxxxxxxxxxxxxx
Co-developed-by: Wei Deng <wei.deng@xxxxxxxxxxxxxxxx>
Signed-off-by: Wei Deng <wei.deng@xxxxxxxxxxxxxxxx>
Signed-off-by: Linghui Wu <linghui.wu@xxxxxxxxxxxxxxxx>
---
Changes in v2:
- Drop regulator-boot-on and startup-delay-us from the 3.3 V regulator.

Changes in v3:
- Drop the unused reg override from the disabled TC9563 node.

Changes in v4:
- Build a composite DTB to validate that the overlay applies to the base DTB.
- Add a label to the WCN3988 PMU and reference it from the overlay.
- Explain that the product design does not operate the onboard and M.2
connectivity paths simultaneously.
- Update the validation status after testing Bluetooth UART and HCI.
- Restore the TC9563 reg override after runtime testing showed that the stale
OF node otherwise matches the directly connected QCC2072 endpoint.

arch/arm64/boot/dts/qcom/Makefile | 3 +
.../boot/dts/qcom/shikra-iqs-evk-m2-wifi-bt.dtso | 106 ++++++++++++++++++++
arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts | 2 +-
3 files changed, 110 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 71f9822ad942f3854f4ccaba9cad484298c994aa..c61bf4577d0e67a12e17f7537a0b4dc91c8e5150 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -427,11 +427,14 @@ shikra-cqm-evk-hdmi-dtbs := shikra-cqm-evk.dtb shikra-cqm-cqs-evk-hdmi.dtbo
shikra-cqs-evk-hdmi-dtbs := shikra-cqs-evk.dtb shikra-cqm-cqs-evk-hdmi.dtbo
shikra-iqs-evk-dlc-panel-dtbs := shikra-iqs-evk.dtb shikra-iqs-evk-dlc-panel.dtbo
shikra-iqs-evk-lvds-auo,g133han01-dtbs := shikra-iqs-evk.dtb shikra-iqs-evk-lvds-auo,g133han01.dtbo
+shikra-iqs-evk-m2-wifi-bt-dtbs := shikra-iqs-evk.dtb shikra-iqs-evk-m2-wifi-bt.dtbo

dtb-$(CONFIG_ARCH_QCOM) += shikra-cqm-evk-hdmi.dtb
dtb-$(CONFIG_ARCH_QCOM) += shikra-cqs-evk-hdmi.dtb
dtb-$(CONFIG_ARCH_QCOM) += shikra-iqs-evk-dlc-panel.dtb
dtb-$(CONFIG_ARCH_QCOM) += shikra-iqs-evk-lvds-auo,g133han01.dtb
+dtb-$(CONFIG_ARCH_QCOM) += shikra-iqs-evk-m2-wifi-bt.dtb
+dtb-$(CONFIG_ARCH_QCOM) += shikra-iqs-evk-m2-wifi-bt.dtbo

dtb-$(CONFIG_ARCH_QCOM) += sm4250-oneplus-billie2.dtb
dtb-$(CONFIG_ARCH_QCOM) += sm4450-qrd.dtb
diff --git a/arch/arm64/boot/dts/qcom/shikra-iqs-evk-m2-wifi-bt.dtso b/arch/arm64/boot/dts/qcom/shikra-iqs-evk-m2-wifi-bt.dtso
new file mode 100644
index 0000000000000000000000000000000000000000..7d65e67bfcc2b05259e01e658d007274cc4f13c4
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/shikra-iqs-evk-m2-wifi-bt.dtso
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+/dts-v1/;
+/plugin/;
+
+#include <dt-bindings/gpio/gpio.h>
+
+&{/} {
+ m2_keye_3p3: regulator-m2-keye-3p3 {
+ compatible = "regulator-fixed";
+ regulator-name = "VREG_3P3_KEYE";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&qps_gpio_expander 6 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+
+ wifi-bt-connector {
+ compatible = "pcie-m2-e-connector";
+
+ vpcie3v3-supply = <&m2_keye_3p3>;
+ w-disable1-gpios = <&tlmm 61 GPIO_ACTIVE_LOW>;
+ w-disable2-gpios = <&tlmm 60 GPIO_ACTIVE_LOW>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ m2_e_pcie_ep: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&pcie_port0_ep>;
+ };
+ };
+
+ port@3 {
+ reg = <3>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ m2_e_uart_ep: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&uart8_ep>;
+ };
+ };
+ };
+ };
+};
+
+&wcn3988_pmu {
+ status = "disabled";
+};
+
+&i2c3 {
+ qps_gpio_expander: gpio@3c {
+ compatible = "nxp,pca9534";
+ reg = <0x3c>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+};
+
+&pcie {
+ iommu-map = <0x0 &apps_smmu 0x0800 0x0 0x1>,
+ <0x100 &apps_smmu 0x0801 0x0 0x1>;
+ vddpe-3v3-supply = <&m2_keye_3p3>;
+};
+
+&pcie_port0 {
+ compatible = "pciclass,0604";
+ reset-gpios = <&tlmm 118 GPIO_ACTIVE_LOW>;
+
+ port {
+ pcie_port0_ep: endpoint {
+ remote-endpoint = <&m2_e_pcie_ep>;
+ };
+ };
+};
+
+&tc9563 {
+ reg = <0x1ff00 0x0 0x0 0x0 0x0>;
+ status = "disabled";
+};
+
+&uart8 {
+ bluetooth {
+ status = "disabled";
+ };
+
+ port {
+ uart8_ep: endpoint {
+ remote-endpoint = <&m2_e_uart_ep>;
+ };
+ };
+};
+
+&wifi {
+ status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts b/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts
index e4058a58d05f3d7bf2f69ab945ce5eb6d6635320..779247b7f80af61a394d0dbdec23411ce5d5cb04 100644
--- a/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts
+++ b/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts
@@ -164,7 +164,7 @@ vreg_wcn_3p3: regulator-wcn-3p3 {
regulator-always-on;
};

- wcn3988-pmu {
+ wcn3988_pmu: wcn3988-pmu {
compatible = "qcom,wcn3988-pmu";

pinctrl-0 = <&sw_ctrl_default>;
--
2.43.0