[ALSA] ice1724 - Add support of Prodigy-7.1LT
authorTakashi Iwai <tiwai@suse.de>
Fri, 13 Jan 2006 12:50:16 +0000 (13:50 +0100)
committerJaroslav Kysela <perex@suse.cz>
Wed, 22 Mar 2006 09:23:23 +0000 (10:23 +0100)
Modules: ICE1712 driver

Added the support of Prodigy-7.1LT board.
The patch taken from ALSA BTS bug#1090.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/ice1712/aureon.c
sound/pci/ice1712/aureon.h

index 8809812a1c2241a0bd958e20b7fe84dcf7b360d6..2175f6721347bb26fac80681ba5864d0e4607f3e 100644 (file)
@@ -322,36 +322,48 @@ static void aureon_spi_write(struct snd_ice1712 *ice, unsigned int cs, unsigned
 {
        unsigned int tmp;
        int i;
+       unsigned int mosi, clk;
 
        tmp = snd_ice1712_gpio_read(ice);
 
-       snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RW|AUREON_SPI_MOSI|AUREON_SPI_CLK|
-                                        AUREON_WM_CS|AUREON_CS8415_CS));
-       tmp |= AUREON_WM_RW;
+       if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71LT) {
+               snd_ice1712_gpio_set_mask(ice, ~(PRODIGY_SPI_MOSI|PRODIGY_SPI_CLK|PRODIGY_WM_CS));
+               mosi = PRODIGY_SPI_MOSI;
+               clk = PRODIGY_SPI_CLK;
+       }
+       else {
+               snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RW|AUREON_SPI_MOSI|AUREON_SPI_CLK|
+                                                AUREON_WM_CS|AUREON_CS8415_CS));
+               mosi = AUREON_SPI_MOSI;
+               clk = AUREON_SPI_CLK;
+               
+               tmp |= AUREON_WM_RW;
+       }
+       
        tmp &= ~cs;
        snd_ice1712_gpio_write(ice, tmp);
        udelay(1);
 
        for (i = bits - 1; i >= 0; i--) {
-               tmp &= ~AUREON_SPI_CLK;
+               tmp &= ~clk;
                snd_ice1712_gpio_write(ice, tmp);
                udelay(1);
                if (data & (1 << i))
-                       tmp |= AUREON_SPI_MOSI;
+                       tmp |= mosi;
                else
-                       tmp &= ~AUREON_SPI_MOSI;
+                       tmp &= ~mosi;
                snd_ice1712_gpio_write(ice, tmp);
                udelay(1);
-               tmp |= AUREON_SPI_CLK;
+               tmp |= clk;
                snd_ice1712_gpio_write(ice, tmp);
                udelay(1);
        }
 
-       tmp &= ~AUREON_SPI_CLK;
+       tmp &= ~clk;
        tmp |= cs;
        snd_ice1712_gpio_write(ice, tmp);
        udelay(1);
-       tmp |= AUREON_SPI_CLK;
+       tmp |= clk;
        snd_ice1712_gpio_write(ice, tmp);
        udelay(1);
 }
@@ -440,7 +452,9 @@ static unsigned short wm_get(struct snd_ice1712 *ice, int reg)
  */
 static void wm_put_nocache(struct snd_ice1712 *ice, int reg, unsigned short val)
 {
-       aureon_spi_write(ice, AUREON_WM_CS, (reg << 9) | (val & 0x1ff), 16);
+       aureon_spi_write(ice,
+                       (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71LT ? PRODIGY_WM_CS : AUREON_WM_CS),
+                       (reg << 9) | (val & 0x1ff), 16);
 }
 
 /*
@@ -1659,7 +1673,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice)
                                return err;
                }
        }
-       else {
+       else if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) {
                for (i = 0; i < ARRAY_SIZE(ac97_controls); i++) {
                        err = snd_ctl_add(ice->card, snd_ctl_new1(&ac97_controls[i], ice));
                        if (err < 0)
@@ -1667,7 +1681,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice)
                }
        }
 
-       {
+       if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) {
                unsigned char id;
                snd_ice1712_save_gpio_status(ice);
                id = aureon_cs8415_get(ice, CS8415_ID);
@@ -1822,7 +1836,8 @@ static int __devinit aureon_init(struct snd_ice1712 *ice)
        udelay(1);
 
        /* initialize WM8770 codec */
-       if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71)
+       if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71 ||
+               ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71LT)
                p = wm_inits_prodigy;
        else
                p = wm_inits_aureon;
@@ -1830,11 +1845,13 @@ static int __devinit aureon_init(struct snd_ice1712 *ice)
                wm_put(ice, p[0], p[1]);
 
        /* initialize CS8415A codec */
-       for (p = cs_inits; *p != (unsigned short)-1; p++)
-               aureon_spi_write(ice, AUREON_CS8415_CS, *p | 0x200000, 24);
-       ice->spec.aureon.cs8415_mux = 1;
+       if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) {
+               for (p = cs_inits; *p != (unsigned short)-1; p++)
+                       aureon_spi_write(ice, AUREON_CS8415_CS, *p | 0x200000, 24);
+               ice->spec.aureon.cs8415_mux = 1;
 
-       aureon_set_headphone_amp(ice, 1);
+               aureon_set_headphone_amp(ice, 1);
+       }
 
        snd_ice1712_restore_gpio_status(ice);
        
@@ -1902,6 +1919,23 @@ static unsigned char prodigy71_eeprom[] __devinitdata = {
        0x00,   /* GPIO_STATE2 */
 };
 
+static unsigned char prodigy71lt_eeprom[] __devinitdata = {
+       0x0b,   /* SYSCINF: clock 512, spdif-in/ADC, 4DACs */
+       0x80,   /* ACLINK: I2S */
+       0xfc,   /* I2S: vol, 96k, 24bit, 192k */
+       0xc3,   /* SPDUF: out-en, out-int */
+       0x00,   /* GPIO_DIR */
+       0x07,   /* GPIO_DIR1 */
+       0x00,   /* GPIO_DIR2 */
+       0xff,   /* GPIO_MASK */
+       0xf8,   /* GPIO_MASK1 */
+       0xff,   /* GPIO_MASK2 */
+       0x00,   /* GPIO_STATE */
+       0x00,   /* GPIO_STATE1 */
+       0x00,   /* GPIO_STATE2 */
+};
+       
+
 /* entry point */
 struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = {
        {
@@ -1944,5 +1978,15 @@ struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = {
                .eeprom_data = prodigy71_eeprom,
                .driver = "Prodigy71", /* should be identical with Aureon71 */
        },
+       {
+               .subvendor = VT1724_SUBDEVICE_PRODIGY71LT,
+               .name = "Audiotrak Prodigy 7.1 LT",
+               .model = "prodigy71lt",
+               .chip_init = aureon_init,
+               .build_controls = aureon_add_controls,
+               .eeprom_size = sizeof(prodigy71lt_eeprom),
+               .eeprom_data = prodigy71lt_eeprom,
+               .driver = "Prodigy71LT",
+       },
        { } /* terminator */
 };
index 95d515f36f23e35e15dbba636f887d22ab0cb94f..98a6752280f26cf66fcc9d3cea0c376466cd9848 100644 (file)
 #define  AUREON_DEVICE_DESC           "{Terratec,Aureon 5.1 Sky},"\
                                       "{Terratec,Aureon 7.1 Space},"\
                                       "{Terratec,Aureon 7.1 Universe}," \
-                                       "{AudioTrak,Prodigy 7.1},"
+                                       "{AudioTrak,Prodigy 7.1}," \
+                                       "{AudioTrak,Prodigy 7.1 LT},"
 
 #define VT1724_SUBDEVICE_AUREON51_SKY  0x3b154711      /* Aureon 5.1 Sky */
 #define VT1724_SUBDEVICE_AUREON71_SPACE        0x3b154511      /* Aureon 7.1 Space */
 #define VT1724_SUBDEVICE_AUREON71_UNIVERSE     0x3b155311      /* Aureon 7.1 Universe */
 #define VT1724_SUBDEVICE_PRODIGY71     0x33495345      /* PRODIGY 7.1 */
+#define VT1724_SUBDEVICE_PRODIGY71LT   0x32315441      /* PRODIGY 7.1 LT */
 
 extern struct snd_ice1712_card_info  snd_vt1724_aureon_cards[];
 
@@ -53,4 +55,8 @@ extern struct snd_ice1712_card_info  snd_vt1724_aureon_cards[];
 #define AUREON_AC97_DATA_HIGH  (1 << 8)
 #define AUREON_AC97_DATA_MASK  0xFF
 
+#define PRODIGY_WM_CS          (1 << 8)
+#define PRODIGY_SPI_MOSI       (1 << 10)
+#define PRODIGY_SPI_CLK                (1 << 9)
+
 #endif /* __SOUND_AUREON_H */