X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmedia%2Fcommon%2Fsaa7146_core.c;h=86cbdbcf9d7db1f005e9cfa37a44b76088c59c61;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=5df06f2f8a50e9b01f5e6461903aa4c82cb57592;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c index 5df06f2f8..86cbdbcf9 100644 --- a/drivers/media/common/saa7146_core.c +++ b/drivers/media/common/saa7146_core.c @@ -20,14 +20,12 @@ #include -/* 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_extension* ext = 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);