Commit 4b0f0461 authored by Stelian Pop's avatar Stelian Pop Committed by Linus Torvalds

[PATCH] enable meye even when CONFIG_HIGHMEM64G=y

The meye hardware needs to access the main memory for DMA using
32 bit addresses. The previous version of the meye driver used
dma_addr_t types to build those addresses and ensured that
sizeof(dma_addr_t) = 4 by disabling HIGHMEM64G in Kconfig.

However, this way of doing it also makes meye unavailable on
some kernel configurations. As Arjan said previously, future Fedora
kernels may have HIGHMEM64G activated by default (davej says it won't
happen, at least for now...). Other distributions may do the same and
this will require meye users to recompile the whole kernel.

The attached patch makes the meye driver use dma_addr_t addresses 
internally, but converts them to u32 before giving them to the
hardware.
Signed-off-by: default avatarStelian Pop <stelian@popies.net>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent dea9adec
...@@ -220,7 +220,7 @@ config VIDEO_ZR36120 ...@@ -220,7 +220,7 @@ config VIDEO_ZR36120
config VIDEO_MEYE config VIDEO_MEYE
tristate "Sony Vaio Picturebook Motion Eye Video For Linux" tristate "Sony Vaio Picturebook Motion Eye Video For Linux"
depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G depends on VIDEO_DEV && PCI && SONYPI
---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
......
...@@ -110,19 +110,20 @@ static void rvfree(void * mem, unsigned long size) ...@@ -110,19 +110,20 @@ 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 * NOTE: The meye device expects DMA addresses on 32 bits, we build
* (the toc must be exactly 1024 entries each of them being 4 bytes * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
* in size, the whole result being 4096 bytes). We're using here
* dma_addr_t for correctness 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)
{ {
dma_addr_t *pt; u32 *pt;
int i; int i;
memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable)); memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
/* give only 32 bit DMA addresses */
if (dma_set_mask(&meye.mchip_dev->dev, 0xffffffff))
return -1;
meye.mchip_ptable_toc = 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,
...@@ -134,17 +135,19 @@ static int ptable_alloc(void) ...@@ -134,17 +135,19 @@ static int ptable_alloc(void)
pt = meye.mchip_ptable_toc; pt = meye.mchip_ptable_toc;
for (i = 0; i < MCHIP_NB_PAGES; i++) { for (i = 0; i < MCHIP_NB_PAGES; i++) {
dma_addr_t dma;
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,
pt, &dma,
GFP_KERNEL); GFP_KERNEL);
if (!meye.mchip_ptable[i]) { if (!meye.mchip_ptable[i]) {
int j; int j;
pt = meye.mchip_ptable_toc; pt = meye.mchip_ptable_toc;
for (j = 0; j < i; ++j) { for (j = 0; j < i; ++j) {
dma = (dma_addr_t) *pt;
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], dma);
pt++; pt++;
} }
dma_free_coherent(&meye.mchip_dev->dev, dma_free_coherent(&meye.mchip_dev->dev,
...@@ -155,6 +158,7 @@ static int ptable_alloc(void) ...@@ -155,6 +158,7 @@ static int ptable_alloc(void)
meye.mchip_dmahandle = 0; meye.mchip_dmahandle = 0;
return -1; return -1;
} }
*pt = (u32) dma;
pt++; pt++;
} }
return 0; return 0;
...@@ -162,15 +166,16 @@ static int ptable_alloc(void) ...@@ -162,15 +166,16 @@ static int ptable_alloc(void)
static void ptable_free(void) static void ptable_free(void)
{ {
dma_addr_t *pt; u32 *pt;
int i; int i;
pt = meye.mchip_ptable_toc; pt = meye.mchip_ptable_toc;
for (i = 0; i < MCHIP_NB_PAGES; i++) { for (i = 0; i < MCHIP_NB_PAGES; i++) {
dma_addr_t dma = (dma_addr_t) *pt;
if (meye.mchip_ptable[i]) if (meye.mchip_ptable[i])
dma_free_coherent(&meye.mchip_dev->dev, dma_free_coherent(&meye.mchip_dev->dev,
PAGE_SIZE, PAGE_SIZE,
meye.mchip_ptable[i], *pt); meye.mchip_ptable[i], dma);
pt++; pt++;
} }
...@@ -520,11 +525,11 @@ static void mchip_vrj_setup(u8 mode) ...@@ -520,11 +525,11 @@ static void mchip_vrj_setup(u8 mode)
} }
/* sets the DMA parameters into the chip */ /* sets the DMA parameters into the chip */
static void mchip_dma_setup(u32 dma_addr) static void mchip_dma_setup(dma_addr_t dma_addr)
{ {
int i; int i;
mchip_set(MCHIP_MM_PT_ADDR, dma_addr); mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
mchip_set(MCHIP_MM_FIR(i), 0); mchip_set(MCHIP_MM_FIR(i), 0);
meye.mchip_fnum = 0; meye.mchip_fnum = 0;
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#define _MEYE_PRIV_H_ #define _MEYE_PRIV_H_
#define MEYE_DRIVER_MAJORVERSION 1 #define MEYE_DRIVER_MAJORVERSION 1
#define MEYE_DRIVER_MINORVERSION 12 #define MEYE_DRIVER_MINORVERSION 13
#define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \ #define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \
__stringify(MEYE_DRIVER_MINORVERSION) __stringify(MEYE_DRIVER_MINORVERSION)
...@@ -294,7 +294,7 @@ struct meye { ...@@ -294,7 +294,7 @@ struct meye {
u8 mchip_fnum; /* current mchip frame number */ u8 mchip_fnum; /* current mchip frame number */
unsigned char __iomem *mchip_mmregs;/* mchip: memory mapped registers */ unsigned char __iomem *mchip_mmregs;/* mchip: memory mapped registers */
u8 *mchip_ptable[MCHIP_NB_PAGES];/* mchip: ptable */ u8 *mchip_ptable[MCHIP_NB_PAGES];/* mchip: ptable */
dma_addr_t *mchip_ptable_toc; /* mchip: ptable toc */ void *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 */
unsigned char *grab_temp; /* temporary buffer */ unsigned char *grab_temp; /* temporary buffer */
......
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