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 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #include <linux/module.h>
30 #include <linux/pci.h>
31 #include <linux/init.h>
32 #include <linux/videodev.h>
33 #include <media/v4l2-common.h>
34 #include <asm/uaccess.h>
36 #include <linux/delay.h>
37 #include <linux/interrupt.h>
38 #include <linux/vmalloc.h>
39 #include <linux/dma-mapping.h>
42 #include <linux/meye.h>
44 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
45 MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
46 MODULE_LICENSE("GPL");
47 MODULE_VERSION(MEYE_DRIVER_VERSION
);
49 /* number of grab buffers */
50 static unsigned int gbuffers
= 2;
51 module_param(gbuffers
, int, 0444);
52 MODULE_PARM_DESC(gbuffers
, "number of capture buffers, default is 2 (32 max)");
54 /* size of a grab buffer */
55 static unsigned int gbufsize
= MEYE_MAX_BUFSIZE
;
56 module_param(gbufsize
, int, 0444);
57 MODULE_PARM_DESC(gbufsize
, "size of the capture buffers, default is 614400"
58 " (will be rounded up to a page multiple)");
60 /* /dev/videoX registration number */
61 static int video_nr
= -1;
62 module_param(video_nr
, int, 0444);
63 MODULE_PARM_DESC(video_nr
, "video device to register (0=/dev/video0, etc)");
65 /* driver structure - only one possible */
66 static struct meye meye
;
68 /****************************************************************************/
69 /* Memory allocation routines (stolen from bttv-driver.c) */
70 /****************************************************************************/
71 static void *rvmalloc(unsigned long size
)
76 size
= PAGE_ALIGN(size
);
77 mem
= vmalloc_32(size
);
80 adr
= (unsigned long) mem
;
82 SetPageReserved(vmalloc_to_page((void *)adr
));
90 static void rvfree(void * mem
, unsigned long size
)
95 adr
= (unsigned long) mem
;
96 while ((long) size
> 0) {
97 ClearPageReserved(vmalloc_to_page((void *)adr
));
106 * return a page table pointing to N pages of locked memory
108 * NOTE: The meye device expects DMA addresses on 32 bits, we build
109 * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
111 static int ptable_alloc(void)
116 memset(meye
.mchip_ptable
, 0, sizeof(meye
.mchip_ptable
));
118 /* give only 32 bit DMA addresses */
119 if (dma_set_mask(&meye
.mchip_dev
->dev
, DMA_32BIT_MASK
))
122 meye
.mchip_ptable_toc
= dma_alloc_coherent(&meye
.mchip_dev
->dev
,
124 &meye
.mchip_dmahandle
,
126 if (!meye
.mchip_ptable_toc
) {
127 meye
.mchip_dmahandle
= 0;
131 pt
= meye
.mchip_ptable_toc
;
132 for (i
= 0; i
< MCHIP_NB_PAGES
; i
++) {
134 meye
.mchip_ptable
[i
] = dma_alloc_coherent(&meye
.mchip_dev
->dev
,
138 if (!meye
.mchip_ptable
[i
]) {
140 pt
= meye
.mchip_ptable_toc
;
141 for (j
= 0; j
< i
; ++j
) {
142 dma
= (dma_addr_t
) *pt
;
143 dma_free_coherent(&meye
.mchip_dev
->dev
,
145 meye
.mchip_ptable
[j
], dma
);
148 dma_free_coherent(&meye
.mchip_dev
->dev
,
150 meye
.mchip_ptable_toc
,
151 meye
.mchip_dmahandle
);
152 meye
.mchip_ptable_toc
= NULL
;
153 meye
.mchip_dmahandle
= 0;
162 static void ptable_free(void)
167 pt
= meye
.mchip_ptable_toc
;
168 for (i
= 0; i
< MCHIP_NB_PAGES
; i
++) {
169 dma_addr_t dma
= (dma_addr_t
) *pt
;
170 if (meye
.mchip_ptable
[i
])
171 dma_free_coherent(&meye
.mchip_dev
->dev
,
173 meye
.mchip_ptable
[i
], dma
);
177 if (meye
.mchip_ptable_toc
)
178 dma_free_coherent(&meye
.mchip_dev
->dev
,
180 meye
.mchip_ptable_toc
,
181 meye
.mchip_dmahandle
);
183 memset(meye
.mchip_ptable
, 0, sizeof(meye
.mchip_ptable
));
184 meye
.mchip_ptable_toc
= NULL
;
185 meye
.mchip_dmahandle
= 0;
188 /* copy data from ptable into buf */
189 static void ptable_copy(u8
*buf
, int start
, int size
, int pt_pages
)
193 for (i
= 0; i
< (size
/ PAGE_SIZE
) * PAGE_SIZE
; i
+= PAGE_SIZE
) {
194 memcpy(buf
+ i
, meye
.mchip_ptable
[start
++], PAGE_SIZE
);
195 if (start
>= pt_pages
)
198 memcpy(buf
+ i
, meye
.mchip_ptable
[start
], size
% PAGE_SIZE
);
201 /****************************************************************************/
202 /* JPEG tables at different qualities to load into the VRJ chip */
203 /****************************************************************************/
205 /* return a set of quantisation tables based on a quality from 1 to 10 */
206 static u16
*jpeg_quantisation_tables(int *length
, int quality
)
208 static u16 jpeg_tables
[][70] = { {
209 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
210 0xffff, 0xffff, 0xffff, 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,
214 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
215 0xffff, 0xffff, 0xffff, 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,
221 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
222 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
223 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
224 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
225 0xffff, 0xffff, 0xffff,
226 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
227 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
228 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
229 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
230 0xffff, 0xffff, 0xffff,
233 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
234 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
235 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
236 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
237 0xe6ff, 0xfffd, 0xfff8,
238 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
239 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
240 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
241 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
242 0xf8f8, 0xf8f8, 0xfff8,
245 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
246 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
247 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
248 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
249 0x99c7, 0xaba8, 0xffa4,
250 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
251 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
252 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
253 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
254 0xa4a4, 0xa4a4, 0xffa4,
257 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
258 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
259 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
260 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
261 0x7396, 0x817e, 0xff7c,
262 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
263 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
264 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
265 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
266 0x7c7c, 0x7c7c, 0xff7c,
269 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
270 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
271 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
272 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
273 0x5c78, 0x6765, 0xff63,
274 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
275 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
276 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
277 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
278 0x6363, 0x6363, 0xff63,
281 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
282 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
283 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
284 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
285 0x4a60, 0x5251, 0xff4f,
286 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
287 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
288 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
289 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
290 0x4f4f, 0x4f4f, 0xff4f,
293 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
294 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
295 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
296 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
297 0x3748, 0x3e3d, 0xff3b,
298 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
299 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
300 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
301 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
302 0x3b3b, 0x3b3b, 0xff3b,
305 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
306 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
307 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
308 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
309 0x2530, 0x2928, 0xff28,
310 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
311 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
312 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
313 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
314 0x2828, 0x2828, 0xff28,
317 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
318 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
319 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
320 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
321 0x1218, 0x1514, 0xff14,
322 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
323 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
324 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
325 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
326 0x1414, 0x1414, 0xff14,
329 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
330 0x0101, 0x0101, 0x0101, 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, 0xff01,
334 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
335 0x0101, 0x0101, 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, 0xff01,
341 if (quality
< 0 || quality
> 10) {
343 "meye: invalid quality level %d - using 8\n", quality
);
347 *length
= ARRAY_SIZE(jpeg_tables
[quality
]);
348 return jpeg_tables
[quality
];
351 /* return a generic set of huffman tables */
352 static u16
*jpeg_huffman_tables(int *length
)
354 static u16 tables
[] = {
355 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
356 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
357 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
358 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
359 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
360 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
361 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
362 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
363 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
364 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
365 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
366 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
367 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
368 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
369 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
370 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
371 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
372 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
373 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
374 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
375 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
376 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
377 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
378 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
379 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
380 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
382 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
383 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
387 *length
= ARRAY_SIZE(tables
);
391 /****************************************************************************/
392 /* MCHIP low-level functions */
393 /****************************************************************************/
395 /* returns the horizontal capture size */
396 static inline int mchip_hsize(void)
398 return meye
.params
.subsample
? 320 : 640;
401 /* returns the vertical capture size */
402 static inline int mchip_vsize(void)
404 return meye
.params
.subsample
? 240 : 480;
407 /* waits for a register to be available */
408 static void mchip_sync(int reg
)
413 if (reg
== MCHIP_MM_FIFO_DATA
) {
414 for (i
= 0; i
< MCHIP_REG_TIMEOUT
; i
++) {
415 status
= readl(meye
.mchip_mmregs
+
416 MCHIP_MM_FIFO_STATUS
);
417 if (!(status
& MCHIP_MM_FIFO_WAIT
)) {
418 printk(KERN_WARNING
"meye: fifo not ready\n");
421 if (status
& MCHIP_MM_FIFO_READY
)
425 } else if (reg
> 0x80) {
426 u32 mask
= (reg
< 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
427 : MCHIP_HIC_STATUS_VRJ_RDY
;
428 for (i
= 0; i
< MCHIP_REG_TIMEOUT
; i
++) {
429 status
= readl(meye
.mchip_mmregs
+ MCHIP_HIC_STATUS
);
437 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
441 /* sets a value into the register */
442 static inline void mchip_set(int reg
, u32 v
)
445 writel(v
, meye
.mchip_mmregs
+ reg
);
448 /* get the register value */
449 static inline u32
mchip_read(int reg
)
452 return readl(meye
.mchip_mmregs
+ reg
);
455 /* wait for a register to become a particular value */
456 static inline int mchip_delay(u32 reg
, u32 v
)
459 while (--n
&& mchip_read(reg
) != v
)
464 /* setup subsampling */
465 static void mchip_subsample(void)
467 mchip_set(MCHIP_MCC_R_SAMPLING
, meye
.params
.subsample
);
468 mchip_set(MCHIP_MCC_R_XRANGE
, mchip_hsize());
469 mchip_set(MCHIP_MCC_R_YRANGE
, mchip_vsize());
470 mchip_set(MCHIP_MCC_B_XRANGE
, mchip_hsize());
471 mchip_set(MCHIP_MCC_B_YRANGE
, mchip_vsize());
472 mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
);
475 /* set the framerate into the mchip */
476 static void mchip_set_framerate(void)
478 mchip_set(MCHIP_HIC_S_RATE
, meye
.params
.framerate
);
481 /* load some huffman and quantisation tables into the VRJ chip ready
482 for JPEG compression */
483 static void mchip_load_tables(void)
489 tables
= jpeg_huffman_tables(&length
);
490 for (i
= 0; i
< length
; i
++)
491 writel(tables
[i
], meye
.mchip_mmregs
+ MCHIP_VRJ_TABLE_DATA
);
493 tables
= jpeg_quantisation_tables(&length
, meye
.params
.quality
);
494 for (i
= 0; i
< length
; i
++)
495 writel(tables
[i
], meye
.mchip_mmregs
+ MCHIP_VRJ_TABLE_DATA
);
498 /* setup the VRJ parameters in the chip */
499 static void mchip_vrj_setup(u8 mode
)
501 mchip_set(MCHIP_VRJ_BUS_MODE
, 5);
502 mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL
, 0x1f);
503 mchip_set(MCHIP_VRJ_PDAT_USE
, 1);
504 mchip_set(MCHIP_VRJ_IRQ_FLAG
, 0xa0);
505 mchip_set(MCHIP_VRJ_MODE_SPECIFY
, mode
);
506 mchip_set(MCHIP_VRJ_NUM_LINES
, mchip_vsize());
507 mchip_set(MCHIP_VRJ_NUM_PIXELS
, mchip_hsize());
508 mchip_set(MCHIP_VRJ_NUM_COMPONENTS
, 0x1b);
509 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO
, 0xFFFF);
510 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI
, 0xFFFF);
511 mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT
, 0xC);
512 mchip_set(MCHIP_VRJ_RESTART_INTERVAL
, 0);
513 mchip_set(MCHIP_VRJ_SOF1
, 0x601);
514 mchip_set(MCHIP_VRJ_SOF2
, 0x1502);
515 mchip_set(MCHIP_VRJ_SOF3
, 0x1503);
516 mchip_set(MCHIP_VRJ_SOF4
, 0x1596);
517 mchip_set(MCHIP_VRJ_SOS
, 0x0ed0);
522 /* sets the DMA parameters into the chip */
523 static void mchip_dma_setup(dma_addr_t dma_addr
)
527 mchip_set(MCHIP_MM_PT_ADDR
, (u32
)dma_addr
);
528 for (i
= 0; i
< 4; i
++)
529 mchip_set(MCHIP_MM_FIR(i
), 0);
533 /* setup for DMA transfers - also zeros the framebuffer */
534 static int mchip_dma_alloc(void)
536 if (!meye
.mchip_dmahandle
)
542 /* frees the DMA buffer */
543 static void mchip_dma_free(void)
545 if (meye
.mchip_dmahandle
) {
551 /* stop any existing HIC action and wait for any dma to complete then
552 reset the dma engine */
553 static void mchip_hic_stop(void)
557 meye
.mchip_mode
= MCHIP_HIC_MODE_NOOP
;
558 if (!(mchip_read(MCHIP_HIC_STATUS
) & MCHIP_HIC_STATUS_BUSY
))
560 for (i
= 0; i
< 20; ++i
) {
561 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_STOP
);
562 mchip_delay(MCHIP_HIC_CMD
, 0);
563 for (j
= 0; j
< 100; ++j
) {
564 if (mchip_delay(MCHIP_HIC_STATUS
,
565 MCHIP_HIC_STATUS_IDLE
))
569 printk(KERN_ERR
"meye: need to reset HIC!\n");
571 mchip_set(MCHIP_HIC_CTL
, MCHIP_HIC_CTL_SOFT_RESET
);
574 printk(KERN_ERR
"meye: resetting HIC hanged!\n");
577 /****************************************************************************/
578 /* MCHIP frame processing functions */
579 /****************************************************************************/
581 /* get the next ready frame from the dma engine */
582 static u32
mchip_get_frame(void)
586 v
= mchip_read(MCHIP_MM_FIR(meye
.mchip_fnum
));
590 /* frees the current frame from the dma engine */
591 static void mchip_free_frame(void)
593 mchip_set(MCHIP_MM_FIR(meye
.mchip_fnum
), 0);
595 meye
.mchip_fnum
%= 4;
598 /* read one frame from the framebuffer assuming it was captured using
599 a uncompressed transfer */
600 static void mchip_cont_read_frame(u32 v
, u8
*buf
, int size
)
604 pt_id
= (v
>> 17) & 0x3FF;
606 ptable_copy(buf
, pt_id
, size
, MCHIP_NB_PAGES
);
609 /* read a compressed frame from the framebuffer */
610 static int mchip_comp_read_frame(u32 v
, u8
*buf
, int size
)
612 int pt_start
, pt_end
, trailer
;
616 pt_start
= (v
>> 19) & 0xFF;
617 pt_end
= (v
>> 11) & 0xFF;
618 trailer
= (v
>> 1) & 0x3FF;
620 if (pt_end
< pt_start
)
621 fsize
= (MCHIP_NB_PAGES_MJPEG
- pt_start
) * PAGE_SIZE
+
622 pt_end
* PAGE_SIZE
+ trailer
* 4;
624 fsize
= (pt_end
- pt_start
) * PAGE_SIZE
+ trailer
* 4;
627 printk(KERN_WARNING
"meye: oversized compressed frame %d\n",
632 ptable_copy(buf
, pt_start
, fsize
, MCHIP_NB_PAGES_MJPEG
);
634 #ifdef MEYE_JPEG_CORRECTION
636 /* Some mchip generated jpeg frames are incorrect. In most
637 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
638 * is not present at the end of the frame.
640 * Since adding the final marker is not enough to restore
641 * the jpeg integrity, we drop the frame.
644 for (i
= fsize
- 1; i
> 0 && buf
[i
] == 0xff; i
--) ;
646 if (i
< 2 || buf
[i
- 1] != 0xff || buf
[i
] != 0xd9)
654 /* take a picture into SDRAM */
655 static void mchip_take_picture(void)
661 mchip_dma_setup(meye
.mchip_dmahandle
);
663 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_CAP
);
664 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
666 mchip_delay(MCHIP_HIC_CMD
, 0);
668 for (i
= 0; i
< 100; ++i
) {
669 if (mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
))
675 /* dma a previously taken picture into a buffer */
676 static void mchip_get_picture(u8
*buf
, int bufsize
)
681 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_OUT
);
682 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
684 mchip_delay(MCHIP_HIC_CMD
, 0);
685 for (i
= 0; i
< 100; ++i
) {
686 if (mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
))
690 for (i
= 0; i
< 4; ++i
) {
691 v
= mchip_get_frame();
692 if (v
& MCHIP_MM_FIR_RDY
) {
693 mchip_cont_read_frame(v
, buf
, bufsize
);
700 /* start continuous dma capture */
701 static void mchip_continuous_start(void)
705 mchip_set_framerate();
706 mchip_dma_setup(meye
.mchip_dmahandle
);
708 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_OUT
;
710 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_CONT_OUT
);
711 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
713 mchip_delay(MCHIP_HIC_CMD
, 0);
716 /* compress one frame into a buffer */
717 static int mchip_compress_frame(u8
*buf
, int bufsize
)
722 mchip_vrj_setup(0x3f);
725 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_COMP
);
726 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
728 mchip_delay(MCHIP_HIC_CMD
, 0);
729 for (i
= 0; i
< 100; ++i
) {
730 if (mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
))
735 for (i
= 0; i
< 4; ++i
) {
736 v
= mchip_get_frame();
737 if (v
& MCHIP_MM_FIR_RDY
) {
738 len
= mchip_comp_read_frame(v
, buf
, bufsize
);
747 /* uncompress one image into a buffer */
748 static int mchip_uncompress_frame(u8
*img
, int imgsize
, u8
*buf
, int bufsize
)
750 mchip_vrj_setup(0x3f);
753 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_DECOMP
);
754 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
756 mchip_delay(MCHIP_HIC_CMD
, 0);
758 return mchip_comp_read_frame(buf
, bufsize
);
762 /* start continuous compressed capture */
763 static void mchip_cont_compression_start(void)
766 mchip_vrj_setup(0x3f);
768 mchip_set_framerate();
769 mchip_dma_setup(meye
.mchip_dmahandle
);
771 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_COMP
;
773 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_CONT_COMP
);
774 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
776 mchip_delay(MCHIP_HIC_CMD
, 0);
779 /****************************************************************************/
780 /* Interrupt handling */
781 /****************************************************************************/
783 static irqreturn_t
meye_irq(int irq
, void *dev_id
)
789 v
= mchip_read(MCHIP_MM_INTA
);
791 if (meye
.mchip_mode
!= MCHIP_HIC_MODE_CONT_OUT
&&
792 meye
.mchip_mode
!= MCHIP_HIC_MODE_CONT_COMP
)
796 v
= mchip_get_frame();
797 if (!(v
& MCHIP_MM_FIR_RDY
))
800 if (meye
.mchip_mode
== MCHIP_HIC_MODE_CONT_OUT
) {
801 if (kfifo_get(meye
.grabq
, (unsigned char *)&reqnr
,
802 sizeof(int)) != sizeof(int)) {
806 mchip_cont_read_frame(v
, meye
.grab_fbuffer
+ gbufsize
* reqnr
,
807 mchip_hsize() * mchip_vsize() * 2);
808 meye
.grab_buffer
[reqnr
].size
= mchip_hsize() * mchip_vsize() * 2;
809 meye
.grab_buffer
[reqnr
].state
= MEYE_BUF_DONE
;
810 do_gettimeofday(&meye
.grab_buffer
[reqnr
].timestamp
);
811 meye
.grab_buffer
[reqnr
].sequence
= sequence
++;
812 kfifo_put(meye
.doneq
, (unsigned char *)&reqnr
, sizeof(int));
813 wake_up_interruptible(&meye
.proc_list
);
816 size
= mchip_comp_read_frame(v
, meye
.grab_temp
, gbufsize
);
821 if (kfifo_get(meye
.grabq
, (unsigned char *)&reqnr
,
822 sizeof(int)) != sizeof(int)) {
826 memcpy(meye
.grab_fbuffer
+ gbufsize
* reqnr
, meye
.grab_temp
,
828 meye
.grab_buffer
[reqnr
].size
= size
;
829 meye
.grab_buffer
[reqnr
].state
= MEYE_BUF_DONE
;
830 do_gettimeofday(&meye
.grab_buffer
[reqnr
].timestamp
);
831 meye
.grab_buffer
[reqnr
].sequence
= sequence
++;
832 kfifo_put(meye
.doneq
, (unsigned char *)&reqnr
, sizeof(int));
833 wake_up_interruptible(&meye
.proc_list
);
839 /****************************************************************************/
840 /* video4linux integration */
841 /****************************************************************************/
843 static int meye_open(struct inode
*inode
, struct file
*file
)
847 err
= video_exclusive_open(inode
, file
);
853 if (mchip_dma_alloc()) {
854 printk(KERN_ERR
"meye: mchip framebuffer allocation failed\n");
855 video_exclusive_release(inode
, file
);
859 for (i
= 0; i
< MEYE_MAX_BUFNBRS
; i
++)
860 meye
.grab_buffer
[i
].state
= MEYE_BUF_UNUSED
;
861 kfifo_reset(meye
.grabq
);
862 kfifo_reset(meye
.doneq
);
866 static int meye_release(struct inode
*inode
, struct file
*file
)
870 video_exclusive_release(inode
, file
);
874 static int meyeioc_g_params(struct meye_params
*p
)
880 static int meyeioc_s_params(struct meye_params
*jp
)
882 if (jp
->subsample
> 1)
885 if (jp
->quality
> 10)
888 if (jp
->sharpness
> 63 || jp
->agc
> 63 || jp
->picture
> 63)
891 if (jp
->framerate
> 31)
894 mutex_lock(&meye
.lock
);
896 if (meye
.params
.subsample
!= jp
->subsample
||
897 meye
.params
.quality
!= jp
->quality
)
898 mchip_hic_stop(); /* need restart */
901 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS
,
902 meye
.params
.sharpness
);
903 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC
,
905 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE
,
906 meye
.params
.picture
);
907 mutex_unlock(&meye
.lock
);
912 static int meyeioc_qbuf_capt(int *nb
)
914 if (!meye
.grab_fbuffer
)
926 if (meye
.grab_buffer
[*nb
].state
!= MEYE_BUF_UNUSED
)
929 mutex_lock(&meye
.lock
);
931 if (meye
.mchip_mode
!= MCHIP_HIC_MODE_CONT_COMP
)
932 mchip_cont_compression_start();
934 meye
.grab_buffer
[*nb
].state
= MEYE_BUF_USING
;
935 kfifo_put(meye
.grabq
, (unsigned char *)nb
, sizeof(int));
936 mutex_unlock(&meye
.lock
);
941 static int meyeioc_sync(struct file
*file
, void *fh
, int *i
)
945 if (*i
< 0 || *i
>= gbuffers
)
948 mutex_lock(&meye
.lock
);
949 switch (meye
.grab_buffer
[*i
].state
) {
951 case MEYE_BUF_UNUSED
:
952 mutex_unlock(&meye
.lock
);
955 if (file
->f_flags
& O_NONBLOCK
) {
956 mutex_unlock(&meye
.lock
);
959 if (wait_event_interruptible(meye
.proc_list
,
960 (meye
.grab_buffer
[*i
].state
!= MEYE_BUF_USING
))) {
961 mutex_unlock(&meye
.lock
);
966 meye
.grab_buffer
[*i
].state
= MEYE_BUF_UNUSED
;
967 kfifo_get(meye
.doneq
, (unsigned char *)&unused
, sizeof(int));
969 *i
= meye
.grab_buffer
[*i
].size
;
970 mutex_unlock(&meye
.lock
);
974 static int meyeioc_stillcapt(void)
976 if (!meye
.grab_fbuffer
)
979 if (meye
.grab_buffer
[0].state
!= MEYE_BUF_UNUSED
)
982 mutex_lock(&meye
.lock
);
983 meye
.grab_buffer
[0].state
= MEYE_BUF_USING
;
984 mchip_take_picture();
986 mchip_get_picture(meye
.grab_fbuffer
,
987 mchip_hsize() * mchip_vsize() * 2);
989 meye
.grab_buffer
[0].state
= MEYE_BUF_DONE
;
990 mutex_unlock(&meye
.lock
);
995 static int meyeioc_stilljcapt(int *len
)
997 if (!meye
.grab_fbuffer
)
1000 if (meye
.grab_buffer
[0].state
!= MEYE_BUF_UNUSED
)
1003 mutex_lock(&meye
.lock
);
1004 meye
.grab_buffer
[0].state
= MEYE_BUF_USING
;
1007 while (*len
== -1) {
1008 mchip_take_picture();
1009 *len
= mchip_compress_frame(meye
.grab_fbuffer
, gbufsize
);
1012 meye
.grab_buffer
[0].state
= MEYE_BUF_DONE
;
1013 mutex_unlock(&meye
.lock
);
1017 static int vidioc_querycap(struct file
*file
, void *fh
,
1018 struct v4l2_capability
*cap
)
1020 memset(cap
, 0, sizeof(*cap
));
1021 strcpy(cap
->driver
, "meye");
1022 strcpy(cap
->card
, "meye");
1023 sprintf(cap
->bus_info
, "PCI:%s", pci_name(meye
.mchip_dev
));
1025 cap
->version
= (MEYE_DRIVER_MAJORVERSION
<< 8) +
1026 MEYE_DRIVER_MINORVERSION
;
1028 cap
->capabilities
= V4L2_CAP_VIDEO_CAPTURE
|
1034 static int vidioc_enum_input(struct file
*file
, void *fh
, struct v4l2_input
*i
)
1039 memset(i
, 0, sizeof(*i
));
1041 strcpy(i
->name
, "Camera");
1042 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
1047 static int vidioc_g_input(struct file
*file
, void *fh
, unsigned int *i
)
1053 static int vidioc_s_input(struct file
*file
, void *fh
, unsigned int i
)
1061 static int vidioc_queryctrl(struct file
*file
, void *fh
,
1062 struct v4l2_queryctrl
*c
)
1066 case V4L2_CID_BRIGHTNESS
:
1067 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1068 strcpy(c
->name
, "Brightness");
1072 c
->default_value
= 32;
1076 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1077 strcpy(c
->name
, "Hue");
1081 c
->default_value
= 32;
1084 case V4L2_CID_CONTRAST
:
1085 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1086 strcpy(c
->name
, "Contrast");
1090 c
->default_value
= 32;
1093 case V4L2_CID_SATURATION
:
1094 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1095 strcpy(c
->name
, "Saturation");
1099 c
->default_value
= 32;
1103 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1104 strcpy(c
->name
, "Agc");
1108 c
->default_value
= 48;
1111 case V4L2_CID_MEYE_SHARPNESS
:
1112 case V4L2_CID_SHARPNESS
:
1113 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1114 strcpy(c
->name
, "Sharpness");
1118 c
->default_value
= 32;
1120 /* Continue to report legacy private SHARPNESS ctrl but
1121 * say it is disabled in preference to ctrl in the spec
1123 c
->flags
= (c
->id
== V4L2_CID_SHARPNESS
) ? 0 :
1124 V4L2_CTRL_FLAG_DISABLED
;
1126 case V4L2_CID_PICTURE
:
1127 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1128 strcpy(c
->name
, "Picture");
1132 c
->default_value
= 0;
1135 case V4L2_CID_JPEGQUAL
:
1136 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1137 strcpy(c
->name
, "JPEG quality");
1141 c
->default_value
= 8;
1144 case V4L2_CID_FRAMERATE
:
1145 c
->type
= V4L2_CTRL_TYPE_INTEGER
;
1146 strcpy(c
->name
, "Framerate");
1150 c
->default_value
= 0;
1160 static int vidioc_s_ctrl(struct file
*file
, void *fh
, struct v4l2_control
*c
)
1162 mutex_lock(&meye
.lock
);
1164 case V4L2_CID_BRIGHTNESS
:
1165 sony_pic_camera_command(
1166 SONY_PIC_COMMAND_SETCAMERABRIGHTNESS
, c
->value
);
1167 meye
.picture
.brightness
= c
->value
<< 10;
1170 sony_pic_camera_command(
1171 SONY_PIC_COMMAND_SETCAMERAHUE
, c
->value
);
1172 meye
.picture
.hue
= c
->value
<< 10;
1174 case V4L2_CID_CONTRAST
:
1175 sony_pic_camera_command(
1176 SONY_PIC_COMMAND_SETCAMERACONTRAST
, c
->value
);
1177 meye
.picture
.contrast
= c
->value
<< 10;
1179 case V4L2_CID_SATURATION
:
1180 sony_pic_camera_command(
1181 SONY_PIC_COMMAND_SETCAMERACOLOR
, c
->value
);
1182 meye
.picture
.colour
= c
->value
<< 10;
1185 sony_pic_camera_command(
1186 SONY_PIC_COMMAND_SETCAMERAAGC
, c
->value
);
1187 meye
.params
.agc
= c
->value
;
1189 case V4L2_CID_SHARPNESS
:
1190 case V4L2_CID_MEYE_SHARPNESS
:
1191 sony_pic_camera_command(
1192 SONY_PIC_COMMAND_SETCAMERASHARPNESS
, c
->value
);
1193 meye
.params
.sharpness
= c
->value
;
1195 case V4L2_CID_PICTURE
:
1196 sony_pic_camera_command(
1197 SONY_PIC_COMMAND_SETCAMERAPICTURE
, c
->value
);
1198 meye
.params
.picture
= c
->value
;
1200 case V4L2_CID_JPEGQUAL
:
1201 meye
.params
.quality
= c
->value
;
1203 case V4L2_CID_FRAMERATE
:
1204 meye
.params
.framerate
= c
->value
;
1207 mutex_unlock(&meye
.lock
);
1210 mutex_unlock(&meye
.lock
);
1215 static int vidioc_g_ctrl(struct file
*file
, void *fh
, struct v4l2_control
*c
)
1217 mutex_lock(&meye
.lock
);
1219 case V4L2_CID_BRIGHTNESS
:
1220 c
->value
= meye
.picture
.brightness
>> 10;
1223 c
->value
= meye
.picture
.hue
>> 10;
1225 case V4L2_CID_CONTRAST
:
1226 c
->value
= meye
.picture
.contrast
>> 10;
1228 case V4L2_CID_SATURATION
:
1229 c
->value
= meye
.picture
.colour
>> 10;
1232 c
->value
= meye
.params
.agc
;
1234 case V4L2_CID_SHARPNESS
:
1235 case V4L2_CID_MEYE_SHARPNESS
:
1236 c
->value
= meye
.params
.sharpness
;
1238 case V4L2_CID_PICTURE
:
1239 c
->value
= meye
.params
.picture
;
1241 case V4L2_CID_JPEGQUAL
:
1242 c
->value
= meye
.params
.quality
;
1244 case V4L2_CID_FRAMERATE
:
1245 c
->value
= meye
.params
.framerate
;
1248 mutex_unlock(&meye
.lock
);
1251 mutex_unlock(&meye
.lock
);
1256 static int vidioc_enum_fmt_cap(struct file
*file
, void *fh
,
1257 struct v4l2_fmtdesc
*f
)
1262 if (f
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1265 if (f
->index
== 0) {
1266 /* standard YUV 422 capture */
1267 memset(f
, 0, sizeof(*f
));
1269 f
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1271 strcpy(f
->description
, "YUV422");
1272 f
->pixelformat
= V4L2_PIX_FMT_YUYV
;
1274 /* compressed MJPEG capture */
1275 memset(f
, 0, sizeof(*f
));
1277 f
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1278 f
->flags
= V4L2_FMT_FLAG_COMPRESSED
;
1279 strcpy(f
->description
, "MJPEG");
1280 f
->pixelformat
= V4L2_PIX_FMT_MJPEG
;
1286 static int vidioc_try_fmt_cap(struct file
*file
, void *fh
,
1287 struct v4l2_format
*f
)
1289 if (f
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1292 if (f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_YUYV
&&
1293 f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_MJPEG
)
1296 if (f
->fmt
.pix
.field
!= V4L2_FIELD_ANY
&&
1297 f
->fmt
.pix
.field
!= V4L2_FIELD_NONE
)
1300 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
1302 if (f
->fmt
.pix
.width
<= 320) {
1303 f
->fmt
.pix
.width
= 320;
1304 f
->fmt
.pix
.height
= 240;
1306 f
->fmt
.pix
.width
= 640;
1307 f
->fmt
.pix
.height
= 480;
1310 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* 2;
1311 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
*
1312 f
->fmt
.pix
.bytesperline
;
1313 f
->fmt
.pix
.colorspace
= 0;
1314 f
->fmt
.pix
.priv
= 0;
1319 static int vidioc_g_fmt_cap(struct file
*file
, void *fh
, struct v4l2_format
*f
)
1321 if (f
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1324 memset(&f
->fmt
.pix
, 0, sizeof(struct v4l2_pix_format
));
1325 f
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1327 switch (meye
.mchip_mode
) {
1328 case MCHIP_HIC_MODE_CONT_OUT
:
1330 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_YUYV
;
1332 case MCHIP_HIC_MODE_CONT_COMP
:
1333 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MJPEG
;
1337 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
1338 f
->fmt
.pix
.width
= mchip_hsize();
1339 f
->fmt
.pix
.height
= mchip_vsize();
1340 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* 2;
1341 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
*
1342 f
->fmt
.pix
.bytesperline
;
1343 f
->fmt
.pix
.colorspace
= 0;
1344 f
->fmt
.pix
.priv
= 0;
1349 static int vidioc_s_fmt_cap(struct file
*file
, void *fh
, struct v4l2_format
*f
)
1351 if (f
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1354 if (f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_YUYV
&&
1355 f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_MJPEG
)
1358 if (f
->fmt
.pix
.field
!= V4L2_FIELD_ANY
&&
1359 f
->fmt
.pix
.field
!= V4L2_FIELD_NONE
)
1362 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
1363 mutex_lock(&meye
.lock
);
1365 if (f
->fmt
.pix
.width
<= 320) {
1366 f
->fmt
.pix
.width
= 320;
1367 f
->fmt
.pix
.height
= 240;
1368 meye
.params
.subsample
= 1;
1370 f
->fmt
.pix
.width
= 640;
1371 f
->fmt
.pix
.height
= 480;
1372 meye
.params
.subsample
= 0;
1375 switch (f
->fmt
.pix
.pixelformat
) {
1376 case V4L2_PIX_FMT_YUYV
:
1377 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_OUT
;
1379 case V4L2_PIX_FMT_MJPEG
:
1380 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_COMP
;
1384 mutex_unlock(&meye
.lock
);
1385 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* 2;
1386 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
*
1387 f
->fmt
.pix
.bytesperline
;
1388 f
->fmt
.pix
.colorspace
= 0;
1389 f
->fmt
.pix
.priv
= 0;
1394 static int vidioc_reqbufs(struct file
*file
, void *fh
,
1395 struct v4l2_requestbuffers
*req
)
1399 if (req
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1402 if (req
->memory
!= V4L2_MEMORY_MMAP
)
1405 if (meye
.grab_fbuffer
&& req
->count
== gbuffers
) {
1406 /* already allocated, no modifications */
1410 mutex_lock(&meye
.lock
);
1411 if (meye
.grab_fbuffer
) {
1412 for (i
= 0; i
< gbuffers
; i
++)
1413 if (meye
.vma_use_count
[i
]) {
1414 mutex_unlock(&meye
.lock
);
1417 rvfree(meye
.grab_fbuffer
, gbuffers
* gbufsize
);
1418 meye
.grab_fbuffer
= NULL
;
1421 gbuffers
= max(2, min((int)req
->count
, MEYE_MAX_BUFNBRS
));
1422 req
->count
= gbuffers
;
1423 meye
.grab_fbuffer
= rvmalloc(gbuffers
* gbufsize
);
1425 if (!meye
.grab_fbuffer
) {
1426 printk(KERN_ERR
"meye: v4l framebuffer allocation"
1428 mutex_unlock(&meye
.lock
);
1432 for (i
= 0; i
< gbuffers
; i
++)
1433 meye
.vma_use_count
[i
] = 0;
1435 mutex_unlock(&meye
.lock
);
1440 static int vidioc_querybuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
1442 int index
= buf
->index
;
1444 if (index
< 0 || index
>= gbuffers
)
1447 memset(buf
, 0, sizeof(*buf
));
1449 buf
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1451 buf
->bytesused
= meye
.grab_buffer
[index
].size
;
1452 buf
->flags
= V4L2_BUF_FLAG_MAPPED
;
1454 if (meye
.grab_buffer
[index
].state
== MEYE_BUF_USING
)
1455 buf
->flags
|= V4L2_BUF_FLAG_QUEUED
;
1457 if (meye
.grab_buffer
[index
].state
== MEYE_BUF_DONE
)
1458 buf
->flags
|= V4L2_BUF_FLAG_DONE
;
1460 buf
->field
= V4L2_FIELD_NONE
;
1461 buf
->timestamp
= meye
.grab_buffer
[index
].timestamp
;
1462 buf
->sequence
= meye
.grab_buffer
[index
].sequence
;
1463 buf
->memory
= V4L2_MEMORY_MMAP
;
1464 buf
->m
.offset
= index
* gbufsize
;
1465 buf
->length
= gbufsize
;
1470 static int vidioc_qbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
1472 if (buf
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1475 if (buf
->memory
!= V4L2_MEMORY_MMAP
)
1478 if (buf
->index
< 0 || buf
->index
>= gbuffers
)
1481 if (meye
.grab_buffer
[buf
->index
].state
!= MEYE_BUF_UNUSED
)
1484 mutex_lock(&meye
.lock
);
1485 buf
->flags
|= V4L2_BUF_FLAG_QUEUED
;
1486 buf
->flags
&= ~V4L2_BUF_FLAG_DONE
;
1487 meye
.grab_buffer
[buf
->index
].state
= MEYE_BUF_USING
;
1488 kfifo_put(meye
.grabq
, (unsigned char *)&buf
->index
, sizeof(int));
1489 mutex_unlock(&meye
.lock
);
1494 static int vidioc_dqbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
1498 if (buf
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1501 if (buf
->memory
!= V4L2_MEMORY_MMAP
)
1504 mutex_lock(&meye
.lock
);
1506 if (kfifo_len(meye
.doneq
) == 0 && file
->f_flags
& O_NONBLOCK
) {
1507 mutex_unlock(&meye
.lock
);
1511 if (wait_event_interruptible(meye
.proc_list
,
1512 kfifo_len(meye
.doneq
) != 0) < 0) {
1513 mutex_unlock(&meye
.lock
);
1517 if (!kfifo_get(meye
.doneq
, (unsigned char *)&reqnr
,
1519 mutex_unlock(&meye
.lock
);
1523 if (meye
.grab_buffer
[reqnr
].state
!= MEYE_BUF_DONE
) {
1524 mutex_unlock(&meye
.lock
);
1529 buf
->bytesused
= meye
.grab_buffer
[reqnr
].size
;
1530 buf
->flags
= V4L2_BUF_FLAG_MAPPED
;
1531 buf
->field
= V4L2_FIELD_NONE
;
1532 buf
->timestamp
= meye
.grab_buffer
[reqnr
].timestamp
;
1533 buf
->sequence
= meye
.grab_buffer
[reqnr
].sequence
;
1534 buf
->memory
= V4L2_MEMORY_MMAP
;
1535 buf
->m
.offset
= reqnr
* gbufsize
;
1536 buf
->length
= gbufsize
;
1537 meye
.grab_buffer
[reqnr
].state
= MEYE_BUF_UNUSED
;
1538 mutex_unlock(&meye
.lock
);
1543 static int vidioc_streamon(struct file
*file
, void *fh
, enum v4l2_buf_type i
)
1545 mutex_lock(&meye
.lock
);
1547 switch (meye
.mchip_mode
) {
1548 case MCHIP_HIC_MODE_CONT_OUT
:
1549 mchip_continuous_start();
1551 case MCHIP_HIC_MODE_CONT_COMP
:
1552 mchip_cont_compression_start();
1555 mutex_unlock(&meye
.lock
);
1559 mutex_unlock(&meye
.lock
);
1564 static int vidioc_streamoff(struct file
*file
, void *fh
, enum v4l2_buf_type i
)
1566 mutex_lock(&meye
.lock
);
1568 kfifo_reset(meye
.grabq
);
1569 kfifo_reset(meye
.doneq
);
1571 for (i
= 0; i
< MEYE_MAX_BUFNBRS
; i
++)
1572 meye
.grab_buffer
[i
].state
= MEYE_BUF_UNUSED
;
1574 mutex_unlock(&meye
.lock
);
1578 static int vidioc_default(struct file
*file
, void *fh
, int cmd
, void *arg
)
1581 case MEYEIOC_G_PARAMS
:
1582 return meyeioc_g_params((struct meye_params
*) arg
);
1584 case MEYEIOC_S_PARAMS
:
1585 return meyeioc_s_params((struct meye_params
*) arg
);
1587 case MEYEIOC_QBUF_CAPT
:
1588 return meyeioc_qbuf_capt((int *) arg
);
1591 return meyeioc_sync(file
, fh
, (int *) arg
);
1593 case MEYEIOC_STILLCAPT
:
1594 return meyeioc_stillcapt();
1596 case MEYEIOC_STILLJCAPT
:
1597 return meyeioc_stilljcapt((int *) arg
);
1605 static unsigned int meye_poll(struct file
*file
, poll_table
*wait
)
1607 unsigned int res
= 0;
1609 mutex_lock(&meye
.lock
);
1610 poll_wait(file
, &meye
.proc_list
, wait
);
1611 if (kfifo_len(meye
.doneq
))
1612 res
= POLLIN
| POLLRDNORM
;
1613 mutex_unlock(&meye
.lock
);
1617 static void meye_vm_open(struct vm_area_struct
*vma
)
1619 long idx
= (long)vma
->vm_private_data
;
1620 meye
.vma_use_count
[idx
]++;
1623 static void meye_vm_close(struct vm_area_struct
*vma
)
1625 long idx
= (long)vma
->vm_private_data
;
1626 meye
.vma_use_count
[idx
]--;
1629 static struct vm_operations_struct meye_vm_ops
= {
1630 .open
= meye_vm_open
,
1631 .close
= meye_vm_close
,
1634 static int meye_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1636 unsigned long start
= vma
->vm_start
;
1637 unsigned long size
= vma
->vm_end
- vma
->vm_start
;
1638 unsigned long offset
= vma
->vm_pgoff
<< PAGE_SHIFT
;
1639 unsigned long page
, pos
;
1641 mutex_lock(&meye
.lock
);
1642 if (size
> gbuffers
* gbufsize
) {
1643 mutex_unlock(&meye
.lock
);
1646 if (!meye
.grab_fbuffer
) {
1649 /* lazy allocation */
1650 meye
.grab_fbuffer
= rvmalloc(gbuffers
*gbufsize
);
1651 if (!meye
.grab_fbuffer
) {
1652 printk(KERN_ERR
"meye: v4l framebuffer allocation failed\n");
1653 mutex_unlock(&meye
.lock
);
1656 for (i
= 0; i
< gbuffers
; i
++)
1657 meye
.vma_use_count
[i
] = 0;
1659 pos
= (unsigned long)meye
.grab_fbuffer
+ offset
;
1662 page
= vmalloc_to_pfn((void *)pos
);
1663 if (remap_pfn_range(vma
, start
, page
, PAGE_SIZE
, PAGE_SHARED
)) {
1664 mutex_unlock(&meye
.lock
);
1669 if (size
> PAGE_SIZE
)
1675 vma
->vm_ops
= &meye_vm_ops
;
1676 vma
->vm_flags
&= ~VM_IO
; /* not I/O memory */
1677 vma
->vm_flags
|= VM_RESERVED
; /* avoid to swap out this VMA */
1678 vma
->vm_private_data
= (void *) (offset
/ gbufsize
);
1681 mutex_unlock(&meye
.lock
);
1685 static const struct file_operations meye_fops
= {
1686 .owner
= THIS_MODULE
,
1688 .release
= meye_release
,
1690 .ioctl
= video_ioctl2
,
1691 #ifdef CONFIG_COMPAT
1692 .compat_ioctl
= v4l_compat_ioctl32
,
1695 .llseek
= no_llseek
,
1698 static struct video_device meye_template
= {
1699 .owner
= THIS_MODULE
,
1701 .type
= VID_TYPE_CAPTURE
,
1703 .release
= video_device_release
,
1705 .vidioc_querycap
= vidioc_querycap
,
1706 .vidioc_enum_input
= vidioc_enum_input
,
1707 .vidioc_g_input
= vidioc_g_input
,
1708 .vidioc_s_input
= vidioc_s_input
,
1709 .vidioc_queryctrl
= vidioc_queryctrl
,
1710 .vidioc_s_ctrl
= vidioc_s_ctrl
,
1711 .vidioc_g_ctrl
= vidioc_g_ctrl
,
1712 .vidioc_enum_fmt_cap
= vidioc_enum_fmt_cap
,
1713 .vidioc_try_fmt_cap
= vidioc_try_fmt_cap
,
1714 .vidioc_g_fmt_cap
= vidioc_g_fmt_cap
,
1715 .vidioc_s_fmt_cap
= vidioc_s_fmt_cap
,
1716 .vidioc_reqbufs
= vidioc_reqbufs
,
1717 .vidioc_querybuf
= vidioc_querybuf
,
1718 .vidioc_qbuf
= vidioc_qbuf
,
1719 .vidioc_dqbuf
= vidioc_dqbuf
,
1720 .vidioc_streamon
= vidioc_streamon
,
1721 .vidioc_streamoff
= vidioc_streamoff
,
1722 .vidioc_default
= vidioc_default
,
1726 static int meye_suspend(struct pci_dev
*pdev
, pm_message_t state
)
1728 pci_save_state(pdev
);
1729 meye
.pm_mchip_mode
= meye
.mchip_mode
;
1731 mchip_set(MCHIP_MM_INTA
, 0x0);
1735 static int meye_resume(struct pci_dev
*pdev
)
1737 pci_restore_state(pdev
);
1738 pci_write_config_word(meye
.mchip_dev
, MCHIP_PCI_SOFTRESET_SET
, 1);
1740 mchip_delay(MCHIP_HIC_CMD
, 0);
1741 mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
);
1743 mchip_set(MCHIP_VRJ_SOFT_RESET
, 1);
1745 mchip_set(MCHIP_MM_PCI_MODE
, 5);
1747 mchip_set(MCHIP_MM_INTA
, MCHIP_MM_INTA_HIC_1_MASK
);
1749 switch (meye
.pm_mchip_mode
) {
1750 case MCHIP_HIC_MODE_CONT_OUT
:
1751 mchip_continuous_start();
1753 case MCHIP_HIC_MODE_CONT_COMP
:
1754 mchip_cont_compression_start();
1761 static int __devinit
meye_probe(struct pci_dev
*pcidev
,
1762 const struct pci_device_id
*ent
)
1765 unsigned long mchip_adr
;
1767 if (meye
.mchip_dev
!= NULL
) {
1768 printk(KERN_ERR
"meye: only one device allowed!\n");
1772 meye
.mchip_dev
= pcidev
;
1773 meye
.video_dev
= video_device_alloc();
1774 if (!meye
.video_dev
) {
1775 printk(KERN_ERR
"meye: video_device_alloc() failed!\n");
1780 meye
.grab_temp
= vmalloc(MCHIP_NB_PAGES_MJPEG
* PAGE_SIZE
);
1781 if (!meye
.grab_temp
) {
1782 printk(KERN_ERR
"meye: grab buffer allocation failed\n");
1786 spin_lock_init(&meye
.grabq_lock
);
1787 meye
.grabq
= kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS
, GFP_KERNEL
,
1789 if (IS_ERR(meye
.grabq
)) {
1790 printk(KERN_ERR
"meye: fifo allocation failed\n");
1791 goto outkfifoalloc1
;
1793 spin_lock_init(&meye
.doneq_lock
);
1794 meye
.doneq
= kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS
, GFP_KERNEL
,
1796 if (IS_ERR(meye
.doneq
)) {
1797 printk(KERN_ERR
"meye: fifo allocation failed\n");
1798 goto outkfifoalloc2
;
1801 memcpy(meye
.video_dev
, &meye_template
, sizeof(meye_template
));
1802 meye
.video_dev
->dev
= &meye
.mchip_dev
->dev
;
1804 if ((ret
= sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA
, 1))) {
1805 printk(KERN_ERR
"meye: unable to power on the camera\n");
1806 printk(KERN_ERR
"meye: did you enable the camera in "
1807 "sonypi using the module options ?\n");
1808 goto outsonypienable
;
1812 if ((ret
= pci_enable_device(meye
.mchip_dev
))) {
1813 printk(KERN_ERR
"meye: pci_enable_device failed\n");
1817 mchip_adr
= pci_resource_start(meye
.mchip_dev
,0);
1819 printk(KERN_ERR
"meye: mchip has no device base address\n");
1822 if (!request_mem_region(pci_resource_start(meye
.mchip_dev
, 0),
1823 pci_resource_len(meye
.mchip_dev
, 0),
1825 printk(KERN_ERR
"meye: request_mem_region failed\n");
1828 meye
.mchip_mmregs
= ioremap(mchip_adr
, MCHIP_MM_REGS
);
1829 if (!meye
.mchip_mmregs
) {
1830 printk(KERN_ERR
"meye: ioremap failed\n");
1834 meye
.mchip_irq
= pcidev
->irq
;
1835 if (request_irq(meye
.mchip_irq
, meye_irq
,
1836 IRQF_DISABLED
| IRQF_SHARED
, "meye", meye_irq
)) {
1837 printk(KERN_ERR
"meye: request_irq failed\n");
1841 pci_write_config_byte(meye
.mchip_dev
, PCI_CACHE_LINE_SIZE
, 8);
1842 pci_write_config_byte(meye
.mchip_dev
, PCI_LATENCY_TIMER
, 64);
1844 pci_set_master(meye
.mchip_dev
);
1846 /* Ask the camera to perform a soft reset. */
1847 pci_write_config_word(meye
.mchip_dev
, MCHIP_PCI_SOFTRESET_SET
, 1);
1849 mchip_delay(MCHIP_HIC_CMD
, 0);
1850 mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
);
1853 mchip_set(MCHIP_VRJ_SOFT_RESET
, 1);
1856 mchip_set(MCHIP_MM_PCI_MODE
, 5);
1859 mchip_set(MCHIP_MM_INTA
, MCHIP_MM_INTA_HIC_1_MASK
);
1861 if (video_register_device(meye
.video_dev
, VFL_TYPE_GRABBER
,
1863 printk(KERN_ERR
"meye: video_register_device failed\n");
1867 mutex_init(&meye
.lock
);
1868 init_waitqueue_head(&meye
.proc_list
);
1869 meye
.picture
.depth
= 16;
1870 meye
.picture
.palette
= VIDEO_PALETTE_YUV422
;
1871 meye
.picture
.brightness
= 32 << 10;
1872 meye
.picture
.hue
= 32 << 10;
1873 meye
.picture
.colour
= 32 << 10;
1874 meye
.picture
.contrast
= 32 << 10;
1875 meye
.picture
.whiteness
= 0;
1876 meye
.params
.subsample
= 0;
1877 meye
.params
.quality
= 8;
1878 meye
.params
.sharpness
= 32;
1879 meye
.params
.agc
= 48;
1880 meye
.params
.picture
= 0;
1881 meye
.params
.framerate
= 0;
1883 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERABRIGHTNESS
, 32);
1884 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAHUE
, 32);
1885 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACOLOR
, 32);
1886 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACONTRAST
, 32);
1887 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS
, 32);
1888 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE
, 0);
1889 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC
, 48);
1891 printk(KERN_INFO
"meye: Motion Eye Camera Driver v%s.\n",
1892 MEYE_DRIVER_VERSION
);
1893 printk(KERN_INFO
"meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1894 meye
.mchip_dev
->revision
, mchip_adr
, meye
.mchip_irq
);
1899 free_irq(meye
.mchip_irq
, meye_irq
);
1901 iounmap(meye
.mchip_mmregs
);
1903 release_mem_region(pci_resource_start(meye
.mchip_dev
, 0),
1904 pci_resource_len(meye
.mchip_dev
, 0));
1906 pci_disable_device(meye
.mchip_dev
);
1908 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA
, 0);
1910 kfifo_free(meye
.doneq
);
1912 kfifo_free(meye
.grabq
);
1914 vfree(meye
.grab_temp
);
1916 video_device_release(meye
.video_dev
);
1921 static void __devexit
meye_remove(struct pci_dev
*pcidev
)
1923 video_unregister_device(meye
.video_dev
);
1929 /* disable interrupts */
1930 mchip_set(MCHIP_MM_INTA
, 0x0);
1932 free_irq(meye
.mchip_irq
, meye_irq
);
1934 iounmap(meye
.mchip_mmregs
);
1936 release_mem_region(pci_resource_start(meye
.mchip_dev
, 0),
1937 pci_resource_len(meye
.mchip_dev
, 0));
1939 pci_disable_device(meye
.mchip_dev
);
1941 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA
, 0);
1943 kfifo_free(meye
.doneq
);
1944 kfifo_free(meye
.grabq
);
1946 vfree(meye
.grab_temp
);
1948 if (meye
.grab_fbuffer
) {
1949 rvfree(meye
.grab_fbuffer
, gbuffers
*gbufsize
);
1950 meye
.grab_fbuffer
= NULL
;
1953 printk(KERN_INFO
"meye: removed\n");
1956 static struct pci_device_id meye_pci_tbl
[] = {
1957 { PCI_VENDOR_ID_KAWASAKI
, PCI_DEVICE_ID_MCHIP_KL5A72002
,
1958 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0 },
1962 MODULE_DEVICE_TABLE(pci
, meye_pci_tbl
);
1964 static struct pci_driver meye_driver
= {
1966 .id_table
= meye_pci_tbl
,
1967 .probe
= meye_probe
,
1968 .remove
= __devexit_p(meye_remove
),
1970 .suspend
= meye_suspend
,
1971 .resume
= meye_resume
,
1975 static int __init
meye_init(void)
1977 gbuffers
= max(2, min((int)gbuffers
, MEYE_MAX_BUFNBRS
));
1978 if (gbufsize
< 0 || gbufsize
> MEYE_MAX_BUFSIZE
)
1979 gbufsize
= MEYE_MAX_BUFSIZE
;
1980 gbufsize
= PAGE_ALIGN(gbufsize
);
1981 printk(KERN_INFO
"meye: using %d buffers with %dk (%dk total) "
1984 gbufsize
/ 1024, gbuffers
* gbufsize
/ 1024);
1985 return pci_register_driver(&meye_driver
);
1988 static void __exit
meye_exit(void)
1990 pci_unregister_driver(&meye_driver
);
1993 module_init(meye_init
);
1994 module_exit(meye_exit
);