diff options
Diffstat (limited to 'drivers/media/common/saa7146/saa7146_core.c')
-rw-r--r-- | drivers/media/common/saa7146/saa7146_core.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/drivers/media/common/saa7146/saa7146_core.c b/drivers/media/common/saa7146/saa7146_core.c index e50fa0ff7c5d..bcb957883044 100644 --- a/drivers/media/common/saa7146/saa7146_core.c +++ b/drivers/media/common/saa7146/saa7146_core.c @@ -37,7 +37,8 @@ void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data) { u32 value = 0; - BUG_ON(port > 3); + if (WARN_ON(port > 3)) + return; value = saa7146_read(dev, GPIO_CTRL); value &= ~(0xff << (8*port)); @@ -148,7 +149,8 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages) pg = vmalloc_to_page(virt); if (NULL == pg) goto err; - BUG_ON(PageHighMem(pg)); + if (WARN_ON(PageHighMem(pg))) + return NULL; sg_set_page(&sglist[i], pg, PAGE_SIZE, 0); } return sglist; @@ -233,46 +235,32 @@ 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 ) + struct scatterlist *list, int sglen) { + struct sg_dma_page_iter dma_iter; __le32 *ptr, fill; int nr_pages = 0; - int i,p; + int i; - BUG_ON(0 == sglen); - BUG_ON(list->offset > PAGE_SIZE); + if (WARN_ON(!sglen) || + WARN_ON(list->offset > PAGE_SIZE)) + return -EIO; /* if we have a user buffer, the first page may not be aligned to a page boundary. */ pt->offset = list->offset; ptr = pt->cpu; - for (i = 0; i < sglen; i++, list++) { -/* - pr_debug("i:%d, adr:0x%08x, len:%d, offset:%d\n", - i, sg_dma_address(list), sg_dma_len(list), - list->offset); -*/ - for (p = 0; p * 4096 < sg_dma_len(list); p++, ptr++) { - *ptr = cpu_to_le32(sg_dma_address(list) + p * 4096); - nr_pages++; - } + for_each_sg_dma_page(list, &dma_iter, sglen, 0) { + *ptr++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter)); + nr_pages++; } /* safety; fill the page table up with the last valid page */ fill = *(ptr-1); - for(i=nr_pages;i<1024;i++) { + for (i = nr_pages; i < 1024; i++) *ptr++ = fill; - } - -/* - ptr = pt->cpu; - pr_debug("offset: %d\n", pt->offset); - for(i=0;i<5;i++) { - pr_debug("ptr1 %d: 0x%08x\n", i, ptr[i]); - } -*/ return 0; } |