Update of /cvsroot/alsa/alsa-kernel/pci
In directory sc8-pr-cvs1:/tmp/cvs-serv3498

Modified Files:
        ens1370.c 
Log Message:
- clean up of initialization of spdif control elements.
- check the return value of snd_ctl_new1() and snd_ctl_add().
- added the support of line-in/rear share switch by
  Michael Huijsmans <[EMAIL PROTECTED]>.



Index: ens1370.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ens1370.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- ens1370.c   28 Oct 2003 11:28:01 -0000      1.54
+++ ens1370.c   13 Jan 2004 15:39:07 -0000      1.55
@@ -1392,33 +1392,6 @@
        return change;
 }
 
-static snd_kcontrol_new_t snd_ens1373_spdif_default __devinitdata =
-{
-       .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
-       .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
-       .info =         snd_ens1373_spdif_info,
-       .get =          snd_ens1373_spdif_default_get,
-       .put =          snd_ens1373_spdif_default_put,
-};
-
-static snd_kcontrol_new_t snd_ens1373_spdif_mask __devinitdata =
-{
-       .access =       SNDRV_CTL_ELEM_ACCESS_READ,
-       .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
-       .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
-       .info =         snd_ens1373_spdif_info,
-       .get =          snd_ens1373_spdif_mask_get
-};
-
-static snd_kcontrol_new_t snd_ens1373_spdif_stream __devinitdata =
-{
-       .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
-       .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM),
-       .info =         snd_ens1373_spdif_info,
-       .get =          snd_ens1373_spdif_stream_get,
-       .put =          snd_ens1373_spdif_stream_put
-};
-
 #define ES1371_SPDIF(xname) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_es1371_spdif_info, \
   .get = snd_es1371_spdif_get, .put = snd_es1371_spdif_put }
@@ -1462,8 +1435,33 @@
        return change;
 }
 
-static snd_kcontrol_new_t snd_es1371_mixer_spdif __devinitdata =
-ES1371_SPDIF("IEC958 Playback Switch");
+
+/* spdif controls */
+static snd_kcontrol_new_t snd_es1371_mixer_spdif[] __devinitdata = {
+       ES1371_SPDIF("IEC958 Playback Switch"),
+       {
+               .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
+               .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
+               .info =         snd_ens1373_spdif_info,
+               .get =          snd_ens1373_spdif_default_get,
+               .put =          snd_ens1373_spdif_default_put,
+       },
+       {
+               .access =       SNDRV_CTL_ELEM_ACCESS_READ,
+               .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
+               .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
+               .info =         snd_ens1373_spdif_info,
+               .get =          snd_ens1373_spdif_mask_get
+       },
+       {
+               .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
+               .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM),
+               .info =         snd_ens1373_spdif_info,
+               .get =          snd_ens1373_spdif_stream_get,
+               .put =          snd_ens1373_spdif_stream_put
+       },
+};
+
 
 static int snd_es1373_rear_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
 {
@@ -1512,6 +1510,56 @@
        .put =          snd_es1373_rear_put,
 };
 
+static int snd_es1373_line_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
+{
+       uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
+       uinfo->count = 1;
+       uinfo->value.integer.min = 0;
+       uinfo->value.integer.max = 1;
+       return 0;
+}
+
+static int snd_es1373_line_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * 
ucontrol)
+{
+       ensoniq_t *ensoniq = snd_kcontrol_chip(kcontrol);
+       int val = 0;
+       
+       spin_lock_irq(&ensoniq->reg_lock);
+       if ((ensoniq->ctrl & ES_1371_GPIO_OUTM) >= 4)
+               val = 1;
+       ucontrol->value.integer.value[0] = val;
+       spin_unlock_irq(&ensoniq->reg_lock);
+       return 0;
+}
+
+static int snd_es1373_line_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * 
ucontrol)
+{
+       ensoniq_t *ensoniq = snd_kcontrol_chip(kcontrol);
+       int changed;
+       unsigned int ctrl;
+       
+       spin_lock_irq(&ensoniq->reg_lock);
+       ctrl = ensoniq->ctrl;
+       if (ucontrol->value.integer.value[0])
+               ensoniq->ctrl |= ES_1371_GPIO_OUT(4);   /* switch line-in -> rear out 
*/
+       else
+               ensoniq->ctrl &= ~ES_1371_GPIO_OUT(4);
+       changed = (ctrl != ensoniq->ctrl);
+       if (changed)
+               outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL));
+       spin_unlock_irq(&ensoniq->reg_lock);
+       return changed;
+}
+
+static snd_kcontrol_new_t snd_ens1373_line __devinitdata =
+{
+       .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
+       .name =         "Line In->Rear Out Switch",
+       .info =         snd_es1373_line_info,
+       .get =          snd_es1373_line_get,
+       .put =          snd_es1373_line_put,
+};
+
 static void snd_ensoniq_mixer_free_ac97(ac97_t *ac97)
 {
        ensoniq_t *ensoniq = snd_magic_cast(ensoniq_t, ac97->private_data, return);
@@ -1555,7 +1603,7 @@
                    ensoniq->pci->device == es1371_spdif_present[idx].did &&
                    ensoniq->rev == es1371_spdif_present[idx].rev) {
                        snd_kcontrol_t *kctl;
-                       int index = 0; 
+                       int i, index = 0; 
 
                        ensoniq->spdif_default = ensoniq->spdif_stream = 
SNDRV_PCM_DEFAULT_CON_SPDIF;
                        outl(ensoniq->spdif_default, ES_REG(ensoniq, CHANNEL_STATUS));
@@ -1563,29 +1611,31 @@
                        if (ensoniq->u.es1371.ac97->ext_id & AC97_EI_SPDIF)
                                index++;
 
-                       kctl = snd_ctl_new1(&snd_es1371_mixer_spdif, ensoniq);
-                       kctl->id.index = index;
-                       snd_ctl_add(card, kctl);
-
-                       kctl = snd_ctl_new1(&snd_ens1373_spdif_default, ensoniq);
-                       kctl->id.index = index;
-                       snd_ctl_add(card, kctl);
-
-                       kctl = snd_ctl_new1(&snd_ens1373_spdif_mask, ensoniq);
-                       kctl->id.index = index;
-                       snd_ctl_add(card, kctl);
-
-                       kctl = snd_ctl_new1(&snd_ens1373_spdif_stream, ensoniq);
-                       kctl->id.index = index;
-                       snd_ctl_add(card, kctl);
+                       for (i = 0; i < (int)ARRAY_SIZE(snd_es1371_mixer_spdif); i++) {
+                               kctl = snd_ctl_new1(&snd_es1371_mixer_spdif[i], 
ensoniq);
+                               if (! kctl)
+                                       return -ENOMEM;
+                               kctl->id.index = index;
+                               if ((err = snd_ctl_add(card, kctl)) < 0)
+                                       return err;
+                       }
                        break;
                }
        if (ensoniq->u.es1371.ac97->ext_id & AC97_EI_SDAC) {
                /* mirror rear to front speakers */
                ensoniq->cssr &= ~(ES_1373_REAR_BIT27|ES_1373_REAR_BIT24);
                ensoniq->cssr |= ES_1373_REAR_BIT26;
-               snd_ctl_add(card, snd_ctl_new1(&snd_ens1373_rear, ensoniq));
+               err = snd_ctl_add(card, snd_ctl_new1(&snd_ens1373_rear, ensoniq));
+               if (err < 0)
+                       return err;
+       }
+       if ((ensoniq->subsystem_vendor_id == 0x1274) &&
+           (ensoniq->subsystem_device_id == 0x2000)) { /* GA-7DXR */
+                err = snd_ctl_add(card, snd_ctl_new1(&snd_ens1373_line, ensoniq));
+                if (err < 0)
+                        return err;
        }
+
        return 0;
 }
 
@@ -1675,8 +1725,11 @@
        ak4531.private_free = snd_ensoniq_mixer_free_ak4531;
        if ((err = snd_ak4531_mixer(card, &ak4531, &ensoniq->u.es1370.ak4531)) < 0)
                return err;
-       for (idx = 0; idx < ES1370_CONTROLS; idx++)
-               snd_ctl_add(card, snd_ctl_new1(&snd_es1370_controls[idx], ensoniq));
+       for (idx = 0; idx < ES1370_CONTROLS; idx++) {
+               err = snd_ctl_add(card, snd_ctl_new1(&snd_es1370_controls[idx], 
ensoniq));
+               if (err < 0)
+                       return err;
+       }
        return 0;
 }
 



-------------------------------------------------------
This SF.net email is sponsored by: Perforce Software.
Perforce is the Fast Software Configuration Management System offering
advanced branching capabilities and atomic changes on 50+ platforms.
Free Eval! http://www.perforce.com/perforce/loadprog.html
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to