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