diff options
Diffstat (limited to 'sound/pci/cs5530.c')
| -rw-r--r-- | sound/pci/cs5530.c | 86 | 
1 files changed, 13 insertions, 73 deletions
diff --git a/sound/pci/cs5530.c b/sound/pci/cs5530.c index 20b4faea50a6..93ff029e6583 100644 --- a/sound/pci/cs5530.c +++ b/sound/pci/cs5530.c @@ -65,25 +65,6 @@ static const struct pci_device_id snd_cs5530_ids[] = {  MODULE_DEVICE_TABLE(pci, snd_cs5530_ids); -static int snd_cs5530_free(struct snd_cs5530 *chip) -{ -	pci_release_regions(chip->pci); -	pci_disable_device(chip->pci); -	kfree(chip); -	return 0; -} - -static int snd_cs5530_dev_free(struct snd_device *device) -{ -	struct snd_cs5530 *chip = device->device_data; -	return snd_cs5530_free(chip); -} - -static void snd_cs5530_remove(struct pci_dev *pci) -{ -	snd_card_free(pci_get_drvdata(pci)); -} -  static u8 snd_cs5530_mixer_read(unsigned long io, u8 reg)  {  	outb(reg, io + 4); @@ -94,50 +75,28 @@ static u8 snd_cs5530_mixer_read(unsigned long io, u8 reg)  }  static int snd_cs5530_create(struct snd_card *card, -			     struct pci_dev *pci, -			     struct snd_cs5530 **rchip) +			     struct pci_dev *pci)  { -	struct snd_cs5530 *chip; +	struct snd_cs5530 *chip = card->private_data;  	unsigned long sb_base;  	u8 irq, dma8, dma16 = 0;  	u16 map;  	void __iomem *mem;  	int err; -	static const struct snd_device_ops ops = { -		.dev_free = snd_cs5530_dev_free, -	}; -	*rchip = NULL; - -	err = pci_enable_device(pci); +	err = pcim_enable_device(pci);   	if (err < 0)  		return err; -	chip = kzalloc(sizeof(*chip), GFP_KERNEL); -	if (chip == NULL) { -		pci_disable_device(pci); -		return -ENOMEM; -	} -  	chip->card = card;  	chip->pci = pci; -	err = pci_request_regions(pci, "CS5530"); -	if (err < 0) { -		kfree(chip);  -		pci_disable_device(pci); +	err = pcim_iomap_regions(pci, 1 << 0, "CS5530"); +	if (err < 0)  		return err; -	}  	chip->pci_base = pci_resource_start(pci, 0); - -	mem = pci_ioremap_bar(pci, 0); -	if (mem == NULL) { -		snd_cs5530_free(chip); -		return -EBUSY; -	} - +	mem = pcim_iomap_table(pci)[0];  	map = readw(mem + 0x18); -	iounmap(mem);  	/* Map bits  		0:1	* 0x20 + 0x200 = sb base @@ -154,7 +113,6 @@ static int snd_cs5530_create(struct snd_card *card,  		dev_info(card->dev, "XpressAudio at 0x%lx\n", sb_base);  	else {  		dev_err(card->dev, "Could not find XpressAudio!\n"); -		snd_cs5530_free(chip);  		return -ENODEV;  	} @@ -174,7 +132,6 @@ static int snd_cs5530_create(struct snd_card *card,  		dma16 = 7;  	else {  		dev_err(card->dev, "No 16bit DMA enabled\n"); -		snd_cs5530_free(chip);  		return -ENODEV;  	} @@ -186,7 +143,6 @@ static int snd_cs5530_create(struct snd_card *card,  		dma8 = 3;  	else {  		dev_err(card->dev, "No 8bit DMA enabled\n"); -		snd_cs5530_free(chip);  		return -ENODEV;  	} @@ -200,7 +156,6 @@ static int snd_cs5530_create(struct snd_card *card,  		irq = 10;  	else {  		dev_err(card->dev, "SoundBlaster IRQ not set\n"); -		snd_cs5530_free(chip);  		return -ENODEV;  	} @@ -210,31 +165,21 @@ static int snd_cs5530_create(struct snd_card *card,  						dma16, SB_HW_CS5530, &chip->sb);  	if (err < 0) {  		dev_err(card->dev, "Could not create SoundBlaster\n"); -		snd_cs5530_free(chip);  		return err;  	}  	err = snd_sb16dsp_pcm(chip->sb, 0);  	if (err < 0) {  		dev_err(card->dev, "Could not create PCM\n"); -		snd_cs5530_free(chip);  		return err;  	}  	err = snd_sbmixer_new(chip->sb);  	if (err < 0) {  		dev_err(card->dev, "Could not create Mixer\n"); -		snd_cs5530_free(chip); -		return err; -	} - -	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); -	if (err < 0) { -		snd_cs5530_free(chip);  		return err;  	} -	*rchip = chip;  	return 0;  } @@ -243,7 +188,7 @@ static int snd_cs5530_probe(struct pci_dev *pci,  {  	static int dev;  	struct snd_card *card; -	struct snd_cs5530 *chip = NULL; +	struct snd_cs5530 *chip;  	int err;  	if (dev >= SNDRV_CARDS) @@ -253,27 +198,23 @@ static int snd_cs5530_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, -			   0, &card); - +	err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, +				sizeof(*chip), &card);  	if (err < 0)  		return err; +	chip = card->private_data; -	err = snd_cs5530_create(card, pci, &chip); -	if (err < 0) { -		snd_card_free(card); +	err = snd_cs5530_create(card, pci); +	if (err < 0)  		return err; -	}  	strcpy(card->driver, "CS5530");  	strcpy(card->shortname, "CS5530 Audio");  	sprintf(card->longname, "%s at 0x%lx", card->shortname, chip->pci_base);  	err = snd_card_register(card); -	if (err < 0) { -		snd_card_free(card); +	if (err < 0)  		return err; -	}  	pci_set_drvdata(pci, card);  	dev++;  	return 0; @@ -283,7 +224,6 @@ static struct pci_driver cs5530_driver = {  	.name = KBUILD_MODNAME,  	.id_table = snd_cs5530_ids,  	.probe = snd_cs5530_probe, -	.remove = snd_cs5530_remove,  };  module_pci_driver(cs5530_driver);  |