From 36b25462da2a4e70d4b29da9aea25d1ab2b30698 Mon Sep 17 00:00:00 2001 From: Yepuri Siddu Date: Fri, 25 Sep 2026 11:31:42 +0530 Subject: [PATCH 1/2] FROMLIST: Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path RPMCC previously kept WCN clocks enabled via proxy votes, so the pwrseq power path in hci_qca did not need to explicitly manage the clock. With proxy vote removal, each consumer must explicitly enable and disable its required clocks. Extend the pwrseq-based power path to acquire and manage an optional WCN clock. In qca_serdev_probe(), acquire the clock using devm_clk_get_optional(). In qca_regulator_enable(), enable the clock after a successful pwrseq_enable() with proper rollback on failure. In qca_power_off(), disable the clock before pwrseq_disable(). Targets that do not define a clock in DTS are unaffected since devm_clk_get_optional() returns NULL and all clock operations are guarded accordingly. Link: https://lore.kernel.org/linux-arm-msm/20260925-bt-wcn-clk-enable-v1-1-30bee88c4de4@oss.qualcomm.com/ Signed-off-by: Yepuri Siddu --- drivers/bluetooth/hci_qca.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index d3df2349bbbaa..5a2c7aef80025 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -2276,6 +2276,8 @@ static void qca_power_off(struct hci_uart *hu) } if (power && power->pwrseq) { + if (qcadev->susclk) + clk_disable_unprepare(qcadev->susclk); pwrseq_disable(power->pwrseq); set_bit(QCA_BT_OFF, &qca->flags); return; @@ -2336,8 +2338,17 @@ static int qca_regulator_enable(struct qca_serdev *qcadev) struct qca_power *power = qcadev->bt_power; int ret; - if (power->pwrseq) - return pwrseq_enable(power->pwrseq); + if (power->pwrseq) { + ret = pwrseq_enable(power->pwrseq); + if (ret) + return ret; + if (qcadev->susclk) { + ret = clk_prepare_enable(qcadev->susclk); + if (ret) + pwrseq_disable(power->pwrseq); + } + return ret; + } /* Already enabled */ if (power->vregs_on) @@ -2486,8 +2497,14 @@ static int qca_serdev_probe(struct serdev_device *serdev) */ if (IS_ERR(qcadev->bt_power->pwrseq)) qcadev->bt_power->pwrseq = NULL; - else + else { + qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); + if (IS_ERR(qcadev->susclk)) { + dev_err(&serdev->dev, "failed to acquire clk\n"); + return PTR_ERR(qcadev->susclk); + } break; + } } qcadev->bt_power->dev = &serdev->dev; From bd0641d998ec1be44ec56fc1a95d72e405e5cfb2 Mon Sep 17 00:00:00 2001 From: Yepuri Siddu Date: Fri, 25 Sep 2026 11:31:50 +0530 Subject: [PATCH 2/2] FROMLIST: arm64: dts: qcom: shikra: Add WCN clock to Bluetooth node With RPMCC proxy vote removal, the Bluetooth node must explicitly declare its WCN clock dependency so the hci_qca driver can vote for it during BT power on/off via the pwrseq path. CQM SOM uses RPM_SMD_RF_CLK2 while IQS SOM uses RPM_SMD_RF_CLK1, reflecting the WCN clock assignments on each board variant. Link: https://lore.kernel.org/linux-arm-msm/20260925-bt-wcn-clk-enable-v1-2-30bee88c4de4@oss.qualcomm.com/ Signed-off-by: Yepuri Siddu --- arch/arm64/boot/dts/qcom/shikra-cqm-som.dtsi | 2 ++ arch/arm64/boot/dts/qcom/shikra-iqs-som.dtsi | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/shikra-cqm-som.dtsi b/arch/arm64/boot/dts/qcom/shikra-cqm-som.dtsi index 8ac42ff625a0e..4e03e459c7c16 100644 --- a/arch/arm64/boot/dts/qcom/shikra-cqm-som.dtsi +++ b/arch/arm64/boot/dts/qcom/shikra-cqm-som.dtsi @@ -220,6 +220,8 @@ vddxo-supply = <&vreg_pmu_xo>; vddrf-supply = <&vreg_pmu_rf>; vddch0-supply = <&vreg_pmu_ch0>; + + clocks = <&rpmcc RPM_SMD_RF_CLK2>; }; }; diff --git a/arch/arm64/boot/dts/qcom/shikra-iqs-som.dtsi b/arch/arm64/boot/dts/qcom/shikra-iqs-som.dtsi index 4ff97945274dd..227283ab74a81 100644 --- a/arch/arm64/boot/dts/qcom/shikra-iqs-som.dtsi +++ b/arch/arm64/boot/dts/qcom/shikra-iqs-som.dtsi @@ -242,6 +242,8 @@ vddxo-supply = <&vreg_pmu_xo>; vddrf-supply = <&vreg_pmu_rf>; vddch0-supply = <&vreg_pmu_ch0>; + + clocks = <&rpmcc RPM_SMD_RF_CLK1>; }; };