diff options
| author | Brian Austin <brian.austin@cirrus.com> | 2012-03-30 10:43:55 -0500 | 
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-04-03 11:43:23 +0100 | 
| commit | 1d99f2436d0d1c7741d6dfd9d27b5376cdbbca40 (patch) | |
| tree | f3fc73ca59b2d3876b429de52c66e4c2e6294a78 /include/sound/soc.h | |
| parent | 152ad442315517e6275efe6c142c06cb8aced6dd (diff) | |
| download | olio-linux-3.10-1d99f2436d0d1c7741d6dfd9d27b5376cdbbca40.tar.xz olio-linux-3.10-1d99f2436d0d1c7741d6dfd9d27b5376cdbbca40.zip  | |
ASoC: core: Rework SOC_DOUBLE_R_SX_TLV add SOC_SINGLE_SX_TLV
Some codecs namely Cirrus Logic Codecs have a way of wrapping the dB scale around 0dB without 0dB being in the middle.
Rework of SOC_DOUBLE_R_SX_TLV to be more consistent with other asoc tlv macros.
Add single register macro : SOC_SINGLE_SX_TLV.
Use snd_soc_info_volsw for .info
Use snd_soc_get_volsw_sx, snd_soc_put_volsw_sx for single and double.
kcontrols for CS42L51 and CS42L73 are adjusted to these new TLV Macros.
The max value is determined by: (number of steps) +1 for 0dB +max from codec datasheet.
Signed-off-by: Brian Austin <brian.austin@cirrus.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'include/sound/soc.h')
| -rw-r--r-- | include/sound/soc.h | 48 | 
1 files changed, 28 insertions, 20 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 9e238fa2eb1..acb57b834e5 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -55,6 +55,18 @@  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\  	.put = snd_soc_put_volsw, \  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } +#define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \ +{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ +	SNDRV_CTL_ELEM_ACCESS_READWRITE, \ +	.tlv.p  = (tlv_array),\ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw_sx,\ +	.put = snd_soc_put_volsw_sx, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xreg, \ +		.shift = xshift, .rshift = xshift, \ +		.max = xmax, .min = xmin} }  #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \ @@ -85,6 +97,18 @@  	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \  	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \  					    xmax, xinvert) } +#define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \ +{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ +	SNDRV_CTL_ELEM_ACCESS_READWRITE, \ +	.tlv.p  = (tlv_array), \ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw_sx, \ +	.put = snd_soc_put_volsw_sx, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xrreg, \ +		.shift = xshift, .rshift = xshift, \ +		.max = xmax, .min = xmin} }  #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \  {	.iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ @@ -171,20 +195,6 @@  	.get = xhandler_get, .put = xhandler_put, \  	.private_value = (unsigned long)&xenum } -#define SOC_DOUBLE_R_SX_TLV(xname, xreg_left, xreg_right, xshift,\ -		xmin, xmax, tlv_array) \ -{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ -	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ -		  SNDRV_CTL_ELEM_ACCESS_READWRITE, \ -	.tlv.p = (tlv_array), \ -	.info = snd_soc_info_volsw_2r_sx, \ -	.get = snd_soc_get_volsw_2r_sx, \ -	.put = snd_soc_put_volsw_2r_sx, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg_left, \ -		 .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, \ @@ -418,6 +428,10 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  #define snd_soc_get_volsw_2r snd_soc_get_volsw  #define snd_soc_put_volsw_2r snd_soc_put_volsw +int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol);  int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo);  int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol, @@ -426,12 +440,6 @@ int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_limit_volume(struct snd_soc_codec *codec,  	const char *name, int max); -int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_info *uinfo); -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,  |