void snd_init() { unsigned int codec_id; unsigned int mask; snd_cr_request = 0; snd_cr_reply = 0; CSR_AC97_DCTL = 0; CSR_AC97_UCTL = 0; mask = irq_getmask(); mask |= IRQ_AC97CRREQUEST|IRQ_AC97CRREPLY|IRQ_AC97DMAR|IRQ_AC97DMAW; irq_setmask(mask); codec_id = snd_ac97_read(0x00); if(codec_id == 0x0d50) printf("SND: found LM4550 AC'97 codec\n"); else printf("SND: warning, unknown codec found (ID:%04x)\n", codec_id); /* Unmute and set volumes */ /* TODO: API for this */ snd_ac97_write(0x02, 0x0000); snd_ac97_write(0x04, 0x0f0f); snd_ac97_write(0x18, 0x0000); snd_ac97_write(0x0e, 0x0000); snd_ac97_write(0x1c, 0x0f0f); snd_play_empty(); snd_record_empty(); printf("SND: initialization complete\n"); }
void snd_init() { unsigned int codec_id; unsigned int mask; if(!(CSR_CAPABILITIES & CAP_AC97)) { printf("SND: not supported by SoC, giving up.\n"); return; } snd_cr_request = 0; snd_cr_reply = 0; /* Reset AC'97 controller */ CSR_AC97_CRCTL = 0; CSR_AC97_DCTL = 0; CSR_AC97_UCTL = 0; irq_ack(IRQ_AC97CRREQUEST|IRQ_AC97CRREPLY|IRQ_AC97DMAR|IRQ_AC97DMAW); mask = irq_getmask(); mask |= IRQ_AC97CRREQUEST|IRQ_AC97CRREPLY|IRQ_AC97DMAR|IRQ_AC97DMAW; irq_setmask(mask); codec_id = snd_ac97_read(0x00); if(codec_id == 0x0d50) printf("SND: found LM4550 AC'97 codec\n"); else if(codec_id == 0x6150) printf("SND: found WM9707 AC'97 codec\n"); else printf("SND: warning, unknown codec found (ID:%04x)\n", codec_id); /* Unmute and set volumes */ /* TODO: API for this */ snd_ac97_write(0x02, 0x0000); /* master volume */ snd_ac97_write(0x04, 0x0f0f); /* headphones volume */ snd_ac97_write(0x18, 0x0000); /* PCM out volume */ snd_ac97_write(0x1c, 0x0f0f); /* record gain */ snd_ac97_write(0x0e, 0x0000); /* mic volume: max */ snd_ac97_write(0x10, 0x0000); /* line in volume: max */ snd_ac97_write(0x1a, 0x0505); /* record select: stero mix */ snd_play_empty(); snd_record_empty(); printf("SND: initialization complete\n"); }