* [PATCH 0/2] qcom: add Asus Vivobook 16 X1607QA DT + LPASS audio clock retry
@ 2026-11-13 13:24 yass27106
2026-11-13 13:24 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA yass27106
0 siblings, 1 reply; 22+ messages in thread
From: yass27106 @ 2026-11-13 13:24 UTC (permalink / raw)
To: andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
Hi,
Two patches against v7.4-rc1 (also sent as pull request 1439 to
qualcomm-linux/kernel, and to the Ubuntu kernel team):
[PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
Initial DT for this Snapdragon X X1P-42-100 (purwa) laptop, including
sound nodes (WSA8845 speakers, WCD938x codec via SoundWire).
[PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
The LPASS WSA/RX/TX/VA macro and Qualcomm SoundWire drivers request
clocks whose providers (va-macro fsgen, q6prm clock controller under
the ADSP GPR service) can register after the consumers probe.
Clock-provider registration does not trigger deferred-probe retries,
so consumers stay deferred indefinitely. Adds a bounded retry
(60 x 500 ms) around the devm_clk_get calls in these drivers.
Both pass scripts/checkpatch.pl with no errors; the DTB builds cleanly.
The DT addition is for the v7.5 merge window; patch 2 is a fix that could
go into v7.4-rc if the maintainers see fit.
Signed-off-by: yass27106-hue <yass27106@users.noreply.github.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
2026-11-13 13:24 [PATCH 0/2] qcom: add Asus Vivobook 16 X1607QA DT + LPASS audio clock retry yass27106
@ 2026-11-13 13:24 ` yass27106
2026-11-13 13:24 ` [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition yass27106
` (2 more replies)
0 siblings, 3 replies; 22+ messages in thread
From: yass27106 @ 2026-11-13 13:24 UTC (permalink / raw)
To: andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
arch/arm64/boot/dts/qcom/Makefile | 1 +
.../x1p42100-asus-vivobook-16-x1607qa.dts | 239 ++++++++++++++++++
2 files changed, 240 insertions(+)
create mode 100644 arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 88230c4e00e..7332a73dbac 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -509,6 +509,7 @@ x1e80100-qcp-el2-dtbs := x1e80100-qcp.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
x1p42100-asus-vivobook-s15-el2-dtbs := x1p42100-asus-vivobook-s15.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-s15.dtb x1p42100-asus-vivobook-s15-el2.dtb
+dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-16-x1607qa.dtb
x1p42100-asus-zenbook-a14-el2-dtbs := x1p42100-asus-zenbook-a14.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-zenbook-a14.dtb x1p42100-asus-zenbook-a14-el2.dtb
x1p42100-asus-zenbook-a14-lcd-el2-dtbs := x1p42100-asus-zenbook-a14-lcd.dtb x1-el2.dtbo
diff --git a/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
new file mode 100644
index 00000000000..fc572d779b3
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
@@ -0,0 +1,239 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/* Hybrid device tree for ASUS Vivobook 16 X1607QA (X1P-42-100).
+ * Base: proven x1p42100-asus-vivobook-s15 (panel, USB, boot path).
+ * Transplanted from x126100-asus-vivobook-16: audio stack
+ * (WCD9385 codec, WSA8845 speakers, soundwire, sndcard) + firmware paths.
+ */
+
+/dts-v1/;
+
+#include "purwa.dtsi"
+#include "x1-asus-vivobook-s15.dtsi"
+
+/ {
+ model = "ASUS Vivobook 16 (X1607QA)";
+ compatible = "asus,vivobook-16-x1607qa", "qcom,x1p42100";
+ chassis-type = "laptop";
+};
+
+/* Speaker VDD-IO rail, from vivobook-16 board regulators */
+&apps_rsc {
+ regulators-0 {
+ vreg_l12b_1p2: ldo12 {
+ regulator-name = "vreg_l12b_1p2";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+ regulator-always-on;
+ };
+ };
+};
+
+&tlmm {
+ wcd_default: wcd-reset-n-active-state {
+ pins = "gpio191";
+ function = "gpio";
+ drive-strength = <16>;
+ bias-disable;
+ output-low;
+ };
+};
+
+&lpass_tlmm {
+ spkr_01_sd_n_active: spkr-01-sd-n-active-state {
+ pins = "gpio12";
+ function = "gpio";
+ drive-strength = <16>;
+ bias-disable;
+ output-low;
+ };
+};
+
+&lpass_vamacro {
+ pinctrl-0 = <&dmic01_default>;
+ pinctrl-names = "default";
+};
+
+/ {
+ wcd938x: audio-codec {
+ compatible = "qcom,wcd9385-codec";
+
+ pinctrl-0 = <&wcd_default>;
+ pinctrl-names = "default";
+
+ qcom,micbias1-microvolt = <1800000>;
+ qcom,micbias2-microvolt = <1800000>;
+ qcom,micbias3-microvolt = <1800000>;
+ qcom,micbias4-microvolt = <1800000>;
+ qcom,mbhc-buttons-vthreshold-microvolt =
+ <75000 150000 237000 500000 500000 500000 500000 500000>;
+ qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
+ qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
+ qcom,rx-device = <&wcd_rx>;
+ qcom,tx-device = <&wcd_tx>;
+
+ reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
+
+ vdd-buck-supply = <&vreg_l15b_1p8>;
+ vdd-rxtx-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l15b_1p8>;
+ vdd-mic-bias-supply = <&vreg_bob1>;
+
+ #sound-dai-cells = <1>;
+ };
+
+ sound {
+ compatible = "qcom,x1e80100-sndcard";
+ model = "X1E80100-ASUS-Vivobook-16";
+ audio-routing = "SpkrLeft IN", "WSA WSA_SPK1 OUT",
+ "SpkrRight IN", "WSA WSA_SPK2 OUT",
+ "IN1_HPHL", "HPHL_OUT",
+ "IN2_HPHR", "HPHR_OUT",
+ "AMIC2", "MIC BIAS2",
+ "VA DMIC0", "MIC BIAS1",
+ "VA DMIC1", "MIC BIAS1",
+ "VA DMIC0", "VA MIC BIAS1",
+ "VA DMIC1", "VA MIC BIAS1",
+ "TX SWR_INPUT1", "ADC2_OUTPUT";
+
+ wcd-playback-dai-link {
+ link-name = "WCD Playback";
+
+ cpu {
+ sound-dai = <&q6apmbedai RX_CODEC_DMA_RX_0>;
+ };
+
+ codec {
+ sound-dai = <&wcd938x 0>, <&swr1 0>, <&lpass_rxmacro 0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ wcd-capture-dai-link {
+ link-name = "WCD Capture";
+
+ cpu {
+ sound-dai = <&q6apmbedai TX_CODEC_DMA_TX_3>;
+ };
+
+ codec {
+ sound-dai = <&wcd938x 1>, <&swr2 1>, <&lpass_txmacro 0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ va-dai-link {
+ link-name = "VA Capture";
+
+ codec {
+ sound-dai = <&lpass_vamacro 0>;
+ };
+
+ cpu {
+ sound-dai = <&q6apmbedai VA_CODEC_DMA_TX_0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ wsa-dai-link {
+ link-name = "WSA Playback";
+
+ codec {
+ sound-dai = <&left_spkr>, <&right_spkr>,
+ <&swr0 0>, <&lpass_wsamacro 0>;
+ };
+
+ cpu {
+ sound-dai = <&q6apmbedai WSA_CODEC_DMA_RX_0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+ };
+};
+
+&swr0 {
+ status = "okay";
+
+ pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
+ pinctrl-names = "default";
+
+ /* WSA8845, Left Speaker */
+ left_spkr: speaker@0,0 {
+ compatible = "sdw20217020400";
+ reg = <0 0>;
+ reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SpkrLeft";
+ vdd-1p8-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l12b_1p2>;
+ qcom,port-mapping = <1 2 3 7 10 13>;
+ };
+
+ /* WSA8845, Right Speaker */
+ right_spkr: speaker@0,1 {
+ compatible = "sdw20217020400";
+ reg = <0 1>;
+ reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SpkrRight";
+ vdd-1p8-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l12b_1p2>;
+ qcom,port-mapping = <4 5 6 7 11 13>;
+ };
+};
+
+&swr1 {
+ status = "okay";
+
+ /* WCD9385 RX */
+ wcd_rx: codec@0,4 {
+ compatible = "sdw20217010d00";
+ reg = <0 4>;
+ qcom,rx-port-mapping = <1 2 3 4 5>;
+ };
+};
+
+&swr2 {
+ status = "okay";
+
+ /* WCD9385 TX */
+ wcd_tx: codec@0,3 {
+ compatible = "sdw20217010d00";
+ reg = <0 3>;
+ qcom,tx-port-mapping = <2 2 3 4>;
+ };
+};
+
+&remoteproc_adsp {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcadsp8380.mbn",
+ "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/adsp_dtbs.elf";
+
+ status = "okay";
+};
+
+&remoteproc_cdsp {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qccdsp8380.mbn",
+ "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/cdsp_dtbs.elf";
+
+ status = "okay";
+};
+
+&gpu {
+ status = "okay";
+
+ zap-shader {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcdxkmsucpurwa.mbn";
+ };
+};
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
2026-11-13 13:24 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA yass27106
@ 2026-11-13 13:24 ` yass27106
2026-11-13 13:43 ` sashiko-bot
2026-11-13 15:04 ` Mark Brown
2026-11-13 13:39 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA sashiko-bot
2026-11-13 15:44 ` Krzysztof Kozlowski
2 siblings, 2 replies; 22+ messages in thread
From: yass27106 @ 2026-11-13 13:24 UTC (permalink / raw)
To: andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
drivers/soundwire/qcom.c | 37 +++++++++++++++++++++++-
sound/soc/codecs/lpass-rx-macro.c | 45 ++++++++++++++++++++++++++----
sound/soc/codecs/lpass-tx-macro.c | 45 ++++++++++++++++++++++++++----
sound/soc/codecs/lpass-va-macro.c | 43 +++++++++++++++++++++++++---
sound/soc/codecs/lpass-wsa-macro.c | 45 ++++++++++++++++++++++++++----
5 files changed, 195 insertions(+), 20 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 6e0c5fb10ef..cb50cf239cd 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -21,6 +21,41 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include "bus.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define SWRM_COMP_SW_RESET 0x008
#define SWRM_COMP_STATUS 0x014
@@ -1669,7 +1704,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
goto err_init;
}
- ctrl->hclk = devm_clk_get(dev, "iface");
+ ctrl->hclk = clk_get_retry(dev, "iface");
if (IS_ERR(ctrl->hclk)) {
ret = dev_err_probe(dev, PTR_ERR(ctrl->hclk), "unable to get iface clock\n");
goto err_init;
diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index c41eb8de616..5d893960dd8 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -18,6 +18,41 @@
#include <linux/clk-provider.h>
#include "lpass-macro-common.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define CDC_RX_TOP_TOP_CFG0 (0x0000)
#define CDC_RX_TOP_SWR_CTRL (0x0008)
@@ -3780,25 +3815,25 @@ static int rx_macro_probe(struct platform_device *pdev)
if (!rx)
return -ENOMEM;
- rx->macro = devm_clk_get_optional(dev, "macro");
+ rx->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(rx->macro))
return dev_err_probe(dev, PTR_ERR(rx->macro), "unable to get macro clock\n");
- rx->dcodec = devm_clk_get_optional(dev, "dcodec");
+ rx->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(rx->dcodec))
return dev_err_probe(dev, PTR_ERR(rx->dcodec), "unable to get dcodec clock\n");
- rx->mclk = devm_clk_get(dev, "mclk");
+ rx->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(rx->mclk))
return dev_err_probe(dev, PTR_ERR(rx->mclk), "unable to get mclk clock\n");
if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- rx->npl = devm_clk_get(dev, "npl");
+ rx->npl = clk_get_retry(dev, "npl");
if (IS_ERR(rx->npl))
return dev_err_probe(dev, PTR_ERR(rx->npl), "unable to get npl clock\n");
}
- rx->fsgen = devm_clk_get(dev, "fsgen");
+ rx->fsgen = clk_get_retry(dev, "fsgen");
if (IS_ERR(rx->fsgen))
return dev_err_probe(dev, PTR_ERR(rx->fsgen), "unable to get fsgen clock\n");
diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
index 6deaaabe43a..4b8635cc2b2 100644
--- a/sound/soc/codecs/lpass-tx-macro.c
+++ b/sound/soc/codecs/lpass-tx-macro.c
@@ -16,6 +16,41 @@
#include <linux/clk-provider.h>
#include "lpass-macro-common.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define CDC_TX_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
#define CDC_TX_MCLK_EN_MASK BIT(0)
@@ -2258,25 +2293,25 @@ static int tx_macro_probe(struct platform_device *pdev)
tx->data = device_get_match_data(dev);
- tx->macro = devm_clk_get_optional(dev, "macro");
+ tx->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(tx->macro))
return dev_err_probe(dev, PTR_ERR(tx->macro), "unable to get macro clock\n");
- tx->dcodec = devm_clk_get_optional(dev, "dcodec");
+ tx->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(tx->dcodec))
return dev_err_probe(dev, PTR_ERR(tx->dcodec), "unable to get dcodec clock\n");
- tx->mclk = devm_clk_get(dev, "mclk");
+ tx->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(tx->mclk))
return dev_err_probe(dev, PTR_ERR(tx->mclk), "unable to get mclk clock\n");
if (tx->data->flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- tx->npl = devm_clk_get(dev, "npl");
+ tx->npl = clk_get_retry(dev, "npl");
if (IS_ERR(tx->npl))
return dev_err_probe(dev, PTR_ERR(tx->npl), "unable to get npl clock\n");
}
- tx->fsgen = devm_clk_get(dev, "fsgen");
+ tx->fsgen = clk_get_retry(dev, "fsgen");
if (IS_ERR(tx->fsgen))
return dev_err_probe(dev, PTR_ERR(tx->fsgen), "unable to get fsgen clock\n");
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index 03d6434a4a1..fda1bbada11 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -19,6 +19,41 @@
#include <sound/tlv.h>
#include "lpass-macro-common.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
/* VA macro registers */
#define CDC_VA_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
@@ -1557,15 +1592,15 @@ static int va_macro_probe(struct platform_device *pdev)
va->dev = dev;
- va->macro = devm_clk_get_optional(dev, "macro");
+ va->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(va->macro))
return dev_err_probe(dev, PTR_ERR(va->macro), "unable to get macro clock\n");
- va->dcodec = devm_clk_get_optional(dev, "dcodec");
+ va->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(va->dcodec))
return dev_err_probe(dev, PTR_ERR(va->dcodec), "unable to get dcodec clock\n");
- va->mclk = devm_clk_get(dev, "mclk");
+ va->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(va->mclk))
return dev_err_probe(dev, PTR_ERR(va->mclk), "unable to get mclk clock\n");
@@ -1610,7 +1645,7 @@ static int va_macro_probe(struct platform_device *pdev)
goto err;
if (va->has_npl_clk) {
- va->npl = devm_clk_get(dev, "npl");
+ va->npl = clk_get_retry(dev, "npl");
if (IS_ERR(va->npl)) {
ret = PTR_ERR(va->npl);
goto err;
diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
index 899c8bee464..437a0876a8b 100644
--- a/sound/soc/codecs/lpass-wsa-macro.c
+++ b/sound/soc/codecs/lpass-wsa-macro.c
@@ -19,6 +19,41 @@
#include "lpass-macro-common.h"
#include "lpass-wsa-macro.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
#define CDC_WSA_MCLK_EN_MASK BIT(0)
@@ -2701,25 +2736,25 @@ static int wsa_macro_probe(struct platform_device *pdev)
if (!wsa)
return -ENOMEM;
- wsa->macro = devm_clk_get_optional(dev, "macro");
+ wsa->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(wsa->macro))
return dev_err_probe(dev, PTR_ERR(wsa->macro), "unable to get macro clock\n");
- wsa->dcodec = devm_clk_get_optional(dev, "dcodec");
+ wsa->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(wsa->dcodec))
return dev_err_probe(dev, PTR_ERR(wsa->dcodec), "unable to get dcodec clock\n");
- wsa->mclk = devm_clk_get(dev, "mclk");
+ wsa->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(wsa->mclk))
return dev_err_probe(dev, PTR_ERR(wsa->mclk), "unable to get mclk clock\n");
if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- wsa->npl = devm_clk_get(dev, "npl");
+ wsa->npl = clk_get_retry(dev, "npl");
if (IS_ERR(wsa->npl))
return dev_err_probe(dev, PTR_ERR(wsa->npl), "unable to get npl clock\n");
}
- wsa->fsgen = devm_clk_get(dev, "fsgen");
+ wsa->fsgen = clk_get_retry(dev, "fsgen");
if (IS_ERR(wsa->fsgen))
return dev_err_probe(dev, PTR_ERR(wsa->fsgen), "unable to get fsgen clock\n");
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
2026-11-13 13:24 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA yass27106
2026-11-13 13:24 ` [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition yass27106
@ 2026-11-13 13:39 ` sashiko-bot
2026-11-13 15:44 ` Krzysztof Kozlowski
2 siblings, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 13:39 UTC (permalink / raw)
To: yass27106; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 7 potential
issues to consider:
- [High] arm64: dts: qcom: missing Signed-off-by trailer and commit
message body
- [Medium] arm64: dts: qcom: missing /delete-node/ for pmc8380_6 on
Purwa X1P42100
- [Medium] arm64: dts: qcom: missing dmic-sample-rate and
vdd-micb-supply on lpass_vamacro
- [Medium] arm64: dts: qcom: Vivobook 16 DT inherits Vivobook S 15 panel
and board dtsi
- [Medium] arm64: dts: qcom: Makefile missing x1-el2.dtbo target and
alphabetical order
- [Low] arm64: dts: qcom: undocumented compatible
asus,vivobook-16-x1607qa in bindings
- [Low] arm64: dts: qcom: split root nodes, unsorted labels, and gpu
override style
--
commit 273985d644ee175b794950960be28ab5824da749
Author: yass27106 <yass27106@gmail.com>
> arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
>
> arch/arm64/boot/dts/qcom/Makefile | 1 +
> .../x1p42100-asus-vivobook-16-x1607qa.dts | 239 ++++++++++++++++++
> 2 files changed, 240 insertions(+)
> create mode 100644 arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
[Severity: High]
This commit is missing a Signed-off-by: trailer, uses a handle instead of
a real name in the Author header, and has a raw diffstat in place of a
commit description explaining the hardware and supported components.
> diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> index 88230c4e00ea9..7332a73dbac71 100644
> --- a/arch/arm64/boot/dts/qcom/Makefile
> +++ b/arch/arm64/boot/dts/qcom/Makefile
> @@ -509,6 +509,7 @@ x1e80100-qcp-el2-dtbs := x1e80100-qcp.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> x1p42100-asus-vivobook-s15-el2-dtbs := x1p42100-asus-vivobook-s15.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-s15.dtb x1p42100-asus-vivobook-s15-el2.dtb
> +dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-16-x1607qa.dtb
> x1p42100-asus-zenbook-a14-el2-dtbs := x1p42100-asus-zenbook-a14.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-zenbook-a14.dtb x1p42100-asus-zenbook-a14-el2.dtb
> x1p42100-asus-zenbook-a14-lcd-el2-dtbs := x1p42100-asus-zenbook-a14-lcd.dtb x1-el2.dtbo
[Severity: Medium]
Should this also define x1p42100-asus-vivobook-16-x1607qa-el2-dtbs and add
x1p42100-asus-vivobook-16-x1607qa-el2.dtb like the other X1E/X1P boards?
Without the composite rule, the build neither produces the -el2.dtb image
nor compiles the base DTB with symbol metadata for x1-el2.dtbo, which is
needed for EL2 boot. Also, x1p42100-asus-vivobook-16-x1607qa belongs
before x1p42100-asus-vivobook-s15 in alphabetical order.
> diff --git a/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> new file mode 100644
> index 0000000000000..fc572d779b311
> --- /dev/null
> +++ b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> @@ -0,0 +1,239 @@
> +// SPDX-License-Identifier: BSD-3-Clause
> +/* Hybrid device tree for ASUS Vivobook 16 X1607QA (X1P-42-100).
> + * Base: proven x1p42100-asus-vivobook-s15 (panel, USB, boot path).
> + * Transplanted from x126100-asus-vivobook-16: audio stack
> + * (WCD9385 codec, WSA8845 speakers, soundwire, sndcard) + firmware paths.
> + */
> +
> +/dts-v1/;
> +
> +#include "purwa.dtsi"
> +#include "x1-asus-vivobook-s15.dtsi"
[Severity: Medium]
Does including x1-asus-vivobook-s15.dtsi without deleting &pmc8380_6,
&pmc8380_6_thermal, and &pmc8380_6_die_temp leave the third CPU cluster's
PMIC enabled on Purwa? x1-asus-vivobook-s15.dtsi pulls in
hamoa-pmics.dtsi, so on 8-core X1P42100 where that PMIC is unpopulated,
the SPMI, VADC, and thermal drivers will probe and poll a non-existent
device at USID 6 unless those three nodes are deleted as in
x1p42100-asus-vivobook-s15.dts.
[Severity: Medium]
Does including x1-asus-vivobook-s15.dtsi directly also leave the 16-inch
16:10 Vivobook 16 (X1607QA) configured with the Vivobook S 15's 15.6-inch
16:9 2880x1620 eDP panel ("samsung,atna56ac03", "samsung,atna33xc20")
under &mdss_dp3 and other S5507-specific board definitions?
> +
> +/ {
> + model = "ASUS Vivobook 16 (X1607QA)";
> + compatible = "asus,vivobook-16-x1607qa", "qcom,x1p42100";
[Severity: Low]
"asus,vivobook-16-x1607qa" is not documented under the qcom,x1p42100
entry in Documentation/devicetree/bindings/arm/qcom.yaml, which causes
make dtbs_check to fail.
[ ... ]
> +&lpass_vamacro {
> + pinctrl-0 = <&dmic01_default>;
> + pinctrl-names = "default";
> +};
[Severity: Medium]
Should &lpass_vamacro also specify qcom,dmic-sample-rate and
vdd-micb-supply? Without them, va_macro_probe() logs an error
("qcom,dmic-sample-rate dt entry missing") and ASoC DAPM substitutes a
dummy regulator for the vdd-micb widget instead of enabling the DMIC
supply rail.
> +
> +/ {
> + wcd938x: audio-codec {
> + compatible = "qcom,wcd9385-codec";
[ ... ]
> +&gpu {
> + status = "okay";
> +
> + zap-shader {
> + firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcdxkmsucpurwa.mbn";
> + };
> +};
[Severity: Low]
This isn't a bug, but the second / { ... }; block above should be merged
into the root node at the top of the file, the &label overrides should be
sorted alphabetically, and the zap shader override can reference
&gpu_zap_shader directly instead of repeating status = "okay" on &gpu
(which is already enabled in x1-asus-vivobook-s15.dtsi).
--
Sashiko AI review · https://sashiko.dev/#/patchset/01b2c920412848ab85493acc2d4f5fc1@gmail.com?part=1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
2026-11-13 13:24 ` [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition yass27106
@ 2026-11-13 13:43 ` sashiko-bot
2026-11-13 15:04 ` Mark Brown
1 sibling, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 13:43 UTC (permalink / raw)
To: yass27106; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 4 potential
issues to consider:
- [High] ASoC: qcom: 30s sleep in clk_get_retry() stalls sequential
probe
- [High] soundwire: qcom: unused clk_get_retry_optional() breaks -Werror
build
- [High] ASoC: qcom: missing Signed-off-by trailer and commit message
body
- [Low] ASoC: qcom: duplicate clk_get_retry() helpers across five
drivers
It also noticed 1 related pre-existing issue this patch does not
introduce:
- [High] soundwire: qcom: ignored clk_prepare_enable() return values [1]
--
commit e7d8a177bfe78eb7a13933e19bc2397f7ed88249
Author: yass27106 <yass27106@gmail.com>
> ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
>
> drivers/soundwire/qcom.c | 37 +++++++++++++++++++++++-
> sound/soc/codecs/lpass-rx-macro.c | 45 ++++++++++++++++++++++++++----
> sound/soc/codecs/lpass-tx-macro.c | 45 ++++++++++++++++++++++++++----
> sound/soc/codecs/lpass-va-macro.c | 43 +++++++++++++++++++++++++---
> sound/soc/codecs/lpass-wsa-macro.c | 45 ++++++++++++++++++++++++++----
> 5 files changed, 195 insertions(+), 20 deletions(-)
[Severity: High]
This commit is missing a Signed-off-by trailer and a changelog description
explaining the problem and the reason for the change; the commit body only
contains a diffstat.
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index c31d921f679f9..afb71624dae2a 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -21,6 +21,41 @@
> #include <sound/pcm_params.h>
> #include <sound/soc.h>
> #include "bus.h"
> +#include <linux/delay.h>
> +
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider registration
> + * does not trigger deferred-probe retries, so a consumer that loses the
> + * probe-order race stays deferred forever. Wait up to 30 s for providers
> + * that are registered milliseconds later.
> + */
> +static struct clk *clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
[Severity: High]
Won't sleeping for 30 seconds in clk_get_retry() and clk_get_retry_optional()
on -EPROBE_DEFER stall the same thread that needs to probe the clock
provider?
When any clock provider finishes probing, really_probe() -> driver_bound()
calls driver_deferred_probe_trigger() to schedule deferred_probe_work.
Because none of these drivers set PROBE_PREFER_ASYNCHRONOUS, both initial
probing in do_initcalls() and retries in deferred_probe_work_func() run
sequentially on a single thread.
In both link order and Device Tree node order, consumers are queued before
their suppliers: wsa_macro_probe(), rx_macro_probe(), and tx_macro_probe()
request the fsgen clock registered by va_macro_probe(), and qcom_swrm_probe()
requests the iface clock registered by the macro drivers. Sleeping inside the
consumer's probe callback blocks the initcall or deferred_probe_work thread
from advancing to probe the supplier, guaranteeing the clock cannot appear
during the 30-second sleep while holding device_lock(dev) (and active power
domains in va_macro_probe()).
> +
> +static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get_optional(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
[Severity: High]
Does clk_get_retry_optional() have any callers in drivers/soundwire/qcom.c?
qcom_swrm_probe() only calls clk_get_retry(), so defining
clk_get_retry_optional() here triggers a -Wunused-function warning and breaks
builds with CONFIG_WERROR=y.
> @@ -1669,7 +1704,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
> goto err_init;
> }
>
> - ctrl->hclk = devm_clk_get(dev, "iface");
> + ctrl->hclk = clk_get_retry(dev, "iface");
> if (IS_ERR(ctrl->hclk)) {
> ret = dev_err_probe(dev, PTR_ERR(ctrl->hclk), "unable to get iface clock\n");
> goto err_init;
[Severity: High]
This problem wasn't introduced by this patch, but clk_prepare_enable() on
ctrl->hclk is called without checking its return value in qcom_swrm_probe(),
qcom_swrm_irq_handler(), and swrm_runtime_resume() [1]:
drivers/soundwire/qcom.c:qcom_swrm_irq_handler() {
...
clk_prepare_enable(ctrl->hclk);
ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
&intr_sts);
...
}
If clk_prepare_enable() fails, subsequent MMIO reads and writes access
unclocked SoundWire controller registers, triggering a synchronous external
abort on Qualcomm platforms.
> diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
> index ab8a1c2b0489b..c953054eb7a38 100644
> --- a/sound/soc/codecs/lpass-rx-macro.c
> +++ b/sound/soc/codecs/lpass-rx-macro.c
> @@ -18,6 +18,41 @@
> #include <linux/clk-provider.h>
>
> #include "lpass-macro-common.h"
> +#include <linux/delay.h>
> +
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider registration
> + * does not trigger deferred-probe retries, so a consumer that loses the
> + * probe-order race stays deferred forever. Wait up to 30 s for providers
> + * that are registered milliseconds later.
> + */
> +static struct clk *clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
> +
> +static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get_optional(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
[Severity: Low]
clk_get_retry() and clk_get_retry_optional() are duplicated verbatim across
drivers/soundwire/qcom.c, lpass-rx-macro.c, lpass-tx-macro.c,
lpass-va-macro.c, and lpass-wsa-macro.c, even though the four LPASS macro
drivers already share lpass-macro-common.h.
[1] https://sashiko.dev/#/bug/linux-f65cddc9-08ff-4531-9acf-76981d74d914
--
Sashiko AI review · https://sashiko.dev/#/patchset/01b2c920412848ab85493acc2d4f5fc1@gmail.com?part=2
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
2026-11-13 13:24 ` [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition yass27106
2026-11-13 13:43 ` sashiko-bot
@ 2026-11-13 15:04 ` Mark Brown
1 sibling, 0 replies; 22+ messages in thread
From: Mark Brown @ 2026-11-13 15:04 UTC (permalink / raw)
To: yass27106
Cc: andersson, broonie, srini, konradybcio, robh, krzk+dt, conor+dt,
vkoul, tiwai, perex, lgirdwood, pierre-louis.bossart,
yung-chuan.liao, abelvesa, linux-arm-msm, linux-sound, devicetree,
linux-kernel
> drivers/soundwire/qcom.c | 37 +++++++++++++++++++++++-
> sound/soc/codecs/lpass-rx-macro.c | 45 ++++++++++++++++++++++++++----
> sound/soc/codecs/lpass-tx-macro.c | 45 ++++++++++++++++++++++++++----
> sound/soc/codecs/lpass-va-macro.c | 43 +++++++++++++++++++++++++---
> sound/soc/codecs/lpass-wsa-macro.c | 45 ++++++++++++++++++++++++++----
> 5 files changed, 195 insertions(+), 20 deletions(-)
You've not provided a Signed-off-by for this so I can't do anything with
it, please see Documentation/process/submitting-patches.rst for details
on what this is and why it's important.
There's also no changelog here.
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider registration
> + * does not trigger deferred-probe retries, so a consumer that loses the
> + * probe-order race stays deferred forever. Wait up to 30 s for providers
> + * that are registered milliseconds later.
> + */
> +static struct clk *clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
This obviously isn't something that should be open coded in drivers,
this is going to be happening all over the place. The clock API and
driver core need to be adjusted so that we trigger deferred probe runs
when new resources appear.
--
Mark Brown <broonie@kernel.org>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
2026-11-13 13:24 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA yass27106
2026-11-13 13:24 ` [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition yass27106
2026-11-13 13:39 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA sashiko-bot
@ 2026-11-13 15:44 ` Krzysztof Kozlowski
2026-11-13 20:33 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA — v2 series Daniel Carter
2 siblings, 1 reply; 22+ messages in thread
From: Krzysztof Kozlowski @ 2026-11-13 15:44 UTC (permalink / raw)
To: yass27106, andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel
On 13/11/2026 14:24, yass27106 wrote:
> arch/arm64/boot/dts/qcom/Makefile | 1 +
Please run scripts/checkpatch.pl on the patches and fix reported
warnings. After that, run also 'scripts/checkpatch.pl --strict' on the
patches and (probably) fix more warnings. Some warnings can be ignored,
especially from --strict run, but the code here looks like it needs a
fix. Feel free to get in touch if the warning is not clear.
Please read submitting patches document to understand DCO.
Looks like completely corrupted anonymous patch.
> .../x1p42100-asus-vivobook-16-x1607qa.dts | 239 ++++++++++++++++++
> 2 files changed, 240 insertions(+)
> create mode 100644 arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
>
> diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> index 88230c4e00e..7332a73dbac 100644
> --- a/arch/arm64/boot/dts/qcom/Makefile
> +++ b/arch/arm64/boot/dts/qcom/Makefile
> @@ -509,6 +509,7 @@ x1e80100-qcp-el2-dtbs := x1e80100-qcp.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> x1p42100-asus-vivobook-s15-el2-dtbs := x1p42100-asus-vivobook-s15.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-s15.dtb x1p42100-asus-vivobook-s15-el2.dtb
> +dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-16-x1607qa.dtb
> x1p42100-asus-zenbook-a14-el2-dtbs := x1p42100-asus-zenbook-a14.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-zenbook-a14.dtb x1p42100-asus-zenbook-a14-el2.dtb
> x1p42100-asus-zenbook-a14-lcd-el2-dtbs := x1p42100-asus-zenbook-a14-lcd.dtb x1-el2.dtbo
> diff --git a/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> new file mode 100644
> index 00000000000..fc572d779b3
> --- /dev/null
> +++ b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> @@ -0,0 +1,239 @@
> +// SPDX-License-Identifier: BSD-3-Clause
> +/* Hybrid device tree for ASUS Vivobook 16 X1607QA (X1P-42-100).
> + * Base: proven x1p42100-asus-vivobook-s15 (panel, USB, boot path).
> + * Transplanted from x126100-asus-vivobook-16: audio stack
> + * (WCD9385 codec, WSA8845 speakers, soundwire, sndcard) + firmware paths.
> + */
> +
> +/dts-v1/;
> +
> +#include "purwa.dtsi"
> +#include "x1-asus-vivobook-s15.dtsi"
> +
> +/ {
> + model = "ASUS Vivobook 16 (X1607QA)";
> + compatible = "asus,vivobook-16-x1607qa", "qcom,x1p42100";
Missing bindings.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA — v2 series
2026-11-13 15:44 ` Krzysztof Kozlowski
@ 2026-11-13 20:33 ` Daniel Carter
2026-11-13 20:33 ` [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
2026-11-13 21:02 ` [PATCH v2 1/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA - v3 series Daniel Carter
0 siblings, 2 replies; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 20:33 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
Hi Krzysztof, hi all,
v2 of the series, addressing your review of v1:
- The binding documentation is now a separate patch (dt-bindings first),
as required by Documentation/devicetree/bindings/submitting-patches.rst.
- The board compatible 'asus,vivobook-16-x1607qa' is documented in
Documentation/devicetree/bindings/arm/qcom.yaml.
- scripts/checkpatch.pl passes with no errors on all patches; --strict
leaves only the MAINTAINERS note on the new-file patch.
- The DCO sign-off is now a real-name sign-off; apologies for the
pseudonymous v1.
Series:
[1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA
[2/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
[3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
Also open as pull request 1439 at github.com/qualcomm-linux/kernel.
Best regards,
Daniel Carter
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA
2026-11-13 20:33 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA — v2 series Daniel Carter
@ 2026-11-13 20:33 ` Daniel Carter
2026-11-13 20:33 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for " Daniel Carter
2026-11-13 20:39 ` [PATCH v2 1/3] dt-bindings: qcom: document " sashiko-bot
2026-11-13 21:02 ` [PATCH v2 1/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA - v3 series Daniel Carter
1 sibling, 2 replies; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 20:33 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
Documentation/devicetree/bindings/arm/qcom.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/arm/qcom.yaml b/Documentation/devicetree/bindings/arm/qcom.yaml
index 121ca557ce1..d22f1b0b4ef 100644
--- a/Documentation/devicetree/bindings/arm/qcom.yaml
+++ b/Documentation/devicetree/bindings/arm/qcom.yaml
@@ -1306,6 +1306,7 @@ properties:
- items:
- enum:
+ - asus,vivobook-16-x1607qa
- asus,vivobook-s15-x1p4
- hp,omnibook-x14-fe1
- lenovo,thinkbook-16
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 2/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
2026-11-13 20:33 ` [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
@ 2026-11-13 20:33 ` Daniel Carter
2026-11-13 20:33 ` [PATCH v2 3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition Daniel Carter
2026-11-13 20:51 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA sashiko-bot
2026-11-13 20:39 ` [PATCH v2 1/3] dt-bindings: qcom: document " sashiko-bot
1 sibling, 2 replies; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 20:33 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
arch/arm64/boot/dts/qcom/Makefile | 1 +
.../x1p42100-asus-vivobook-16-x1607qa.dts | 237 ++++++++++++++++++
2 files changed, 238 insertions(+)
create mode 100644 arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 88230c4e00e..7332a73dbac 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -509,6 +509,7 @@ x1e80100-qcp-el2-dtbs := x1e80100-qcp.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
x1p42100-asus-vivobook-s15-el2-dtbs := x1p42100-asus-vivobook-s15.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-s15.dtb x1p42100-asus-vivobook-s15-el2.dtb
+dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-16-x1607qa.dtb
x1p42100-asus-zenbook-a14-el2-dtbs := x1p42100-asus-zenbook-a14.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-zenbook-a14.dtb x1p42100-asus-zenbook-a14-el2.dtb
x1p42100-asus-zenbook-a14-lcd-el2-dtbs := x1p42100-asus-zenbook-a14-lcd.dtb x1-el2.dtbo
diff --git a/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
new file mode 100644
index 00000000000..0092ae3db9c
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
@@ -0,0 +1,237 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, yass27106-hue <yass27106@users.noreply.github.com>
+ */
+
+/dts-v1/;
+
+#include "purwa.dtsi"
+#include "x1-asus-vivobook-s15.dtsi"
+
+/ {
+ model = "ASUS Vivobook 16 (X1607QA)";
+ compatible = "asus,vivobook-16-x1607qa", "qcom,x1p42100";
+ chassis-type = "laptop";
+};
+
+/* Speaker VDD-IO rail, from vivobook-16 board regulators */
+&apps_rsc {
+ regulators-0 {
+ vreg_l12b_1p2: ldo12 {
+ regulator-name = "vreg_l12b_1p2";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+ regulator-always-on;
+ };
+ };
+};
+
+&tlmm {
+ wcd_default: wcd-reset-n-active-state {
+ pins = "gpio191";
+ function = "gpio";
+ drive-strength = <16>;
+ bias-disable;
+ output-low;
+ };
+};
+
+&lpass_tlmm {
+ spkr_01_sd_n_active: spkr-01-sd-n-active-state {
+ pins = "gpio12";
+ function = "gpio";
+ drive-strength = <16>;
+ bias-disable;
+ output-low;
+ };
+};
+
+&lpass_vamacro {
+ pinctrl-0 = <&dmic01_default>;
+ pinctrl-names = "default";
+};
+
+/ {
+ wcd938x: audio-codec {
+ compatible = "qcom,wcd9385-codec";
+
+ pinctrl-0 = <&wcd_default>;
+ pinctrl-names = "default";
+
+ qcom,micbias1-microvolt = <1800000>;
+ qcom,micbias2-microvolt = <1800000>;
+ qcom,micbias3-microvolt = <1800000>;
+ qcom,micbias4-microvolt = <1800000>;
+ qcom,mbhc-buttons-vthreshold-microvolt =
+ <75000 150000 237000 500000 500000 500000 500000 500000>;
+ qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
+ qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
+ qcom,rx-device = <&wcd_rx>;
+ qcom,tx-device = <&wcd_tx>;
+
+ reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
+
+ vdd-buck-supply = <&vreg_l15b_1p8>;
+ vdd-rxtx-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l15b_1p8>;
+ vdd-mic-bias-supply = <&vreg_bob1>;
+
+ #sound-dai-cells = <1>;
+ };
+
+ sound {
+ compatible = "qcom,x1e80100-sndcard";
+ model = "X1E80100-ASUS-Vivobook-16";
+ audio-routing = "SpkrLeft IN", "WSA WSA_SPK1 OUT",
+ "SpkrRight IN", "WSA WSA_SPK2 OUT",
+ "IN1_HPHL", "HPHL_OUT",
+ "IN2_HPHR", "HPHR_OUT",
+ "AMIC2", "MIC BIAS2",
+ "VA DMIC0", "MIC BIAS1",
+ "VA DMIC1", "MIC BIAS1",
+ "VA DMIC0", "VA MIC BIAS1",
+ "VA DMIC1", "VA MIC BIAS1",
+ "TX SWR_INPUT1", "ADC2_OUTPUT";
+
+ wcd-playback-dai-link {
+ link-name = "WCD Playback";
+
+ cpu {
+ sound-dai = <&q6apmbedai RX_CODEC_DMA_RX_0>;
+ };
+
+ codec {
+ sound-dai = <&wcd938x 0>, <&swr1 0>, <&lpass_rxmacro 0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ wcd-capture-dai-link {
+ link-name = "WCD Capture";
+
+ cpu {
+ sound-dai = <&q6apmbedai TX_CODEC_DMA_TX_3>;
+ };
+
+ codec {
+ sound-dai = <&wcd938x 1>, <&swr2 1>, <&lpass_txmacro 0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ va-dai-link {
+ link-name = "VA Capture";
+
+ codec {
+ sound-dai = <&lpass_vamacro 0>;
+ };
+
+ cpu {
+ sound-dai = <&q6apmbedai VA_CODEC_DMA_TX_0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ wsa-dai-link {
+ link-name = "WSA Playback";
+
+ codec {
+ sound-dai = <&left_spkr>, <&right_spkr>,
+ <&swr0 0>, <&lpass_wsamacro 0>;
+ };
+
+ cpu {
+ sound-dai = <&q6apmbedai WSA_CODEC_DMA_RX_0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+ };
+};
+
+&swr0 {
+ status = "okay";
+
+ pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
+ pinctrl-names = "default";
+
+ /* WSA8845, Left Speaker */
+ left_spkr: speaker@0,0 {
+ compatible = "sdw20217020400";
+ reg = <0 0>;
+ reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SpkrLeft";
+ vdd-1p8-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l12b_1p2>;
+ qcom,port-mapping = <1 2 3 7 10 13>;
+ };
+
+ /* WSA8845, Right Speaker */
+ right_spkr: speaker@0,1 {
+ compatible = "sdw20217020400";
+ reg = <0 1>;
+ reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SpkrRight";
+ vdd-1p8-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l12b_1p2>;
+ qcom,port-mapping = <4 5 6 7 11 13>;
+ };
+};
+
+&swr1 {
+ status = "okay";
+
+ /* WCD9385 RX */
+ wcd_rx: codec@0,4 {
+ compatible = "sdw20217010d00";
+ reg = <0 4>;
+ qcom,rx-port-mapping = <1 2 3 4 5>;
+ };
+};
+
+&swr2 {
+ status = "okay";
+
+ /* WCD9385 TX */
+ wcd_tx: codec@0,3 {
+ compatible = "sdw20217010d00";
+ reg = <0 3>;
+ qcom,tx-port-mapping = <2 2 3 4>;
+ };
+};
+
+&remoteproc_adsp {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcadsp8380.mbn",
+ "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/adsp_dtbs.elf";
+
+ status = "okay";
+};
+
+&remoteproc_cdsp {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qccdsp8380.mbn",
+ "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/cdsp_dtbs.elf";
+
+ status = "okay";
+};
+
+&gpu {
+ status = "okay";
+
+ zap-shader {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcdxkmsucpurwa.mbn";
+ };
+};
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
2026-11-13 20:33 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for " Daniel Carter
@ 2026-11-13 20:33 ` Daniel Carter
2026-11-13 20:47 ` sashiko-bot
2026-11-13 20:51 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA sashiko-bot
1 sibling, 1 reply; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 20:33 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, krzk+dt, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
drivers/soundwire/qcom.c | 37 +++++++++++++++++++++++-
sound/soc/codecs/lpass-rx-macro.c | 45 ++++++++++++++++++++++++++----
sound/soc/codecs/lpass-tx-macro.c | 45 ++++++++++++++++++++++++++----
sound/soc/codecs/lpass-va-macro.c | 43 +++++++++++++++++++++++++---
sound/soc/codecs/lpass-wsa-macro.c | 45 ++++++++++++++++++++++++++----
5 files changed, 195 insertions(+), 20 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 6e0c5fb10ef..cb50cf239cd 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -21,6 +21,41 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include "bus.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define SWRM_COMP_SW_RESET 0x008
#define SWRM_COMP_STATUS 0x014
@@ -1669,7 +1704,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
goto err_init;
}
- ctrl->hclk = devm_clk_get(dev, "iface");
+ ctrl->hclk = clk_get_retry(dev, "iface");
if (IS_ERR(ctrl->hclk)) {
ret = dev_err_probe(dev, PTR_ERR(ctrl->hclk), "unable to get iface clock\n");
goto err_init;
diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index c41eb8de616..5d893960dd8 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -18,6 +18,41 @@
#include <linux/clk-provider.h>
#include "lpass-macro-common.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define CDC_RX_TOP_TOP_CFG0 (0x0000)
#define CDC_RX_TOP_SWR_CTRL (0x0008)
@@ -3780,25 +3815,25 @@ static int rx_macro_probe(struct platform_device *pdev)
if (!rx)
return -ENOMEM;
- rx->macro = devm_clk_get_optional(dev, "macro");
+ rx->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(rx->macro))
return dev_err_probe(dev, PTR_ERR(rx->macro), "unable to get macro clock\n");
- rx->dcodec = devm_clk_get_optional(dev, "dcodec");
+ rx->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(rx->dcodec))
return dev_err_probe(dev, PTR_ERR(rx->dcodec), "unable to get dcodec clock\n");
- rx->mclk = devm_clk_get(dev, "mclk");
+ rx->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(rx->mclk))
return dev_err_probe(dev, PTR_ERR(rx->mclk), "unable to get mclk clock\n");
if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- rx->npl = devm_clk_get(dev, "npl");
+ rx->npl = clk_get_retry(dev, "npl");
if (IS_ERR(rx->npl))
return dev_err_probe(dev, PTR_ERR(rx->npl), "unable to get npl clock\n");
}
- rx->fsgen = devm_clk_get(dev, "fsgen");
+ rx->fsgen = clk_get_retry(dev, "fsgen");
if (IS_ERR(rx->fsgen))
return dev_err_probe(dev, PTR_ERR(rx->fsgen), "unable to get fsgen clock\n");
diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
index 6deaaabe43a..4b8635cc2b2 100644
--- a/sound/soc/codecs/lpass-tx-macro.c
+++ b/sound/soc/codecs/lpass-tx-macro.c
@@ -16,6 +16,41 @@
#include <linux/clk-provider.h>
#include "lpass-macro-common.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define CDC_TX_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
#define CDC_TX_MCLK_EN_MASK BIT(0)
@@ -2258,25 +2293,25 @@ static int tx_macro_probe(struct platform_device *pdev)
tx->data = device_get_match_data(dev);
- tx->macro = devm_clk_get_optional(dev, "macro");
+ tx->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(tx->macro))
return dev_err_probe(dev, PTR_ERR(tx->macro), "unable to get macro clock\n");
- tx->dcodec = devm_clk_get_optional(dev, "dcodec");
+ tx->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(tx->dcodec))
return dev_err_probe(dev, PTR_ERR(tx->dcodec), "unable to get dcodec clock\n");
- tx->mclk = devm_clk_get(dev, "mclk");
+ tx->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(tx->mclk))
return dev_err_probe(dev, PTR_ERR(tx->mclk), "unable to get mclk clock\n");
if (tx->data->flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- tx->npl = devm_clk_get(dev, "npl");
+ tx->npl = clk_get_retry(dev, "npl");
if (IS_ERR(tx->npl))
return dev_err_probe(dev, PTR_ERR(tx->npl), "unable to get npl clock\n");
}
- tx->fsgen = devm_clk_get(dev, "fsgen");
+ tx->fsgen = clk_get_retry(dev, "fsgen");
if (IS_ERR(tx->fsgen))
return dev_err_probe(dev, PTR_ERR(tx->fsgen), "unable to get fsgen clock\n");
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index 03d6434a4a1..fda1bbada11 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -19,6 +19,41 @@
#include <sound/tlv.h>
#include "lpass-macro-common.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
/* VA macro registers */
#define CDC_VA_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
@@ -1557,15 +1592,15 @@ static int va_macro_probe(struct platform_device *pdev)
va->dev = dev;
- va->macro = devm_clk_get_optional(dev, "macro");
+ va->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(va->macro))
return dev_err_probe(dev, PTR_ERR(va->macro), "unable to get macro clock\n");
- va->dcodec = devm_clk_get_optional(dev, "dcodec");
+ va->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(va->dcodec))
return dev_err_probe(dev, PTR_ERR(va->dcodec), "unable to get dcodec clock\n");
- va->mclk = devm_clk_get(dev, "mclk");
+ va->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(va->mclk))
return dev_err_probe(dev, PTR_ERR(va->mclk), "unable to get mclk clock\n");
@@ -1610,7 +1645,7 @@ static int va_macro_probe(struct platform_device *pdev)
goto err;
if (va->has_npl_clk) {
- va->npl = devm_clk_get(dev, "npl");
+ va->npl = clk_get_retry(dev, "npl");
if (IS_ERR(va->npl)) {
ret = PTR_ERR(va->npl);
goto err;
diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
index 899c8bee464..437a0876a8b 100644
--- a/sound/soc/codecs/lpass-wsa-macro.c
+++ b/sound/soc/codecs/lpass-wsa-macro.c
@@ -19,6 +19,41 @@
#include "lpass-macro-common.h"
#include "lpass-wsa-macro.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider registration
+ * does not trigger deferred-probe retries, so a consumer that loses the
+ * probe-order race stays deferred forever. Wait up to 30 s for providers
+ * that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
#define CDC_WSA_MCLK_EN_MASK BIT(0)
@@ -2701,25 +2736,25 @@ static int wsa_macro_probe(struct platform_device *pdev)
if (!wsa)
return -ENOMEM;
- wsa->macro = devm_clk_get_optional(dev, "macro");
+ wsa->macro = clk_get_retry_optional(dev, "macro");
if (IS_ERR(wsa->macro))
return dev_err_probe(dev, PTR_ERR(wsa->macro), "unable to get macro clock\n");
- wsa->dcodec = devm_clk_get_optional(dev, "dcodec");
+ wsa->dcodec = clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(wsa->dcodec))
return dev_err_probe(dev, PTR_ERR(wsa->dcodec), "unable to get dcodec clock\n");
- wsa->mclk = devm_clk_get(dev, "mclk");
+ wsa->mclk = clk_get_retry(dev, "mclk");
if (IS_ERR(wsa->mclk))
return dev_err_probe(dev, PTR_ERR(wsa->mclk), "unable to get mclk clock\n");
if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- wsa->npl = devm_clk_get(dev, "npl");
+ wsa->npl = clk_get_retry(dev, "npl");
if (IS_ERR(wsa->npl))
return dev_err_probe(dev, PTR_ERR(wsa->npl), "unable to get npl clock\n");
}
- wsa->fsgen = devm_clk_get(dev, "fsgen");
+ wsa->fsgen = clk_get_retry(dev, "fsgen");
if (IS_ERR(wsa->fsgen))
return dev_err_probe(dev, PTR_ERR(wsa->fsgen), "unable to get fsgen clock\n");
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA
2026-11-13 20:33 ` [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
2026-11-13 20:33 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for " Daniel Carter
@ 2026-11-13 20:39 ` sashiko-bot
1 sibling, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 20:39 UTC (permalink / raw)
To: Daniel Carter; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [High] dt-bindings: arm: qcom: missing Signed-off-by trailer in commit
message
- [Low] dt-bindings: arm: qcom: empty commit message body and wrong
subject prefix
--
commit b00eb5a03440d334a1b8831281dccab415d1cb4c
Author: Daniel Carter <yass27106@gmail.com>
> dt-bindings: qcom: document Asus Vivobook 16 X1607QA
[Severity: High]
This commit is missing a Signed-off-by trailer, which is required by
Documentation/process/submitting-patches.rst before a patch can be merged.
[Severity: Low]
The commit message body is empty and omits a description of the Asus
Vivobook 16 X1607QA and its Qualcomm X1P42100 platform. Also, commits
touching Documentation/devicetree/bindings/arm/qcom.yaml normally use the
"dt-bindings: arm: qcom:" subject prefix rather than "dt-bindings: qcom:".
--
Sashiko AI review · https://sashiko.dev/#/patchset/2c4a807496c04047b6d5735e3946dd16@gmail.com?part=1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
2026-11-13 20:33 ` [PATCH v2 3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition Daniel Carter
@ 2026-11-13 20:47 ` sashiko-bot
0 siblings, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 20:47 UTC (permalink / raw)
To: Daniel Carter; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 4 potential
issues to consider:
- [High] ASoC: qcom: 30s msleep() retry in probe stalls
deferred_probe_work
- [High] soundwire: qcom: unused static clk_get_retry_optional() breaks
Werror build
- [High] ASoC: qcom: missing Signed-off-by trailer and commit message
body
- [Low] ASoC: qcom: clk_get_retry() helpers duplicated across five
driver files
--
commit 9ed54c71b350e8398fe1839f5ec457bda202d8b0
Author: Daniel Carter <yass27106@gmail.com>
> ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition
>
> drivers/soundwire/qcom.c | 37 +++++++++++++++++++++++-
> sound/soc/codecs/lpass-rx-macro.c | 45 ++++++++++++++++++++++++++----
> sound/soc/codecs/lpass-tx-macro.c | 45 ++++++++++++++++++++++++++----
> sound/soc/codecs/lpass-va-macro.c | 43 +++++++++++++++++++++++++---
> sound/soc/codecs/lpass-wsa-macro.c | 45 ++++++++++++++++++++++++++----
> 5 files changed, 195 insertions(+), 20 deletions(-)
[Severity: High]
This commit is missing a Signed-off-by: trailer, and the commit message
body contains only a diffstat without explaining why this change is
needed.
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index c31d921f679f9..afb71624dae2a 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -21,6 +21,41 @@
> #include <sound/pcm_params.h>
> #include <sound/soc.h>
> #include "bus.h"
> +#include <linux/delay.h>
> +
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider registration
> + * does not trigger deferred-probe retries, so a consumer that loses the
> + * probe-order race stays deferred forever. Wait up to 30 s for providers
> + * that are registered milliseconds later.
> + */
> +static struct clk *clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
[Severity: High]
Does sleeping for 30 seconds in clk_get_retry() and
clk_get_retry_optional() block the very probe thread needed to register
the supplier clocks?
None of these drivers sets PROBE_PREFER_ASYNCHRONOUS, so both initcalls
and deferred_probe_work_func() run .probe() callbacks sequentially on a
single thread. The modified drivers also supply clocks to one another:
va_macro_probe() registers the fsgen clock consumed by rx_macro_probe(),
tx_macro_probe(), and wsa_macro_probe(), while the macro drivers register
the mclk clock consumed as iface by qcom_swrm_probe().
Because drivers/soundwire/ and wsa-macro are linked and ordered in device
trees before va-macro, a consumer probing before va_macro_probe() (or
q6prmcc) sleeps for the full 30 seconds on that single thread, preventing
the supplier from probing and registering the clock until the loop gives
up and returns -EPROBE_DEFER anyway. This stalls boot or deferred probing
for 30 seconds per device and can expire driver_deferred_probe_timeout,
while in va_macro_probe() sleeping on va->npl also leaves the va->pds
power domains powered on for 30 seconds.
In addition, clock suppliers registered from a driver .probe() callback do
trigger deferred probe retries via really_probe() -> driver_bound() ->
driver_deferred_probe_trigger().
> +
> +static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get_optional(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
>
> #define SWRM_COMP_SW_RESET 0x008
> #define SWRM_COMP_STATUS 0x014
> @@ -1669,7 +1704,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
> goto err_init;
> }
>
> - ctrl->hclk = devm_clk_get(dev, "iface");
> + ctrl->hclk = clk_get_retry(dev, "iface");
[Severity: High]
Does defining clk_get_retry_optional() in drivers/soundwire/qcom.c without
any callers trigger a -Wunused-function warning and break builds with
CONFIG_WERROR=y?
> diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
> index ab8a1c2b0489b..c953054eb7a38 100644
> --- a/sound/soc/codecs/lpass-rx-macro.c
> +++ b/sound/soc/codecs/lpass-rx-macro.c
> @@ -18,6 +18,41 @@
> #include <linux/clk-provider.h>
>
> #include "lpass-macro-common.h"
> +#include <linux/delay.h>
> +
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider registration
> + * does not trigger deferred-probe retries, so a consumer that loses the
> + * probe-order race stays deferred forever. Wait up to 30 s for providers
> + * that are registered milliseconds later.
> + */
> +static struct clk *clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
> +
> +static struct clk *clk_get_retry_optional(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get_optional(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
[Severity: Low]
This isn't a bug, but clk_get_retry() and clk_get_retry_optional() are
duplicated verbatim across five source files, four of which already share
sound/soc/codecs/lpass-macro-common.h.
--
Sashiko AI review · https://sashiko.dev/#/patchset/2c4a807496c04047b6d5735e3946dd16@gmail.com?part=3
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 2/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
2026-11-13 20:33 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for " Daniel Carter
2026-11-13 20:33 ` [PATCH v2 3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition Daniel Carter
@ 2026-11-13 20:51 ` sashiko-bot
1 sibling, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 20:51 UTC (permalink / raw)
To: Daniel Carter; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 6 potential
issues to consider:
- [High] arm64: dts: qcom: missing Signed-off-by trailer and commit
message body
- [Medium] arm64: dts: qcom: missing /delete-node/ for pmc8380_6 on
Purwa X1607QA
- [Medium] arm64: dts: qcom: missing qcom,dmic-sample-rate and
vdd-micb-supply on vamacro
- [Medium] arm64: dts: qcom: missing x1-el2.dtbo target and
&gpu_zap_shader reference
- [Medium] arm64: dts: qcom: x1p42100-asus-vivobook-16-x1607qa: wrong
inherited eDP panel
- [Low] arm64: dts: qcom: split root node, unsorted nodes, and style
violations in DTS
--
commit 0106da8e8437e65f83503717cf06104fc06ff24c
Author: Daniel Carter <yass27106@gmail.com>
> arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
>
> arch/arm64/boot/dts/qcom/Makefile | 1 +
> .../x1p42100-asus-vivobook-16-x1607qa.dts | 237 ++++++++++++++++++
> 2 files changed, 238 insertions(+)
> create mode 100644 arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> index 88230c4e00ea9..7332a73dbac71 100644
> --- a/arch/arm64/boot/dts/qcom/Makefile
> +++ b/arch/arm64/boot/dts/qcom/Makefile
> @@ -509,6 +509,7 @@ x1e80100-qcp-el2-dtbs := x1e80100-qcp.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> x1p42100-asus-vivobook-s15-el2-dtbs := x1p42100-asus-vivobook-s15.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-s15.dtb x1p42100-asus-vivobook-s15-el2.dtb
> +dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-16-x1607qa.dtb
> x1p42100-asus-zenbook-a14-el2-dtbs := x1p42100-asus-zenbook-a14.dtb x1-el2.dtbo
> dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-zenbook-a14.dtb x1p42100-asus-zenbook-a14-el2.dtb
[Severity: Medium]
Should this also define x1p42100-asus-vivobook-16-x1607qa-el2-dtbs with
x1-el2.dtbo and build x1p42100-asus-vivobook-16-x1607qa-el2.dtb, sorted
alphabetically before x1p42100-asus-vivobook-s15?
scripts/Makefile.dtbs only passes -@ to DTC for base DTBs referenced by a
composite *-dtbs rule. Without the -el2-dtbs rule, neither the pre-merged
-el2.dtb is built nor are __symbols__ emitted into the base DTB, so
x1-el2.dtbo cannot be applied for EL2/KVM boot.
In addition, at the bottom of x1p42100-asus-vivobook-16-x1607qa.dts, the
GPU zap-shader firmware is specified via a nested zap-shader child under
&gpu (along with a redundant status = "okay" already set in
x1-asus-vivobook-s15.dtsi) instead of referencing &gpu_zap_shader directly
as x1p42100-asus-vivobook-s15.dts and x1-el2.dtso do.
> diff --git a/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> new file mode 100644
> index 0000000000000..0092ae3db9cc8
> --- /dev/null
> +++ b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
> @@ -0,0 +1,237 @@
> +// SPDX-License-Identifier: BSD-3-Clause
> +/*
> + * Copyright (c) 2026, yass27106-hue <yass27106@users.noreply.github.com>
> + */
[Severity: High]
The commit message is missing a Signed-off-by: trailer certifying the
Developer's Certificate of Origin, and its body contains a pasted git
diffstat instead of a description of the ASUS Vivobook 16 (X1607QA)
hardware and why it shares x1-asus-vivobook-s15.dtsi. The copyright
header here also uses a GitHub handle and noreply address rather than the
author's name and routable email address.
> +
> +/dts-v1/;
> +
> +#include "purwa.dtsi"
> +#include "x1-asus-vivobook-s15.dtsi"
[Severity: Medium]
Does this need to delete &pmc8380_6, &pmc8380_6_thermal, and
&pmc8380_6_die_temp after including x1-asus-vivobook-s15.dtsi?
x1-asus-vivobook-s15.dtsi transitively includes hamoa-pmics.dtsi, which
defines pmc8380_6 (SPMI USID 6), pmc8380_6_thermal, and pmc8380_6_die_temp
for the third CPU cluster on 12-core X1E80100 SoCs. On 8-core X1P42100
(Purwa) platforms that cluster and its companion PMIC are unpopulated, so
leaving these nodes enabled causes the SPMI PMIC, temp-alarm, GPIO, VADC,
and thermal drivers to probe and poll absent hardware, just as
x1p42100-asus-vivobook-s15.dts avoids with /delete-node/.
> +#include "x1-asus-vivobook-s15.dtsi"
[Severity: Medium]
Does the 16-inch Vivobook 16 (X1607QA) really use the 15.6-inch Samsung
ATNA56AC03 panel inherited from x1-asus-vivobook-s15.dtsi?
x1-asus-vivobook-s15.dtsi configures the mdss_dp3 aux-bus panel node with:
arch/arm64/boot/dts/qcom/x1-asus-vivobook-s15.dtsi:
aux-bus {
panel {
compatible = "samsung,atna56ac03", "samsung,atna33xc20";
enable-gpios = <&pmc8380_3_gpios 4 GPIO_ACTIVE_HIGH>;
power-supply = <&vreg_edp_3p3>;
Without overriding the panel node for this 16-inch (16:10) laptop, the
board binds the panel-samsung-atna33xc20 driver for a 15.6-inch 2880x1620
(16:9) AMOLED panel with Samsung EL_ON3 power sequencing and DP AUX-only
backlight control instead of the actual panel and backlight configuration.
[ ... ]
> +&lpass_vamacro {
> + pinctrl-0 = <&dmic01_default>;
> + pinctrl-names = "default";
> +};
[Severity: Medium]
Are qcom,dmic-sample-rate and vdd-micb-supply missing on &lpass_vamacro
(along with the vreg_l1b_1p8 LDO1 definition in &apps_rsc regulators-0)?
va_macro_probe() logs "qcom,dmic-sample-rate dt entry missing" when
qcom,dmic-sample-rate is omitted, and its "vdd-micb" DAPM regulator widget
falls back to a dummy regulator without enabling the 1.8V LDO1 DMIC micbias
rail unless vdd-micb-supply = <&vreg_l1b_1p8> is provided as on other X1
boards.
> +
> +/ {
> + wcd938x: audio-codec {
[ ... ]
> + sound {
> + compatible = "qcom,x1e80100-sndcard";
> + model = "X1E80100-ASUS-Vivobook-16";
> + audio-routing = "SpkrLeft IN", "WSA WSA_SPK1 OUT",
> + "SpkrRight IN", "WSA WSA_SPK2 OUT",
[ ... ]
> +&swr0 {
> + status = "okay";
> +
> + pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
> + pinctrl-names = "default";
[Severity: Low]
This isn't a bug, but several parts of this file diverge from the
devicetree coding style:
- The root node / { ... }; is split into two blocks with phandle references
in between instead of a single root node block at the top of the file,
and chassis-type = "laptop" duplicates x1-asus-vivobook-s15.dtsi.
- The top-level &label references, the DAI-link child nodes under sound,
and the cpu/codec subnodes in wcd-playback-dai-link and
wcd-capture-dai-link are not sorted alphabetically.
- In &swr0, status = "okay" is placed before pinctrl-0 and pinctrl-names
instead of as the last property before child nodes.
- Multi-line property continuations in audio-routing, wsa-dai-link
sound-dai, and the remoteproc firmware-name properties are aligned
assuming 4-space tabs rather than 8-column kernel tabs.
--
Sashiko AI review · https://sashiko.dev/#/patchset/2c4a807496c04047b6d5735e3946dd16@gmail.com?part=2
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 1/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA - v3 series
2026-11-13 20:33 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA — v2 series Daniel Carter
2026-11-13 20:33 ` [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
@ 2026-11-13 21:02 ` Daniel Carter
2026-11-13 21:02 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
1 sibling, 1 reply; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 21:02 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
Hi Krzysztof, hi all,
v3 of the series, addressing the Sashiko review of v2:
- arm64/dts: add /delete-node/ for pmc8380_6, pmc8380_6_thermal and
pmc8380_6_die_temp, which are unpopulated on the X1P-42-100
(matching the Vivobook S15 device tree).
- arm64/dts: add the missing qcom,dmic-sample-rate and
vdd-micb-supply properties on lpass_vamacro.
- arm64/dts: add the -el2 composite device tree blob target and fix
the Makefile alphabetical ordering.
- arm64/dts: cosmetic cleanups (single root node, gpu_zap_shader used
directly, sorted label overrides).
- ASoC/soundwire: mark the LPASS macro and Qualcomm SoundWire drivers
PROBE_PREFER_ASYNCHRONOUS so the bounded clock-acquisition retry
does not block the probe of the clock supplier on the single
sequential probe thread, and share the retry helpers through
lpass-macro-common.h instead of duplicating them per driver.
- soundwire: check clk_prepare_enable() return values (separate
patch; pre-existing issue in the driver).
Series:
[1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA
[2/4] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
[3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry
[4/4] soundwire: qcom: check clk_prepare_enable() return values
Also open as pull request 1439 at github.com/qualcomm-linux/kernel.
Best regards,
Daniel Carter
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA
2026-11-13 21:02 ` [PATCH v2 1/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA - v3 series Daniel Carter
@ 2026-11-13 21:02 ` Daniel Carter
2026-11-13 21:02 ` [PATCH v3 2/4] arm64: dts: qcom: add device tree for " Daniel Carter
2026-11-13 21:06 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Mark Brown
0 siblings, 2 replies; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 21:02 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
Document the compatible for the Asus Vivobook 16 X1607QA laptop,
based on the Qualcomm X1P42100 (purwa) SoC.
Signed-off-by: Daniel Carter <yass27106@gmail.com>
---
Documentation/devicetree/bindings/arm/qcom.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/arm/qcom.yaml b/Documentation/devicetree/bindings/arm/qcom.yaml
index 121ca557ce1..d22f1b0b4ef 100644
--- a/Documentation/devicetree/bindings/arm/qcom.yaml
+++ b/Documentation/devicetree/bindings/arm/qcom.yaml
@@ -1306,6 +1306,7 @@ properties:
- items:
- enum:
+ - asus,vivobook-16-x1607qa
- asus,vivobook-s15-x1p4
- hp,omnibook-x14-fe1
- lenovo,thinkbook-16
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 2/4] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA
2026-11-13 21:02 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
@ 2026-11-13 21:02 ` Daniel Carter
2026-11-13 21:02 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry Daniel Carter
2026-11-13 21:06 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Mark Brown
1 sibling, 1 reply; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 21:02 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
Add initial device tree for the Asus Vivobook 16 X1607QA laptop
with the Snapdragon X X1P-42-100 (purwa) SoC, based on the Vivobook
S15. Includes the sound nodes (WSA8845 speakers, WCD938x codec via
SoundWire), the VA macro with its DMIC sample rate and mic bias
supply, and the EL2 device tree blob target.
Signed-off-by: Daniel Carter <yass27106@gmail.com>
---
arch/arm64/boot/dts/qcom/Makefile | 2 +
.../x1p42100-asus-vivobook-16-x1607qa.dts | 238 ++++++++++++++++++
2 files changed, 240 insertions(+)
create mode 100644 arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 88230c4e00e..4405eaab62d 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -507,6 +507,8 @@ x1e80100-microsoft-romulus15-el2-dtbs := x1e80100-microsoft-romulus15.dtb x1-el2
dtb-$(CONFIG_ARCH_QCOM) += x1e80100-microsoft-romulus15.dtb x1e80100-microsoft-romulus15-el2.dtb
x1e80100-qcp-el2-dtbs := x1e80100-qcp.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
+x1p42100-asus-vivobook-16-x1607qa-el2-dtbs := x1p42100-asus-vivobook-16-x1607qa.dtb x1-el2.dtbo
+dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-16-x1607qa.dtb x1p42100-asus-vivobook-16-x1607qa-el2.dtb
x1p42100-asus-vivobook-s15-el2-dtbs := x1p42100-asus-vivobook-s15.dtb x1-el2.dtbo
dtb-$(CONFIG_ARCH_QCOM) += x1p42100-asus-vivobook-s15.dtb x1p42100-asus-vivobook-s15-el2.dtb
x1p42100-asus-zenbook-a14-el2-dtbs := x1p42100-asus-zenbook-a14.dtb x1-el2.dtbo
diff --git a/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
new file mode 100644
index 00000000000..3ad3fcfcabb
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/x1p42100-asus-vivobook-16-x1607qa.dts
@@ -0,0 +1,238 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Daniel Carter <yass27106@gmail.com>
+ */
+
+/dts-v1/;
+
+#include "purwa.dtsi"
+#include "x1-asus-vivobook-s15.dtsi"
+
+/delete-node/ &pmc8380_6;
+/delete-node/ &pmc8380_6_thermal;
+/delete-node/ &pmc8380_6_die_temp;
+
+/ {
+ model = "ASUS Vivobook 16 (X1607QA)";
+ compatible = "asus,vivobook-16-x1607qa", "qcom,x1p42100";
+ chassis-type = "laptop";
+
+ wcd938x: audio-codec {
+ compatible = "qcom,wcd9385-codec";
+
+ pinctrl-0 = <&wcd_default>;
+ pinctrl-names = "default";
+
+ qcom,micbias1-microvolt = <1800000>;
+ qcom,micbias2-microvolt = <1800000>;
+ qcom,micbias3-microvolt = <1800000>;
+ qcom,micbias4-microvolt = <1800000>;
+ qcom,mbhc-buttons-vthreshold-microvolt =
+ <75000 150000 237000 500000 500000 500000 500000 500000>;
+ qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
+ qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
+ qcom,rx-device = <&wcd_rx>;
+ qcom,tx-device = <&wcd_tx>;
+
+ reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
+
+ vdd-buck-supply = <&vreg_l15b_1p8>;
+ vdd-rxtx-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l15b_1p8>;
+ vdd-mic-bias-supply = <&vreg_bob1>;
+
+ #sound-dai-cells = <1>;
+ };
+
+ sound {
+ compatible = "qcom,x1e80100-sndcard";
+ model = "X1P42100-ASUS-Vivobook-16";
+ audio-routing = "SpkrLeft IN", "WSA WSA_SPK1 OUT",
+ "SpkrRight IN", "WSA WSA_SPK2 OUT",
+ "IN1_HPHL", "HPHL_OUT",
+ "IN2_HPHR", "HPHR_OUT",
+ "AMIC2", "MIC BIAS2",
+ "VA DMIC0", "MIC BIAS1",
+ "VA DMIC1", "MIC BIAS1",
+ "VA DMIC0", "VA MIC BIAS1",
+ "VA DMIC1", "VA MIC BIAS1",
+ "TX SWR_INPUT1", "ADC2_OUTPUT";
+
+ wcd-playback-dai-link {
+ link-name = "WCD Playback";
+
+ cpu {
+ sound-dai = <&q6apmbedai RX_CODEC_DMA_RX_0>;
+ };
+
+ codec {
+ sound-dai = <&wcd938x 0>, <&swr1 0>, <&lpass_rxmacro 0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ wcd-capture-dai-link {
+ link-name = "WCD Capture";
+
+ cpu {
+ sound-dai = <&q6apmbedai TX_CODEC_DMA_TX_3>;
+ };
+
+ codec {
+ sound-dai = <&wcd938x 1>, <&swr2 1>, <&lpass_txmacro 0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ va-dai-link {
+ link-name = "VA Capture";
+
+ codec {
+ sound-dai = <&lpass_vamacro 0>;
+ };
+
+ cpu {
+ sound-dai = <&q6apmbedai VA_CODEC_DMA_TX_0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+
+ wsa-dai-link {
+ link-name = "WSA Playback";
+
+ codec {
+ sound-dai = <&left_spkr>, <&right_spkr>,
+ <&swr0 0>, <&lpass_wsamacro 0>;
+ };
+
+ cpu {
+ sound-dai = <&q6apmbedai WSA_CODEC_DMA_RX_0>;
+ };
+
+ platform {
+ sound-dai = <&q6apm>;
+ };
+ };
+ };
+};
+
+&apps_rsc {
+ regulators-0 {
+ vreg_l12b_1p2: ldo12 {
+ regulator-name = "vreg_l12b_1p2";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+ regulator-always-on;
+ };
+ };
+};
+
+&gpu {
+ status = "okay";
+};
+
+&gpu_zap_shader {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcdxkmsucpurwa.mbn";
+};
+
+&lpass_tlmm {
+ spkr_01_sd_n_active: spkr-01-sd-n-active-state {
+ pins = "gpio12";
+ function = "gpio";
+ drive-strength = <16>;
+ bias-disable;
+ output-low;
+ };
+};
+
+&lpass_vamacro {
+ pinctrl-0 = <&dmic01_default>;
+ pinctrl-names = "default";
+ qcom,dmic-sample-rate = <4800000>;
+ vdd-micb-supply = <&vreg_bob1>;
+};
+
+&remoteproc_adsp {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qcadsp8380.mbn",
+ "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/adsp_dtbs.elf";
+ status = "okay";
+};
+
+&remoteproc_cdsp {
+ firmware-name = "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/qccdsp8380.mbn",
+ "qcom/x1p42100/ASUSTeK/vivobook-16-x1607qa/cdsp_dtbs.elf";
+ status = "okay";
+};
+
+&swr0 {
+ status = "okay";
+
+ pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
+ pinctrl-names = "default";
+
+ /* WSA8845, Left Speaker */
+ left_spkr: speaker@0,0 {
+ compatible = "sdw20217020400";
+ reg = <0 0>;
+ reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SpkrLeft";
+ vdd-1p8-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l12b_1p2>;
+ qcom,port-mapping = <1 2 3 7 10 13>;
+ };
+
+ /* WSA8845, Right Speaker */
+ right_spkr: speaker@0,1 {
+ compatible = "sdw20217020400";
+ reg = <0 1>;
+ reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SpkrRight";
+ vdd-1p8-supply = <&vreg_l15b_1p8>;
+ vdd-io-supply = <&vreg_l12b_1p2>;
+ qcom,port-mapping = <4 5 6 7 11 13>;
+ };
+};
+
+&swr1 {
+ status = "okay";
+
+ /* WCD9385 RX */
+ wcd_rx: codec@0,4 {
+ compatible = "sdw20217010d00";
+ reg = <0 4>;
+ qcom,rx-port-mapping = <1 2 3 4 5>;
+ };
+};
+
+&swr2 {
+ status = "okay";
+
+ /* WCD9385 TX */
+ wcd_tx: codec@0,3 {
+ compatible = "sdw20217010d00";
+ reg = <0 3>;
+ qcom,tx-port-mapping = <2 2 3 4>;
+ };
+};
+
+&tlmm {
+ wcd_default: wcd-reset-n-active-state {
+ pins = "gpio191";
+ function = "gpio";
+ drive-strength = <16>;
+ bias-disable;
+ output-low;
+ };
+};
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry
2026-11-13 21:02 ` [PATCH v3 2/4] arm64: dts: qcom: add device tree for " Daniel Carter
@ 2026-11-13 21:02 ` Daniel Carter
2026-11-13 21:02 ` [PATCH v3 4/4] soundwire: qcom: check clk_prepare_enable() return values Daniel Carter
2026-11-13 21:19 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry sashiko-bot
0 siblings, 2 replies; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 21:02 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
The LPASS WSA/RX/TX/VA macro and Qualcomm SoundWire drivers request
clocks whose providers (va-macro fsgen, the q6prm clock controller
under the ADSP GPR service) can register after the consumers probe.
Clock-provider registration does not trigger deferred-probe retries,
so consumers stay deferred indefinitely.
Add a bounded retry (60 x 500 ms) around the clock acquisition in
these drivers, share the retry helpers through lpass-macro-common.h,
and mark the drivers PROBE_PREFER_ASYNCHRONOUS so a retrying consumer
does not block the probe of the clock supplier it is waiting for.
Signed-off-by: Daniel Carter <yass27106@gmail.com>
---
drivers/soundwire/qcom.c | 24 +++++++++++++++-
sound/soc/codecs/lpass-macro-common.h | 40 +++++++++++++++++++++++++++
sound/soc/codecs/lpass-rx-macro.c | 11 ++++----
sound/soc/codecs/lpass-tx-macro.c | 11 ++++----
sound/soc/codecs/lpass-va-macro.c | 9 +++---
sound/soc/codecs/lpass-wsa-macro.c | 11 ++++----
6 files changed, 86 insertions(+), 20 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 6e0c5fb10ef..473449dbdfa 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -21,6 +21,27 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include "bus.h"
+#include <linux/delay.h>
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider
+ * registration does not trigger deferred-probe retries, so a consumer
+ * that loses the probe-order race stays deferred forever. Wait up to
+ * 30 s for providers that are registered milliseconds later.
+ */
+static struct clk *clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = clk_get_retry(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
#define SWRM_COMP_SW_RESET 0x008
#define SWRM_COMP_STATUS 0x014
@@ -1669,7 +1690,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
goto err_init;
}
- ctrl->hclk = devm_clk_get(dev, "iface");
+ ctrl->hclk = clk_get_retry(dev, "iface");
if (IS_ERR(ctrl->hclk)) {
ret = dev_err_probe(dev, PTR_ERR(ctrl->hclk), "unable to get iface clock\n");
goto err_init;
@@ -1921,6 +1942,7 @@ static struct platform_driver qcom_swrm_driver = {
.remove = qcom_swrm_remove,
.driver = {
.name = "qcom-soundwire",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
.of_match_table = qcom_swrm_of_match,
.pm = &swrm_dev_pm_ops,
}
diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
index 10ad682019f..83bc7075a28 100644
--- a/sound/soc/codecs/lpass-macro-common.h
+++ b/sound/soc/codecs/lpass-macro-common.h
@@ -6,6 +6,9 @@
#ifndef __LPASS_MACRO_COMMON_H__
#define __LPASS_MACRO_COMMON_H__
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/clk.h>
/* NPL clock is expected */
#define LPASS_MACRO_FLAG_HAS_NPL_CLOCK BIT(0)
/* The soundwire block should be internally reset at probe */
@@ -74,4 +77,41 @@ static inline const char *lpass_macro_get_codec_version_string(int version)
return "NA";
}
+
+/*
+ * Bounded retry for deferred clock providers. Clock-provider
+ * registration does not trigger deferred-probe retries, so a consumer
+ * that loses the probe-order race stays deferred forever. Wait up to
+ * 30 s for providers that are registered milliseconds later.
+ */
+static inline struct clk *
+lpass_macro_clk_get_retry(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
+static inline struct clk *
+lpass_macro_clk_get_retry_optional(struct device *dev, const char *id)
+{
+ struct clk *c;
+ int i;
+
+ for (i = 0; i < 60; i++) {
+ c = devm_clk_get_optional(dev, id);
+ if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
+ return c;
+ msleep(500);
+ }
+ return c;
+}
+
#endif /* __LPASS_MACRO_COMMON_H__ */
diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index c41eb8de616..658bf947aac 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -3780,25 +3780,25 @@ static int rx_macro_probe(struct platform_device *pdev)
if (!rx)
return -ENOMEM;
- rx->macro = devm_clk_get_optional(dev, "macro");
+ rx->macro = lpass_macro_clk_get_retry_optional(dev, "macro");
if (IS_ERR(rx->macro))
return dev_err_probe(dev, PTR_ERR(rx->macro), "unable to get macro clock\n");
- rx->dcodec = devm_clk_get_optional(dev, "dcodec");
+ rx->dcodec = lpass_macro_clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(rx->dcodec))
return dev_err_probe(dev, PTR_ERR(rx->dcodec), "unable to get dcodec clock\n");
- rx->mclk = devm_clk_get(dev, "mclk");
+ rx->mclk = lpass_macro_clk_get_retry(dev, "mclk");
if (IS_ERR(rx->mclk))
return dev_err_probe(dev, PTR_ERR(rx->mclk), "unable to get mclk clock\n");
if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- rx->npl = devm_clk_get(dev, "npl");
+ rx->npl = lpass_macro_clk_get_retry(dev, "npl");
if (IS_ERR(rx->npl))
return dev_err_probe(dev, PTR_ERR(rx->npl), "unable to get npl clock\n");
}
- rx->fsgen = devm_clk_get(dev, "fsgen");
+ rx->fsgen = lpass_macro_clk_get_retry(dev, "fsgen");
if (IS_ERR(rx->fsgen))
return dev_err_probe(dev, PTR_ERR(rx->fsgen), "unable to get fsgen clock\n");
@@ -4005,6 +4005,7 @@ static const struct dev_pm_ops rx_macro_pm_ops = {
static struct platform_driver rx_macro_driver = {
.driver = {
.name = "rx_macro",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
.of_match_table = rx_macro_dt_match,
.suppress_bind_attrs = true,
.pm = pm_ptr(&rx_macro_pm_ops),
diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
index 6deaaabe43a..329e1304b38 100644
--- a/sound/soc/codecs/lpass-tx-macro.c
+++ b/sound/soc/codecs/lpass-tx-macro.c
@@ -2258,25 +2258,25 @@ static int tx_macro_probe(struct platform_device *pdev)
tx->data = device_get_match_data(dev);
- tx->macro = devm_clk_get_optional(dev, "macro");
+ tx->macro = lpass_macro_clk_get_retry_optional(dev, "macro");
if (IS_ERR(tx->macro))
return dev_err_probe(dev, PTR_ERR(tx->macro), "unable to get macro clock\n");
- tx->dcodec = devm_clk_get_optional(dev, "dcodec");
+ tx->dcodec = lpass_macro_clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(tx->dcodec))
return dev_err_probe(dev, PTR_ERR(tx->dcodec), "unable to get dcodec clock\n");
- tx->mclk = devm_clk_get(dev, "mclk");
+ tx->mclk = lpass_macro_clk_get_retry(dev, "mclk");
if (IS_ERR(tx->mclk))
return dev_err_probe(dev, PTR_ERR(tx->mclk), "unable to get mclk clock\n");
if (tx->data->flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- tx->npl = devm_clk_get(dev, "npl");
+ tx->npl = lpass_macro_clk_get_retry(dev, "npl");
if (IS_ERR(tx->npl))
return dev_err_probe(dev, PTR_ERR(tx->npl), "unable to get npl clock\n");
}
- tx->fsgen = devm_clk_get(dev, "fsgen");
+ tx->fsgen = lpass_macro_clk_get_retry(dev, "fsgen");
if (IS_ERR(tx->fsgen))
return dev_err_probe(dev, PTR_ERR(tx->fsgen), "unable to get fsgen clock\n");
@@ -2515,6 +2515,7 @@ MODULE_DEVICE_TABLE(of, tx_macro_dt_match);
static struct platform_driver tx_macro_driver = {
.driver = {
.name = "tx_macro",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
.of_match_table = tx_macro_dt_match,
.suppress_bind_attrs = true,
.pm = pm_ptr(&tx_macro_pm_ops),
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index 03d6434a4a1..e718edd732e 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -1557,15 +1557,15 @@ static int va_macro_probe(struct platform_device *pdev)
va->dev = dev;
- va->macro = devm_clk_get_optional(dev, "macro");
+ va->macro = lpass_macro_clk_get_retry_optional(dev, "macro");
if (IS_ERR(va->macro))
return dev_err_probe(dev, PTR_ERR(va->macro), "unable to get macro clock\n");
- va->dcodec = devm_clk_get_optional(dev, "dcodec");
+ va->dcodec = lpass_macro_clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(va->dcodec))
return dev_err_probe(dev, PTR_ERR(va->dcodec), "unable to get dcodec clock\n");
- va->mclk = devm_clk_get(dev, "mclk");
+ va->mclk = lpass_macro_clk_get_retry(dev, "mclk");
if (IS_ERR(va->mclk))
return dev_err_probe(dev, PTR_ERR(va->mclk), "unable to get mclk clock\n");
@@ -1610,7 +1610,7 @@ static int va_macro_probe(struct platform_device *pdev)
goto err;
if (va->has_npl_clk) {
- va->npl = devm_clk_get(dev, "npl");
+ va->npl = lpass_macro_clk_get_retry(dev, "npl");
if (IS_ERR(va->npl)) {
ret = PTR_ERR(va->npl);
goto err;
@@ -1782,6 +1782,7 @@ MODULE_DEVICE_TABLE(of, va_macro_dt_match);
static struct platform_driver va_macro_driver = {
.driver = {
.name = "va_macro",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
.of_match_table = va_macro_dt_match,
.suppress_bind_attrs = true,
.pm = pm_ptr(&va_macro_pm_ops),
diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
index 899c8bee464..02fca60edf4 100644
--- a/sound/soc/codecs/lpass-wsa-macro.c
+++ b/sound/soc/codecs/lpass-wsa-macro.c
@@ -2701,25 +2701,25 @@ static int wsa_macro_probe(struct platform_device *pdev)
if (!wsa)
return -ENOMEM;
- wsa->macro = devm_clk_get_optional(dev, "macro");
+ wsa->macro = lpass_macro_clk_get_retry_optional(dev, "macro");
if (IS_ERR(wsa->macro))
return dev_err_probe(dev, PTR_ERR(wsa->macro), "unable to get macro clock\n");
- wsa->dcodec = devm_clk_get_optional(dev, "dcodec");
+ wsa->dcodec = lpass_macro_clk_get_retry_optional(dev, "dcodec");
if (IS_ERR(wsa->dcodec))
return dev_err_probe(dev, PTR_ERR(wsa->dcodec), "unable to get dcodec clock\n");
- wsa->mclk = devm_clk_get(dev, "mclk");
+ wsa->mclk = lpass_macro_clk_get_retry(dev, "mclk");
if (IS_ERR(wsa->mclk))
return dev_err_probe(dev, PTR_ERR(wsa->mclk), "unable to get mclk clock\n");
if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
- wsa->npl = devm_clk_get(dev, "npl");
+ wsa->npl = lpass_macro_clk_get_retry(dev, "npl");
if (IS_ERR(wsa->npl))
return dev_err_probe(dev, PTR_ERR(wsa->npl), "unable to get npl clock\n");
}
- wsa->fsgen = devm_clk_get(dev, "fsgen");
+ wsa->fsgen = lpass_macro_clk_get_retry(dev, "fsgen");
if (IS_ERR(wsa->fsgen))
return dev_err_probe(dev, PTR_ERR(wsa->fsgen), "unable to get fsgen clock\n");
@@ -2917,6 +2917,7 @@ MODULE_DEVICE_TABLE(of, wsa_macro_dt_match);
static struct platform_driver wsa_macro_driver = {
.driver = {
.name = "wsa_macro",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
.of_match_table = wsa_macro_dt_match,
.pm = pm_ptr(&wsa_macro_pm_ops),
},
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v3 4/4] soundwire: qcom: check clk_prepare_enable() return values
2026-11-13 21:02 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry Daniel Carter
@ 2026-11-13 21:02 ` Daniel Carter
2026-11-13 21:19 ` sashiko-bot
2026-11-13 21:19 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry sashiko-bot
1 sibling, 1 reply; 22+ messages in thread
From: Daniel Carter @ 2026-11-13 21:02 UTC (permalink / raw)
To: krzk, andersson, broonie, srini, konradybcio
Cc: robh, conor+dt, vkoul, tiwai, perex, lgirdwood,
pierre-louis.bossart, yung-chuan.liao, abelvesa, linux-arm-msm,
linux-sound, devicetree, linux-kernel, yass27106
clk_prepare_enable() can fail; unchecked, the driver proceeds to
touch registers with the interface clock off, which aborts on arm64.
Check the return value in the interrupt handler, in probe and in the
runtime resume path, re-enabling the wake IRQ on the resume error
path.
Signed-off-by: Daniel Carter <yass27106@gmail.com>
---
drivers/soundwire/qcom.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 473449dbdfa..c44bcd0f0cf 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -799,7 +799,9 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
u32 i;
int devnum;
int ret = IRQ_HANDLED;
- clk_prepare_enable(ctrl->hclk);
+
+ if (clk_prepare_enable(ctrl->hclk))
+ return IRQ_HANDLED;
ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
&intr_sts);
@@ -1696,7 +1698,11 @@ static int qcom_swrm_probe(struct platform_device *pdev)
goto err_init;
}
- clk_prepare_enable(ctrl->hclk);
+ ret = clk_prepare_enable(ctrl->hclk);
+ if (ret) {
+ dev_err(dev, "unable to enable iface clock\n");
+ goto err_init;
+ }
ctrl->dev = dev;
dev_set_drvdata(&pdev->dev, ctrl);
@@ -1821,7 +1827,14 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)
disable_irq_nosync(ctrl->wake_irq);
}
- clk_prepare_enable(ctrl->hclk);
+ ret = clk_prepare_enable(ctrl->hclk);
+ if (ret) {
+ if (ctrl->wake_irq > 0) {
+ if (irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
+ enable_irq(ctrl->wake_irq);
+ }
+ return ret;
+ }
if (ctrl->clock_stop_not_supported) {
reinit_completion(&ctrl->enumeration);
--
2.55.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA
2026-11-13 21:02 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
2026-11-13 21:02 ` [PATCH v3 2/4] arm64: dts: qcom: add device tree for " Daniel Carter
@ 2026-11-13 21:06 ` Mark Brown
1 sibling, 0 replies; 22+ messages in thread
From: Mark Brown @ 2026-11-13 21:06 UTC (permalink / raw)
To: Daniel Carter
Cc: krzk, andersson, srini, konradybcio, robh, conor+dt, vkoul, tiwai,
perex, lgirdwood, pierre-louis.bossart, yung-chuan.liao, abelvesa,
linux-arm-msm, linux-sound, devicetree, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 662 bytes --]
On Fri, Nov 13, 2026 at 01:02:39PM -0800, Daniel Carter wrote:
> Document the compatible for the Asus Vivobook 16 X1607QA laptop,
> based on the Qualcomm X1P42100 (purwa) SoC.
Please don't send new patches in reply to old patches or serieses, this
makes it harder for both people and tools to understand what is going
on - it can bury things in mailboxes and make it difficult to keep track
of what current patches are, both for the new patches and the old ones.
You might want to look at b4 to send the patches, especially it's web
submission endpoint which avoids having to configure mail:
https://b4.docs.kernel.org/en/latest/contributor/overview.html
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 4/4] soundwire: qcom: check clk_prepare_enable() return values
2026-11-13 21:02 ` [PATCH v3 4/4] soundwire: qcom: check clk_prepare_enable() return values Daniel Carter
@ 2026-11-13 21:19 ` sashiko-bot
0 siblings, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 21:19 UTC (permalink / raw)
To: Daniel Carter; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 3 potential
issues to consider:
- [Medium] soundwire: qcom: enable_irq() in swrm_runtime_resume() causes
wake IRQ storm
- [Low] soundwire: qcom: missing Fixes trailers for clk_prepare_enable()
check
- [Low] soundwire: qcom: qcom_swrm_irq_handler() returns IRQ_HANDLED on
clk error
--
commit 5c5235a561fc40c30680eee11304261327eab6cc
Author: Daniel Carter <yass27106@gmail.com>
> soundwire: qcom: check clk_prepare_enable() return values
>
> clk_prepare_enable() can fail; unchecked, the driver proceeds to
> touch registers with the interface clock off, which aborts on arm64.
> Check the return value in the interrupt handler, in probe and in the
> runtime resume path, re-enabling the wake IRQ on the resume error
> path.
>
> Signed-off-by: Daniel Carter <yass27106@gmail.com>
[Severity: Low]
Since this fixes unchecked clk_prepare_enable() calls introduced in two
earlier commits, should this include Fixes: tags?
Fixes: 02efb49aa805 ("soundwire: qcom: add support for SoundWire controller")
Fixes: 74e79da9fd46 ("soundwire: qcom: add runtime pm support")
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index 0bdeb076a2e0e..ec510809766bb 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -799,7 +799,9 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
> u32 i;
> int devnum;
> int ret = IRQ_HANDLED;
> - clk_prepare_enable(ctrl->hclk);
> +
> + if (clk_prepare_enable(ctrl->hclk))
> + return IRQ_HANDLED;
[Severity: Low]
Should this return IRQ_NONE instead of IRQ_HANDLED when
clk_prepare_enable() fails? The interrupt status is neither read nor
cleared, and returning IRQ_HANDLED causes irq_thread_fn() to mark the
interrupt as handled, preventing the genirq spurious interrupt detector
from disabling a stuck line.
[ ... ]
> @@ -1821,7 +1827,14 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)
> disable_irq_nosync(ctrl->wake_irq);
> }
>
> - clk_prepare_enable(ctrl->hclk);
> + ret = clk_prepare_enable(ctrl->hclk);
> + if (ret) {
> + if (ctrl->wake_irq > 0) {
> + if (irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
> + enable_irq(ctrl->wake_irq);
> + }
> + return ret;
> + }
[Severity: Medium]
Can calling enable_irq(ctrl->wake_irq) here cause a level-high wake IRQ
storm when swrm_runtime_resume() is invoked from
qcom_swrm_wake_irq_handler()?
ctrl->wake_irq is registered with IRQF_TRIGGER_HIGH | IRQF_ONESHOT. During
an in-band wakeup, the slave holds the line high until the bus exits clock
stop, and qcom_swrm_wake_irq_handler() synchronously runs
swrm_runtime_resume() via pm_runtime_get_sync():
drivers/soundwire/qcom.c:qcom_swrm_wake_irq_handler() {
ret = pm_runtime_get_sync(ctrl->dev);
if (ret < 0 && ret != -EACCES) {
dev_err_ratelimited(ctrl->dev,
"pm_runtime_get_sync failed in %s, ret %d\n",
__func__, ret);
pm_runtime_put_noidle(ctrl->dev);
return ret;
}
if (ctrl->wake_irq > 0) {
if (!irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
disable_irq_nosync(ctrl->wake_irq);
}
...
}
When clk_prepare_enable() fails, enable_irq() unmasks ctrl->wake_irq at the
irqchip (even while the oneshot threaded handler is running), and
qcom_swrm_wake_irq_handler() returns early before its own
disable_irq_nosync(ctrl->wake_irq). Because the bus never resumed to clear
the wakeup condition, the slave continues driving the level-high line and
ctrl->wake_irq immediately re-fires in a loop.
--
Sashiko AI review · https://sashiko.dev/#/patchset/1ce6d7664e48413d9a5a8b11a986f746@gmail.com?part=4
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry
2026-11-13 21:02 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry Daniel Carter
2026-11-13 21:02 ` [PATCH v3 4/4] soundwire: qcom: check clk_prepare_enable() return values Daniel Carter
@ 2026-11-13 21:19 ` sashiko-bot
1 sibling, 0 replies; 22+ messages in thread
From: sashiko-bot @ 2026-11-13 21:19 UTC (permalink / raw)
To: Daniel Carter; +Cc: linux-sound, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [High] soundwire: qcom: infinite recursion in clk_get_retry()
- [Medium] ASoC: qcom: 30s msleep() polling on -EPROBE_DEFER in
lpass_macro_clk_get_retry()
--
commit 6bd2e1b16c32b85c538fe58be015563a596b1d7d
Author: Daniel Carter <yass27106@gmail.com>
ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry
This commit adds 30-second polling retry helpers around clock acquisition
and sets PROBE_PREFER_ASYNCHRONOUS in the Qualcomm SoundWire and LPASS
macro drivers.
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index c31d921f679f9..0bdeb076a2e0e 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -21,6 +21,27 @@
> #include <sound/pcm_params.h>
> #include <sound/soc.h>
> #include "bus.h"
> +#include <linux/delay.h>
> +
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider
> + * registration does not trigger deferred-probe retries, so a consumer
> + * that loses the probe-order race stays deferred forever. Wait up to
> + * 30 s for providers that are registered milliseconds later.
> + */
> +static struct clk *clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = clk_get_retry(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
[Severity: High]
Does clk_get_retry() call itself instead of devm_clk_get(dev, id) here?
When qcom_swrm_probe() calls clk_get_retry(dev, "iface"), this recurses
infinitely and overflows the kernel stack. Also, the commit message says
the retry helpers are shared through lpass-macro-common.h, whereas a
separate copy is defined here.
> diff --git a/sound/soc/codecs/lpass-macro-common.h b/sound/soc/codecs/lpass-macro-common.h
> index 10ad682019fa7..83bc7075a281c 100644
> --- a/sound/soc/codecs/lpass-macro-common.h
> +++ b/sound/soc/codecs/lpass-macro-common.h
[ ... ]
> @@ -74,4 +77,41 @@ static inline const char *lpass_macro_get_codec_version_string(int version)
> return "NA";
> }
>
> +
> +/*
> + * Bounded retry for deferred clock providers. Clock-provider
> + * registration does not trigger deferred-probe retries, so a consumer
> + * that loses the probe-order race stays deferred forever. Wait up to
> + * 30 s for providers that are registered milliseconds later.
> + */
> +static inline struct clk *
> +lpass_macro_clk_get_retry(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
> +
> +static inline struct clk *
> +lpass_macro_clk_get_retry_optional(struct device *dev, const char *id)
> +{
> + struct clk *c;
> + int i;
> +
> + for (i = 0; i < 60; i++) {
> + c = devm_clk_get_optional(dev, id);
> + if (!IS_ERR(c) || PTR_ERR(c) != -EPROBE_DEFER)
> + return c;
> + msleep(500);
> + }
> + return c;
> +}
> +
> #endif /* __LPASS_MACRO_COMMON_H__ */
[Severity: Medium]
Why poll with msleep(500) for up to 30 seconds on -EPROBE_DEFER instead of
returning -EPROBE_DEFER to the driver core?
Both suppliers mentioned in the commit message (q6dsp_clock_dev_probe() and
va_macro_register_fsgen_output()) register their clock providers inside
platform_driver probe callbacks, which trigger driver_deferred_probe_trigger()
through really_probe() -> driver_bound() once bound. Even with
PROBE_PREFER_ASYNCHRONOUS, sleeping for 30 seconds inside probe while holding
device_lock(dev) stalls async_synchronize_full() and wait_for_device_probe()
callers (such as do_init_module() and kernel_init()) whenever a clock supplier
is delayed, missing firmware, or disabled in DT, and repeats the 30-second
stall on subsequent deferred-probe passes.
--
Sashiko AI review · https://sashiko.dev/#/patchset/1ce6d7664e48413d9a5a8b11a986f746@gmail.com?part=3
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2026-11-13 21:19 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-13 13:24 [PATCH 0/2] qcom: add Asus Vivobook 16 X1607QA DT + LPASS audio clock retry yass27106
2026-11-13 13:24 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA yass27106
2026-11-13 13:24 ` [PATCH 2/2] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition yass27106
2026-11-13 13:43 ` sashiko-bot
2026-11-13 15:04 ` Mark Brown
2026-11-13 13:39 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA sashiko-bot
2026-11-13 15:44 ` Krzysztof Kozlowski
2026-11-13 20:33 ` [PATCH 1/2] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA — v2 series Daniel Carter
2026-11-13 20:33 ` [PATCH v2 1/3] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
2026-11-13 20:33 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for " Daniel Carter
2026-11-13 20:33 ` [PATCH v2 3/3] ASoC: qcom: lpass macro / soundwire: retry deferred clock acquisition Daniel Carter
2026-11-13 20:47 ` sashiko-bot
2026-11-13 20:51 ` [PATCH v2 2/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA sashiko-bot
2026-11-13 20:39 ` [PATCH v2 1/3] dt-bindings: qcom: document " sashiko-bot
2026-11-13 21:02 ` [PATCH v2 1/3] arm64: dts: qcom: add device tree for Asus Vivobook 16 X1607QA - v3 series Daniel Carter
2026-11-13 21:02 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Daniel Carter
2026-11-13 21:02 ` [PATCH v3 2/4] arm64: dts: qcom: add device tree for " Daniel Carter
2026-11-13 21:02 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry Daniel Carter
2026-11-13 21:02 ` [PATCH v3 4/4] soundwire: qcom: check clk_prepare_enable() return values Daniel Carter
2026-11-13 21:19 ` sashiko-bot
2026-11-13 21:19 ` [PATCH v3 3/4] ASoC: qcom: lpass macro / soundwire: asynchronous probe with clock retry sashiko-bot
2026-11-13 21:06 ` [PATCH v3 1/4] dt-bindings: qcom: document Asus Vivobook 16 X1607QA Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox