X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fpci%2Fals4000.c;h=d9ae7e5fe92b62eaad9fb9c499b5ef1976c4ee90;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=73b1d3a081c1033db42337398f11c360a9919135;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 73b1d3a08..d9ae7e5fe 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -76,8 +76,7 @@ MODULE_AUTHOR("Bart Hartgers "); 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 @@ -93,24 +92,18 @@ static int boot_devs; module_param_array(index, int, boot_devs, 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_PARM_DESC(id, "ID string for ALS4000 soundcard."); -MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC); module_param_array(enable, bool, boot_devs, 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_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; @@ -304,11 +297,10 @@ static int snd_als4000_playback_prepare(snd_pcm_substream_t *substream) 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)); @@ -318,17 +310,16 @@ static int snd_als4000_capture_trigger(snd_pcm_substream_t * substream, int cmd) } 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); @@ -338,38 +329,35 @@ static int snd_als4000_playback_trigger(snd_pcm_substream_t * substream, int cmd } 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; @@ -385,9 +373,9 @@ static irqreturn_t snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs * /* 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); @@ -506,7 +494,7 @@ static snd_pcm_ops_t snd_als4000_capture_ops = { 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); } @@ -557,27 +545,26 @@ static void snd_als4000_set_addr(unsigned long gcr, 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 ) @@ -595,8 +582,7 @@ 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); } static int __devinit snd_card_als4000_probe(struct pci_dev *pci, @@ -606,7 +592,6 @@ 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; @@ -631,11 +616,9 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci, return -ENXIO; } + if ((err = pci_request_regions(pci, "ALS4000")) < 0) + return err; 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; - } pci_read_config_word(pci, PCI_COMMAND, &word); pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO); @@ -644,14 +627,13 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci, 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); 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 */