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 /****************************************************************************/
rvmalloc(unsigned long size)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 
rvfree(void * mem,unsigned long size)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  */
ptable_alloc(void)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 
ptable_free(void)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 */
ptable_copy(u8 * buf,int start,int size,int pt_pages)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 */
jpeg_quantisation_tables(int * length,int quality)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 */
jpeg_huffman_tables(int * length)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 */
mchip_hsize(void)388 static inline int mchip_hsize(void)
389 {
390 	return meye.params.subsample ? 320 : 640;
391 }
392 
393 /* returns the vertical capture size */
mchip_vsize(void)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 */
mchip_sync(int reg)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 */
mchip_set(int reg,u32 v)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 */
mchip_read(int reg)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 */
mchip_delay(u32 reg,u32 v)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 */
mchip_subsample(void)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 */
mchip_set_framerate(void)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 */
mchip_load_tables(void)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 */
mchip_vrj_setup(u8 mode)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 */
mchip_dma_setup(dma_addr_t dma_addr)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 */
mchip_dma_alloc(void)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 */
mchip_dma_free(void)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 */
mchip_hic_stop(void)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 */
mchip_get_frame(void)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 */
mchip_free_frame(void)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 */
mchip_cont_read_frame(u32 v,u8 * buf,int size)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 */
mchip_comp_read_frame(u32 v,u8 * buf,int size)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 */
mchip_take_picture(void)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 */
mchip_get_picture(u8 * buf,int bufsize)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 */
mchip_continuous_start(void)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 */
mchip_compress_frame(u8 * buf,int bufsize)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 */
mchip_cont_compression_start(void)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 
meye_irq(int irq,void * dev_id)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 
meye_open(struct file * file)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 
meye_release(struct file * file)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 
meyeioc_g_params(struct meye_params * p)864 static int meyeioc_g_params(struct meye_params *p)
865 {
866 	*p = meye.params;
867 	return 0;
868 }
869 
meyeioc_s_params(struct meye_params * jp)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 
meyeioc_qbuf_capt(int * nb)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 
meyeioc_sync(struct file * file,void * fh,int * i)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 
meyeioc_stillcapt(void)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 
meyeioc_stilljcapt(int * len)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 
vidioc_querycap(struct file * file,void * fh,struct v4l2_capability * cap)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 	return 0;
1017 }
1018 
vidioc_enum_input(struct file * file,void * fh,struct v4l2_input * i)1019 static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1020 {
1021 	if (i->index != 0)
1022 		return -EINVAL;
1023 
1024 	strscpy(i->name, "Camera", sizeof(i->name));
1025 	i->type = V4L2_INPUT_TYPE_CAMERA;
1026 
1027 	return 0;
1028 }
1029 
vidioc_g_input(struct file * file,void * fh,unsigned int * i)1030 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1031 {
1032 	*i = 0;
1033 	return 0;
1034 }
1035 
vidioc_s_input(struct file * file,void * fh,unsigned int i)1036 static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1037 {
1038 	if (i != 0)
1039 		return -EINVAL;
1040 
1041 	return 0;
1042 }
1043 
meye_s_ctrl(struct v4l2_ctrl * ctrl)1044 static int meye_s_ctrl(struct v4l2_ctrl *ctrl)
1045 {
1046 	mutex_lock(&meye.lock);
1047 	switch (ctrl->id) {
1048 	case V4L2_CID_BRIGHTNESS:
1049 		sony_pic_camera_command(
1050 			SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val);
1051 		meye.brightness = ctrl->val << 10;
1052 		break;
1053 	case V4L2_CID_HUE:
1054 		sony_pic_camera_command(
1055 			SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val);
1056 		meye.hue = ctrl->val << 10;
1057 		break;
1058 	case V4L2_CID_CONTRAST:
1059 		sony_pic_camera_command(
1060 			SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val);
1061 		meye.contrast = ctrl->val << 10;
1062 		break;
1063 	case V4L2_CID_SATURATION:
1064 		sony_pic_camera_command(
1065 			SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val);
1066 		meye.colour = ctrl->val << 10;
1067 		break;
1068 	case V4L2_CID_MEYE_AGC:
1069 		sony_pic_camera_command(
1070 			SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val);
1071 		meye.params.agc = ctrl->val;
1072 		break;
1073 	case V4L2_CID_SHARPNESS:
1074 		sony_pic_camera_command(
1075 			SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val);
1076 		meye.params.sharpness = ctrl->val;
1077 		break;
1078 	case V4L2_CID_MEYE_PICTURE:
1079 		sony_pic_camera_command(
1080 			SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val);
1081 		meye.params.picture = ctrl->val;
1082 		break;
1083 	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1084 		meye.params.quality = ctrl->val;
1085 		break;
1086 	case V4L2_CID_MEYE_FRAMERATE:
1087 		meye.params.framerate = ctrl->val;
1088 		break;
1089 	default:
1090 		mutex_unlock(&meye.lock);
1091 		return -EINVAL;
1092 	}
1093 	mutex_unlock(&meye.lock);
1094 
1095 	return 0;
1096 }
1097 
vidioc_enum_fmt_vid_cap(struct file * file,void * fh,struct v4l2_fmtdesc * f)1098 static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1099 				struct v4l2_fmtdesc *f)
1100 {
1101 	if (f->index > 1)
1102 		return -EINVAL;
1103 
1104 	if (f->index == 0) {
1105 		/* standard YUV 422 capture */
1106 		f->flags = 0;
1107 		f->pixelformat = V4L2_PIX_FMT_YUYV;
1108 	} else {
1109 		/* compressed MJPEG capture */
1110 		f->pixelformat = V4L2_PIX_FMT_MJPEG;
1111 	}
1112 
1113 	return 0;
1114 }
1115 
vidioc_try_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1116 static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1117 				struct v4l2_format *f)
1118 {
1119 	if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1120 	    f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1121 		return -EINVAL;
1122 
1123 	if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1124 	    f->fmt.pix.field != V4L2_FIELD_NONE)
1125 		return -EINVAL;
1126 
1127 	f->fmt.pix.field = V4L2_FIELD_NONE;
1128 
1129 	if (f->fmt.pix.width <= 320) {
1130 		f->fmt.pix.width = 320;
1131 		f->fmt.pix.height = 240;
1132 	} else {
1133 		f->fmt.pix.width = 640;
1134 		f->fmt.pix.height = 480;
1135 	}
1136 
1137 	f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1138 	f->fmt.pix.sizeimage = f->fmt.pix.height *
1139 			       f->fmt.pix.bytesperline;
1140 	f->fmt.pix.colorspace = 0;
1141 
1142 	return 0;
1143 }
1144 
vidioc_g_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1145 static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1146 				    struct v4l2_format *f)
1147 {
1148 	switch (meye.mchip_mode) {
1149 	case MCHIP_HIC_MODE_CONT_OUT:
1150 	default:
1151 		f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1152 		break;
1153 	case MCHIP_HIC_MODE_CONT_COMP:
1154 		f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1155 		break;
1156 	}
1157 
1158 	f->fmt.pix.field = V4L2_FIELD_NONE;
1159 	f->fmt.pix.width = mchip_hsize();
1160 	f->fmt.pix.height = mchip_vsize();
1161 	f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1162 	f->fmt.pix.sizeimage = f->fmt.pix.height *
1163 			       f->fmt.pix.bytesperline;
1164 
1165 	return 0;
1166 }
1167 
vidioc_s_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1168 static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1169 				    struct v4l2_format *f)
1170 {
1171 	if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1172 	    f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1173 		return -EINVAL;
1174 
1175 	if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1176 	    f->fmt.pix.field != V4L2_FIELD_NONE)
1177 		return -EINVAL;
1178 
1179 	f->fmt.pix.field = V4L2_FIELD_NONE;
1180 	mutex_lock(&meye.lock);
1181 
1182 	if (f->fmt.pix.width <= 320) {
1183 		f->fmt.pix.width = 320;
1184 		f->fmt.pix.height = 240;
1185 		meye.params.subsample = 1;
1186 	} else {
1187 		f->fmt.pix.width = 640;
1188 		f->fmt.pix.height = 480;
1189 		meye.params.subsample = 0;
1190 	}
1191 
1192 	switch (f->fmt.pix.pixelformat) {
1193 	case V4L2_PIX_FMT_YUYV:
1194 		meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1195 		break;
1196 	case V4L2_PIX_FMT_MJPEG:
1197 		meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1198 		break;
1199 	}
1200 
1201 	mutex_unlock(&meye.lock);
1202 	f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1203 	f->fmt.pix.sizeimage = f->fmt.pix.height *
1204 			       f->fmt.pix.bytesperline;
1205 	f->fmt.pix.colorspace = 0;
1206 
1207 	return 0;
1208 }
1209 
vidioc_reqbufs(struct file * file,void * fh,struct v4l2_requestbuffers * req)1210 static int vidioc_reqbufs(struct file *file, void *fh,
1211 				struct v4l2_requestbuffers *req)
1212 {
1213 	int i;
1214 
1215 	if (req->memory != V4L2_MEMORY_MMAP)
1216 		return -EINVAL;
1217 
1218 	if (meye.grab_fbuffer && req->count == gbuffers) {
1219 		/* already allocated, no modifications */
1220 		return 0;
1221 	}
1222 
1223 	mutex_lock(&meye.lock);
1224 	if (meye.grab_fbuffer) {
1225 		for (i = 0; i < gbuffers; i++)
1226 			if (meye.vma_use_count[i]) {
1227 				mutex_unlock(&meye.lock);
1228 				return -EINVAL;
1229 			}
1230 		rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1231 		meye.grab_fbuffer = NULL;
1232 	}
1233 
1234 	gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1235 	req->count = gbuffers;
1236 	meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1237 
1238 	if (!meye.grab_fbuffer) {
1239 		printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1240 		mutex_unlock(&meye.lock);
1241 		return -ENOMEM;
1242 	}
1243 
1244 	for (i = 0; i < gbuffers; i++)
1245 		meye.vma_use_count[i] = 0;
1246 
1247 	mutex_unlock(&meye.lock);
1248 
1249 	return 0;
1250 }
1251 
vidioc_querybuf(struct file * file,void * fh,struct v4l2_buffer * buf)1252 static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1253 {
1254 	unsigned int index = buf->index;
1255 
1256 	if (index >= gbuffers)
1257 		return -EINVAL;
1258 
1259 	buf->bytesused = meye.grab_buffer[index].size;
1260 	buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1261 
1262 	if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1263 		buf->flags |= V4L2_BUF_FLAG_QUEUED;
1264 
1265 	if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1266 		buf->flags |= V4L2_BUF_FLAG_DONE;
1267 
1268 	buf->field = V4L2_FIELD_NONE;
1269 	buf->timestamp = ns_to_timeval(meye.grab_buffer[index].ts);
1270 	buf->sequence = meye.grab_buffer[index].sequence;
1271 	buf->memory = V4L2_MEMORY_MMAP;
1272 	buf->m.offset = index * gbufsize;
1273 	buf->length = gbufsize;
1274 
1275 	return 0;
1276 }
1277 
vidioc_qbuf(struct file * file,void * fh,struct v4l2_buffer * buf)1278 static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1279 {
1280 	if (buf->memory != V4L2_MEMORY_MMAP)
1281 		return -EINVAL;
1282 
1283 	if (buf->index >= gbuffers)
1284 		return -EINVAL;
1285 
1286 	if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1287 		return -EINVAL;
1288 
1289 	mutex_lock(&meye.lock);
1290 	buf->flags |= V4L2_BUF_FLAG_QUEUED;
1291 	buf->flags &= ~V4L2_BUF_FLAG_DONE;
1292 	meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1293 	kfifo_in_locked(&meye.grabq, (unsigned char *)&buf->index,
1294 			sizeof(int), &meye.grabq_lock);
1295 	mutex_unlock(&meye.lock);
1296 
1297 	return 0;
1298 }
1299 
vidioc_dqbuf(struct file * file,void * fh,struct v4l2_buffer * buf)1300 static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1301 {
1302 	int reqnr;
1303 
1304 	if (buf->memory != V4L2_MEMORY_MMAP)
1305 		return -EINVAL;
1306 
1307 	mutex_lock(&meye.lock);
1308 
1309 	if (kfifo_len(&meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1310 		mutex_unlock(&meye.lock);
1311 		return -EAGAIN;
1312 	}
1313 
1314 	if (wait_event_interruptible(meye.proc_list,
1315 				     kfifo_len(&meye.doneq) != 0) < 0) {
1316 		mutex_unlock(&meye.lock);
1317 		return -EINTR;
1318 	}
1319 
1320 	if (!kfifo_out_locked(&meye.doneq, (unsigned char *)&reqnr,
1321 		       sizeof(int), &meye.doneq_lock)) {
1322 		mutex_unlock(&meye.lock);
1323 		return -EBUSY;
1324 	}
1325 
1326 	if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1327 		mutex_unlock(&meye.lock);
1328 		return -EINVAL;
1329 	}
1330 
1331 	buf->index = reqnr;
1332 	buf->bytesused = meye.grab_buffer[reqnr].size;
1333 	buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1334 	buf->field = V4L2_FIELD_NONE;
1335 	buf->timestamp = ns_to_timeval(meye.grab_buffer[reqnr].ts);
1336 	buf->sequence = meye.grab_buffer[reqnr].sequence;
1337 	buf->memory = V4L2_MEMORY_MMAP;
1338 	buf->m.offset = reqnr * gbufsize;
1339 	buf->length = gbufsize;
1340 	meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1341 	mutex_unlock(&meye.lock);
1342 
1343 	return 0;
1344 }
1345 
vidioc_streamon(struct file * file,void * fh,enum v4l2_buf_type i)1346 static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1347 {
1348 	mutex_lock(&meye.lock);
1349 
1350 	switch (meye.mchip_mode) {
1351 	case MCHIP_HIC_MODE_CONT_OUT:
1352 		mchip_continuous_start();
1353 		break;
1354 	case MCHIP_HIC_MODE_CONT_COMP:
1355 		mchip_cont_compression_start();
1356 		break;
1357 	default:
1358 		mutex_unlock(&meye.lock);
1359 		return -EINVAL;
1360 	}
1361 
1362 	mutex_unlock(&meye.lock);
1363 
1364 	return 0;
1365 }
1366 
vidioc_streamoff(struct file * file,void * fh,enum v4l2_buf_type i)1367 static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1368 {
1369 	mutex_lock(&meye.lock);
1370 	mchip_hic_stop();
1371 	kfifo_reset(&meye.grabq);
1372 	kfifo_reset(&meye.doneq);
1373 
1374 	for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1375 		meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1376 
1377 	mutex_unlock(&meye.lock);
1378 	return 0;
1379 }
1380 
vidioc_default(struct file * file,void * fh,bool valid_prio,unsigned int cmd,void * arg)1381 static long vidioc_default(struct file *file, void *fh, bool valid_prio,
1382 			   unsigned int cmd, void *arg)
1383 {
1384 	switch (cmd) {
1385 	case MEYEIOC_G_PARAMS:
1386 		return meyeioc_g_params((struct meye_params *) arg);
1387 
1388 	case MEYEIOC_S_PARAMS:
1389 		return meyeioc_s_params((struct meye_params *) arg);
1390 
1391 	case MEYEIOC_QBUF_CAPT:
1392 		return meyeioc_qbuf_capt((int *) arg);
1393 
1394 	case MEYEIOC_SYNC:
1395 		return meyeioc_sync(file, fh, (int *) arg);
1396 
1397 	case MEYEIOC_STILLCAPT:
1398 		return meyeioc_stillcapt();
1399 
1400 	case MEYEIOC_STILLJCAPT:
1401 		return meyeioc_stilljcapt((int *) arg);
1402 
1403 	default:
1404 		return -ENOTTY;
1405 	}
1406 
1407 }
1408 
meye_poll(struct file * file,poll_table * wait)1409 static __poll_t meye_poll(struct file *file, poll_table *wait)
1410 {
1411 	__poll_t res = v4l2_ctrl_poll(file, wait);
1412 
1413 	mutex_lock(&meye.lock);
1414 	poll_wait(file, &meye.proc_list, wait);
1415 	if (kfifo_len(&meye.doneq))
1416 		res |= EPOLLIN | EPOLLRDNORM;
1417 	mutex_unlock(&meye.lock);
1418 	return res;
1419 }
1420 
meye_vm_open(struct vm_area_struct * vma)1421 static void meye_vm_open(struct vm_area_struct *vma)
1422 {
1423 	long idx = (long)vma->vm_private_data;
1424 	meye.vma_use_count[idx]++;
1425 }
1426 
meye_vm_close(struct vm_area_struct * vma)1427 static void meye_vm_close(struct vm_area_struct *vma)
1428 {
1429 	long idx = (long)vma->vm_private_data;
1430 	meye.vma_use_count[idx]--;
1431 }
1432 
1433 static const struct vm_operations_struct meye_vm_ops = {
1434 	.open		= meye_vm_open,
1435 	.close		= meye_vm_close,
1436 };
1437 
meye_mmap(struct file * file,struct vm_area_struct * vma)1438 static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1439 {
1440 	unsigned long start = vma->vm_start;
1441 	unsigned long size = vma->vm_end - vma->vm_start;
1442 	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1443 	unsigned long page, pos;
1444 
1445 	mutex_lock(&meye.lock);
1446 	if (size > gbuffers * gbufsize || offset > gbuffers * gbufsize - size) {
1447 		mutex_unlock(&meye.lock);
1448 		return -EINVAL;
1449 	}
1450 	if (!meye.grab_fbuffer) {
1451 		int i;
1452 
1453 		/* lazy allocation */
1454 		meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1455 		if (!meye.grab_fbuffer) {
1456 			printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1457 			mutex_unlock(&meye.lock);
1458 			return -ENOMEM;
1459 		}
1460 		for (i = 0; i < gbuffers; i++)
1461 			meye.vma_use_count[i] = 0;
1462 	}
1463 	pos = (unsigned long)meye.grab_fbuffer + offset;
1464 
1465 	while (size > 0) {
1466 		page = vmalloc_to_pfn((void *)pos);
1467 		if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1468 			mutex_unlock(&meye.lock);
1469 			return -EAGAIN;
1470 		}
1471 		start += PAGE_SIZE;
1472 		pos += PAGE_SIZE;
1473 		if (size > PAGE_SIZE)
1474 			size -= PAGE_SIZE;
1475 		else
1476 			size = 0;
1477 	}
1478 
1479 	vma->vm_ops = &meye_vm_ops;
1480 	vma->vm_flags &= ~VM_IO;	/* not I/O memory */
1481 	vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1482 	vma->vm_private_data = (void *) (offset / gbufsize);
1483 	meye_vm_open(vma);
1484 
1485 	mutex_unlock(&meye.lock);
1486 	return 0;
1487 }
1488 
1489 static const struct v4l2_file_operations meye_fops = {
1490 	.owner		= THIS_MODULE,
1491 	.open		= meye_open,
1492 	.release	= meye_release,
1493 	.mmap		= meye_mmap,
1494 	.unlocked_ioctl	= video_ioctl2,
1495 	.poll		= meye_poll,
1496 };
1497 
1498 static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1499 	.vidioc_querycap	= vidioc_querycap,
1500 	.vidioc_enum_input	= vidioc_enum_input,
1501 	.vidioc_g_input		= vidioc_g_input,
1502 	.vidioc_s_input		= vidioc_s_input,
1503 	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1504 	.vidioc_try_fmt_vid_cap	= vidioc_try_fmt_vid_cap,
1505 	.vidioc_g_fmt_vid_cap	= vidioc_g_fmt_vid_cap,
1506 	.vidioc_s_fmt_vid_cap	= vidioc_s_fmt_vid_cap,
1507 	.vidioc_reqbufs		= vidioc_reqbufs,
1508 	.vidioc_querybuf	= vidioc_querybuf,
1509 	.vidioc_qbuf		= vidioc_qbuf,
1510 	.vidioc_dqbuf		= vidioc_dqbuf,
1511 	.vidioc_streamon	= vidioc_streamon,
1512 	.vidioc_streamoff	= vidioc_streamoff,
1513 	.vidioc_log_status	= v4l2_ctrl_log_status,
1514 	.vidioc_subscribe_event	= v4l2_ctrl_subscribe_event,
1515 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1516 	.vidioc_default		= vidioc_default,
1517 };
1518 
1519 static const struct video_device meye_template = {
1520 	.name		= "meye",
1521 	.fops		= &meye_fops,
1522 	.ioctl_ops	= &meye_ioctl_ops,
1523 	.release	= video_device_release_empty,
1524 	.device_caps	= V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
1525 };
1526 
1527 static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1528 	.s_ctrl = meye_s_ctrl,
1529 };
1530 
1531 #ifdef CONFIG_PM
meye_suspend(struct pci_dev * pdev,pm_message_t state)1532 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1533 {
1534 	pci_save_state(pdev);
1535 	meye.pm_mchip_mode = meye.mchip_mode;
1536 	mchip_hic_stop();
1537 	mchip_set(MCHIP_MM_INTA, 0x0);
1538 	return 0;
1539 }
1540 
meye_resume(struct pci_dev * pdev)1541 static int meye_resume(struct pci_dev *pdev)
1542 {
1543 	pci_restore_state(pdev);
1544 	pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1545 
1546 	mchip_delay(MCHIP_HIC_CMD, 0);
1547 	mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1548 	msleep(1);
1549 	mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1550 	msleep(1);
1551 	mchip_set(MCHIP_MM_PCI_MODE, 5);
1552 	msleep(1);
1553 	mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1554 
1555 	switch (meye.pm_mchip_mode) {
1556 	case MCHIP_HIC_MODE_CONT_OUT:
1557 		mchip_continuous_start();
1558 		break;
1559 	case MCHIP_HIC_MODE_CONT_COMP:
1560 		mchip_cont_compression_start();
1561 		break;
1562 	}
1563 	return 0;
1564 }
1565 #endif
1566 
meye_probe(struct pci_dev * pcidev,const struct pci_device_id * ent)1567 static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1568 {
1569 	static const struct v4l2_ctrl_config ctrl_agc = {
1570 		.id = V4L2_CID_MEYE_AGC,
1571 		.type = V4L2_CTRL_TYPE_INTEGER,
1572 		.ops = &meye_ctrl_ops,
1573 		.name = "AGC",
1574 		.max = 63,
1575 		.step = 1,
1576 		.def = 48,
1577 		.flags = V4L2_CTRL_FLAG_SLIDER,
1578 	};
1579 	static const struct v4l2_ctrl_config ctrl_picture = {
1580 		.id = V4L2_CID_MEYE_PICTURE,
1581 		.type = V4L2_CTRL_TYPE_INTEGER,
1582 		.ops = &meye_ctrl_ops,
1583 		.name = "Picture",
1584 		.max = 63,
1585 		.step = 1,
1586 	};
1587 	static const struct v4l2_ctrl_config ctrl_framerate = {
1588 		.id = V4L2_CID_MEYE_FRAMERATE,
1589 		.type = V4L2_CTRL_TYPE_INTEGER,
1590 		.ops = &meye_ctrl_ops,
1591 		.name = "Framerate",
1592 		.max = 31,
1593 		.step = 1,
1594 	};
1595 	struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
1596 	int ret = -EBUSY;
1597 	unsigned long mchip_adr;
1598 
1599 	if (meye.mchip_dev != NULL) {
1600 		printk(KERN_ERR "meye: only one device allowed!\n");
1601 		return ret;
1602 	}
1603 
1604 	ret = v4l2_device_register(&pcidev->dev, v4l2_dev);
1605 	if (ret < 0) {
1606 		v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
1607 		return ret;
1608 	}
1609 	ret = -ENOMEM;
1610 	meye.mchip_dev = pcidev;
1611 
1612 	meye.grab_temp = vmalloc(array_size(PAGE_SIZE, MCHIP_NB_PAGES_MJPEG));
1613 	if (!meye.grab_temp)
1614 		goto outvmalloc;
1615 
1616 	spin_lock_init(&meye.grabq_lock);
1617 	if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS,
1618 			GFP_KERNEL))
1619 		goto outkfifoalloc1;
1620 
1621 	spin_lock_init(&meye.doneq_lock);
1622 	if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS,
1623 			GFP_KERNEL))
1624 		goto outkfifoalloc2;
1625 
1626 	meye.vdev = meye_template;
1627 	meye.vdev.v4l2_dev = &meye.v4l2_dev;
1628 
1629 	ret = sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 1);
1630 	if (ret) {
1631 		v4l2_err(v4l2_dev, "meye: unable to power on the camera\n");
1632 		v4l2_err(v4l2_dev, "meye: did you enable the camera in sonypi using the module options ?\n");
1633 		goto outsonypienable;
1634 	}
1635 
1636 	ret = pci_enable_device(meye.mchip_dev);
1637 	if (ret) {
1638 		v4l2_err(v4l2_dev, "meye: pci_enable_device failed\n");
1639 		goto outenabledev;
1640 	}
1641 
1642 	ret = -EIO;
1643 	mchip_adr = pci_resource_start(meye.mchip_dev,0);
1644 	if (!mchip_adr) {
1645 		v4l2_err(v4l2_dev, "meye: mchip has no device base address\n");
1646 		goto outregions;
1647 	}
1648 	if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1649 				pci_resource_len(meye.mchip_dev, 0),
1650 				"meye")) {
1651 		v4l2_err(v4l2_dev, "meye: request_mem_region failed\n");
1652 		goto outregions;
1653 	}
1654 	meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1655 	if (!meye.mchip_mmregs) {
1656 		v4l2_err(v4l2_dev, "meye: ioremap failed\n");
1657 		goto outremap;
1658 	}
1659 
1660 	meye.mchip_irq = pcidev->irq;
1661 	if (request_irq(meye.mchip_irq, meye_irq,
1662 			IRQF_SHARED, "meye", meye_irq)) {
1663 		v4l2_err(v4l2_dev, "request_irq failed\n");
1664 		goto outreqirq;
1665 	}
1666 
1667 	pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1668 	pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1669 
1670 	pci_set_master(meye.mchip_dev);
1671 
1672 	/* Ask the camera to perform a soft reset. */
1673 	pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1674 
1675 	mchip_delay(MCHIP_HIC_CMD, 0);
1676 	mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1677 
1678 	msleep(1);
1679 	mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1680 
1681 	msleep(1);
1682 	mchip_set(MCHIP_MM_PCI_MODE, 5);
1683 
1684 	msleep(1);
1685 	mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1686 
1687 	mutex_init(&meye.lock);
1688 	init_waitqueue_head(&meye.proc_list);
1689 
1690 	v4l2_ctrl_handler_init(&meye.hdl, 3);
1691 	v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1692 			  V4L2_CID_BRIGHTNESS, 0, 63, 1, 32);
1693 	v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1694 			  V4L2_CID_HUE, 0, 63, 1, 32);
1695 	v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1696 			  V4L2_CID_CONTRAST, 0, 63, 1, 32);
1697 	v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1698 			  V4L2_CID_SATURATION, 0, 63, 1, 32);
1699 	v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL);
1700 	v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1701 			  V4L2_CID_SHARPNESS, 0, 63, 1, 32);
1702 	v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL);
1703 	v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1704 			  V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8);
1705 	v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL);
1706 	if (meye.hdl.error) {
1707 		v4l2_err(v4l2_dev, "couldn't register controls\n");
1708 		goto outvideoreg;
1709 	}
1710 
1711 	v4l2_ctrl_handler_setup(&meye.hdl);
1712 	meye.vdev.ctrl_handler = &meye.hdl;
1713 
1714 	if (video_register_device(&meye.vdev, VFL_TYPE_GRABBER,
1715 				  video_nr) < 0) {
1716 		v4l2_err(v4l2_dev, "video_register_device failed\n");
1717 		goto outvideoreg;
1718 	}
1719 
1720 	v4l2_info(v4l2_dev, "Motion Eye Camera Driver v%s.\n",
1721 	       MEYE_DRIVER_VERSION);
1722 	v4l2_info(v4l2_dev, "mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1723 	       meye.mchip_dev->revision, mchip_adr, meye.mchip_irq);
1724 
1725 	return 0;
1726 
1727 outvideoreg:
1728 	v4l2_ctrl_handler_free(&meye.hdl);
1729 	free_irq(meye.mchip_irq, meye_irq);
1730 outreqirq:
1731 	iounmap(meye.mchip_mmregs);
1732 outremap:
1733 	release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1734 			   pci_resource_len(meye.mchip_dev, 0));
1735 outregions:
1736 	pci_disable_device(meye.mchip_dev);
1737 outenabledev:
1738 	sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1739 outsonypienable:
1740 	kfifo_free(&meye.doneq);
1741 outkfifoalloc2:
1742 	kfifo_free(&meye.grabq);
1743 outkfifoalloc1:
1744 	vfree(meye.grab_temp);
1745 outvmalloc:
1746 	return ret;
1747 }
1748 
meye_remove(struct pci_dev * pcidev)1749 static void meye_remove(struct pci_dev *pcidev)
1750 {
1751 	video_unregister_device(&meye.vdev);
1752 
1753 	mchip_hic_stop();
1754 
1755 	mchip_dma_free();
1756 
1757 	/* disable interrupts */
1758 	mchip_set(MCHIP_MM_INTA, 0x0);
1759 
1760 	free_irq(meye.mchip_irq, meye_irq);
1761 
1762 	iounmap(meye.mchip_mmregs);
1763 
1764 	release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1765 			   pci_resource_len(meye.mchip_dev, 0));
1766 
1767 	pci_disable_device(meye.mchip_dev);
1768 
1769 	sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1770 
1771 	kfifo_free(&meye.doneq);
1772 	kfifo_free(&meye.grabq);
1773 
1774 	vfree(meye.grab_temp);
1775 
1776 	if (meye.grab_fbuffer) {
1777 		rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1778 		meye.grab_fbuffer = NULL;
1779 	}
1780 
1781 	printk(KERN_INFO "meye: removed\n");
1782 }
1783 
1784 static const struct pci_device_id meye_pci_tbl[] = {
1785 	{ PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1786 	{ }
1787 };
1788 
1789 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1790 
1791 static struct pci_driver meye_driver = {
1792 	.name		= "meye",
1793 	.id_table	= meye_pci_tbl,
1794 	.probe		= meye_probe,
1795 	.remove		= meye_remove,
1796 #ifdef CONFIG_PM
1797 	.suspend	= meye_suspend,
1798 	.resume		= meye_resume,
1799 #endif
1800 };
1801 
meye_init(void)1802 static int __init meye_init(void)
1803 {
1804 	gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
1805 	if (gbufsize > MEYE_MAX_BUFSIZE)
1806 		gbufsize = MEYE_MAX_BUFSIZE;
1807 	gbufsize = PAGE_ALIGN(gbufsize);
1808 	printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n",
1809 			 gbuffers,
1810 			 gbufsize / 1024, gbuffers * gbufsize / 1024);
1811 	return pci_register_driver(&meye_driver);
1812 }
1813 
meye_exit(void)1814 static void __exit meye_exit(void)
1815 {
1816 	pci_unregister_driver(&meye_driver);
1817 }
1818 
1819 module_init(meye_init);
1820 module_exit(meye_exit);
1821