patch-2.4.22 linux-2.4.22/drivers/sound/au1000.c
Next file: linux-2.4.22/drivers/sound/awe_wave.c
Previous file: linux-2.4.22/drivers/sound/ali5455.c
Back to the patch index
Back to the overall index
- Lines: 308
- Date:
2003-08-25 04:44:42.000000000 -0700
- Orig file:
linux-2.4.21/drivers/sound/au1000.c
- Orig date:
2002-11-28 15:53:14.000000000 -0800
diff -urN linux-2.4.21/drivers/sound/au1000.c linux-2.4.22/drivers/sound/au1000.c
@@ -77,7 +77,7 @@
/* --------------------------------------------------------------------- */
#undef OSS_DOCUMENTED_MIXER_SEMANTICS
-#define AU1000_DEBUG
+#undef AU1000_DEBUG
#undef AU1000_VERBOSE_DEBUG
#define USE_COHERENT_DMA
@@ -117,7 +117,7 @@
struct proc_dir_entry *ac97_ps;
#endif /* AU1000_DEBUG */
- struct ac97_codec codec;
+ struct ac97_codec *codec;
unsigned codec_base_caps;// AC'97 reg 00h, "Reset Register"
unsigned codec_ext_caps; // AC'97 reg 28h, "Extended Audio ID"
int no_vra; // do not use VRA
@@ -357,17 +357,17 @@
adc->src_factor = 1;
- ac97_extstat = rdcodec(&s->codec, AC97_EXTENDED_STATUS);
+ ac97_extstat = rdcodec(s->codec, AC97_EXTENDED_STATUS);
rate = rate > 48000 ? 48000 : rate;
// enable VRA
- wrcodec(&s->codec, AC97_EXTENDED_STATUS,
+ wrcodec(s->codec, AC97_EXTENDED_STATUS,
ac97_extstat | AC97_EXTSTAT_VRA);
// now write the sample rate
- wrcodec(&s->codec, AC97_PCM_LR_ADC_RATE, (u16) rate);
+ wrcodec(s->codec, AC97_PCM_LR_ADC_RATE, (u16) rate);
// read it back for actual supported rate
- adc_rate = rdcodec(&s->codec, AC97_PCM_LR_ADC_RATE);
+ adc_rate = rdcodec(s->codec, AC97_PCM_LR_ADC_RATE);
#ifdef AU1000_VERBOSE_DEBUG
dbg(__FUNCTION__ ": set to %d Hz", adc_rate);
@@ -375,11 +375,11 @@
// some codec's don't allow unequal DAC and ADC rates, in which case
// writing one rate reg actually changes both.
- dac_rate = rdcodec(&s->codec, AC97_PCM_FRONT_DAC_RATE);
+ dac_rate = rdcodec(s->codec, AC97_PCM_FRONT_DAC_RATE);
if (dac->num_channels > 2)
- wrcodec(&s->codec, AC97_PCM_SURR_DAC_RATE, dac_rate);
+ wrcodec(s->codec, AC97_PCM_SURR_DAC_RATE, dac_rate);
if (dac->num_channels > 4)
- wrcodec(&s->codec, AC97_PCM_LFE_DAC_RATE, dac_rate);
+ wrcodec(s->codec, AC97_PCM_LFE_DAC_RATE, dac_rate);
adc->sample_rate = adc_rate;
dac->sample_rate = dac_rate;
@@ -402,23 +402,23 @@
dac->src_factor = 1;
- ac97_extstat = rdcodec(&s->codec, AC97_EXTENDED_STATUS);
+ ac97_extstat = rdcodec(s->codec, AC97_EXTENDED_STATUS);
rate = rate > 48000 ? 48000 : rate;
// enable VRA
- wrcodec(&s->codec, AC97_EXTENDED_STATUS,
+ wrcodec(s->codec, AC97_EXTENDED_STATUS,
ac97_extstat | AC97_EXTSTAT_VRA);
// now write the sample rate
- wrcodec(&s->codec, AC97_PCM_FRONT_DAC_RATE, (u16) rate);
+ wrcodec(s->codec, AC97_PCM_FRONT_DAC_RATE, (u16) rate);
// I don't support different sample rates for multichannel,
// so make these channels the same.
if (dac->num_channels > 2)
- wrcodec(&s->codec, AC97_PCM_SURR_DAC_RATE, (u16) rate);
+ wrcodec(s->codec, AC97_PCM_SURR_DAC_RATE, (u16) rate);
if (dac->num_channels > 4)
- wrcodec(&s->codec, AC97_PCM_LFE_DAC_RATE, (u16) rate);
+ wrcodec(s->codec, AC97_PCM_LFE_DAC_RATE, (u16) rate);
// read it back for actual supported rate
- dac_rate = rdcodec(&s->codec, AC97_PCM_FRONT_DAC_RATE);
+ dac_rate = rdcodec(s->codec, AC97_PCM_FRONT_DAC_RATE);
#ifdef AU1000_VERBOSE_DEBUG
dbg(__FUNCTION__ ": set to %d Hz", dac_rate);
@@ -426,7 +426,7 @@
// some codec's don't allow unequal DAC and ADC rates, in which case
// writing one rate reg actually changes both.
- adc_rate = rdcodec(&s->codec, AC97_PCM_LR_ADC_RATE);
+ adc_rate = rdcodec(s->codec, AC97_PCM_LR_ADC_RATE);
dac->sample_rate = dac_rate;
adc->sample_rate = adc_rate;
@@ -905,7 +905,7 @@
unsigned int cmd, unsigned long arg)
{
struct au1000_state *s = (struct au1000_state *)file->private_data;
- struct ac97_codec *codec = &s->codec;
+ struct ac97_codec *codec = s->codec;
return mixdev_ioctl(codec, cmd, arg);
}
@@ -1504,9 +1504,9 @@
s->dma_dac.num_channels = val ? 2 : 1;
if (s->codec_ext_caps & AC97_EXT_DACS) {
// disable surround and center/lfe in AC'97
- u16 ext_stat = rdcodec(&s->codec,
+ u16 ext_stat = rdcodec(s->codec,
AC97_EXTENDED_STATUS);
- wrcodec(&s->codec, AC97_EXTENDED_STATUS,
+ wrcodec(s->codec, AC97_EXTENDED_STATUS,
ext_stat | (AC97_EXTSTAT_PRI |
AC97_EXTSTAT_PRJ |
AC97_EXTSTAT_PRK));
@@ -1556,9 +1556,9 @@
// disable surround and center/lfe
// channels in AC'97
u16 ext_stat =
- rdcodec(&s->codec,
+ rdcodec(s->codec,
AC97_EXTENDED_STATUS);
- wrcodec(&s->codec,
+ wrcodec(s->codec,
AC97_EXTENDED_STATUS,
ext_stat | (AC97_EXTSTAT_PRI |
AC97_EXTSTAT_PRJ |
@@ -1567,14 +1567,14 @@
// enable surround, center/lfe
// channels in AC'97
u16 ext_stat =
- rdcodec(&s->codec,
+ rdcodec(s->codec,
AC97_EXTENDED_STATUS);
ext_stat &= ~AC97_EXTSTAT_PRJ;
if (val == 6)
ext_stat &=
~(AC97_EXTSTAT_PRI |
AC97_EXTSTAT_PRK);
- wrcodec(&s->codec,
+ wrcodec(s->codec,
AC97_EXTENDED_STATUS,
ext_stat);
}
@@ -1836,7 +1836,7 @@
return -EINVAL;
}
- return mixdev_ioctl(&s->codec, cmd, arg);
+ return mixdev_ioctl(s->codec, cmd, arg);
}
@@ -1987,7 +1987,7 @@
len += sprintf(buf + len, "----------------------\n");
for (cnt = 0; cnt <= 0x7e; cnt += 2)
len += sprintf(buf + len, "reg %02x = %04x\n",
- cnt, rdcodec(&s->codec, cnt));
+ cnt, rdcodec(s->codec, cnt));
if (fpos >= len) {
*start = buf;
@@ -2023,16 +2023,22 @@
init_waitqueue_head(&s->open_wait);
init_MUTEX(&s->open_sem);
spin_lock_init(&s->lock);
- s->codec.private_data = s;
- s->codec.id = 0;
- s->codec.codec_read = rdcodec;
- s->codec.codec_write = wrcodec;
- s->codec.codec_wait = waitcodec;
- if (!request_region(virt_to_phys((void *) AC97C_CONFIG),
+ s->codec = ac97_alloc_codec();
+ if(s->codec == NULL)
+ {
+ error("Out of memory");
+ return -1;
+ }
+ s->codec->private_data = s;
+ s->codec->id = 0;
+ s->codec->codec_read = rdcodec;
+ s->codec->codec_write = wrcodec;
+ s->codec->codec_wait = waitcodec;
+
+ if (!request_region(PHYSADDR(AC97C_CONFIG),
0x14, AU1000_MODULE_NAME)) {
err("AC'97 ports in use");
- return -1;
}
// Allocate the DMA Channels
if ((s->dma_dac.dmanr = request_au1000_dma(DMA_ID_AC97C_TX,
@@ -2072,7 +2078,7 @@
if ((s->dev_audio = register_sound_dsp(&au1000_audio_fops, -1)) < 0)
goto err_dev1;
- if ((s->codec.dev_mixer =
+ if ((s->codec->dev_mixer =
register_sound_mixer(&au1000_mixer_fops, -1)) < 0)
goto err_dev2;
@@ -2105,11 +2111,11 @@
au_writel(0, AC97C_CONFIG);
/* codec init */
- if (!ac97_probe_codec(&s->codec))
+ if (!ac97_probe_codec(s->codec))
goto err_dev3;
- s->codec_base_caps = rdcodec(&s->codec, AC97_RESET);
- s->codec_ext_caps = rdcodec(&s->codec, AC97_EXTENDED_ID);
+ s->codec_base_caps = rdcodec(s->codec, AC97_RESET);
+ s->codec_ext_caps = rdcodec(s->codec, AC97_EXTENDED_ID);
info("AC'97 Base/Extended ID = %04x/%04x",
s->codec_base_caps, s->codec_ext_caps);
@@ -2121,12 +2127,12 @@
* ALTPCM). ac97_codec.c does not handle detection
* of this channel correctly.
*/
- s->codec.supported_mixers |= SOUND_MASK_ALTPCM;
+ s->codec->supported_mixers |= SOUND_MASK_ALTPCM;
/*
* Now set AUX_OUT's default volume.
*/
val = 0x4343;
- mixdev_ioctl(&s->codec, SOUND_MIXER_WRITE_ALTPCM,
+ mixdev_ioctl(s->codec, SOUND_MIXER_WRITE_ALTPCM,
(unsigned long) &val);
if (!(s->codec_ext_caps & AC97_EXTID_VRA)) {
@@ -2134,8 +2140,8 @@
s->no_vra = 1;
} else if (!vra) {
// Boot option says disable VRA
- u16 ac97_extstat = rdcodec(&s->codec, AC97_EXTENDED_STATUS);
- wrcodec(&s->codec, AC97_EXTENDED_STATUS,
+ u16 ac97_extstat = rdcodec(s->codec, AC97_EXTENDED_STATUS);
+ wrcodec(s->codec, AC97_EXTENDED_STATUS,
ac97_extstat & ~AC97_EXTSTAT_VRA);
s->no_vra = 1;
}
@@ -2144,20 +2150,38 @@
/* set mic to be the recording source */
val = SOUND_MASK_MIC;
- mixdev_ioctl(&s->codec, SOUND_MIXER_WRITE_RECSRC,
+ mixdev_ioctl(s->codec, SOUND_MIXER_WRITE_RECSRC,
(unsigned long) &val);
#ifdef AU1000_DEBUG
sprintf(proc_str, "driver/%s/%d/ac97", AU1000_MODULE_NAME,
- s->codec.id);
+ s->codec->id);
s->ac97_ps = create_proc_read_entry (proc_str, 0, NULL,
ac97_read_proc, &s->codec);
#endif
+#ifdef CONFIG_MIPS_XXS1500
+ /* deassert eapd */
+ wrcodec(&s->codec, AC97_POWER_CONTROL,
+ rdcodec(&s->codec, AC97_POWER_CONTROL) & ~0x8000);
+ /* mute a number of signals which seem to be causing problems
+ * if not muted.
+ */
+ wrcodec(&s->codec, AC97_PCBEEP_VOL, 0x8000);
+ wrcodec(&s->codec, AC97_PHONE_VOL, 0x8008);
+ wrcodec(&s->codec, AC97_MIC_VOL, 0x8008);
+ wrcodec(&s->codec, AC97_LINEIN_VOL, 0x8808);
+ wrcodec(&s->codec, AC97_CD_VOL, 0x8808);
+ wrcodec(&s->codec, AC97_VIDEO_VOL, 0x8808);
+ wrcodec(&s->codec, AC97_AUX_VOL, 0x8808);
+ wrcodec(&s->codec, AC97_PCMOUT_VOL, 0x0808);
+ wrcodec(&s->codec, AC97_GENERAL_PURPOSE, 0x2000);
+#endif
+
return 0;
err_dev3:
- unregister_sound_mixer(s->codec.dev_mixer);
+ unregister_sound_mixer(s->codec->dev_mixer);
err_dev2:
unregister_sound_dsp(s->dev_audio);
err_dev1:
@@ -2165,7 +2189,9 @@
err_dma2:
free_au1000_dma(s->dma_dac.dmanr);
err_dma1:
- release_region(virt_to_phys((void *) AC97C_CONFIG), 0x14);
+ release_region(PHYSADDR(AC97C_CONFIG), 0x14);
+ err_codec:
+ ac97_release_codec(s->codec);
return -1;
}
@@ -2182,9 +2208,10 @@
synchronize_irq();
free_au1000_dma(s->dma_adc.dmanr);
free_au1000_dma(s->dma_dac.dmanr);
- release_region(virt_to_phys((void *) AC97C_CONFIG), 0x14);
+ release_region(PHYSADDR(AC97C_CONFIG), 0x14);
unregister_sound_dsp(s->dev_audio);
- unregister_sound_mixer(s->codec.dev_mixer);
+ unregister_sound_mixer(s->codec->dev_mixer);
+ ac97_release_codec(s->codec);
}
static int __init init_au1000(void)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)