cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

meye.c (48933B)


      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
     37MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
     38MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
     39MODULE_LICENSE("GPL");
     40MODULE_VERSION(MEYE_DRIVER_VERSION);
     41
     42/* number of grab buffers */
     43static unsigned int gbuffers = 2;
     44module_param(gbuffers, int, 0444);
     45MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
     46
     47/* size of a grab buffer */
     48static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
     49module_param(gbufsize, int, 0444);
     50MODULE_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 */
     53static int video_nr = -1;
     54module_param(video_nr, int, 0444);
     55MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
     56
     57/* driver structure - only one possible */
     58static struct meye meye;
     59
     60/****************************************************************************/
     61/* Memory allocation routines (stolen from bttv-driver.c)                   */
     62/****************************************************************************/
     63static 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
     82static 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 */
    103static 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
    154static 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 */
    181static 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 */
    198static 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 */
    344static 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 */
    388static inline int mchip_hsize(void)
    389{
    390	return meye.params.subsample ? 320 : 640;
    391}
    392
    393/* returns the vertical capture size */
    394static inline int mchip_vsize(void)
    395{
    396	return meye.params.subsample ? 240 : 480;
    397}
    398
    399/* waits for a register to be available */
    400static 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 */
    434static 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 */
    441static 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 */
    448static 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 */
    457static 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 */
    468static 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 */
    475static 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 */
    491static 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 */
    515static 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 */
    526static 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 */
    535static 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 */
    545static 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 */
    574static 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 */
    580static 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 */
    589static 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 */
    599static 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 */
    644static 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 */
    665static 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 */
    690static 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 */
    706static 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 */
    737static 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 */
    752static 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
    772static 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
    784again:
    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
    834static 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
    856static 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
    864static int meyeioc_g_params(struct meye_params *p)
    865{
    866	*p = meye.params;
    867	return 0;
    868}
    869
    870static 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
    902static 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
    932static 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		fallthrough;
    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
    967static 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
    988static 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
   1010static 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
   1018static 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
   1029static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
   1030{
   1031	*i = 0;
   1032	return 0;
   1033}
   1034
   1035static 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
   1043static 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
   1097static 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		/* standard YUV 422 capture */
   1105		f->flags = 0;
   1106		f->pixelformat = V4L2_PIX_FMT_YUYV;
   1107	} else {
   1108		/* compressed MJPEG capture */
   1109		f->pixelformat = V4L2_PIX_FMT_MJPEG;
   1110	}
   1111
   1112	return 0;
   1113}
   1114
   1115static 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
   1144static 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
   1167static 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
   1209static 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		/* already allocated, no modifications */
   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
   1251static 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
   1277static 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
   1299static 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
   1345static 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
   1366static 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
   1380static 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
   1408static __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
   1420static 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
   1426static 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
   1432static const struct vm_operations_struct meye_vm_ops = {
   1433	.open		= meye_vm_open,
   1434	.close		= meye_vm_close,
   1435};
   1436
   1437static 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		/* lazy allocation */
   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;	/* not I/O memory */
   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
   1488static 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
   1497static 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
   1518static 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
   1526static const struct v4l2_ctrl_ops meye_ctrl_ops = {
   1527	.s_ctrl = meye_s_ctrl,
   1528};
   1529
   1530static 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
   1538static 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
   1562static 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	/* Ask the camera to perform a soft reset. */
   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
   1722outvideoreg:
   1723	v4l2_ctrl_handler_free(&meye.hdl);
   1724	free_irq(meye.mchip_irq, meye_irq);
   1725outreqirq:
   1726	iounmap(meye.mchip_mmregs);
   1727outremap:
   1728	release_mem_region(pci_resource_start(meye.mchip_dev, 0),
   1729			   pci_resource_len(meye.mchip_dev, 0));
   1730outregions:
   1731	pci_disable_device(meye.mchip_dev);
   1732outenabledev:
   1733	sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
   1734outsonypienable:
   1735	kfifo_free(&meye.doneq);
   1736outkfifoalloc2:
   1737	kfifo_free(&meye.grabq);
   1738outkfifoalloc1:
   1739	vfree(meye.grab_temp);
   1740outvmalloc:
   1741	return ret;
   1742}
   1743
   1744static 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	/* disable interrupts */
   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
   1779static const struct pci_device_id meye_pci_tbl[] = {
   1780	{ PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
   1781	{ }
   1782};
   1783
   1784MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
   1785
   1786static SIMPLE_DEV_PM_OPS(meye_pm_ops, meye_suspend, meye_resume);
   1787
   1788static 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
   1796static 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
   1808static void __exit meye_exit(void)
   1809{
   1810	pci_unregister_driver(&meye_driver);
   1811}
   1812
   1813module_init(meye_init);
   1814module_exit(meye_exit);