Commit 2bf864ac authored by Takashi Iwai's avatar Takashi Iwai

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: default avatarTakashi Iwai <tiwai@suse.de>
parent d82b64f4
...@@ -335,6 +335,7 @@ struct snd_ice1712 { ...@@ -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, ...@@ -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);
......
...@@ -1975,7 +1975,7 @@ static inline int digital_route_shift(int idx) ...@@ -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) ...@@ -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, ...@@ -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,7 +2032,8 @@ static int snd_vt1724_pro_route_analog_put(struct snd_kcontrol *kcontrol, ...@@ -2031,7 +2032,8 @@ 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,
ucontrol->value.enumerated.item[0],
analog_route_shift(idx)); analog_route_shift(idx));
} }
...@@ -2041,7 +2043,7 @@ 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, ...@@ -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,
ucontrol->value.enumerated.item[0],
digital_route_shift(idx)); 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) ...@@ -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) {
err = snd_ctl_add(ice->card,
snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice));
if (err < 0) if (err < 0)
return err; 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) ...@@ -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)
......
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