MODULE_AUTHOR("Bart Hartgers <bart@etpmod.phys.tue.nl>");
MODULE_DESCRIPTION("Avance Logic ALS4000");
MODULE_LICENSE("GPL");
-MODULE_CLASSES("{sound}");
-MODULE_DEVICES("{{Avance Logic,ALS4000}}");
+MODULE_SUPPORTED_DEVICE("{{Avance Logic,ALS4000}}");
#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
#define SUPPORT_JOYSTICK 1
#ifdef SUPPORT_JOYSTICK
static int joystick_port[SNDRV_CARDS];
#endif
-static int boot_devs;
-module_param_array(index, int, boot_devs, 0444);
+module_param_array(index, int, NULL, 0444);
MODULE_PARM_DESC(index, "Index value for ALS4000 soundcard.");
-MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-module_param_array(id, charp, boot_devs, 0444);
+module_param_array(id, charp, NULL, 0444);
MODULE_PARM_DESC(id, "ID string for ALS4000 soundcard.");
-MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-module_param_array(enable, bool, boot_devs, 0444);
+module_param_array(enable, bool, NULL, 0444);
MODULE_PARM_DESC(enable, "Enable ALS4000 soundcard.");
-MODULE_PARM_SYNTAX(enable, SNDRV_INDEX_DESC);
#ifdef SUPPORT_JOYSTICK
-module_param_array(joystick_port, int, boot_devs, 0444);
+module_param_array(joystick_port, int, NULL, 0444);
MODULE_PARM_DESC(joystick_port, "Joystick port address for ALS4000 soundcard. (0 = disabled)");
-MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED);
#endif
-#define chip_t sb_t
-
typedef struct {
+ struct pci_dev *pci;
unsigned long gcr;
- struct resource *res_gcr;
#ifdef SUPPORT_JOYSTICK
struct gameport gameport;
struct resource *res_joystick;
static int snd_als4000_capture_trigger(snd_pcm_substream_t * substream, int cmd)
{
- unsigned long flags;
sb_t *chip = snd_pcm_substream_chip(substream);
int result = 0;
- spin_lock_irqsave(&chip->mixer_lock, flags);
+ spin_lock(&chip->mixer_lock);
if (cmd == SNDRV_PCM_TRIGGER_START) {
chip->mode |= SB_RATE_LOCK_CAPTURE;
snd_sbmixer_write(chip, 0xde, capture_cmd(chip));
} else {
result = -EINVAL;
}
- spin_unlock_irqrestore(&chip->mixer_lock, flags);
+ spin_unlock(&chip->mixer_lock);
return result;
}
static int snd_als4000_playback_trigger(snd_pcm_substream_t * substream, int cmd)
{
- unsigned long flags;
sb_t *chip = snd_pcm_substream_chip(substream);
int result = 0;
- spin_lock_irqsave(&chip->reg_lock, flags);
+ spin_lock(&chip->reg_lock);
if (cmd == SNDRV_PCM_TRIGGER_START) {
chip->mode |= SB_RATE_LOCK_PLAYBACK;
snd_sbdsp_command(chip, playback_cmd(chip).dma_on);
} else {
result = -EINVAL;
}
- spin_unlock_irqrestore(&chip->reg_lock, flags);
+ spin_unlock(&chip->reg_lock);
return result;
}
static snd_pcm_uframes_t snd_als4000_capture_pointer(snd_pcm_substream_t * substream)
{
- unsigned long flags;
sb_t *chip = snd_pcm_substream_chip(substream);
unsigned int result;
- spin_lock_irqsave(&chip->reg_lock, flags);
+ spin_lock(&chip->reg_lock);
result = snd_als4000_gcr_read(chip, 0xa4) & 0xffff;
- spin_unlock_irqrestore(&chip->reg_lock, flags);
+ spin_unlock(&chip->reg_lock);
return bytes_to_frames( substream->runtime, result );
}
static snd_pcm_uframes_t snd_als4000_playback_pointer(snd_pcm_substream_t * substream)
{
- unsigned long flags;
sb_t *chip = snd_pcm_substream_chip(substream);
unsigned result;
- spin_lock_irqsave(&chip->reg_lock, flags);
+ spin_lock(&chip->reg_lock);
result = snd_als4000_gcr_read(chip, 0xa0) & 0xffff;
- spin_unlock_irqrestore(&chip->reg_lock, flags);
+ spin_unlock(&chip->reg_lock);
return bytes_to_frames( substream->runtime, result );
}
static irqreturn_t snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
- sb_t *chip = snd_magic_cast(sb_t, dev_id, return IRQ_NONE);
- unsigned long flags;
+ sb_t *chip = dev_id;
unsigned gcr_status;
unsigned sb_status;
/* release the gcr */
outb(gcr_status, chip->alt_port + 0xe);
- spin_lock_irqsave(&chip->mixer_lock, flags);
+ spin_lock(&chip->mixer_lock);
sb_status = snd_sbmixer_read(chip, SB_DSP4_IRQSTATUS);
- spin_unlock_irqrestore(&chip->mixer_lock, flags);
+ spin_unlock(&chip->mixer_lock);
if (sb_status & SB_IRQTYPE_8BIT)
snd_sb_ack_8bit(chip);
static void snd_als4000_pcm_free(snd_pcm_t *pcm)
{
- sb_t *chip = snd_magic_cast(sb_t, pcm->private_data, return);
+ sb_t *chip = pcm->private_data;
chip->pcm = NULL;
snd_pcm_lib_preallocate_free_for_all(pcm);
}
static void __devinit snd_als4000_configure(sb_t *chip)
{
- unsigned long flags;
unsigned tmp;
int i;
/* do some more configuration */
- spin_lock_irqsave(&chip->mixer_lock, flags);
+ spin_lock_irq(&chip->mixer_lock);
tmp = snd_sbmixer_read(chip, 0xc0);
snd_sbmixer_write(chip, 0xc0, tmp|0x80);
/* always select DMA channel 0, since we do not actually use DMA */
snd_sbmixer_write(chip, SB_DSP4_DMASETUP, SB_DMASETUP_DMA0);
snd_sbmixer_write(chip, 0xc0, tmp&0x7f);
- spin_unlock_irqrestore(&chip->mixer_lock, flags);
+ spin_unlock_irq(&chip->mixer_lock);
- spin_lock_irqsave(&chip->reg_lock,flags);
+ spin_lock_irq(&chip->reg_lock);
/* magic number. Enables interrupts(?) */
snd_als4000_gcr_write(chip, 0x8c, 0x28000);
for(i = 0x91; i <= 0x96; ++i)
snd_als4000_gcr_write(chip, i, 0);
snd_als4000_gcr_write(chip, 0x99, snd_als4000_gcr_read(chip, 0x99));
- spin_unlock_irqrestore(&chip->reg_lock,flags);
+ spin_unlock_irq(&chip->reg_lock);
}
static void snd_card_als4000_free( snd_card_t *card )
kfree_nocheck(acard->res_joystick);
}
#endif
- release_resource(acard->res_gcr);
- kfree_nocheck(acard->res_gcr);
+ pci_release_regions(acard->pci);
+ pci_disable_device(acard->pci);
}
static int __devinit snd_card_als4000_probe(struct pci_dev *pci,
snd_card_t *card;
snd_card_als4000_t *acard;
unsigned long gcr;
- struct resource *res_gcr_port;
sb_t *chip;
opl3_t *opl3;
unsigned short word;
if (pci_set_dma_mask(pci, 0x00ffffff) < 0 ||
pci_set_consistent_dma_mask(pci, 0x00ffffff) < 0) {
snd_printk("architecture does not support 24bit PCI busmaster DMA\n");
+ pci_disable_device(pci);
return -ENXIO;
}
- gcr = pci_resource_start(pci, 0);
- if ((res_gcr_port = request_region(gcr, 0x40, "ALS4000")) == NULL) {
- snd_printk("unable to grab region 0x%lx-0x%lx\n", gcr, gcr + 0x40 - 1);
- return -EBUSY;
+ if ((err = pci_request_regions(pci, "ALS4000")) < 0) {
+ pci_disable_device(pci);
+ return err;
}
+ gcr = pci_resource_start(pci, 0);
pci_read_config_word(pci, PCI_COMMAND, &word);
pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO);
card = snd_card_new(index[dev], id[dev], THIS_MODULE,
sizeof( snd_card_als4000_t ) );
if (card == NULL) {
- release_resource(res_gcr_port);
- kfree_nocheck(res_gcr_port);
+ pci_release_regions(pci);
+ pci_disable_device(pci);
return -ENOMEM;
}
acard = (snd_card_als4000_t *)card->private_data;
+ acard->pci = pci;
acard->gcr = gcr;
- acard->res_gcr = res_gcr_port;
card->private_free = snd_card_als4000_free;
/* disable all legacy ISA stuff except for joystick */