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>; }; }; 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;