|
@@ -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 */
|
|
|
};
|