0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <linux/module.h>
0017 #include <linux/pci.h>
0018 #include <linux/sched.h>
0019 #include <linux/init.h>
0020 #include <linux/gfp.h>
0021 #include <linux/videodev2.h>
0022 #include <media/v4l2-common.h>
0023 #include <media/v4l2-device.h>
0024 #include <media/v4l2-ioctl.h>
0025 #include <media/v4l2-fh.h>
0026 #include <media/v4l2-event.h>
0027 #include <linux/uaccess.h>
0028 #include <asm/io.h>
0029 #include <linux/delay.h>
0030 #include <linux/interrupt.h>
0031 #include <linux/vmalloc.h>
0032 #include <linux/dma-mapping.h>
0033
0034 #include "meye.h"
0035 #include <linux/meye.h>
0036
0037 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
0038 MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
0039 MODULE_LICENSE("GPL");
0040 MODULE_VERSION(MEYE_DRIVER_VERSION);
0041
0042
0043 static unsigned int gbuffers = 2;
0044 module_param(gbuffers, int, 0444);
0045 MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
0046
0047
0048 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
0049 module_param(gbufsize, int, 0444);
0050 MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400 (will be rounded up to a page multiple)");
0051
0052
0053 static int video_nr = -1;
0054 module_param(video_nr, int, 0444);
0055 MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
0056
0057
0058 static struct meye meye;
0059
0060
0061
0062
0063 static void *rvmalloc(unsigned long size)
0064 {
0065 void *mem;
0066 unsigned long adr;
0067
0068 size = PAGE_ALIGN(size);
0069 mem = vmalloc_32(size);
0070 if (mem) {
0071 memset(mem, 0, size);
0072 adr = (unsigned long) mem;
0073 while (size > 0) {
0074 SetPageReserved(vmalloc_to_page((void *)adr));
0075 adr += PAGE_SIZE;
0076 size -= PAGE_SIZE;
0077 }
0078 }
0079 return mem;
0080 }
0081
0082 static void rvfree(void * mem, unsigned long size)
0083 {
0084 unsigned long adr;
0085
0086 if (mem) {
0087 adr = (unsigned long) mem;
0088 while ((long) size > 0) {
0089 ClearPageReserved(vmalloc_to_page((void *)adr));
0090 adr += PAGE_SIZE;
0091 size -= PAGE_SIZE;
0092 }
0093 vfree(mem);
0094 }
0095 }
0096
0097
0098
0099
0100
0101
0102
0103 static int ptable_alloc(void)
0104 {
0105 u32 *pt;
0106 int i;
0107
0108 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
0109
0110
0111 if (dma_set_mask(&meye.mchip_dev->dev, DMA_BIT_MASK(32)))
0112 return -1;
0113
0114 meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
0115 PAGE_SIZE,
0116 &meye.mchip_dmahandle,
0117 GFP_KERNEL);
0118 if (!meye.mchip_ptable_toc) {
0119 meye.mchip_dmahandle = 0;
0120 return -1;
0121 }
0122
0123 pt = meye.mchip_ptable_toc;
0124 for (i = 0; i < MCHIP_NB_PAGES; i++) {
0125 dma_addr_t dma;
0126 meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
0127 PAGE_SIZE,
0128 &dma,
0129 GFP_KERNEL);
0130 if (!meye.mchip_ptable[i]) {
0131 int j;
0132 pt = meye.mchip_ptable_toc;
0133 for (j = 0; j < i; ++j) {
0134 dma = (dma_addr_t) *pt;
0135 dma_free_coherent(&meye.mchip_dev->dev,
0136 PAGE_SIZE,
0137 meye.mchip_ptable[j], dma);
0138 pt++;
0139 }
0140 dma_free_coherent(&meye.mchip_dev->dev,
0141 PAGE_SIZE,
0142 meye.mchip_ptable_toc,
0143 meye.mchip_dmahandle);
0144 meye.mchip_ptable_toc = NULL;
0145 meye.mchip_dmahandle = 0;
0146 return -1;
0147 }
0148 *pt = (u32) dma;
0149 pt++;
0150 }
0151 return 0;
0152 }
0153
0154 static void ptable_free(void)
0155 {
0156 u32 *pt;
0157 int i;
0158
0159 pt = meye.mchip_ptable_toc;
0160 for (i = 0; i < MCHIP_NB_PAGES; i++) {
0161 dma_addr_t dma = (dma_addr_t) *pt;
0162 if (meye.mchip_ptable[i])
0163 dma_free_coherent(&meye.mchip_dev->dev,
0164 PAGE_SIZE,
0165 meye.mchip_ptable[i], dma);
0166 pt++;
0167 }
0168
0169 if (meye.mchip_ptable_toc)
0170 dma_free_coherent(&meye.mchip_dev->dev,
0171 PAGE_SIZE,
0172 meye.mchip_ptable_toc,
0173 meye.mchip_dmahandle);
0174
0175 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
0176 meye.mchip_ptable_toc = NULL;
0177 meye.mchip_dmahandle = 0;
0178 }
0179
0180
0181 static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
0182 {
0183 int i;
0184
0185 for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
0186 memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
0187 if (start >= pt_pages)
0188 start = 0;
0189 }
0190 memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
0191 }
0192
0193
0194
0195
0196
0197
0198 static u16 *jpeg_quantisation_tables(int *length, int quality)
0199 {
0200 static u16 jpeg_tables[][70] = { {
0201 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0202 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0203 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0204 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0205 0xffff, 0xffff, 0xffff,
0206 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0207 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0208 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0209 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0210 0xffff, 0xffff, 0xffff,
0211 },
0212 {
0213 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
0214 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
0215 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0216 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0217 0xffff, 0xffff, 0xffff,
0218 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
0219 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0220 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0221 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0222 0xffff, 0xffff, 0xffff,
0223 },
0224 {
0225 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
0226 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
0227 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
0228 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
0229 0xe6ff, 0xfffd, 0xfff8,
0230 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
0231 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
0232 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
0233 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
0234 0xf8f8, 0xf8f8, 0xfff8,
0235 },
0236 {
0237 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
0238 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
0239 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
0240 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
0241 0x99c7, 0xaba8, 0xffa4,
0242 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
0243 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
0244 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
0245 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
0246 0xa4a4, 0xa4a4, 0xffa4,
0247 },
0248 {
0249 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
0250 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
0251 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
0252 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
0253 0x7396, 0x817e, 0xff7c,
0254 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
0255 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
0256 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
0257 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
0258 0x7c7c, 0x7c7c, 0xff7c,
0259 },
0260 {
0261 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
0262 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
0263 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
0264 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
0265 0x5c78, 0x6765, 0xff63,
0266 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
0267 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
0268 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
0269 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
0270 0x6363, 0x6363, 0xff63,
0271 },
0272 {
0273 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
0274 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
0275 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
0276 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
0277 0x4a60, 0x5251, 0xff4f,
0278 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
0279 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
0280 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
0281 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
0282 0x4f4f, 0x4f4f, 0xff4f,
0283 },
0284 {
0285 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
0286 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
0287 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
0288 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
0289 0x3748, 0x3e3d, 0xff3b,
0290 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
0291 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
0292 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
0293 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
0294 0x3b3b, 0x3b3b, 0xff3b,
0295 },
0296 {
0297 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
0298 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
0299 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
0300 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
0301 0x2530, 0x2928, 0xff28,
0302 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
0303 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
0304 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
0305 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
0306 0x2828, 0x2828, 0xff28,
0307 },
0308 {
0309 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
0310 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
0311 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
0312 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
0313 0x1218, 0x1514, 0xff14,
0314 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
0315 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
0316 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
0317 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
0318 0x1414, 0x1414, 0xff14,
0319 },
0320 {
0321 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0322 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0323 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0324 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0325 0x0101, 0x0101, 0xff01,
0326 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0327 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0328 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0329 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
0330 0x0101, 0x0101, 0xff01,
0331 } };
0332
0333 if (quality < 0 || quality > 10) {
0334 printk(KERN_WARNING
0335 "meye: invalid quality level %d - using 8\n", quality);
0336 quality = 8;
0337 }
0338
0339 *length = ARRAY_SIZE(jpeg_tables[quality]);
0340 return jpeg_tables[quality];
0341 }
0342
0343
0344 static u16 *jpeg_huffman_tables(int *length)
0345 {
0346 static u16 tables[] = {
0347 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
0348 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
0349 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
0350 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
0351 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
0352 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
0353 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
0354 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
0355 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
0356 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
0357 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
0358 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
0359 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
0360 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
0361 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
0362 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
0363 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
0364 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
0365 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
0366 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
0367 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
0368 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
0369 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
0370 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
0371 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
0372 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
0373 0xFF0B,
0374 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
0375 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
0376 0xFF0B
0377 };
0378
0379 *length = ARRAY_SIZE(tables);
0380 return tables;
0381 }
0382
0383
0384
0385
0386
0387
0388 static inline int mchip_hsize(void)
0389 {
0390 return meye.params.subsample ? 320 : 640;
0391 }
0392
0393
0394 static inline int mchip_vsize(void)
0395 {
0396 return meye.params.subsample ? 240 : 480;
0397 }
0398
0399
0400 static void mchip_sync(int reg)
0401 {
0402 u32 status;
0403 int i;
0404
0405 if (reg == MCHIP_MM_FIFO_DATA) {
0406 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
0407 status = readl(meye.mchip_mmregs +
0408 MCHIP_MM_FIFO_STATUS);
0409 if (!(status & MCHIP_MM_FIFO_WAIT)) {
0410 printk(KERN_WARNING "meye: fifo not ready\n");
0411 return;
0412 }
0413 if (status & MCHIP_MM_FIFO_READY)
0414 return;
0415 udelay(1);
0416 }
0417 } else if (reg > 0x80) {
0418 u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
0419 : MCHIP_HIC_STATUS_VRJ_RDY;
0420 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
0421 status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
0422 if (status & mask)
0423 return;
0424 udelay(1);
0425 }
0426 } else
0427 return;
0428 printk(KERN_WARNING
0429 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
0430 reg, status);
0431 }
0432
0433
0434 static inline void mchip_set(int reg, u32 v)
0435 {
0436 mchip_sync(reg);
0437 writel(v, meye.mchip_mmregs + reg);
0438 }
0439
0440
0441 static inline u32 mchip_read(int reg)
0442 {
0443 mchip_sync(reg);
0444 return readl(meye.mchip_mmregs + reg);
0445 }
0446
0447
0448 static inline int mchip_delay(u32 reg, u32 v)
0449 {
0450 int n = 10;
0451 while (--n && mchip_read(reg) != v)
0452 udelay(1);
0453 return n;
0454 }
0455
0456
0457 static void mchip_subsample(void)
0458 {
0459 mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
0460 mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
0461 mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
0462 mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
0463 mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
0464 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
0465 }
0466
0467
0468 static void mchip_set_framerate(void)
0469 {
0470 mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
0471 }
0472
0473
0474
0475 static void mchip_load_tables(void)
0476 {
0477 int i;
0478 int length;
0479 u16 *tables;
0480
0481 tables = jpeg_huffman_tables(&length);
0482 for (i = 0; i < length; i++)
0483 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
0484
0485 tables = jpeg_quantisation_tables(&length, meye.params.quality);
0486 for (i = 0; i < length; i++)
0487 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
0488 }
0489
0490
0491 static void mchip_vrj_setup(u8 mode)
0492 {
0493 mchip_set(MCHIP_VRJ_BUS_MODE, 5);
0494 mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
0495 mchip_set(MCHIP_VRJ_PDAT_USE, 1);
0496 mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
0497 mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
0498 mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
0499 mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
0500 mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
0501 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
0502 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
0503 mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
0504 mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
0505 mchip_set(MCHIP_VRJ_SOF1, 0x601);
0506 mchip_set(MCHIP_VRJ_SOF2, 0x1502);
0507 mchip_set(MCHIP_VRJ_SOF3, 0x1503);
0508 mchip_set(MCHIP_VRJ_SOF4, 0x1596);
0509 mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
0510
0511 mchip_load_tables();
0512 }
0513
0514
0515 static void mchip_dma_setup(dma_addr_t dma_addr)
0516 {
0517 int i;
0518
0519 mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
0520 for (i = 0; i < 4; i++)
0521 mchip_set(MCHIP_MM_FIR(i), 0);
0522 meye.mchip_fnum = 0;
0523 }
0524
0525
0526 static int mchip_dma_alloc(void)
0527 {
0528 if (!meye.mchip_dmahandle)
0529 if (ptable_alloc())
0530 return -1;
0531 return 0;
0532 }
0533
0534
0535 static void mchip_dma_free(void)
0536 {
0537 if (meye.mchip_dmahandle) {
0538 mchip_dma_setup(0);
0539 ptable_free();
0540 }
0541 }
0542
0543
0544
0545 static void mchip_hic_stop(void)
0546 {
0547 int i, j;
0548
0549 meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
0550 if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
0551 return;
0552 for (i = 0; i < 20; ++i) {
0553 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
0554 mchip_delay(MCHIP_HIC_CMD, 0);
0555 for (j = 0; j < 100; ++j) {
0556 if (mchip_delay(MCHIP_HIC_STATUS,
0557 MCHIP_HIC_STATUS_IDLE))
0558 return;
0559 msleep(1);
0560 }
0561 printk(KERN_ERR "meye: need to reset HIC!\n");
0562
0563 mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
0564 msleep(250);
0565 }
0566 printk(KERN_ERR "meye: resetting HIC hanged!\n");
0567 }
0568
0569
0570
0571
0572
0573
0574 static u32 mchip_get_frame(void)
0575 {
0576 return mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
0577 }
0578
0579
0580 static void mchip_free_frame(void)
0581 {
0582 mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
0583 meye.mchip_fnum++;
0584 meye.mchip_fnum %= 4;
0585 }
0586
0587
0588
0589 static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
0590 {
0591 int pt_id;
0592
0593 pt_id = (v >> 17) & 0x3FF;
0594
0595 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
0596 }
0597
0598
0599 static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
0600 {
0601 int pt_start, pt_end, trailer;
0602 int fsize;
0603 int i;
0604
0605 pt_start = (v >> 19) & 0xFF;
0606 pt_end = (v >> 11) & 0xFF;
0607 trailer = (v >> 1) & 0x3FF;
0608
0609 if (pt_end < pt_start)
0610 fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
0611 pt_end * PAGE_SIZE + trailer * 4;
0612 else
0613 fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
0614
0615 if (fsize > size) {
0616 printk(KERN_WARNING "meye: oversized compressed frame %d\n",
0617 fsize);
0618 return -1;
0619 }
0620
0621 ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
0622
0623 #ifdef MEYE_JPEG_CORRECTION
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633 for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
0634
0635 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
0636 return -1;
0637
0638 #endif
0639
0640 return fsize;
0641 }
0642
0643
0644 static void mchip_take_picture(void)
0645 {
0646 int i;
0647
0648 mchip_hic_stop();
0649 mchip_subsample();
0650 mchip_dma_setup(meye.mchip_dmahandle);
0651
0652 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
0653 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
0654
0655 mchip_delay(MCHIP_HIC_CMD, 0);
0656
0657 for (i = 0; i < 100; ++i) {
0658 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
0659 break;
0660 msleep(1);
0661 }
0662 }
0663
0664
0665 static void mchip_get_picture(u8 *buf, int bufsize)
0666 {
0667 u32 v;
0668 int i;
0669
0670 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
0671 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
0672
0673 mchip_delay(MCHIP_HIC_CMD, 0);
0674 for (i = 0; i < 100; ++i) {
0675 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
0676 break;
0677 msleep(1);
0678 }
0679 for (i = 0; i < 4; ++i) {
0680 v = mchip_get_frame();
0681 if (v & MCHIP_MM_FIR_RDY) {
0682 mchip_cont_read_frame(v, buf, bufsize);
0683 break;
0684 }
0685 mchip_free_frame();
0686 }
0687 }
0688
0689
0690 static void mchip_continuous_start(void)
0691 {
0692 mchip_hic_stop();
0693 mchip_subsample();
0694 mchip_set_framerate();
0695 mchip_dma_setup(meye.mchip_dmahandle);
0696
0697 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
0698
0699 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
0700 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
0701
0702 mchip_delay(MCHIP_HIC_CMD, 0);
0703 }
0704
0705
0706 static int mchip_compress_frame(u8 *buf, int bufsize)
0707 {
0708 u32 v;
0709 int len = -1, i;
0710
0711 mchip_vrj_setup(0x3f);
0712 udelay(50);
0713
0714 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
0715 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
0716
0717 mchip_delay(MCHIP_HIC_CMD, 0);
0718 for (i = 0; i < 100; ++i) {
0719 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
0720 break;
0721 msleep(1);
0722 }
0723
0724 for (i = 0; i < 4; ++i) {
0725 v = mchip_get_frame();
0726 if (v & MCHIP_MM_FIR_RDY) {
0727 len = mchip_comp_read_frame(v, buf, bufsize);
0728 break;
0729 }
0730 mchip_free_frame();
0731 }
0732 return len;
0733 }
0734
0735 #if 0
0736
0737 static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
0738 {
0739 mchip_vrj_setup(0x3f);
0740 udelay(50);
0741
0742 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
0743 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
0744
0745 mchip_delay(MCHIP_HIC_CMD, 0);
0746
0747 return mchip_comp_read_frame(buf, bufsize);
0748 }
0749 #endif
0750
0751
0752 static void mchip_cont_compression_start(void)
0753 {
0754 mchip_hic_stop();
0755 mchip_vrj_setup(0x3f);
0756 mchip_subsample();
0757 mchip_set_framerate();
0758 mchip_dma_setup(meye.mchip_dmahandle);
0759
0760 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
0761
0762 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
0763 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
0764
0765 mchip_delay(MCHIP_HIC_CMD, 0);
0766 }
0767
0768
0769
0770
0771
0772 static irqreturn_t meye_irq(int irq, void *dev_id)
0773 {
0774 u32 v;
0775 int reqnr;
0776 static int sequence;
0777
0778 v = mchip_read(MCHIP_MM_INTA);
0779
0780 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
0781 meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
0782 return IRQ_NONE;
0783
0784 again:
0785 v = mchip_get_frame();
0786 if (!(v & MCHIP_MM_FIR_RDY))
0787 return IRQ_HANDLED;
0788
0789 if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
0790 if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
0791 sizeof(int), &meye.grabq_lock) != sizeof(int)) {
0792 mchip_free_frame();
0793 return IRQ_HANDLED;
0794 }
0795 mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
0796 mchip_hsize() * mchip_vsize() * 2);
0797 meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
0798 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
0799 meye.grab_buffer[reqnr].ts = ktime_get_ns();
0800 meye.grab_buffer[reqnr].sequence = sequence++;
0801 kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
0802 sizeof(int), &meye.doneq_lock);
0803 wake_up_interruptible(&meye.proc_list);
0804 } else {
0805 int size;
0806 size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
0807 if (size == -1) {
0808 mchip_free_frame();
0809 goto again;
0810 }
0811 if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
0812 sizeof(int), &meye.grabq_lock) != sizeof(int)) {
0813 mchip_free_frame();
0814 goto again;
0815 }
0816 memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
0817 size);
0818 meye.grab_buffer[reqnr].size = size;
0819 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
0820 meye.grab_buffer[reqnr].ts = ktime_get_ns();
0821 meye.grab_buffer[reqnr].sequence = sequence++;
0822 kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
0823 sizeof(int), &meye.doneq_lock);
0824 wake_up_interruptible(&meye.proc_list);
0825 }
0826 mchip_free_frame();
0827 goto again;
0828 }
0829
0830
0831
0832
0833
0834 static int meye_open(struct file *file)
0835 {
0836 int i;
0837
0838 if (test_and_set_bit(0, &meye.in_use))
0839 return -EBUSY;
0840
0841 mchip_hic_stop();
0842
0843 if (mchip_dma_alloc()) {
0844 printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
0845 clear_bit(0, &meye.in_use);
0846 return -ENOBUFS;
0847 }
0848
0849 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
0850 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
0851 kfifo_reset(&meye.grabq);
0852 kfifo_reset(&meye.doneq);
0853 return v4l2_fh_open(file);
0854 }
0855
0856 static int meye_release(struct file *file)
0857 {
0858 mchip_hic_stop();
0859 mchip_dma_free();
0860 clear_bit(0, &meye.in_use);
0861 return v4l2_fh_release(file);
0862 }
0863
0864 static int meyeioc_g_params(struct meye_params *p)
0865 {
0866 *p = meye.params;
0867 return 0;
0868 }
0869
0870 static int meyeioc_s_params(struct meye_params *jp)
0871 {
0872 if (jp->subsample > 1)
0873 return -EINVAL;
0874
0875 if (jp->quality > 10)
0876 return -EINVAL;
0877
0878 if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
0879 return -EINVAL;
0880
0881 if (jp->framerate > 31)
0882 return -EINVAL;
0883
0884 mutex_lock(&meye.lock);
0885
0886 if (meye.params.subsample != jp->subsample ||
0887 meye.params.quality != jp->quality)
0888 mchip_hic_stop();
0889
0890 meye.params = *jp;
0891 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS,
0892 meye.params.sharpness);
0893 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC,
0894 meye.params.agc);
0895 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE,
0896 meye.params.picture);
0897 mutex_unlock(&meye.lock);
0898
0899 return 0;
0900 }
0901
0902 static int meyeioc_qbuf_capt(int *nb)
0903 {
0904 if (!meye.grab_fbuffer)
0905 return -EINVAL;
0906
0907 if (*nb >= gbuffers)
0908 return -EINVAL;
0909
0910 if (*nb < 0) {
0911
0912 mchip_hic_stop();
0913 return 0;
0914 }
0915
0916 if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
0917 return -EBUSY;
0918
0919 mutex_lock(&meye.lock);
0920
0921 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
0922 mchip_cont_compression_start();
0923
0924 meye.grab_buffer[*nb].state = MEYE_BUF_USING;
0925 kfifo_in_locked(&meye.grabq, (unsigned char *)nb, sizeof(int),
0926 &meye.grabq_lock);
0927 mutex_unlock(&meye.lock);
0928
0929 return 0;
0930 }
0931
0932 static int meyeioc_sync(struct file *file, void *fh, int *i)
0933 {
0934 int unused;
0935
0936 if (*i < 0 || *i >= gbuffers)
0937 return -EINVAL;
0938
0939 mutex_lock(&meye.lock);
0940 switch (meye.grab_buffer[*i].state) {
0941
0942 case MEYE_BUF_UNUSED:
0943 mutex_unlock(&meye.lock);
0944 return -EINVAL;
0945 case MEYE_BUF_USING:
0946 if (file->f_flags & O_NONBLOCK) {
0947 mutex_unlock(&meye.lock);
0948 return -EAGAIN;
0949 }
0950 if (wait_event_interruptible(meye.proc_list,
0951 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
0952 mutex_unlock(&meye.lock);
0953 return -EINTR;
0954 }
0955 fallthrough;
0956 case MEYE_BUF_DONE:
0957 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
0958 if (kfifo_out_locked(&meye.doneq, (unsigned char *)&unused,
0959 sizeof(int), &meye.doneq_lock) != sizeof(int))
0960 break;
0961 }
0962 *i = meye.grab_buffer[*i].size;
0963 mutex_unlock(&meye.lock);
0964 return 0;
0965 }
0966
0967 static int meyeioc_stillcapt(void)
0968 {
0969 if (!meye.grab_fbuffer)
0970 return -EINVAL;
0971
0972 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
0973 return -EBUSY;
0974
0975 mutex_lock(&meye.lock);
0976 meye.grab_buffer[0].state = MEYE_BUF_USING;
0977 mchip_take_picture();
0978
0979 mchip_get_picture(meye.grab_fbuffer,
0980 mchip_hsize() * mchip_vsize() * 2);
0981
0982 meye.grab_buffer[0].state = MEYE_BUF_DONE;
0983 mutex_unlock(&meye.lock);
0984
0985 return 0;
0986 }
0987
0988 static int meyeioc_stilljcapt(int *len)
0989 {
0990 if (!meye.grab_fbuffer)
0991 return -EINVAL;
0992
0993 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
0994 return -EBUSY;
0995
0996 mutex_lock(&meye.lock);
0997 meye.grab_buffer[0].state = MEYE_BUF_USING;
0998 *len = -1;
0999
1000 while (*len == -1) {
1001 mchip_take_picture();
1002 *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1003 }
1004
1005 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1006 mutex_unlock(&meye.lock);
1007 return 0;
1008 }
1009
1010 static int vidioc_querycap(struct file *file, void *fh,
1011 struct v4l2_capability *cap)
1012 {
1013 strscpy(cap->driver, "meye", sizeof(cap->driver));
1014 strscpy(cap->card, "meye", sizeof(cap->card));
1015 return 0;
1016 }
1017
1018 static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1019 {
1020 if (i->index != 0)
1021 return -EINVAL;
1022
1023 strscpy(i->name, "Camera", sizeof(i->name));
1024 i->type = V4L2_INPUT_TYPE_CAMERA;
1025
1026 return 0;
1027 }
1028
1029 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1030 {
1031 *i = 0;
1032 return 0;
1033 }
1034
1035 static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1036 {
1037 if (i != 0)
1038 return -EINVAL;
1039
1040 return 0;
1041 }
1042
1043 static int meye_s_ctrl(struct v4l2_ctrl *ctrl)
1044 {
1045 mutex_lock(&meye.lock);
1046 switch (ctrl->id) {
1047 case V4L2_CID_BRIGHTNESS:
1048 sony_pic_camera_command(
1049 SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val);
1050 meye.brightness = ctrl->val << 10;
1051 break;
1052 case V4L2_CID_HUE:
1053 sony_pic_camera_command(
1054 SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val);
1055 meye.hue = ctrl->val << 10;
1056 break;
1057 case V4L2_CID_CONTRAST:
1058 sony_pic_camera_command(
1059 SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val);
1060 meye.contrast = ctrl->val << 10;
1061 break;
1062 case V4L2_CID_SATURATION:
1063 sony_pic_camera_command(
1064 SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val);
1065 meye.colour = ctrl->val << 10;
1066 break;
1067 case V4L2_CID_MEYE_AGC:
1068 sony_pic_camera_command(
1069 SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val);
1070 meye.params.agc = ctrl->val;
1071 break;
1072 case V4L2_CID_SHARPNESS:
1073 sony_pic_camera_command(
1074 SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val);
1075 meye.params.sharpness = ctrl->val;
1076 break;
1077 case V4L2_CID_MEYE_PICTURE:
1078 sony_pic_camera_command(
1079 SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val);
1080 meye.params.picture = ctrl->val;
1081 break;
1082 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1083 meye.params.quality = ctrl->val;
1084 break;
1085 case V4L2_CID_MEYE_FRAMERATE:
1086 meye.params.framerate = ctrl->val;
1087 break;
1088 default:
1089 mutex_unlock(&meye.lock);
1090 return -EINVAL;
1091 }
1092 mutex_unlock(&meye.lock);
1093
1094 return 0;
1095 }
1096
1097 static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1098 struct v4l2_fmtdesc *f)
1099 {
1100 if (f->index > 1)
1101 return -EINVAL;
1102
1103 if (f->index == 0) {
1104
1105 f->flags = 0;
1106 f->pixelformat = V4L2_PIX_FMT_YUYV;
1107 } else {
1108
1109 f->pixelformat = V4L2_PIX_FMT_MJPEG;
1110 }
1111
1112 return 0;
1113 }
1114
1115 static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1116 struct v4l2_format *f)
1117 {
1118 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1119 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1120 return -EINVAL;
1121
1122 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1123 f->fmt.pix.field != V4L2_FIELD_NONE)
1124 return -EINVAL;
1125
1126 f->fmt.pix.field = V4L2_FIELD_NONE;
1127
1128 if (f->fmt.pix.width <= 320) {
1129 f->fmt.pix.width = 320;
1130 f->fmt.pix.height = 240;
1131 } else {
1132 f->fmt.pix.width = 640;
1133 f->fmt.pix.height = 480;
1134 }
1135
1136 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1137 f->fmt.pix.sizeimage = f->fmt.pix.height *
1138 f->fmt.pix.bytesperline;
1139 f->fmt.pix.colorspace = 0;
1140
1141 return 0;
1142 }
1143
1144 static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1145 struct v4l2_format *f)
1146 {
1147 switch (meye.mchip_mode) {
1148 case MCHIP_HIC_MODE_CONT_OUT:
1149 default:
1150 f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1151 break;
1152 case MCHIP_HIC_MODE_CONT_COMP:
1153 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1154 break;
1155 }
1156
1157 f->fmt.pix.field = V4L2_FIELD_NONE;
1158 f->fmt.pix.width = mchip_hsize();
1159 f->fmt.pix.height = mchip_vsize();
1160 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1161 f->fmt.pix.sizeimage = f->fmt.pix.height *
1162 f->fmt.pix.bytesperline;
1163
1164 return 0;
1165 }
1166
1167 static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1168 struct v4l2_format *f)
1169 {
1170 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1171 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1172 return -EINVAL;
1173
1174 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1175 f->fmt.pix.field != V4L2_FIELD_NONE)
1176 return -EINVAL;
1177
1178 f->fmt.pix.field = V4L2_FIELD_NONE;
1179 mutex_lock(&meye.lock);
1180
1181 if (f->fmt.pix.width <= 320) {
1182 f->fmt.pix.width = 320;
1183 f->fmt.pix.height = 240;
1184 meye.params.subsample = 1;
1185 } else {
1186 f->fmt.pix.width = 640;
1187 f->fmt.pix.height = 480;
1188 meye.params.subsample = 0;
1189 }
1190
1191 switch (f->fmt.pix.pixelformat) {
1192 case V4L2_PIX_FMT_YUYV:
1193 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1194 break;
1195 case V4L2_PIX_FMT_MJPEG:
1196 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1197 break;
1198 }
1199
1200 mutex_unlock(&meye.lock);
1201 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1202 f->fmt.pix.sizeimage = f->fmt.pix.height *
1203 f->fmt.pix.bytesperline;
1204 f->fmt.pix.colorspace = 0;
1205
1206 return 0;
1207 }
1208
1209 static int vidioc_reqbufs(struct file *file, void *fh,
1210 struct v4l2_requestbuffers *req)
1211 {
1212 int i;
1213
1214 if (req->memory != V4L2_MEMORY_MMAP)
1215 return -EINVAL;
1216
1217 if (meye.grab_fbuffer && req->count == gbuffers) {
1218
1219 return 0;
1220 }
1221
1222 mutex_lock(&meye.lock);
1223 if (meye.grab_fbuffer) {
1224 for (i = 0; i < gbuffers; i++)
1225 if (meye.vma_use_count[i]) {
1226 mutex_unlock(&meye.lock);
1227 return -EINVAL;
1228 }
1229 rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1230 meye.grab_fbuffer = NULL;
1231 }
1232
1233 gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1234 req->count = gbuffers;
1235 meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1236
1237 if (!meye.grab_fbuffer) {
1238 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1239 mutex_unlock(&meye.lock);
1240 return -ENOMEM;
1241 }
1242
1243 for (i = 0; i < gbuffers; i++)
1244 meye.vma_use_count[i] = 0;
1245
1246 mutex_unlock(&meye.lock);
1247
1248 return 0;
1249 }
1250
1251 static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1252 {
1253 unsigned int index = buf->index;
1254
1255 if (index >= gbuffers)
1256 return -EINVAL;
1257
1258 buf->bytesused = meye.grab_buffer[index].size;
1259 buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1260
1261 if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1262 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1263
1264 if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1265 buf->flags |= V4L2_BUF_FLAG_DONE;
1266
1267 buf->field = V4L2_FIELD_NONE;
1268 v4l2_buffer_set_timestamp(buf, meye.grab_buffer[index].ts);
1269 buf->sequence = meye.grab_buffer[index].sequence;
1270 buf->memory = V4L2_MEMORY_MMAP;
1271 buf->m.offset = index * gbufsize;
1272 buf->length = gbufsize;
1273
1274 return 0;
1275 }
1276
1277 static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1278 {
1279 if (buf->memory != V4L2_MEMORY_MMAP)
1280 return -EINVAL;
1281
1282 if (buf->index >= gbuffers)
1283 return -EINVAL;
1284
1285 if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1286 return -EINVAL;
1287
1288 mutex_lock(&meye.lock);
1289 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1290 buf->flags &= ~V4L2_BUF_FLAG_DONE;
1291 meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1292 kfifo_in_locked(&meye.grabq, (unsigned char *)&buf->index,
1293 sizeof(int), &meye.grabq_lock);
1294 mutex_unlock(&meye.lock);
1295
1296 return 0;
1297 }
1298
1299 static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1300 {
1301 int reqnr;
1302
1303 if (buf->memory != V4L2_MEMORY_MMAP)
1304 return -EINVAL;
1305
1306 mutex_lock(&meye.lock);
1307
1308 if (kfifo_len(&meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1309 mutex_unlock(&meye.lock);
1310 return -EAGAIN;
1311 }
1312
1313 if (wait_event_interruptible(meye.proc_list,
1314 kfifo_len(&meye.doneq) != 0) < 0) {
1315 mutex_unlock(&meye.lock);
1316 return -EINTR;
1317 }
1318
1319 if (!kfifo_out_locked(&meye.doneq, (unsigned char *)&reqnr,
1320 sizeof(int), &meye.doneq_lock)) {
1321 mutex_unlock(&meye.lock);
1322 return -EBUSY;
1323 }
1324
1325 if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1326 mutex_unlock(&meye.lock);
1327 return -EINVAL;
1328 }
1329
1330 buf->index = reqnr;
1331 buf->bytesused = meye.grab_buffer[reqnr].size;
1332 buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1333 buf->field = V4L2_FIELD_NONE;
1334 v4l2_buffer_set_timestamp(buf, meye.grab_buffer[reqnr].ts);
1335 buf->sequence = meye.grab_buffer[reqnr].sequence;
1336 buf->memory = V4L2_MEMORY_MMAP;
1337 buf->m.offset = reqnr * gbufsize;
1338 buf->length = gbufsize;
1339 meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1340 mutex_unlock(&meye.lock);
1341
1342 return 0;
1343 }
1344
1345 static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1346 {
1347 mutex_lock(&meye.lock);
1348
1349 switch (meye.mchip_mode) {
1350 case MCHIP_HIC_MODE_CONT_OUT:
1351 mchip_continuous_start();
1352 break;
1353 case MCHIP_HIC_MODE_CONT_COMP:
1354 mchip_cont_compression_start();
1355 break;
1356 default:
1357 mutex_unlock(&meye.lock);
1358 return -EINVAL;
1359 }
1360
1361 mutex_unlock(&meye.lock);
1362
1363 return 0;
1364 }
1365
1366 static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1367 {
1368 mutex_lock(&meye.lock);
1369 mchip_hic_stop();
1370 kfifo_reset(&meye.grabq);
1371 kfifo_reset(&meye.doneq);
1372
1373 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1374 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1375
1376 mutex_unlock(&meye.lock);
1377 return 0;
1378 }
1379
1380 static long vidioc_default(struct file *file, void *fh, bool valid_prio,
1381 unsigned int cmd, void *arg)
1382 {
1383 switch (cmd) {
1384 case MEYEIOC_G_PARAMS:
1385 return meyeioc_g_params((struct meye_params *) arg);
1386
1387 case MEYEIOC_S_PARAMS:
1388 return meyeioc_s_params((struct meye_params *) arg);
1389
1390 case MEYEIOC_QBUF_CAPT:
1391 return meyeioc_qbuf_capt((int *) arg);
1392
1393 case MEYEIOC_SYNC:
1394 return meyeioc_sync(file, fh, (int *) arg);
1395
1396 case MEYEIOC_STILLCAPT:
1397 return meyeioc_stillcapt();
1398
1399 case MEYEIOC_STILLJCAPT:
1400 return meyeioc_stilljcapt((int *) arg);
1401
1402 default:
1403 return -ENOTTY;
1404 }
1405
1406 }
1407
1408 static __poll_t meye_poll(struct file *file, poll_table *wait)
1409 {
1410 __poll_t res = v4l2_ctrl_poll(file, wait);
1411
1412 mutex_lock(&meye.lock);
1413 poll_wait(file, &meye.proc_list, wait);
1414 if (kfifo_len(&meye.doneq))
1415 res |= EPOLLIN | EPOLLRDNORM;
1416 mutex_unlock(&meye.lock);
1417 return res;
1418 }
1419
1420 static void meye_vm_open(struct vm_area_struct *vma)
1421 {
1422 long idx = (long)vma->vm_private_data;
1423 meye.vma_use_count[idx]++;
1424 }
1425
1426 static void meye_vm_close(struct vm_area_struct *vma)
1427 {
1428 long idx = (long)vma->vm_private_data;
1429 meye.vma_use_count[idx]--;
1430 }
1431
1432 static const struct vm_operations_struct meye_vm_ops = {
1433 .open = meye_vm_open,
1434 .close = meye_vm_close,
1435 };
1436
1437 static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1438 {
1439 unsigned long start = vma->vm_start;
1440 unsigned long size = vma->vm_end - vma->vm_start;
1441 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1442 unsigned long page, pos;
1443
1444 mutex_lock(&meye.lock);
1445 if (size > gbuffers * gbufsize || offset > gbuffers * gbufsize - size) {
1446 mutex_unlock(&meye.lock);
1447 return -EINVAL;
1448 }
1449 if (!meye.grab_fbuffer) {
1450 int i;
1451
1452
1453 meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1454 if (!meye.grab_fbuffer) {
1455 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1456 mutex_unlock(&meye.lock);
1457 return -ENOMEM;
1458 }
1459 for (i = 0; i < gbuffers; i++)
1460 meye.vma_use_count[i] = 0;
1461 }
1462 pos = (unsigned long)meye.grab_fbuffer + offset;
1463
1464 while (size > 0) {
1465 page = vmalloc_to_pfn((void *)pos);
1466 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1467 mutex_unlock(&meye.lock);
1468 return -EAGAIN;
1469 }
1470 start += PAGE_SIZE;
1471 pos += PAGE_SIZE;
1472 if (size > PAGE_SIZE)
1473 size -= PAGE_SIZE;
1474 else
1475 size = 0;
1476 }
1477
1478 vma->vm_ops = &meye_vm_ops;
1479 vma->vm_flags &= ~VM_IO;
1480 vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1481 vma->vm_private_data = (void *) (offset / gbufsize);
1482 meye_vm_open(vma);
1483
1484 mutex_unlock(&meye.lock);
1485 return 0;
1486 }
1487
1488 static const struct v4l2_file_operations meye_fops = {
1489 .owner = THIS_MODULE,
1490 .open = meye_open,
1491 .release = meye_release,
1492 .mmap = meye_mmap,
1493 .unlocked_ioctl = video_ioctl2,
1494 .poll = meye_poll,
1495 };
1496
1497 static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1498 .vidioc_querycap = vidioc_querycap,
1499 .vidioc_enum_input = vidioc_enum_input,
1500 .vidioc_g_input = vidioc_g_input,
1501 .vidioc_s_input = vidioc_s_input,
1502 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1503 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1504 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1505 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1506 .vidioc_reqbufs = vidioc_reqbufs,
1507 .vidioc_querybuf = vidioc_querybuf,
1508 .vidioc_qbuf = vidioc_qbuf,
1509 .vidioc_dqbuf = vidioc_dqbuf,
1510 .vidioc_streamon = vidioc_streamon,
1511 .vidioc_streamoff = vidioc_streamoff,
1512 .vidioc_log_status = v4l2_ctrl_log_status,
1513 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1514 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1515 .vidioc_default = vidioc_default,
1516 };
1517
1518 static const struct video_device meye_template = {
1519 .name = "meye",
1520 .fops = &meye_fops,
1521 .ioctl_ops = &meye_ioctl_ops,
1522 .release = video_device_release_empty,
1523 .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
1524 };
1525
1526 static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1527 .s_ctrl = meye_s_ctrl,
1528 };
1529
1530 static int __maybe_unused meye_suspend(struct device *dev)
1531 {
1532 meye.pm_mchip_mode = meye.mchip_mode;
1533 mchip_hic_stop();
1534 mchip_set(MCHIP_MM_INTA, 0x0);
1535 return 0;
1536 }
1537
1538 static int __maybe_unused meye_resume(struct device *dev)
1539 {
1540 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1541
1542 mchip_delay(MCHIP_HIC_CMD, 0);
1543 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1544 msleep(1);
1545 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1546 msleep(1);
1547 mchip_set(MCHIP_MM_PCI_MODE, 5);
1548 msleep(1);
1549 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1550
1551 switch (meye.pm_mchip_mode) {
1552 case MCHIP_HIC_MODE_CONT_OUT:
1553 mchip_continuous_start();
1554 break;
1555 case MCHIP_HIC_MODE_CONT_COMP:
1556 mchip_cont_compression_start();
1557 break;
1558 }
1559 return 0;
1560 }
1561
1562 static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1563 {
1564 static const struct v4l2_ctrl_config ctrl_agc = {
1565 .id = V4L2_CID_MEYE_AGC,
1566 .type = V4L2_CTRL_TYPE_INTEGER,
1567 .ops = &meye_ctrl_ops,
1568 .name = "AGC",
1569 .max = 63,
1570 .step = 1,
1571 .def = 48,
1572 .flags = V4L2_CTRL_FLAG_SLIDER,
1573 };
1574 static const struct v4l2_ctrl_config ctrl_picture = {
1575 .id = V4L2_CID_MEYE_PICTURE,
1576 .type = V4L2_CTRL_TYPE_INTEGER,
1577 .ops = &meye_ctrl_ops,
1578 .name = "Picture",
1579 .max = 63,
1580 .step = 1,
1581 };
1582 static const struct v4l2_ctrl_config ctrl_framerate = {
1583 .id = V4L2_CID_MEYE_FRAMERATE,
1584 .type = V4L2_CTRL_TYPE_INTEGER,
1585 .ops = &meye_ctrl_ops,
1586 .name = "Framerate",
1587 .max = 31,
1588 .step = 1,
1589 };
1590 struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
1591 int ret = -EBUSY;
1592 unsigned long mchip_adr;
1593
1594 if (meye.mchip_dev != NULL) {
1595 printk(KERN_ERR "meye: only one device allowed!\n");
1596 return ret;
1597 }
1598
1599 ret = v4l2_device_register(&pcidev->dev, v4l2_dev);
1600 if (ret < 0) {
1601 v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
1602 return ret;
1603 }
1604 ret = -ENOMEM;
1605 meye.mchip_dev = pcidev;
1606
1607 meye.grab_temp = vmalloc(array_size(PAGE_SIZE, MCHIP_NB_PAGES_MJPEG));
1608 if (!meye.grab_temp)
1609 goto outvmalloc;
1610
1611 spin_lock_init(&meye.grabq_lock);
1612 if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS,
1613 GFP_KERNEL))
1614 goto outkfifoalloc1;
1615
1616 spin_lock_init(&meye.doneq_lock);
1617 if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS,
1618 GFP_KERNEL))
1619 goto outkfifoalloc2;
1620
1621 meye.vdev = meye_template;
1622 meye.vdev.v4l2_dev = &meye.v4l2_dev;
1623
1624 ret = sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 1);
1625 if (ret) {
1626 v4l2_err(v4l2_dev, "meye: unable to power on the camera\n");
1627 v4l2_err(v4l2_dev, "meye: did you enable the camera in sonypi using the module options ?\n");
1628 goto outsonypienable;
1629 }
1630
1631 ret = pci_enable_device(meye.mchip_dev);
1632 if (ret) {
1633 v4l2_err(v4l2_dev, "meye: pci_enable_device failed\n");
1634 goto outenabledev;
1635 }
1636
1637 ret = -EIO;
1638 mchip_adr = pci_resource_start(meye.mchip_dev,0);
1639 if (!mchip_adr) {
1640 v4l2_err(v4l2_dev, "meye: mchip has no device base address\n");
1641 goto outregions;
1642 }
1643 if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1644 pci_resource_len(meye.mchip_dev, 0),
1645 "meye")) {
1646 v4l2_err(v4l2_dev, "meye: request_mem_region failed\n");
1647 goto outregions;
1648 }
1649 meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1650 if (!meye.mchip_mmregs) {
1651 v4l2_err(v4l2_dev, "meye: ioremap failed\n");
1652 goto outremap;
1653 }
1654
1655 meye.mchip_irq = pcidev->irq;
1656 if (request_irq(meye.mchip_irq, meye_irq,
1657 IRQF_SHARED, "meye", meye_irq)) {
1658 v4l2_err(v4l2_dev, "request_irq failed\n");
1659 goto outreqirq;
1660 }
1661
1662 pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1663 pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1664
1665 pci_set_master(meye.mchip_dev);
1666
1667
1668 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1669
1670 mchip_delay(MCHIP_HIC_CMD, 0);
1671 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1672
1673 msleep(1);
1674 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1675
1676 msleep(1);
1677 mchip_set(MCHIP_MM_PCI_MODE, 5);
1678
1679 msleep(1);
1680 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1681
1682 mutex_init(&meye.lock);
1683 init_waitqueue_head(&meye.proc_list);
1684
1685 v4l2_ctrl_handler_init(&meye.hdl, 3);
1686 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1687 V4L2_CID_BRIGHTNESS, 0, 63, 1, 32);
1688 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1689 V4L2_CID_HUE, 0, 63, 1, 32);
1690 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1691 V4L2_CID_CONTRAST, 0, 63, 1, 32);
1692 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1693 V4L2_CID_SATURATION, 0, 63, 1, 32);
1694 v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL);
1695 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1696 V4L2_CID_SHARPNESS, 0, 63, 1, 32);
1697 v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL);
1698 v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1699 V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8);
1700 v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL);
1701 if (meye.hdl.error) {
1702 v4l2_err(v4l2_dev, "couldn't register controls\n");
1703 goto outvideoreg;
1704 }
1705
1706 v4l2_ctrl_handler_setup(&meye.hdl);
1707 meye.vdev.ctrl_handler = &meye.hdl;
1708
1709 if (video_register_device(&meye.vdev, VFL_TYPE_VIDEO,
1710 video_nr) < 0) {
1711 v4l2_err(v4l2_dev, "video_register_device failed\n");
1712 goto outvideoreg;
1713 }
1714
1715 v4l2_info(v4l2_dev, "Motion Eye Camera Driver v%s.\n",
1716 MEYE_DRIVER_VERSION);
1717 v4l2_info(v4l2_dev, "mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1718 meye.mchip_dev->revision, mchip_adr, meye.mchip_irq);
1719
1720 return 0;
1721
1722 outvideoreg:
1723 v4l2_ctrl_handler_free(&meye.hdl);
1724 free_irq(meye.mchip_irq, meye_irq);
1725 outreqirq:
1726 iounmap(meye.mchip_mmregs);
1727 outremap:
1728 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1729 pci_resource_len(meye.mchip_dev, 0));
1730 outregions:
1731 pci_disable_device(meye.mchip_dev);
1732 outenabledev:
1733 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1734 outsonypienable:
1735 kfifo_free(&meye.doneq);
1736 outkfifoalloc2:
1737 kfifo_free(&meye.grabq);
1738 outkfifoalloc1:
1739 vfree(meye.grab_temp);
1740 outvmalloc:
1741 return ret;
1742 }
1743
1744 static void meye_remove(struct pci_dev *pcidev)
1745 {
1746 video_unregister_device(&meye.vdev);
1747
1748 mchip_hic_stop();
1749
1750 mchip_dma_free();
1751
1752
1753 mchip_set(MCHIP_MM_INTA, 0x0);
1754
1755 free_irq(meye.mchip_irq, meye_irq);
1756
1757 iounmap(meye.mchip_mmregs);
1758
1759 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1760 pci_resource_len(meye.mchip_dev, 0));
1761
1762 pci_disable_device(meye.mchip_dev);
1763
1764 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1765
1766 kfifo_free(&meye.doneq);
1767 kfifo_free(&meye.grabq);
1768
1769 vfree(meye.grab_temp);
1770
1771 if (meye.grab_fbuffer) {
1772 rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1773 meye.grab_fbuffer = NULL;
1774 }
1775
1776 printk(KERN_INFO "meye: removed\n");
1777 }
1778
1779 static const struct pci_device_id meye_pci_tbl[] = {
1780 { PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1781 { }
1782 };
1783
1784 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1785
1786 static SIMPLE_DEV_PM_OPS(meye_pm_ops, meye_suspend, meye_resume);
1787
1788 static struct pci_driver meye_driver = {
1789 .name = "meye",
1790 .id_table = meye_pci_tbl,
1791 .probe = meye_probe,
1792 .remove = meye_remove,
1793 .driver.pm = &meye_pm_ops,
1794 };
1795
1796 static int __init meye_init(void)
1797 {
1798 gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
1799 if (gbufsize > MEYE_MAX_BUFSIZE)
1800 gbufsize = MEYE_MAX_BUFSIZE;
1801 gbufsize = PAGE_ALIGN(gbufsize);
1802 printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n",
1803 gbuffers,
1804 gbufsize / 1024, gbuffers * gbufsize / 1024);
1805 return pci_register_driver(&meye_driver);
1806 }
1807
1808 static void __exit meye_exit(void)
1809 {
1810 pci_unregister_driver(&meye_driver);
1811 }
1812
1813 module_init(meye_init);
1814 module_exit(meye_exit);