
From: Michael Hunold <hunold@linuxtv.org>

- [DVB] saa7146_core.c, saa7146_video.c: MODULE_PARM -> module_param, added
  non-busy waiting option for saa7146_wait_for_debi_done(), make needlessly
  global code static and remove unused code (thanks to Adrian Bunk
  <bunk@stusta.de)

- [DVB] saa7146_core.c: dev is kmalloc'ed twice, add missing
  pci_disable_device(), rename goto labels, propagate the error code from the
  underlying layers when possible, pci_request_region replaces
  request_mem_region, other minor cleanups (thanks to Francois Romieu)

- [DVB] saa7146_fops.c, saa7146_i2c.c, saa7146_hlp.c, saa7146_vbi.c: make
  needlessly global code static, remove unused code (thanks to Adrian Bunk
  <bunk@stusta.de>)

Signed-off-by: Michael Hunold <hunold@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/media/common/saa7146_core.c  |  177 ++++++++++++++-------------
 25-akpm/drivers/media/common/saa7146_fops.c  |   12 -
 25-akpm/drivers/media/common/saa7146_hlp.c   |   21 ---
 25-akpm/drivers/media/common/saa7146_i2c.c   |    2 
 25-akpm/drivers/media/common/saa7146_vbi.c   |    2 
 25-akpm/drivers/media/common/saa7146_video.c |    2 
 25-akpm/include/media/saa7146.h              |    2 
 25-akpm/include/media/saa7146_vv.h           |    2 
 8 files changed, 102 insertions(+), 118 deletions(-)

diff -puN drivers/media/common/saa7146_core.c~saa7146-changes drivers/media/common/saa7146_core.c
--- 25/drivers/media/common/saa7146_core.c~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/drivers/media/common/saa7146_core.c	Thu Nov 18 15:17:45 2004
@@ -25,11 +25,11 @@ struct list_head saa7146_devices;
 struct semaphore saa7146_devices_lock;
 
 static int initialized = 0;
-int saa7146_num = 0;
+static int saa7146_num = 0;
 
 unsigned int saa7146_debug = 0;
 
-MODULE_PARM(saa7146_debug,"i");
+module_param(saa7146_debug, int, 0644);
 MODULE_PARM_DESC(saa7146_debug, "debug level (default: 0)");
 
 #if 0
@@ -48,7 +48,7 @@ static void dump_registers(struct saa714
  * gpio and debi helper functions
  ****************************************************************************/
 
-/* write "data" to the gpio-pin "pin" */
+/* write "data" to the gpio-pin "pin" -- unused */
 void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
 {
 	u32 value = 0;
@@ -67,7 +67,7 @@ void saa7146_set_gpio(struct saa7146_dev
 }
 
 /* This DEBI code is based on the saa7146 Stradis driver by Nathan Laredo */
-int saa7146_wait_for_debi_done(struct saa7146_dev *dev)
+int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
 {
 	unsigned long start;
 
@@ -80,6 +80,8 @@ int saa7146_wait_for_debi_done(struct sa
 			DEB_S(("timed out while waiting for registers getting programmed\n"));
 			return -ETIMEDOUT;
 		}
+		if (nobusyloop)
+			msleep(1);
 	}
 
 	/* wait for transfer to complete */
@@ -92,6 +94,8 @@ int saa7146_wait_for_debi_done(struct sa
 			DEB_S(("timed out while waiting for transfer completion\n"));
 			return -ETIMEDOUT;
 		}
+		if (nobusyloop)
+			msleep(1);
 	}
 
 	return 0;
@@ -248,10 +252,9 @@ void saa7146_setgpio(struct saa7146_dev 
 
 /********************************************************************************/
 /* interrupt handler */
-
 static irqreturn_t interrupt_hw(int irq, void *dev_id, struct pt_regs *regs)
 {
-	struct saa7146_dev *dev = (struct saa7146_dev*)dev_id;
+	struct saa7146_dev *dev = dev_id;
 	u32 isr = 0;
 
 	/* read out the interrupt status register */
@@ -318,16 +321,15 @@ static irqreturn_t interrupt_hw(int irq,
 
 static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent)
 {
-	unsigned long adr = 0, len = 0;
-	struct saa7146_dev* dev = kmalloc (sizeof(struct saa7146_dev),GFP_KERNEL);
-	
 	struct saa7146_pci_extension_data *pci_ext = (struct saa7146_pci_extension_data *)ent->driver_data;
 	struct saa7146_extension* ext = pci_ext->ext;
-	int err = 0;
+	struct saa7146_dev *dev;
+	int err = -ENOMEM;
 	
-	if (!(dev = kmalloc (sizeof(struct saa7146_dev),GFP_KERNEL))) {
+	dev = kmalloc(sizeof(struct saa7146_dev), GFP_KERNEL);
+	if (!dev) {
 		ERR(("out of memory.\n"));
-		return -ENOMEM;
+		goto out;
 	}
 
 	/* clear out mem for sure */
@@ -335,38 +337,37 @@ static int saa7146_init_one(struct pci_d
 
 	DEB_EE(("pci:%p\n",pci));
 
-	if (pci_enable_device(pci)) {
+	err = pci_enable_device(pci);
+	if (err < 0) {
 		ERR(("pci_enable_device() failed.\n"));
-		err = -EIO;
-		goto pci_error;
+		goto err_free;
 	}
 
 	/* enable bus-mastering */
 	pci_set_master(pci);
 
 	dev->pci = pci;
+
 	/* get chip-revision; this is needed to enable bug-fixes */
-	if( 0 > pci_read_config_dword(dev->pci, PCI_CLASS_REVISION, &dev->revision)) {
+	err = pci_read_config_dword(pci, PCI_CLASS_REVISION, &dev->revision);
+	if (err < 0) {
 		ERR(("pci_read_config_dword() failed.\n"));
-		err = -ENODEV;
-		goto pci_error;
+		goto err_disable;
 	}
 	dev->revision &= 0xf;
 
 	/* remap the memory from virtual to physical adress */
-	adr = pci_resource_start(pci,0);
-	len = pci_resource_len(pci,0);
-
-	if (!request_mem_region(pci_resource_start(pci,0), pci_resource_len(pci,0), "saa7146")) {
-		ERR(("request_mem_region() failed.\n"));
-		err = -ENODEV;
-		goto pci_error;
-	}
 
-	if (!(dev->mem = ioremap(adr,len))) {
+	err = pci_request_region(pci, 0, "saa7146");
+	if (err < 0)
+		goto err_disable;
+
+	dev->mem = ioremap(pci_resource_start(pci, 0),
+			   pci_resource_len(pci, 0));
+	if (!dev->mem) {
 		ERR(("ioremap() failed.\n"));
 		err = -ENODEV;
-		goto ioremap_error;
+		goto err_release;
 	}
 
 	/* we don't do a master reset here anymore, it screws up
@@ -386,42 +387,40 @@ static int saa7146_init_one(struct pci_d
 	saa7146_write(dev, MC2, 0xf8000000);
 
 	/* request an interrupt for the saa7146 */
-	if (request_irq(dev->pci->irq, interrupt_hw, SA_SHIRQ | SA_INTERRUPT,
-			dev->name, dev))
-	{
+	err = request_irq(pci->irq, interrupt_hw, SA_SHIRQ | SA_INTERRUPT,
+			  dev->name, dev);
+	if (err < 0) {
 		ERR(("request_irq() failed.\n"));
-		err = -ENODEV;
-		goto irq_error;
+		goto err_unmap;
 	}
 
-	/* get memory for various stuff */
-	dev->d_rps0.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_RPS_MEM, &dev->d_rps0.dma_handle);	
-	if( NULL == dev->d_rps0.cpu_addr ) {
 		err = -ENOMEM;
-		goto kmalloc_error_1;
-	}
+
+	/* get memory for various stuff */
+	dev->d_rps0.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
+						    &dev->d_rps0.dma_handle);
+	if (!dev->d_rps0.cpu_addr)
+		goto err_free_irq;
 	memset(dev->d_rps0.cpu_addr, 0x0, SAA7146_RPS_MEM);
 
-	dev->d_rps1.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_RPS_MEM, &dev->d_rps1.dma_handle);	
-	if( NULL == dev->d_rps1.cpu_addr ) {
-		err = -ENOMEM;
-		goto kmalloc_error_2;
-	}
+	dev->d_rps1.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
+						    &dev->d_rps1.dma_handle);
+	if (!dev->d_rps1.cpu_addr)
+		goto err_free_rps0;
 	memset(dev->d_rps1.cpu_addr, 0x0, SAA7146_RPS_MEM);
 
-	dev->d_i2c.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_RPS_MEM, &dev->d_i2c.dma_handle);	
-	if( NULL == dev->d_i2c.cpu_addr ) {
-		err = -ENOMEM;
-		goto kmalloc_error_3;
-	}
+	dev->d_i2c.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
+						   &dev->d_i2c.dma_handle);
+	if (!dev->d_i2c.cpu_addr)
+		goto err_free_rps1;
 	memset(dev->d_i2c.cpu_addr, 0x0, SAA7146_RPS_MEM);
 
 	/* the rest + print status message */
 
 	/* create a nice device name */
-	sprintf(&dev->name[0], "saa7146 (%d)",saa7146_num);
+	sprintf(dev->name, "saa7146 (%d)", saa7146_num);
 
-	INFO(("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x).\n", dev->mem, dev->revision,dev->pci->irq,dev->pci->subsystem_vendor,dev->pci->subsystem_device));
+	INFO(("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x).\n", dev->mem, dev->revision, pci->irq, pci->subsystem_vendor, pci->subsystem_device));
 	dev->ext = ext;
 
 	pci_set_drvdata(pci,dev);
@@ -438,18 +437,18 @@ static int saa7146_init_one(struct pci_d
 	/* set some sane pci arbitrition values */
 	saa7146_write(dev, PCI_BT_V1, 0x1c00101f); 
 
-	if( 0 != ext->probe) {
-		if( 0 != ext->probe(dev) ) {
-			DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
+	/* TODO: use the status code of the callback */
+
 			err = -ENODEV;
-			goto probe_error;
-		}
+
+	if (ext->probe && ext->probe(dev)) {
+		DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
+		goto err_free_i2c;
 	}
 
-	if( 0 != ext->attach(dev,pci_ext) ) {
+	if (ext->attach(dev, pci_ext)) {
 		DEB_D(("ext->attach() failed for %p. skipping device.\n",dev));
-			err = -ENODEV;
-			goto attach_error;
+		goto err_unprobe;
 	}
 
 	INIT_LIST_HEAD(&dev->item);
@@ -457,30 +456,46 @@ static int saa7146_init_one(struct pci_d
 	saa7146_num++;
 
 	err = 0;
-	goto out;
-attach_error:
-probe_error:
+out:
+	return err;
+
+err_unprobe:
 	pci_set_drvdata(pci,NULL);
-	pci_free_consistent(dev->pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr, dev->d_i2c.dma_handle);
-kmalloc_error_3:
-	pci_free_consistent(dev->pci, SAA7146_RPS_MEM, dev->d_rps1.cpu_addr, dev->d_rps1.dma_handle);
-kmalloc_error_2:
-	pci_free_consistent(dev->pci, SAA7146_RPS_MEM, dev->d_rps0.cpu_addr, dev->d_rps0.dma_handle);
-kmalloc_error_1:
-	free_irq(dev->pci->irq, (void *)dev);
-irq_error:
+err_free_i2c:
+	pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr,
+			    dev->d_i2c.dma_handle);
+err_free_rps1:
+	pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_rps1.cpu_addr,
+			    dev->d_rps1.dma_handle);
+err_free_rps0:
+	pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_rps0.cpu_addr,
+			    dev->d_rps0.dma_handle);
+err_free_irq:
+	free_irq(pci->irq, (void *)dev);
+err_unmap:
 	iounmap(dev->mem);
-ioremap_error:
-        release_mem_region(adr,len);
-pci_error:
+err_release:
+	pci_release_region(pci, 0);
+err_disable:
+	pci_disable_device(pci);
+err_free:
 	kfree(dev);
-out:
-	return err;
+	goto out;
 }
 
 static void saa7146_remove_one(struct pci_dev *pdev)
 {
-	struct saa7146_dev* dev = (struct saa7146_dev*) pci_get_drvdata(pdev);
+	struct saa7146_dev* dev = pci_get_drvdata(pdev);
+	struct {
+		void *addr;
+		dma_addr_t dma;
+	} dev_map[] = {
+		{ dev->d_i2c.cpu_addr, dev->d_i2c.dma_handle },
+		{ dev->d_rps1.cpu_addr, dev->d_rps1.dma_handle },
+		{ dev->d_rps0.cpu_addr, dev->d_rps0.dma_handle },
+		{ NULL, 0 }
+	}, *p;
+
 	DEB_EE(("dev:%p\n",dev));
 
 	dev->ext->detach(dev);
@@ -491,17 +506,15 @@ static void saa7146_remove_one(struct pc
 	/* disable all irqs, release irq-routine */
 	saa7146_write(dev, IER, 0);
 
-	free_irq(dev->pci->irq, (void *)dev);
+	free_irq(pdev->irq, dev);
 
-	/* free kernel memory */
-	pci_free_consistent(dev->pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr, dev->d_i2c.dma_handle);
-	pci_free_consistent(dev->pci, SAA7146_RPS_MEM, dev->d_rps1.cpu_addr, dev->d_rps1.dma_handle);
-	pci_free_consistent(dev->pci, SAA7146_RPS_MEM, dev->d_rps0.cpu_addr, dev->d_rps0.dma_handle);
+	for (p = dev_map; p->addr; p++)
+		pci_free_consistent(pdev, SAA7146_RPS_MEM, p->addr, p->dma);
 
 	iounmap(dev->mem);
-	release_mem_region(pci_resource_start(dev->pci,0), pci_resource_len(dev->pci,0));
-
+	pci_release_region(pdev, 0);
 	list_del(&dev->item);
+	pci_disable_device(pdev);
 	kfree(dev);
 
 	saa7146_num--;
diff -puN drivers/media/common/saa7146_fops.c~saa7146-changes drivers/media/common/saa7146_fops.c
--- 25/drivers/media/common/saa7146_fops.c~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/drivers/media/common/saa7146_fops.c	Thu Nov 18 15:17:45 2004
@@ -1,4 +1,5 @@
 #include <media/saa7146_vv.h>
+#include <linux/version.h>
 
 #define BOARD_CAN_DO_VBI(dev)   (dev->revision != 0 && dev->vv_data->vbi_minor != -1) 
 
@@ -32,17 +33,6 @@ int saa7146_res_get(struct saa7146_fh *f
 	return 1;
 }
 
-int saa7146_res_check(struct saa7146_fh *fh, unsigned int bit)
-{
-	return (fh->resources & bit);
-}
-
-int saa7146_res_locked(struct saa7146_dev *dev, unsigned int bit)
-{
-	struct saa7146_vv *vv = dev->vv_data;
-	return (vv->resources & bit);
-}
-
 void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits)
 {
 	struct saa7146_dev *dev = fh->dev;
diff -puN drivers/media/common/saa7146_hlp.c~saa7146-changes drivers/media/common/saa7146_hlp.c
--- 25/drivers/media/common/saa7146_hlp.c~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/drivers/media/common/saa7146_hlp.c	Thu Nov 18 15:17:45 2004
@@ -9,11 +9,6 @@ static void calculate_output_format_regi
 	*clip_format |=  (( ((palette&0xf00)>>8) << 30) | ((palette&0x00f) << 24) | (((palette&0x0f0)>>4) << 16));
 }
 
-static void calculate_bcs_ctrl_register(struct saa7146_dev *dev, int brightness, int contrast, int colour, u32 *bcs_ctrl)
-{
-	*bcs_ctrl = ((brightness << 24) | (contrast << 16) | (colour <<  0));
-}
-
 static void calculate_hps_source_and_sync(struct saa7146_dev *dev, int source, int sync, u32* hps_ctrl)
 {
 	*hps_ctrl &= ~(MASK_30 | MASK_31 | MASK_28);
@@ -62,7 +57,7 @@ static struct {
 };
 
 /* table of attenuation values for horizontal scaling */
-u8 h_attenuation[] = { 1, 2, 4, 8, 2, 4, 8, 16, 0};
+static u8 h_attenuation[] = { 1, 2, 4, 8, 2, 4, 8, 16, 0};
 
 /* calculate horizontal scale registers */
 static int calculate_h_scale_registers(struct saa7146_dev *dev,
@@ -208,7 +203,7 @@ static struct {
 };
 
 /* table of attenuation values for vertical scaling */
-u16 v_attenuation[] = { 2, 4, 8, 16, 32, 64, 128, 256, 0};
+static u16 v_attenuation[] = { 2, 4, 8, 16, 32, 64, 128, 256, 0};
 
 /* calculate vertical scale registers */
 static int calculate_v_scale_registers(struct saa7146_dev *dev, enum v4l2_field field,
@@ -620,18 +615,6 @@ static void saa7146_set_output_format(st
       	saa7146_write(dev, MC2, (MASK_05 | MASK_21));
 }
 
-void saa7146_set_picture_prop(struct saa7146_dev *dev, int brightness, int contrast, int colour)
-{
-	u32	bcs_ctrl = 0;
-	
-	calculate_bcs_ctrl_register(dev, brightness, contrast, colour, &bcs_ctrl);
-	saa7146_write(dev, BCS_CTRL, bcs_ctrl);
-	
-	/* update the bcs register */
-      	saa7146_write(dev, MC2, (MASK_06 | MASK_22));
-}
-
-
 /* select input-source */
 void saa7146_set_hps_source_and_sync(struct saa7146_dev *dev, int source, int sync)
 {
diff -puN drivers/media/common/saa7146_i2c.c~saa7146-changes drivers/media/common/saa7146_i2c.c
--- 25/drivers/media/common/saa7146_i2c.c~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/drivers/media/common/saa7146_i2c.c	Thu Nov 18 15:17:45 2004
@@ -1,7 +1,7 @@
 #include <linux/version.h>
 #include <media/saa7146_vv.h>
 
-u32 saa7146_i2c_func(struct i2c_adapter *adapter)
+static u32 saa7146_i2c_func(struct i2c_adapter *adapter)
 {
 //fm	DEB_I2C(("'%s'.\n", adapter->name));
 
diff -puN drivers/media/common/saa7146_vbi.c~saa7146-changes drivers/media/common/saa7146_vbi.c
--- 25/drivers/media/common/saa7146_vbi.c~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/drivers/media/common/saa7146_vbi.c	Thu Nov 18 15:17:45 2004
@@ -130,7 +130,7 @@ static int vbi_workaround(struct saa7146
 	return 0;
 }
 
-void saa7146_set_vbi_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
+static void saa7146_set_vbi_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
 {
 	struct saa7146_vv *vv = dev->vv_data;
 
diff -puN drivers/media/common/saa7146_video.c~saa7146-changes drivers/media/common/saa7146_video.c
--- 25/drivers/media/common/saa7146_video.c~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/drivers/media/common/saa7146_video.c	Thu Nov 18 15:17:45 2004
@@ -2,7 +2,7 @@
 
 static int max_memory = 32;
 
-MODULE_PARM(max_memory,"i");
+module_param(max_memory, int, 0644);
 MODULE_PARM_DESC(max_memory, "maximum memory usage for capture buffers (default: 32Mb)");
 
 #define IS_CAPTURE_ACTIVE(fh) \
diff -puN include/media/saa7146.h~saa7146-changes include/media/saa7146.h
--- 25/include/media/saa7146.h~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/include/media/saa7146.h	Thu Nov 18 15:17:45 2004
@@ -168,7 +168,7 @@ void saa7146_pgtable_free(struct pci_dev
 int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
 char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt);
 void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data);
-int saa7146_wait_for_debi_done(struct saa7146_dev *dev);
+int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop);
 
 /* some memory sizes */
 #define SAA7146_I2C_MEM		( 1*PAGE_SIZE)
diff -puN include/media/saa7146_vv.h~saa7146-changes include/media/saa7146_vv.h
--- 25/include/media/saa7146_vv.h~saa7146-changes	Thu Nov 18 15:17:45 2004
+++ 25-akpm/include/media/saa7146_vv.h	Thu Nov 18 15:17:45 2004
@@ -219,8 +219,6 @@ extern struct saa7146_use_ops saa7146_vb
 
 /* resource management functions */
 int saa7146_res_get(struct saa7146_fh *fh, unsigned int bit);
-int saa7146_res_check(struct saa7146_fh *fh, unsigned int bit);
-int saa7146_res_locked(struct saa7146_dev *dev, unsigned int bit);
 void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits);
 
 #define RESOURCE_DMA1_HPS	0x1
_
