From: Richard Fitzgerald <rf@opensource.cirrus.com>
To: broonie@kernel.org
Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
patches@opensource.cirrus.com
Subject: [PATCH 06/10] ASoC: wm_adsp: Use consistent error checks in wm_adsp_request_firmware_files()
Date: Tue, 10 Mar 2026 14:18:13 +0000 [thread overview]
Message-ID: <20260310141817.1871794-7-rf@opensource.cirrus.com> (raw)
In-Reply-To: <20260310141817.1871794-1-rf@opensource.cirrus.com>
Use a consistent pattern of error checking in
wm_adsp_request_firmware_files().
- The integer return value of wm_adsp_request_firmware_file() reports
unrecoverable errors, for example -ENOMEM.
- A NULL struct firmware pointer is a valid result. This not an error,
not all DSPs require both files, some may not require any files.
Previously wm_adsp_request_firmware_files() was using a mix of checking
the return value and checking the struct firmware pointer to determine
whether a file was found. It wasn't checking for unrecoverable errors.
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
---
sound/soc/codecs/wm_adsp.c | 92 +++++++++++++++++++++++++++-----------
1 file changed, 65 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index b904d1e1b00c..69e573507df3 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -753,7 +753,7 @@ static int wm_adsp_request_firmware_file(struct wm_adsp *dsp,
struct cs_dsp *cs_dsp = &dsp->cs_dsp;
const char *fwf;
char *s, c;
- int ret = 0;
+ int ret;
if (dsp->fwf_name)
fwf = dsp->fwf_name;
@@ -791,15 +791,17 @@ static int wm_adsp_request_firmware_file(struct wm_adsp *dsp,
}
ret = wm_adsp_firmware_request(firmware, *filename, cs_dsp->dev);
- if (ret != 0) {
- adsp_dbg(dsp, "Failed to request '%s'\n", *filename);
+ if (ret < 0) {
+ adsp_dbg(dsp, "Failed to request '%s': %d\n", *filename, ret);
kfree(*filename);
*filename = NULL;
+ if (ret != -ENOENT)
+ return ret;
} else {
adsp_dbg(dsp, "Found '%s'\n", *filename);
}
- return ret;
+ return 0;
}
static const char * const cirrus_dir = "cirrus/";
@@ -817,12 +819,19 @@ VISIBLE_IF_KUNIT int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
suffix = dsp->fwf_suffix;
if (system_name && suffix) {
- if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
- cirrus_dir, system_name,
- suffix, "wmfw")) {
- wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
- cirrus_dir, system_name,
- suffix, "bin");
+ ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
+ cirrus_dir, system_name,
+ suffix, "wmfw");
+ if (ret < 0)
+ goto err;
+
+ if (*wmfw_firmware) {
+ ret = wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+ cirrus_dir, system_name,
+ suffix, "bin");
+ if (ret < 0)
+ goto err;
+
return 0;
}
}
@@ -831,16 +840,27 @@ VISIBLE_IF_KUNIT int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
cirrus_dir, system_name,
NULL, "wmfw");
- if (!ret || dsp->wmfw_optional) {
- if (suffix)
- wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
- cirrus_dir, system_name,
- suffix, "bin");
+ if (ret < 0)
+ goto err;
- if (!*coeff_firmware)
- wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
- cirrus_dir, system_name,
- NULL, "bin");
+ if (*wmfw_firmware || dsp->wmfw_optional) {
+ if (suffix) {
+ ret = wm_adsp_request_firmware_file(dsp,
+ coeff_firmware, coeff_filename,
+ cirrus_dir, system_name,
+ suffix, "bin");
+ if (ret < 0)
+ goto err;
+ }
+
+ if (!*coeff_firmware) {
+ ret = wm_adsp_request_firmware_file(dsp,
+ coeff_firmware, coeff_filename,
+ cirrus_dir, system_name,
+ NULL, "bin");
+ if (ret < 0)
+ goto err;
+ }
if (*wmfw_firmware || (dsp->wmfw_optional && *coeff_firmware))
return 0;
@@ -848,19 +868,32 @@ VISIBLE_IF_KUNIT int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
}
/* Check legacy location */
- if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
- "", NULL, NULL, "wmfw")) {
- wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
- "", NULL, NULL, "bin");
+ ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
+ "", NULL, NULL, "wmfw");
+ if (ret < 0)
+ goto err;
+
+ if (*wmfw_firmware) {
+ ret = wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+ "", NULL, NULL, "bin");
+ if (ret < 0)
+ goto err;
+
return 0;
}
/* Fall back to generic wmfw and optional matching bin */
ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
cirrus_dir, NULL, NULL, "wmfw");
- if (!ret || dsp->wmfw_optional) {
- wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
- cirrus_dir, NULL, NULL, "bin");
+ if (ret < 0)
+ goto err;
+
+ if (*wmfw_firmware || dsp->wmfw_optional) {
+ ret = wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+ cirrus_dir, NULL, NULL, "bin");
+ if (ret < 0)
+ goto err;
+
return 0;
}
@@ -869,7 +902,12 @@ VISIBLE_IF_KUNIT int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
dsp->fwf_name ? dsp->fwf_name : dsp->cs_dsp.name,
wm_adsp_fw[dsp->fw].file, system_name, suffix);
- return -ENOENT;
+ ret = -ENOENT;
+err:
+ wm_adsp_release_firmware_files(*wmfw_firmware, *wmfw_filename,
+ *coeff_firmware, *coeff_filename);
+
+ return ret;
}
EXPORT_SYMBOL_IF_KUNIT(wm_adsp_request_firmware_files);
--
2.47.3
next prev parent reply other threads:[~2026-03-10 14:18 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-10 14:18 [PATCH 00/10] ASoC: wm_adsp: Some improvements to firmware file search Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 01/10] ASoC: wm_adsp: Remove unused argument to wm_adsp_release_firmware_files() Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 02/10] ASoC: wm_adsp: Add KUnit redirection stubs for firmware file search Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 03/10] ASoC: wm_adsp: Export function for KUnit test to get firmware filenames Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 04/10] ASoC: wm_adsp: Add kunit test for firmware file search Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 05/10] ASoC: wm_adsp: Remove duplicated code to find firmware file Richard Fitzgerald
2026-03-10 14:18 ` Richard Fitzgerald [this message]
2026-03-10 14:18 ` [PATCH 07/10] ASoC: wm_adsp: Convert '/' to '-' when normalizing firmware filenames Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 08/10] ASoC: wm_adsp: Add KUnit test cases for '/' in " Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 09/10] ASoC: wm_adsp: Use a struct to pass around firmware struct and filename Richard Fitzgerald
2026-03-10 14:18 ` [PATCH 10/10] ASoC: wm_adsp: Combine some similar code in firmware file search Richard Fitzgerald
2026-03-12 17:34 ` [PATCH 00/10] ASoC: wm_adsp: Some improvements to " Mark Brown
2026-03-13 14:58 ` Mark Brown
2026-03-17 15:37 ` Mark Brown
2026-03-17 15:52 ` Charles Keepax
2026-03-17 17:47 ` Charles Keepax
2026-03-17 18:11 ` Mark Brown
2026-03-18 9:31 ` Charles Keepax
2026-03-18 10:27 ` Charles Keepax
2026-03-18 11:15 ` Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260310141817.1871794-7-rf@opensource.cirrus.com \
--to=rf@opensource.cirrus.com \
--cc=broonie@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=patches@opensource.cirrus.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.