|
@@ -2014,6 +2014,7 @@ static int snd_wss_info_mux(struct snd_kcontrol *kcontrol,
|
|
|
case WSS_HW_INTERWAVE:
|
|
|
ptexts = gusmax_texts;
|
|
|
break;
|
|
|
+ case WSS_HW_OPTI93X:
|
|
|
case WSS_HW_OPL3SA2:
|
|
|
ptexts = opl3sa_texts;
|
|
|
break;
|
|
@@ -2246,54 +2247,12 @@ WSS_SINGLE("Beep Bypass Playback Switch", 0,
|
|
|
CS4231_MONO_CTRL, 5, 1, 0),
|
|
|
};
|
|
|
|
|
|
-static struct snd_kcontrol_new snd_opti93x_controls[] = {
|
|
|
-WSS_DOUBLE("Master Playback Switch", 0,
|
|
|
- OPTi93X_OUT_LEFT, OPTi93X_OUT_RIGHT, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE_TLV("Master Playback Volume", 0,
|
|
|
- OPTi93X_OUT_LEFT, OPTi93X_OUT_RIGHT, 1, 1, 31, 1,
|
|
|
- db_scale_6bit),
|
|
|
-WSS_DOUBLE("PCM Playback Switch", 0,
|
|
|
- CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE("PCM Playback Volume", 0,
|
|
|
- CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 0, 0, 31, 1),
|
|
|
-WSS_DOUBLE("FM Playback Switch", 0,
|
|
|
- CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE("FM Playback Volume", 0,
|
|
|
- CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 1, 1, 15, 1),
|
|
|
-WSS_DOUBLE("Line Playback Switch", 0,
|
|
|
- CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE("Line Playback Volume", 0,
|
|
|
- CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 0, 0, 15, 1),
|
|
|
-WSS_DOUBLE("Mic Playback Switch", 0,
|
|
|
- OPTi93X_MIC_LEFT_INPUT, OPTi93X_MIC_RIGHT_INPUT, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE("Mic Playback Volume", 0,
|
|
|
- OPTi93X_MIC_LEFT_INPUT, OPTi93X_MIC_RIGHT_INPUT, 1, 1, 15, 1),
|
|
|
-WSS_DOUBLE("Mic Boost", 0,
|
|
|
- CS4231_LEFT_INPUT, CS4231_RIGHT_INPUT, 5, 5, 1, 0),
|
|
|
-WSS_DOUBLE("CD Playback Switch", 0,
|
|
|
- CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE("CD Playback Volume", 0,
|
|
|
- CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 1, 1, 15, 1),
|
|
|
-WSS_DOUBLE("Aux Playback Switch", 0,
|
|
|
- OPTi931_AUX_LEFT_INPUT, OPTi931_AUX_RIGHT_INPUT, 7, 7, 1, 1),
|
|
|
-WSS_DOUBLE("Aux Playback Volume", 0,
|
|
|
- OPTi931_AUX_LEFT_INPUT, OPTi931_AUX_RIGHT_INPUT, 1, 1, 15, 1),
|
|
|
-WSS_DOUBLE("Capture Volume", 0,
|
|
|
- CS4231_LEFT_INPUT, CS4231_RIGHT_INPUT, 0, 0, 15, 0),
|
|
|
-{
|
|
|
- .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
- .name = "Capture Source",
|
|
|
- .info = snd_wss_info_mux,
|
|
|
- .get = snd_wss_get_mux,
|
|
|
- .put = snd_wss_put_mux,
|
|
|
-}
|
|
|
-};
|
|
|
-
|
|
|
int snd_wss_mixer(struct snd_wss *chip)
|
|
|
{
|
|
|
struct snd_card *card;
|
|
|
unsigned int idx;
|
|
|
int err;
|
|
|
+ int count = ARRAY_SIZE(snd_wss_controls);
|
|
|
|
|
|
if (snd_BUG_ON(!chip || !chip->pcm))
|
|
|
return -EINVAL;
|
|
@@ -2302,28 +2261,19 @@ int snd_wss_mixer(struct snd_wss *chip)
|
|
|
|
|
|
strcpy(card->mixername, chip->pcm->name);
|
|
|
|
|
|
- if (chip->hardware == WSS_HW_OPTI93X)
|
|
|
- for (idx = 0; idx < ARRAY_SIZE(snd_opti93x_controls); idx++) {
|
|
|
- err = snd_ctl_add(card,
|
|
|
- snd_ctl_new1(&snd_opti93x_controls[idx],
|
|
|
- chip));
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
- }
|
|
|
- else {
|
|
|
- int count = ARRAY_SIZE(snd_wss_controls);
|
|
|
-
|
|
|
- /* Use only the first 11 entries on AD1848 */
|
|
|
- if (chip->hardware & WSS_HW_AD1848_MASK)
|
|
|
- count = 11;
|
|
|
-
|
|
|
- for (idx = 0; idx < count; idx++) {
|
|
|
- err = snd_ctl_add(card,
|
|
|
- snd_ctl_new1(&snd_wss_controls[idx],
|
|
|
- chip));
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
- }
|
|
|
+ /* Use only the first 11 entries on AD1848 */
|
|
|
+ if (chip->hardware & WSS_HW_AD1848_MASK)
|
|
|
+ count = 11;
|
|
|
+ /* There is no loopback on OPTI93X */
|
|
|
+ else if (chip->hardware == WSS_HW_OPTI93X)
|
|
|
+ count = 9;
|
|
|
+
|
|
|
+ for (idx = 0; idx < count; idx++) {
|
|
|
+ err = snd_ctl_add(card,
|
|
|
+ snd_ctl_new1(&snd_wss_controls[idx],
|
|
|
+ chip));
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|