static void attach_mpu (als300_devc * devc) { struct address_info hw_config; hw_config.io_base = devc->mpu_base; hw_config.irq = -devc->irq; hw_config.dma = -1; hw_config.dma2 = -1; hw_config.always_detect = 0; hw_config.name = "ALS300 MPU"; hw_config.driver_use_1 = 0; hw_config.driver_use_2 = 0; hw_config.osdev = devc->osdev; #ifdef CREATE_OSP CREATE_OSP (hw_config.osdev); #endif hw_config.card_subtype = 0; if (!probe_uart401 (&hw_config)) { cmn_err (CE_WARN, "MPU-401 was not detected\n"); return; } devc->mpu_attached = 1; attach_uart401 (&hw_config); }
static int __init init_uart401(void) { cfg_mpu.irq = irq; cfg_mpu.io_base = io; /* Can be loaded either for module use or to provide functions to others */ if (cfg_mpu.io_base != -1 && cfg_mpu.irq != -1) { printk(KERN_INFO "MPU-401 UART driver Copyright (C) Hannu Savolainen 1993-1997"); if (!probe_uart401(&cfg_mpu, THIS_MODULE)) return -ENODEV; } return 0; }
static int __init probe_trix_mpu(struct address_info *hw_config) { unsigned char conf; static int irq_bits[] = { -1, -1, -1, 1, 2, 3, -1, 4, -1, 5 }; if (hw_config->irq > 9) { printk(KERN_ERR "AudioTrix: Bad MPU IRQ %d\n", hw_config->irq); return 0; } if (irq_bits[hw_config->irq] == -1) { printk(KERN_ERR "AudioTrix: Bad MPU IRQ %d\n", hw_config->irq); return 0; } switch (hw_config->io_base) { case 0x330: conf = 0x00; break; case 0x370: conf = 0x04; break; case 0x3b0: conf = 0x08; break; case 0x3f0: conf = 0x0c; break; default: return 0; /* Invalid port */ } conf |= irq_bits[hw_config->irq] << 4; trix_write(0x19, (trix_read(0x19) & 0x83) | conf); hw_config->name = "AudioTrix Pro"; return probe_uart401(hw_config, THIS_MODULE); }
int probe_mad16_mpu(struct address_info *hw_config) { #if defined(CONFIG_UART401) && defined(CONFIG_MIDI) static int mpu_attached = 0; static int valid_ports[] = { 0x330, 0x320, 0x310, 0x300 }; static short valid_irqs[] = {9, 10, 5, 7}; unsigned char tmp; int i; /* A variable with secret power */ if (!already_initialized) /* The MSS port must be initialized first */ return 0; if (mpu_attached) /* Don't let them call this twice */ return 0; mpu_attached = 1; if (board_type < C929) /* Early chip. No MPU support. Just SB MIDI */ { #if defined(CONFIG_MIDI) && defined(CONFIG_MAD16_OLDCARD) unsigned char tmp; tmp = mad_read(MC3_PORT); /* * MAD16 SB base is defined by the WSS base. It cannot be changed * alone. * Ignore configured I/O base. Use the active setting. */ if (mad_read(MC1_PORT) & 0x20) hw_config->io_base = 0x240; else hw_config->io_base = 0x220; switch (hw_config->irq) { case 5: tmp = (tmp & 0x3f) | 0x80; break; case 7: tmp = (tmp & 0x3f); break; case 11: tmp = (tmp & 0x3f) | 0x40; break; default: printk(KERN_ERR "mad16/Mozart: Invalid MIDI IRQ\n"); return 0; } mad_write(MC3_PORT, tmp | 0x04); hw_config->driver_use_1 = SB_MIDI_ONLY; return sb_dsp_detect(hw_config); #else return 0; #endif } tmp = mad_read(MC6_PORT) & 0x83; tmp |= 0x80; /* MPU-401 enable */ /* * Set the MPU base bits */ for (i = 0; i < 5; i++) { if (i > 3) /* Out of array bounds */ { printk(KERN_ERR "MAD16 / Mozart: Invalid MIDI port 0x%x\n", hw_config->io_base); return 0; } if (valid_ports[i] == hw_config->io_base) { tmp |= i << 5; break; } } /* * Set the MPU IRQ bits */ for (i = 0; i < 5; i++) { if (i > 3) /* Out of array bounds */ { printk(KERN_ERR "MAD16 / Mozart: Invalid MIDI IRQ %d\n", hw_config->irq); return 0; } if (valid_irqs[i] == hw_config->irq) { tmp |= i << 3; break; } } mad_write(MC6_PORT, tmp); /* Write MPU401 config */ return probe_uart401(hw_config); #else return 0; #endif }
static int __init probe_mad16_mpu(struct address_info *hw_config) { static int mpu_attached = 0; unsigned char tmp; if (!already_initialized) /* The MSS port must be initialized first */ return 0; if (mpu_attached) /* Don't let them call this twice */ return 0; mpu_attached = 1; if (board_type < C929) /* Early chip. No MPU support. Just SB MIDI */ { #ifdef CONFIG_MAD16_OLDCARD tmp = mad_read(MC3_PORT); /* * MAD16 SB base is defined by the WSS base. It cannot be changed * alone. * Ignore configured I/O base. Use the active setting. */ if (mad_read(MC1_PORT) & 0x20) hw_config->io_base = 0x240; else hw_config->io_base = 0x220; switch (hw_config->irq) { case 5: tmp = (tmp & 0x3f) | 0x80; break; case 7: tmp = (tmp & 0x3f); break; case 11: tmp = (tmp & 0x3f) | 0x40; break; default: printk(KERN_ERR "mad16/Mozart: Invalid MIDI IRQ\n"); return 0; } mad_write(MC3_PORT, tmp | 0x04); hw_config->driver_use_1 = SB_MIDI_ONLY; if (!sb_dsp_detect(hw_config, 0, 0, NULL)) return 0; if (mad_read(MC1_PORT) & 0x20) hw_config->io_base = 0x240; else hw_config->io_base = 0x220; hw_config->name = "Mad16/Mozart"; sb_dsp_init(hw_config, THIS_MODULE); return 1; #else /* assuming all later Mozart cards are identified as * either 82C928 or Mozart. If so, following code attempts * to set MPU register. TODO - add probing */ tmp = mad_read(MC8_PORT); switch (hw_config->irq) { case 5: tmp |= 0x08; break; case 7: tmp |= 0x10; break; case 9: tmp |= 0x18; break; case 10: tmp |= 0x20; break; case 11: tmp |= 0x28; break; default: printk(KERN_ERR "mad16/MOZART: invalid mpu_irq\n"); return 0; } switch (hw_config->io_base) { case 0x300: tmp |= 0x01; break; case 0x310: tmp |= 0x03; break; case 0x320: tmp |= 0x05; break; case 0x330: tmp |= 0x07; break; default: printk(KERN_ERR "mad16/MOZART: invalid mpu_io\n"); return 0; } mad_write(MC8_PORT, tmp); /* write MPU port parameters */ goto probe_401; #endif } tmp = mad_read(MC6_PORT) & 0x83; tmp |= 0x80; /* MPU-401 enable */ /* Set the MPU base bits */ switch (hw_config->io_base) { case 0x300: tmp |= 0x60; break; case 0x310: tmp |= 0x40; break; case 0x320: tmp |= 0x20; break; case 0x330: tmp |= 0x00; break; default: printk(KERN_ERR "MAD16: Invalid MIDI port 0x%x\n", hw_config->io_base); return 0; } /* Set the MPU IRQ bits */ switch (hw_config->irq) { case 5: tmp |= 0x10; break; case 7: tmp |= 0x18; break; case 9: tmp |= 0x00; break; case 10: tmp |= 0x08; break; default: printk(KERN_ERR "MAD16: Invalid MIDI IRQ %d\n", hw_config->irq); break; } mad_write(MC6_PORT, tmp); /* Write MPU401 config */ #ifndef CONFIG_MAD16_OLDCARD probe_401: #endif hw_config->driver_use_1 = SB_MIDI_ONLY; hw_config->name = "Mad16/Mozart"; return probe_uart401(hw_config, THIS_MODULE); }