* [PATCH 2/5] ASoC: wm_adsp: Take prefix into account in control name length
2018-07-19 10:50 [PATCH 1/5] ASoC: wm_adsp: Correct algorithm list allocation size Charles Keepax
@ 2018-07-19 10:50 ` Charles Keepax
2018-07-19 16:57 ` Applied "ASoC: wm_adsp: Take prefix into account in control name length" to the asoc tree Mark Brown
2018-07-19 10:50 ` [PATCH 3/5] ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return Charles Keepax
` (3 subsequent siblings)
4 siblings, 1 reply; 10+ messages in thread
From: Charles Keepax @ 2018-07-19 10:50 UTC (permalink / raw)
To: broonie; +Cc: stuarth, patches, rf, lgirdwood, alsa-devel
Currently when creating ALSA control names for the DSP the length of any
prefix applied to the CODEC is not taken into account. Whilst this is
mostly harmless it does result in ALSA doing the truncation of the
control names and printing a warning. It is better to have the driver do
the truncation so it can truncate from the start of parameter name
itself to give a greater chance of the result maintain a unique name.
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
sound/soc/codecs/wm_adsp.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 99108d18de8d..eec73c98a141 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1343,6 +1343,9 @@ static int wm_adsp_create_control(struct wm_adsp *dsp,
int avail = SNDRV_CTL_ELEM_ID_NAME_MAXLEN - ret - 2;
int skip = 0;
+ if (dsp->component->name_prefix)
+ avail -= strlen(dsp->component->name_prefix) + 1;
+
if (subname_len > avail)
skip = subname_len - avail;
--
2.11.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Applied "ASoC: wm_adsp: Take prefix into account in control name length" to the asoc tree
2018-07-19 10:50 ` [PATCH 2/5] ASoC: wm_adsp: Take prefix into account in control name length Charles Keepax
@ 2018-07-19 16:57 ` Mark Brown
0 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2018-07-19 16:57 UTC (permalink / raw)
To: Charles Keepax; +Cc: alsa-devel, patches, lgirdwood, stuarth, rf, broonie
The patch
ASoC: wm_adsp: Take prefix into account in control name length
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From b7ede5af62ab6bfad0980fad58e82d3fb56866df Mon Sep 17 00:00:00 2001
From: Charles Keepax <ckeepax@opensource.cirrus.com>
Date: Thu, 19 Jul 2018 11:50:36 +0100
Subject: [PATCH] ASoC: wm_adsp: Take prefix into account in control name
length
Currently when creating ALSA control names for the DSP the length of any
prefix applied to the CODEC is not taken into account. Whilst this is
mostly harmless it does result in ALSA doing the truncation of the
control names and printing a warning. It is better to have the driver do
the truncation so it can truncate from the start of parameter name
itself to give a greater chance of the result maintain a unique name.
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/wm_adsp.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 99108d18de8d..eec73c98a141 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1343,6 +1343,9 @@ static int wm_adsp_create_control(struct wm_adsp *dsp,
int avail = SNDRV_CTL_ELEM_ID_NAME_MAXLEN - ret - 2;
int skip = 0;
+ if (dsp->component->name_prefix)
+ avail -= strlen(dsp->component->name_prefix) + 1;
+
if (subname_len > avail)
skip = subname_len - avail;
--
2.18.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/5] ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return
2018-07-19 10:50 [PATCH 1/5] ASoC: wm_adsp: Correct algorithm list allocation size Charles Keepax
2018-07-19 10:50 ` [PATCH 2/5] ASoC: wm_adsp: Take prefix into account in control name length Charles Keepax
@ 2018-07-19 10:50 ` Charles Keepax
2018-07-19 16:58 ` Applied "ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return" to the asoc tree Mark Brown
2018-07-19 10:50 ` [PATCH 4/5] ASoC: wm_adsp: Allow up to 8 channels for voice control Charles Keepax
` (2 subsequent siblings)
4 siblings, 1 reply; 10+ messages in thread
From: Charles Keepax @ 2018-07-19 10:50 UTC (permalink / raw)
To: broonie; +Cc: stuarth, patches, rf, lgirdwood, alsa-devel
From: Stuart Henderson <stuarth@opensource.cirrus.com>
All controls derived from the loaded firmware should be created prior
to returning from the preloader's put function, such that they are
immediately available to user-space.
Signed-off-by: Stuart Henderson <stuarth@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
sound/soc/codecs/wm_adsp.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index eec73c98a141..e823a84b5ac2 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -2685,6 +2685,8 @@ int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
snd_soc_dapm_sync(dapm);
+ flush_work(&dsp->boot_work);
+
return 0;
}
EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
--
2.11.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Applied "ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return" to the asoc tree
2018-07-19 10:50 ` [PATCH 3/5] ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return Charles Keepax
@ 2018-07-19 16:58 ` Mark Brown
0 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2018-07-19 16:58 UTC (permalink / raw)
Cc: alsa-devel, Charles Keepax, patches, lgirdwood, stuarth, rf,
broonie
The patch
ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 868e49a4a00afaca07d2c450a02e49581eaece6c Mon Sep 17 00:00:00 2001
From: Stuart Henderson <stuarth@opensource.cirrus.com>
Date: Thu, 19 Jul 2018 11:50:37 +0100
Subject: [PATCH] ASoC: wm_adsp: Ensure DSP boot work complete before
preloader_put return
All controls derived from the loaded firmware should be created prior
to returning from the preloader's put function, such that they are
immediately available to user-space.
Signed-off-by: Stuart Henderson <stuarth@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/wm_adsp.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index b7b914963c62..4e7f8525449e 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -2672,6 +2672,8 @@ int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
snd_soc_dapm_sync(dapm);
+ flush_work(&dsp->boot_work);
+
return 0;
}
EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
--
2.18.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/5] ASoC: wm_adsp: Allow up to 8 channels for voice control
2018-07-19 10:50 [PATCH 1/5] ASoC: wm_adsp: Correct algorithm list allocation size Charles Keepax
2018-07-19 10:50 ` [PATCH 2/5] ASoC: wm_adsp: Take prefix into account in control name length Charles Keepax
2018-07-19 10:50 ` [PATCH 3/5] ASoC: wm_adsp: Ensure DSP boot work complete before preloader_put return Charles Keepax
@ 2018-07-19 10:50 ` Charles Keepax
2018-07-19 16:57 ` Applied "ASoC: wm_adsp: Allow up to 8 channels for voice control" to the asoc tree Mark Brown
2018-07-19 10:50 ` [PATCH 5/5] ASoC: wm_adsp: Parse HOST_BUFFER controls Charles Keepax
2018-07-19 16:57 ` Applied "ASoC: wm_adsp: Correct algorithm list allocation size" " Mark Brown
4 siblings, 1 reply; 10+ messages in thread
From: Charles Keepax @ 2018-07-19 10:50 UTC (permalink / raw)
To: broonie; +Cc: stuarth, patches, rf, lgirdwood, alsa-devel
From: Richard Fitzgerald <rf@opensource.cirrus.com>
Newer voice control firmwares can capture multiple audio channels.
Allow up to 8 channels for future-proofing.
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
sound/soc/codecs/wm_adsp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index e823a84b5ac2..287ca8d6a9ce 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -418,7 +418,7 @@ static const struct wm_adsp_fw_caps ctrl_caps[] = {
{
.id = SND_AUDIOCODEC_BESPOKE,
.desc = {
- .max_ch = 1,
+ .max_ch = 8,
.sample_rates = { 16000 },
.num_sample_rates = 1,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
--
2.11.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Applied "ASoC: wm_adsp: Allow up to 8 channels for voice control" to the asoc tree
2018-07-19 10:50 ` [PATCH 4/5] ASoC: wm_adsp: Allow up to 8 channels for voice control Charles Keepax
@ 2018-07-19 16:57 ` Mark Brown
0 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2018-07-19 16:57 UTC (permalink / raw)
Cc: alsa-devel, Charles Keepax, patches, lgirdwood, stuarth, rf,
broonie
The patch
ASoC: wm_adsp: Allow up to 8 channels for voice control
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 3bbc2705a3d132b9a86a0e4083f82a2b3c9bfdfd Mon Sep 17 00:00:00 2001
From: Richard Fitzgerald <rf@opensource.cirrus.com>
Date: Thu, 19 Jul 2018 11:50:38 +0100
Subject: [PATCH] ASoC: wm_adsp: Allow up to 8 channels for voice control
Newer voice control firmwares can capture multiple audio channels.
Allow up to 8 channels for future-proofing.
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/wm_adsp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index eec73c98a141..aeb1b8c27670 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -418,7 +418,7 @@ static const struct wm_adsp_fw_caps ctrl_caps[] = {
{
.id = SND_AUDIOCODEC_BESPOKE,
.desc = {
- .max_ch = 1,
+ .max_ch = 8,
.sample_rates = { 16000 },
.num_sample_rates = 1,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
--
2.18.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 5/5] ASoC: wm_adsp: Parse HOST_BUFFER controls
2018-07-19 10:50 [PATCH 1/5] ASoC: wm_adsp: Correct algorithm list allocation size Charles Keepax
` (2 preceding siblings ...)
2018-07-19 10:50 ` [PATCH 4/5] ASoC: wm_adsp: Allow up to 8 channels for voice control Charles Keepax
@ 2018-07-19 10:50 ` Charles Keepax
2018-07-19 16:57 ` Applied "ASoC: wm_adsp: Parse HOST_BUFFER controls" to the asoc tree Mark Brown
2018-07-19 16:57 ` Applied "ASoC: wm_adsp: Correct algorithm list allocation size" " Mark Brown
4 siblings, 1 reply; 10+ messages in thread
From: Charles Keepax @ 2018-07-19 10:50 UTC (permalink / raw)
To: broonie; +Cc: stuarth, patches, rf, lgirdwood, alsa-devel
From: Richard Fitzgerald <rf@opensource.cirrus.com>
Currently the compressed streams in DSP firmwares are
identified essentially by looking at a fixed location inside
the firmware. This is fragile and also limits things to a
single compressed stream.
Here a new form of firmware parameter is added, the HOST_BUFFER
which identifies a compressed stream from meta-data in the
firmware file. This is more robust and allows for the possiblity
of using multiple streams per core in the future. Currently the
implementation is still limited to a single stream and will
use the first HOST_BUFFER parameter encountered. If there aren't
any HOST_BUFFER parameters it will fall back to the legacy way
of finding the host buffer.
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
sound/soc/codecs/wm_adsp.c | 66 +++++++++++++++++++++++++++++++++++++++++++++-
sound/soc/codecs/wmfw.h | 1 +
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 287ca8d6a9ce..3bc1bb5504a1 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1607,6 +1607,15 @@ static int wm_adsp_parse_coeff(struct wm_adsp *dsp,
if (ret)
return -EINVAL;
break;
+ case WMFW_CTL_TYPE_HOST_BUFFER:
+ ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk,
+ WMFW_CTL_FLAG_SYS |
+ WMFW_CTL_FLAG_VOLATILE |
+ WMFW_CTL_FLAG_READABLE,
+ 0);
+ if (ret)
+ return -EINVAL;
+ break;
default:
adsp_err(dsp, "Unknown control type: %d\n",
coeff_blk.ctl_type);
@@ -3202,7 +3211,7 @@ static inline int wm_adsp_buffer_write(struct wm_adsp_compr_buf *buf,
buf->host_buf_ptr + field_offset, data);
}
-static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
+static int wm_adsp_legacy_host_buf_addr(struct wm_adsp_compr_buf *buf)
{
struct wm_adsp_alg_region *alg_region;
struct wm_adsp *dsp = buf->dsp;
@@ -3241,6 +3250,61 @@ static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
return 0;
}
+static struct wm_coeff_ctl *
+wm_adsp_find_host_buffer_ctrl(struct wm_adsp_compr_buf *buf)
+{
+ struct wm_adsp *dsp = buf->dsp;
+ struct wm_coeff_ctl *ctl;
+
+ list_for_each_entry(ctl, &dsp->ctl_list, list) {
+ if (ctl->type != WMFW_CTL_TYPE_HOST_BUFFER)
+ continue;
+
+ if (!ctl->enabled)
+ continue;
+
+ return ctl;
+ }
+
+ return NULL;
+}
+
+static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
+{
+ struct wm_adsp *dsp = buf->dsp;
+ struct wm_coeff_ctl *ctl;
+ unsigned int reg;
+ u32 val;
+ int i, ret;
+
+ ctl = wm_adsp_find_host_buffer_ctrl(buf);
+ if (!ctl)
+ return wm_adsp_legacy_host_buf_addr(buf);
+
+ ret = wm_coeff_base_reg(ctl, ®);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < 5; ++i) {
+ ret = regmap_raw_read(dsp->regmap, reg, &val, sizeof(val));
+ if (ret < 0)
+ return ret;
+
+ if (val)
+ break;
+
+ usleep_range(1000, 2000);
+ }
+
+ if (!val)
+ return -EIO;
+
+ buf->host_buf_ptr = be32_to_cpu(val);
+ adsp_dbg(dsp, "host_buf_ptr=%x\n", buf->host_buf_ptr);
+
+ return 0;
+}
+
static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf)
{
const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps;
diff --git a/sound/soc/codecs/wmfw.h b/sound/soc/codecs/wmfw.h
index ec78b9da020f..0c3f50acb8b1 100644
--- a/sound/soc/codecs/wmfw.h
+++ b/sound/soc/codecs/wmfw.h
@@ -29,6 +29,7 @@
/* Non-ALSA coefficient types start at 0x1000 */
#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */
#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
+#define WMFW_CTL_TYPE_HOST_BUFFER 0x1002 /* host buffer pointer */
struct wmfw_header {
char magic[4];
--
2.11.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Applied "ASoC: wm_adsp: Parse HOST_BUFFER controls" to the asoc tree
2018-07-19 10:50 ` [PATCH 5/5] ASoC: wm_adsp: Parse HOST_BUFFER controls Charles Keepax
@ 2018-07-19 16:57 ` Mark Brown
0 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2018-07-19 16:57 UTC (permalink / raw)
Cc: alsa-devel, Charles Keepax, patches, lgirdwood, stuarth, rf,
broonie
The patch
ASoC: wm_adsp: Parse HOST_BUFFER controls
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From d52ed4b0bc73c1c7816f5b7a36229a95acfc76c8 Mon Sep 17 00:00:00 2001
From: Richard Fitzgerald <rf@opensource.cirrus.com>
Date: Thu, 19 Jul 2018 11:50:39 +0100
Subject: [PATCH] ASoC: wm_adsp: Parse HOST_BUFFER controls
Currently the compressed streams in DSP firmwares are
identified essentially by looking at a fixed location inside
the firmware. This is fragile and also limits things to a
single compressed stream.
Here a new form of firmware parameter is added, the HOST_BUFFER
which identifies a compressed stream from meta-data in the
firmware file. This is more robust and allows for the possiblity
of using multiple streams per core in the future. Currently the
implementation is still limited to a single stream and will
use the first HOST_BUFFER parameter encountered. If there aren't
any HOST_BUFFER parameters it will fall back to the legacy way
of finding the host buffer.
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/wm_adsp.c | 66 +++++++++++++++++++++++++++++++++++++-
sound/soc/codecs/wmfw.h | 1 +
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index aeb1b8c27670..e39b0e0b04df 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1607,6 +1607,15 @@ static int wm_adsp_parse_coeff(struct wm_adsp *dsp,
if (ret)
return -EINVAL;
break;
+ case WMFW_CTL_TYPE_HOST_BUFFER:
+ ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk,
+ WMFW_CTL_FLAG_SYS |
+ WMFW_CTL_FLAG_VOLATILE |
+ WMFW_CTL_FLAG_READABLE,
+ 0);
+ if (ret)
+ return -EINVAL;
+ break;
default:
adsp_err(dsp, "Unknown control type: %d\n",
coeff_blk.ctl_type);
@@ -3200,7 +3209,7 @@ static inline int wm_adsp_buffer_write(struct wm_adsp_compr_buf *buf,
buf->host_buf_ptr + field_offset, data);
}
-static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
+static int wm_adsp_legacy_host_buf_addr(struct wm_adsp_compr_buf *buf)
{
struct wm_adsp_alg_region *alg_region;
struct wm_adsp *dsp = buf->dsp;
@@ -3239,6 +3248,61 @@ static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
return 0;
}
+static struct wm_coeff_ctl *
+wm_adsp_find_host_buffer_ctrl(struct wm_adsp_compr_buf *buf)
+{
+ struct wm_adsp *dsp = buf->dsp;
+ struct wm_coeff_ctl *ctl;
+
+ list_for_each_entry(ctl, &dsp->ctl_list, list) {
+ if (ctl->type != WMFW_CTL_TYPE_HOST_BUFFER)
+ continue;
+
+ if (!ctl->enabled)
+ continue;
+
+ return ctl;
+ }
+
+ return NULL;
+}
+
+static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
+{
+ struct wm_adsp *dsp = buf->dsp;
+ struct wm_coeff_ctl *ctl;
+ unsigned int reg;
+ u32 val;
+ int i, ret;
+
+ ctl = wm_adsp_find_host_buffer_ctrl(buf);
+ if (!ctl)
+ return wm_adsp_legacy_host_buf_addr(buf);
+
+ ret = wm_coeff_base_reg(ctl, ®);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < 5; ++i) {
+ ret = regmap_raw_read(dsp->regmap, reg, &val, sizeof(val));
+ if (ret < 0)
+ return ret;
+
+ if (val)
+ break;
+
+ usleep_range(1000, 2000);
+ }
+
+ if (!val)
+ return -EIO;
+
+ buf->host_buf_ptr = be32_to_cpu(val);
+ adsp_dbg(dsp, "host_buf_ptr=%x\n", buf->host_buf_ptr);
+
+ return 0;
+}
+
static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf)
{
const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps;
diff --git a/sound/soc/codecs/wmfw.h b/sound/soc/codecs/wmfw.h
index ec78b9da020f..0c3f50acb8b1 100644
--- a/sound/soc/codecs/wmfw.h
+++ b/sound/soc/codecs/wmfw.h
@@ -29,6 +29,7 @@
/* Non-ALSA coefficient types start at 0x1000 */
#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */
#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
+#define WMFW_CTL_TYPE_HOST_BUFFER 0x1002 /* host buffer pointer */
struct wmfw_header {
char magic[4];
--
2.18.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Applied "ASoC: wm_adsp: Correct algorithm list allocation size" to the asoc tree
2018-07-19 10:50 [PATCH 1/5] ASoC: wm_adsp: Correct algorithm list allocation size Charles Keepax
` (3 preceding siblings ...)
2018-07-19 10:50 ` [PATCH 5/5] ASoC: wm_adsp: Parse HOST_BUFFER controls Charles Keepax
@ 2018-07-19 16:57 ` Mark Brown
4 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2018-07-19 16:57 UTC (permalink / raw)
To: Charles Keepax; +Cc: alsa-devel, patches, lgirdwood, stuarth, rf, broonie
The patch
ASoC: wm_adsp: Correct algorithm list allocation size
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 517ee74e1b3124b696f293aa4e220418f8125b4c Mon Sep 17 00:00:00 2001
From: Charles Keepax <ckeepax@opensource.cirrus.com>
Date: Thu, 19 Jul 2018 11:50:35 +0100
Subject: [PATCH] ASoC: wm_adsp: Correct algorithm list allocation size
Commit 6396bb221514 ("treewide: kzalloc() -> kcalloc()") was
overlooked when doing some refactoring to the algorithm list
handling, which lead to twice as much buffer being allocated
as required for reading the algorithm list. A kcalloc is no
longer appropriate since the allocation size is now in bytes
not registers, as such change back to kzalloc.
Fixes: 7f7cca08abf4 ("ASoC: wm_adsp: Simplify handling of alg offset and length")
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/wm_adsp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 07c17acc8a4f..99108d18de8d 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1906,7 +1906,7 @@ static void *wm_adsp_read_algs(struct wm_adsp *dsp, size_t n_algs,
/* Convert length from DSP words to bytes */
len *= sizeof(u32);
- alg = kcalloc(len, 2, GFP_KERNEL | GFP_DMA);
+ alg = kzalloc(len, GFP_KERNEL | GFP_DMA);
if (!alg)
return ERR_PTR(-ENOMEM);
--
2.18.0
^ permalink raw reply related [flat|nested] 10+ messages in thread