* [PATCH 0/2] Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra
@ 2026-09-25 6:13 Yepuri Siddu
2026-09-25 6:13 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Yepuri Siddu
2026-09-25 6:13 ` [PATCH 2/2] arm64: dts: qcom: shikra: Add WCN clock to Bluetooth node Yepuri Siddu
0 siblings, 2 replies; 6+ messages in thread
From: Yepuri Siddu @ 2026-09-25 6:13 UTC (permalink / raw)
To: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz,
Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Imran Shaik, linux-arm-msm, linux-bluetooth, linux-kernel,
devicetree, Yepuri Siddu, quic_mohamull, quic_hbandi
clk_smd_rpm_handoff() votes both active and sleep RPM resource states for
every clock, keeping them non-zero until a consumer takes over. On Shikra,
the BT WCN clock was surviving on these proxy votes. With proxy vote
removal on QCM2290 [1], the sleep vote is no longer held, which means BT
must explicitly vote for its WCN clock during enable and release it during
disable to avoid keeping the clock active in idle.
This series adds WCN clock management to the hci_qca driver for the
pwrseq-based power path and enables it for Shikra boards. Targets that
do not define a clock in DTS are unaffected.
Validations:
- BT enable/disable verified on Shikra CQM, CQS and IQS EVK boards.
- Confirmed WCN clock voted on BT enable and released on BT disable.
As RPMCC proxy votes are being removed for QCM2290 [1], BT can no longer
rely on them to keep the WCN clock active. This series ensures BT
explicitly enables the WCN clock on power-on and disables it on power-off.
[1] https://lore.kernel.org/all/20260910-clk-smd-rpm-skip-proxy-v1-1-1cb5694a99d9@oss.qualcomm.com/
Signed-off-by: Yepuri Siddu <yepuri.siddu@oss.qualcomm.com>
---
Yepuri Siddu (2):
Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path
arm64: dts: qcom: shikra: Add WCN clock to Bluetooth node
arch/arm64/boot/dts/qcom/shikra-cqm-som.dtsi | 2 ++
arch/arm64/boot/dts/qcom/shikra-iqs-som.dtsi | 2 ++
drivers/bluetooth/hci_qca.c | 23 ++++++++++++++++++++---
3 files changed, 24 insertions(+), 3 deletions(-)
---
base-commit: 165768bb70265b5c38cf0b73fafd75be235f8b14
change-id: 20260925-bt-wcn-clk-enable-9de068334aa1
Best regards,
--
Yepuri Siddu <yepuri.siddu@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path
2026-09-25 6:13 [PATCH 0/2] Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra Yepuri Siddu
@ 2026-09-25 6:13 ` Yepuri Siddu
2026-09-25 10:37 ` Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra bluez.test.bot
2026-09-29 10:03 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Loic Poulain
2026-09-25 6:13 ` [PATCH 2/2] arm64: dts: qcom: shikra: Add WCN clock to Bluetooth node Yepuri Siddu
1 sibling, 2 replies; 6+ messages in thread
From: Yepuri Siddu @ 2026-09-25 6:13 UTC (permalink / raw)
To: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz,
Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Imran Shaik, linux-arm-msm, linux-bluetooth, linux-kernel,
devicetree, Yepuri Siddu, quic_mohamull, quic_hbandi
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.
Signed-off-by: Yepuri Siddu <yepuri.siddu@oss.qualcomm.com>
---
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 7089e9b639b2..489a059e519a 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -2265,6 +2265,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;
@@ -2324,8 +2326,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)
@@ -2472,8 +2483,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;
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] arm64: dts: qcom: shikra: Add WCN clock to Bluetooth node
2026-09-25 6:13 [PATCH 0/2] Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra Yepuri Siddu
2026-09-25 6:13 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Yepuri Siddu
@ 2026-09-25 6:13 ` Yepuri Siddu
1 sibling, 0 replies; 6+ messages in thread
From: Yepuri Siddu @ 2026-09-25 6:13 UTC (permalink / raw)
To: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz,
Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Imran Shaik, linux-arm-msm, linux-bluetooth, linux-kernel,
devicetree, Yepuri Siddu, quic_mohamull, quic_hbandi
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.
Signed-off-by: Yepuri Siddu <yepuri.siddu@oss.qualcomm.com>
---
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 8ac42ff625a0..4e03e459c7c1 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 @@ bluetooth {
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 4ff97945274d..227283ab74a8 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 @@ bluetooth {
vddxo-supply = <&vreg_pmu_xo>;
vddrf-supply = <&vreg_pmu_rf>;
vddch0-supply = <&vreg_pmu_ch0>;
+
+ clocks = <&rpmcc RPM_SMD_RF_CLK1>;
};
};
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra
2026-09-25 6:13 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Yepuri Siddu
@ 2026-09-25 10:37 ` bluez.test.bot
2026-09-29 10:03 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Loic Poulain
1 sibling, 0 replies; 6+ messages in thread
From: bluez.test.bot @ 2026-09-25 10:37 UTC (permalink / raw)
To: linux-bluetooth, yepuri.siddu
[-- Attachment #1: Type: text/plain, Size: 2125 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/series/1173556/
---Test result---
Test Summary:
CheckPatch PASS 1.21 seconds
VerifyFixes PASS 0.09 seconds
VerifySignedoff PASS 0.10 seconds
GitLint PASS 0.55 seconds
SubjectPrefix FAIL 0.18 seconds
BuildKernel PASS 21.60 seconds
CheckAllWarning PASS 25.10 seconds
CheckSparse PASS 27.97 seconds
BuildKernel32 PASS 23.10 seconds
CheckKernelLLVM PASS 24.61 seconds
TestRunnerSetup PASS 583.29 seconds
TestRunner_l2cap-tester PASS 18.41 seconds
TestRunner_iso-tester PASS 29.72 seconds
TestRunner_bnep-tester PASS 2.87 seconds
TestRunner_mgmt-tester PASS 56.98 seconds
TestRunner_rfcomm-tester PASS 4.41 seconds
TestRunner_sco-tester PASS 7.12 seconds
TestRunner_ioctl-tester PASS 4.24 seconds
TestRunner_mesh-tester FAIL 7.66 seconds
TestRunner_smp-tester PASS 7.08 seconds
TestRunner_userchan-tester PASS 2.95 seconds
TestRunner_6lowpan-tester PASS 4.03 seconds
IncrementalBuild PASS 23.71 seconds
Details
##############################
Test: SubjectPrefix - FAIL
Desc: Check subject contains "Bluetooth" prefix
Output:
"Bluetooth: " prefix is not specified in the subject
##############################
Test: TestRunner_mesh-tester - FAIL
Desc: Run mesh-tester with test-runner
Output:
Total: 10, Passed: 8 (80.0%), Failed: 2, Not Run: 0
Failed Test Cases
Mesh - Send cancel - 1 Timed out 2.619 seconds
Mesh - Send cancel - 2 Timed out 1.999 seconds
https://github.com/bluez/bluetooth-next/pull/818
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path
2026-09-25 6:13 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Yepuri Siddu
2026-09-25 10:37 ` Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra bluez.test.bot
@ 2026-09-29 10:03 ` Loic Poulain
2026-09-29 10:19 ` Yepuri Siddu
1 sibling, 1 reply; 6+ messages in thread
From: Loic Poulain @ 2026-09-29 10:03 UTC (permalink / raw)
To: Yepuri Siddu
Cc: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz,
Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Imran Shaik, linux-arm-msm, linux-bluetooth,
linux-kernel, devicetree, quic_mohamull, quic_hbandi
On Fri, Sep 25, 2026 at 8:21 AM Yepuri Siddu
<yepuri.siddu@oss.qualcomm.com> wrote:
>
> 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.
>
> Signed-off-by: Yepuri Siddu <yepuri.siddu@oss.qualcomm.com>
> ---
> 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 7089e9b639b2..489a059e519a 100644
> --- a/drivers/bluetooth/hci_qca.c
> +++ b/drivers/bluetooth/hci_qca.c
> @@ -2265,6 +2265,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;
> @@ -2324,8 +2326,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);
Why is susclk guarded by the pwrseq? They seem unrelated to me.
> + if (ret)
> + pwrseq_disable(power->pwrseq);
> + }
> + return ret;
> + }
>
> /* Already enabled */
> if (power->vregs_on)
> @@ -2472,8 +2483,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;
>
> --
> 2.34.1
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path
2026-09-29 10:03 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Loic Poulain
@ 2026-09-29 10:19 ` Yepuri Siddu
0 siblings, 0 replies; 6+ messages in thread
From: Yepuri Siddu @ 2026-09-29 10:19 UTC (permalink / raw)
To: Loic Poulain
Cc: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz,
Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Imran Shaik, linux-arm-msm, linux-bluetooth,
linux-kernel, devicetree, quic_mohamull, quic_hbandi
On 9/29/2026 3:33 PM, Loic Poulain wrote:
> On Fri, Sep 25, 2026 at 8:21 AM Yepuri Siddu
> <yepuri.siddu@oss.qualcomm.com> wrote:
>>
>> 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.
>>
>> Signed-off-by: Yepuri Siddu <yepuri.siddu@oss.qualcomm.com>
>> ---
>> 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 7089e9b639b2..489a059e519a 100644
>> --- a/drivers/bluetooth/hci_qca.c
>> +++ b/drivers/bluetooth/hci_qca.c
>> @@ -2265,6 +2265,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;
>> @@ -2324,8 +2326,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);
>
> Why is susclk guarded by the pwrseq? They seem unrelated to me.
You are right. On further thought, the clock belongs to the WCN hardware
and its power sequencing is already handled by the wcn3988-pmu driver.
So the hci_qca driver does not need to manage it at all.
In v2 we dropped the hci_qca changes and moved the clock property to the
wcn3988-pmu node in DTS instead:
https://lore.kernel.org/all/20260929-bt-wcn-clk-enable-v2-1-7a90902f3df5@oss.qualcomm.com/
Thanks,
Siddu
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-29 10:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-25 6:13 [PATCH 0/2] Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra Yepuri Siddu
2026-09-25 6:13 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Yepuri Siddu
2026-09-25 10:37 ` Bluetooth: hci_qca: Add WCN clock enable/disable support for Shikra bluez.test.bot
2026-09-29 10:03 ` [PATCH 1/2] Bluetooth: hci_qca: Add WCN clock management for pwrseq-based power path Loic Poulain
2026-09-29 10:19 ` Yepuri Siddu
2026-09-25 6:13 ` [PATCH 2/2] arm64: dts: qcom: shikra: Add WCN clock to Bluetooth node Yepuri Siddu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox