Re: [PATCH v2 2/2] ASoC: codecs: wsa883x: Handle shared reset GPIO for WSA883x speakers

From: Mohammad Rafi Shaik
Date: Tue Jul 22 2025 - 06:57:03 EST




On 7/21/2025 1:53 PM, Krzysztof Kozlowski wrote:
On Fri, Jul 18, 2025 at 04:16:28PM +0530, Mohammad Rafi Shaik wrote:
On some Qualcomm platforms such as QCS6490-RB3Gen2, the multiple
WSA8830/WSA8835 speakers share a common reset (shutdown) GPIO.
To handle such cases, use the reset controller framework along
with the "reset-gpio" driver.

Register devm action to safely disable the regulator on device removal
to prevents a potential release warning from _regulator_put().

It is not possible to remove the device - suppress bind attrs. How did
you trigger that?

Ack,

I encountered the warning as regulator was being released unexpectedly,
triggering _regulator_put() warnings. While the device itself isn't removed, Registering the devm action ensures safe cleanup without triggering warnings.

Please check the below logs.

I could use some suggestions for this issue. please help with some suggestions how i can approve this design.

Thanks,
Rafi.

Signed-off-by: Mohammad Rafi Shaik <mohammad.rafi.shaik@xxxxxxxxxxxxxxxx>
---
sound/soc/codecs/wsa883x.c | 93 +++++++++++++++++++++++++++++---------
1 file changed, 71 insertions(+), 22 deletions(-)

...

static int wsa883x_probe(struct sdw_slave *pdev,
const struct sdw_device_id *id)
{
@@ -1566,13 +1615,18 @@ static int wsa883x_probe(struct sdw_slave *pdev,
if (ret)
return dev_err_probe(dev, ret, "Failed to enable vdd regulator\n");
- wsa883x->sd_n = devm_gpiod_get_optional(dev, "powerdown",
- GPIOD_FLAGS_BIT_NONEXCLUSIVE | GPIOD_OUT_HIGH);
- if (IS_ERR(wsa883x->sd_n)) {
- ret = dev_err_probe(dev, PTR_ERR(wsa883x->sd_n),
- "Shutdown Control GPIO not found\n");
- goto err;
- }
+ ret = wsa883x_get_reset(dev, wsa883x);
+ if (ret)
+ return ret;
+
+ /*
+ * Register devm action to safely disable the regulator on device removal.
+ * This prevents a potential release warning from _regulator_put().
+ */
+ ret = devm_add_action_or_reset(dev, wsa883x_regulator_disable,
+ wsa883x);

If removal is possible (but then explain in commit msg how), then this
should be separate commit with fixes and cc-stable, because you are
fixing actual bug - lack of regulator release on unbind.

Ack,

The Reason to introduced this change in same patch,

without devm_add_action_or_reset(dev, wsa883x_regulator_disable, wsa883x);

if i try to enable ->devm_reset_control_get_optional_shared_deasserted()

seeing below crash logs. _regulator_put() release warning.

logs
-----
[ 10.679294][ T90] ------------[ cut here ]------------
[ 10.684772][ T90] WARNING: CPU: 1 PID: 90 at /drivers/regulator/core.c:2450 _regulator_put+0x50/0x60
[ 10.694344][ T90] Modules linked in: snd_soc_hdmi_codec phy_qcom_edp venus_dec venus_enc videobuf2_dma_contig rpmsg_ctrl qrtr_smd fastrpc rpmsg_char videobuf2_memops qcom_pd_mapper nb7vpq904m msm lontium_lt9611uxc ucsi_glink typec_ucsi pmic_glink_altmode qcom_battmgr aux_hpd_bridge ath11k_ahb ath11k hci_uart rtc_pm8xxx btqca coresight_stm bluetooth qcom_pon stm_core venus_core pwrseq_qcom_wcn drm_exec mac80211 ocmem v4l2_mem2mem gpu_sched videobuf2_v4l2 videodev nvmem_qcom_spmi_sdam qcom_spmi_adc_tm5 snd_soc_sc8280xp drm_display_helper qcom_vadc_common snd_soc_qcom_sdw coresight_tmc snd_soc_qcom_common videobuf2_common qcom_stats coresight_etm4x qcom_q6v5_pas phy_qcom_qmp_combo usb_f_qdss mc drm_dp_aux_bus ecdh_generic qcom_pil_info qcom_q6v5 ecc coresight_replicator aux_bridge coresight_csr qcom_sysmon coresight_funnel pwrseq_core gpi typec i2c_qcom_geni qcom_common coresight icc_bwmon llcc_qcom qcom_glink_smem qcrypto pinctrl_sc7280_lpass_lpi mdt_loader snd_soc_lpass_wsa_macro sha256_generic pinctrl_lpass_lpi
[ 10.694524][ T90] snd_soc_lpass_va_macro display_connector snd_soc_lpass_macro_common authenc drm_kms_helper libdes qrtr libarc4 icc_osm_l3 qcom_rng pmic_glink cfg80211 rfkill drm fuse ipv6
[ 10.804083][ T90] CPU: 1 UID: 0 PID: 90 Comm: kworker/u32:4 Not tainted 6.14.0 #1
[ 10.811959][ T90] Hardware name: Qualcomm Technologies, Inc. Robotics RB3gen2 (DT)
[ 10.819920][ T90] Workqueue: events_unbound deferred_probe_work_func
[ 10.826643][ T90] pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 10.834510][ T90] pc : _regulator_put+0x50/0x60
[ 10.839362][ T90] lr : regulator_put+0x30/0x48
[ 10.844118][ T90] sp : ffff8000809e3670
[ 10.848244][ T90] x29: ffff8000809e3670 x28: 0000000000000000 x27: ffff70941a04a080
[ 10.856300][ T90] x26: 0000000000000000 x25: ffffbfa860a9bee8 x24: ffffbfa860e79cb0
[ 10.864354][ T90] x23: ffff709406e62640 x22: ffff709418668808 x21: ffff8000809e3710
[ 10.872409][ T90] x20: ffff709415e81840 x19: ffffbfa86119b680 x18: 00000000ffffffff
[ 10.880462][ T90] x17: ffffbfa86013d058 x16: ffffbfa8601cbac4 x15: ffff709419a70b48
[ 10.888517][ T90] x14: 0000000000000000 x13: ffff709400032b10 x12: 0000000000000000
[ 10.896573][ T90] x11: 0000000000000000 x10: ffffbfa85fdbcc60 x9 : ffffbfa85fdbc7e0
[ 10.904627][ T90] x8 : ffff709418668ab0 x7 : ffff709418668ab0 x6 : ffff709418668ab0
[ 10.912676][ T90] x5 : ffff709418668ab0 x4 : ffff709418668ab0 x3 : ffff709415e807c0
[ 10.920727][ T90] x2 : ffff709406e62640 x1 : 0000000000000001 x0 : ffff709415e81840
[ 10.928781][ T90] Call trace:
[ 10.932024][ T90] _regulator_put+0x50/0x60 (P)
[ 10.936877][ T90] regulator_put+0x30/0x48
-----------

Thanks & Regards,
Rafi.

Best regards,
Krzysztof