未验证 提交 11a9b987 编写于 作者: N Niklas Carlsson 提交者: Mark Brown

ASoC: sigmadsp: Disable cache mechanism for readbacks

The ALSA control readback functionality only works for non-volatile
controls, i.e. control values that does not change on their own without
driver interaction.

This doesn't work for readbacks since the DSP firmware updates the
control value. Disable the cache mechanism in the driver if the control
name matches the prefix used for readbacks to ensure that the control
value is valid.
Signed-off-by: NNiklas Carlsson <niklasc@axis.com>
Link: https://lore.kernel.org/r/20210419144901.9441-1-Niklas.Carlsson@axis.comSigned-off-by: NMark Brown <broonie@kernel.org>
上级 87143bfd
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#define SIGMA_FW_CHUNK_TYPE_CONTROL 1 #define SIGMA_FW_CHUNK_TYPE_CONTROL 1
#define SIGMA_FW_CHUNK_TYPE_SAMPLERATES 2 #define SIGMA_FW_CHUNK_TYPE_SAMPLERATES 2
#define READBACK_CTRL_NAME "ReadBack"
struct sigmadsp_control { struct sigmadsp_control {
struct list_head head; struct list_head head;
uint32_t samplerates; uint32_t samplerates;
...@@ -31,6 +33,7 @@ struct sigmadsp_control { ...@@ -31,6 +33,7 @@ struct sigmadsp_control {
unsigned int num_bytes; unsigned int num_bytes;
const char *name; const char *name;
struct snd_kcontrol *kcontrol; struct snd_kcontrol *kcontrol;
bool is_readback;
bool cached; bool cached;
uint8_t cache[]; uint8_t cache[];
}; };
...@@ -141,7 +144,8 @@ static int sigmadsp_ctrl_put(struct snd_kcontrol *kcontrol, ...@@ -141,7 +144,8 @@ static int sigmadsp_ctrl_put(struct snd_kcontrol *kcontrol,
if (ret == 0) { if (ret == 0) {
memcpy(ctrl->cache, data, ctrl->num_bytes); memcpy(ctrl->cache, data, ctrl->num_bytes);
ctrl->cached = true; if (!ctrl->is_readback)
ctrl->cached = true;
} }
mutex_unlock(&sigmadsp->lock); mutex_unlock(&sigmadsp->lock);
...@@ -164,7 +168,8 @@ static int sigmadsp_ctrl_get(struct snd_kcontrol *kcontrol, ...@@ -164,7 +168,8 @@ static int sigmadsp_ctrl_get(struct snd_kcontrol *kcontrol,
} }
if (ret == 0) { if (ret == 0) {
ctrl->cached = true; if (!ctrl->is_readback)
ctrl->cached = true;
memcpy(ucontrol->value.bytes.data, ctrl->cache, memcpy(ucontrol->value.bytes.data, ctrl->cache,
ctrl->num_bytes); ctrl->num_bytes);
} }
...@@ -231,6 +236,15 @@ static int sigma_fw_load_control(struct sigmadsp *sigmadsp, ...@@ -231,6 +236,15 @@ static int sigma_fw_load_control(struct sigmadsp *sigmadsp,
name[name_len] = '\0'; name[name_len] = '\0';
ctrl->name = name; ctrl->name = name;
/*
* Readbacks doesn't work with non-volatile controls, since the
* firmware updates the control value without driver interaction. Mark
* the readbacks to ensure that the values are not cached.
*/
if (ctrl->name && strncmp(ctrl->name, READBACK_CTRL_NAME,
(sizeof(READBACK_CTRL_NAME) - 1)) == 0)
ctrl->is_readback = true;
ctrl->addr = le16_to_cpu(ctrl_chunk->addr); ctrl->addr = le16_to_cpu(ctrl_chunk->addr);
ctrl->num_bytes = num_bytes; ctrl->num_bytes = num_bytes;
ctrl->samplerates = le32_to_cpu(chunk->samplerates); ctrl->samplerates = le32_to_cpu(chunk->samplerates);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册