[ALSA] ca0106 - Fix write proc assignment
[safe/jmp/linux-2.6] / sound / pci / ca0106 / ca0106_mixer.c
index 7fbfe17..3f9b5c5 100644 (file)
@@ -86,7 +86,7 @@ static int snd_ca0106_shared_spdif_get(struct snd_kcontrol *kcontrol,
 {
        struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol);
 
-       ucontrol->value.enumerated.item[0] = emu->spdif_enable;
+       ucontrol->value.integer.value[0] = emu->spdif_enable;
        return 0;
 }
 
@@ -98,11 +98,11 @@ static int snd_ca0106_shared_spdif_put(struct snd_kcontrol *kcontrol,
        int change = 0;
        u32 mask;
 
-       val = ucontrol->value.enumerated.item[0] ;
+       val = !!ucontrol->value.integer.value[0];
        change = (emu->spdif_enable != val);
        if (change) {
                emu->spdif_enable = val;
-               if (val == 1) {
+               if (val) {
                        /* Digital */
                        snd_ca0106_ptr_write(emu, SPDIF_SELECT1, 0, 0xf);
                        snd_ca0106_ptr_write(emu, SPDIF_SELECT2, 0, 0x0b000000);
@@ -159,6 +159,8 @@ static int snd_ca0106_capture_source_put(struct snd_kcontrol *kcontrol,
        u32 source;
 
        val = ucontrol->value.enumerated.item[0] ;
+       if (val >= 6)
+               return -EINVAL;
        change = (emu->capture_source != val);
        if (change) {
                emu->capture_source = val;
@@ -207,6 +209,8 @@ static int snd_ca0106_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
         * for the particular source.
         */
        source_id = ucontrol->value.enumerated.item[0] ;
+       if (source_id >= 4)
+               return -EINVAL;
        change = (emu->i2c_capture_source != source_id);
        if (change) {
                snd_ca0106_i2c_write(emu, ADC_MUX, 0); /* Mute input */
@@ -271,6 +275,8 @@ static int snd_ca0106_capture_mic_line_in_put(struct snd_kcontrol *kcontrol,
        u32 tmp;
 
        val = ucontrol->value.enumerated.item[0] ;
+       if (val > 1)
+               return -EINVAL;
        change = (emu->capture_mic_line_in != val);
        if (change) {
                emu->capture_mic_line_in = val;
@@ -443,7 +449,7 @@ static int snd_ca0106_i2c_volume_put(struct snd_kcontrol *kcontrol,
        ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
        ngain = ucontrol->value.integer.value[0];
        if (ngain > 0xff)
-               return 0;
+               return -EINVAL;
        if (ogain != ngain) {
                if (emu->i2c_capture_source == source_id)
                        snd_ca0106_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) );
@@ -453,7 +459,7 @@ static int snd_ca0106_i2c_volume_put(struct snd_kcontrol *kcontrol,
        ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
        ngain = ucontrol->value.integer.value[1];
        if (ngain > 0xff)
-               return 0;
+               return -EINVAL;
        if (ogain != ngain) {
                if (emu->i2c_capture_source == source_id)
                        snd_ca0106_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
@@ -497,7 +503,7 @@ static int spi_mute_put(struct snd_kcontrol *kcontrol,
        }
 
        ret = snd_ca0106_spi_write(emu, emu->spi_dac_reg[reg]);
-       return ret ? -1 : 1;
+       return ret ? -EINVAL : 1;
 }
 
 #define CA_VOLUME(xname,chid,reg) \
@@ -599,7 +605,7 @@ static struct snd_kcontrol_new snd_ca0106_volume_i2c_adc_ctls[] __devinitdata =
        .info   = spi_mute_info,                                \
        .get    = spi_mute_get,                                 \
        .put    = spi_mute_put,                                 \
-       .private_value = (reg<<SPI_REG_SHIFT) | (1<<bit)        \
+       .private_value = (reg<<SPI_REG_SHIFT) | (bit)           \
 }
 
 static struct snd_kcontrol_new snd_ca0106_volume_spi_dac_ctls[]
@@ -643,9 +649,19 @@ static int __devinit rename_ctl(struct snd_card *card, const char *src, const ch
        return -ENOENT;
 }
 
+#define ADD_CTLS(emu, ctls)                                            \
+       do {                                                            \
+               int i, err;                                             \
+               for (i = 0; i < ARRAY_SIZE(ctls); i++) {                \
+                       err = snd_ctl_add(card, snd_ctl_new1(&ctls[i], emu)); \
+                       if (err < 0)                                    \
+                               return err;                             \
+               }                                                       \
+       } while (0)
+
 int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
 {
-       int i, err;
+       int err;
         struct snd_card *card = emu->card;
        char **c;
        static char *ca0106_remove_ctls[] = {
@@ -692,17 +708,9 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
                rename_ctl(card, c[0], c[1]);
 #endif
 
-       for (i = 0; i < ARRAY_SIZE(snd_ca0106_volume_ctls); i++) {
-               err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_volume_ctls[i], emu));
-               if (err < 0)
-                       return err;
-       }
+       ADD_CTLS(emu, snd_ca0106_volume_ctls);
        if (emu->details->i2c_adc == 1) {
-               for (i = 0; i < ARRAY_SIZE(snd_ca0106_volume_i2c_adc_ctls); i++) {
-                       err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_volume_i2c_adc_ctls[i], emu));
-                       if (err < 0)
-                               return err;
-               }
+               ADD_CTLS(emu, snd_ca0106_volume_i2c_adc_ctls);
                if (emu->details->gpio_type == 1)
                        err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_capture_mic_line_in, emu));
                else  /* gpio_type == 2 */
@@ -710,13 +718,8 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
                if (err < 0)
                        return err;
        }
-       if (emu->details->spi_dac == 1) {
-               for (i = 0; i < ARRAY_SIZE(snd_ca0106_volume_spi_dac_ctls); i++) {
-                       err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_volume_spi_dac_ctls[i], emu));
-                       if (err < 0)
-                               return err;
-               }
-       }
+       if (emu->details->spi_dac == 1)
+               ADD_CTLS(emu, snd_ca0106_volume_spi_dac_ctls);
         return 0;
 }