forked from luck/tmp_suning_uos_patched
ALSA: hda - Move bind-mixer switch codes to generic parser
The generic parser is the only user of the bind-mixer controls, so we can move the code there and clean up the core helper. Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
a717777dbf
commit
698f5ee33b
|
@ -2117,72 +2117,6 @@ int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_put);
|
||||
|
||||
/*
|
||||
* bound volume controls
|
||||
*
|
||||
* bind multiple volumes (# indices, from 0)
|
||||
*/
|
||||
|
||||
#define AMP_VAL_IDX_SHIFT 19
|
||||
#define AMP_VAL_IDX_MASK (0x0f<<19)
|
||||
|
||||
/**
|
||||
* snd_hda_mixer_bind_switch_get - Get callback for a bound volume control
|
||||
* @kcontrol: ctl element
|
||||
* @ucontrol: pointer to get/store the data
|
||||
*
|
||||
* The control element is supposed to have the private_value field
|
||||
* set up via HDA_BIND_MUTE*() macros.
|
||||
*/
|
||||
int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
unsigned long pval;
|
||||
int err;
|
||||
|
||||
mutex_lock(&codec->control_mutex);
|
||||
pval = kcontrol->private_value;
|
||||
kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */
|
||||
err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);
|
||||
kcontrol->private_value = pval;
|
||||
mutex_unlock(&codec->control_mutex);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_switch_get);
|
||||
|
||||
/**
|
||||
* snd_hda_mixer_bind_switch_put - Put callback for a bound volume control
|
||||
* @kcontrol: ctl element
|
||||
* @ucontrol: pointer to get/store the data
|
||||
*
|
||||
* The control element is supposed to have the private_value field
|
||||
* set up via HDA_BIND_MUTE*() macros.
|
||||
*/
|
||||
int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
unsigned long pval;
|
||||
int i, indices, err = 0, change = 0;
|
||||
|
||||
mutex_lock(&codec->control_mutex);
|
||||
pval = kcontrol->private_value;
|
||||
indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT;
|
||||
for (i = 0; i < indices; i++) {
|
||||
kcontrol->private_value = (pval & ~AMP_VAL_IDX_MASK) |
|
||||
(i << AMP_VAL_IDX_SHIFT);
|
||||
err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
|
||||
if (err < 0)
|
||||
break;
|
||||
change |= err;
|
||||
}
|
||||
kcontrol->private_value = pval;
|
||||
mutex_unlock(&codec->control_mutex);
|
||||
return err < 0 ? err : change;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_switch_put);
|
||||
|
||||
/**
|
||||
* snd_hda_mixer_bind_ctls_info - Info callback for a generic bound control
|
||||
* @kcontrol: referred ctl element
|
||||
|
|
|
@ -948,6 +948,8 @@ static void resume_path_from_idx(struct hda_codec *codec, int path_idx)
|
|||
|
||||
static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
static int hda_gen_bind_mute_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
static int hda_gen_bind_mute_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
|
||||
|
@ -970,7 +972,7 @@ static const struct snd_kcontrol_new control_templates[] = {
|
|||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.info = snd_hda_mixer_amp_switch_info,
|
||||
.get = snd_hda_mixer_bind_switch_get,
|
||||
.get = hda_gen_bind_mute_get,
|
||||
.put = hda_gen_bind_mute_put, /* replaced */
|
||||
.private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
|
||||
},
|
||||
|
@ -1101,11 +1103,51 @@ static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
|
|||
return snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
|
||||
}
|
||||
|
||||
/*
|
||||
* Bound mute controls
|
||||
*/
|
||||
#define AMP_VAL_IDX_SHIFT 19
|
||||
#define AMP_VAL_IDX_MASK (0x0f<<19)
|
||||
|
||||
static int hda_gen_bind_mute_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
unsigned long pval;
|
||||
int err;
|
||||
|
||||
mutex_lock(&codec->control_mutex);
|
||||
pval = kcontrol->private_value;
|
||||
kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */
|
||||
err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);
|
||||
kcontrol->private_value = pval;
|
||||
mutex_unlock(&codec->control_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int hda_gen_bind_mute_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
unsigned long pval;
|
||||
int i, indices, err = 0, change = 0;
|
||||
|
||||
sync_auto_mute_bits(kcontrol, ucontrol);
|
||||
return snd_hda_mixer_bind_switch_put(kcontrol, ucontrol);
|
||||
|
||||
mutex_lock(&codec->control_mutex);
|
||||
pval = kcontrol->private_value;
|
||||
indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT;
|
||||
for (i = 0; i < indices; i++) {
|
||||
kcontrol->private_value = (pval & ~AMP_VAL_IDX_MASK) |
|
||||
(i << AMP_VAL_IDX_SHIFT);
|
||||
err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
|
||||
if (err < 0)
|
||||
break;
|
||||
change |= err;
|
||||
}
|
||||
kcontrol->private_value = pval;
|
||||
mutex_unlock(&codec->control_mutex);
|
||||
return err < 0 ? err : change;
|
||||
}
|
||||
|
||||
/* any ctl assigned to the path with the given index? */
|
||||
|
|
|
@ -178,23 +178,6 @@ void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook);
|
|||
#define HDA_AMP_UNMUTE 0x00
|
||||
#define HDA_AMP_VOLMASK 0x7f
|
||||
|
||||
/* mono switch binding multiple inputs */
|
||||
#define HDA_BIND_MUTE_MONO(xname, nid, channel, indices, direction) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
|
||||
.info = snd_hda_mixer_amp_switch_info, \
|
||||
.get = snd_hda_mixer_bind_switch_get, \
|
||||
.put = snd_hda_mixer_bind_switch_put, \
|
||||
.private_value = HDA_COMPOSE_AMP_VAL(nid, channel, indices, direction) }
|
||||
|
||||
/* stereo switch binding multiple inputs */
|
||||
#define HDA_BIND_MUTE(xname,nid,indices,dir) \
|
||||
HDA_BIND_MUTE_MONO(xname,nid,3,indices,dir)
|
||||
|
||||
int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
|
||||
/* more generic bound controls */
|
||||
struct hda_ctl_ops {
|
||||
snd_kcontrol_info_t *info;
|
||||
|
|
Loading…
Reference in New Issue
Block a user