/*
- * sound/sb_common.c
+ * sound/oss/sb_common.c
*
* Common routines for Sound Blaster compatible cards.
*
* Chris Rankin <rankinc@zipworld.com.au>
*/
-#include <linux/config.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/module.h>
static int jazz16_base; /* Not detected */
static unsigned char jazz16_bits; /* I/O relocation bits */
-static spinlock_t jazz16_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(jazz16_lock);
/*
* Logitech Soundman Wave specific initialization code
#endif
-sb_devc *last_sb; /* Last sb loaded */
+static sb_devc *last_sb; /* Last sb loaded */
int sb_dsp_command(sb_devc * devc, unsigned char val)
{
if (src & 4) /* MPU401 interrupt */
if(devc->midi_irq_cookie)
- uart401intr(devc->irq, devc->midi_irq_cookie, NULL);
+ uart401intr(devc->irq, devc->midi_irq_cookie);
if (!(src & 3))
return; /* Not a DSP interrupt */
sb_intr(devc);
}
-static irqreturn_t sbintr(int irq, void *dev_id, struct pt_regs *dummy)
+static irqreturn_t sbintr(int irq, void *dev_id)
{
sb_devc *devc = dev_id;
*/
DDB(printk("sb_dsp_detect(%x) entered\n", hw_config->io_base));
- if (check_region(hw_config->io_base, 16))
- {
-#ifdef MODULE
- printk(KERN_INFO "sb: I/O region in use.\n");
-#endif
- return 0;
- }
- devc->lock = SPIN_LOCK_UNLOCKED;
+ spin_lock_init(&devc->lock);
devc->type = hw_config->card_subtype;
devc->base = hw_config->io_base;
*/
- detected_devc = (sb_devc *)kmalloc(sizeof(sb_devc), GFP_KERNEL);
+ detected_devc = kmalloc(sizeof(sb_devc), GFP_KERNEL);
if (detected_devc == NULL)
{
printk(KERN_ERR "sb: Can't allocate memory for device information\n");
if (devc->base != hw_config->io_base)
{
DDB(printk("I/O port mismatch\n"));
+ release_region(devc->base, 16);
return 0;
}
/*
* will get shared PCI irq lines we must cope.
*/
- int i=(devc->caps&SB_PCI_IRQ)?SA_SHIRQ:0;
+ int i=(devc->caps&SB_PCI_IRQ)?IRQF_SHARED:0;
if (request_irq(hw_config->irq, sbintr, i, "soundblaster", devc) < 0)
{
printk(KERN_ERR "SB: Can't allocate IRQ%d\n", hw_config->irq);
+ release_region(devc->base, 16);
return 0;
}
devc->irq_ok = 0;
if (!sb16_set_irq_hw(devc, devc->irq)) /* Unsupported IRQ */
{
free_irq(devc->irq, devc);
+ release_region(devc->base, 16);
return 0;
}
if ((devc->type == 0 || devc->type == MDL_ESS) &&
}
}
} /* IRQ setup */
- request_region(hw_config->io_base, 16, "soundblaster");
last_sb = devc;
return 1;
}
-void sb_dsp_disable_midi(int io_base)
-{
-}
-
-void sb_dsp_disable_recording(int io_base)
-{
-}
-
/* if (sbmpu) below we allow mpu401 to manage the midi devs
otherwise we have to unload them. (Andrzej Krzysztofowicz) */
}
else
release_region(hw_config->io_base, 16);
- if(detected_devc)
- kfree(detected_devc);
+
+ kfree(detected_devc);
}
/*
{
unsigned long flags;
- if (devc->model == MDL_ESS) return ess_setmixer (devc, port, value);
+ if (devc->model == MDL_ESS) {
+ ess_setmixer (devc, port, value);
+ return;
+ }
spin_lock_irqsave(&devc->lock, flags);
if (last_devc == NULL)
return 0;
- last_devc = 0;
+ last_devc = NULL;
if (hw_config->io_base <= 0)
{
#if defined(CONFIG_SOUND_MPU401)
if (devc->model == MDL_ESS)
{
- if (check_region(hw_config->io_base, 2))
- {
+ struct resource *ports;
+ ports = request_region(hw_config->io_base, 2, "mpu401");
+ if (!ports) {
printk(KERN_ERR "sbmpu: I/O port conflict (%x)\n", hw_config->io_base);
return 0;
}
- if (!ess_midi_init(devc, hw_config))
+ if (!ess_midi_init(devc, hw_config)) {
+ release_region(hw_config->io_base, 2);
return 0;
+ }
hw_config->name = "ESS1xxx MPU";
devc->midi_irq_cookie = NULL;
- if (!probe_mpu401(hw_config))
+ if (!probe_mpu401(hw_config, ports)) {
+ release_region(hw_config->io_base, 2);
return 0;
+ }
attach_mpu401(hw_config, owner);
if (last_sb->irq == -hw_config->irq)
last_sb->midi_irq_cookie=(void *)hw_config->slots[1];
EXPORT_SYMBOL(sb_dsp_init);
EXPORT_SYMBOL(sb_dsp_detect);
EXPORT_SYMBOL(sb_dsp_unload);
-EXPORT_SYMBOL(sb_dsp_disable_midi);
EXPORT_SYMBOL(sb_be_quiet);
EXPORT_SYMBOL(probe_sbmpu);
EXPORT_SYMBOL(unload_sbmpu);