
From: "Randy.Dunlap" <rddunlap@osdl.org>, Leann Ogasawara <ogasawara@osdl.org>

Patch to insert ioremap() error checking and missing iounmap()'s.  Also
updated error handling to have only one return statement on error. 
Finally, in saa7134_finidev() on line 954 there was a duplicate
saa7134_i2c_unregister().



 25-akpm/drivers/media/video/saa7134/saa7134-core.c |   46 ++++++++++++---------
 1 files changed, 28 insertions(+), 18 deletions(-)

diff -puN drivers/media/video/saa7134/saa7134-core.c~saa7134-core-ioremap-checking drivers/media/video/saa7134/saa7134-core.c
--- 25/drivers/media/video/saa7134/saa7134-core.c~saa7134-core-ioremap-checking	Thu Sep  4 11:26:27 2003
+++ 25-akpm/drivers/media/video/saa7134/saa7134-core.c	Thu Sep  4 11:26:27 2003
@@ -705,8 +705,10 @@ static int __devinit saa7134_initdev(str
 	int err;
 
 	dev = kmalloc(sizeof(*dev),GFP_KERNEL);
-	if (NULL == dev)
-		return -ENOMEM;
+	if (NULL == dev) {
+		err = -ENOMEM;
+		goto fail0;
+	}
 	memset(dev,0,sizeof(*dev));
 
 	/* pci init */
@@ -783,6 +785,11 @@ static int __devinit saa7134_initdev(str
 		goto fail1;
 	}
 	dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000);
+	if (!dev->lmmio) {
+		printk(KERN_ERR "Unable to remap memory.\n");
+		err = -ENOMEM;
+		goto fail2;
+	}
 	dev->bmmio = (__u8*)dev->lmmio;
 
 	/* register i2c bus */
@@ -798,7 +805,7 @@ static int __devinit saa7134_initdev(str
 	if (err < 0) {
 		printk(KERN_ERR "%s: can't get IRQ %d\n",
 		       dev->name,pci_dev->irq);
-		goto fail2;
+		goto fail3;
 	}
 
 	/* load i2c helpers */
@@ -814,7 +821,7 @@ static int __devinit saa7134_initdev(str
 	if (err < 0) {
 		printk(KERN_INFO "%s: can't register video device\n",
 		       dev->name);
-		goto fail3;
+		goto fail4;
 	}
 	printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
 	       dev->name,dev->video_dev.minor & 0x1f);
@@ -826,7 +833,7 @@ static int __devinit saa7134_initdev(str
 		if (err < 0) {
 			printk(KERN_INFO "%s: can't register video device\n",
 			       dev->name);
-			goto fail4;
+			goto fail5;
 		}
 		printk(KERN_INFO "%s: registered device video%d [ts]\n",
 		       dev->name,dev->ts_dev.minor & 0x1f);
@@ -836,7 +843,7 @@ static int __devinit saa7134_initdev(str
 	dev->vbi_dev.priv = dev;
 	err = video_register_device(&dev->vbi_dev,VFL_TYPE_VBI,vbi_nr);
 	if (err < 0)
-		goto fail5;
+		goto fail6;
 	printk(KERN_INFO "%s: registered device vbi%d\n",
 	       dev->name,dev->vbi_dev.minor & 0x1f);
 
@@ -845,7 +852,7 @@ static int __devinit saa7134_initdev(str
 	if (card_has_radio(dev)) {
 		err = video_register_device(&dev->radio_dev,VFL_TYPE_RADIO,radio_nr);
 		if (err < 0)
-			goto fail6;
+			goto fail7;
 		printk(KERN_INFO "%s: registered device radio%d\n",
 		       dev->name,dev->radio_dev.minor & 0x1f);
 	}
@@ -859,7 +866,7 @@ static int __devinit saa7134_initdev(str
 			err = dev->oss.minor_dsp =
 				register_sound_dsp(&saa7134_dsp_fops,dsp_nr);
 			if (err < 0) {
-				goto fail7;
+				goto fail8;
 			}
 			printk(KERN_INFO "%s: registered device dsp%d\n",
 			       dev->name,dev->oss.minor_dsp >> 4);
@@ -867,7 +874,7 @@ static int __devinit saa7134_initdev(str
 			err = dev->oss.minor_mixer =
 				register_sound_mixer(&saa7134_mixer_fops,mixer_nr);
 			if (err < 0)
-				goto fail8;
+				goto fail9;
 			printk(KERN_INFO "%s: registered device mixer%d\n",
 			       dev->name,dev->oss.minor_mixer >> 4);
 		}
@@ -880,7 +887,7 @@ static int __devinit saa7134_initdev(str
 	saa7134_devcount++;
 	return 0;
 
- fail8:
+ fail9:
 	switch (dev->pci->device) {
 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
@@ -889,20 +896,19 @@ static int __devinit saa7134_initdev(str
 			unregister_sound_dsp(dev->oss.minor_dsp);
 		break;
 	}
- fail7:
+ fail8:
 	if (card_has_radio(dev))
 		video_unregister_device(&dev->radio_dev);
- fail6:
+ fail7:
 	video_unregister_device(&dev->vbi_dev);
- fail5:
+ fail6:
  	if (card_has_ts(dev))
   		video_unregister_device(&dev->ts_dev);
- fail4:
+ fail5:
 	video_unregister_device(&dev->video_dev);
- fail3:
-	saa7134_i2c_unregister(dev);
+ fail4:
 	free_irq(pci_dev->irq, dev);
- fail2:
+ fail3:
 	switch (dev->pci->device) {
 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
@@ -915,10 +921,14 @@ static int __devinit saa7134_initdev(str
 	saa7134_vbi_fini(dev);
 	saa7134_video_fini(dev);
 	saa7134_tvaudio_fini(dev);
+	iounmap (dev->lmmio);
+	saa7134_i2c_unregister(dev);
+ fail2:
 	release_mem_region(pci_resource_start(pci_dev,0),
 			   pci_resource_len(pci_dev,0));
  fail1:
 	kfree(dev);
+ fail0:
 	return err;
 }
 
@@ -954,7 +964,7 @@ static void __devexit saa7134_finidev(st
 	saa7134_vbi_fini(dev);
 	saa7134_video_fini(dev);
 	saa7134_tvaudio_fini(dev);
-	saa7134_i2c_unregister(dev);
+	iounmap(dev->lmmio);
 
 	/* release ressources */
 	free_irq(pci_dev->irq, dev);

_
