29 #include <linux/module.h>
30 #include <linux/pci.h>
31 #include <linux/sched.h>
34 #include <linux/videodev2.h>
38 #include <asm/uaccess.h>
54 static unsigned int gbuffers = 2;
56 MODULE_PARM_DESC(gbuffers,
"number of capture buffers, default is 2 (32 max)");
62 " (will be rounded up to a page multiple)");
65 static int video_nr = -1;
75 static void *rvmalloc(
unsigned long size)
84 adr = (
unsigned long) mem;
94 static void rvfree(
void * mem,
unsigned long size)
99 adr = (
unsigned long) mem;
100 while ((
long) size > 0) {
115 static int ptable_alloc(
void)
145 for (j = 0; j <
i; ++
j) {
166 static void ptable_free(
void)
193 static void ptable_copy(
u8 *
buf,
int start,
int size,
int pt_pages)
199 if (start >= pt_pages)
210 static u16 *jpeg_quantisation_tables(
int *
length,
int quality)
212 static u16 jpeg_tables[][70] = { {
213 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
214 0xffff, 0xffff, 0xffff, 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,
218 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
219 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
220 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
221 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
222 0xffff, 0xffff, 0xffff,
225 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
226 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
227 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
228 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
229 0xffff, 0xffff, 0xffff,
230 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
231 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
232 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
233 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
234 0xffff, 0xffff, 0xffff,
237 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
238 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
239 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
240 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
241 0xe6ff, 0xfffd, 0xfff8,
242 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
243 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
244 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
245 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
246 0xf8f8, 0xf8f8, 0xfff8,
249 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
250 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
251 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
252 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
253 0x99c7, 0xaba8, 0xffa4,
254 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
255 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
256 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
257 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
258 0xa4a4, 0xa4a4, 0xffa4,
261 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
262 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
263 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
264 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
265 0x7396, 0x817e, 0xff7c,
266 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
267 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
268 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
269 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
270 0x7c7c, 0x7c7c, 0xff7c,
273 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
274 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
275 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
276 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
277 0x5c78, 0x6765, 0xff63,
278 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
279 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
280 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
281 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
282 0x6363, 0x6363, 0xff63,
285 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
286 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
287 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
288 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
289 0x4a60, 0x5251, 0xff4f,
290 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
291 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
292 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
293 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
294 0x4f4f, 0x4f4f, 0xff4f,
297 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
298 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
299 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
300 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
301 0x3748, 0x3e3d, 0xff3b,
302 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
303 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
304 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
305 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
306 0x3b3b, 0x3b3b, 0xff3b,
309 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
310 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
311 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
312 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
313 0x2530, 0x2928, 0xff28,
314 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
315 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
316 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
317 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
318 0x2828, 0x2828, 0xff28,
321 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
322 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
323 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
324 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
325 0x1218, 0x1514, 0xff14,
326 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
327 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
328 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
329 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
330 0x1414, 0x1414, 0xff14,
333 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
334 0x0101, 0x0101, 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, 0xff01,
338 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
339 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
340 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
341 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
342 0x0101, 0x0101, 0xff01,
345 if (quality < 0 || quality > 10) {
347 "meye: invalid quality level %d - using 8\n", quality);
352 return jpeg_tables[quality];
356 static u16 *jpeg_huffman_tables(
int *length)
359 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
360 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
361 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
362 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
363 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
364 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
365 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
366 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
367 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
368 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
369 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
370 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
371 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
372 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
373 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
374 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
375 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
376 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
377 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
378 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
379 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
380 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
381 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
382 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
383 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
384 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
386 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
387 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
400 static inline int mchip_hsize(
void)
406 static inline int mchip_vsize(
void)
412 static void mchip_sync(
int reg)
429 }
else if (reg > 0x80) {
441 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
446 static inline void mchip_set(
int reg,
u32 v)
453 static inline u32 mchip_read(
int reg)
460 static inline int mchip_delay(
u32 reg,
u32 v)
463 while (--n && mchip_read(reg) != v)
469 static void mchip_subsample(
void)
480 static void mchip_set_framerate(
void)
487 static void mchip_load_tables(
void)
493 tables = jpeg_huffman_tables(&length);
494 for (i = 0; i <
length; i++)
497 tables = jpeg_quantisation_tables(&length,
meye.
params.quality);
498 for (i = 0; i <
length; i++)
503 static void mchip_vrj_setup(
u8 mode)
532 for (i = 0; i < 4; i++)
538 static int mchip_dma_alloc(
void)
547 static void mchip_dma_free(
void)
557 static void mchip_hic_stop(
void)
564 for (i = 0; i < 20; ++
i) {
567 for (j = 0; j < 100; ++
j) {
586 static u32 mchip_get_frame(
void)
595 static void mchip_free_frame(
void)
604 static void mchip_cont_read_frame(
u32 v,
u8 *buf,
int size)
608 pt_id = (v >> 17) & 0x3FF;
610 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
614 static int mchip_comp_read_frame(
u32 v,
u8 *buf,
int size)
616 int pt_start, pt_end, trailer;
620 pt_start = (v >> 19) & 0xFF;
621 pt_end = (v >> 11) & 0xFF;
622 trailer = (v >> 1) & 0x3FF;
624 if (pt_end < pt_start)
628 fsize = (pt_end - pt_start) *
PAGE_SIZE + trailer * 4;
638 #ifdef MEYE_JPEG_CORRECTION
648 for (i = fsize - 1; i > 0 && buf[
i] == 0xff; i--) ;
650 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
659 static void mchip_take_picture(
void)
672 for (i = 0; i < 100; ++
i) {
680 static void mchip_get_picture(
u8 *buf,
int bufsize)
689 for (i = 0; i < 100; ++
i) {
694 for (i = 0; i < 4; ++
i) {
695 v = mchip_get_frame();
697 mchip_cont_read_frame(v, buf, bufsize);
705 static void mchip_continuous_start(
void)
709 mchip_set_framerate();
721 static int mchip_compress_frame(
u8 *buf,
int bufsize)
726 mchip_vrj_setup(0x3f);
733 for (i = 0; i < 100; ++
i) {
739 for (i = 0; i < 4; ++
i) {
740 v = mchip_get_frame();
742 len = mchip_comp_read_frame(v, buf, bufsize);
752 static int mchip_uncompress_frame(
u8 *img,
int imgsize,
u8 *buf,
int bufsize)
754 mchip_vrj_setup(0x3f);
762 return mchip_comp_read_frame(buf, bufsize);
767 static void mchip_cont_compression_start(
void)
770 mchip_vrj_setup(0x3f);
772 mchip_set_framerate();
800 v = mchip_get_frame();
811 mchip_hsize() * mchip_vsize() * 2);
849 static int meye_open(
struct file *
file)
858 if (mchip_dma_alloc()) {
871 static int meye_release(
struct file *file)
917 static int meyeioc_qbuf_capt(
int *nb)
937 mchip_cont_compression_start();
947 static int meyeioc_sync(
struct file *file,
void *fh,
int *i)
951 if (*i < 0 || *i >= gbuffers)
982 static int meyeioc_stillcapt(
void)
992 mchip_take_picture();
995 mchip_hsize() * mchip_vsize() * 2);
1003 static int meyeioc_stilljcapt(
int *len)
1015 while (*len == -1) {
1016 mchip_take_picture();
1025 static int vidioc_querycap(
struct file *file,
void *fh,
1041 static int vidioc_enum_input(
struct file *file,
void *fh,
struct v4l2_input *i)
1052 static int vidioc_g_input(
struct file *file,
void *fh,
unsigned int *i)
1058 static int vidioc_s_input(
struct file *file,
void *fh,
unsigned int i)
1066 static int vidioc_queryctrl(
struct file *file,
void *fh,
1165 static int vidioc_s_ctrl(
struct file *file,
void *fh,
struct v4l2_control *c)
1171 SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, c->
value);
1176 SONY_PIC_COMMAND_SETCAMERAHUE, c->
value);
1181 SONY_PIC_COMMAND_SETCAMERACONTRAST, c->
value);
1186 SONY_PIC_COMMAND_SETCAMERACOLOR, c->
value);
1191 SONY_PIC_COMMAND_SETCAMERAAGC, c->
value);
1197 SONY_PIC_COMMAND_SETCAMERASHARPNESS, c->
value);
1202 SONY_PIC_COMMAND_SETCAMERAPICTURE, c->
value);
1220 static int vidioc_g_ctrl(
struct file *file,
void *fh,
struct v4l2_control *c)
1261 static int vidioc_enum_fmt_vid_cap(
struct file *file,
void *fh,
1267 if (f->
index == 0) {
1282 static int vidioc_try_fmt_vid_cap(
struct file *file,
void *fh,
1295 if (f->
fmt.
pix.width <= 320) {
1306 f->
fmt.
pix.colorspace = 0;
1312 static int vidioc_g_fmt_vid_cap(
struct file *file,
void *fh,
1326 f->
fmt.
pix.width = mchip_hsize();
1327 f->
fmt.
pix.height = mchip_vsize();
1335 static int vidioc_s_fmt_vid_cap(
struct file *file,
void *fh,
1349 if (f->
fmt.
pix.width <= 320) {
1359 switch (f->
fmt.
pix.pixelformat) {
1372 f->
fmt.
pix.colorspace = 0;
1378 static int vidioc_reqbufs(
struct file *file,
void *fh,
1393 for (i = 0; i < gbuffers; i++)
1402 gbuffers =
max(2,
min((
int)req->
count, MEYE_MAX_BUFNBRS));
1403 req->
count = gbuffers;
1413 for (i = 0; i < gbuffers; i++)
1421 static int vidioc_querybuf(
struct file *file,
void *fh,
struct v4l2_buffer *buf)
1425 if (index >= gbuffers)
1441 buf->
m.
offset = index * gbufsize;
1447 static int vidioc_qbuf(
struct file *file,
void *fh,
struct v4l2_buffer *buf)
1452 if (buf->
index >= gbuffers)
1469 static int vidioc_dqbuf(
struct file *file,
void *fh,
struct v4l2_buffer *buf)
1507 buf->
m.
offset = reqnr * gbufsize;
1515 static int vidioc_streamon(
struct file *file,
void *fh,
enum v4l2_buf_type i)
1521 mchip_continuous_start();
1524 mchip_cont_compression_start();
1536 static int vidioc_streamoff(
struct file *file,
void *fh,
enum v4l2_buf_type i)
1550 static long vidioc_default(
struct file *file,
void *fh,
bool valid_prio,
1555 return meyeioc_g_params((
struct meye_params *) arg);
1558 return meyeioc_s_params((
struct meye_params *) arg);
1561 return meyeioc_qbuf_capt((
int *) arg);
1564 return meyeioc_sync(file, fh, (
int *) arg);
1567 return meyeioc_stillcapt();
1570 return meyeioc_stilljcapt((
int *) arg);
1578 static unsigned int meye_poll(
struct file *file,
poll_table *
wait)
1580 unsigned int res = 0;
1602 static const struct vm_operations_struct meye_vm_ops = {
1603 .open = meye_vm_open,
1604 .close = meye_vm_close,
1607 static int meye_mmap(
struct file *file,
struct vm_area_struct *vma)
1609 unsigned long start = vma->
vm_start;
1615 if (size > gbuffers * gbufsize) {
1629 for (i = 0; i < gbuffers; i++)
1648 vma->
vm_ops = &meye_vm_ops;
1650 vma->
vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1661 .release = meye_release,
1691 .ioctl_ops = &meye_ioctl_ops,
1705 static int meye_resume(
struct pci_dev *pdev)
1719 switch (
meye.pm_mchip_mode) {
1721 mchip_continuous_start();
1724 mchip_cont_compression_start();
1736 unsigned long mchip_adr;
1745 v4l2_err(v4l2_dev,
"Could not register v4l2_device\n");
1752 v4l2_err(v4l2_dev,
"video_device_alloc() failed!\n");
1758 v4l2_err(v4l2_dev,
"grab buffer allocation failed\n");
1765 v4l2_err(v4l2_dev,
"fifo allocation failed\n");
1766 goto outkfifoalloc1;
1771 v4l2_err(v4l2_dev,
"fifo allocation failed\n");
1772 goto outkfifoalloc2;
1780 v4l2_err(v4l2_dev,
"meye: unable to power on the camera\n");
1781 v4l2_err(v4l2_dev,
"meye: did you enable the camera in "
1782 "sonypi using the module options ?\n");
1783 goto outsonypienable;
1787 v4l2_err(v4l2_dev,
"meye: pci_enable_device failed\n");
1793 v4l2_err(v4l2_dev,
"meye: mchip has no device base address\n");
1799 v4l2_err(v4l2_dev,
"meye: request_mem_region failed\n");
1804 v4l2_err(v4l2_dev,
"meye: ioremap failed\n");
1811 v4l2_err(v4l2_dev,
"request_irq failed\n");
1858 v4l2_err(v4l2_dev,
"video_register_device failed\n");
1862 v4l2_info(v4l2_dev,
"Motion Eye Camera Driver v%s.\n",
1864 v4l2_info(v4l2_dev,
"mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1936 .id_table = meye_pci_tbl,
1937 .probe = meye_probe,
1940 .suspend = meye_suspend,
1941 .resume = meye_resume,
1945 static int __init meye_init(
void)
1947 gbuffers =
max(2,
min((
int)gbuffers, MEYE_MAX_BUFNBRS));
1954 gbufsize / 1024, gbuffers * gbufsize / 1024);
1955 return pci_register_driver(&meye_driver);
1958 static void __exit meye_exit(
void)