Commit 58a88273 authored by Andrew Morton's avatar Andrew Morton Committed by Greg Kroah-Hartman

[PATCH] meye: Fix dma_addr_t usage

From: Stelian Pop <stelian@popies.net>

This driver had an array which contained both dma_addr_t's and kernel virtual
addresses.  Split those up, thus tidying things and avoiding a printk
warning.
parent 97ec2653
...@@ -205,7 +205,7 @@ config VIDEO_ZR36120 ...@@ -205,7 +205,7 @@ config VIDEO_ZR36120
config VIDEO_MEYE config VIDEO_MEYE
tristate "Sony Vaio Picturebook Motion Eye Video For Linux (EXPERIMENTAL)" tristate "Sony Vaio Picturebook Motion Eye Video For Linux (EXPERIMENTAL)"
depends on VIDEO_DEV && SONYPI depends on VIDEO_DEV && SONYPI && !HIGHMEM64G
---help--- ---help---
This is the video4linux driver for the Motion Eye camera found This is the video4linux driver for the Motion Eye camera found
in the Vaio Picturebook laptops. Please read the material in in the Vaio Picturebook laptops. Please read the material in
......
...@@ -160,23 +160,29 @@ static void rvfree(void * mem, unsigned long size) { ...@@ -160,23 +160,29 @@ static void rvfree(void * mem, unsigned long size) {
} }
} }
/* return a page table pointing to N pages of locked memory */ /* return a page table pointing to N pages of locked memory
*
* NOTE: The meye device expects dma_addr_t size to be 32 bits
* (the toc must be exactly 1024 entries each of them being 4 bytes
* in size, the whole result being 4096 bytes). We're using here
* dma_addr_t for corectness but the compilation of this driver is
* disabled for HIGHMEM64G=y, where sizeof(dma_addr_t) != 4 */
static int ptable_alloc(void) { static int ptable_alloc(void) {
u32 *pt; dma_addr_t *pt;
int i; int i;
memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable)); memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
meye.mchip_ptable[MCHIP_NB_PAGES] = dma_alloc_coherent(&meye.mchip_dev->dev, meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
PAGE_SIZE, PAGE_SIZE,
&meye.mchip_dmahandle, &meye.mchip_dmahandle,
GFP_KERNEL); GFP_KERNEL);
if (!meye.mchip_ptable[MCHIP_NB_PAGES]) { if (!meye.mchip_ptable_toc) {
meye.mchip_dmahandle = 0; meye.mchip_dmahandle = 0;
return -1; return -1;
} }
pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES]; pt = meye.mchip_ptable_toc;
for (i = 0; i < MCHIP_NB_PAGES; i++) { for (i = 0; i < MCHIP_NB_PAGES; i++) {
meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev, meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
PAGE_SIZE, PAGE_SIZE,
...@@ -184,13 +190,18 @@ static int ptable_alloc(void) { ...@@ -184,13 +190,18 @@ static int ptable_alloc(void) {
GFP_KERNEL); GFP_KERNEL);
if (!meye.mchip_ptable[i]) { if (!meye.mchip_ptable[i]) {
int j; int j;
pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES]; pt = meye.mchip_ptable_toc;
for (j = 0; j < i; ++j) { for (j = 0; j < i; ++j) {
dma_free_coherent(&meye.mchip_dev->dev, dma_free_coherent(&meye.mchip_dev->dev,
PAGE_SIZE, PAGE_SIZE,
meye.mchip_ptable[j], *pt); meye.mchip_ptable[j], *pt);
pt++; pt++;
} }
dma_free_coherent(&meye.mchip_dev->dev,
PAGE_SIZE,
meye.mchip_ptable_toc,
meye.mchip_dmahandle);
meye.mchip_ptable_toc = 0;
meye.mchip_dmahandle = 0; meye.mchip_dmahandle = 0;
return -1; return -1;
} }
...@@ -200,10 +211,10 @@ static int ptable_alloc(void) { ...@@ -200,10 +211,10 @@ static int ptable_alloc(void) {
} }
static void ptable_free(void) { static void ptable_free(void) {
u32 *pt; dma_addr_t *pt;
int i; int i;
pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES]; pt = meye.mchip_ptable_toc;
for (i = 0; i < MCHIP_NB_PAGES; i++) { for (i = 0; i < MCHIP_NB_PAGES; i++) {
if (meye.mchip_ptable[i]) if (meye.mchip_ptable[i])
dma_free_coherent(&meye.mchip_dev->dev, dma_free_coherent(&meye.mchip_dev->dev,
...@@ -212,13 +223,14 @@ static void ptable_free(void) { ...@@ -212,13 +223,14 @@ static void ptable_free(void) {
pt++; pt++;
} }
if (meye.mchip_ptable[MCHIP_NB_PAGES]) if (meye.mchip_ptable_toc)
dma_free_coherent(&meye.mchip_dev->dev, dma_free_coherent(&meye.mchip_dev->dev,
PAGE_SIZE, PAGE_SIZE,
meye.mchip_ptable[MCHIP_NB_PAGES], meye.mchip_ptable_toc,
meye.mchip_dmahandle); meye.mchip_dmahandle);
memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable)); memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
meye.mchip_ptable_toc = 0;
meye.mchip_dmahandle = 0; meye.mchip_dmahandle = 0;
} }
......
...@@ -298,7 +298,8 @@ struct meye { ...@@ -298,7 +298,8 @@ struct meye {
u8 mchip_fnum; /* current mchip frame number */ u8 mchip_fnum; /* current mchip frame number */
unsigned char *mchip_mmregs; /* mchip: memory mapped registers */ unsigned char *mchip_mmregs; /* mchip: memory mapped registers */
u8 *mchip_ptable[MCHIP_NB_PAGES+1];/* mchip: ptable + ptable toc */ u8 *mchip_ptable[MCHIP_NB_PAGES];/* mchip: ptable */
dma_addr_t *mchip_ptable_toc; /* mchip: ptable toc */
dma_addr_t mchip_dmahandle; /* mchip: dma handle to ptable toc */ dma_addr_t mchip_dmahandle; /* mchip: dma handle to ptable toc */
unsigned char *grab_fbuffer; /* capture framebuffer */ unsigned char *grab_fbuffer; /* capture framebuffer */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment