* [PATCH v2 1/6] ASoC: amd: yc: Adjust the gain for PDM DMIC
2023-01-30 22:07 [PATCH v2 0/6] Fix default DMIC gain on AMD PDM drivers Mario Limonciello
@ 2023-01-30 22:07 ` Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 2/6] ASoC: amd: yc: Add a module parameter to influence pdm_gain Mario Limonciello
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Mario Limonciello @ 2023-01-30 22:07 UTC (permalink / raw)
To: Jaroslav Kysela, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Mario Limonciello,
Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
alsa-devel
A number of users for Lenovo Rembrandt based laptops are
reporting that the microphone is too quiet relative to
Windows with a dual boot.
Increase the PDM gain to overcome this problem.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
sound/soc/amd/yc/acp6x.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/amd/yc/acp6x.h b/sound/soc/amd/yc/acp6x.h
index 74b596e6807ad..846ca10e24d3f 100644
--- a/sound/soc/amd/yc/acp6x.h
+++ b/sound/soc/amd/yc/acp6x.h
@@ -31,7 +31,7 @@
#define ACP_ERROR_STAT 29
#define PDM_DECIMATION_FACTOR 2
#define ACP_PDM_CLK_FREQ_MASK 7
-#define ACP_WOV_MISC_CTRL_MASK 0x10
+#define ACP_WOV_MISC_CTRL_MASK 0x18
#define ACP_PDM_ENABLE 1
#define ACP_PDM_DISABLE 0
#define ACP_PDM_DMA_EN_STATUS 2
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 2/6] ASoC: amd: yc: Add a module parameter to influence pdm_gain
2023-01-30 22:07 [PATCH v2 0/6] Fix default DMIC gain on AMD PDM drivers Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 1/6] ASoC: amd: yc: Adjust the gain for PDM DMIC Mario Limonciello
@ 2023-01-30 22:07 ` Mario Limonciello
2023-01-30 22:26 ` Jaroslav Kysela
2023-01-30 22:07 ` [PATCH v2 3/6] ASoC: amd: renoir: Adjust the gain for PDM DMIC Mario Limonciello
` (3 subsequent siblings)
5 siblings, 1 reply; 8+ messages in thread
From: Mario Limonciello @ 2023-01-30 22:07 UTC (permalink / raw)
To: Jaroslav Kysela, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Mario Limonciello,
Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
alsa-devel
In case of regressions for any users that the new pdm_gain value is
too high and for additional debugging, introduce a module parameter
that would let them configure it.
This parameter should be removed in the future:
* If it's determined that the parameter is not needed, just hardcode
the correct value as before
* If users do end up using it to debug and report different values
we should introduce a config knob that can have policy set by ucm.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v1->v2:
* Add a guard for values > 3 to overflow the FIELD_PREP
* Clear ACP_WOV_GAIN_CONTROL before setting it
---
sound/soc/amd/yc/acp6x-pdm-dma.c | 10 +++++++++-
sound/soc/amd/yc/acp6x.h | 2 +-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/sound/soc/amd/yc/acp6x-pdm-dma.c b/sound/soc/amd/yc/acp6x-pdm-dma.c
index acecd6a4ec4b1..2bb3ea14bae9c 100644
--- a/sound/soc/amd/yc/acp6x-pdm-dma.c
+++ b/sound/soc/amd/yc/acp6x-pdm-dma.c
@@ -7,6 +7,7 @@
#include <linux/platform_device.h>
#include <linux/module.h>
+#include <linux/bitfield.h>
#include <linux/err.h>
#include <linux/io.h>
#include <sound/pcm_params.h>
@@ -18,6 +19,10 @@
#define DRV_NAME "acp_yc_pdm_dma"
+static int pdm_gain = 3;
+module_param(pdm_gain, int, 0644);
+MODULE_PARM_DESC(pdm_gain, "Gain control (0-3)");
+
static const struct snd_pcm_hardware acp6x_pdm_hardware_capture = {
.info = SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@@ -55,7 +60,10 @@ static void acp6x_enable_pdm_clock(void __iomem *acp_base)
acp6x_writel(pdm_clk_enable, acp_base + ACP_WOV_CLK_CTRL);
pdm_ctrl = acp6x_readl(acp_base + ACP_WOV_MISC_CTRL);
- pdm_ctrl |= ACP_WOV_MISC_CTRL_MASK;
+ pdm_ctrl &= FIELD_PREP(ACP_WOV_GAIN_CONTROL, 0);
+ if (pdm_gain > 3)
+ pdm_gain = 3;
+ pdm_ctrl |= FIELD_PREP(ACP_WOV_GAIN_CONTROL, pdm_gain);
acp6x_writel(pdm_ctrl, acp_base + ACP_WOV_MISC_CTRL);
}
diff --git a/sound/soc/amd/yc/acp6x.h b/sound/soc/amd/yc/acp6x.h
index 846ca10e24d3f..036207568c048 100644
--- a/sound/soc/amd/yc/acp6x.h
+++ b/sound/soc/amd/yc/acp6x.h
@@ -31,7 +31,7 @@
#define ACP_ERROR_STAT 29
#define PDM_DECIMATION_FACTOR 2
#define ACP_PDM_CLK_FREQ_MASK 7
-#define ACP_WOV_MISC_CTRL_MASK 0x18
+#define ACP_WOV_GAIN_CONTROL GENMASK(4, 3)
#define ACP_PDM_ENABLE 1
#define ACP_PDM_DISABLE 0
#define ACP_PDM_DMA_EN_STATUS 2
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH v2 2/6] ASoC: amd: yc: Add a module parameter to influence pdm_gain
2023-01-30 22:07 ` [PATCH v2 2/6] ASoC: amd: yc: Add a module parameter to influence pdm_gain Mario Limonciello
@ 2023-01-30 22:26 ` Jaroslav Kysela
0 siblings, 0 replies; 8+ messages in thread
From: Jaroslav Kysela @ 2023-01-30 22:26 UTC (permalink / raw)
To: Mario Limonciello, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Liam Girdwood, Mark Brown,
Jaroslav Kysela, Takashi Iwai, alsa-devel
On 30. 01. 23 23:07, Mario Limonciello wrote:
> In case of regressions for any users that the new pdm_gain value is
> too high and for additional debugging, introduce a module parameter
> that would let them configure it.
>
> This parameter should be removed in the future:
> * If it's determined that the parameter is not needed, just hardcode
> the correct value as before
> * If users do end up using it to debug and report different values
> we should introduce a config knob that can have policy set by ucm.
>
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> v1->v2:
> * Add a guard for values > 3 to overflow the FIELD_PREP
> * Clear ACP_WOV_GAIN_CONTROL before setting it
> ---
> sound/soc/amd/yc/acp6x-pdm-dma.c | 10 +++++++++-
> sound/soc/amd/yc/acp6x.h | 2 +-
> 2 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/sound/soc/amd/yc/acp6x-pdm-dma.c b/sound/soc/amd/yc/acp6x-pdm-dma.c
> index acecd6a4ec4b1..2bb3ea14bae9c 100644
> --- a/sound/soc/amd/yc/acp6x-pdm-dma.c
> +++ b/sound/soc/amd/yc/acp6x-pdm-dma.c
> @@ -7,6 +7,7 @@
>
> #include <linux/platform_device.h>
> #include <linux/module.h>
> +#include <linux/bitfield.h>
> #include <linux/err.h>
> #include <linux/io.h>
> #include <sound/pcm_params.h>
> @@ -18,6 +19,10 @@
>
> #define DRV_NAME "acp_yc_pdm_dma"
>
> +static int pdm_gain = 3;
> +module_param(pdm_gain, int, 0644);
> +MODULE_PARM_DESC(pdm_gain, "Gain control (0-3)");
> +
> static const struct snd_pcm_hardware acp6x_pdm_hardware_capture = {
> .info = SNDRV_PCM_INFO_INTERLEAVED |
> SNDRV_PCM_INFO_BLOCK_TRANSFER |
> @@ -55,7 +60,10 @@ static void acp6x_enable_pdm_clock(void __iomem *acp_base)
>
> acp6x_writel(pdm_clk_enable, acp_base + ACP_WOV_CLK_CTRL);
> pdm_ctrl = acp6x_readl(acp_base + ACP_WOV_MISC_CTRL);
> - pdm_ctrl |= ACP_WOV_MISC_CTRL_MASK;
> + pdm_ctrl &= FIELD_PREP(ACP_WOV_GAIN_CONTROL, 0);
It should be 'pdm_ctrl &= ~ACP_WOV_GAIN_CONTROL' see include/linux/bitfield.h
(Modify: comment).
> + if (pdm_gain > 3)
> + pdm_gain = 3;
Negative values are not handled. Use clamp(pdm_gain, 0, 3) - see
include/linux/minmax.h.
> + pdm_ctrl |= FIELD_PREP(ACP_WOV_GAIN_CONTROL, pdm_gain);
> acp6x_writel(pdm_ctrl, acp_base + ACP_WOV_MISC_CTRL);
Jaroslav
--
Jaroslav Kysela <perex@perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/6] ASoC: amd: renoir: Adjust the gain for PDM DMIC
2023-01-30 22:07 [PATCH v2 0/6] Fix default DMIC gain on AMD PDM drivers Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 1/6] ASoC: amd: yc: Adjust the gain for PDM DMIC Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 2/6] ASoC: amd: yc: Add a module parameter to influence pdm_gain Mario Limonciello
@ 2023-01-30 22:07 ` Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 4/6] ASoC: amd: renoir: Add a module parameter to influence pdm_gain Mario Limonciello
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Mario Limonciello @ 2023-01-30 22:07 UTC (permalink / raw)
To: Jaroslav Kysela, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Mario Limonciello,
Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
alsa-devel
A similar issue that was reported on Rembrandt based laptops with
low DMIC volume is also being reported for Barcelo based laptops
that use renoir acp3x.
Increase the PDM gain to overcome this problem.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
sound/soc/amd/renoir/rn_acp3x.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/amd/renoir/rn_acp3x.h b/sound/soc/amd/renoir/rn_acp3x.h
index ca586603d7203..c174f84650d24 100644
--- a/sound/soc/amd/renoir/rn_acp3x.h
+++ b/sound/soc/amd/renoir/rn_acp3x.h
@@ -34,7 +34,7 @@
#define ACP_ERROR_STAT 29
#define PDM_DECIMATION_FACTOR 0x2
#define ACP_PDM_CLK_FREQ_MASK 0x07
-#define ACP_WOV_MISC_CTRL_MASK 0x10
+#define ACP_WOV_MISC_CTRL_MASK 0x18
#define ACP_PDM_ENABLE 0x01
#define ACP_PDM_DISABLE 0x00
#define ACP_PDM_DMA_EN_STATUS 0x02
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 4/6] ASoC: amd: renoir: Add a module parameter to influence pdm_gain
2023-01-30 22:07 [PATCH v2 0/6] Fix default DMIC gain on AMD PDM drivers Mario Limonciello
` (2 preceding siblings ...)
2023-01-30 22:07 ` [PATCH v2 3/6] ASoC: amd: renoir: Adjust the gain for PDM DMIC Mario Limonciello
@ 2023-01-30 22:07 ` Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 5/6] ASoC: amd: ps: Adjust the gain for PDM DMIC Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 6/6] ASoC: amd: ps: Add a module parameter to influence pdm_gain Mario Limonciello
5 siblings, 0 replies; 8+ messages in thread
From: Mario Limonciello @ 2023-01-30 22:07 UTC (permalink / raw)
To: Jaroslav Kysela, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Mario Limonciello,
Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
alsa-devel
In case of regressions for any users that the new pdm_gain value is
too high and for additional debugging, introduce a module parameter
that would let them configure it.
This parameter should be removed in the future:
* If it's determined that the parameter is not needed, just hardcode
the correct value as before
* If users do end up using it to debug and report different values
we should introduce a config knob that can have policy set by ucm.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v1->v2:
* Add a guard for values > 3 to overflow the FIELD_PREP
* Clear ACP_WOV_GAIN_CONTROL before setting it
---
sound/soc/amd/renoir/acp3x-pdm-dma.c | 10 +++++++++-
sound/soc/amd/renoir/rn_acp3x.h | 2 +-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/sound/soc/amd/renoir/acp3x-pdm-dma.c b/sound/soc/amd/renoir/acp3x-pdm-dma.c
index 7203c6488df0e..4582d4b8cdf73 100644
--- a/sound/soc/amd/renoir/acp3x-pdm-dma.c
+++ b/sound/soc/amd/renoir/acp3x-pdm-dma.c
@@ -6,6 +6,7 @@
#include <linux/platform_device.h>
#include <linux/module.h>
+#include <linux/bitfield.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/pm_runtime.h>
@@ -17,6 +18,10 @@
#define DRV_NAME "acp_rn_pdm_dma"
+static int pdm_gain = 3;
+module_param(pdm_gain, int, 0644);
+MODULE_PARM_DESC(pdm_gain, "Gain control (0-3)");
+
static const struct snd_pcm_hardware acp_pdm_hardware_capture = {
.info = SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@@ -80,7 +85,10 @@ static void enable_pdm_clock(void __iomem *acp_base)
rn_writel(pdm_clk_enable, acp_base + ACP_WOV_CLK_CTRL);
pdm_ctrl = rn_readl(acp_base + ACP_WOV_MISC_CTRL);
- pdm_ctrl |= ACP_WOV_MISC_CTRL_MASK;
+ pdm_ctrl &= FIELD_PREP(ACP_WOV_GAIN_CONTROL, 0);
+ if (pdm_gain > 3)
+ pdm_gain = 3;
+ pdm_ctrl |= FIELD_PREP(ACP_WOV_GAIN_CONTROL, pdm_gain);
rn_writel(pdm_ctrl, acp_base + ACP_WOV_MISC_CTRL);
}
diff --git a/sound/soc/amd/renoir/rn_acp3x.h b/sound/soc/amd/renoir/rn_acp3x.h
index c174f84650d24..7d0f4e6a2834d 100644
--- a/sound/soc/amd/renoir/rn_acp3x.h
+++ b/sound/soc/amd/renoir/rn_acp3x.h
@@ -34,7 +34,7 @@
#define ACP_ERROR_STAT 29
#define PDM_DECIMATION_FACTOR 0x2
#define ACP_PDM_CLK_FREQ_MASK 0x07
-#define ACP_WOV_MISC_CTRL_MASK 0x18
+#define ACP_WOV_GAIN_CONTROL GENMASK(4, 3)
#define ACP_PDM_ENABLE 0x01
#define ACP_PDM_DISABLE 0x00
#define ACP_PDM_DMA_EN_STATUS 0x02
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 5/6] ASoC: amd: ps: Adjust the gain for PDM DMIC
2023-01-30 22:07 [PATCH v2 0/6] Fix default DMIC gain on AMD PDM drivers Mario Limonciello
` (3 preceding siblings ...)
2023-01-30 22:07 ` [PATCH v2 4/6] ASoC: amd: renoir: Add a module parameter to influence pdm_gain Mario Limonciello
@ 2023-01-30 22:07 ` Mario Limonciello
2023-01-30 22:07 ` [PATCH v2 6/6] ASoC: amd: ps: Add a module parameter to influence pdm_gain Mario Limonciello
5 siblings, 0 replies; 8+ messages in thread
From: Mario Limonciello @ 2023-01-30 22:07 UTC (permalink / raw)
To: Jaroslav Kysela, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Mario Limonciello,
Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
alsa-devel
No issues have been reported yet for DMIC audio level on ps platforms,
but as problems were found both on YC (Rembrandt) and Renoir based
designs it's very likely they happen on ps too.
Increase the PDM gain to solve this problem.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
sound/soc/amd/ps/acp63.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/amd/ps/acp63.h b/sound/soc/amd/ps/acp63.h
index 5e7f9c1c1b0e8..bae8288d8231c 100644
--- a/sound/soc/amd/ps/acp63.h
+++ b/sound/soc/amd/ps/acp63.h
@@ -30,7 +30,7 @@
#define ACP_ERROR_STAT 29
#define PDM_DECIMATION_FACTOR 2
#define ACP_PDM_CLK_FREQ_MASK 7
-#define ACP_WOV_MISC_CTRL_MASK 0x10
+#define ACP_WOV_MISC_CTRL_MASK 0x18
#define ACP_PDM_ENABLE 1
#define ACP_PDM_DISABLE 0
#define ACP_PDM_DMA_EN_STATUS 2
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 6/6] ASoC: amd: ps: Add a module parameter to influence pdm_gain
2023-01-30 22:07 [PATCH v2 0/6] Fix default DMIC gain on AMD PDM drivers Mario Limonciello
` (4 preceding siblings ...)
2023-01-30 22:07 ` [PATCH v2 5/6] ASoC: amd: ps: Adjust the gain for PDM DMIC Mario Limonciello
@ 2023-01-30 22:07 ` Mario Limonciello
5 siblings, 0 replies; 8+ messages in thread
From: Mario Limonciello @ 2023-01-30 22:07 UTC (permalink / raw)
To: Jaroslav Kysela, Mukunda Vijendar, Saba Kareem Syed, linux-kernel
Cc: Pananchikkal Renjith, Mark Pearson, Mario Limonciello,
Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
alsa-devel
In case of regressions for any users that the new pdm_gain value is
too high and for additional debugging, introduce a module parameter
that would let them configure it.
This parameter should be removed in the future:
* If it's determined that the parameter is not needed, just hardcode
the correct value as before
* If users do end up using it to debug and report different values
we should introduce a config knob that can have policy set by ucm.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v1->v2:
* Add a guard for values > 3 to overflow the FIELD_PREP
* Clear ACP_WOV_GAIN_CONTROL before setting it
---
sound/soc/amd/ps/acp63.h | 2 +-
sound/soc/amd/ps/ps-pdm-dma.c | 10 +++++++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/sound/soc/amd/ps/acp63.h b/sound/soc/amd/ps/acp63.h
index bae8288d8231c..bed4d51e226a5 100644
--- a/sound/soc/amd/ps/acp63.h
+++ b/sound/soc/amd/ps/acp63.h
@@ -30,7 +30,7 @@
#define ACP_ERROR_STAT 29
#define PDM_DECIMATION_FACTOR 2
#define ACP_PDM_CLK_FREQ_MASK 7
-#define ACP_WOV_MISC_CTRL_MASK 0x18
+#define ACP_WOV_GAIN_CONTROL GENMASK(4, 3)
#define ACP_PDM_ENABLE 1
#define ACP_PDM_DISABLE 0
#define ACP_PDM_DMA_EN_STATUS 2
diff --git a/sound/soc/amd/ps/ps-pdm-dma.c b/sound/soc/amd/ps/ps-pdm-dma.c
index eea71a9d2ef1a..c85cd471e739e 100644
--- a/sound/soc/amd/ps/ps-pdm-dma.c
+++ b/sound/soc/amd/ps/ps-pdm-dma.c
@@ -7,6 +7,7 @@
#include <linux/platform_device.h>
#include <linux/module.h>
+#include <linux/bitfield.h>
#include <linux/err.h>
#include <linux/io.h>
#include <sound/pcm_params.h>
@@ -18,6 +19,10 @@
#define DRV_NAME "acp_ps_pdm_dma"
+static int pdm_gain = 3;
+module_param(pdm_gain, int, 0644);
+MODULE_PARM_DESC(pdm_gain, "Gain control (0-3)");
+
static const struct snd_pcm_hardware acp63_pdm_hardware_capture = {
.info = SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@@ -55,7 +60,10 @@ static void acp63_enable_pdm_clock(void __iomem *acp_base)
acp63_writel(pdm_clk_enable, acp_base + ACP_WOV_CLK_CTRL);
pdm_ctrl = acp63_readl(acp_base + ACP_WOV_MISC_CTRL);
- pdm_ctrl |= ACP_WOV_MISC_CTRL_MASK;
+ pdm_ctrl &= FIELD_PREP(ACP_WOV_GAIN_CONTROL, 0);
+ if (pdm_gain > 3)
+ pdm_gain = 3;
+ pdm_ctrl |= FIELD_PREP(ACP_WOV_GAIN_CONTROL, pdm_gain);
acp63_writel(pdm_ctrl, acp_base + ACP_WOV_MISC_CTRL);
}
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread