Commit 190d2c46 authored by James Courtier-Dutton's avatar James Courtier-Dutton Committed by Mercurial server

[ALSA] snd:emu10k1: E-Mu updates. Fixes to firmware loading and support for 0404.

Signed-off-by: default avatarJames Courtier-Dutton <James@superbug.co.uk>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 44893a36
...@@ -1628,7 +1628,7 @@ struct snd_emu_chip_details { ...@@ -1628,7 +1628,7 @@ struct snd_emu_chip_details {
unsigned char spdif_bug; /* Has Spdif phasing bug */ unsigned char spdif_bug; /* Has Spdif phasing bug */
unsigned char ac97_chip; /* Has an AC97 chip: 1 = mandatory, 2 = optional */ unsigned char ac97_chip; /* Has an AC97 chip: 1 = mandatory, 2 = optional */
unsigned char ecard; /* APS EEPROM */ unsigned char ecard; /* APS EEPROM */
unsigned char emu1010; /* EMU 1010m card */ unsigned char emu_model; /* EMU model type */
unsigned char spi_dac; /* SPI interface for DAC */ unsigned char spi_dac; /* SPI interface for DAC */
unsigned char i2c_adc; /* I2C interface for ADC */ unsigned char i2c_adc; /* I2C interface for ADC */
unsigned char adc_1361t; /* Use Philips 1361T ADC */ unsigned char adc_1361t; /* Use Philips 1361T ADC */
......
...@@ -54,12 +54,14 @@ ...@@ -54,12 +54,14 @@
#define DOCK_FILENAME "emu/audio_dock.fw" #define DOCK_FILENAME "emu/audio_dock.fw"
#define EMU1010B_FILENAME "emu/emu1010b.fw" #define EMU1010B_FILENAME "emu/emu1010b.fw"
#define MICRO_DOCK_FILENAME "emu/micro_dock.fw" #define MICRO_DOCK_FILENAME "emu/micro_dock.fw"
#define EMU0404_FILENAME "emu/emu0404.fw"
#define EMU1010_NOTEBOOK_FILENAME "emu/emu1010_notebook.fw" #define EMU1010_NOTEBOOK_FILENAME "emu/emu1010_notebook.fw"
MODULE_FIRMWARE(HANA_FILENAME); MODULE_FIRMWARE(HANA_FILENAME);
MODULE_FIRMWARE(DOCK_FILENAME); MODULE_FIRMWARE(DOCK_FILENAME);
MODULE_FIRMWARE(EMU1010B_FILENAME); MODULE_FIRMWARE(EMU1010B_FILENAME);
MODULE_FIRMWARE(MICRO_DOCK_FILENAME); MODULE_FIRMWARE(MICRO_DOCK_FILENAME);
MODULE_FIRMWARE(EMU0404_FILENAME);
MODULE_FIRMWARE(EMU1010_NOTEBOOK_FILENAME); MODULE_FIRMWARE(EMU1010_NOTEBOOK_FILENAME);
...@@ -287,7 +289,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) ...@@ -287,7 +289,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page); snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
} }
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
outl(HCFG_AUTOMUTE_ASYNC | outl(HCFG_AUTOMUTE_ASYNC |
HCFG_EMU32_SLAVE | HCFG_EMU32_SLAVE |
HCFG_AUDIOENABLE, emu->port + HCFG); HCFG_AUDIOENABLE, emu->port + HCFG);
...@@ -317,7 +319,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) ...@@ -317,7 +319,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG); outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG);
if (enable_ir) { /* enable IR for SB Live */ if (enable_ir) { /* enable IR for SB Live */
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
; /* Disable all access to A_IOCFG for the emu1010 */ ; /* Disable all access to A_IOCFG for the emu1010 */
} else if (emu->card_capabilities->i2c_adc) { } else if (emu->card_capabilities->i2c_adc) {
; /* Disable A_IOCFG for Audigy 2 ZS Notebook */ ; /* Disable A_IOCFG for Audigy 2 ZS Notebook */
...@@ -338,7 +340,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) ...@@ -338,7 +340,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
} }
} }
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
; /* Disable all access to A_IOCFG for the emu1010 */ ; /* Disable all access to A_IOCFG for the emu1010 */
} else if (emu->card_capabilities->i2c_adc) { } else if (emu->card_capabilities->i2c_adc) {
; /* Disable A_IOCFG for Audigy 2 ZS Notebook */ ; /* Disable A_IOCFG for Audigy 2 ZS Notebook */
...@@ -358,7 +360,7 @@ static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu) ...@@ -358,7 +360,7 @@ static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu)
outl(inl(emu->port + HCFG) | HCFG_AUDIOENABLE, emu->port + HCFG); outl(inl(emu->port + HCFG) | HCFG_AUDIOENABLE, emu->port + HCFG);
/* Enable analog/digital outs on audigy */ /* Enable analog/digital outs on audigy */
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
; /* Disable all access to A_IOCFG for the emu1010 */ ; /* Disable all access to A_IOCFG for the emu1010 */
} else if (emu->card_capabilities->i2c_adc) { } else if (emu->card_capabilities->i2c_adc) {
; /* Disable A_IOCFG for Audigy 2 ZS Notebook */ ; /* Disable A_IOCFG for Audigy 2 ZS Notebook */
...@@ -660,6 +662,8 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file ...@@ -660,6 +662,8 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file
int n, i; int n, i;
int reg; int reg;
int value; int value;
unsigned int write_post;
unsigned long flags;
const struct firmware *fw_entry; const struct firmware *fw_entry;
if ((err = request_firmware(&fw_entry, filename, &emu->pci->dev)) != 0) { if ((err = request_firmware(&fw_entry, filename, &emu->pci->dev)) != 0) {
...@@ -667,12 +671,6 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file ...@@ -667,12 +671,6 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file
return err; return err;
} }
snd_printk(KERN_INFO "firmware size=0x%zx\n", fw_entry->size); snd_printk(KERN_INFO "firmware size=0x%zx\n", fw_entry->size);
#if 0
if (fw_entry->size != 0x133a4) {
snd_printk(KERN_ERR "firmware: %s wrong size.\n",filename);
return -EINVAL;
}
#endif
/* The FPGA is a Xilinx Spartan IIE XC2S50E */ /* The FPGA is a Xilinx Spartan IIE XC2S50E */
/* GPIO7 -> FPGA PGMN /* GPIO7 -> FPGA PGMN
...@@ -680,9 +678,12 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file ...@@ -680,9 +678,12 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file
* GPIO5 -> FPGA DIN * GPIO5 -> FPGA DIN
* FPGA CONFIG OFF -> FPGA PGMN * FPGA CONFIG OFF -> FPGA PGMN
*/ */
spin_lock_irqsave(&emu->emu_lock, flags);
outl(0x00, emu->port + A_IOCFG); /* Set PGMN low for 1uS. */ outl(0x00, emu->port + A_IOCFG); /* Set PGMN low for 1uS. */
udelay(1); write_post = inl(emu->port + A_IOCFG);
udelay(100);
outl(0x80, emu->port + A_IOCFG); /* Leave bit 7 set during netlist setup. */ outl(0x80, emu->port + A_IOCFG); /* Leave bit 7 set during netlist setup. */
write_post = inl(emu->port + A_IOCFG);
udelay(100); /* Allow FPGA memory to clean */ udelay(100); /* Allow FPGA memory to clean */
for(n = 0; n < fw_entry->size; n++) { for(n = 0; n < fw_entry->size; n++) {
value=fw_entry->data[n]; value=fw_entry->data[n];
...@@ -692,12 +693,15 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file ...@@ -692,12 +693,15 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file
reg = reg | 0x20; reg = reg | 0x20;
value = value >> 1; value = value >> 1;
outl(reg, emu->port + A_IOCFG); outl(reg, emu->port + A_IOCFG);
write_post = inl(emu->port + A_IOCFG);
outl(reg | 0x40, emu->port + A_IOCFG); outl(reg | 0x40, emu->port + A_IOCFG);
write_post = inl(emu->port + A_IOCFG);
} }
} }
/* After programming, set GPIO bit 4 high again. */ /* After programming, set GPIO bit 4 high again. */
outl(0x10, emu->port + A_IOCFG); outl(0x10, emu->port + A_IOCFG);
write_post = inl(emu->port + A_IOCFG);
spin_unlock_irqrestore(&emu->emu_lock, flags);
release_firmware(fw_entry); release_firmware(fw_entry);
return 0; return 0;
...@@ -711,7 +715,7 @@ int emu1010_firmware_thread(void *data) { ...@@ -711,7 +715,7 @@ int emu1010_firmware_thread(void *data) {
for (;;) { for (;;) {
/* Delay to allow Audio Dock to settle */ /* Delay to allow Audio Dock to settle */
msleep(1000); msleep_interruptible(1000);
if (kthread_should_stop()) if (kthread_should_stop())
break; break;
snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &tmp ); /* IRQ Status */ snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &tmp ); /* IRQ Status */
...@@ -721,17 +725,17 @@ int emu1010_firmware_thread(void *data) { ...@@ -721,17 +725,17 @@ int emu1010_firmware_thread(void *data) {
/* Return to Audio Dock programming mode */ /* Return to Audio Dock programming mode */
snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n"); snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n");
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK ); snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK );
if (emu->card_capabilities->emu1010 == 1) { if (emu->card_capabilities->emu_model == 1) {
if ((err = snd_emu1010_load_firmware(emu, DOCK_FILENAME)) != 0) { if ((err = snd_emu1010_load_firmware(emu, DOCK_FILENAME)) != 0) {
return err; continue;
} }
} else if (emu->card_capabilities->emu1010 == 2) { } else if (emu->card_capabilities->emu_model == 2) {
if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) { if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) {
return err; continue;
} }
} else if (emu->card_capabilities->emu1010 == 3) { } else if (emu->card_capabilities->emu_model == 3) {
if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) { if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) {
return err; continue;
} }
} }
...@@ -744,8 +748,7 @@ int emu1010_firmware_thread(void *data) { ...@@ -744,8 +748,7 @@ int emu1010_firmware_thread(void *data) {
if ((reg & 0x1f) != 0x15) { if ((reg & 0x1f) != 0x15) {
/* FPGA failed to be programmed */ /* FPGA failed to be programmed */
snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware file failed, reg=0x%x\n", reg); snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware file failed, reg=0x%x\n", reg);
return 0; continue;
return -ENODEV;
} }
snd_printk(KERN_INFO "emu1010: Audio Dock Firmware loaded\n"); snd_printk(KERN_INFO "emu1010: Audio Dock Firmware loaded\n");
snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp ); snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp );
...@@ -756,9 +759,9 @@ int emu1010_firmware_thread(void *data) { ...@@ -756,9 +759,9 @@ int emu1010_firmware_thread(void *data) {
msleep(10); msleep(10);
/* Unmute all. Default is muted after a firmware load */ /* Unmute all. Default is muted after a firmware load */
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE ); snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
break;
} }
} }
snd_printk(KERN_INFO "emu1010: firmware thread stopping\n");
return 0; return 0;
} }
...@@ -799,6 +802,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) ...@@ -799,6 +802,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu)
int tmp,tmp2; int tmp,tmp2;
int reg; int reg;
int err; int err;
const char *filename = NULL;
snd_printk(KERN_INFO "emu1010: Special config.\n"); snd_printk(KERN_INFO "emu1010: Special config.\n");
/* AC97 2.1, Any 16Meg of 4Gig address, Auto-Mute, EMU32 Slave, /* AC97 2.1, Any 16Meg of 4Gig address, Auto-Mute, EMU32 Slave,
...@@ -840,21 +844,31 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu) ...@@ -840,21 +844,31 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu)
return -ENODEV; return -ENODEV;
} }
snd_printk(KERN_INFO "emu1010: EMU_HANA_ID=0x%x\n",reg); snd_printk(KERN_INFO "emu1010: EMU_HANA_ID=0x%x\n",reg);
if (emu->card_capabilities->emu1010 == 1) { switch (emu->card_capabilities->emu_model) {
if ((err = snd_emu1010_load_firmware(emu, HANA_FILENAME)) != 0) { case 1:
snd_printk(KERN_INFO "emu1010: Loading Hana Firmware file %s failed\n", HANA_FILENAME); filename = HANA_FILENAME;
return err; break;
} case 2:
} else if (emu->card_capabilities->emu1010 == 2) { filename = EMU1010B_FILENAME;
if ((err = snd_emu1010_load_firmware(emu, EMU1010B_FILENAME)) != 0) { break;
snd_printk(KERN_INFO "emu1010: Loading Firmware file %s failed\n", EMU1010B_FILENAME); case 3:
return err; filename = EMU1010_NOTEBOOK_FILENAME;
} break;
} else if (emu->card_capabilities->emu1010 == 3) { case 4:
if ((err = snd_emu1010_load_firmware(emu, EMU1010_NOTEBOOK_FILENAME)) != 0) { filename = EMU0404_FILENAME;
snd_printk(KERN_INFO "emu1010: Loading Firmware file %s failed\n", EMU1010_NOTEBOOK_FILENAME); break;
return err; default:
} filename = NULL;
return -ENODEV;
break;
}
snd_printk(KERN_INFO "emu1010: filename %s testing\n", filename);
err = snd_emu1010_load_firmware(emu, filename);
if (err != 0) {
snd_printk(
KERN_INFO "emu1010: Loading Firmware file %s failed\n",
filename);
return err;
} }
/* ID, should read & 0x7f = 0x55 when FPGA programmed. */ /* ID, should read & 0x7f = 0x55 when FPGA programmed. */
...@@ -1201,11 +1215,12 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu) ...@@ -1201,11 +1215,12 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu)
} }
snd_emu10k1_free_efx(emu); snd_emu10k1_free_efx(emu);
} }
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model == 1) {
/* Disable 48Volt power to Audio Dock */ /* Disable 48Volt power to Audio Dock */
snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, 0 ); snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, 0 );
kthread_stop(emu->emu1010.firmware_thread);
} }
if (emu->card_capabilities->emu_model)
kthread_stop(emu->emu1010.firmware_thread);
if (emu->memhdr) if (emu->memhdr)
snd_util_memhdr_free(emu->memhdr); snd_util_memhdr_free(emu->memhdr);
if (emu->silent_page.area) if (emu->silent_page.area)
...@@ -1337,6 +1352,15 @@ static struct snd_emu_chip_details emu_chip_details[] = { ...@@ -1337,6 +1352,15 @@ static struct snd_emu_chip_details emu_chip_details[] = {
.spi_dac = 1, .spi_dac = 1,
.i2c_adc = 1, .i2c_adc = 1,
.spk71 = 1} , .spk71 = 1} ,
/* Tested by James@superbug.co.uk 20-3-2007. */
{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40021102,
.driver = "Audigy2", .name = "E-mu 0404 [4002]",
.id = "EMU0404",
.emu10k2_chip = 1,
.ca0102_chip = 1,
.spk71 = 1,
.emu_model = 4} , /* EMU 0404 */
/* Tested by James@superbug.co.uk 4th Nov 2007. */
{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x42011102, {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x42011102,
.driver = "Audigy2", .name = "E-mu 1010 Notebook [MAEM8950]", .driver = "Audigy2", .name = "E-mu 1010 Notebook [MAEM8950]",
.id = "EMU1010", .id = "EMU1010",
...@@ -1344,28 +1368,30 @@ static struct snd_emu_chip_details emu_chip_details[] = { ...@@ -1344,28 +1368,30 @@ static struct snd_emu_chip_details emu_chip_details[] = {
.ca0108_chip = 1, .ca0108_chip = 1,
.ca_cardbus_chip = 1, .ca_cardbus_chip = 1,
.spk71 = 1 , .spk71 = 1 ,
.emu1010 = 3} , .emu_model = 3} ,
/* Tested by James@superbug.co.uk 4th Nov 2007. */
{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40041102, {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40041102,
.driver = "Audigy2", .name = "E-mu 1010b PCI [MAEM????]", .driver = "Audigy2", .name = "E-mu 1010b PCI [MAEM????]",
.id = "EMU1010", .id = "EMU1010",
.emu10k2_chip = 1, .emu10k2_chip = 1,
.ca0108_chip = 1, .ca0108_chip = 1,
.spk71 = 1 , .spk71 = 1,
.emu1010 = 2} , .emu_model = 2} ,
/* Tested by James@superbug.co.uk 8th July 2005. */
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40011102,
.driver = "Audigy2", .name = "E-mu 1010 [4001]",
.id = "EMU1010",
.emu10k2_chip = 1,
.ca0102_chip = 1,
.spk71 = 1,
.emu_model = 1} , /* Emu 1010 */
/* Audigy4 (Not PRO) SB0610 */
{.vendor = 0x1102, .device = 0x0008, {.vendor = 0x1102, .device = 0x0008,
.driver = "Audigy2", .name = "Audigy 2 Value [Unknown]", .driver = "Audigy2", .name = "Audigy 2 Value [Unknown]",
.id = "Audigy2", .id = "Audigy2",
.emu10k2_chip = 1, .emu10k2_chip = 1,
.ca0108_chip = 1, .ca0108_chip = 1,
.ac97_chip = 1} , .ac97_chip = 1} ,
/* Tested by James@superbug.co.uk 8th July 2005. No sound available yet. */
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40011102,
.driver = "Audigy2", .name = "E-mu 1010 [4001]",
.id = "EMU1010",
.emu10k2_chip = 1,
.ca0102_chip = 1,
.spk71 = 1,
.emu1010 = 1} ,
/* Tested by James@superbug.co.uk 3rd July 2005 */ /* Tested by James@superbug.co.uk 3rd July 2005 */
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20071102, {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20071102,
.driver = "Audigy2", .name = "Audigy 4 PRO [SB0380]", .driver = "Audigy2", .name = "Audigy 4 PRO [SB0380]",
...@@ -1793,7 +1819,7 @@ int __devinit snd_emu10k1_create(struct snd_card *card, ...@@ -1793,7 +1819,7 @@ int __devinit snd_emu10k1_create(struct snd_card *card,
if (emu->card_capabilities->ecard) { if (emu->card_capabilities->ecard) {
if ((err = snd_emu10k1_ecard_init(emu)) < 0) if ((err = snd_emu10k1_ecard_init(emu)) < 0)
goto error; goto error;
} else if (emu->card_capabilities->emu1010) { } else if (emu->card_capabilities->emu_model) {
if ((err = snd_emu10k1_emu1010_init(emu)) < 0) { if ((err = snd_emu10k1_emu1010_init(emu)) < 0) {
snd_emu10k1_free(emu); snd_emu10k1_free(emu);
return err; return err;
...@@ -1942,7 +1968,7 @@ void snd_emu10k1_resume_init(struct snd_emu10k1 *emu) ...@@ -1942,7 +1968,7 @@ void snd_emu10k1_resume_init(struct snd_emu10k1 *emu)
snd_emu10k1_cardbus_init(emu); snd_emu10k1_cardbus_init(emu);
if (emu->card_capabilities->ecard) if (emu->card_capabilities->ecard)
snd_emu10k1_ecard_init(emu); snd_emu10k1_ecard_init(emu);
else if (emu->card_capabilities->emu1010) else if (emu->card_capabilities->emu_model)
snd_emu10k1_emu1010_init(emu); snd_emu10k1_emu1010_init(emu);
else else
snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE); snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE);
......
...@@ -1261,7 +1261,7 @@ static int __devinit _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu) ...@@ -1261,7 +1261,7 @@ static int __devinit _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu)
A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
/* emu1212 DSP 0 and DSP 1 Capture */ /* emu1212 DSP 0 and DSP 1 Capture */
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
if (emu->card_capabilities->ca0108_chip) { if (emu->card_capabilities->ca0108_chip) {
/* Note:JCD:No longer bit shift lower 16bits to upper 16bits of 32bit value. */ /* Note:JCD:No longer bit shift lower 16bits to upper 16bits of 32bit value. */
A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x0), A_C_00000001); A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x0), A_C_00000001);
...@@ -1515,7 +1515,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) ...@@ -1515,7 +1515,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
/* digital outputs */ /* digital outputs */
/* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */ /* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
/* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */ /* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */
snd_printk("EMU outputs on\n"); snd_printk("EMU outputs on\n");
for (z = 0; z < 8; z++) { for (z = 0; z < 8; z++) {
...@@ -1563,7 +1563,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) ...@@ -1563,7 +1563,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_R, capture+1); A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_R, capture+1);
#endif #endif
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
if (emu->card_capabilities->ca0108_chip) { if (emu->card_capabilities->ca0108_chip) {
snd_printk("EMU2 inputs on\n"); snd_printk("EMU2 inputs on\n");
for (z = 0; z < 0x10; z++) { for (z = 0; z < 0x10; z++) {
......
...@@ -1792,7 +1792,7 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, ...@@ -1792,7 +1792,7 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
return err; return err;
} }
if ( emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
; /* Disable the snd_audigy_spdif_shared_spdif */ ; /* Disable the snd_audigy_spdif_shared_spdif */
} else if (emu->audigy) { } else if (emu->audigy) {
if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL) if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
...@@ -1817,7 +1817,7 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, ...@@ -1817,7 +1817,7 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
return err; return err;
} }
if ( emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
int i; int i;
for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) { for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
......
...@@ -357,7 +357,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, ...@@ -357,7 +357,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]); snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24)); snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24)); snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
if (emu->card_capabilities->emu1010) if (emu->card_capabilities->emu_model)
pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */ pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
else else
pitch_target = emu10k1_calc_pitch_target(runtime->rate); pitch_target = emu10k1_calc_pitch_target(runtime->rate);
...@@ -700,7 +700,7 @@ static void snd_emu10k1_playback_trigger_voice(struct snd_emu10k1 *emu, struct s ...@@ -700,7 +700,7 @@ static void snd_emu10k1_playback_trigger_voice(struct snd_emu10k1 *emu, struct s
voice = evoice->number; voice = evoice->number;
pitch = snd_emu10k1_rate_to_pitch(runtime->rate) >> 8; pitch = snd_emu10k1_rate_to_pitch(runtime->rate) >> 8;
if (emu->card_capabilities->emu1010) if (emu->card_capabilities->emu_model)
pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */ pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
else else
pitch_target = emu10k1_calc_pitch_target(runtime->rate); pitch_target = emu10k1_calc_pitch_target(runtime->rate);
...@@ -1231,7 +1231,7 @@ static int snd_emu10k1_capture_efx_open(struct snd_pcm_substream *substream) ...@@ -1231,7 +1231,7 @@ static int snd_emu10k1_capture_efx_open(struct snd_pcm_substream *substream)
runtime->hw.rates = SNDRV_PCM_RATE_48000; runtime->hw.rates = SNDRV_PCM_RATE_48000;
runtime->hw.rate_min = runtime->hw.rate_max = 48000; runtime->hw.rate_min = runtime->hw.rate_max = 48000;
spin_lock_irq(&emu->reg_lock); spin_lock_irq(&emu->reg_lock);
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
/* Nb. of channels has been increased to 16 */ /* Nb. of channels has been increased to 16 */
/* TODO /* TODO
* SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE * SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE
...@@ -1790,7 +1790,7 @@ int __devinit snd_emu10k1_pcm_efx(struct snd_emu10k1 * emu, int device, struct s ...@@ -1790,7 +1790,7 @@ int __devinit snd_emu10k1_pcm_efx(struct snd_emu10k1 * emu, int device, struct s
/* emu->efx_voices_mask[0] = FXWC_DEFAULTROUTE_C | FXWC_DEFAULTROUTE_A; */ /* emu->efx_voices_mask[0] = FXWC_DEFAULTROUTE_C | FXWC_DEFAULTROUTE_A; */
if (emu->audigy) { if (emu->audigy) {
emu->efx_voices_mask[0] = 0; emu->efx_voices_mask[0] = 0;
if (emu->card_capabilities->emu1010) if (emu->card_capabilities->emu_model)
/* Pavel Hofman - 32 voices will be used for /* Pavel Hofman - 32 voices will be used for
* capture (write mode) - * capture (write mode) -
* each bit = corresponding voice * each bit = corresponding voice
......
...@@ -244,7 +244,7 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry, ...@@ -244,7 +244,7 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry,
unsigned long flags; unsigned long flags;
u32 rate; u32 rate;
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
spin_lock_irqsave(&emu->emu_lock, flags); spin_lock_irqsave(&emu->emu_lock, flags);
snd_emu1010_fpga_read(emu, 0x38, &value); snd_emu1010_fpga_read(emu, 0x38, &value);
spin_unlock_irqrestore(&emu->emu_lock, flags); spin_unlock_irqrestore(&emu->emu_lock, flags);
...@@ -584,7 +584,7 @@ int __devinit snd_emu10k1_proc_init(struct snd_emu10k1 * emu) ...@@ -584,7 +584,7 @@ int __devinit snd_emu10k1_proc_init(struct snd_emu10k1 * emu)
{ {
struct snd_info_entry *entry; struct snd_info_entry *entry;
#ifdef CONFIG_SND_DEBUG #ifdef CONFIG_SND_DEBUG
if (emu->card_capabilities->emu1010) { if (emu->card_capabilities->emu_model) {
if (! snd_card_proc_new(emu->card, "emu1010_regs", &entry)) if (! snd_card_proc_new(emu->card, "emu1010_regs", &entry))
snd_info_set_text_ops(entry, emu, snd_emu_proc_emu1010_reg_read); snd_info_set_text_ops(entry, emu, snd_emu_proc_emu1010_reg_read);
} }
......
...@@ -227,11 +227,14 @@ int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu, ...@@ -227,11 +227,14 @@ int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu,
int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, u32 reg, u32 value) int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, u32 reg, u32 value)
{ {
unsigned long flags;
if (reg > 0x3f) if (reg > 0x3f)
return 1; return 1;
reg += 0x40; /* 0x40 upwards are registers. */ reg += 0x40; /* 0x40 upwards are registers. */
if (value < 0 || value > 0x3f) /* 0 to 0x3f are values */ if (value < 0 || value > 0x3f) /* 0 to 0x3f are values */
return 1; return 1;
spin_lock_irqsave(&emu->emu_lock, flags);
outl(reg, emu->port + A_IOCFG); outl(reg, emu->port + A_IOCFG);
udelay(10); udelay(10);
outl(reg | 0x80, emu->port + A_IOCFG); /* High bit clocks the value into the fpga. */ outl(reg | 0x80, emu->port + A_IOCFG); /* High bit clocks the value into the fpga. */
...@@ -239,20 +242,24 @@ int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, u32 reg, u32 value) ...@@ -239,20 +242,24 @@ int snd_emu1010_fpga_write(struct snd_emu10k1 * emu, u32 reg, u32 value)
outl(value, emu->port + A_IOCFG); outl(value, emu->port + A_IOCFG);
udelay(10); udelay(10);
outl(value | 0x80 , emu->port + A_IOCFG); /* High bit clocks the value into the fpga. */ outl(value | 0x80 , emu->port + A_IOCFG); /* High bit clocks the value into the fpga. */
spin_unlock_irqrestore(&emu->emu_lock, flags);
return 0; return 0;
} }
int snd_emu1010_fpga_read(struct snd_emu10k1 * emu, u32 reg, u32 *value) int snd_emu1010_fpga_read(struct snd_emu10k1 * emu, u32 reg, u32 *value)
{ {
unsigned long flags;
if (reg > 0x3f) if (reg > 0x3f)
return 1; return 1;
reg += 0x40; /* 0x40 upwards are registers. */ reg += 0x40; /* 0x40 upwards are registers. */
spin_lock_irqsave(&emu->emu_lock, flags);
outl(reg, emu->port + A_IOCFG); outl(reg, emu->port + A_IOCFG);
udelay(10); udelay(10);
outl(reg | 0x80, emu->port + A_IOCFG); /* High bit clocks the value into the fpga. */ outl(reg | 0x80, emu->port + A_IOCFG); /* High bit clocks the value into the fpga. */
udelay(10); udelay(10);
*value = ((inl(emu->port + A_IOCFG) >> 8) & 0x7f); *value = ((inl(emu->port + A_IOCFG) >> 8) & 0x7f);
spin_unlock_irqrestore(&emu->emu_lock, flags);
return 0; return 0;
} }
......
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