1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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>
42
43#include "meye.h"
44#include <linux/meye.h>
45
46MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
47MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
48MODULE_LICENSE("GPL");
49MODULE_VERSION(MEYE_DRIVER_VERSION);
50
51
52static unsigned int gbuffers = 2;
53module_param(gbuffers, int, 0444);
54MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
55
56
57static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
58module_param(gbufsize, int, 0444);
59MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400 (will be rounded up to a page multiple)");
60
61
62static int video_nr = -1;
63module_param(video_nr, int, 0444);
64MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
65
66
67static struct meye meye;
68
69
70
71
72static void *rvmalloc(unsigned long size)
73{
74 void *mem;
75 unsigned long adr;
76
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;
86 }
87 }
88 return mem;
89}
90
91static void rvfree(void * mem, unsigned long size)
92{
93 unsigned long adr;
94
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;
101 }
102 vfree(mem);
103 }
104}
105
106
107
108
109
110
111
112static int ptable_alloc(void)
113{
114 u32 *pt;
115 int i;
116
117 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
118
119
120 if (dma_set_mask(&meye.mchip_dev->dev, DMA_BIT_MASK(32)))
121 return -1;
122
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;
130 }
131
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++;
148 }
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;
156 }
157 *pt = (u32) dma;
158 pt++;
159 }
160 return 0;
161}
162
163static void ptable_free(void)
164{
165 u32 *pt;
166 int i;
167
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++;
176 }
177
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);
183
184 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
185 meye.mchip_ptable_toc = NULL;
186 meye.mchip_dmahandle = 0;
187}
188
189
190static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
191{
192 int i;
193
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;
198 }
199 memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
200}
201
202
203
204
205
206
207static u16 *jpeg_quantisation_tables(int *length, int quality)
208{
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,
220 },
221 {
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,
232 },
233 {
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,
244 },
245 {
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,
256 },
257 {
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,
268 },
269 {
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,
280 },
281 {
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,
292 },
293 {
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,
304 },
305 {
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,
316 },
317 {
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,
328 },
329 {
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 } };
341
342 if (quality < 0 || quality > 10) {
343 printk(KERN_WARNING
344 "meye: invalid quality level %d - using 8\n", quality);
345 quality = 8;
346 }
347
348 *length = ARRAY_SIZE(jpeg_tables[quality]);
349 return jpeg_tables[quality];
350}
351
352
353static u16 *jpeg_huffman_tables(int *length)
354{
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
386 };
387
388 *length = ARRAY_SIZE(tables);
389 return tables;
390}
391
392
393
394
395
396
397static inline int mchip_hsize(void)
398{
399 return meye.params.subsample ? 320 : 640;
400}
401
402
403static inline int mchip_vsize(void)
404{
405 return meye.params.subsample ? 240 : 480;
406}
407
408
409static void mchip_sync(int reg)
410{
411 u32 status;
412 int i;
413
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;
421 }
422 if (status & MCHIP_MM_FIFO_READY)
423 return;
424 udelay(1);
425 }
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);
434 }
435 } else
436 return;
437 printk(KERN_WARNING
438 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
439 reg, status);
440}
441
442
443static inline void mchip_set(int reg, u32 v)
444{
445 mchip_sync(reg);
446 writel(v, meye.mchip_mmregs + reg);
447}
448
449
450static inline u32 mchip_read(int reg)
451{
452 mchip_sync(reg);
453 return readl(meye.mchip_mmregs + reg);
454}
455
456
457static inline int mchip_delay(u32 reg, u32 v)
458{
459 int n = 10;
460 while (--n && mchip_read(reg) != v)
461 udelay(1);
462 return n;
463}
464
465
466static void mchip_subsample(void)
467{
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);
474}
475
476
477static void mchip_set_framerate(void)
478{
479 mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
480}
481
482
483
484static void mchip_load_tables(void)
485{
486 int i;
487 int length;
488 u16 *tables;
489
490 tables = jpeg_huffman_tables(&length);
491 for (i = 0; i < length; i++)
492 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
493
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);
497}
498
499
500static void mchip_vrj_setup(u8 mode)
501{
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);
519
520 mchip_load_tables();
521}
522
523
524static void mchip_dma_setup(dma_addr_t dma_addr)
525{
526 int i;
527
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;
532}
533
534
535static int mchip_dma_alloc(void)
536{
537 if (!meye.mchip_dmahandle)
538 if (ptable_alloc())
539 return -1;
540 return 0;
541}
542
543
544static void mchip_dma_free(void)
545{
546 if (meye.mchip_dmahandle) {
547 mchip_dma_setup(0);
548 ptable_free();
549 }
550}
551
552
553
554static void mchip_hic_stop(void)
555{
556 int i, j;
557
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);
569 }
570 printk(KERN_ERR "meye: need to reset HIC!\n");
571
572 mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
573 msleep(250);
574 }
575 printk(KERN_ERR "meye: resetting HIC hanged!\n");
576}
577
578
579
580
581
582
583static u32 mchip_get_frame(void)
584{
585 return mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
586}
587
588
589static void mchip_free_frame(void)
590{
591 mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
592 meye.mchip_fnum++;
593 meye.mchip_fnum %= 4;
594}
595
596
597
598static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
599{
600 int pt_id;
601
602 pt_id = (v >> 17) & 0x3FF;
603
604 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
605}
606
607
608static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
609{
610 int pt_start, pt_end, trailer;
611 int fsize;
612 int i;
613
614 pt_start = (v >> 19) & 0xFF;
615 pt_end = (v >> 11) & 0xFF;
616 trailer = (v >> 1) & 0x3FF;
617
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;
623
624 if (fsize > size) {
625 printk(KERN_WARNING "meye: oversized compressed frame %d\n",
626 fsize);
627 return -1;
628 }
629
630 ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
631
632#ifdef MEYE_JPEG_CORRECTION
633
634
635
636
637
638
639
640
641
642 for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
643
644 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
645 return -1;
646
647#endif
648
649 return fsize;
650}
651
652
653static void mchip_take_picture(void)
654{
655 int i;
656
657 mchip_hic_stop();
658 mchip_subsample();
659 mchip_dma_setup(meye.mchip_dmahandle);
660
661 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
662 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
663
664 mchip_delay(MCHIP_HIC_CMD, 0);
665
666 for (i = 0; i < 100; ++i) {
667 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
668 break;
669 msleep(1);
670 }
671}
672
673
674static void mchip_get_picture(u8 *buf, int bufsize)
675{
676 u32 v;
677 int i;
678
679 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
680 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
681
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);
687 }
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;
693 }
694 mchip_free_frame();
695 }
696}
697
698
699static void mchip_continuous_start(void)
700{
701 mchip_hic_stop();
702 mchip_subsample();
703 mchip_set_framerate();
704 mchip_dma_setup(meye.mchip_dmahandle);
705
706 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
707
708 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
709 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
710
711 mchip_delay(MCHIP_HIC_CMD, 0);
712}
713
714
715static int mchip_compress_frame(u8 *buf, int bufsize)
716{
717 u32 v;
718 int len = -1, i;
719
720 mchip_vrj_setup(0x3f);
721 udelay(50);
722
723 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
724 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
725
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);
731 }
732
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;
738 }
739 mchip_free_frame();
740 }
741 return len;
742}
743
744#if 0
745
746static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
747{
748 mchip_vrj_setup(0x3f);
749 udelay(50);
750
751 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
752 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
753
754 mchip_delay(MCHIP_HIC_CMD, 0);
755
756 return mchip_comp_read_frame(buf, bufsize);
757}
758#endif
759
760
761static void mchip_cont_compression_start(void)
762{
763 mchip_hic_stop();
764 mchip_vrj_setup(0x3f);
765 mchip_subsample();
766 mchip_set_framerate();
767 mchip_dma_setup(meye.mchip_dmahandle);
768
769 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
770
771 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
772 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
773
774 mchip_delay(MCHIP_HIC_CMD, 0);
775}
776
777
778
779
780
781static irqreturn_t meye_irq(int irq, void *dev_id)
782{
783 u32 v;
784 int reqnr;
785 static int sequence;
786
787 v = mchip_read(MCHIP_MM_INTA);
788
789 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
790 meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
791 return IRQ_NONE;
792
793again:
794 v = mchip_get_frame();
795 if (!(v & MCHIP_MM_FIR_RDY))
796 return IRQ_HANDLED;
797
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;
803 }
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;
819 }
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;
824 }
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);
834 }
835 mchip_free_frame();
836 goto again;
837}
838
839
840
841
842
843static int meye_open(struct file *file)
844{
845 int i;
846
847 if (test_and_set_bit(0, &meye.in_use))
848 return -EBUSY;
849
850 mchip_hic_stop();
851
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;
856 }
857
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);
863}
864
865static int meye_release(struct file *file)
866{
867 mchip_hic_stop();
868 mchip_dma_free();
869 clear_bit(0, &meye.in_use);
870 return v4l2_fh_release(file);
871}
872
873static int meyeioc_g_params(struct meye_params *p)
874{
875 *p = meye.params;
876 return 0;
877}
878
879static int meyeioc_s_params(struct meye_params *jp)
880{
881 if (jp->subsample > 1)
882 return -EINVAL;
883
884 if (jp->quality > 10)
885 return -EINVAL;
886
887 if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
888 return -EINVAL;
889
890 if (jp->framerate > 31)
891 return -EINVAL;
892
893 mutex_lock(&meye.lock);
894
895 if (meye.params.subsample != jp->subsample ||
896 meye.params.quality != jp->quality)
897 mchip_hic_stop();
898
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);
907
908 return 0;
909}
910
911static int meyeioc_qbuf_capt(int *nb)
912{
913 if (!meye.grab_fbuffer)
914 return -EINVAL;
915
916 if (*nb >= gbuffers)
917 return -EINVAL;
918
919 if (*nb < 0) {
920
921 mchip_hic_stop();
922 return 0;
923 }
924
925 if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
926 return -EBUSY;
927
928 mutex_lock(&meye.lock);
929
930 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
931 mchip_cont_compression_start();
932
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);
937
938 return 0;
939}
940
941static int meyeioc_sync(struct file *file, void *fh, int *i)
942{
943 int unused;
944
945 if (*i < 0 || *i >= gbuffers)
946 return -EINVAL;
947
948 mutex_lock(&meye.lock);
949 switch (meye.grab_buffer[*i].state) {
950
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;
958 }
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;
963 }
964
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;
970 }
971 *i = meye.grab_buffer[*i].size;
972 mutex_unlock(&meye.lock);
973 return 0;
974}
975
976static int meyeioc_stillcapt(void)
977{
978 if (!meye.grab_fbuffer)
979 return -EINVAL;
980
981 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
982 return -EBUSY;
983
984 mutex_lock(&meye.lock);
985 meye.grab_buffer[0].state = MEYE_BUF_USING;
986 mchip_take_picture();
987
988 mchip_get_picture(meye.grab_fbuffer,
989 mchip_hsize() * mchip_vsize() * 2);
990
991 meye.grab_buffer[0].state = MEYE_BUF_DONE;
992 mutex_unlock(&meye.lock);
993
994 return 0;
995}
996
997static int meyeioc_stilljcapt(int *len)
998{
999 if (!meye.grab_fbuffer)
1000 return -EINVAL;
1001
1002 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1003 return -EBUSY;
1004
1005 mutex_lock(&meye.lock);
1006 meye.grab_buffer[0].state = MEYE_BUF_USING;
1007 *len = -1;
1008
1009 while (*len == -1) {
1010 mchip_take_picture();
1011 *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1012 }
1013
1014 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1015 mutex_unlock(&meye.lock);
1016 return 0;
1017}
1018
1019static int vidioc_querycap(struct file *file, void *fh,
1020 struct v4l2_capability *cap)
1021{
1022 strcpy(cap->driver, "meye");
1023 strcpy(cap->card, "meye");
1024 sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1025
1026 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
1027 V4L2_CAP_STREAMING;
1028 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
1029
1030 return 0;
1031}
1032
1033static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1034{
1035 if (i->index != 0)
1036 return -EINVAL;
1037
1038 strcpy(i->name, "Camera");
1039 i->type = V4L2_INPUT_TYPE_CAMERA;
1040
1041 return 0;
1042}
1043
1044static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1045{
1046 *i = 0;
1047 return 0;
1048}
1049
1050static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1051{
1052 if (i != 0)
1053 return -EINVAL;
1054
1055 return 0;
1056}
1057
1058static int meye_s_ctrl(struct v4l2_ctrl *ctrl)
1059{
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;
1106 }
1107 mutex_unlock(&meye.lock);
1108
1109 return 0;
1110}
1111
1112static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1113 struct v4l2_fmtdesc *f)
1114{
1115 if (f->index > 1)
1116 return -EINVAL;
1117
1118 if (f->index == 0) {
1119
1120 f->flags = 0;
1121 strcpy(f->description, "YUV422");
1122 f->pixelformat = V4L2_PIX_FMT_YUYV;
1123 } else {
1124
1125 f->flags = V4L2_FMT_FLAG_COMPRESSED;
1126 strcpy(f->description, "MJPEG");
1127 f->pixelformat = V4L2_PIX_FMT_MJPEG;
1128 }
1129
1130 return 0;
1131}
1132
1133static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1134 struct v4l2_format *f)
1135{
1136 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1137 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1138 return -EINVAL;
1139
1140 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1141 f->fmt.pix.field != V4L2_FIELD_NONE)
1142 return -EINVAL;
1143
1144 f->fmt.pix.field = V4L2_FIELD_NONE;
1145
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;
1152 }
1153
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;
1158
1159 return 0;
1160}
1161
1162static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1163 struct v4l2_format *f)
1164{
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;
1173 }
1174
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;
1181
1182 return 0;
1183}
1184
1185static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1186 struct v4l2_format *f)
1187{
1188 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1189 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1190 return -EINVAL;
1191
1192 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1193 f->fmt.pix.field != V4L2_FIELD_NONE)
1194 return -EINVAL;
1195
1196 f->fmt.pix.field = V4L2_FIELD_NONE;
1197 mutex_lock(&meye.lock);
1198
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;
1207 }
1208
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;
1216 }
1217
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;
1223
1224 return 0;
1225}
1226
1227static int vidioc_reqbufs(struct file *file, void *fh,
1228 struct v4l2_requestbuffers *req)
1229{
1230 int i;
1231
1232 if (req->memory != V4L2_MEMORY_MMAP)
1233 return -EINVAL;
1234
1235 if (meye.grab_fbuffer && req->count == gbuffers) {
1236
1237 return 0;
1238 }
1239
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;
1246 }
1247 rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1248 meye.grab_fbuffer = NULL;
1249 }
1250
1251 gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1252 req->count = gbuffers;
1253 meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1254
1255 if (!meye.grab_fbuffer) {
1256 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1257 mutex_unlock(&meye.lock);
1258 return -ENOMEM;
1259 }
1260
1261 for (i = 0; i < gbuffers; i++)
1262 meye.vma_use_count[i] = 0;
1263
1264 mutex_unlock(&meye.lock);
1265
1266 return 0;
1267}
1268
1269static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1270{
1271 unsigned int index = buf->index;
1272
1273 if (index >= gbuffers)
1274 return -EINVAL;
1275
1276 buf->bytesused = meye.grab_buffer[index].size;
1277 buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1278
1279 if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1280 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1281
1282 if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1283 buf->flags |= V4L2_BUF_FLAG_DONE;
1284
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;
1291
1292 return 0;
1293}
1294
1295static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1296{
1297 if (buf->memory != V4L2_MEMORY_MMAP)
1298 return -EINVAL;
1299
1300 if (buf->index >= gbuffers)
1301 return -EINVAL;
1302
1303 if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1304 return -EINVAL;
1305
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);
1313
1314 return 0;
1315}
1316
1317static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1318{
1319 int reqnr;
1320
1321 if (buf->memory != V4L2_MEMORY_MMAP)
1322 return -EINVAL;
1323
1324 mutex_lock(&meye.lock);
1325
1326 if (kfifo_len(&meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1327 mutex_unlock(&meye.lock);
1328 return -EAGAIN;
1329 }
1330
1331 if (wait_event_interruptible(meye.proc_list,
1332 kfifo_len(&meye.doneq) != 0) < 0) {
1333 mutex_unlock(&meye.lock);
1334 return -EINTR;
1335 }
1336
1337 if (!kfifo_out_locked(&meye.doneq, (unsigned char *)&reqnr,
1338 sizeof(int), &meye.doneq_lock)) {
1339 mutex_unlock(&meye.lock);
1340 return -EBUSY;
1341 }
1342
1343 if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1344 mutex_unlock(&meye.lock);
1345 return -EINVAL;
1346 }
1347
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);
1359
1360 return 0;
1361}
1362
1363static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1364{
1365 mutex_lock(&meye.lock);
1366
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;
1377 }
1378
1379 mutex_unlock(&meye.lock);
1380
1381 return 0;
1382}
1383
1384static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1385{
1386 mutex_lock(&meye.lock);
1387 mchip_hic_stop();
1388 kfifo_reset(&meye.grabq);
1389 kfifo_reset(&meye.doneq);
1390
1391 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1392 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1393
1394 mutex_unlock(&meye.lock);
1395 return 0;
1396}
1397
1398static long vidioc_default(struct file *file, void *fh, bool valid_prio,
1399 unsigned int cmd, void *arg)
1400{
1401 switch (cmd) {
1402 case MEYEIOC_G_PARAMS:
1403 return meyeioc_g_params((struct meye_params *) arg);
1404
1405 case MEYEIOC_S_PARAMS:
1406 return meyeioc_s_params((struct meye_params *) arg);
1407
1408 case MEYEIOC_QBUF_CAPT:
1409 return meyeioc_qbuf_capt((int *) arg);
1410
1411 case MEYEIOC_SYNC:
1412 return meyeioc_sync(file, fh, (int *) arg);
1413
1414 case MEYEIOC_STILLCAPT:
1415 return meyeioc_stillcapt();
1416
1417 case MEYEIOC_STILLJCAPT:
1418 return meyeioc_stilljcapt((int *) arg);
1419
1420 default:
1421 return -ENOTTY;
1422 }
1423
1424}
1425
1426static __poll_t meye_poll(struct file *file, poll_table *wait)
1427{
1428 __poll_t res = v4l2_ctrl_poll(file, wait);
1429
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;
1436}
1437
1438static void meye_vm_open(struct vm_area_struct *vma)
1439{
1440 long idx = (long)vma->vm_private_data;
1441 meye.vma_use_count[idx]++;
1442}
1443
1444static void meye_vm_close(struct vm_area_struct *vma)
1445{
1446 long idx = (long)vma->vm_private_data;
1447 meye.vma_use_count[idx]--;
1448}
1449
1450static const struct vm_operations_struct meye_vm_ops = {
1451 .open = meye_vm_open,
1452 .close = meye_vm_close,
1453};
1454
1455static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1456{
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;
1461
1462 mutex_lock(&meye.lock);
1463 if (size > gbuffers * gbufsize) {
1464 mutex_unlock(&meye.lock);
1465 return -EINVAL;
1466 }
1467 if (!meye.grab_fbuffer) {
1468 int i;
1469
1470
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;
1476 }
1477 for (i = 0; i < gbuffers; i++)
1478 meye.vma_use_count[i] = 0;
1479 }
1480 pos = (unsigned long)meye.grab_fbuffer + offset;
1481
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;
1487 }
1488 start += PAGE_SIZE;
1489 pos += PAGE_SIZE;
1490 if (size > PAGE_SIZE)
1491 size -= PAGE_SIZE;
1492 else
1493 size = 0;
1494 }
1495
1496 vma->vm_ops = &meye_vm_ops;
1497 vma->vm_flags &= ~VM_IO;
1498 vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1499 vma->vm_private_data = (void *) (offset / gbufsize);
1500 meye_vm_open(vma);
1501
1502 mutex_unlock(&meye.lock);
1503 return 0;
1504}
1505
1506static 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,
1513};
1514
1515static 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,
1534};
1535
1536static 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,
1541};
1542
1543static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1544 .s_ctrl = meye_s_ctrl,
1545};
1546
1547#ifdef CONFIG_PM
1548static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1549{
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;
1555}
1556
1557static int meye_resume(struct pci_dev *pdev)
1558{
1559 pci_restore_state(pdev);
1560 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1561
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);
1570
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;
1578 }
1579 return 0;
1580}
1581#endif
1582
1583static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1584{
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,
1594 };
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,
1602 };
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,
1610 };
1611 struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
1612 int ret = -EBUSY;
1613 unsigned long mchip_adr;
1614
1615 if (meye.mchip_dev != NULL) {
1616 printk(KERN_ERR "meye: only one device allowed!\n");
1617 return ret;
1618 }
1619
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;
1624 }
1625 ret = -ENOMEM;
1626 meye.mchip_dev = pcidev;
1627
1628 meye.grab_temp = vmalloc(array_size(PAGE_SIZE, MCHIP_NB_PAGES_MJPEG));
1629 if (!meye.grab_temp)
1630 goto outvmalloc;
1631
1632 spin_lock_init(&meye.grabq_lock);
1633 if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS,
1634 GFP_KERNEL))
1635 goto outkfifoalloc1;
1636
1637 spin_lock_init(&meye.doneq_lock);
1638 if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS,
1639 GFP_KERNEL))
1640 goto outkfifoalloc2;
1641
1642 meye.vdev = meye_template;
1643 meye.vdev.v4l2_dev = &meye.v4l2_dev;
1644
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;
1650 }
1651
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;
1656 }
1657
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;
1663 }
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;
1669 }
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;
1674 }
1675
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;
1681 }
1682
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);
1685
1686 pci_set_master(meye.mchip_dev);
1687
1688
1689 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1690
1691 mchip_delay(MCHIP_HIC_CMD, 0);
1692 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1693
1694 msleep(1);
1695 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1696
1697 msleep(1);
1698 mchip_set(MCHIP_MM_PCI_MODE, 5);
1699
1700 msleep(1);
1701 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1702
1703 mutex_init(&meye.lock);
1704 init_waitqueue_head(&meye.proc_list);
1705
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;
1725 }
1726
1727 v4l2_ctrl_handler_setup(&meye.hdl);
1728 meye.vdev.ctrl_handler = &meye.hdl;
1729
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;
1734 }
1735
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);
1740
1741 return 0;
1742
1743outvideoreg:
1744 v4l2_ctrl_handler_free(&meye.hdl);
1745 free_irq(meye.mchip_irq, meye_irq);
1746outreqirq:
1747 iounmap(meye.mchip_mmregs);
1748outremap:
1749 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1750 pci_resource_len(meye.mchip_dev, 0));
1751outregions:
1752 pci_disable_device(meye.mchip_dev);
1753outenabledev:
1754 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1755outsonypienable:
1756 kfifo_free(&meye.doneq);
1757outkfifoalloc2:
1758 kfifo_free(&meye.grabq);
1759outkfifoalloc1:
1760 vfree(meye.grab_temp);
1761outvmalloc:
1762 return ret;
1763}
1764
1765static void meye_remove(struct pci_dev *pcidev)
1766{
1767 video_unregister_device(&meye.vdev);
1768
1769 mchip_hic_stop();
1770
1771 mchip_dma_free();
1772
1773
1774 mchip_set(MCHIP_MM_INTA, 0x0);
1775
1776 free_irq(meye.mchip_irq, meye_irq);
1777
1778 iounmap(meye.mchip_mmregs);
1779
1780 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1781 pci_resource_len(meye.mchip_dev, 0));
1782
1783 pci_disable_device(meye.mchip_dev);
1784
1785 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1786
1787 kfifo_free(&meye.doneq);
1788 kfifo_free(&meye.grabq);
1789
1790 vfree(meye.grab_temp);
1791
1792 if (meye.grab_fbuffer) {
1793 rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1794 meye.grab_fbuffer = NULL;
1795 }
1796
1797 printk(KERN_INFO "meye: removed\n");
1798}
1799
1800static const struct pci_device_id meye_pci_tbl[] = {
1801 { PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1802 { }
1803};
1804
1805MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1806
1807static 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
1816};
1817
1818static int __init meye_init(void)
1819{
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);
1828}
1829
1830static void __exit meye_exit(void)
1831{
1832 pci_unregister_driver(&meye_driver);
1833}
1834
1835module_init(meye_init);
1836module_exit(meye_exit);
1837