[alsa-devel] [PATCH] ALSA: aw2: Use common error handling code in three functions

SF Markus Elfring elfring at users.sourceforge.net
Mon Nov 13 09:56:51 CET 2017


From: Markus Elfring <elfring at users.sourceforge.net>
Date: Mon, 13 Nov 2017 09:49:15 +0100

Add jump targets so that a bit of exception handling can be better reused
at the end of these functions.

This issue was detected by using the Coccinelle software.

Signed-off-by: Markus Elfring <elfring at users.sourceforge.net>
---
 sound/pci/aw2/aw2-alsa.c | 85 +++++++++++++++++++++++-------------------------
 1 file changed, 40 insertions(+), 45 deletions(-)

diff --git a/sound/pci/aw2/aw2-alsa.c b/sound/pci/aw2/aw2-alsa.c
index 9a49e4243a9c..25710043c79d 100644
--- a/sound/pci/aw2/aw2-alsa.c
+++ b/sound/pci/aw2/aw2-alsa.c
@@ -261,13 +261,13 @@ static int snd_aw2_create(struct snd_card *card,
 	if ((dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) ||
 	    (dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0)) {
 		dev_err(card->dev, "Impossible to set 32bit mask DMA\n");
-		pci_disable_device(pci);
-		return -ENXIO;
+		err = -ENXIO;
+		goto disable_device;
 	}
 	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 	if (chip == NULL) {
-		pci_disable_device(pci);
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto disable_device;
 	}
 
 	/* initialize the stuff */
@@ -277,11 +277,9 @@ static int snd_aw2_create(struct snd_card *card,
 
 	/* (1) PCI resource allocation */
 	err = pci_request_regions(pci, "Audiowerk2");
-	if (err < 0) {
-		pci_disable_device(pci);
-		kfree(chip);
-		return err;
-	}
+	if (err < 0)
+		goto free_data;
+
 	chip->iobase_phys = pci_resource_start(pci, 0);
 	chip->iobase_virt =
 		ioremap_nocache(chip->iobase_phys,
@@ -289,10 +287,8 @@ static int snd_aw2_create(struct snd_card *card,
 
 	if (chip->iobase_virt == NULL) {
 		dev_err(card->dev, "unable to remap memory region");
-		pci_release_regions(pci);
-		pci_disable_device(pci);
-		kfree(chip);
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto release_regions;
 	}
 
 	/* (2) initialization of the chip hardware */
@@ -301,23 +297,15 @@ static int snd_aw2_create(struct snd_card *card,
 	if (request_irq(pci->irq, snd_aw2_saa7146_interrupt,
 			IRQF_SHARED, KBUILD_MODNAME, chip)) {
 		dev_err(card->dev, "Cannot grab irq %d\n", pci->irq);
-
-		iounmap(chip->iobase_virt);
-		pci_release_regions(chip->pci);
-		pci_disable_device(chip->pci);
-		kfree(chip);
-		return -EBUSY;
+		err = -EBUSY;
+		goto unmap_io;
 	}
 	chip->irq = pci->irq;
 
 	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
 	if (err < 0) {
 		free_irq(chip->irq, (void *)chip);
-		iounmap(chip->iobase_virt);
-		pci_release_regions(chip->pci);
-		pci_disable_device(chip->pci);
-		kfree(chip);
-		return err;
+		goto unmap_io;
 	}
 
 	*rchip = chip;
@@ -325,6 +313,16 @@ static int snd_aw2_create(struct snd_card *card,
 	dev_info(card->dev,
 		 "Audiowerk 2 sound card (saa7146 chipset) detected and managed\n");
 	return 0;
+
+unmap_io:
+	iounmap(chip->iobase_virt);
+release_regions:
+	pci_release_regions(pci);
+free_data:
+	kfree(chip);
+disable_device:
+	pci_disable_device(pci);
+	return err;
 }
 
 /* constructor */
@@ -352,10 +350,8 @@ static int snd_aw2_probe(struct pci_dev *pci,
 
 	/* (3) Create main component */
 	err = snd_aw2_create(card, pci, &chip);
-	if (err < 0) {
-		snd_card_free(card);
-		return err;
-	}
+	if (err < 0)
+		goto free_card;
 
 	/* initialize mutex */
 	mutex_init(&chip->mtx);
@@ -373,16 +369,18 @@ static int snd_aw2_probe(struct pci_dev *pci,
 
 	/* (6) Register card instance */
 	err = snd_card_register(card);
-	if (err < 0) {
-		snd_card_free(card);
-		return err;
-	}
+	if (err < 0)
+		goto free_card;
 
 	/* (7) Set PCI driver data */
 	pci_set_drvdata(pci, card);
 
 	dev++;
 	return 0;
+
+free_card:
+	snd_card_free(card);
+	return err;
 }
 
 /* destructor */
@@ -599,10 +597,8 @@ static int snd_aw2_new_pcm(struct aw2 *chip)
 
 	err = snd_pcm_new(chip->card, "Audiowerk2 analog playback", 0, 1, 0,
 			  &pcm_playback_ana);
-	if (err < 0) {
-		dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
-		return err;
-	}
+	if (err < 0)
+		goto report_failure;
 
 	/* Creation ok */
 	pcm_device = &chip->device_playback[NUM_STREAM_PLAYBACK_ANA];
@@ -636,11 +632,9 @@ static int snd_aw2_new_pcm(struct aw2 *chip)
 
 	err = snd_pcm_new(chip->card, "Audiowerk2 digital playback", 1, 1, 0,
 			  &pcm_playback_num);
+	if (err < 0)
+		goto report_failure;
 
-	if (err < 0) {
-		dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
-		return err;
-	}
 	/* Creation ok */
 	pcm_device = &chip->device_playback[NUM_STREAM_PLAYBACK_DIG];
 
@@ -673,11 +667,8 @@ static int snd_aw2_new_pcm(struct aw2 *chip)
 
 	err = snd_pcm_new(chip->card, "Audiowerk2 capture", 2, 0, 1,
 			  &pcm_capture);
-
-	if (err < 0) {
-		dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
-		return err;
-	}
+	if (err < 0)
+		goto report_failure;
 
 	/* Creation ok */
 	pcm_device = &chip->device_capture[NUM_STREAM_CAPTURE_ANA];
@@ -718,6 +709,10 @@ static int snd_aw2_new_pcm(struct aw2 *chip)
 	}
 
 	return 0;
+
+report_failure:
+	dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
+	return err;
 }
 
 static int snd_aw2_control_switch_capture_info(struct snd_kcontrol *kcontrol,
-- 
2.15.0



More information about the Alsa-devel mailing list