1 /*
2  * Motion Eye video4linux driver for Sony Vaio PictureBook
3  *
4  * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
5  *
6  * Copyright (C) 2001-2002 Alcôve <www.alcove.com>
7  *
8  * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
9  *
10  * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
11  *
12  * Some parts borrowed from various video4linux drivers, especially
13  * bttv-driver.c and zoran.c, see original files for credits.
14  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
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 
46 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
47 MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
48 MODULE_LICENSE("GPL");
49 MODULE_VERSION(MEYE_DRIVER_VERSION);
50 
51 /* number of grab buffers */
52 static unsigned int gbuffers = 2;
53 module_param(gbuffers, int, 0444);
54 MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
55 
56 /* size of a grab buffer */
57 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
58 module_param(gbufsize, int, 0444);
59 MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400 (will be rounded up to a page multiple)");
60 
61 /* /dev/videoX registration number */
62 static int video_nr = -1;
63 module_param(video_nr, int, 0444);
64 MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
65 
66 /* driver structure - only one possible */
67 static struct meye meye;
68 
69 /****************************************************************************/
70 /* Memory allocation routines (stolen from bttv-driver.c)                   */
71 /****************************************************************************/
rvmalloc(unsigned long size)72 static 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 
rvfree(void * mem,unsigned long size)91 static 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  * return a page table pointing to N pages of locked memory
108  *
109  * NOTE: The meye device expects DMA addresses on 32 bits, we build
110  * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
111  */
ptable_alloc(void)112 static int ptable_alloc(void)
113 {
114 	u32 *pt;
115 	int i;
116 
117 	memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
118 
119 	/* give only 32 bit DMA addresses */
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 
ptable_free(void)163 static 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 /* copy data from ptable into buf */
ptable_copy(u8 * buf,int start,int size,int pt_pages)190 static 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 /* JPEG tables at different qualities to load into the VRJ chip             */
204 /****************************************************************************/
205 
206 /* return a set of quantisation tables based on a quality from 1 to 10 */
jpeg_quantisation_tables(int * length,int quality)207 static 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 /* return a generic set of huffman tables */
jpeg_huffman_tables(int * length)353 static 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 /* MCHIP low-level functions                                                */
394 /****************************************************************************/
395 
396 /* returns the horizontal capture size */
mchip_hsize(void)397 static inline int mchip_hsize(void)
398 {
399 	return meye.params.subsample ? 320 : 640;
400 }
401 
402 /* returns the vertical capture size */
mchip_vsize(void)403 static inline int mchip_vsize(void)
404 {
405 	return meye.params.subsample ? 240 : 480;
406 }
407 
408 /* waits for a register to be available */
mchip_sync(int reg)409 static 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 /* sets a value into the register */
mchip_set(int reg,u32 v)443 static inline void mchip_set(int reg, u32 v)
444 {
445 	mchip_sync(reg);
446 	writel(v, meye.mchip_mmregs + reg);
447 }
448 
449 /* get the register value */
mchip_read(int reg)450 static inline u32 mchip_read(int reg)
451 {
452 	mchip_sync(reg);
453 	return readl(meye.mchip_mmregs + reg);
454 }
455 
456 /* wait for a register to become a particular value */
mchip_delay(u32 reg,u32 v)457 static 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 /* setup subsampling */
mchip_subsample(void)466 static 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 /* set the framerate into the mchip */
mchip_set_framerate(void)477 static void mchip_set_framerate(void)
478 {
479 	mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
480 }
481 
482 /* load some huffman and quantisation tables into the VRJ chip ready
483    for JPEG compression */
mchip_load_tables(void)484 static 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 /* setup the VRJ parameters in the chip */
mchip_vrj_setup(u8 mode)500 static 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 /* sets the DMA parameters into the chip */
mchip_dma_setup(dma_addr_t dma_addr)524 static 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 /* setup for DMA transfers - also zeros the framebuffer */
mchip_dma_alloc(void)535 static int mchip_dma_alloc(void)
536 {
537 	if (!meye.mchip_dmahandle)
538 		if (ptable_alloc())
539 			return -1;
540 	return 0;
541 }
542 
543 /* frees the DMA buffer */
mchip_dma_free(void)544 static void mchip_dma_free(void)
545 {
546 	if (meye.mchip_dmahandle) {
547 		mchip_dma_setup(0);
548 		ptable_free();
549 	}
550 }
551 
552 /* stop any existing HIC action and wait for any dma to complete then
553    reset the dma engine */
mchip_hic_stop(void)554 static 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 /* MCHIP frame processing functions                                         */
580 /****************************************************************************/
581 
582 /* get the next ready frame from the dma engine */
mchip_get_frame(void)583 static u32 mchip_get_frame(void)
584 {
585 	return mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
586 }
587 
588 /* frees the current frame from the dma engine */
mchip_free_frame(void)589 static 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 /* read one frame from the framebuffer assuming it was captured using
597    a uncompressed transfer */
mchip_cont_read_frame(u32 v,u8 * buf,int size)598 static 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 /* read a compressed frame from the framebuffer */
mchip_comp_read_frame(u32 v,u8 * buf,int size)608 static 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 	/* Some mchip generated jpeg frames are incorrect. In most
635 	 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
636 	 * is not present at the end of the frame.
637 	 *
638 	 * Since adding the final marker is not enough to restore
639 	 * the jpeg integrity, we drop the frame.
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 /* take a picture into SDRAM */
mchip_take_picture(void)653 static 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 /* dma a previously taken picture into a buffer */
mchip_get_picture(u8 * buf,int bufsize)674 static 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 /* start continuous dma capture */
mchip_continuous_start(void)699 static 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 /* compress one frame into a buffer */
mchip_compress_frame(u8 * buf,int bufsize)715 static 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 /* uncompress one image into a buffer */
746 static 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 /* start continuous compressed capture */
mchip_cont_compression_start(void)761 static 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 /* Interrupt handling                                                       */
779 /****************************************************************************/
780 
meye_irq(int irq,void * dev_id)781 static 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 
793 again:
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 /* video4linux integration                                                  */
841 /****************************************************************************/
842 
meye_open(struct file * file)843 static 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 
meye_release(struct file * file)865 static 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 
meyeioc_g_params(struct meye_params * p)873 static int meyeioc_g_params(struct meye_params *p)
874 {
875 	*p = meye.params;
876 	return 0;
877 }
878 
meyeioc_s_params(struct meye_params * jp)879 static 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();	/* need restart */
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 
meyeioc_qbuf_capt(int * nb)911 static 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 		/* stop capture */
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 
meyeioc_sync(struct file * file,void * fh,int * i)941 static 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 		/* fall through */
965 	case MEYE_BUF_DONE:
966 		meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
967 		if (kfifo_out_locked(&meye.doneq, (unsigned char *)&unused,
968 				sizeof(int), &meye.doneq_lock) != sizeof(int))
969 					break;
970 	}
971 	*i = meye.grab_buffer[*i].size;
972 	mutex_unlock(&meye.lock);
973 	return 0;
974 }
975 
meyeioc_stillcapt(void)976 static 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 
meyeioc_stilljcapt(int * len)997 static 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 
vidioc_querycap(struct file * file,void * fh,struct v4l2_capability * cap)1019 static 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 
vidioc_enum_input(struct file * file,void * fh,struct v4l2_input * i)1033 static 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 
vidioc_g_input(struct file * file,void * fh,unsigned int * i)1044 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1045 {
1046 	*i = 0;
1047 	return 0;
1048 }
1049 
vidioc_s_input(struct file * file,void * fh,unsigned int i)1050 static 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 
meye_s_ctrl(struct v4l2_ctrl * ctrl)1058 static 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 
vidioc_enum_fmt_vid_cap(struct file * file,void * fh,struct v4l2_fmtdesc * f)1112 static 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 		/* standard YUV 422 capture */
1120 		f->flags = 0;
1121 		strcpy(f->description, "YUV422");
1122 		f->pixelformat = V4L2_PIX_FMT_YUYV;
1123 	} else {
1124 		/* compressed MJPEG capture */
1125 		f->flags = V4L2_FMT_FLAG_COMPRESSED;
1126 		strcpy(f->description, "MJPEG");
1127 		f->pixelformat = V4L2_PIX_FMT_MJPEG;
1128 	}
1129 
1130 	return 0;
1131 }
1132 
vidioc_try_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1133 static 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 
vidioc_g_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1162 static 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 
vidioc_s_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1185 static 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 
vidioc_reqbufs(struct file * file,void * fh,struct v4l2_requestbuffers * req)1227 static 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 		/* already allocated, no modifications */
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 
vidioc_querybuf(struct file * file,void * fh,struct v4l2_buffer * buf)1269 static 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 
vidioc_qbuf(struct file * file,void * fh,struct v4l2_buffer * buf)1295 static 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 
vidioc_dqbuf(struct file * file,void * fh,struct v4l2_buffer * buf)1317 static 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 
vidioc_streamon(struct file * file,void * fh,enum v4l2_buf_type i)1363 static 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 
vidioc_streamoff(struct file * file,void * fh,enum v4l2_buf_type i)1384 static 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 
vidioc_default(struct file * file,void * fh,bool valid_prio,unsigned int cmd,void * arg)1398 static 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 
meye_poll(struct file * file,poll_table * wait)1426 static __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 
meye_vm_open(struct vm_area_struct * vma)1438 static 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 
meye_vm_close(struct vm_area_struct * vma)1444 static 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 
1450 static const struct vm_operations_struct meye_vm_ops = {
1451 	.open		= meye_vm_open,
1452 	.close		= meye_vm_close,
1453 };
1454 
meye_mmap(struct file * file,struct vm_area_struct * vma)1455 static 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 		/* lazy allocation */
1471 		meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1472 		if (!meye.grab_fbuffer) {
1473 			printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1474 			mutex_unlock(&meye.lock);
1475 			return -ENOMEM;
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;	/* not I/O memory */
1498 	vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1499 	vma->vm_private_data = (void *) (offset / gbufsize);
1500 	meye_vm_open(vma);
1501 
1502 	mutex_unlock(&meye.lock);
1503 	return 0;
1504 }
1505 
1506 static const struct v4l2_file_operations meye_fops = {
1507 	.owner		= THIS_MODULE,
1508 	.open		= meye_open,
1509 	.release	= meye_release,
1510 	.mmap		= meye_mmap,
1511 	.unlocked_ioctl	= video_ioctl2,
1512 	.poll		= meye_poll,
1513 };
1514 
1515 static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1516 	.vidioc_querycap	= vidioc_querycap,
1517 	.vidioc_enum_input	= vidioc_enum_input,
1518 	.vidioc_g_input		= vidioc_g_input,
1519 	.vidioc_s_input		= vidioc_s_input,
1520 	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1521 	.vidioc_try_fmt_vid_cap	= vidioc_try_fmt_vid_cap,
1522 	.vidioc_g_fmt_vid_cap	= vidioc_g_fmt_vid_cap,
1523 	.vidioc_s_fmt_vid_cap	= vidioc_s_fmt_vid_cap,
1524 	.vidioc_reqbufs		= vidioc_reqbufs,
1525 	.vidioc_querybuf	= vidioc_querybuf,
1526 	.vidioc_qbuf		= vidioc_qbuf,
1527 	.vidioc_dqbuf		= vidioc_dqbuf,
1528 	.vidioc_streamon	= vidioc_streamon,
1529 	.vidioc_streamoff	= vidioc_streamoff,
1530 	.vidioc_log_status	= v4l2_ctrl_log_status,
1531 	.vidioc_subscribe_event	= v4l2_ctrl_subscribe_event,
1532 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1533 	.vidioc_default		= vidioc_default,
1534 };
1535 
1536 static const struct video_device meye_template = {
1537 	.name		= "meye",
1538 	.fops		= &meye_fops,
1539 	.ioctl_ops	= &meye_ioctl_ops,
1540 	.release	= video_device_release_empty,
1541 };
1542 
1543 static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1544 	.s_ctrl = meye_s_ctrl,
1545 };
1546 
1547 #ifdef CONFIG_PM
meye_suspend(struct pci_dev * pdev,pm_message_t state)1548 static 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 
meye_resume(struct pci_dev * pdev)1557 static 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 
meye_probe(struct pci_dev * pcidev,const struct pci_device_id * ent)1583 static 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 	/* Ask the camera to perform a soft reset. */
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 
1743 outvideoreg:
1744 	v4l2_ctrl_handler_free(&meye.hdl);
1745 	free_irq(meye.mchip_irq, meye_irq);
1746 outreqirq:
1747 	iounmap(meye.mchip_mmregs);
1748 outremap:
1749 	release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1750 			   pci_resource_len(meye.mchip_dev, 0));
1751 outregions:
1752 	pci_disable_device(meye.mchip_dev);
1753 outenabledev:
1754 	sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1755 outsonypienable:
1756 	kfifo_free(&meye.doneq);
1757 outkfifoalloc2:
1758 	kfifo_free(&meye.grabq);
1759 outkfifoalloc1:
1760 	vfree(meye.grab_temp);
1761 outvmalloc:
1762 	return ret;
1763 }
1764 
meye_remove(struct pci_dev * pcidev)1765 static 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 	/* disable interrupts */
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 
1800 static const struct pci_device_id meye_pci_tbl[] = {
1801 	{ PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1802 	{ }
1803 };
1804 
1805 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1806 
1807 static struct pci_driver meye_driver = {
1808 	.name		= "meye",
1809 	.id_table	= meye_pci_tbl,
1810 	.probe		= meye_probe,
1811 	.remove		= meye_remove,
1812 #ifdef CONFIG_PM
1813 	.suspend	= meye_suspend,
1814 	.resume		= meye_resume,
1815 #endif
1816 };
1817 
meye_init(void)1818 static 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 
meye_exit(void)1830 static void __exit meye_exit(void)
1831 {
1832 	pci_unregister_driver(&meye_driver);
1833 }
1834 
1835 module_init(meye_init);
1836 module_exit(meye_exit);
1837