Commit 4d02d1b6 authored by Jaroslav Kysela's avatar Jaroslav Kysela Committed by Takashi Iwai

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: default avatarJaroslav Kysela <perex@perex.cz>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3911a4c1
...@@ -1523,6 +1523,11 @@ int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, ...@@ -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); ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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, ...@@ -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, ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment