/*
- * sound/mpu401.c
+ * sound/oss/mpu401.c
*
* The low level driver for Roland MPU-401 compatible Midi cards.
*/
devc->m_busy = 0;
}
-int intchk_mpu401(void *dev_id)
+static irqreturn_t mpuintr(int irq, void *dev_id)
{
struct mpu_config *devc;
- int dev = (int) dev_id;
-
- devc = &dev_conf[dev];
- return input_avail(devc);
-}
-
-irqreturn_t mpuintr(int irq, void *dev_id, struct pt_regs *dummy)
-{
- struct mpu_config *devc;
- int dev = (int) dev_id;
+ int dev = (int)(unsigned long) dev_id;
int handled = 0;
devc = &dev_conf[dev];
spin_unlock_irqrestore(&devc->lock,flags);
}
- if (!request_region(hw_config->io_base, 2, "mpu401"))
- {
- ret = -ENOMEM;
- goto out_irq;
- }
-
if (devc->version != 0)
if (mpu_cmd(m, 0xC5, 0) >= 0) /* Set timebase OK */
if (mpu_cmd(m, 0xE0, 120) >= 0) /* Set tempo OK */
devc->capabilities |= MPU_CAP_INTLG; /* Supports intelligent mode */
- mpu401_synth_operations[m] = (struct synth_operations *)kmalloc(sizeof(struct synth_operations), GFP_KERNEL);
+ mpu401_synth_operations[m] = kmalloc(sizeof(struct synth_operations), GFP_KERNEL);
if (mpu401_synth_operations[m] == NULL)
{
printk(KERN_ERR "mpu401: Can't allocate memory\n");
ret = -ENOMEM;
- goto out_resource;
+ goto out_irq;
}
if (!(devc->capabilities & MPU_CAP_INTLG)) /* No intelligent mode */
{
return 0;
-out_resource:
- release_region(hw_config->io_base, 2);
out_irq:
free_irq(devc->irq, (void *)m);
out_mididev:
sound_unload_mididev(m);
out_err:
+ release_region(hw_config->io_base, 2);
return ret;
}
}
-int probe_mpu401(struct address_info *hw_config)
+int probe_mpu401(struct address_info *hw_config, struct resource *ports)
{
int ok = 0;
struct mpu_config tmp_devc;
- if (check_region(hw_config->io_base, 2))
- {
- printk(KERN_ERR "mpu401: I/O port %x already in use\n\n", hw_config->io_base);
- return 0;
- }
tmp_devc.base = hw_config->io_base;
tmp_devc.irq = hw_config->irq;
tmp_devc.initialized = 0;
p=mpu401_synth_operations[n];
sound_unload_mididev(n);
sound_unload_timerdev(hw_config->slots[2]);
- if(p)
- kfree(p);
+ kfree(p);
}
}
EXPORT_SYMBOL(probe_mpu401);
EXPORT_SYMBOL(attach_mpu401);
EXPORT_SYMBOL(unload_mpu401);
-EXPORT_SYMBOL(intchk_mpu401);
-EXPORT_SYMBOL(mpuintr);
static struct address_info cfg;
static int io = -1;
static int irq = -1;
-MODULE_PARM(irq, "i");
-MODULE_PARM(io, "i");
+module_param(irq, int, 0);
+module_param(io, int, 0);
static int __init init_mpu401(void)
{
/* Can be loaded either for module use or to provide functions
to others */
if (io != -1 && irq != -1) {
+ struct resource *ports;
cfg.irq = irq;
cfg.io_base = io;
- if (probe_mpu401(&cfg) == 0)
+ ports = request_region(io, 2, "mpu401");
+ if (!ports)
+ return -EBUSY;
+ if (probe_mpu401(&cfg, ports) == 0) {
+ release_region(io, 2);
return -ENODEV;
+ }
if ((ret = attach_mpu401(&cfg, THIS_MODULE)))
return ret;
}