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