Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / drivers / media / pci / meye / meye.c
blobdedcdb57342705720a6e3a149904dd7b370b78fc
1 /*
2 * Motion Eye video4linux driver for Sony Vaio PictureBook
4 * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
6 * Copyright (C) 2001-2002 AlcĂ´ve <www.alcove.com>
8 * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
10 * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
12 * Some parts borrowed from various video4linux drivers, especially
13 * bttv-driver.c and zoran.c, see original files for credits.
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 #include <linux/module.h>
26 #include <linux/pci.h>
27 #include <linux/sched.h>
28 #include <linux/init.h>
29 #include <linux/gfp.h>
30 #include <linux/videodev2.h>
31 #include <media/v4l2-common.h>
32 #include <media/v4l2-device.h>
33 #include <media/v4l2-ioctl.h>
34 #include <media/v4l2-fh.h>
35 #include <media/v4l2-event.h>
36 #include <linux/uaccess.h>
37 #include <asm/io.h>
38 #include <linux/delay.h>
39 #include <linux/interrupt.h>
40 #include <linux/vmalloc.h>
41 #include <linux/dma-mapping.h>
43 #include "meye.h"
44 #include <linux/meye.h>
46 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
47 MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
48 MODULE_LICENSE("GPL");
49 MODULE_VERSION(MEYE_DRIVER_VERSION);
51 /* number of grab buffers */
52 static unsigned int gbuffers = 2;
53 module_param(gbuffers, int, 0444);
54 MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
56 /* size of a grab buffer */
57 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
58 module_param(gbufsize, int, 0444);
59 MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400 (will be rounded up to a page multiple)");
61 /* /dev/videoX registration number */
62 static int video_nr = -1;
63 module_param(video_nr, int, 0444);
64 MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
66 /* driver structure - only one possible */
67 static struct meye meye;
69 /****************************************************************************/
70 /* Memory allocation routines (stolen from bttv-driver.c) */
71 /****************************************************************************/
72 static void *rvmalloc(unsigned long size)
74 void *mem;
75 unsigned long adr;
77 size = PAGE_ALIGN(size);
78 mem = vmalloc_32(size);
79 if (mem) {
80 memset(mem, 0, size);
81 adr = (unsigned long) mem;
82 while (size > 0) {
83 SetPageReserved(vmalloc_to_page((void *)adr));
84 adr += PAGE_SIZE;
85 size -= PAGE_SIZE;
88 return mem;
91 static void rvfree(void * mem, unsigned long size)
93 unsigned long adr;
95 if (mem) {
96 adr = (unsigned long) mem;
97 while ((long) size > 0) {
98 ClearPageReserved(vmalloc_to_page((void *)adr));
99 adr += PAGE_SIZE;
100 size -= PAGE_SIZE;
102 vfree(mem);
107 * return a page table pointing to N pages of locked memory
109 * NOTE: The meye device expects DMA addresses on 32 bits, we build
110 * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
112 static int ptable_alloc(void)
114 u32 *pt;
115 int i;
117 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
119 /* give only 32 bit DMA addresses */
120 if (dma_set_mask(&meye.mchip_dev->dev, DMA_BIT_MASK(32)))
121 return -1;
123 meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
124 PAGE_SIZE,
125 &meye.mchip_dmahandle,
126 GFP_KERNEL);
127 if (!meye.mchip_ptable_toc) {
128 meye.mchip_dmahandle = 0;
129 return -1;
132 pt = meye.mchip_ptable_toc;
133 for (i = 0; i < MCHIP_NB_PAGES; i++) {
134 dma_addr_t dma;
135 meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
136 PAGE_SIZE,
137 &dma,
138 GFP_KERNEL);
139 if (!meye.mchip_ptable[i]) {
140 int j;
141 pt = meye.mchip_ptable_toc;
142 for (j = 0; j < i; ++j) {
143 dma = (dma_addr_t) *pt;
144 dma_free_coherent(&meye.mchip_dev->dev,
145 PAGE_SIZE,
146 meye.mchip_ptable[j], dma);
147 pt++;
149 dma_free_coherent(&meye.mchip_dev->dev,
150 PAGE_SIZE,
151 meye.mchip_ptable_toc,
152 meye.mchip_dmahandle);
153 meye.mchip_ptable_toc = NULL;
154 meye.mchip_dmahandle = 0;
155 return -1;
157 *pt = (u32) dma;
158 pt++;
160 return 0;
163 static void ptable_free(void)
165 u32 *pt;
166 int i;
168 pt = meye.mchip_ptable_toc;
169 for (i = 0; i < MCHIP_NB_PAGES; i++) {
170 dma_addr_t dma = (dma_addr_t) *pt;
171 if (meye.mchip_ptable[i])
172 dma_free_coherent(&meye.mchip_dev->dev,
173 PAGE_SIZE,
174 meye.mchip_ptable[i], dma);
175 pt++;
178 if (meye.mchip_ptable_toc)
179 dma_free_coherent(&meye.mchip_dev->dev,
180 PAGE_SIZE,
181 meye.mchip_ptable_toc,
182 meye.mchip_dmahandle);
184 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
185 meye.mchip_ptable_toc = NULL;
186 meye.mchip_dmahandle = 0;
189 /* copy data from ptable into buf */
190 static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
192 int i;
194 for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
195 memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
196 if (start >= pt_pages)
197 start = 0;
199 memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
202 /****************************************************************************/
203 /* JPEG tables at different qualities to load into the VRJ chip */
204 /****************************************************************************/
206 /* return a set of quantisation tables based on a quality from 1 to 10 */
207 static u16 *jpeg_quantisation_tables(int *length, int quality)
209 static u16 jpeg_tables[][70] = { {
210 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
211 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
212 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
213 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
214 0xffff, 0xffff, 0xffff,
215 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
216 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
217 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
218 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
219 0xffff, 0xffff, 0xffff,
222 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
223 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
224 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
225 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
226 0xffff, 0xffff, 0xffff,
227 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
228 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
229 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
230 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
231 0xffff, 0xffff, 0xffff,
234 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
235 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
236 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
237 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
238 0xe6ff, 0xfffd, 0xfff8,
239 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
240 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
241 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
242 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
243 0xf8f8, 0xf8f8, 0xfff8,
246 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
247 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
248 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
249 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
250 0x99c7, 0xaba8, 0xffa4,
251 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
252 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
253 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
254 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
255 0xa4a4, 0xa4a4, 0xffa4,
258 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
259 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
260 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
261 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
262 0x7396, 0x817e, 0xff7c,
263 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
264 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
265 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
266 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
267 0x7c7c, 0x7c7c, 0xff7c,
270 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
271 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
272 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
273 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
274 0x5c78, 0x6765, 0xff63,
275 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
276 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
277 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
278 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
279 0x6363, 0x6363, 0xff63,
282 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
283 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
284 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
285 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
286 0x4a60, 0x5251, 0xff4f,
287 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
288 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
289 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
290 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
291 0x4f4f, 0x4f4f, 0xff4f,
294 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
295 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
296 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
297 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
298 0x3748, 0x3e3d, 0xff3b,
299 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
300 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
301 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
302 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
303 0x3b3b, 0x3b3b, 0xff3b,
306 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
307 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
308 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
309 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
310 0x2530, 0x2928, 0xff28,
311 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
312 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
313 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
314 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
315 0x2828, 0x2828, 0xff28,
318 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
319 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
320 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
321 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
322 0x1218, 0x1514, 0xff14,
323 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
324 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
325 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
326 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
327 0x1414, 0x1414, 0xff14,
330 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
331 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
332 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
333 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
334 0x0101, 0x0101, 0xff01,
335 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
336 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
337 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
338 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
339 0x0101, 0x0101, 0xff01,
340 } };
342 if (quality < 0 || quality > 10) {
343 printk(KERN_WARNING
344 "meye: invalid quality level %d - using 8\n", quality);
345 quality = 8;
348 *length = ARRAY_SIZE(jpeg_tables[quality]);
349 return jpeg_tables[quality];
352 /* return a generic set of huffman tables */
353 static u16 *jpeg_huffman_tables(int *length)
355 static u16 tables[] = {
356 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
357 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
358 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
359 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
360 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
361 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
362 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
363 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
364 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
365 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
366 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
367 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
368 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
369 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
370 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
371 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
372 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
373 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
374 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
375 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
376 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
377 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
378 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
379 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
380 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
381 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
382 0xFF0B,
383 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
384 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
385 0xFF0B
388 *length = ARRAY_SIZE(tables);
389 return tables;
392 /****************************************************************************/
393 /* MCHIP low-level functions */
394 /****************************************************************************/
396 /* returns the horizontal capture size */
397 static inline int mchip_hsize(void)
399 return meye.params.subsample ? 320 : 640;
402 /* returns the vertical capture size */
403 static inline int mchip_vsize(void)
405 return meye.params.subsample ? 240 : 480;
408 /* waits for a register to be available */
409 static void mchip_sync(int reg)
411 u32 status;
412 int i;
414 if (reg == MCHIP_MM_FIFO_DATA) {
415 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
416 status = readl(meye.mchip_mmregs +
417 MCHIP_MM_FIFO_STATUS);
418 if (!(status & MCHIP_MM_FIFO_WAIT)) {
419 printk(KERN_WARNING "meye: fifo not ready\n");
420 return;
422 if (status & MCHIP_MM_FIFO_READY)
423 return;
424 udelay(1);
426 } else if (reg > 0x80) {
427 u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
428 : MCHIP_HIC_STATUS_VRJ_RDY;
429 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
430 status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
431 if (status & mask)
432 return;
433 udelay(1);
435 } else
436 return;
437 printk(KERN_WARNING
438 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
439 reg, status);
442 /* sets a value into the register */
443 static inline void mchip_set(int reg, u32 v)
445 mchip_sync(reg);
446 writel(v, meye.mchip_mmregs + reg);
449 /* get the register value */
450 static inline u32 mchip_read(int reg)
452 mchip_sync(reg);
453 return readl(meye.mchip_mmregs + reg);
456 /* wait for a register to become a particular value */
457 static inline int mchip_delay(u32 reg, u32 v)
459 int n = 10;
460 while (--n && mchip_read(reg) != v)
461 udelay(1);
462 return n;
465 /* setup subsampling */
466 static void mchip_subsample(void)
468 mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
469 mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
470 mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
471 mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
472 mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
473 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
476 /* set the framerate into the mchip */
477 static void mchip_set_framerate(void)
479 mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
482 /* load some huffman and quantisation tables into the VRJ chip ready
483 for JPEG compression */
484 static void mchip_load_tables(void)
486 int i;
487 int length;
488 u16 *tables;
490 tables = jpeg_huffman_tables(&length);
491 for (i = 0; i < length; i++)
492 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
494 tables = jpeg_quantisation_tables(&length, meye.params.quality);
495 for (i = 0; i < length; i++)
496 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
499 /* setup the VRJ parameters in the chip */
500 static void mchip_vrj_setup(u8 mode)
502 mchip_set(MCHIP_VRJ_BUS_MODE, 5);
503 mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
504 mchip_set(MCHIP_VRJ_PDAT_USE, 1);
505 mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
506 mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
507 mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
508 mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
509 mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
510 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
511 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
512 mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
513 mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
514 mchip_set(MCHIP_VRJ_SOF1, 0x601);
515 mchip_set(MCHIP_VRJ_SOF2, 0x1502);
516 mchip_set(MCHIP_VRJ_SOF3, 0x1503);
517 mchip_set(MCHIP_VRJ_SOF4, 0x1596);
518 mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
520 mchip_load_tables();
523 /* sets the DMA parameters into the chip */
524 static void mchip_dma_setup(dma_addr_t dma_addr)
526 int i;
528 mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
529 for (i = 0; i < 4; i++)
530 mchip_set(MCHIP_MM_FIR(i), 0);
531 meye.mchip_fnum = 0;
534 /* setup for DMA transfers - also zeros the framebuffer */
535 static int mchip_dma_alloc(void)
537 if (!meye.mchip_dmahandle)
538 if (ptable_alloc())
539 return -1;
540 return 0;
543 /* frees the DMA buffer */
544 static void mchip_dma_free(void)
546 if (meye.mchip_dmahandle) {
547 mchip_dma_setup(0);
548 ptable_free();
552 /* stop any existing HIC action and wait for any dma to complete then
553 reset the dma engine */
554 static void mchip_hic_stop(void)
556 int i, j;
558 meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
559 if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
560 return;
561 for (i = 0; i < 20; ++i) {
562 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
563 mchip_delay(MCHIP_HIC_CMD, 0);
564 for (j = 0; j < 100; ++j) {
565 if (mchip_delay(MCHIP_HIC_STATUS,
566 MCHIP_HIC_STATUS_IDLE))
567 return;
568 msleep(1);
570 printk(KERN_ERR "meye: need to reset HIC!\n");
572 mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
573 msleep(250);
575 printk(KERN_ERR "meye: resetting HIC hanged!\n");
578 /****************************************************************************/
579 /* MCHIP frame processing functions */
580 /****************************************************************************/
582 /* get the next ready frame from the dma engine */
583 static u32 mchip_get_frame(void)
585 return mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
588 /* frees the current frame from the dma engine */
589 static void mchip_free_frame(void)
591 mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
592 meye.mchip_fnum++;
593 meye.mchip_fnum %= 4;
596 /* read one frame from the framebuffer assuming it was captured using
597 a uncompressed transfer */
598 static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
600 int pt_id;
602 pt_id = (v >> 17) & 0x3FF;
604 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
607 /* read a compressed frame from the framebuffer */
608 static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
610 int pt_start, pt_end, trailer;
611 int fsize;
612 int i;
614 pt_start = (v >> 19) & 0xFF;
615 pt_end = (v >> 11) & 0xFF;
616 trailer = (v >> 1) & 0x3FF;
618 if (pt_end < pt_start)
619 fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
620 pt_end * PAGE_SIZE + trailer * 4;
621 else
622 fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
624 if (fsize > size) {
625 printk(KERN_WARNING "meye: oversized compressed frame %d\n",
626 fsize);
627 return -1;
630 ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
632 #ifdef MEYE_JPEG_CORRECTION
634 /* Some mchip generated jpeg frames are incorrect. In most
635 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
636 * is not present at the end of the frame.
638 * Since adding the final marker is not enough to restore
639 * the jpeg integrity, we drop the frame.
642 for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
644 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
645 return -1;
647 #endif
649 return fsize;
652 /* take a picture into SDRAM */
653 static void mchip_take_picture(void)
655 int i;
657 mchip_hic_stop();
658 mchip_subsample();
659 mchip_dma_setup(meye.mchip_dmahandle);
661 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
662 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
664 mchip_delay(MCHIP_HIC_CMD, 0);
666 for (i = 0; i < 100; ++i) {
667 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
668 break;
669 msleep(1);
673 /* dma a previously taken picture into a buffer */
674 static void mchip_get_picture(u8 *buf, int bufsize)
676 u32 v;
677 int i;
679 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
680 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
682 mchip_delay(MCHIP_HIC_CMD, 0);
683 for (i = 0; i < 100; ++i) {
684 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
685 break;
686 msleep(1);
688 for (i = 0; i < 4; ++i) {
689 v = mchip_get_frame();
690 if (v & MCHIP_MM_FIR_RDY) {
691 mchip_cont_read_frame(v, buf, bufsize);
692 break;
694 mchip_free_frame();
698 /* start continuous dma capture */
699 static void mchip_continuous_start(void)
701 mchip_hic_stop();
702 mchip_subsample();
703 mchip_set_framerate();
704 mchip_dma_setup(meye.mchip_dmahandle);
706 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
708 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
709 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
711 mchip_delay(MCHIP_HIC_CMD, 0);
714 /* compress one frame into a buffer */
715 static int mchip_compress_frame(u8 *buf, int bufsize)
717 u32 v;
718 int len = -1, i;
720 mchip_vrj_setup(0x3f);
721 udelay(50);
723 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
724 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
726 mchip_delay(MCHIP_HIC_CMD, 0);
727 for (i = 0; i < 100; ++i) {
728 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
729 break;
730 msleep(1);
733 for (i = 0; i < 4; ++i) {
734 v = mchip_get_frame();
735 if (v & MCHIP_MM_FIR_RDY) {
736 len = mchip_comp_read_frame(v, buf, bufsize);
737 break;
739 mchip_free_frame();
741 return len;
744 #if 0
745 /* uncompress one image into a buffer */
746 static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
748 mchip_vrj_setup(0x3f);
749 udelay(50);
751 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
752 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
754 mchip_delay(MCHIP_HIC_CMD, 0);
756 return mchip_comp_read_frame(buf, bufsize);
758 #endif
760 /* start continuous compressed capture */
761 static void mchip_cont_compression_start(void)
763 mchip_hic_stop();
764 mchip_vrj_setup(0x3f);
765 mchip_subsample();
766 mchip_set_framerate();
767 mchip_dma_setup(meye.mchip_dmahandle);
769 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
771 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
772 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
774 mchip_delay(MCHIP_HIC_CMD, 0);
777 /****************************************************************************/
778 /* Interrupt handling */
779 /****************************************************************************/
781 static irqreturn_t meye_irq(int irq, void *dev_id)
783 u32 v;
784 int reqnr;
785 static int sequence;
787 v = mchip_read(MCHIP_MM_INTA);
789 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
790 meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
791 return IRQ_NONE;
793 again:
794 v = mchip_get_frame();
795 if (!(v & MCHIP_MM_FIR_RDY))
796 return IRQ_HANDLED;
798 if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
799 if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
800 sizeof(int), &meye.grabq_lock) != sizeof(int)) {
801 mchip_free_frame();
802 return IRQ_HANDLED;
804 mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
805 mchip_hsize() * mchip_vsize() * 2);
806 meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
807 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
808 v4l2_get_timestamp(&meye.grab_buffer[reqnr].timestamp);
809 meye.grab_buffer[reqnr].sequence = sequence++;
810 kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
811 sizeof(int), &meye.doneq_lock);
812 wake_up_interruptible(&meye.proc_list);
813 } else {
814 int size;
815 size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
816 if (size == -1) {
817 mchip_free_frame();
818 goto again;
820 if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
821 sizeof(int), &meye.grabq_lock) != sizeof(int)) {
822 mchip_free_frame();
823 goto again;
825 memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
826 size);
827 meye.grab_buffer[reqnr].size = size;
828 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
829 v4l2_get_timestamp(&meye.grab_buffer[reqnr].timestamp);
830 meye.grab_buffer[reqnr].sequence = sequence++;
831 kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
832 sizeof(int), &meye.doneq_lock);
833 wake_up_interruptible(&meye.proc_list);
835 mchip_free_frame();
836 goto again;
839 /****************************************************************************/
840 /* video4linux integration */
841 /****************************************************************************/
843 static int meye_open(struct file *file)
845 int i;
847 if (test_and_set_bit(0, &meye.in_use))
848 return -EBUSY;
850 mchip_hic_stop();
852 if (mchip_dma_alloc()) {
853 printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
854 clear_bit(0, &meye.in_use);
855 return -ENOBUFS;
858 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
859 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
860 kfifo_reset(&meye.grabq);
861 kfifo_reset(&meye.doneq);
862 return v4l2_fh_open(file);
865 static int meye_release(struct file *file)
867 mchip_hic_stop();
868 mchip_dma_free();
869 clear_bit(0, &meye.in_use);
870 return v4l2_fh_release(file);
873 static int meyeioc_g_params(struct meye_params *p)
875 *p = meye.params;
876 return 0;
879 static int meyeioc_s_params(struct meye_params *jp)
881 if (jp->subsample > 1)
882 return -EINVAL;
884 if (jp->quality > 10)
885 return -EINVAL;
887 if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
888 return -EINVAL;
890 if (jp->framerate > 31)
891 return -EINVAL;
893 mutex_lock(&meye.lock);
895 if (meye.params.subsample != jp->subsample ||
896 meye.params.quality != jp->quality)
897 mchip_hic_stop(); /* need restart */
899 meye.params = *jp;
900 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS,
901 meye.params.sharpness);
902 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC,
903 meye.params.agc);
904 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE,
905 meye.params.picture);
906 mutex_unlock(&meye.lock);
908 return 0;
911 static int meyeioc_qbuf_capt(int *nb)
913 if (!meye.grab_fbuffer)
914 return -EINVAL;
916 if (*nb >= gbuffers)
917 return -EINVAL;
919 if (*nb < 0) {
920 /* stop capture */
921 mchip_hic_stop();
922 return 0;
925 if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
926 return -EBUSY;
928 mutex_lock(&meye.lock);
930 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
931 mchip_cont_compression_start();
933 meye.grab_buffer[*nb].state = MEYE_BUF_USING;
934 kfifo_in_locked(&meye.grabq, (unsigned char *)nb, sizeof(int),
935 &meye.grabq_lock);
936 mutex_unlock(&meye.lock);
938 return 0;
941 static int meyeioc_sync(struct file *file, void *fh, int *i)
943 int unused;
945 if (*i < 0 || *i >= gbuffers)
946 return -EINVAL;
948 mutex_lock(&meye.lock);
949 switch (meye.grab_buffer[*i].state) {
951 case MEYE_BUF_UNUSED:
952 mutex_unlock(&meye.lock);
953 return -EINVAL;
954 case MEYE_BUF_USING:
955 if (file->f_flags & O_NONBLOCK) {
956 mutex_unlock(&meye.lock);
957 return -EAGAIN;
959 if (wait_event_interruptible(meye.proc_list,
960 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
961 mutex_unlock(&meye.lock);
962 return -EINTR;
964 /* fall through */
965 case MEYE_BUF_DONE:
966 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
967 if (kfifo_out_locked(&meye.doneq, (unsigned char *)&unused,
968 sizeof(int), &meye.doneq_lock) != sizeof(int))
969 break;
971 *i = meye.grab_buffer[*i].size;
972 mutex_unlock(&meye.lock);
973 return 0;
976 static int meyeioc_stillcapt(void)
978 if (!meye.grab_fbuffer)
979 return -EINVAL;
981 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
982 return -EBUSY;
984 mutex_lock(&meye.lock);
985 meye.grab_buffer[0].state = MEYE_BUF_USING;
986 mchip_take_picture();
988 mchip_get_picture(meye.grab_fbuffer,
989 mchip_hsize() * mchip_vsize() * 2);
991 meye.grab_buffer[0].state = MEYE_BUF_DONE;
992 mutex_unlock(&meye.lock);
994 return 0;
997 static int meyeioc_stilljcapt(int *len)
999 if (!meye.grab_fbuffer)
1000 return -EINVAL;
1002 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1003 return -EBUSY;
1005 mutex_lock(&meye.lock);
1006 meye.grab_buffer[0].state = MEYE_BUF_USING;
1007 *len = -1;
1009 while (*len == -1) {
1010 mchip_take_picture();
1011 *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1014 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1015 mutex_unlock(&meye.lock);
1016 return 0;
1019 static int vidioc_querycap(struct file *file, void *fh,
1020 struct v4l2_capability *cap)
1022 strcpy(cap->driver, "meye");
1023 strcpy(cap->card, "meye");
1024 sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1026 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
1027 V4L2_CAP_STREAMING;
1028 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
1030 return 0;
1033 static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1035 if (i->index != 0)
1036 return -EINVAL;
1038 strcpy(i->name, "Camera");
1039 i->type = V4L2_INPUT_TYPE_CAMERA;
1041 return 0;
1044 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1046 *i = 0;
1047 return 0;
1050 static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1052 if (i != 0)
1053 return -EINVAL;
1055 return 0;
1058 static int meye_s_ctrl(struct v4l2_ctrl *ctrl)
1060 mutex_lock(&meye.lock);
1061 switch (ctrl->id) {
1062 case V4L2_CID_BRIGHTNESS:
1063 sony_pic_camera_command(
1064 SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val);
1065 meye.brightness = ctrl->val << 10;
1066 break;
1067 case V4L2_CID_HUE:
1068 sony_pic_camera_command(
1069 SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val);
1070 meye.hue = ctrl->val << 10;
1071 break;
1072 case V4L2_CID_CONTRAST:
1073 sony_pic_camera_command(
1074 SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val);
1075 meye.contrast = ctrl->val << 10;
1076 break;
1077 case V4L2_CID_SATURATION:
1078 sony_pic_camera_command(
1079 SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val);
1080 meye.colour = ctrl->val << 10;
1081 break;
1082 case V4L2_CID_MEYE_AGC:
1083 sony_pic_camera_command(
1084 SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val);
1085 meye.params.agc = ctrl->val;
1086 break;
1087 case V4L2_CID_SHARPNESS:
1088 sony_pic_camera_command(
1089 SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val);
1090 meye.params.sharpness = ctrl->val;
1091 break;
1092 case V4L2_CID_MEYE_PICTURE:
1093 sony_pic_camera_command(
1094 SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val);
1095 meye.params.picture = ctrl->val;
1096 break;
1097 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1098 meye.params.quality = ctrl->val;
1099 break;
1100 case V4L2_CID_MEYE_FRAMERATE:
1101 meye.params.framerate = ctrl->val;
1102 break;
1103 default:
1104 mutex_unlock(&meye.lock);
1105 return -EINVAL;
1107 mutex_unlock(&meye.lock);
1109 return 0;
1112 static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1113 struct v4l2_fmtdesc *f)
1115 if (f->index > 1)
1116 return -EINVAL;
1118 if (f->index == 0) {
1119 /* standard YUV 422 capture */
1120 f->flags = 0;
1121 strcpy(f->description, "YUV422");
1122 f->pixelformat = V4L2_PIX_FMT_YUYV;
1123 } else {
1124 /* compressed MJPEG capture */
1125 f->flags = V4L2_FMT_FLAG_COMPRESSED;
1126 strcpy(f->description, "MJPEG");
1127 f->pixelformat = V4L2_PIX_FMT_MJPEG;
1130 return 0;
1133 static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1134 struct v4l2_format *f)
1136 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1137 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1138 return -EINVAL;
1140 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1141 f->fmt.pix.field != V4L2_FIELD_NONE)
1142 return -EINVAL;
1144 f->fmt.pix.field = V4L2_FIELD_NONE;
1146 if (f->fmt.pix.width <= 320) {
1147 f->fmt.pix.width = 320;
1148 f->fmt.pix.height = 240;
1149 } else {
1150 f->fmt.pix.width = 640;
1151 f->fmt.pix.height = 480;
1154 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1155 f->fmt.pix.sizeimage = f->fmt.pix.height *
1156 f->fmt.pix.bytesperline;
1157 f->fmt.pix.colorspace = 0;
1159 return 0;
1162 static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1163 struct v4l2_format *f)
1165 switch (meye.mchip_mode) {
1166 case MCHIP_HIC_MODE_CONT_OUT:
1167 default:
1168 f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1169 break;
1170 case MCHIP_HIC_MODE_CONT_COMP:
1171 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1172 break;
1175 f->fmt.pix.field = V4L2_FIELD_NONE;
1176 f->fmt.pix.width = mchip_hsize();
1177 f->fmt.pix.height = mchip_vsize();
1178 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1179 f->fmt.pix.sizeimage = f->fmt.pix.height *
1180 f->fmt.pix.bytesperline;
1182 return 0;
1185 static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1186 struct v4l2_format *f)
1188 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1189 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1190 return -EINVAL;
1192 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1193 f->fmt.pix.field != V4L2_FIELD_NONE)
1194 return -EINVAL;
1196 f->fmt.pix.field = V4L2_FIELD_NONE;
1197 mutex_lock(&meye.lock);
1199 if (f->fmt.pix.width <= 320) {
1200 f->fmt.pix.width = 320;
1201 f->fmt.pix.height = 240;
1202 meye.params.subsample = 1;
1203 } else {
1204 f->fmt.pix.width = 640;
1205 f->fmt.pix.height = 480;
1206 meye.params.subsample = 0;
1209 switch (f->fmt.pix.pixelformat) {
1210 case V4L2_PIX_FMT_YUYV:
1211 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1212 break;
1213 case V4L2_PIX_FMT_MJPEG:
1214 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1215 break;
1218 mutex_unlock(&meye.lock);
1219 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1220 f->fmt.pix.sizeimage = f->fmt.pix.height *
1221 f->fmt.pix.bytesperline;
1222 f->fmt.pix.colorspace = 0;
1224 return 0;
1227 static int vidioc_reqbufs(struct file *file, void *fh,
1228 struct v4l2_requestbuffers *req)
1230 int i;
1232 if (req->memory != V4L2_MEMORY_MMAP)
1233 return -EINVAL;
1235 if (meye.grab_fbuffer && req->count == gbuffers) {
1236 /* already allocated, no modifications */
1237 return 0;
1240 mutex_lock(&meye.lock);
1241 if (meye.grab_fbuffer) {
1242 for (i = 0; i < gbuffers; i++)
1243 if (meye.vma_use_count[i]) {
1244 mutex_unlock(&meye.lock);
1245 return -EINVAL;
1247 rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1248 meye.grab_fbuffer = NULL;
1251 gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1252 req->count = gbuffers;
1253 meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1255 if (!meye.grab_fbuffer) {
1256 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1257 mutex_unlock(&meye.lock);
1258 return -ENOMEM;
1261 for (i = 0; i < gbuffers; i++)
1262 meye.vma_use_count[i] = 0;
1264 mutex_unlock(&meye.lock);
1266 return 0;
1269 static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1271 unsigned int index = buf->index;
1273 if (index >= gbuffers)
1274 return -EINVAL;
1276 buf->bytesused = meye.grab_buffer[index].size;
1277 buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1279 if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1280 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1282 if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1283 buf->flags |= V4L2_BUF_FLAG_DONE;
1285 buf->field = V4L2_FIELD_NONE;
1286 buf->timestamp = meye.grab_buffer[index].timestamp;
1287 buf->sequence = meye.grab_buffer[index].sequence;
1288 buf->memory = V4L2_MEMORY_MMAP;
1289 buf->m.offset = index * gbufsize;
1290 buf->length = gbufsize;
1292 return 0;
1295 static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1297 if (buf->memory != V4L2_MEMORY_MMAP)
1298 return -EINVAL;
1300 if (buf->index >= gbuffers)
1301 return -EINVAL;
1303 if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1304 return -EINVAL;
1306 mutex_lock(&meye.lock);
1307 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1308 buf->flags &= ~V4L2_BUF_FLAG_DONE;
1309 meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1310 kfifo_in_locked(&meye.grabq, (unsigned char *)&buf->index,
1311 sizeof(int), &meye.grabq_lock);
1312 mutex_unlock(&meye.lock);
1314 return 0;
1317 static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1319 int reqnr;
1321 if (buf->memory != V4L2_MEMORY_MMAP)
1322 return -EINVAL;
1324 mutex_lock(&meye.lock);
1326 if (kfifo_len(&meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1327 mutex_unlock(&meye.lock);
1328 return -EAGAIN;
1331 if (wait_event_interruptible(meye.proc_list,
1332 kfifo_len(&meye.doneq) != 0) < 0) {
1333 mutex_unlock(&meye.lock);
1334 return -EINTR;
1337 if (!kfifo_out_locked(&meye.doneq, (unsigned char *)&reqnr,
1338 sizeof(int), &meye.doneq_lock)) {
1339 mutex_unlock(&meye.lock);
1340 return -EBUSY;
1343 if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1344 mutex_unlock(&meye.lock);
1345 return -EINVAL;
1348 buf->index = reqnr;
1349 buf->bytesused = meye.grab_buffer[reqnr].size;
1350 buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1351 buf->field = V4L2_FIELD_NONE;
1352 buf->timestamp = meye.grab_buffer[reqnr].timestamp;
1353 buf->sequence = meye.grab_buffer[reqnr].sequence;
1354 buf->memory = V4L2_MEMORY_MMAP;
1355 buf->m.offset = reqnr * gbufsize;
1356 buf->length = gbufsize;
1357 meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1358 mutex_unlock(&meye.lock);
1360 return 0;
1363 static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1365 mutex_lock(&meye.lock);
1367 switch (meye.mchip_mode) {
1368 case MCHIP_HIC_MODE_CONT_OUT:
1369 mchip_continuous_start();
1370 break;
1371 case MCHIP_HIC_MODE_CONT_COMP:
1372 mchip_cont_compression_start();
1373 break;
1374 default:
1375 mutex_unlock(&meye.lock);
1376 return -EINVAL;
1379 mutex_unlock(&meye.lock);
1381 return 0;
1384 static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1386 mutex_lock(&meye.lock);
1387 mchip_hic_stop();
1388 kfifo_reset(&meye.grabq);
1389 kfifo_reset(&meye.doneq);
1391 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1392 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1394 mutex_unlock(&meye.lock);
1395 return 0;
1398 static long vidioc_default(struct file *file, void *fh, bool valid_prio,
1399 unsigned int cmd, void *arg)
1401 switch (cmd) {
1402 case MEYEIOC_G_PARAMS:
1403 return meyeioc_g_params((struct meye_params *) arg);
1405 case MEYEIOC_S_PARAMS:
1406 return meyeioc_s_params((struct meye_params *) arg);
1408 case MEYEIOC_QBUF_CAPT:
1409 return meyeioc_qbuf_capt((int *) arg);
1411 case MEYEIOC_SYNC:
1412 return meyeioc_sync(file, fh, (int *) arg);
1414 case MEYEIOC_STILLCAPT:
1415 return meyeioc_stillcapt();
1417 case MEYEIOC_STILLJCAPT:
1418 return meyeioc_stilljcapt((int *) arg);
1420 default:
1421 return -ENOTTY;
1426 static __poll_t meye_poll(struct file *file, poll_table *wait)
1428 __poll_t res = v4l2_ctrl_poll(file, wait);
1430 mutex_lock(&meye.lock);
1431 poll_wait(file, &meye.proc_list, wait);
1432 if (kfifo_len(&meye.doneq))
1433 res |= EPOLLIN | EPOLLRDNORM;
1434 mutex_unlock(&meye.lock);
1435 return res;
1438 static void meye_vm_open(struct vm_area_struct *vma)
1440 long idx = (long)vma->vm_private_data;
1441 meye.vma_use_count[idx]++;
1444 static void meye_vm_close(struct vm_area_struct *vma)
1446 long idx = (long)vma->vm_private_data;
1447 meye.vma_use_count[idx]--;
1450 static const struct vm_operations_struct meye_vm_ops = {
1451 .open = meye_vm_open,
1452 .close = meye_vm_close,
1455 static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1457 unsigned long start = vma->vm_start;
1458 unsigned long size = vma->vm_end - vma->vm_start;
1459 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1460 unsigned long page, pos;
1462 mutex_lock(&meye.lock);
1463 if (size > gbuffers * gbufsize) {
1464 mutex_unlock(&meye.lock);
1465 return -EINVAL;
1467 if (!meye.grab_fbuffer) {
1468 int i;
1470 /* lazy allocation */
1471 meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1472 if (!meye.grab_fbuffer) {
1473 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1474 mutex_unlock(&meye.lock);
1475 return -ENOMEM;
1477 for (i = 0; i < gbuffers; i++)
1478 meye.vma_use_count[i] = 0;
1480 pos = (unsigned long)meye.grab_fbuffer + offset;
1482 while (size > 0) {
1483 page = vmalloc_to_pfn((void *)pos);
1484 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1485 mutex_unlock(&meye.lock);
1486 return -EAGAIN;
1488 start += PAGE_SIZE;
1489 pos += PAGE_SIZE;
1490 if (size > PAGE_SIZE)
1491 size -= PAGE_SIZE;
1492 else
1493 size = 0;
1496 vma->vm_ops = &meye_vm_ops;
1497 vma->vm_flags &= ~VM_IO; /* not I/O memory */
1498 vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1499 vma->vm_private_data = (void *) (offset / gbufsize);
1500 meye_vm_open(vma);
1502 mutex_unlock(&meye.lock);
1503 return 0;
1506 static const struct v4l2_file_operations meye_fops = {
1507 .owner = THIS_MODULE,
1508 .open = meye_open,
1509 .release = meye_release,
1510 .mmap = meye_mmap,
1511 .unlocked_ioctl = video_ioctl2,
1512 .poll = meye_poll,
1515 static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1516 .vidioc_querycap = vidioc_querycap,
1517 .vidioc_enum_input = vidioc_enum_input,
1518 .vidioc_g_input = vidioc_g_input,
1519 .vidioc_s_input = vidioc_s_input,
1520 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1521 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1522 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1523 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1524 .vidioc_reqbufs = vidioc_reqbufs,
1525 .vidioc_querybuf = vidioc_querybuf,
1526 .vidioc_qbuf = vidioc_qbuf,
1527 .vidioc_dqbuf = vidioc_dqbuf,
1528 .vidioc_streamon = vidioc_streamon,
1529 .vidioc_streamoff = vidioc_streamoff,
1530 .vidioc_log_status = v4l2_ctrl_log_status,
1531 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1532 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1533 .vidioc_default = vidioc_default,
1536 static const struct video_device meye_template = {
1537 .name = "meye",
1538 .fops = &meye_fops,
1539 .ioctl_ops = &meye_ioctl_ops,
1540 .release = video_device_release_empty,
1543 static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1544 .s_ctrl = meye_s_ctrl,
1547 #ifdef CONFIG_PM
1548 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1550 pci_save_state(pdev);
1551 meye.pm_mchip_mode = meye.mchip_mode;
1552 mchip_hic_stop();
1553 mchip_set(MCHIP_MM_INTA, 0x0);
1554 return 0;
1557 static int meye_resume(struct pci_dev *pdev)
1559 pci_restore_state(pdev);
1560 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1562 mchip_delay(MCHIP_HIC_CMD, 0);
1563 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1564 msleep(1);
1565 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1566 msleep(1);
1567 mchip_set(MCHIP_MM_PCI_MODE, 5);
1568 msleep(1);
1569 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1571 switch (meye.pm_mchip_mode) {
1572 case MCHIP_HIC_MODE_CONT_OUT:
1573 mchip_continuous_start();
1574 break;
1575 case MCHIP_HIC_MODE_CONT_COMP:
1576 mchip_cont_compression_start();
1577 break;
1579 return 0;
1581 #endif
1583 static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1585 static const struct v4l2_ctrl_config ctrl_agc = {
1586 .id = V4L2_CID_MEYE_AGC,
1587 .type = V4L2_CTRL_TYPE_INTEGER,
1588 .ops = &meye_ctrl_ops,
1589 .name = "AGC",
1590 .max = 63,
1591 .step = 1,
1592 .def = 48,
1593 .flags = V4L2_CTRL_FLAG_SLIDER,
1595 static const struct v4l2_ctrl_config ctrl_picture = {
1596 .id = V4L2_CID_MEYE_PICTURE,
1597 .type = V4L2_CTRL_TYPE_INTEGER,
1598 .ops = &meye_ctrl_ops,
1599 .name = "Picture",
1600 .max = 63,
1601 .step = 1,
1603 static const struct v4l2_ctrl_config ctrl_framerate = {
1604 .id = V4L2_CID_MEYE_FRAMERATE,
1605 .type = V4L2_CTRL_TYPE_INTEGER,
1606 .ops = &meye_ctrl_ops,
1607 .name = "Framerate",
1608 .max = 31,
1609 .step = 1,
1611 struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
1612 int ret = -EBUSY;
1613 unsigned long mchip_adr;
1615 if (meye.mchip_dev != NULL) {
1616 printk(KERN_ERR "meye: only one device allowed!\n");
1617 return ret;
1620 ret = v4l2_device_register(&pcidev->dev, v4l2_dev);
1621 if (ret < 0) {
1622 v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
1623 return ret;
1625 ret = -ENOMEM;
1626 meye.mchip_dev = pcidev;
1628 meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
1629 if (!meye.grab_temp)
1630 goto outvmalloc;
1632 spin_lock_init(&meye.grabq_lock);
1633 if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS,
1634 GFP_KERNEL))
1635 goto outkfifoalloc1;
1637 spin_lock_init(&meye.doneq_lock);
1638 if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS,
1639 GFP_KERNEL))
1640 goto outkfifoalloc2;
1642 meye.vdev = meye_template;
1643 meye.vdev.v4l2_dev = &meye.v4l2_dev;
1645 ret = sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 1);
1646 if (ret) {
1647 v4l2_err(v4l2_dev, "meye: unable to power on the camera\n");
1648 v4l2_err(v4l2_dev, "meye: did you enable the camera in sonypi using the module options ?\n");
1649 goto outsonypienable;
1652 ret = pci_enable_device(meye.mchip_dev);
1653 if (ret) {
1654 v4l2_err(v4l2_dev, "meye: pci_enable_device failed\n");
1655 goto outenabledev;
1658 ret = -EIO;
1659 mchip_adr = pci_resource_start(meye.mchip_dev,0);
1660 if (!mchip_adr) {
1661 v4l2_err(v4l2_dev, "meye: mchip has no device base address\n");
1662 goto outregions;
1664 if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1665 pci_resource_len(meye.mchip_dev, 0),
1666 "meye")) {
1667 v4l2_err(v4l2_dev, "meye: request_mem_region failed\n");
1668 goto outregions;
1670 meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1671 if (!meye.mchip_mmregs) {
1672 v4l2_err(v4l2_dev, "meye: ioremap failed\n");
1673 goto outremap;
1676 meye.mchip_irq = pcidev->irq;
1677 if (request_irq(meye.mchip_irq, meye_irq,
1678 IRQF_SHARED, "meye", meye_irq)) {
1679 v4l2_err(v4l2_dev, "request_irq failed\n");
1680 goto outreqirq;
1683 pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1684 pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1686 pci_set_master(meye.mchip_dev);
1688 /* Ask the camera to perform a soft reset. */
1689 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1691 mchip_delay(MCHIP_HIC_CMD, 0);
1692 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1694 msleep(1);
1695 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1697 msleep(1);
1698 mchip_set(MCHIP_MM_PCI_MODE, 5);
1700 msleep(1);
1701 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1703 mutex_init(&meye.lock);
1704 init_waitqueue_head(&meye.proc_list);
1706 v4l2_ctrl_handler_init(&meye.hdl, 3);
1707 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1708 V4L2_CID_BRIGHTNESS, 0, 63, 1, 32);
1709 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1710 V4L2_CID_HUE, 0, 63, 1, 32);
1711 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1712 V4L2_CID_CONTRAST, 0, 63, 1, 32);
1713 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1714 V4L2_CID_SATURATION, 0, 63, 1, 32);
1715 v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL);
1716 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1717 V4L2_CID_SHARPNESS, 0, 63, 1, 32);
1718 v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL);
1719 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1720 V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8);
1721 v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL);
1722 if (meye.hdl.error) {
1723 v4l2_err(v4l2_dev, "couldn't register controls\n");
1724 goto outvideoreg;
1727 v4l2_ctrl_handler_setup(&meye.hdl);
1728 meye.vdev.ctrl_handler = &meye.hdl;
1730 if (video_register_device(&meye.vdev, VFL_TYPE_GRABBER,
1731 video_nr) < 0) {
1732 v4l2_err(v4l2_dev, "video_register_device failed\n");
1733 goto outvideoreg;
1736 v4l2_info(v4l2_dev, "Motion Eye Camera Driver v%s.\n",
1737 MEYE_DRIVER_VERSION);
1738 v4l2_info(v4l2_dev, "mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1739 meye.mchip_dev->revision, mchip_adr, meye.mchip_irq);
1741 return 0;
1743 outvideoreg:
1744 v4l2_ctrl_handler_free(&meye.hdl);
1745 free_irq(meye.mchip_irq, meye_irq);
1746 outreqirq:
1747 iounmap(meye.mchip_mmregs);
1748 outremap:
1749 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1750 pci_resource_len(meye.mchip_dev, 0));
1751 outregions:
1752 pci_disable_device(meye.mchip_dev);
1753 outenabledev:
1754 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1755 outsonypienable:
1756 kfifo_free(&meye.doneq);
1757 outkfifoalloc2:
1758 kfifo_free(&meye.grabq);
1759 outkfifoalloc1:
1760 vfree(meye.grab_temp);
1761 outvmalloc:
1762 return ret;
1765 static void meye_remove(struct pci_dev *pcidev)
1767 video_unregister_device(&meye.vdev);
1769 mchip_hic_stop();
1771 mchip_dma_free();
1773 /* disable interrupts */
1774 mchip_set(MCHIP_MM_INTA, 0x0);
1776 free_irq(meye.mchip_irq, meye_irq);
1778 iounmap(meye.mchip_mmregs);
1780 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1781 pci_resource_len(meye.mchip_dev, 0));
1783 pci_disable_device(meye.mchip_dev);
1785 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1787 kfifo_free(&meye.doneq);
1788 kfifo_free(&meye.grabq);
1790 vfree(meye.grab_temp);
1792 if (meye.grab_fbuffer) {
1793 rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1794 meye.grab_fbuffer = NULL;
1797 printk(KERN_INFO "meye: removed\n");
1800 static const struct pci_device_id meye_pci_tbl[] = {
1801 { PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1805 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1807 static struct pci_driver meye_driver = {
1808 .name = "meye",
1809 .id_table = meye_pci_tbl,
1810 .probe = meye_probe,
1811 .remove = meye_remove,
1812 #ifdef CONFIG_PM
1813 .suspend = meye_suspend,
1814 .resume = meye_resume,
1815 #endif
1818 static int __init meye_init(void)
1820 gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
1821 if (gbufsize > MEYE_MAX_BUFSIZE)
1822 gbufsize = MEYE_MAX_BUFSIZE;
1823 gbufsize = PAGE_ALIGN(gbufsize);
1824 printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n",
1825 gbuffers,
1826 gbufsize / 1024, gbuffers * gbufsize / 1024);
1827 return pci_register_driver(&meye_driver);
1830 static void __exit meye_exit(void)
1832 pci_unregister_driver(&meye_driver);
1835 module_init(meye_init);
1836 module_exit(meye_exit);