fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / media / common / saa7146_core.c
index 5df06f2..86cbdbc 100644 (file)
 
 #include <media/saa7146.h>
 
-/* global variables */
-struct list_head saa7146_devices;
-struct semaphore saa7146_devices_lock;
+LIST_HEAD(saa7146_devices);
+DEFINE_MUTEX(saa7146_devices_lock);
 
-static int initialized = 0;
-static int saa7146_num = 0;
+static int saa7146_num;
 
-unsigned int saa7146_debug = 0;
+unsigned int saa7146_debug;
 
 module_param(saa7146_debug, int, 0644);
 MODULE_PARM_DESC(saa7146_debug, "debug level (default: 0)");
@@ -48,21 +46,15 @@ static void dump_registers(struct saa7146_dev* dev)
  * gpio and debi helper functions
  ****************************************************************************/
 
-/* write "data" to the gpio-pin "pin" -- unused */
-void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
+void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data)
 {
        u32 value = 0;
 
-       /* sanity check */
-       if(pin > 3)
-               return;
-
-       /* read old register contents */
-       value = saa7146_read(dev, GPIO_CTRL );
-       
-       value &= ~(0xff << (8*pin));
-       value |= (data << (8*pin));
+       BUG_ON(port > 3);
 
+       value = saa7146_read(dev, GPIO_CTRL);
+       value &= ~(0xff << (8*port));
+       value |= (data << (8*port));
        saa7146_write(dev, GPIO_CTRL, value);
 }
 
@@ -70,13 +62,15 @@ void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
 int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
 {
        unsigned long start;
+       int err;
 
        /* wait for registers to be programmed */
        start = jiffies;
        while (1) {
-                if (saa7146_read(dev, MC2) & 2)
-                        break;
-               if (time_after(jiffies, start + HZ/20)) {
+               err = time_after(jiffies, start + HZ/20);
+               if (saa7146_read(dev, MC2) & 2)
+                       break;
+               if (err) {
                        DEB_S(("timed out while waiting for registers getting programmed\n"));
                        return -ETIMEDOUT;
                }
@@ -87,10 +81,11 @@ int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
        /* wait for transfer to complete */
        start = jiffies;
        while (1) {
+               err = time_after(jiffies, start + HZ/4);
                if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
                        break;
                saa7146_read(dev, MC2);
-               if (time_after(jiffies, start + HZ/4)) {
+               if (err) {
                        DEB_S(("timed out while waiting for transfer completion\n"));
                        return -ETIMEDOUT;
                }
@@ -105,7 +100,7 @@ int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
  * general helper functions
  ****************************************************************************/
 
-/* this is videobuf_vmalloc_to_sg() from video-buf.c 
+/* this is videobuf_vmalloc_to_sg() from video-buf.c
    make sure virt has been allocated with vmalloc_32(), otherwise the BUG()
    may be triggered on highmem machines */
 static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
@@ -114,21 +109,19 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
        struct page *pg;
        int i;
 
-       sglist = kmalloc(sizeof(struct scatterlist)*nr_pages, GFP_KERNEL);
+       sglist = kcalloc(nr_pages, sizeof(struct scatterlist), GFP_KERNEL);
        if (NULL == sglist)
                return NULL;
-       memset(sglist,0,sizeof(struct scatterlist)*nr_pages);
        for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) {
                pg = vmalloc_to_page(virt);
                if (NULL == pg)
                        goto err;
-               if (PageHighMem(pg))
-                       BUG();
+               BUG_ON(PageHighMem(pg));
                sglist[i].page   = pg;
                sglist[i].length = PAGE_SIZE;
        }
        return sglist;
-       
+
  err:
        kfree(sglist);
        return NULL;
@@ -158,7 +151,7 @@ char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa
                vfree(mem);
                return NULL;
        }
-       
+
        slen = pci_map_sg(pci,pt->slist,pages,PCI_DMA_FROMDEVICE);
        if (0 != saa7146_pgtable_build_single(pci, pt, pt->slist, slen)) {
                return NULL;
@@ -173,16 +166,14 @@ void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
                return;
        pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
        pt->cpu = NULL;
-       if (NULL != pt->slist) {
-               kfree(pt->slist);
-               pt->slist = NULL;
-       }
+       kfree(pt->slist);
+       pt->slist = NULL;
 }
 
 int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
 {
-        u32          *cpu;
-        dma_addr_t   dma_addr;
+       u32          *cpu;
+       dma_addr_t   dma_addr;
 
        cpu = pci_alloc_consistent(pci, PAGE_SIZE, &dma_addr);
        if (NULL == cpu) {
@@ -198,13 +189,13 @@ int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
 int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
        struct scatterlist *list, int sglen  )
 {
-       u32   *ptr, fill;
+       u32 *ptr, fill;
        int nr_pages = 0;
-       int   i,p;
+       int i,p;
 
-       BUG_ON( 0 == sglen);
+       BUG_ON(0 == sglen);
        BUG_ON(list->offset > PAGE_SIZE);
-       
+
        /* if we have a user buffer, the first page may not be
           aligned to a page boundary. */
        pt->offset = list->offset;
@@ -237,22 +228,9 @@ int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt
        return 0;
 }
 
-/********************************************************************************/
-/* gpio functions */
-
-void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data)
-{
-       u32 val = 0;
-
-        val=saa7146_read(dev,GPIO_CTRL);
-        val&=~(0xff << (8*(port)));
-        val|=(data)<<(8*(port));
-        saa7146_write(dev, GPIO_CTRL, val);
-}
-
 /********************************************************************************/
 /* interrupt handler */
-static irqreturn_t interrupt_hw(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t interrupt_hw(int irq, void *dev_id)
 {
        struct saa7146_dev *dev = dev_id;
        u32 isr = 0;
@@ -322,19 +300,17 @@ static irqreturn_t interrupt_hw(int irq, void *dev_id, struct pt_regs *regs)
 static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent)
 {
        struct saa7146_pci_extension_data *pci_ext = (struct saa7146_pci_extension_data *)ent->driver_data;
-       struct saa7146_extensionext = pci_ext->ext;
+       struct saa7146_extension *ext = pci_ext->ext;
        struct saa7146_dev *dev;
        int err = -ENOMEM;
-       
-       dev = kmalloc(sizeof(struct saa7146_dev), GFP_KERNEL);
+
+       /* clear out mem for sure */
+       dev = kzalloc(sizeof(struct saa7146_dev), GFP_KERNEL);
        if (!dev) {
                ERR(("out of memory.\n"));
                goto out;
        }
 
-       /* clear out mem for sure */
-       memset(dev, 0x0, sizeof(struct saa7146_dev));
-
        DEB_EE(("pci:%p\n",pci));
 
        err = pci_enable_device(pci);
@@ -387,14 +363,14 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
        saa7146_write(dev, MC2, 0xf8000000);
 
        /* request an interrupt for the saa7146 */
-       err = request_irq(pci->irq, interrupt_hw, SA_SHIRQ | SA_INTERRUPT,
+       err = request_irq(pci->irq, interrupt_hw, IRQF_SHARED | IRQF_DISABLED,
                          dev->name, dev);
        if (err < 0) {
                ERR(("request_irq() failed.\n"));
                goto err_unmap;
        }
 
-               err = -ENOMEM;
+       err = -ENOMEM;
 
        /* get memory for various stuff */
        dev->d_rps0.cpu_addr = pci_alloc_consistent(pci, SAA7146_RPS_MEM,
@@ -423,23 +399,23 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
        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);
+       pci_set_drvdata(pci, dev);
 
-        init_MUTEX(&dev->lock);
+       mutex_init(&dev->lock);
        spin_lock_init(&dev->int_slock);
        spin_lock_init(&dev->slock);
 
-       init_MUTEX(&dev->i2c_lock);
+       mutex_init(&dev->i2c_lock);
 
        dev->module = THIS_MODULE;
        init_waitqueue_head(&dev->i2c_wq);
 
        /* set some sane pci arbitrition values */
-       saa7146_write(dev, PCI_BT_V1, 0x1c00101f); 
+       saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
 
        /* TODO: use the status code of the callback */
 
-                       err = -ENODEV;
+       err = -ENODEV;
 
        if (ext->probe && ext->probe(dev)) {
                DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
@@ -460,7 +436,7 @@ out:
        return err;
 
 err_unprobe:
-       pci_set_drvdata(pci,NULL);
+       pci_set_drvdata(pci, NULL);
 err_free_i2c:
        pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr,
                            dev->d_i2c.dma_handle);
@@ -527,19 +503,13 @@ int saa7146_register_extension(struct saa7146_extension* ext)
 {
        DEB_EE(("ext:%p\n",ext));
 
-       if( 0 == initialized ) {
-               INIT_LIST_HEAD(&saa7146_devices);
-               init_MUTEX(&saa7146_devices_lock);
-               initialized = 1;
-       }
-
        ext->driver.name = ext->name;
        ext->driver.id_table = ext->pci_tbl;
        ext->driver.probe = saa7146_init_one;
        ext->driver.remove = saa7146_remove_one;
 
        printk("saa7146: register extension '%s'.\n",ext->name);
-       return pci_module_init(&ext->driver);
+       return pci_register_driver(&ext->driver);
 }
 
 int saa7146_unregister_extension(struct saa7146_extension* ext)
@@ -550,23 +520,6 @@ int saa7146_unregister_extension(struct saa7146_extension* ext)
        return 0;
 }
 
-static int __init saa7146_init_module(void)
-{
-       if( 0 == initialized ) {
-               INIT_LIST_HEAD(&saa7146_devices);
-               init_MUTEX(&saa7146_devices_lock);
-               initialized = 1;
-       }
-       return 0;
-}
-
-static void __exit saa7146_cleanup_module(void)
-{
-}
-
-module_init(saa7146_init_module);
-module_exit(saa7146_cleanup_module);
-
 EXPORT_SYMBOL_GPL(saa7146_register_extension);
 EXPORT_SYMBOL_GPL(saa7146_unregister_extension);