Commit 45fe722b authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] ice1724 - Add support of Prodigy-7.1LT

Modules: ICE1712 driver

Added the support of Prodigy-7.1LT board.
The patch taken from ALSA BTS bug#1090.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 0534ab42
...@@ -322,36 +322,48 @@ static void aureon_spi_write(struct snd_ice1712 *ice, unsigned int cs, unsigned ...@@ -322,36 +322,48 @@ static void aureon_spi_write(struct snd_ice1712 *ice, unsigned int cs, unsigned
{ {
unsigned int tmp; unsigned int tmp;
int i; int i;
unsigned int mosi, clk;
tmp = snd_ice1712_gpio_read(ice); tmp = snd_ice1712_gpio_read(ice);
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| snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RW|AUREON_SPI_MOSI|AUREON_SPI_CLK|
AUREON_WM_CS|AUREON_CS8415_CS)); AUREON_WM_CS|AUREON_CS8415_CS));
mosi = AUREON_SPI_MOSI;
clk = AUREON_SPI_CLK;
tmp |= AUREON_WM_RW; tmp |= AUREON_WM_RW;
}
tmp &= ~cs; tmp &= ~cs;
snd_ice1712_gpio_write(ice, tmp); snd_ice1712_gpio_write(ice, tmp);
udelay(1); udelay(1);
for (i = bits - 1; i >= 0; i--) { for (i = bits - 1; i >= 0; i--) {
tmp &= ~AUREON_SPI_CLK; tmp &= ~clk;
snd_ice1712_gpio_write(ice, tmp); snd_ice1712_gpio_write(ice, tmp);
udelay(1); udelay(1);
if (data & (1 << i)) if (data & (1 << i))
tmp |= AUREON_SPI_MOSI; tmp |= mosi;
else else
tmp &= ~AUREON_SPI_MOSI; tmp &= ~mosi;
snd_ice1712_gpio_write(ice, tmp); snd_ice1712_gpio_write(ice, tmp);
udelay(1); udelay(1);
tmp |= AUREON_SPI_CLK; tmp |= clk;
snd_ice1712_gpio_write(ice, tmp); snd_ice1712_gpio_write(ice, tmp);
udelay(1); udelay(1);
} }
tmp &= ~AUREON_SPI_CLK; tmp &= ~clk;
tmp |= cs; tmp |= cs;
snd_ice1712_gpio_write(ice, tmp); snd_ice1712_gpio_write(ice, tmp);
udelay(1); udelay(1);
tmp |= AUREON_SPI_CLK; tmp |= clk;
snd_ice1712_gpio_write(ice, tmp); snd_ice1712_gpio_write(ice, tmp);
udelay(1); udelay(1);
} }
...@@ -440,7 +452,9 @@ static unsigned short wm_get(struct snd_ice1712 *ice, int reg) ...@@ -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) 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) ...@@ -1659,7 +1673,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice)
return err; return err;
} }
} }
else { else if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) {
for (i = 0; i < ARRAY_SIZE(ac97_controls); i++) { for (i = 0; i < ARRAY_SIZE(ac97_controls); i++) {
err = snd_ctl_add(ice->card, snd_ctl_new1(&ac97_controls[i], ice)); err = snd_ctl_add(ice->card, snd_ctl_new1(&ac97_controls[i], ice));
if (err < 0) if (err < 0)
...@@ -1667,7 +1681,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice) ...@@ -1667,7 +1681,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice)
} }
} }
{ if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) {
unsigned char id; unsigned char id;
snd_ice1712_save_gpio_status(ice); snd_ice1712_save_gpio_status(ice);
id = aureon_cs8415_get(ice, CS8415_ID); id = aureon_cs8415_get(ice, CS8415_ID);
...@@ -1822,7 +1836,8 @@ static int __devinit aureon_init(struct snd_ice1712 *ice) ...@@ -1822,7 +1836,8 @@ static int __devinit aureon_init(struct snd_ice1712 *ice)
udelay(1); udelay(1);
/* initialize WM8770 codec */ /* 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; p = wm_inits_prodigy;
else else
p = wm_inits_aureon; p = wm_inits_aureon;
...@@ -1830,11 +1845,13 @@ static int __devinit aureon_init(struct snd_ice1712 *ice) ...@@ -1830,11 +1845,13 @@ static int __devinit aureon_init(struct snd_ice1712 *ice)
wm_put(ice, p[0], p[1]); wm_put(ice, p[0], p[1]);
/* initialize CS8415A codec */ /* initialize CS8415A codec */
if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) {
for (p = cs_inits; *p != (unsigned short)-1; p++) for (p = cs_inits; *p != (unsigned short)-1; p++)
aureon_spi_write(ice, AUREON_CS8415_CS, *p | 0x200000, 24); aureon_spi_write(ice, AUREON_CS8415_CS, *p | 0x200000, 24);
ice->spec.aureon.cs8415_mux = 1; ice->spec.aureon.cs8415_mux = 1;
aureon_set_headphone_amp(ice, 1); aureon_set_headphone_amp(ice, 1);
}
snd_ice1712_restore_gpio_status(ice); snd_ice1712_restore_gpio_status(ice);
...@@ -1902,6 +1919,23 @@ static unsigned char prodigy71_eeprom[] __devinitdata = { ...@@ -1902,6 +1919,23 @@ static unsigned char prodigy71_eeprom[] __devinitdata = {
0x00, /* GPIO_STATE2 */ 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 */ /* entry point */
struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = { struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = {
{ {
...@@ -1944,5 +1978,15 @@ 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, .eeprom_data = prodigy71_eeprom,
.driver = "Prodigy71", /* should be identical with Aureon71 */ .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 */ { } /* terminator */
}; };
...@@ -27,12 +27,14 @@ ...@@ -27,12 +27,14 @@
#define AUREON_DEVICE_DESC "{Terratec,Aureon 5.1 Sky},"\ #define AUREON_DEVICE_DESC "{Terratec,Aureon 5.1 Sky},"\
"{Terratec,Aureon 7.1 Space},"\ "{Terratec,Aureon 7.1 Space},"\
"{Terratec,Aureon 7.1 Universe}," \ "{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_AUREON51_SKY 0x3b154711 /* Aureon 5.1 Sky */
#define VT1724_SUBDEVICE_AUREON71_SPACE 0x3b154511 /* Aureon 7.1 Space */ #define VT1724_SUBDEVICE_AUREON71_SPACE 0x3b154511 /* Aureon 7.1 Space */
#define VT1724_SUBDEVICE_AUREON71_UNIVERSE 0x3b155311 /* Aureon 7.1 Universe */ #define VT1724_SUBDEVICE_AUREON71_UNIVERSE 0x3b155311 /* Aureon 7.1 Universe */
#define VT1724_SUBDEVICE_PRODIGY71 0x33495345 /* PRODIGY 7.1 */ #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[]; extern struct snd_ice1712_card_info snd_vt1724_aureon_cards[];
...@@ -53,4 +55,8 @@ 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_HIGH (1 << 8)
#define AUREON_AC97_DATA_MASK 0xFF #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 */ #endif /* __SOUND_AUREON_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment