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 */
......
This diff is collapsed.
...@@ -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