diff options
author | Mark Brown <broonie@kernel.org> | 2022-11-25 17:23:03 +0300 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2022-11-25 17:23:03 +0300 |
commit | 57405d8be4921956b8092b2e4516389bb30bdab5 (patch) | |
tree | f9760dac6d28d7acd3135aece7646da0ab52a9eb /drivers/firmware | |
parent | 830a35aa2121258d0c8283abe45ebb5c3d2fd791 (diff) | |
parent | 7406bdbc4fb8b99cf0150cb2056a585c95ceafe7 (diff) | |
download | linux-57405d8be4921956b8092b2e4516389bb30bdab5.tar.xz |
ASoC: wm_adsp: Report when a control write changes the value
Merge series from Richard Fitzgerald <rf@opensource.cirrus.com>:
Writing a firmware control should be returning 1 if the control value
changed, so these two patches add that.
Though this is an ALSA requirement it is also useful for non-ALSA clients
of cs_dsp to know if the control value changed, so the main handling is
implemented in cs_dsp. TLV controls are specifically an ALSA thing so they
are handled specially in wm_adsp.
Simon Trimmer (2):
firmware: cs_dsp: cs_dsp_coeff_write_ctrl() should report changed
ASoC: wm_adsp: Return whether changed when writing controls
drivers/firmware/cirrus/cs_dsp.c | 17 ++++++++++++-----
sound/soc/codecs/wm_adsp.c | 27 ++++++++++++++++++---------
2 files changed, 30 insertions(+), 14 deletions(-)
--
2.30.2
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/cirrus/cs_dsp.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/firmware/cirrus/cs_dsp.c b/drivers/firmware/cirrus/cs_dsp.c index 81cc3d0f6eec..17b7198b87dc 100644 --- a/drivers/firmware/cirrus/cs_dsp.c +++ b/drivers/firmware/cirrus/cs_dsp.c @@ -752,7 +752,7 @@ static int cs_dsp_coeff_write_ctrl_raw(struct cs_dsp_coeff_ctl *ctl, * * Must be called with pwr_lock held. * - * Return: Zero for success, a negative number on error. + * Return: < 0 on error, 1 when the control value changed and 0 when it has not. */ int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl, unsigned int off, const void *buf, size_t len) @@ -767,16 +767,23 @@ int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl, if (len + off * sizeof(u32) > ctl->len) return -EINVAL; - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { ret = -EPERM; - else if (buf != ctl->cache) - memcpy(ctl->cache + off * sizeof(u32), buf, len); + } else if (buf != ctl->cache) { + if (memcmp(ctl->cache + off * sizeof(u32), buf, len)) + memcpy(ctl->cache + off * sizeof(u32), buf, len); + else + return 0; + } ctl->set = 1; if (ctl->enabled && ctl->dsp->running) ret = cs_dsp_coeff_write_ctrl_raw(ctl, off, buf, len); - return ret; + if (ret < 0) + return ret; + + return 1; } EXPORT_SYMBOL_GPL(cs_dsp_coeff_write_ctrl); |