Coefficient configuration support
Subsystems (3)
cover Coefficient configuration support
This series is only compile tested as yet, I'll probably get a chance to test it shortly - it should work out so hopefully the review can overlap usefully with the testing.
Mark Brown (3):
ASoC: core: Add SND_SOC_BYTES control for coefficient blocks
ASoC: core: Add support for masking out parts of coefficient blocks
ASoC: wm5100: Add DRC coefficient configuration
include/sound/soc.h | 27 +++++++++++ sound/soc/codecs/wm5100.c | 2 + sound/soc/soc-core.c | 110 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 0 deletions(-)
PATCH 1/3 ASoC: core: Add SND_SOC_BYTES control for coefficient blocks
Allow devices to export blocks of registers to the application layer, intended for use for reading and writing coefficient data which can't usefully be worked with by the kernel at runtime (for example, due to requiring complex and expensive calculations or being the results of callibration procedures). Currently drivers are using platform data to provide configurations for coefficient blocks which isn't at all convenient for runtime management or configuration development.
Currently only devices using regmap are supported, an error will be generated for any attempt to work with a byte control on a non-regmap device. There's no fundamental block to other devices so support could be added if required.
--- include/sound/soc.h | 18 ++++++++++++++++++ sound/soc/soc-core.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 0 deletions(-)
include/sound/soc.h +18 -0
@@ -185,6 +185,12 @@ .rreg = xreg_right, .shift = xshift, \ .min = xmin, .max = xmax} } +#define SND_SOC_BYTES (xname, xbase, xregs) \ +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ + .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \ + .put = snd_soc_bytes_put, .private_value = \ + ((unsigned long)&(struct soc_bytes) \ + {.base = xbase, .num_regs = xregs }) }/* * Simplified versions of above macros, declaring a struct and calculating
@@ -413,6 +419,13 @@ int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);int snd_soc_put_volsw_2r_sx (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol); +int snd_soc_bytes_info (struct snd_kcontrol *kcontrol, +struct snd_ctl_elem_info *uinfo); +int snd_soc_bytes_get (struct snd_kcontrol *kcontrol, +struct snd_ctl_elem_value *ucontrol); +int snd_soc_bytes_put (struct snd_kcontrol *kcontrol, +struct snd_ctl_elem_value *ucontrol); +/** * struct snd_soc_reg_access - Describes whether a given register is
@@ -888,6 +901,11 @@ struct soc_mixer_control {unsigned int reg, rreg, shift, rshift, invert; }; +struct soc_bytes { +int base; +int num_regs; +}; +/* enumerated kcontrol */ struct soc_enum {unsigned short reg;
sound/soc/soc-core.c +49 -0
55 lines not on this page · raw message
Signature · 1 line
1.7.9
PATCH 2/3 ASoC: core: Add support for masking out parts of coefficient blocks
Chip designers frequently include things like the enable and disable controls for algorithms in the register blocks which also hold the coefficients. Since it's desirable to split out the enable/disable control from userspace the plain SND_SOC_BYTES() isn't optimal for these devices.
Add a SND_SOC_BYTES_MASK() which allows a bitmask from the first word of the block to be excluded from the control. This supports the needs of devices I've looked at and lets us have a reasonably simple API. Further controls can be added in future if that's needed.
--- include/sound/soc.h | 9 ++++++ sound/soc/soc-core.c | 75 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 7 deletions(-)
include/sound/soc.h +9 -0
@@ -192,6 +192,14 @@ ((unsigned long )&(struct soc_bytes ) \ {.base = xbase, .num_regs = xregs }) } +#define SND_SOC_BYTES_MASK (xname, xbase, xregs, xmask) \ +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ + .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \ + .put = snd_soc_bytes_put, .private_value = \ + ((unsigned long)&(struct soc_bytes) \ + {.base = xbase, .num_regs = xregs, \ + .mask = xmask }) } +/* * Simplified versions of above macros, declaring a struct and calculating * ARRAY_SIZE internally
@@ -904,6 +912,7 @@ struct soc_mixer_control {struct soc_bytes {int base;int num_regs; +u32 mask; };/* enumerated kcontrol */
sound/soc/soc-core.c +68 -7
88 lines not on this page · raw message
Signature · 1 line
1.7.9
PATCH 3/3 ASoC: wm5100: Add DRC coefficient configuration
In reply to Mark Brown--- sound/soc/codecs/wm5100.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
sound/soc/codecs/wm5100.c +2 -0
@@ -744,6 +744,8 @@ WM5100_MIXER_CONTROLS("EQ4", WM5100_EQ4MIX_INPUT_1_SOURCE),WM5100_MIXER_CONTROLS ("DRC1L" ,WM5100_DRC1LMIX_INPUT_1_SOURCE ),WM5100_MIXER_CONTROLS ("DRC1R" ,WM5100_DRC1RMIX_INPUT_1_SOURCE ), +SND_SOC_BYTES_MASK ("DRC" ,WM5100_DRC1_CTRL1 ,5 , +WM5100_DRCL_ENA |WM5100_DRCR_ENA ),WM5100_MIXER_CONTROLS ("LHPF1" ,WM5100_HPLP1MIX_INPUT_1_SOURCE ), WM5100_MIXER_CONTROLS("LHPF2", WM5100_HPLP2MIX_INPUT_1_SOURCE),
Signature · 1 line
1.7.9
Quoted 9 lines · Mark Brown
This series is only compile tested as yet, I'll probably get a chance to test it shortly - it should work out so hopefully the review can overlap usefully with the testing.
Mark Brown (3):
ASoC: core: AddSND_SOC_BYTEScontrol for coefficient blocks
ASoC: core: Add support for masking out parts of coefficient blocks
ASoC: wm5100: Add DRC coefficient configuration
Quoted 4 lines
include/sound/soc.h | 27 +++++++++++ sound/soc/codecs/wm5100.c | 2 + sound/soc/soc-core.c | 110 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 0 deletions(-)
All