diff options
Diffstat (limited to 'sound/pci/cs5535audio/cs5535audio.c')
| -rw-r--r-- | sound/pci/cs5535audio/cs5535audio.c | 124 | 
1 files changed, 41 insertions, 83 deletions
diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c index 11ce3c4589fa..76566e7baea0 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c @@ -143,7 +143,8 @@ static int snd_cs5535audio_mixer(struct cs5535audio *cs5535au)  		.read = snd_cs5535audio_ac97_codec_read,  	}; -	if ((err = snd_ac97_bus(card, 0, &ops, NULL, &pbus)) < 0) +	err = snd_ac97_bus(card, 0, &ops, NULL, &pbus); +	if (err < 0)  		return err;  	memset(&ac97, 0, sizeof(ac97)); @@ -155,7 +156,8 @@ static int snd_cs5535audio_mixer(struct cs5535audio *cs5535au)  	/* set any OLPC-specific scaps */  	olpc_prequirks(card, &ac97); -	if ((err = snd_ac97_mixer(pbus, &ac97, &cs5535au->ac97)) < 0) { +	err = snd_ac97_mixer(pbus, &ac97, &cs5535au->ac97); +	if (err < 0) {  		dev_err(card->dev, "mixer failed\n");  		return err;  	} @@ -235,51 +237,24 @@ static irqreturn_t snd_cs5535audio_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int snd_cs5535audio_free(struct cs5535audio *cs5535au) +static void snd_cs5535audio_free(struct snd_card *card)  { -	pci_set_power_state(cs5535au->pci, PCI_D3hot); - -	if (cs5535au->irq >= 0) -		free_irq(cs5535au->irq, cs5535au); - -	pci_release_regions(cs5535au->pci); -	pci_disable_device(cs5535au->pci); -	kfree(cs5535au); -	return 0; -} - -static int snd_cs5535audio_dev_free(struct snd_device *device) -{ -	struct cs5535audio *cs5535au = device->device_data; -	return snd_cs5535audio_free(cs5535au); +	olpc_quirks_cleanup();  }  static int snd_cs5535audio_create(struct snd_card *card, -				  struct pci_dev *pci, -				  struct cs5535audio **rcs5535au) +				  struct pci_dev *pci)  { -	struct cs5535audio *cs5535au; - +	struct cs5535audio *cs5535au = card->private_data;  	int err; -	static const struct snd_device_ops ops = { -		.dev_free =	snd_cs5535audio_dev_free, -	}; -	*rcs5535au = NULL; -	if ((err = pci_enable_device(pci)) < 0) +	err = pcim_enable_device(pci); +	if (err < 0)  		return err; -	if (dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0 || -	    dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) { +	if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {  		dev_warn(card->dev, "unable to get 32bit dma\n"); -		err = -ENXIO; -		goto pcifail; -	} - -	cs5535au = kzalloc(sizeof(*cs5535au), GFP_KERNEL); -	if (cs5535au == NULL) { -		err = -ENOMEM; -		goto pcifail; +		return -ENXIO;  	}  	spin_lock_init(&cs5535au->reg_lock); @@ -287,42 +262,27 @@ static int snd_cs5535audio_create(struct snd_card *card,  	cs5535au->pci = pci;  	cs5535au->irq = -1; -	if ((err = pci_request_regions(pci, "CS5535 Audio")) < 0) { -		kfree(cs5535au); -		goto pcifail; -	} +	err = pcim_request_all_regions(pci, "CS5535 Audio"); +	if (err < 0) +		return err;  	cs5535au->port = pci_resource_start(pci, 0); -	if (request_irq(pci->irq, snd_cs5535audio_interrupt, -			IRQF_SHARED, KBUILD_MODNAME, cs5535au)) { +	if (devm_request_irq(&pci->dev, pci->irq, snd_cs5535audio_interrupt, +			     IRQF_SHARED, KBUILD_MODNAME, cs5535au)) {  		dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); -		err = -EBUSY; -		goto sndfail; +		return -EBUSY;  	}  	cs5535au->irq = pci->irq;  	card->sync_irq = cs5535au->irq;  	pci_set_master(pci); -	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, -				  cs5535au, &ops)) < 0) -		goto sndfail; - -	*rcs5535au = cs5535au;  	return 0; - -sndfail: /* leave the device alive, just kill the snd */ -	snd_cs5535audio_free(cs5535au); -	return err; - -pcifail: -	pci_disable_device(pci); -	return err;  } -static int snd_cs5535audio_probe(struct pci_dev *pci, -				 const struct pci_device_id *pci_id) +static int __snd_cs5535audio_probe(struct pci_dev *pci, +				   const struct pci_device_id *pci_id)  {  	static int dev;  	struct snd_card *card; @@ -336,52 +296,51 @@ static int snd_cs5535audio_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(*cs5535au), &card);  	if (err < 0)  		return err; +	cs5535au = card->private_data; +	card->private_free = snd_cs5535audio_free; -	if ((err = snd_cs5535audio_create(card, pci, &cs5535au)) < 0) -		goto probefail_out; - -	card->private_data = cs5535au; +	err = snd_cs5535audio_create(card, pci); +	if (err < 0) +		return err; -	if ((err = snd_cs5535audio_mixer(cs5535au)) < 0) -		goto probefail_out; +	err = snd_cs5535audio_mixer(cs5535au); +	if (err < 0) +		return err; -	if ((err = snd_cs5535audio_pcm(cs5535au)) < 0) -		goto probefail_out; +	err = snd_cs5535audio_pcm(cs5535au); +	if (err < 0) +		return err; -	strcpy(card->driver, DRIVER_NAME); +	strscpy(card->driver, DRIVER_NAME); -	strcpy(card->shortname, "CS5535 Audio"); +	strscpy(card->shortname, "CS5535 Audio");  	sprintf(card->longname, "%s %s at 0x%lx, irq %i",  		card->shortname, card->driver,  		cs5535au->port, cs5535au->irq); -	if ((err = snd_card_register(card)) < 0) -		goto probefail_out; +	err = snd_card_register(card); +	if (err < 0) +		return err;  	pci_set_drvdata(pci, card);  	dev++;  	return 0; - -probefail_out: -	snd_card_free(card); -	return err;  } -static void snd_cs5535audio_remove(struct pci_dev *pci) +static int snd_cs5535audio_probe(struct pci_dev *pci, +				 const struct pci_device_id *pci_id)  { -	olpc_quirks_cleanup(); -	snd_card_free(pci_get_drvdata(pci)); +	return snd_card_free_on_error(&pci->dev, __snd_cs5535audio_probe(pci, pci_id));  }  static struct pci_driver cs5535audio_driver = {  	.name = KBUILD_MODNAME,  	.id_table = snd_cs5535audio_ids,  	.probe = snd_cs5535audio_probe, -	.remove = snd_cs5535audio_remove,  #ifdef CONFIG_PM_SLEEP  	.driver = {  		.pm = &snd_cs5535audio_pm, @@ -394,4 +353,3 @@ module_pci_driver(cs5535audio_driver);  MODULE_AUTHOR("Jaya Kumar");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("CS5535 Audio"); -MODULE_SUPPORTED_DEVICE("CS5535 Audio");  | 
