From af4f5b93af0cb59dbe31cfdd20586136df0fc2b4 Mon Sep 17 00:00:00 2001 From: Yepuri Siddu Date: Thu, 24 Sep 2026 16:56:07 +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 086604ca2b48d..d95e3e69a9e44 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -2272,6 +2272,8 @@ static void qca_power_shutdown(struct hci_uart *hu) } if (power && power->pwrseq) { + if (qcadev->susclk) + clk_disable_unprepare(qcadev->susclk); pwrseq_power_off(power->pwrseq); set_bit(QCA_BT_OFF, &qca->flags); return; @@ -2332,8 +2334,17 @@ static int qca_regulator_enable(struct qca_serdev *qcadev) struct qca_power *power = qcadev->bt_power; int ret; - if (power->pwrseq) - return pwrseq_power_on(power->pwrseq); + if (power->pwrseq) { + ret = pwrseq_power_on(power->pwrseq); + if (ret) + return ret; + if (qcadev->susclk) { + ret = clk_prepare_enable(qcadev->susclk); + if (ret) + pwrseq_power_off(power->pwrseq); + } + return ret; + } /* Already enabled */ if (power->vregs_on) @@ -2501,8 +2512,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 204d5145ea7eb668b1c092fb5d06c44c76f1ed01 Mon Sep 17 00:00:00 2001 From: Yepuri Siddu Date: Thu, 24 Sep 2026 16:56:16 +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-evk.dts | 1 + arch/arm64/boot/dts/qcom/shikra-cqs-evk.dts | 1 + arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts | 1 + 3 files changed, 3 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/shikra-cqm-evk.dts b/arch/arm64/boot/dts/qcom/shikra-cqm-evk.dts index 9633ef96bf97b..3653898bbeafa 100644 --- a/arch/arm64/boot/dts/qcom/shikra-cqm-evk.dts +++ b/arch/arm64/boot/dts/qcom/shikra-cqm-evk.dts @@ -727,6 +727,7 @@ 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-cqs-evk.dts b/arch/arm64/boot/dts/qcom/shikra-cqs-evk.dts index 3399777c2d8e0..9fb21196caf18 100644 --- a/arch/arm64/boot/dts/qcom/shikra-cqs-evk.dts +++ b/arch/arm64/boot/dts/qcom/shikra-cqs-evk.dts @@ -650,6 +650,7 @@ 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-evk.dts b/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts index f829e0082ce7f..1a0ddda8205f9 100644 --- a/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts +++ b/arch/arm64/boot/dts/qcom/shikra-iqs-evk.dts @@ -771,6 +771,7 @@ vddxo-supply = <&vreg_pmu_xo>; vddrf-supply = <&vreg_pmu_rf>; vddch0-supply = <&vreg_pmu_ch0>; + clocks = <&rpmcc RPM_SMD_RF_CLK1>; }; };