ALSA: ice1724 - Allow spec driver to create own routing controls

Added a new flag, own_routing, to allow spec drivers to create own
routing controls.  Also, the basic get/put calls are changed to be
external for later use by maya44 driver.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2009-05-06 17:30:17 +02:00
parent d82b64f476
commit 2bf864ac96
2 changed files with 30 additions and 15 deletions

View file

@ -335,6 +335,7 @@ struct snd_ice1712 {
unsigned int force_rdma1:1; /* VT1720/4 - RDMA1 as non-spdif */ unsigned int force_rdma1:1; /* VT1720/4 - RDMA1 as non-spdif */
unsigned int midi_output:1; /* VT1720/4: MIDI output triggered */ unsigned int midi_output:1; /* VT1720/4: MIDI output triggered */
unsigned int midi_input:1; /* VT1720/4: MIDI input triggered */ unsigned int midi_input:1; /* VT1720/4: MIDI input triggered */
unsigned int own_routing:1; /* VT1720/4: use own routing ctls */
unsigned int num_total_dacs; /* total DACs */ unsigned int num_total_dacs; /* total DACs */
unsigned int num_total_adcs; /* total ADCs */ unsigned int num_total_adcs; /* total ADCs */
unsigned int cur_rate; /* current rate */ unsigned int cur_rate; /* current rate */
@ -458,10 +459,17 @@ static inline int snd_ice1712_gpio_read_bits(struct snd_ice1712 *ice,
return snd_ice1712_gpio_read(ice) & mask; return snd_ice1712_gpio_read(ice) & mask;
} }
/* route access functions */
int snd_ice1724_get_route_val(struct snd_ice1712 *ice, int shift);
int snd_ice1724_put_route_val(struct snd_ice1712 *ice, unsigned int val,
int shift);
int snd_ice1712_spdif_build_controls(struct snd_ice1712 *ice); int snd_ice1712_spdif_build_controls(struct snd_ice1712 *ice);
int snd_ice1712_akm4xxx_init(struct snd_akm4xxx *ak, const struct snd_akm4xxx *template, int snd_ice1712_akm4xxx_init(struct snd_akm4xxx *ak,
const struct snd_ak4xxx_private *priv, struct snd_ice1712 *ice); const struct snd_akm4xxx *template,
const struct snd_ak4xxx_private *priv,
struct snd_ice1712 *ice);
void snd_ice1712_akm4xxx_free(struct snd_ice1712 *ice); void snd_ice1712_akm4xxx_free(struct snd_ice1712 *ice);
int snd_ice1712_akm4xxx_build_controls(struct snd_ice1712 *ice); int snd_ice1712_akm4xxx_build_controls(struct snd_ice1712 *ice);

View file

@ -1975,7 +1975,7 @@ static inline int digital_route_shift(int idx)
return idx * 3; return idx * 3;
} }
static int get_route_val(struct snd_ice1712 *ice, int shift) int snd_ice1724_get_route_val(struct snd_ice1712 *ice, int shift)
{ {
unsigned long val; unsigned long val;
unsigned char eitem; unsigned char eitem;
@ -1994,7 +1994,8 @@ static int get_route_val(struct snd_ice1712 *ice, int shift)
return eitem; return eitem;
} }
static int put_route_val(struct snd_ice1712 *ice, unsigned int val, int shift) int snd_ice1724_put_route_val(struct snd_ice1712 *ice, unsigned int val,
int shift)
{ {
unsigned int old_val, nval; unsigned int old_val, nval;
int change; int change;
@ -2022,7 +2023,7 @@ static int snd_vt1724_pro_route_analog_get(struct snd_kcontrol *kcontrol,
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
ucontrol->value.enumerated.item[0] = ucontrol->value.enumerated.item[0] =
get_route_val(ice, analog_route_shift(idx)); snd_ice1724_get_route_val(ice, analog_route_shift(idx));
return 0; return 0;
} }
@ -2031,8 +2032,9 @@ static int snd_vt1724_pro_route_analog_put(struct snd_kcontrol *kcontrol,
{ {
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
return put_route_val(ice, ucontrol->value.enumerated.item[0], return snd_ice1724_put_route_val(ice,
analog_route_shift(idx)); ucontrol->value.enumerated.item[0],
analog_route_shift(idx));
} }
static int snd_vt1724_pro_route_spdif_get(struct snd_kcontrol *kcontrol, static int snd_vt1724_pro_route_spdif_get(struct snd_kcontrol *kcontrol,
@ -2041,7 +2043,7 @@ static int snd_vt1724_pro_route_spdif_get(struct snd_kcontrol *kcontrol,
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
ucontrol->value.enumerated.item[0] = ucontrol->value.enumerated.item[0] =
get_route_val(ice, digital_route_shift(idx)); snd_ice1724_get_route_val(ice, digital_route_shift(idx));
return 0; return 0;
} }
@ -2050,11 +2052,13 @@ static int snd_vt1724_pro_route_spdif_put(struct snd_kcontrol *kcontrol,
{ {
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
return put_route_val(ice, ucontrol->value.enumerated.item[0], return snd_ice1724_put_route_val(ice,
digital_route_shift(idx)); ucontrol->value.enumerated.item[0],
digital_route_shift(idx));
} }
static struct snd_kcontrol_new snd_vt1724_mixer_pro_analog_route __devinitdata = { static struct snd_kcontrol_new snd_vt1724_mixer_pro_analog_route __devinitdata =
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "H/W Playback Route", .name = "H/W Playback Route",
.info = snd_vt1724_pro_route_info, .info = snd_vt1724_pro_route_info,
@ -2291,9 +2295,12 @@ static int __devinit snd_vt1724_spdif_build_controls(struct snd_ice1712 *ice)
if (snd_BUG_ON(!ice->pcm)) if (snd_BUG_ON(!ice->pcm))
return -EIO; return -EIO;
err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice)); if (!ice->own_routing) {
if (err < 0) err = snd_ctl_add(ice->card,
return err; snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice));
if (err < 0)
return err;
}
err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_spdif_switch, ice)); err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_spdif_switch, ice));
if (err < 0) if (err < 0)
@ -2340,7 +2347,7 @@ static int __devinit snd_vt1724_build_controls(struct snd_ice1712 *ice)
if (err < 0) if (err < 0)
return err; return err;
if (ice->num_total_dacs > 0) { if (!ice->own_routing && ice->num_total_dacs > 0) {
struct snd_kcontrol_new tmp = snd_vt1724_mixer_pro_analog_route; struct snd_kcontrol_new tmp = snd_vt1724_mixer_pro_analog_route;
tmp.count = ice->num_total_dacs; tmp.count = ice->num_total_dacs;
if (ice->vt1720 && tmp.count > 2) if (ice->vt1720 && tmp.count > 2)