mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
ALSA: hda - proc - add support for dynamic controls to mixer<->NID mapping
This patch adds support for dynamically created controls to proc codec file (Control: lines). Signed-off-by: Jaroslav Kysela <perex@perex.cz> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
3911a4c19e
commit
4d02d1b638
@ -1523,6 +1523,11 @@ int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid,
|
|||||||
int err;
|
int err;
|
||||||
struct hda_nid_item *item;
|
struct hda_nid_item *item;
|
||||||
|
|
||||||
|
if (kctl->id.subdevice & (1<<31)) {
|
||||||
|
if (nid == 0)
|
||||||
|
nid = kctl->id.subdevice & 0xffff;
|
||||||
|
kctl->id.subdevice = 0;
|
||||||
|
}
|
||||||
err = snd_ctl_add(codec->bus->card, kctl);
|
err = snd_ctl_add(codec->bus->card, kctl);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
@ -3160,7 +3165,7 @@ EXPORT_SYMBOL_HDA(snd_hda_check_board_codec_sid_config);
|
|||||||
*/
|
*/
|
||||||
int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew)
|
int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
for (; knew->name; knew++) {
|
for (; knew->name; knew++) {
|
||||||
struct snd_kcontrol *kctl;
|
struct snd_kcontrol *kctl;
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
/* mono volume with index (index=0,1,...) (channel=1,2) */
|
/* mono volume with index (index=0,1,...) (channel=1,2) */
|
||||||
#define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
|
#define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
|
||||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
|
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
|
||||||
|
.subdevice = (1<<31)|(nid), \
|
||||||
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
|
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
|
||||||
SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
|
SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
|
||||||
SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
|
SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
|
||||||
@ -53,6 +54,7 @@
|
|||||||
/* mono mute switch with index (index=0,1,...) (channel=1,2) */
|
/* mono mute switch with index (index=0,1,...) (channel=1,2) */
|
||||||
#define HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
|
#define HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
|
||||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
|
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
|
||||||
|
.subdevice = (1<<31)|(nid), \
|
||||||
.info = snd_hda_mixer_amp_switch_info, \
|
.info = snd_hda_mixer_amp_switch_info, \
|
||||||
.get = snd_hda_mixer_amp_switch_get, \
|
.get = snd_hda_mixer_amp_switch_get, \
|
||||||
.put = snd_hda_mixer_amp_switch_put, \
|
.put = snd_hda_mixer_amp_switch_put, \
|
||||||
@ -69,6 +71,7 @@
|
|||||||
/* special beep mono mute switch with index (index=0,1,...) (channel=1,2) */
|
/* special beep mono mute switch with index (index=0,1,...) (channel=1,2) */
|
||||||
#define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
|
#define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
|
||||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
|
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
|
||||||
|
.subdevice = (1<<31)|(nid), \
|
||||||
.info = snd_hda_mixer_amp_switch_info, \
|
.info = snd_hda_mixer_amp_switch_info, \
|
||||||
.get = snd_hda_mixer_amp_switch_get, \
|
.get = snd_hda_mixer_amp_switch_get, \
|
||||||
.put = snd_hda_mixer_amp_switch_put_beep, \
|
.put = snd_hda_mixer_amp_switch_put_beep, \
|
||||||
|
@ -2571,6 +2571,8 @@ static int add_control(struct ad198x_spec *spec, int type, const char *name,
|
|||||||
knew->name = kstrdup(name, GFP_KERNEL);
|
knew->name = kstrdup(name, GFP_KERNEL);
|
||||||
if (! knew->name)
|
if (! knew->name)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
if (get_amp_nid_(val))
|
||||||
|
knew->subdevice = (1<<31)|get_amp_nid_(val);
|
||||||
knew->private_value = val;
|
knew->private_value = val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4323,6 +4323,8 @@ static int add_control(struct alc_spec *spec, int type, const char *name,
|
|||||||
knew->name = kstrdup(name, GFP_KERNEL);
|
knew->name = kstrdup(name, GFP_KERNEL);
|
||||||
if (!knew->name)
|
if (!knew->name)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
if (get_amp_nid_(val))
|
||||||
|
knew->subdevice = (1<<31)|get_amp_nid_(val);
|
||||||
knew->private_value = val;
|
knew->private_value = val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2671,7 +2671,8 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = {
|
|||||||
static struct snd_kcontrol_new *
|
static struct snd_kcontrol_new *
|
||||||
stac_control_new(struct sigmatel_spec *spec,
|
stac_control_new(struct sigmatel_spec *spec,
|
||||||
struct snd_kcontrol_new *ktemp,
|
struct snd_kcontrol_new *ktemp,
|
||||||
const char *name)
|
const char *name,
|
||||||
|
hda_nid_t nid)
|
||||||
{
|
{
|
||||||
struct snd_kcontrol_new *knew;
|
struct snd_kcontrol_new *knew;
|
||||||
|
|
||||||
@ -2687,6 +2688,8 @@ stac_control_new(struct sigmatel_spec *spec,
|
|||||||
spec->kctls.alloced--;
|
spec->kctls.alloced--;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (nid)
|
||||||
|
knew->subdevice = (1<<31)|nid;
|
||||||
return knew;
|
return knew;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2695,7 +2698,8 @@ static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
|
|||||||
int idx, const char *name,
|
int idx, const char *name,
|
||||||
unsigned long val)
|
unsigned long val)
|
||||||
{
|
{
|
||||||
struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name);
|
struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name,
|
||||||
|
get_amp_nid_(val));
|
||||||
if (!knew)
|
if (!knew)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
knew->index = idx;
|
knew->index = idx;
|
||||||
@ -2766,7 +2770,7 @@ static int stac92xx_add_input_source(struct sigmatel_spec *spec)
|
|||||||
if (!spec->num_adcs || imux->num_items <= 1)
|
if (!spec->num_adcs || imux->num_items <= 1)
|
||||||
return 0; /* no need for input source control */
|
return 0; /* no need for input source control */
|
||||||
knew = stac_control_new(spec, &stac_input_src_temp,
|
knew = stac_control_new(spec, &stac_input_src_temp,
|
||||||
stac_input_src_temp.name);
|
stac_input_src_temp.name, 0);
|
||||||
if (!knew)
|
if (!knew)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
knew->count = spec->num_adcs;
|
knew->count = spec->num_adcs;
|
||||||
|
@ -442,6 +442,8 @@ static int via_add_control(struct via_spec *spec, int type, const char *name,
|
|||||||
knew->name = kstrdup(name, GFP_KERNEL);
|
knew->name = kstrdup(name, GFP_KERNEL);
|
||||||
if (!knew->name)
|
if (!knew->name)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
if (get_amp_nid_(val))
|
||||||
|
knew->subdevice = (1<<31)|get_amp_nid_(val);
|
||||||
knew->private_value = val;
|
knew->private_value = val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user