extractedLnx/linux-2.6.9/sound/oss/wavfront.c_wffx_init.c
static int __init wffx_init (void)
{
int i;
int j;
/* Set all bits for all channels on the MOD unit to zero */
/* XXX But why do this twice ? */
for (j = 0; j < 2; j++) {
for (i = 0x10; i <= 0xff; i++) {
if (!wffx_idle ()) {
return (-1);
}
outb (i, dev.fx_mod_addr);
outb (0x0, dev.fx_mod_data);
}
}
if (!wffx_idle()) return (-1);
outb (0x02, dev.fx_op); /* mute on */
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x44, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x42, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x43, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x7c, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x7e, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x46, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x49, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x47, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x4a, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
/* either because of stupidity by TB's programmers, or because it
actually does something, rezero the MOD page.
*/
for (i = 0x10; i <= 0xff; i++) {
if (!wffx_idle ()) {
return (-1);
}
outb (i, dev.fx_mod_addr);
outb (0x0, dev.fx_mod_data);
}
/* load page zero */
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x00, dev.fx_dsp_page);
outb (0x00, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_zero); i += 2) {
outb (page_zero[i], dev.fx_dsp_msb);
outb (page_zero[i+1], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
/* Now load page one */
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x01, dev.fx_dsp_page);
outb (0x00, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_one); i += 2) {
outb (page_one[i], dev.fx_dsp_msb);
outb (page_one[i+1], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x02, dev.fx_dsp_page);
outb (0x00, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_two); i++) {
outb (page_two[i], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x03, dev.fx_dsp_page);
outb (0x00, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_three); i++) {
outb (page_three[i], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x04, dev.fx_dsp_page);
outb (0x00, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_four); i++) {
outb (page_four[i], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
/* Load memory area (page six) */
outb (FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x06, dev.fx_dsp_page);
for (i = 0; i < sizeof (page_six); i += 3) {
outb (page_six[i], dev.fx_dsp_addr);
outb (page_six[i+1], dev.fx_dsp_msb);
outb (page_six[i+2], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x07, dev.fx_dsp_page);
outb (0x00, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_seven); i += 2) {
outb (page_seven[i], dev.fx_dsp_msb);
outb (page_seven[i+1], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
/* Now setup the MOD area. We do this algorithmically in order to
save a little data space. It could be done in the same fashion
as the "pages".
*/
for (i = 0x00; i <= 0x0f; i++) {
outb (0x01, dev.fx_mod_addr);
outb (i, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0x02, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0xb0; i <= 0xbf; i++) {
outb (i, dev.fx_mod_addr);
outb (0x20, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0xf0; i <= 0xff; i++) {
outb (i, dev.fx_mod_addr);
outb (0x20, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0x10; i <= 0x1d; i++) {
outb (i, dev.fx_mod_addr);
outb (0xff, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0x1e, dev.fx_mod_addr);
outb (0x40, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
for (i = 0x1f; i <= 0x2d; i++) {
outb (i, dev.fx_mod_addr);
outb (0xff, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0x2e, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
for (i = 0x2f; i <= 0x3e; i++) {
outb (i, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0x3f, dev.fx_mod_addr);
outb (0x20, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
for (i = 0x40; i <= 0x4d; i++) {
outb (i, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0x4e, dev.fx_mod_addr);
outb (0x0e, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0x4f, dev.fx_mod_addr);
outb (0x0e, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
for (i = 0x50; i <= 0x6b; i++) {
outb (i, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0x6c, dev.fx_mod_addr);
outb (0x40, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0x6d, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0x6e, dev.fx_mod_addr);
outb (0x40, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0x6f, dev.fx_mod_addr);
outb (0x40, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
for (i = 0x70; i <= 0x7f; i++) {
outb (i, dev.fx_mod_addr);
outb (0xc0, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0x80; i <= 0xaf; i++) {
outb (i, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0xc0; i <= 0xdd; i++) {
outb (i, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0xde, dev.fx_mod_addr);
outb (0x10, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0xdf, dev.fx_mod_addr);
outb (0x10, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
for (i = 0xe0; i <= 0xef; i++) {
outb (i, dev.fx_mod_addr);
outb (0x00, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0x00; i <= 0x0f; i++) {
outb (0x01, dev.fx_mod_addr);
outb (i, dev.fx_mod_data);
outb (0x02, dev.fx_mod_addr);
outb (0x01, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
outb (0x02, dev.fx_op); /* mute on */
/* Now set the coefficients and so forth for the programs above */
for (i = 0; i < sizeof (coefficients); i += 4) {
outb (coefficients[i], dev.fx_dsp_page);
outb (coefficients[i+1], dev.fx_dsp_addr);
outb (coefficients[i+2], dev.fx_dsp_msb);
outb (coefficients[i+3], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
/* Some settings (?) that are too small to bundle into loops */
if (!wffx_idle()) return (-1);
outb (0x1e, dev.fx_mod_addr);
outb (0x14, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0xde, dev.fx_mod_addr);
outb (0x20, dev.fx_mod_data);
if (!wffx_idle()) return (-1);
outb (0xdf, dev.fx_mod_addr);
outb (0x20, dev.fx_mod_data);
/* some more coefficients */
if (!wffx_idle()) return (-1);
outb (0x06, dev.fx_dsp_page);
outb (0x78, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x40, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x03, dev.fx_dsp_addr);
outb (0x0f, dev.fx_dsp_msb);
outb (0xff, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x0b, dev.fx_dsp_addr);
outb (0x0f, dev.fx_dsp_msb);
outb (0xff, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x02, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x0a, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x46, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
outb (0x07, dev.fx_dsp_page);
outb (0x49, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
/* Now, for some strange reason, lets reload every page
and all the coefficients over again. I have *NO* idea
why this is done. I do know that no sound is produced
is this phase is omitted.
*/
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x00, dev.fx_dsp_page);
outb (0x10, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_zero_v2); i += 2) {
outb (page_zero_v2[i], dev.fx_dsp_msb);
outb (page_zero_v2[i+1], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x01, dev.fx_dsp_page);
outb (0x10, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_one_v2); i += 2) {
outb (page_one_v2[i], dev.fx_dsp_msb);
outb (page_one_v2[i+1], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
if (!wffx_idle()) return (-1);
if (!wffx_idle()) return (-1);
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x02, dev.fx_dsp_page);
outb (0x10, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_two_v2); i++) {
outb (page_two_v2[i], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x03, dev.fx_dsp_page);
outb (0x10, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_three_v2); i++) {
outb (page_three_v2[i], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x04, dev.fx_dsp_page);
outb (0x10, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_four_v2); i++) {
outb (page_four_v2[i], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x06, dev.fx_dsp_page);
/* Page six v.2 is algorithmic */
for (i = 0x10; i <= 0x3e; i += 2) {
outb (i, dev.fx_dsp_addr);
outb (0x00, dev.fx_dsp_msb);
outb (0x00, dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
outb (0x07, dev.fx_dsp_page);
outb (0x10, dev.fx_dsp_addr);
for (i = 0; i < sizeof (page_seven_v2); i += 2) {
outb (page_seven_v2[i], dev.fx_dsp_msb);
outb (page_seven_v2[i+1], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
for (i = 0x00; i < sizeof(mod_v2); i += 2) {
outb (mod_v2[i], dev.fx_mod_addr);
outb (mod_v2[i+1], dev.fx_mod_data);
if (!wffx_idle()) return (-1);
}
for (i = 0; i < sizeof (coefficients2); i += 4) {
outb (coefficients2[i], dev.fx_dsp_page);
outb (coefficients2[i+1], dev.fx_dsp_addr);
outb (coefficients2[i+2], dev.fx_dsp_msb);
outb (coefficients2[i+3], dev.fx_dsp_lsb);
if (!wffx_idle()) return (-1);
}
for (i = 0; i < sizeof (coefficients3); i += 2) {
int x;
outb (0x07, dev.fx_dsp_page);
x = (i % 4) ? 0x4e : 0x4c;
outb (x, dev.fx_dsp_addr);
outb (coefficients3[i], dev.fx_dsp_msb);
outb (coefficients3[i+1], dev.fx_dsp_lsb);
}
outb (0x00, dev.fx_op); /* mute off */
if (!wffx_idle()) return (-1);
return (0);
}
Generated by GNU enscript 1.6.4.