* [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling
@ 2026-07-01 6:51 wangdich9700
2026-07-01 6:51 ` [PATCH 1/3] ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in cs35l41_hda_bind() wangdich9700
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: wangdich9700 @ 2026-07-01 6:51 UTC (permalink / raw)
To: perex, tiwai, wangdich9700, wangdicheng
Cc: david.rhodes, patches, linux-sound, linux-kernel
From: wangdicheng <wangdicheng@kylinos.cn>
Replace the remaining manual mutex_lock/mutex_unlock pairs in the
HD-Audio subsystem with scoped_guard(), which provides automatic
lock release through RAII-style scope management.
No functional changes in any patch.
wangdicheng (3):
ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in
cs35l41_hda_bind()
ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in
cs35l56_hda_fw_load()
ALSA: hda: Use scoped_guard() for open_mutex in azx_pcm_open()
sound/hda/codecs/side-codecs/cs35l41_hda.c | 57 ++++----
sound/hda/codecs/side-codecs/cs35l56_hda.c | 104 +++++++-------
sound/hda/common/controller.c | 159 +++++++++++----------
3 files changed, 161 insertions(+), 159 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/3] ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in cs35l41_hda_bind() 2026-07-01 6:51 [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling wangdich9700 @ 2026-07-01 6:51 ` wangdich9700 2026-07-01 6:51 ` [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() wangdich9700 2026-07-01 6:51 ` [PATCH 3/3] ALSA: hda: Use scoped_guard() for open_mutex in azx_pcm_open() wangdich9700 2 siblings, 0 replies; 7+ messages in thread From: wangdich9700 @ 2026-07-01 6:51 UTC (permalink / raw) To: perex, tiwai, wangdich9700, wangdicheng Cc: david.rhodes, patches, linux-sound, linux-kernel From: wangdicheng <wangdicheng@kylinos.cn> The rest of the driver already uses guard()/scoped_guard() for fw_mutex. Replace the manual mutex_lock/mutex_unlock pair in cs35l41_hda_bind() with scoped_guard() for consistency. No functional changes. Signed-off-by: wangdicheng <wangdicheng@kylinos.cn> --- sound/hda/codecs/side-codecs/cs35l41_hda.c | 57 +++++++++++----------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/sound/hda/codecs/side-codecs/cs35l41_hda.c b/sound/hda/codecs/side-codecs/cs35l41_hda.c index 64a5bd895fd1..818ea8e3f8d6 100644 --- a/sound/hda/codecs/side-codecs/cs35l41_hda.c +++ b/sound/hda/codecs/side-codecs/cs35l41_hda.c @@ -1482,42 +1482,41 @@ static int cs35l41_hda_bind(struct device *dev, struct device *master, void *mas guard(pm_runtime_active_auto)(dev); - mutex_lock(&cs35l41->fw_mutex); - - comp->dev = dev; - cs35l41->codec = parent->codec; - if (!cs35l41->acpi_subsystem_id) - cs35l41->acpi_subsystem_id = kasprintf(GFP_KERNEL, "%.8x", - cs35l41->codec->core.subsystem_id); - - strscpy(comp->name, dev_name(dev), sizeof(comp->name)); + scoped_guard(mutex, &cs35l41->fw_mutex) { + comp->dev = dev; + cs35l41->codec = parent->codec; + if (!cs35l41->acpi_subsystem_id) + cs35l41->acpi_subsystem_id = kasprintf(GFP_KERNEL, "%.8x", + cs35l41->codec->core.subsystem_id); - cs35l41->firmware_type = CS35L41_HDA_FW_SPK_PROT; + strscpy(comp->name, dev_name(dev), sizeof(comp->name)); - if (firmware_autostart) { - dev_dbg(cs35l41->dev, "Firmware Autostart.\n"); - cs35l41->request_fw_load = true; - if (cs35l41_smart_amp(cs35l41) < 0) - dev_warn(cs35l41->dev, "Cannot Run Firmware, reverting to dsp bypass...\n"); - } else { - dev_dbg(cs35l41->dev, "Firmware Autostart is disabled.\n"); - } + cs35l41->firmware_type = CS35L41_HDA_FW_SPK_PROT; - ret = cs35l41_create_controls(cs35l41); + if (firmware_autostart) { + dev_dbg(cs35l41->dev, "Firmware Autostart.\n"); + cs35l41->request_fw_load = true; + if (cs35l41_smart_amp(cs35l41) < 0) + dev_warn(cs35l41->dev, "Cannot Run Firmware, reverting to dsp bypass...\n"); + } else { + dev_dbg(cs35l41->dev, "Firmware Autostart is disabled.\n"); + } - comp->playback_hook = cs35l41_hda_playback_hook; - comp->pre_playback_hook = cs35l41_hda_pre_playback_hook; - comp->post_playback_hook = cs35l41_hda_post_playback_hook; - comp->acpi_notify = cs35l41_acpi_device_notify; - comp->adev = cs35l41->dacpi; + ret = cs35l41_create_controls(cs35l41); - comp->acpi_notifications_supported = cs35l41_dsm_supported(acpi_device_handle(comp->adev), - CS35L41_DSM_GET_MUTE); + comp->playback_hook = cs35l41_hda_playback_hook; + comp->pre_playback_hook = cs35l41_hda_pre_playback_hook; + comp->post_playback_hook = cs35l41_hda_post_playback_hook; + comp->acpi_notify = cs35l41_acpi_device_notify; + comp->adev = cs35l41->dacpi; - cs35l41->mute_override = cs35l41_get_acpi_mute_state(cs35l41, - acpi_device_handle(cs35l41->dacpi)) > 0; + comp->acpi_notifications_supported = + cs35l41_dsm_supported(acpi_device_handle(comp->adev), + CS35L41_DSM_GET_MUTE); - mutex_unlock(&cs35l41->fw_mutex); + cs35l41->mute_override = cs35l41_get_acpi_mute_state(cs35l41, + acpi_device_handle(cs35l41->dacpi)) > 0; + } sleep_flags = lock_system_sleep(); if (!device_link_add(&cs35l41->codec->core.dev, cs35l41->dev, DL_FLAG_STATELESS)) -- 2.25.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() 2026-07-01 6:51 [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling wangdich9700 2026-07-01 6:51 ` [PATCH 1/3] ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in cs35l41_hda_bind() wangdich9700 @ 2026-07-01 6:51 ` wangdich9700 2026-07-01 9:46 ` Richard Fitzgerald 2026-07-01 6:51 ` [PATCH 3/3] ALSA: hda: Use scoped_guard() for open_mutex in azx_pcm_open() wangdich9700 2 siblings, 1 reply; 7+ messages in thread From: wangdich9700 @ 2026-07-01 6:51 UTC (permalink / raw) To: perex, tiwai, wangdich9700, wangdicheng Cc: david.rhodes, patches, linux-sound, linux-kernel From: wangdicheng <wangdicheng@kylinos.cn> Replace the manual mutex_lock/mutex_unlock of irq_lock with scoped_guard(). This lets the compiler guarantee the lock is released on all exit paths, eliminating the err label that previously existed only to reach the unlock call. No functional changes. Signed-off-by: wangdicheng <wangdicheng@kylinos.cn> --- sound/hda/codecs/side-codecs/cs35l56_hda.c | 104 ++++++++++----------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/side-codecs/cs35l56_hda.c index a0ea08eb96a9..2d9d75053293 100644 --- a/sound/hda/codecs/side-codecs/cs35l56_hda.c +++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c @@ -625,74 +625,72 @@ static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56) goto err_fw_release; } - mutex_lock(&cs35l56->base.irq_lock); + scoped_guard(mutex, &cs35l56->base.irq_lock) { + /* + * If the firmware hasn't been patched it must be shutdown before + * doing a full patch and reset afterwards. If it is already + * running a patched version the firmware files only contain + * tunings and we can use the lower cost reinit sequence instead. + */ + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { + ret = cs35l56_firmware_shutdown(&cs35l56->base); + if (ret) + goto err_fw_release; + } - /* - * If the firmware hasn't been patched it must be shutdown before - * doing a full patch and reset afterwards. If it is already - * running a patched version the firmware files only contain - * tunings and we can use the lower cost reinit sequence instead. - */ - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { - ret = cs35l56_firmware_shutdown(&cs35l56->base); - if (ret) - goto err; - } + ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, + coeff_firmware, coeff_filename, "misc"); + if (ret) { + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); + goto err_fw_release; + } - ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, - coeff_firmware, coeff_filename, "misc"); - if (ret) { - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); - goto err; - } + if (wmfw_filename) + dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); + + if (coeff_filename) + dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); - if (wmfw_filename) - dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); + /* If we downloaded firmware, reset the device and wait for it to boot */ + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { + cs35l56_system_reset(&cs35l56->base, false); + regcache_mark_dirty(cs35l56->base.regmap); + ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); + if (ret) + goto err_powered_up; - if (coeff_filename) - dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); + regcache_cache_only(cs35l56->base.regmap, false); + } - /* If we downloaded firmware, reset the device and wait for it to boot */ - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { - cs35l56_system_reset(&cs35l56->base, false); - regcache_mark_dirty(cs35l56->base.regmap); - ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); + /* Disable auto-hibernate so that runtime_pm has control */ + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); if (ret) goto err_powered_up; - regcache_cache_only(cs35l56->base.regmap, false); - } - - /* Disable auto-hibernate so that runtime_pm has control */ - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); - if (ret) - goto err_powered_up; - - regcache_sync(cs35l56->base.regmap); + regcache_sync(cs35l56->base.regmap); - regmap_clear_bits(cs35l56->base.regmap, - cs35l56->base.fw_reg->prot_sts, - CS35L56_FIRMWARE_MISSING); - cs35l56->base.fw_patched = true; + regmap_clear_bits(cs35l56->base.regmap, + cs35l56->base.fw_reg->prot_sts, + CS35L56_FIRMWARE_MISSING); + cs35l56->base.fw_patched = true; - ret = cs_dsp_run(&cs35l56->cs_dsp); - if (ret) - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); + ret = cs_dsp_run(&cs35l56->cs_dsp); + if (ret) + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); - /* Don't need to check return code, it's not fatal if this fails */ - cs35l56_hda_apply_calibration(cs35l56); + /* Don't need to check return code, it's not fatal if this fails */ + cs35l56_hda_apply_calibration(cs35l56); - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); - if (ret) - cs_dsp_stop(&cs35l56->cs_dsp); + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); + if (ret) + cs_dsp_stop(&cs35l56->cs_dsp); - cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); + cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); err_powered_up: - if (!cs35l56->base.fw_patched) - cs_dsp_power_down(&cs35l56->cs_dsp); -err: - mutex_unlock(&cs35l56->base.irq_lock); + if (!cs35l56->base.fw_patched) + cs_dsp_power_down(&cs35l56->cs_dsp); + } err_fw_release: cs35l56_hda_release_firmware_files(wmfw_firmware, wmfw_filename, coeff_firmware, coeff_filename); -- 2.25.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() 2026-07-01 6:51 ` [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() wangdich9700 @ 2026-07-01 9:46 ` Richard Fitzgerald 2026-07-01 10:03 ` Takashi Iwai 0 siblings, 1 reply; 7+ messages in thread From: Richard Fitzgerald @ 2026-07-01 9:46 UTC (permalink / raw) To: wangdich9700, perex, tiwai, wangdicheng Cc: david.rhodes, patches, linux-sound, linux-kernel On 01/07/2026 7:51 am, wangdich9700@163.com wrote: > From: wangdicheng <wangdicheng@kylinos.cn> > > Replace the manual mutex_lock/mutex_unlock of irq_lock with > scoped_guard(). This lets the compiler guarantee the lock is > released on all exit paths, eliminating the err label that > previously existed only to reach the unlock call. > > No functional changes. > > Signed-off-by: wangdicheng <wangdicheng@kylinos.cn> > --- Is this fixing any bugs? This is a lot of code churn to fix nothing. > sound/hda/codecs/side-codecs/cs35l56_hda.c | 104 ++++++++++----------- > 1 file changed, 51 insertions(+), 53 deletions(-) > > diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/side-codecs/cs35l56_hda.c > index a0ea08eb96a9..2d9d75053293 100644 > --- a/sound/hda/codecs/side-codecs/cs35l56_hda.c > +++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c > @@ -625,74 +625,72 @@ static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56) > goto err_fw_release; > } > > - mutex_lock(&cs35l56->base.irq_lock); > + scoped_guard(mutex, &cs35l56->base.irq_lock) { > + /* > + * If the firmware hasn't been patched it must be shutdown before > + * doing a full patch and reset afterwards. If it is already > + * running a patched version the firmware files only contain > + * tunings and we can use the lower cost reinit sequence instead. > + */ > + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > + ret = cs35l56_firmware_shutdown(&cs35l56->base); > + if (ret) > + goto err_fw_release; > + } > > - /* > - * If the firmware hasn't been patched it must be shutdown before > - * doing a full patch and reset afterwards. If it is already > - * running a patched version the firmware files only contain > - * tunings and we can use the lower cost reinit sequence instead. > - */ > - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > - ret = cs35l56_firmware_shutdown(&cs35l56->base); > - if (ret) > - goto err; > - } > + ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, > + coeff_firmware, coeff_filename, "misc"); > + if (ret) { > + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); > + goto err_fw_release; > + } > > - ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, > - coeff_firmware, coeff_filename, "misc"); > - if (ret) { > - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); > - goto err; > - } > + if (wmfw_filename) > + dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); > + > + if (coeff_filename) > + dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); > > - if (wmfw_filename) > - dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); > + /* If we downloaded firmware, reset the device and wait for it to boot */ > + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > + cs35l56_system_reset(&cs35l56->base, false); > + regcache_mark_dirty(cs35l56->base.regmap); > + ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); > + if (ret) > + goto err_powered_up; > > - if (coeff_filename) > - dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); > + regcache_cache_only(cs35l56->base.regmap, false); > + } > > - /* If we downloaded firmware, reset the device and wait for it to boot */ > - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > - cs35l56_system_reset(&cs35l56->base, false); > - regcache_mark_dirty(cs35l56->base.regmap); > - ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); > + /* Disable auto-hibernate so that runtime_pm has control */ > + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); > if (ret) > goto err_powered_up; > > - regcache_cache_only(cs35l56->base.regmap, false); > - } > - > - /* Disable auto-hibernate so that runtime_pm has control */ > - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); > - if (ret) > - goto err_powered_up; > - > - regcache_sync(cs35l56->base.regmap); > + regcache_sync(cs35l56->base.regmap); > > - regmap_clear_bits(cs35l56->base.regmap, > - cs35l56->base.fw_reg->prot_sts, > - CS35L56_FIRMWARE_MISSING); > - cs35l56->base.fw_patched = true; > + regmap_clear_bits(cs35l56->base.regmap, > + cs35l56->base.fw_reg->prot_sts, > + CS35L56_FIRMWARE_MISSING); > + cs35l56->base.fw_patched = true; > > - ret = cs_dsp_run(&cs35l56->cs_dsp); > - if (ret) > - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); > + ret = cs_dsp_run(&cs35l56->cs_dsp); > + if (ret) > + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); > > - /* Don't need to check return code, it's not fatal if this fails */ > - cs35l56_hda_apply_calibration(cs35l56); > + /* Don't need to check return code, it's not fatal if this fails */ > + cs35l56_hda_apply_calibration(cs35l56); > > - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); > - if (ret) > - cs_dsp_stop(&cs35l56->cs_dsp); > + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); > + if (ret) > + cs_dsp_stop(&cs35l56->cs_dsp); > > - cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); > + cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); > > err_powered_up: > - if (!cs35l56->base.fw_patched) > - cs_dsp_power_down(&cs35l56->cs_dsp); > -err: > - mutex_unlock(&cs35l56->base.irq_lock); > + if (!cs35l56->base.fw_patched) > + cs_dsp_power_down(&cs35l56->cs_dsp); > + } > err_fw_release: > cs35l56_hda_release_firmware_files(wmfw_firmware, wmfw_filename, > coeff_firmware, coeff_filename); ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() 2026-07-01 9:46 ` Richard Fitzgerald @ 2026-07-01 10:03 ` Takashi Iwai 0 siblings, 0 replies; 7+ messages in thread From: Takashi Iwai @ 2026-07-01 10:03 UTC (permalink / raw) To: Richard Fitzgerald Cc: wangdich9700, perex, tiwai, wangdicheng, david.rhodes, patches, linux-sound, linux-kernel On Wed, 01 Jul 2026 11:46:18 +0200, Richard Fitzgerald wrote: > > On 01/07/2026 7:51 am, wangdich9700@163.com wrote: > > From: wangdicheng <wangdicheng@kylinos.cn> > > > > Replace the manual mutex_lock/mutex_unlock of irq_lock with > > scoped_guard(). This lets the compiler guarantee the lock is > > released on all exit paths, eliminating the err label that > > previously existed only to reach the unlock call. > > > > No functional changes. > > > > Signed-off-by: wangdicheng <wangdicheng@kylinos.cn> > > --- > > Is this fixing any bugs? > > This is a lot of code churn to fix nothing. IMO, as a cleanup, such a change *may* be acceptable. Dropping the manual locking calls can reduce the mistakes and makes the code better maintained. Most of changes are due to the indentation, and you can ignore them via -w option of git-diff or git-show. (It's difficult to do it in the review of manual patches, though.) But, one thing still needs to be clarified: such changes must be verified with clang W=1 build, at least, too; the combination of guard() and goto aren't always good. thanks, Takashi > > > sound/hda/codecs/side-codecs/cs35l56_hda.c | 104 ++++++++++----------- > > 1 file changed, 51 insertions(+), 53 deletions(-) > > > > diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/side-codecs/cs35l56_hda.c > > index a0ea08eb96a9..2d9d75053293 100644 > > --- a/sound/hda/codecs/side-codecs/cs35l56_hda.c > > +++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c > > @@ -625,74 +625,72 @@ static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56) > > goto err_fw_release; > > } > > - mutex_lock(&cs35l56->base.irq_lock); > > + scoped_guard(mutex, &cs35l56->base.irq_lock) { > > + /* > > + * If the firmware hasn't been patched it must be shutdown before > > + * doing a full patch and reset afterwards. If it is already > > + * running a patched version the firmware files only contain > > + * tunings and we can use the lower cost reinit sequence instead. > > + */ > > + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > > + ret = cs35l56_firmware_shutdown(&cs35l56->base); > > + if (ret) > > + goto err_fw_release; > > + } > > - /* > > - * If the firmware hasn't been patched it must be shutdown before > > - * doing a full patch and reset afterwards. If it is already > > - * running a patched version the firmware files only contain > > - * tunings and we can use the lower cost reinit sequence instead. > > - */ > > - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > > - ret = cs35l56_firmware_shutdown(&cs35l56->base); > > - if (ret) > > - goto err; > > - } > > + ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, > > + coeff_firmware, coeff_filename, "misc"); > > + if (ret) { > > + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); > > + goto err_fw_release; > > + } > > - ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, > > wmfw_filename, > > - coeff_firmware, coeff_filename, "misc"); > > - if (ret) { > > - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); > > - goto err; > > - } > > + if (wmfw_filename) > > + dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); > > + > > + if (coeff_filename) > > + dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); > > - if (wmfw_filename) > > - dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); > > + /* If we downloaded firmware, reset the device and wait for it to boot */ > > + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > > + cs35l56_system_reset(&cs35l56->base, false); > > + regcache_mark_dirty(cs35l56->base.regmap); > > + ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); > > + if (ret) > > + goto err_powered_up; > > - if (coeff_filename) > > - dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); > > + regcache_cache_only(cs35l56->base.regmap, false); > > + } > > - /* If we downloaded firmware, reset the device and wait for it > > to boot */ > > - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { > > - cs35l56_system_reset(&cs35l56->base, false); > > - regcache_mark_dirty(cs35l56->base.regmap); > > - ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); > > + /* Disable auto-hibernate so that runtime_pm has control */ > > + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); > > if (ret) > > goto err_powered_up; > > - regcache_cache_only(cs35l56->base.regmap, false); > > - } > > - > > - /* Disable auto-hibernate so that runtime_pm has control */ > > - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); > > - if (ret) > > - goto err_powered_up; > > - > > - regcache_sync(cs35l56->base.regmap); > > + regcache_sync(cs35l56->base.regmap); > > - regmap_clear_bits(cs35l56->base.regmap, > > - cs35l56->base.fw_reg->prot_sts, > > - CS35L56_FIRMWARE_MISSING); > > - cs35l56->base.fw_patched = true; > > + regmap_clear_bits(cs35l56->base.regmap, > > + cs35l56->base.fw_reg->prot_sts, > > + CS35L56_FIRMWARE_MISSING); > > + cs35l56->base.fw_patched = true; > > - ret = cs_dsp_run(&cs35l56->cs_dsp); > > - if (ret) > > - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); > > + ret = cs_dsp_run(&cs35l56->cs_dsp); > > + if (ret) > > + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); > > - /* Don't need to check return code, it's not fatal if this > > fails */ > > - cs35l56_hda_apply_calibration(cs35l56); > > + /* Don't need to check return code, it's not fatal if this fails */ > > + cs35l56_hda_apply_calibration(cs35l56); > > - ret = cs35l56_mbox_send(&cs35l56->base, > > CS35L56_MBOX_CMD_AUDIO_REINIT); > > - if (ret) > > - cs_dsp_stop(&cs35l56->cs_dsp); > > + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); > > + if (ret) > > + cs_dsp_stop(&cs35l56->cs_dsp); > > - cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); > > + cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); > > err_powered_up: > > - if (!cs35l56->base.fw_patched) > > - cs_dsp_power_down(&cs35l56->cs_dsp); > > -err: > > - mutex_unlock(&cs35l56->base.irq_lock); > > + if (!cs35l56->base.fw_patched) > > + cs_dsp_power_down(&cs35l56->cs_dsp); > > + } > > err_fw_release: > > cs35l56_hda_release_firmware_files(wmfw_firmware, wmfw_filename, > > coeff_firmware, coeff_filename); > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] ALSA: hda: Use scoped_guard() for open_mutex in azx_pcm_open() 2026-07-01 6:51 [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling wangdich9700 2026-07-01 6:51 ` [PATCH 1/3] ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in cs35l41_hda_bind() wangdich9700 2026-07-01 6:51 ` [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() wangdich9700 @ 2026-07-01 6:51 ` wangdich9700 2 siblings, 0 replies; 7+ messages in thread From: wangdich9700 @ 2026-07-01 6:51 UTC (permalink / raw) To: perex, tiwai, wangdich9700, wangdicheng Cc: david.rhodes, patches, linux-sound, linux-kernel From: wangdicheng <wangdicheng@kylinos.cn> The companion function azx_pcm_close() already uses scoped_guard(mutex, &chip->open_mutex). Replace the manual mutex_lock/mutex_unlock pair in azx_pcm_open() with the same pattern for consistency. No functional changes. Signed-off-by: wangdicheng <wangdicheng@kylinos.cn> --- sound/hda/common/controller.c | 159 ++++++++++++++++++---------------- 1 file changed, 82 insertions(+), 77 deletions(-) diff --git a/sound/hda/common/controller.c b/sound/hda/common/controller.c index afec5c5546ec..2c9aaf74ce7f 100644 --- a/sound/hda/common/controller.c +++ b/sound/hda/common/controller.c @@ -584,86 +584,91 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) int buff_step; snd_hda_codec_pcm_get(apcm->info); - mutex_lock(&chip->open_mutex); - azx_dev = azx_assign_device(chip, substream); - trace_azx_pcm_open(chip, azx_dev); - if (azx_dev == NULL) { - err = -EBUSY; - goto unlock; - } - runtime->private_data = azx_dev; - - runtime->hw = azx_pcm_hw; - if (chip->gts_present) - runtime->hw.info |= SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME; - runtime->hw.channels_min = hinfo->channels_min; - runtime->hw.channels_max = hinfo->channels_max; - runtime->hw.formats = hinfo->formats; - runtime->hw.rates = hinfo->rates; - snd_pcm_limit_hw_rates(runtime); - snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); - - /* avoid wrap-around with wall-clock */ - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME, - 20, - 178000000); - - if (chip->align_buffer_size) - /* constrain buffer sizes to be multiple of 128 - bytes. This is more efficient in terms of memory - access but isn't required by the HDA spec and - prevents users from specifying exact period/buffer - sizes. For example for 44.1kHz, a period size set - to 20ms will be rounded to 19.59ms. */ - buff_step = 128; - else - /* Don't enforce steps on buffer sizes, still need to - be multiple of 4 bytes (HDA spec). Tested on Intel - HDA controllers, may not work on all devices where - option needs to be disabled */ - buff_step = 4; - - snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - buff_step); - snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, - buff_step); - snd_hda_power_up(apcm->codec); - if (hinfo->ops.open) - err = hinfo->ops.open(hinfo, apcm->codec, substream); - else - err = -ENODEV; - if (err < 0) { - azx_release_device(azx_dev); - goto powerdown; - } - snd_pcm_limit_hw_rates(runtime); - /* sanity check */ - if (snd_BUG_ON(!runtime->hw.channels_min) || - snd_BUG_ON(!runtime->hw.channels_max) || - snd_BUG_ON(!runtime->hw.formats) || - snd_BUG_ON(!runtime->hw.rates)) { - azx_release_device(azx_dev); - if (hinfo->ops.close) - hinfo->ops.close(hinfo, apcm->codec, substream); - err = -EINVAL; - goto powerdown; - } + scoped_guard(mutex, &chip->open_mutex) { + azx_dev = azx_assign_device(chip, substream); + trace_azx_pcm_open(chip, azx_dev); + if (azx_dev == NULL) { + err = -EBUSY; + goto unlock; + } + runtime->private_data = azx_dev; + + runtime->hw = azx_pcm_hw; + if (chip->gts_present) + runtime->hw.info |= SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME; + runtime->hw.channels_min = hinfo->channels_min; + runtime->hw.channels_max = hinfo->channels_max; + runtime->hw.formats = hinfo->formats; + runtime->hw.rates = hinfo->rates; + snd_pcm_limit_hw_rates(runtime); + snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); + + /* avoid wrap-around with wall-clock */ + snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME, + 20, + 178000000); + + if (chip->align_buffer_size) + /* + * Constrain buffer sizes to be multiple of 128 + * bytes. This is more efficient in terms of memory + * access but isn't required by the HDA spec and + * prevents users from specifying exact period/buffer + * sizes. For example for 44.1kHz, a period size set + * to 20ms will be rounded to 19.59ms. + */ + buff_step = 128; + else + /* + * Don't enforce steps on buffer sizes, still need to + * be multiple of 4 bytes (HDA spec). Tested on Intel + * HDA controllers, may not work on all devices where + * option needs to be disabled + */ + buff_step = 4; + + snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, + buff_step); + snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, + buff_step); + snd_hda_power_up(apcm->codec); + if (hinfo->ops.open) + err = hinfo->ops.open(hinfo, apcm->codec, substream); + else + err = -ENODEV; + if (err < 0) { + azx_release_device(azx_dev); + goto powerdown; + } + snd_pcm_limit_hw_rates(runtime); + /* sanity check */ + if (snd_BUG_ON(!runtime->hw.channels_min) || + snd_BUG_ON(!runtime->hw.channels_max) || + snd_BUG_ON(!runtime->hw.formats) || + snd_BUG_ON(!runtime->hw.rates)) { + azx_release_device(azx_dev); + if (hinfo->ops.close) + hinfo->ops.close(hinfo, apcm->codec, substream); + err = -EINVAL; + goto powerdown; + } - /* disable LINK_ATIME timestamps for capture streams - until we figure out how to handle digital inputs */ - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; /* legacy */ - runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_LINK_ATIME; - } + /* + * Disable LINK_ATIME timestamps for capture streams + * until we figure out how to handle digital inputs + */ + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { + runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; /* legacy */ + runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_LINK_ATIME; + } - snd_pcm_set_sync(substream); - mutex_unlock(&chip->open_mutex); - return 0; + snd_pcm_set_sync(substream); + return 0; - powerdown: - snd_hda_power_down(apcm->codec); - unlock: - mutex_unlock(&chip->open_mutex); +powerdown: + snd_hda_power_down(apcm->codec); + } +unlock: snd_hda_codec_pcm_put(apcm->info); return err; } -- 2.25.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling
@ 2026-07-01 6:49 wangdich9700
2026-07-01 6:49 ` [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() wangdich9700
0 siblings, 1 reply; 7+ messages in thread
From: wangdich9700 @ 2026-07-01 6:49 UTC (permalink / raw)
To: perex, tiwai, wangdicheng
Cc: david.rhodes, patches, linux-sound, linux-kernel, wangdicheng
From: wangdicheng <wangdicheng@kylinos.cn>
Replace the remaining manual mutex_lock/mutex_unlock pairs in the
HD-Audio subsystem with scoped_guard(), which provides automatic
lock release through RAII-style scope management.
No functional changes in any patch.
wangdicheng (3):
ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in
cs35l41_hda_bind()
ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in
cs35l56_hda_fw_load()
ALSA: hda: Use scoped_guard() for open_mutex in azx_pcm_open()
sound/hda/codecs/side-codecs/cs35l41_hda.c | 57 ++++----
sound/hda/codecs/side-codecs/cs35l56_hda.c | 104 +++++++-------
sound/hda/common/controller.c | 159 +++++++++++----------
3 files changed, 161 insertions(+), 159 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() 2026-07-01 6:49 [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling wangdich9700 @ 2026-07-01 6:49 ` wangdich9700 0 siblings, 0 replies; 7+ messages in thread From: wangdich9700 @ 2026-07-01 6:49 UTC (permalink / raw) To: perex, tiwai, wangdicheng Cc: david.rhodes, patches, linux-sound, linux-kernel, wangdicheng From: wangdicheng <wangdicheng@kylinos.cn> Replace the manual mutex_lock/mutex_unlock of irq_lock with scoped_guard(). This lets the compiler guarantee the lock is released on all exit paths, eliminating the err label that previously existed only to reach the unlock call. No functional changes. Signed-off-by: wangdicheng <wangdicheng@kylinos.cn> --- sound/hda/codecs/side-codecs/cs35l56_hda.c | 104 ++++++++++----------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/side-codecs/cs35l56_hda.c index a0ea08eb96a9..2d9d75053293 100644 --- a/sound/hda/codecs/side-codecs/cs35l56_hda.c +++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c @@ -625,74 +625,72 @@ static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56) goto err_fw_release; } - mutex_lock(&cs35l56->base.irq_lock); + scoped_guard(mutex, &cs35l56->base.irq_lock) { + /* + * If the firmware hasn't been patched it must be shutdown before + * doing a full patch and reset afterwards. If it is already + * running a patched version the firmware files only contain + * tunings and we can use the lower cost reinit sequence instead. + */ + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { + ret = cs35l56_firmware_shutdown(&cs35l56->base); + if (ret) + goto err_fw_release; + } - /* - * If the firmware hasn't been patched it must be shutdown before - * doing a full patch and reset afterwards. If it is already - * running a patched version the firmware files only contain - * tunings and we can use the lower cost reinit sequence instead. - */ - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { - ret = cs35l56_firmware_shutdown(&cs35l56->base); - if (ret) - goto err; - } + ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, + coeff_firmware, coeff_filename, "misc"); + if (ret) { + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); + goto err_fw_release; + } - ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename, - coeff_firmware, coeff_filename, "misc"); - if (ret) { - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret); - goto err; - } + if (wmfw_filename) + dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); + + if (coeff_filename) + dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); - if (wmfw_filename) - dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename); + /* If we downloaded firmware, reset the device and wait for it to boot */ + if (firmware_missing && (wmfw_firmware || coeff_firmware)) { + cs35l56_system_reset(&cs35l56->base, false); + regcache_mark_dirty(cs35l56->base.regmap); + ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); + if (ret) + goto err_powered_up; - if (coeff_filename) - dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename); + regcache_cache_only(cs35l56->base.regmap, false); + } - /* If we downloaded firmware, reset the device and wait for it to boot */ - if (firmware_missing && (wmfw_firmware || coeff_firmware)) { - cs35l56_system_reset(&cs35l56->base, false); - regcache_mark_dirty(cs35l56->base.regmap); - ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); + /* Disable auto-hibernate so that runtime_pm has control */ + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); if (ret) goto err_powered_up; - regcache_cache_only(cs35l56->base.regmap, false); - } - - /* Disable auto-hibernate so that runtime_pm has control */ - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); - if (ret) - goto err_powered_up; - - regcache_sync(cs35l56->base.regmap); + regcache_sync(cs35l56->base.regmap); - regmap_clear_bits(cs35l56->base.regmap, - cs35l56->base.fw_reg->prot_sts, - CS35L56_FIRMWARE_MISSING); - cs35l56->base.fw_patched = true; + regmap_clear_bits(cs35l56->base.regmap, + cs35l56->base.fw_reg->prot_sts, + CS35L56_FIRMWARE_MISSING); + cs35l56->base.fw_patched = true; - ret = cs_dsp_run(&cs35l56->cs_dsp); - if (ret) - dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); + ret = cs_dsp_run(&cs35l56->cs_dsp); + if (ret) + dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret); - /* Don't need to check return code, it's not fatal if this fails */ - cs35l56_hda_apply_calibration(cs35l56); + /* Don't need to check return code, it's not fatal if this fails */ + cs35l56_hda_apply_calibration(cs35l56); - ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); - if (ret) - cs_dsp_stop(&cs35l56->cs_dsp); + ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); + if (ret) + cs_dsp_stop(&cs35l56->cs_dsp); - cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); + cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp); err_powered_up: - if (!cs35l56->base.fw_patched) - cs_dsp_power_down(&cs35l56->cs_dsp); -err: - mutex_unlock(&cs35l56->base.irq_lock); + if (!cs35l56->base.fw_patched) + cs_dsp_power_down(&cs35l56->cs_dsp); + } err_fw_release: cs35l56_hda_release_firmware_files(wmfw_firmware, wmfw_filename, coeff_firmware, coeff_filename); -- 2.25.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-07-01 10:03 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-07-01 6:51 [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling wangdich9700 2026-07-01 6:51 ` [PATCH 1/3] ALSA: hda/cs35l41: Use scoped_guard() for fw_mutex in cs35l41_hda_bind() wangdich9700 2026-07-01 6:51 ` [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() wangdich9700 2026-07-01 9:46 ` Richard Fitzgerald 2026-07-01 10:03 ` Takashi Iwai 2026-07-01 6:51 ` [PATCH 3/3] ALSA: hda: Use scoped_guard() for open_mutex in azx_pcm_open() wangdich9700 -- strict thread matches above, loose matches on Subject: below -- 2026-07-01 6:49 [PATCH 0/3] ALSA: hda: Use scoped_guard() for remaining manual mutex handling wangdich9700 2026-07-01 6:49 ` [PATCH 2/3] ALSA: hda/cs35l56: Use scoped_guard() for irq_lock in cs35l56_hda_fw_load() wangdich9700
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®