[ALSA] ASoC: Add SOC_DOUBLE_S8_TLV control type
The SOC_DOUBLE_S8_TLV control type was originally implemented in the UDA1380 driver by Philipp Zabel and was moved into the core by me. Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@ -1589,6 +1589,78 @@ int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r);
|
||||
|
||||
/**
|
||||
* snd_soc_info_volsw_s8 - signed mixer info callback
|
||||
* @kcontrol: mixer control
|
||||
* @uinfo: control element information
|
||||
*
|
||||
* Callback to provide information about a signed mixer control.
|
||||
*
|
||||
* Returns 0 for success.
|
||||
*/
|
||||
int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
int max = (signed char)((kcontrol->private_value >> 16) & 0xff);
|
||||
int min = (signed char)((kcontrol->private_value >> 24) & 0xff);
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
uinfo->count = 2;
|
||||
uinfo->value.integer.min = 0;
|
||||
uinfo->value.integer.max = max-min;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_info_volsw_s8);
|
||||
|
||||
/**
|
||||
* snd_soc_get_volsw_s8 - signed mixer get callback
|
||||
* @kcontrol: mixer control
|
||||
* @uinfo: control element information
|
||||
*
|
||||
* Callback to get the value of a signed mixer control.
|
||||
*
|
||||
* Returns 0 for success.
|
||||
*/
|
||||
int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
int reg = kcontrol->private_value & 0xff;
|
||||
int min = (signed char)((kcontrol->private_value >> 24) & 0xff);
|
||||
int val = snd_soc_read(codec, reg);
|
||||
|
||||
ucontrol->value.integer.value[0] =
|
||||
((signed char)(val & 0xff))-min;
|
||||
ucontrol->value.integer.value[1] =
|
||||
((signed char)((val >> 8) & 0xff))-min;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_get_volsw_s8);
|
||||
|
||||
/**
|
||||
* snd_soc_put_volsw_sgn - signed mixer put callback
|
||||
* @kcontrol: mixer control
|
||||
* @uinfo: control element information
|
||||
*
|
||||
* Callback to set the value of a signed mixer control.
|
||||
*
|
||||
* Returns 0 for success.
|
||||
*/
|
||||
int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
int reg = kcontrol->private_value & 0xff;
|
||||
int min = (signed char)((kcontrol->private_value >> 24) & 0xff);
|
||||
unsigned short val;
|
||||
|
||||
val = (ucontrol->value.integer.value[0]+min) & 0xff;
|
||||
val |= ((ucontrol->value.integer.value[1]+min) & 0xff) << 8;
|
||||
|
||||
return snd_soc_update_bits(codec, reg, 0xffff, val);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8);
|
||||
|
||||
static int __devinit snd_soc_init(void)
|
||||
{
|
||||
printk(KERN_INFO "ASoC version %s\n", SND_SOC_VERSION);
|
||||
|
Reference in New Issue
Block a user