]> err.no Git - linux-2.6/blobdiff - sound/pci/emu10k1/emumixer.c
Merge branch 'core/softirq' of git://git.kernel.org/pub/scm/linux/kernel/git/tip...
[linux-2.6] / sound / pci / emu10k1 / emumixer.c
index 7ebf035b6b08ead423ccf743cb4b66625fc0a809..f34bbfb705f5f7c870d50012aa17e7c7b57b93ee 100644 (file)
@@ -397,7 +397,7 @@ static int snd_emu1010_input_output_source_info(struct snd_kcontrol *kcontrol,
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
        uinfo->count = 1;
-       if (emu->card_capabilities->emu_model == 3) { /* 1616(m) cardbus */
+       if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
                uinfo->value.enumerated.items = 49;
                items = emu1616_src_texts;
        } else {
@@ -421,7 +421,8 @@ static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
        channel = (kcontrol->private_value) & 0xff;
        /* Limit: emu1010_output_dst, emu->emu1010.output_source */
        if (channel >= 24 ||
-           (emu->card_capabilities->emu_model == 3 && channel >= 18))
+           (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
+            channel >= 18))
                return -EINVAL;
        ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
        return 0;
@@ -436,17 +437,19 @@ static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
 
        val = ucontrol->value.enumerated.item[0];
        if (val >= 53 ||
-           (emu->card_capabilities->emu_model == 3 && val >= 49))
+           (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
+            val >= 49))
                return -EINVAL;
        channel = (kcontrol->private_value) & 0xff;
        /* Limit: emu1010_output_dst, emu->emu1010.output_source */
        if (channel >= 24 ||
-           (emu->card_capabilities->emu_model == 3 && channel >= 18))
+           (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
+            channel >= 18))
                return -EINVAL;
        if (emu->emu1010.output_source[channel] == val)
                return 0;
        emu->emu1010.output_source[channel] = val;
-       if (emu->card_capabilities->emu_model == 3) /* 1616(m) cardbus */
+       if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
                snd_emu1010_fpga_link_dst_src_write(emu,
                        emu1616_output_dst[channel], emu1616_src_regs[val]);
        else
@@ -478,7 +481,8 @@ static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
 
        val = ucontrol->value.enumerated.item[0];
        if (val >= 53 ||
-           (emu->card_capabilities->emu_model == 3 && val >= 49))
+           (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
+            val >= 49))
                return -EINVAL;
        channel = (kcontrol->private_value) & 0xff;
        /* Limit: emu1010_input_dst, emu->emu1010.input_source */
@@ -487,7 +491,7 @@ static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
        if (emu->emu1010.input_source[channel] == val)
                return 0;
        emu->emu1010.input_source[channel] = val;
-       if (emu->card_capabilities->emu_model == 3) /* 1616(m) cardbus */
+       if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
                snd_emu1010_fpga_link_dst_src_write(emu,
                        emu1010_input_dst[channel], emu1616_src_regs[val]);
        else
@@ -1574,6 +1578,10 @@ static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
                ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
        else
                ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
+       if (emu->card_capabilities->invert_shared_spdif)
+               ucontrol->value.integer.value[0] =
+                       !ucontrol->value.integer.value[0];
+               
        return 0;
 }
 
@@ -1582,15 +1590,18 @@ static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
 {
        unsigned long flags;
        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
-       unsigned int reg, val;
+       unsigned int reg, val, sw;
        int change = 0;
 
+       sw = ucontrol->value.integer.value[0];
+       if (emu->card_capabilities->invert_shared_spdif)
+               sw = !sw;
        spin_lock_irqsave(&emu->reg_lock, flags);
        if ( emu->card_capabilities->i2c_adc) {
                /* Do nothing for Audigy 2 ZS Notebook */
        } else if (emu->audigy) {
                reg = inl(emu->port + A_IOCFG);
-               val = ucontrol->value.integer.value[0] ? A_IOCFG_GPOUT0 : 0;
+               val = sw ? A_IOCFG_GPOUT0 : 0;
                change = (reg & A_IOCFG_GPOUT0) != val;
                if (change) {
                        reg &= ~A_IOCFG_GPOUT0;
@@ -1599,7 +1610,7 @@ static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
                }
        }
        reg = inl(emu->port + HCFG);
-       val = ucontrol->value.integer.value[0] ? HCFG_GPOUT0 : 0;
+       val = sw ? HCFG_GPOUT0 : 0;
        change |= (reg & HCFG_GPOUT0) != val;
        if (change) {
                reg &= ~HCFG_GPOUT0;
@@ -1991,7 +2002,7 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
                        return err;
        }
 
-       if (emu->card_capabilities->emu_model == 3) {
+       if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
                /* 1616(m) cardbus */
                int i;