linux/drivers/media/pci/meye/meye.c
<<
>>
Prefs
   1/*
   2 * Motion Eye video4linux driver for Sony Vaio PictureBook
   3 *
   4 * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
   5 *
   6 * Copyright (C) 2001-2002 AlcĂ´ve <www.alcove.com>
   7 *
   8 * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
   9 *
  10 * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
  11 *
  12 * Some parts borrowed from various video4linux drivers, especially
  13 * bttv-driver.c and zoran.c, see original files for credits.
  14 *
  15 * This program is free software; you can redistribute it and/or modify
  16 * it under the terms of the GNU General Public License as published by
  17 * the Free Software Foundation; either version 2 of the License, or
  18 * (at your option) any later version.
  19 *
  20 * This program is distributed in the hope that it will be useful,
  21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23 * GNU General Public License for more details.
  24 *
  25 * You should have received a copy of the GNU General Public License
  26 * along with this program; if not, write to the Free Software
  27 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  28 */
  29#include <linux/module.h>
  30#include <linux/pci.h>
  31#include <linux/sched.h>
  32#include <linux/init.h>
  33#include <linux/gfp.h>
  34#include <linux/videodev2.h>
  35#include <media/v4l2-common.h>
  36#include <media/v4l2-device.h>
  37#include <media/v4l2-ioctl.h>
  38#include <media/v4l2-fh.h>
  39#include <media/v4l2-event.h>
  40#include <asm/uaccess.h>
  41#include <asm/io.h>
  42#include <linux/delay.h>
  43#include <linux/interrupt.h>
  44#include <linux/vmalloc.h>
  45#include <linux/dma-mapping.h>
  46
  47#include "meye.h"
  48#include <linux/meye.h>
  49
  50MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
  51MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
  52MODULE_LICENSE("GPL");
  53MODULE_VERSION(MEYE_DRIVER_VERSION);
  54
  55/* number of grab buffers */
  56static unsigned int gbuffers = 2;
  57module_param(gbuffers, int, 0444);
  58MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
  59
  60/* size of a grab buffer */
  61static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
  62module_param(gbufsize, int, 0444);
  63MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"
  64                 " (will be rounded up to a page multiple)");
  65
  66/* /dev/videoX registration number */
  67static int video_nr = -1;
  68module_param(video_nr, int, 0444);
  69MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
  70
  71/* driver structure - only one possible */
  72static struct meye meye;
  73
  74/****************************************************************************/
  75/* Memory allocation routines (stolen from bttv-driver.c)                   */
  76/****************************************************************************/
  77static void *rvmalloc(unsigned long size)
  78{
  79        void *mem;
  80        unsigned long adr;
  81
  82        size = PAGE_ALIGN(size);
  83        mem = vmalloc_32(size);
  84        if (mem) {
  85                memset(mem, 0, size);
  86                adr = (unsigned long) mem;
  87                while (size > 0) {
  88                        SetPageReserved(vmalloc_to_page((void *)adr));
  89                        adr += PAGE_SIZE;
  90                        size -= PAGE_SIZE;
  91                }
  92        }
  93        return mem;
  94}
  95
  96static void rvfree(void * mem, unsigned long size)
  97{
  98        unsigned long adr;
  99
 100        if (mem) {
 101                adr = (unsigned long) mem;
 102                while ((long) size > 0) {
 103                        ClearPageReserved(vmalloc_to_page((void *)adr));
 104                        adr += PAGE_SIZE;
 105                        size -= PAGE_SIZE;
 106                }
 107                vfree(mem);
 108        }
 109}
 110
 111/*
 112 * return a page table pointing to N pages of locked memory
 113 *
 114 * NOTE: The meye device expects DMA addresses on 32 bits, we build
 115 * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
 116 */
 117static int ptable_alloc(void)
 118{
 119        u32 *pt;
 120        int i;
 121
 122        memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
 123
 124        /* give only 32 bit DMA addresses */
 125        if (dma_set_mask(&meye.mchip_dev->dev, DMA_BIT_MASK(32)))
 126                return -1;
 127
 128        meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
 129                                                   PAGE_SIZE,
 130                                                   &meye.mchip_dmahandle,
 131                                                   GFP_KERNEL);
 132        if (!meye.mchip_ptable_toc) {
 133                meye.mchip_dmahandle = 0;
 134                return -1;
 135        }
 136
 137        pt = meye.mchip_ptable_toc;
 138        for (i = 0; i < MCHIP_NB_PAGES; i++) {
 139                dma_addr_t dma;
 140                meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
 141                                                          PAGE_SIZE,
 142                                                          &dma,
 143                                                          GFP_KERNEL);
 144                if (!meye.mchip_ptable[i]) {
 145                        int j;
 146                        pt = meye.mchip_ptable_toc;
 147                        for (j = 0; j < i; ++j) {
 148                                dma = (dma_addr_t) *pt;
 149                                dma_free_coherent(&meye.mchip_dev->dev,
 150                                                  PAGE_SIZE,
 151                                                  meye.mchip_ptable[j], dma);
 152                                pt++;
 153                        }
 154                        dma_free_coherent(&meye.mchip_dev->dev,
 155                                          PAGE_SIZE,
 156                                          meye.mchip_ptable_toc,
 157                                          meye.mchip_dmahandle);
 158                        meye.mchip_ptable_toc = NULL;
 159                        meye.mchip_dmahandle = 0;
 160                        return -1;
 161                }
 162                *pt = (u32) dma;
 163                pt++;
 164        }
 165        return 0;
 166}
 167
 168static void ptable_free(void)
 169{
 170        u32 *pt;
 171        int i;
 172
 173        pt = meye.mchip_ptable_toc;
 174        for (i = 0; i < MCHIP_NB_PAGES; i++) {
 175                dma_addr_t dma = (dma_addr_t) *pt;
 176                if (meye.mchip_ptable[i])
 177                        dma_free_coherent(&meye.mchip_dev->dev,
 178                                          PAGE_SIZE,
 179                                          meye.mchip_ptable[i], dma);
 180                pt++;
 181        }
 182
 183        if (meye.mchip_ptable_toc)
 184                dma_free_coherent(&meye.mchip_dev->dev,
 185                                  PAGE_SIZE,
 186                                  meye.mchip_ptable_toc,
 187                                  meye.mchip_dmahandle);
 188
 189        memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
 190        meye.mchip_ptable_toc = NULL;
 191        meye.mchip_dmahandle = 0;
 192}
 193
 194/* copy data from ptable into buf */
 195static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
 196{
 197        int i;
 198
 199        for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
 200                memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
 201                if (start >= pt_pages)
 202                        start = 0;
 203        }
 204        memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
 205}
 206
 207/****************************************************************************/
 208/* JPEG tables at different qualities to load into the VRJ chip             */
 209/****************************************************************************/
 210
 211/* return a set of quantisation tables based on a quality from 1 to 10 */
 212static u16 *jpeg_quantisation_tables(int *length, int quality)
 213{
 214        static u16 jpeg_tables[][70] = { {
 215                0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 216                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 217                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 218                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 219                0xffff, 0xffff, 0xffff,
 220                0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 221                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 222                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 223                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 224                0xffff, 0xffff, 0xffff,
 225        },
 226        {
 227                0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
 228                0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
 229                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 230                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 231                0xffff, 0xffff, 0xffff,
 232                0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
 233                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 234                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 235                0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
 236                0xffff, 0xffff, 0xffff,
 237        },
 238        {
 239                0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
 240                0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
 241                0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
 242                0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
 243                0xe6ff, 0xfffd, 0xfff8,
 244                0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
 245                0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
 246                0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
 247                0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
 248                0xf8f8, 0xf8f8, 0xfff8,
 249        },
 250        {
 251                0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
 252                0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
 253                0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
 254                0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
 255                0x99c7, 0xaba8, 0xffa4,
 256                0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
 257                0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
 258                0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
 259                0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
 260                0xa4a4, 0xa4a4, 0xffa4,
 261        },
 262        {
 263                0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
 264                0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
 265                0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
 266                0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
 267                0x7396, 0x817e, 0xff7c,
 268                0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
 269                0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
 270                0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
 271                0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
 272                0x7c7c, 0x7c7c, 0xff7c,
 273        },
 274        {
 275                0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
 276                0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
 277                0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
 278                0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
 279                0x5c78, 0x6765, 0xff63,
 280                0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
 281                0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
 282                0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
 283                0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
 284                0x6363, 0x6363, 0xff63,
 285        },
 286        {
 287                0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
 288                0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
 289                0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
 290                0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
 291                0x4a60, 0x5251, 0xff4f,
 292                0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
 293                0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
 294                0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
 295                0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
 296                0x4f4f, 0x4f4f, 0xff4f,
 297        },
 298        {
 299                0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
 300                0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
 301                0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
 302                0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
 303                0x3748, 0x3e3d, 0xff3b,
 304                0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
 305                0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
 306                0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
 307                0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
 308                0x3b3b, 0x3b3b, 0xff3b,
 309        },
 310        {
 311                0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
 312                0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
 313                0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
 314                0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
 315                0x2530, 0x2928, 0xff28,
 316                0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
 317                0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
 318                0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
 319                0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
 320                0x2828, 0x2828, 0xff28,
 321        },
 322        {
 323                0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
 324                0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
 325                0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
 326                0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
 327                0x1218, 0x1514, 0xff14,
 328                0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
 329                0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
 330                0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
 331                0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
 332                0x1414, 0x1414, 0xff14,
 333        },
 334        {
 335                0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 336                0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 337                0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 338                0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 339                0x0101, 0x0101, 0xff01,
 340                0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 341                0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 342                0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 343                0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
 344                0x0101, 0x0101, 0xff01,
 345        } };
 346
 347        if (quality < 0 || quality > 10) {
 348                printk(KERN_WARNING
 349                       "meye: invalid quality level %d - using 8\n", quality);
 350                quality = 8;
 351        }
 352
 353        *length = ARRAY_SIZE(jpeg_tables[quality]);
 354        return jpeg_tables[quality];
 355}
 356
 357/* return a generic set of huffman tables */
 358static u16 *jpeg_huffman_tables(int *length)
 359{
 360        static u16 tables[] = {
 361                0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
 362                0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
 363                0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
 364                0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
 365                0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
 366                0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
 367                0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
 368                0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
 369                0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
 370                0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
 371                0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
 372                0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
 373                0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
 374                0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
 375                0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
 376                0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
 377                0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
 378                0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
 379                0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
 380                0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
 381                0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
 382                0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
 383                0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
 384                0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
 385                0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
 386                0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
 387                0xFF0B,
 388                0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
 389                0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
 390                0xFF0B
 391        };
 392
 393        *length = ARRAY_SIZE(tables);
 394        return tables;
 395}
 396
 397/****************************************************************************/
 398/* MCHIP low-level functions                                                */
 399/****************************************************************************/
 400
 401/* returns the horizontal capture size */
 402static inline int mchip_hsize(void)
 403{
 404        return meye.params.subsample ? 320 : 640;
 405}
 406
 407/* returns the vertical capture size */
 408static inline int mchip_vsize(void)
 409{
 410        return meye.params.subsample ? 240 : 480;
 411}
 412
 413/* waits for a register to be available */
 414static void mchip_sync(int reg)
 415{
 416        u32 status;
 417        int i;
 418
 419        if (reg == MCHIP_MM_FIFO_DATA) {
 420                for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
 421                        status = readl(meye.mchip_mmregs +
 422                                       MCHIP_MM_FIFO_STATUS);
 423                        if (!(status & MCHIP_MM_FIFO_WAIT)) {
 424                                printk(KERN_WARNING "meye: fifo not ready\n");
 425                                return;
 426                        }
 427                        if (status & MCHIP_MM_FIFO_READY)
 428                                return;
 429                        udelay(1);
 430                }
 431        } else if (reg > 0x80) {
 432                u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
 433                                         : MCHIP_HIC_STATUS_VRJ_RDY;
 434                for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
 435                        status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
 436                        if (status & mask)
 437                                return;
 438                        udelay(1);
 439                }
 440        } else
 441                return;
 442        printk(KERN_WARNING
 443               "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
 444               reg, status);
 445}
 446
 447/* sets a value into the register */
 448static inline void mchip_set(int reg, u32 v)
 449{
 450        mchip_sync(reg);
 451        writel(v, meye.mchip_mmregs + reg);
 452}
 453
 454/* get the register value */
 455static inline u32 mchip_read(int reg)
 456{
 457        mchip_sync(reg);
 458        return readl(meye.mchip_mmregs + reg);
 459}
 460
 461/* wait for a register to become a particular value */
 462static inline int mchip_delay(u32 reg, u32 v)
 463{
 464        int n = 10;
 465        while (--n && mchip_read(reg) != v)
 466                udelay(1);
 467        return n;
 468}
 469
 470/* setup subsampling */
 471static void mchip_subsample(void)
 472{
 473        mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
 474        mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
 475        mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
 476        mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
 477        mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
 478        mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
 479}
 480
 481/* set the framerate into the mchip */
 482static void mchip_set_framerate(void)
 483{
 484        mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
 485}
 486
 487/* load some huffman and quantisation tables into the VRJ chip ready
 488   for JPEG compression */
 489static void mchip_load_tables(void)
 490{
 491        int i;
 492        int length;
 493        u16 *tables;
 494
 495        tables = jpeg_huffman_tables(&length);
 496        for (i = 0; i < length; i++)
 497                writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
 498
 499        tables = jpeg_quantisation_tables(&length, meye.params.quality);
 500        for (i = 0; i < length; i++)
 501                writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
 502}
 503
 504/* setup the VRJ parameters in the chip */
 505static void mchip_vrj_setup(u8 mode)
 506{
 507        mchip_set(MCHIP_VRJ_BUS_MODE, 5);
 508        mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
 509        mchip_set(MCHIP_VRJ_PDAT_USE, 1);
 510        mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
 511        mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
 512        mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
 513        mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
 514        mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
 515        mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
 516        mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
 517        mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
 518        mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
 519        mchip_set(MCHIP_VRJ_SOF1, 0x601);
 520        mchip_set(MCHIP_VRJ_SOF2, 0x1502);
 521        mchip_set(MCHIP_VRJ_SOF3, 0x1503);
 522        mchip_set(MCHIP_VRJ_SOF4, 0x1596);
 523        mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
 524
 525        mchip_load_tables();
 526}
 527
 528/* sets the DMA parameters into the chip */
 529static void mchip_dma_setup(dma_addr_t dma_addr)
 530{
 531        int i;
 532
 533        mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
 534        for (i = 0; i < 4; i++)
 535                mchip_set(MCHIP_MM_FIR(i), 0);
 536        meye.mchip_fnum = 0;
 537}
 538
 539/* setup for DMA transfers - also zeros the framebuffer */
 540static int mchip_dma_alloc(void)
 541{
 542        if (!meye.mchip_dmahandle)
 543                if (ptable_alloc())
 544                        return -1;
 545        return 0;
 546}
 547
 548/* frees the DMA buffer */
 549static void mchip_dma_free(void)
 550{
 551        if (meye.mchip_dmahandle) {
 552                mchip_dma_setup(0);
 553                ptable_free();
 554        }
 555}
 556
 557/* stop any existing HIC action and wait for any dma to complete then
 558   reset the dma engine */
 559static void mchip_hic_stop(void)
 560{
 561        int i, j;
 562
 563        meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
 564        if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
 565                return;
 566        for (i = 0; i < 20; ++i) {
 567                mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
 568                mchip_delay(MCHIP_HIC_CMD, 0);
 569                for (j = 0; j < 100; ++j) {
 570                        if (mchip_delay(MCHIP_HIC_STATUS,
 571                                        MCHIP_HIC_STATUS_IDLE))
 572                                return;
 573                        msleep(1);
 574                }
 575                printk(KERN_ERR "meye: need to reset HIC!\n");
 576
 577                mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
 578                msleep(250);
 579        }
 580        printk(KERN_ERR "meye: resetting HIC hanged!\n");
 581}
 582
 583/****************************************************************************/
 584/* MCHIP frame processing functions                                         */
 585/****************************************************************************/
 586
 587/* get the next ready frame from the dma engine */
 588static u32 mchip_get_frame(void)
 589{
 590        u32 v;
 591
 592        v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
 593        return v;
 594}
 595
 596/* frees the current frame from the dma engine */
 597static void mchip_free_frame(void)
 598{
 599        mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
 600        meye.mchip_fnum++;
 601        meye.mchip_fnum %= 4;
 602}
 603
 604/* read one frame from the framebuffer assuming it was captured using
 605   a uncompressed transfer */
 606static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
 607{
 608        int pt_id;
 609
 610        pt_id = (v >> 17) & 0x3FF;
 611
 612        ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
 613}
 614
 615/* read a compressed frame from the framebuffer */
 616static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
 617{
 618        int pt_start, pt_end, trailer;
 619        int fsize;
 620        int i;
 621
 622        pt_start = (v >> 19) & 0xFF;
 623        pt_end = (v >> 11) & 0xFF;
 624        trailer = (v >> 1) & 0x3FF;
 625
 626        if (pt_end < pt_start)
 627                fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
 628                        pt_end * PAGE_SIZE + trailer * 4;
 629        else
 630                fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
 631
 632        if (fsize > size) {
 633                printk(KERN_WARNING "meye: oversized compressed frame %d\n",
 634                       fsize);
 635                return -1;
 636        }
 637
 638        ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
 639
 640#ifdef MEYE_JPEG_CORRECTION
 641
 642        /* Some mchip generated jpeg frames are incorrect. In most
 643         * (all ?) of those cases, the final EOI (0xff 0xd9) marker
 644         * is not present at the end of the frame.
 645         *
 646         * Since adding the final marker is not enough to restore
 647         * the jpeg integrity, we drop the frame.
 648         */
 649
 650        for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
 651
 652        if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
 653                return -1;
 654
 655#endif
 656
 657        return fsize;
 658}
 659
 660/* take a picture into SDRAM */
 661static void mchip_take_picture(void)
 662{
 663        int i;
 664
 665        mchip_hic_stop();
 666        mchip_subsample();
 667        mchip_dma_setup(meye.mchip_dmahandle);
 668
 669        mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
 670        mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
 671
 672        mchip_delay(MCHIP_HIC_CMD, 0);
 673
 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}
 680
 681/* dma a previously taken picture into a buffer */
 682static void mchip_get_picture(u8 *buf, int bufsize)
 683{
 684        u32 v;
 685        int i;
 686
 687        mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
 688        mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
 689
 690        mchip_delay(MCHIP_HIC_CMD, 0);
 691        for (i = 0; i < 100; ++i) {
 692                if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
 693                        break;
 694                msleep(1);
 695        }
 696        for (i = 0; i < 4; ++i) {
 697                v = mchip_get_frame();
 698                if (v & MCHIP_MM_FIR_RDY) {
 699                        mchip_cont_read_frame(v, buf, bufsize);
 700                        break;
 701                }
 702                mchip_free_frame();
 703        }
 704}
 705
 706/* start continuous dma capture */
 707static void mchip_continuous_start(void)
 708{
 709        mchip_hic_stop();
 710        mchip_subsample();
 711        mchip_set_framerate();
 712        mchip_dma_setup(meye.mchip_dmahandle);
 713
 714        meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
 715
 716        mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
 717        mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
 718
 719        mchip_delay(MCHIP_HIC_CMD, 0);
 720}
 721
 722/* compress one frame into a buffer */
 723static int mchip_compress_frame(u8 *buf, int bufsize)
 724{
 725        u32 v;
 726        int len = -1, i;
 727
 728        mchip_vrj_setup(0x3f);
 729        udelay(50);
 730
 731        mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
 732        mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
 733
 734        mchip_delay(MCHIP_HIC_CMD, 0);
 735        for (i = 0; i < 100; ++i) {
 736                if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
 737                        break;
 738                msleep(1);
 739        }
 740
 741        for (i = 0; i < 4; ++i) {
 742                v = mchip_get_frame();
 743                if (v & MCHIP_MM_FIR_RDY) {
 744                        len = mchip_comp_read_frame(v, buf, bufsize);
 745                        break;
 746                }
 747                mchip_free_frame();
 748        }
 749        return len;
 750}
 751
 752#if 0
 753/* uncompress one image into a buffer */
 754static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
 755{
 756        mchip_vrj_setup(0x3f);
 757        udelay(50);
 758
 759        mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
 760        mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
 761
 762        mchip_delay(MCHIP_HIC_CMD, 0);
 763
 764        return mchip_comp_read_frame(buf, bufsize);
 765}
 766#endif
 767
 768/* start continuous compressed capture */
 769static void mchip_cont_compression_start(void)
 770{
 771        mchip_hic_stop();
 772        mchip_vrj_setup(0x3f);
 773        mchip_subsample();
 774        mchip_set_framerate();
 775        mchip_dma_setup(meye.mchip_dmahandle);
 776
 777        meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
 778
 779        mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
 780        mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
 781
 782        mchip_delay(MCHIP_HIC_CMD, 0);
 783}
 784
 785/****************************************************************************/
 786/* Interrupt handling                                                       */
 787/****************************************************************************/
 788
 789static irqreturn_t meye_irq(int irq, void *dev_id)
 790{
 791        u32 v;
 792        int reqnr;
 793        static int sequence;
 794
 795        v = mchip_read(MCHIP_MM_INTA);
 796
 797        if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
 798            meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
 799                return IRQ_NONE;
 800
 801again:
 802        v = mchip_get_frame();
 803        if (!(v & MCHIP_MM_FIR_RDY))
 804                return IRQ_HANDLED;
 805
 806        if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
 807                if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
 808                              sizeof(int), &meye.grabq_lock) != sizeof(int)) {
 809                        mchip_free_frame();
 810                        return IRQ_HANDLED;
 811                }
 812                mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
 813                                      mchip_hsize() * mchip_vsize() * 2);
 814                meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
 815                meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
 816                v4l2_get_timestamp(&meye.grab_buffer[reqnr].timestamp);
 817                meye.grab_buffer[reqnr].sequence = sequence++;
 818                kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
 819                                sizeof(int), &meye.doneq_lock);
 820                wake_up_interruptible(&meye.proc_list);
 821        } else {
 822                int size;
 823                size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
 824                if (size == -1) {
 825                        mchip_free_frame();
 826                        goto again;
 827                }
 828                if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
 829                              sizeof(int), &meye.grabq_lock) != sizeof(int)) {
 830                        mchip_free_frame();
 831                        goto again;
 832                }
 833                memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
 834                       size);
 835                meye.grab_buffer[reqnr].size = size;
 836                meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
 837                v4l2_get_timestamp(&meye.grab_buffer[reqnr].timestamp);
 838                meye.grab_buffer[reqnr].sequence = sequence++;
 839                kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
 840                                sizeof(int), &meye.doneq_lock);
 841                wake_up_interruptible(&meye.proc_list);
 842        }
 843        mchip_free_frame();
 844        goto again;
 845}
 846
 847/****************************************************************************/
 848/* video4linux integration                                                  */
 849/****************************************************************************/
 850
 851static int meye_open(struct file *file)
 852{
 853        int i;
 854
 855        if (test_and_set_bit(0, &meye.in_use))
 856                return -EBUSY;
 857
 858        mchip_hic_stop();
 859
 860        if (mchip_dma_alloc()) {
 861                printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
 862                clear_bit(0, &meye.in_use);
 863                return -ENOBUFS;
 864        }
 865
 866        for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
 867                meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
 868        kfifo_reset(&meye.grabq);
 869        kfifo_reset(&meye.doneq);
 870        return v4l2_fh_open(file);
 871}
 872
 873static int meye_release(struct file *file)
 874{
 875        mchip_hic_stop();
 876        mchip_dma_free();
 877        clear_bit(0, &meye.in_use);
 878        return v4l2_fh_release(file);
 879}
 880
 881static int meyeioc_g_params(struct meye_params *p)
 882{
 883        *p = meye.params;
 884        return 0;
 885}
 886
 887static int meyeioc_s_params(struct meye_params *jp)
 888{
 889        if (jp->subsample > 1)
 890                return -EINVAL;
 891
 892        if (jp->quality > 10)
 893                return -EINVAL;
 894
 895        if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
 896                return -EINVAL;
 897
 898        if (jp->framerate > 31)
 899                return -EINVAL;
 900
 901        mutex_lock(&meye.lock);
 902
 903        if (meye.params.subsample != jp->subsample ||
 904            meye.params.quality != jp->quality)
 905                mchip_hic_stop();       /* need restart */
 906
 907        meye.params = *jp;
 908        sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS,
 909                              meye.params.sharpness);
 910        sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC,
 911                              meye.params.agc);
 912        sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE,
 913                              meye.params.picture);
 914        mutex_unlock(&meye.lock);
 915
 916        return 0;
 917}
 918
 919static int meyeioc_qbuf_capt(int *nb)
 920{
 921        if (!meye.grab_fbuffer)
 922                return -EINVAL;
 923
 924        if (*nb >= gbuffers)
 925                return -EINVAL;
 926
 927        if (*nb < 0) {
 928                /* stop capture */
 929                mchip_hic_stop();
 930                return 0;
 931        }
 932
 933        if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
 934                return -EBUSY;
 935
 936        mutex_lock(&meye.lock);
 937
 938        if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
 939                mchip_cont_compression_start();
 940
 941        meye.grab_buffer[*nb].state = MEYE_BUF_USING;
 942        kfifo_in_locked(&meye.grabq, (unsigned char *)nb, sizeof(int),
 943                         &meye.grabq_lock);
 944        mutex_unlock(&meye.lock);
 945
 946        return 0;
 947}
 948
 949static int meyeioc_sync(struct file *file, void *fh, int *i)
 950{
 951        int unused;
 952
 953        if (*i < 0 || *i >= gbuffers)
 954                return -EINVAL;
 955
 956        mutex_lock(&meye.lock);
 957        switch (meye.grab_buffer[*i].state) {
 958
 959        case MEYE_BUF_UNUSED:
 960                mutex_unlock(&meye.lock);
 961                return -EINVAL;
 962        case MEYE_BUF_USING:
 963                if (file->f_flags & O_NONBLOCK) {
 964                        mutex_unlock(&meye.lock);
 965                        return -EAGAIN;
 966                }
 967                if (wait_event_interruptible(meye.proc_list,
 968                        (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
 969                        mutex_unlock(&meye.lock);
 970                        return -EINTR;
 971                }
 972                /* fall through */
 973        case MEYE_BUF_DONE:
 974                meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
 975                if (kfifo_out_locked(&meye.doneq, (unsigned char *)&unused,
 976                                sizeof(int), &meye.doneq_lock) != sizeof(int))
 977                                        break;
 978        }
 979        *i = meye.grab_buffer[*i].size;
 980        mutex_unlock(&meye.lock);
 981        return 0;
 982}
 983
 984static int meyeioc_stillcapt(void)
 985{
 986        if (!meye.grab_fbuffer)
 987                return -EINVAL;
 988
 989        if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
 990                return -EBUSY;
 991
 992        mutex_lock(&meye.lock);
 993        meye.grab_buffer[0].state = MEYE_BUF_USING;
 994        mchip_take_picture();
 995
 996        mchip_get_picture(meye.grab_fbuffer,
 997                        mchip_hsize() * mchip_vsize() * 2);
 998
 999        meye.grab_buffer[0].state = MEYE_BUF_DONE;
1000        mutex_unlock(&meye.lock);
1001
1002        return 0;
1003}
1004
1005static int meyeioc_stilljcapt(int *len)
1006{
1007        if (!meye.grab_fbuffer)
1008                return -EINVAL;
1009
1010        if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1011                return -EBUSY;
1012
1013        mutex_lock(&meye.lock);
1014        meye.grab_buffer[0].state = MEYE_BUF_USING;
1015        *len = -1;
1016
1017        while (*len == -1) {
1018                mchip_take_picture();
1019                *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1020        }
1021
1022        meye.grab_buffer[0].state = MEYE_BUF_DONE;
1023        mutex_unlock(&meye.lock);
1024        return 0;
1025}
1026
1027static int vidioc_querycap(struct file *file, void *fh,
1028                                struct v4l2_capability *cap)
1029{
1030        strcpy(cap->driver, "meye");
1031        strcpy(cap->card, "meye");
1032        sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1033
1034        cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
1035                       MEYE_DRIVER_MINORVERSION;
1036
1037        cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
1038                            V4L2_CAP_STREAMING;
1039        cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
1040
1041        return 0;
1042}
1043
1044static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1045{
1046        if (i->index != 0)
1047                return -EINVAL;
1048
1049        strcpy(i->name, "Camera");
1050        i->type = V4L2_INPUT_TYPE_CAMERA;
1051
1052        return 0;
1053}
1054
1055static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1056{
1057        *i = 0;
1058        return 0;
1059}
1060
1061static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1062{
1063        if (i != 0)
1064                return -EINVAL;
1065
1066        return 0;
1067}
1068
1069static int meye_s_ctrl(struct v4l2_ctrl *ctrl)
1070{
1071        mutex_lock(&meye.lock);
1072        switch (ctrl->id) {
1073        case V4L2_CID_BRIGHTNESS:
1074                sony_pic_camera_command(
1075                        SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val);
1076                meye.brightness = ctrl->val << 10;
1077                break;
1078        case V4L2_CID_HUE:
1079                sony_pic_camera_command(
1080                        SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val);
1081                meye.hue = ctrl->val << 10;
1082                break;
1083        case V4L2_CID_CONTRAST:
1084                sony_pic_camera_command(
1085                        SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val);
1086                meye.contrast = ctrl->val << 10;
1087                break;
1088        case V4L2_CID_SATURATION:
1089                sony_pic_camera_command(
1090                        SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val);
1091                meye.colour = ctrl->val << 10;
1092                break;
1093        case V4L2_CID_MEYE_AGC:
1094                sony_pic_camera_command(
1095                        SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val);
1096                meye.params.agc = ctrl->val;
1097                break;
1098        case V4L2_CID_SHARPNESS:
1099                sony_pic_camera_command(
1100                        SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val);
1101                meye.params.sharpness = ctrl->val;
1102                break;
1103        case V4L2_CID_MEYE_PICTURE:
1104                sony_pic_camera_command(
1105                        SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val);
1106                meye.params.picture = ctrl->val;
1107                break;
1108        case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1109                meye.params.quality = ctrl->val;
1110                break;
1111        case V4L2_CID_MEYE_FRAMERATE:
1112                meye.params.framerate = ctrl->val;
1113                break;
1114        default:
1115                mutex_unlock(&meye.lock);
1116                return -EINVAL;
1117        }
1118        mutex_unlock(&meye.lock);
1119
1120        return 0;
1121}
1122
1123static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1124                                struct v4l2_fmtdesc *f)
1125{
1126        if (f->index > 1)
1127                return -EINVAL;
1128
1129        if (f->index == 0) {
1130                /* standard YUV 422 capture */
1131                f->flags = 0;
1132                strcpy(f->description, "YUV422");
1133                f->pixelformat = V4L2_PIX_FMT_YUYV;
1134        } else {
1135                /* compressed MJPEG capture */
1136                f->flags = V4L2_FMT_FLAG_COMPRESSED;
1137                strcpy(f->description, "MJPEG");
1138                f->pixelformat = V4L2_PIX_FMT_MJPEG;
1139        }
1140
1141        return 0;
1142}
1143
1144static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1145                                struct v4l2_format *f)
1146{
1147        if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1148            f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1149                return -EINVAL;
1150
1151        if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1152            f->fmt.pix.field != V4L2_FIELD_NONE)
1153                return -EINVAL;
1154
1155        f->fmt.pix.field = V4L2_FIELD_NONE;
1156
1157        if (f->fmt.pix.width <= 320) {
1158                f->fmt.pix.width = 320;
1159                f->fmt.pix.height = 240;
1160        } else {
1161                f->fmt.pix.width = 640;
1162                f->fmt.pix.height = 480;
1163        }
1164
1165        f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1166        f->fmt.pix.sizeimage = f->fmt.pix.height *
1167                               f->fmt.pix.bytesperline;
1168        f->fmt.pix.colorspace = 0;
1169
1170        return 0;
1171}
1172
1173static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1174                                    struct v4l2_format *f)
1175{
1176        switch (meye.mchip_mode) {
1177        case MCHIP_HIC_MODE_CONT_OUT:
1178        default:
1179                f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1180                break;
1181        case MCHIP_HIC_MODE_CONT_COMP:
1182                f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1183                break;
1184        }
1185
1186        f->fmt.pix.field = V4L2_FIELD_NONE;
1187        f->fmt.pix.width = mchip_hsize();
1188        f->fmt.pix.height = mchip_vsize();
1189        f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1190        f->fmt.pix.sizeimage = f->fmt.pix.height *
1191                               f->fmt.pix.bytesperline;
1192
1193        return 0;
1194}
1195
1196static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1197                                    struct v4l2_format *f)
1198{
1199        if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1200            f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1201                return -EINVAL;
1202
1203        if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1204            f->fmt.pix.field != V4L2_FIELD_NONE)
1205                return -EINVAL;
1206
1207        f->fmt.pix.field = V4L2_FIELD_NONE;
1208        mutex_lock(&meye.lock);
1209
1210        if (f->fmt.pix.width <= 320) {
1211                f->fmt.pix.width = 320;
1212                f->fmt.pix.height = 240;
1213                meye.params.subsample = 1;
1214        } else {
1215                f->fmt.pix.width = 640;
1216                f->fmt.pix.height = 480;
1217                meye.params.subsample = 0;
1218        }
1219
1220        switch (f->fmt.pix.pixelformat) {
1221        case V4L2_PIX_FMT_YUYV:
1222                meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1223                break;
1224        case V4L2_PIX_FMT_MJPEG:
1225                meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1226                break;
1227        }
1228
1229        mutex_unlock(&meye.lock);
1230        f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1231        f->fmt.pix.sizeimage = f->fmt.pix.height *
1232                               f->fmt.pix.bytesperline;
1233        f->fmt.pix.colorspace = 0;
1234
1235        return 0;
1236}
1237
1238static int vidioc_reqbufs(struct file *file, void *fh,
1239                                struct v4l2_requestbuffers *req)
1240{
1241        int i;
1242
1243        if (req->memory != V4L2_MEMORY_MMAP)
1244                return -EINVAL;
1245
1246        if (meye.grab_fbuffer && req->count == gbuffers) {
1247                /* already allocated, no modifications */
1248                return 0;
1249        }
1250
1251        mutex_lock(&meye.lock);
1252        if (meye.grab_fbuffer) {
1253                for (i = 0; i < gbuffers; i++)
1254                        if (meye.vma_use_count[i]) {
1255                                mutex_unlock(&meye.lock);
1256                                return -EINVAL;
1257                        }
1258                rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1259                meye.grab_fbuffer = NULL;
1260        }
1261
1262        gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1263        req->count = gbuffers;
1264        meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1265
1266        if (!meye.grab_fbuffer) {
1267                printk(KERN_ERR "meye: v4l framebuffer allocation"
1268                                " failed\n");
1269                mutex_unlock(&meye.lock);
1270                return -ENOMEM;
1271        }
1272
1273        for (i = 0; i < gbuffers; i++)
1274                meye.vma_use_count[i] = 0;
1275
1276        mutex_unlock(&meye.lock);
1277
1278        return 0;
1279}
1280
1281static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1282{
1283        unsigned int index = buf->index;
1284
1285        if (index >= gbuffers)
1286                return -EINVAL;
1287
1288        buf->bytesused = meye.grab_buffer[index].size;
1289        buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1290
1291        if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1292                buf->flags |= V4L2_BUF_FLAG_QUEUED;
1293
1294        if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1295                buf->flags |= V4L2_BUF_FLAG_DONE;
1296
1297        buf->field = V4L2_FIELD_NONE;
1298        buf->timestamp = meye.grab_buffer[index].timestamp;
1299        buf->sequence = meye.grab_buffer[index].sequence;
1300        buf->memory = V4L2_MEMORY_MMAP;
1301        buf->m.offset = index * gbufsize;
1302        buf->length = gbufsize;
1303
1304        return 0;
1305}
1306
1307static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1308{
1309        if (buf->memory != V4L2_MEMORY_MMAP)
1310                return -EINVAL;
1311
1312        if (buf->index >= gbuffers)
1313                return -EINVAL;
1314
1315        if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1316                return -EINVAL;
1317
1318        mutex_lock(&meye.lock);
1319        buf->flags |= V4L2_BUF_FLAG_QUEUED;
1320        buf->flags &= ~V4L2_BUF_FLAG_DONE;
1321        meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1322        kfifo_in_locked(&meye.grabq, (unsigned char *)&buf->index,
1323                        sizeof(int), &meye.grabq_lock);
1324        mutex_unlock(&meye.lock);
1325
1326        return 0;
1327}
1328
1329static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1330{
1331        int reqnr;
1332
1333        if (buf->memory != V4L2_MEMORY_MMAP)
1334                return -EINVAL;
1335
1336        mutex_lock(&meye.lock);
1337
1338        if (kfifo_len(&meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1339                mutex_unlock(&meye.lock);
1340                return -EAGAIN;
1341        }
1342
1343        if (wait_event_interruptible(meye.proc_list,
1344                                     kfifo_len(&meye.doneq) != 0) < 0) {
1345                mutex_unlock(&meye.lock);
1346                return -EINTR;
1347        }
1348
1349        if (!kfifo_out_locked(&meye.doneq, (unsigned char *)&reqnr,
1350                       sizeof(int), &meye.doneq_lock)) {
1351                mutex_unlock(&meye.lock);
1352                return -EBUSY;
1353        }
1354
1355        if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1356                mutex_unlock(&meye.lock);
1357                return -EINVAL;
1358        }
1359
1360        buf->index = reqnr;
1361        buf->bytesused = meye.grab_buffer[reqnr].size;
1362        buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1363        buf->field = V4L2_FIELD_NONE;
1364        buf->timestamp = meye.grab_buffer[reqnr].timestamp;
1365        buf->sequence = meye.grab_buffer[reqnr].sequence;
1366        buf->memory = V4L2_MEMORY_MMAP;
1367        buf->m.offset = reqnr * gbufsize;
1368        buf->length = gbufsize;
1369        meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1370        mutex_unlock(&meye.lock);
1371
1372        return 0;
1373}
1374
1375static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1376{
1377        mutex_lock(&meye.lock);
1378
1379        switch (meye.mchip_mode) {
1380        case MCHIP_HIC_MODE_CONT_OUT:
1381                mchip_continuous_start();
1382                break;
1383        case MCHIP_HIC_MODE_CONT_COMP:
1384                mchip_cont_compression_start();
1385                break;
1386        default:
1387                mutex_unlock(&meye.lock);
1388                return -EINVAL;
1389        }
1390
1391        mutex_unlock(&meye.lock);
1392
1393        return 0;
1394}
1395
1396static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1397{
1398        mutex_lock(&meye.lock);
1399        mchip_hic_stop();
1400        kfifo_reset(&meye.grabq);
1401        kfifo_reset(&meye.doneq);
1402
1403        for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1404                meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1405
1406        mutex_unlock(&meye.lock);
1407        return 0;
1408}
1409
1410static long vidioc_default(struct file *file, void *fh, bool valid_prio,
1411                           unsigned int cmd, void *arg)
1412{
1413        switch (cmd) {
1414        case MEYEIOC_G_PARAMS:
1415                return meyeioc_g_params((struct meye_params *) arg);
1416
1417        case MEYEIOC_S_PARAMS:
1418                return meyeioc_s_params((struct meye_params *) arg);
1419
1420        case MEYEIOC_QBUF_CAPT:
1421                return meyeioc_qbuf_capt((int *) arg);
1422
1423        case MEYEIOC_SYNC:
1424                return meyeioc_sync(file, fh, (int *) arg);
1425
1426        case MEYEIOC_STILLCAPT:
1427                return meyeioc_stillcapt();
1428
1429        case MEYEIOC_STILLJCAPT:
1430                return meyeioc_stilljcapt((int *) arg);
1431
1432        default:
1433                return -ENOTTY;
1434        }
1435
1436}
1437
1438static unsigned int meye_poll(struct file *file, poll_table *wait)
1439{
1440        unsigned int res = v4l2_ctrl_poll(file, wait);
1441
1442        mutex_lock(&meye.lock);
1443        poll_wait(file, &meye.proc_list, wait);
1444        if (kfifo_len(&meye.doneq))
1445                res |= POLLIN | POLLRDNORM;
1446        mutex_unlock(&meye.lock);
1447        return res;
1448}
1449
1450static void meye_vm_open(struct vm_area_struct *vma)
1451{
1452        long idx = (long)vma->vm_private_data;
1453        meye.vma_use_count[idx]++;
1454}
1455
1456static void meye_vm_close(struct vm_area_struct *vma)
1457{
1458        long idx = (long)vma->vm_private_data;
1459        meye.vma_use_count[idx]--;
1460}
1461
1462static const struct vm_operations_struct meye_vm_ops = {
1463        .open           = meye_vm_open,
1464        .close          = meye_vm_close,
1465};
1466
1467static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1468{
1469        unsigned long start = vma->vm_start;
1470        unsigned long size = vma->vm_end - vma->vm_start;
1471        unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1472        unsigned long page, pos;
1473
1474        mutex_lock(&meye.lock);
1475        if (size > gbuffers * gbufsize) {
1476                mutex_unlock(&meye.lock);
1477                return -EINVAL;
1478        }
1479        if (!meye.grab_fbuffer) {
1480                int i;
1481
1482                /* lazy allocation */
1483                meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1484                if (!meye.grab_fbuffer) {
1485                        printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1486                        mutex_unlock(&meye.lock);
1487                        return -ENOMEM;
1488                }
1489                for (i = 0; i < gbuffers; i++)
1490                        meye.vma_use_count[i] = 0;
1491        }
1492        pos = (unsigned long)meye.grab_fbuffer + offset;
1493
1494        while (size > 0) {
1495                page = vmalloc_to_pfn((void *)pos);
1496                if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1497                        mutex_unlock(&meye.lock);
1498                        return -EAGAIN;
1499                }
1500                start += PAGE_SIZE;
1501                pos += PAGE_SIZE;
1502                if (size > PAGE_SIZE)
1503                        size -= PAGE_SIZE;
1504                else
1505                        size = 0;
1506        }
1507
1508        vma->vm_ops = &meye_vm_ops;
1509        vma->vm_flags &= ~VM_IO;        /* not I/O memory */
1510        vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1511        vma->vm_private_data = (void *) (offset / gbufsize);
1512        meye_vm_open(vma);
1513
1514        mutex_unlock(&meye.lock);
1515        return 0;
1516}
1517
1518static const struct v4l2_file_operations meye_fops = {
1519        .owner          = THIS_MODULE,
1520        .open           = meye_open,
1521        .release        = meye_release,
1522        .mmap           = meye_mmap,
1523        .unlocked_ioctl = video_ioctl2,
1524        .poll           = meye_poll,
1525};
1526
1527static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1528        .vidioc_querycap        = vidioc_querycap,
1529        .vidioc_enum_input      = vidioc_enum_input,
1530        .vidioc_g_input         = vidioc_g_input,
1531        .vidioc_s_input         = vidioc_s_input,
1532        .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1533        .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1534        .vidioc_g_fmt_vid_cap   = vidioc_g_fmt_vid_cap,
1535        .vidioc_s_fmt_vid_cap   = vidioc_s_fmt_vid_cap,
1536        .vidioc_reqbufs         = vidioc_reqbufs,
1537        .vidioc_querybuf        = vidioc_querybuf,
1538        .vidioc_qbuf            = vidioc_qbuf,
1539        .vidioc_dqbuf           = vidioc_dqbuf,
1540        .vidioc_streamon        = vidioc_streamon,
1541        .vidioc_streamoff       = vidioc_streamoff,
1542        .vidioc_log_status      = v4l2_ctrl_log_status,
1543        .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1544        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1545        .vidioc_default         = vidioc_default,
1546};
1547
1548static struct video_device meye_template = {
1549        .name           = "meye",
1550        .fops           = &meye_fops,
1551        .ioctl_ops      = &meye_ioctl_ops,
1552        .release        = video_device_release,
1553};
1554
1555static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1556        .s_ctrl = meye_s_ctrl,
1557};
1558
1559#ifdef CONFIG_PM
1560static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1561{
1562        pci_save_state(pdev);
1563        meye.pm_mchip_mode = meye.mchip_mode;
1564        mchip_hic_stop();
1565        mchip_set(MCHIP_MM_INTA, 0x0);
1566        return 0;
1567}
1568
1569static int meye_resume(struct pci_dev *pdev)
1570{
1571        pci_restore_state(pdev);
1572        pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1573
1574        mchip_delay(MCHIP_HIC_CMD, 0);
1575        mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1576        msleep(1);
1577        mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1578        msleep(1);
1579        mchip_set(MCHIP_MM_PCI_MODE, 5);
1580        msleep(1);
1581        mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1582
1583        switch (meye.pm_mchip_mode) {
1584        case MCHIP_HIC_MODE_CONT_OUT:
1585                mchip_continuous_start();
1586                break;
1587        case MCHIP_HIC_MODE_CONT_COMP:
1588                mchip_cont_compression_start();
1589                break;
1590        }
1591        return 0;
1592}
1593#endif
1594
1595static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1596{
1597        static const struct v4l2_ctrl_config ctrl_agc = {
1598                .id = V4L2_CID_MEYE_AGC,
1599                .type = V4L2_CTRL_TYPE_INTEGER,
1600                .ops = &meye_ctrl_ops,
1601                .name = "AGC",
1602                .max = 63,
1603                .step = 1,
1604                .def = 48,
1605                .flags = V4L2_CTRL_FLAG_SLIDER,
1606        };
1607        static const struct v4l2_ctrl_config ctrl_picture = {
1608                .id = V4L2_CID_MEYE_PICTURE,
1609                .type = V4L2_CTRL_TYPE_INTEGER,
1610                .ops = &meye_ctrl_ops,
1611                .name = "Picture",
1612                .max = 63,
1613                .step = 1,
1614        };
1615        static const struct v4l2_ctrl_config ctrl_framerate = {
1616                .id = V4L2_CID_MEYE_FRAMERATE,
1617                .type = V4L2_CTRL_TYPE_INTEGER,
1618                .ops = &meye_ctrl_ops,
1619                .name = "Framerate",
1620                .max = 31,
1621                .step = 1,
1622        };
1623        struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
1624        int ret = -EBUSY;
1625        unsigned long mchip_adr;
1626
1627        if (meye.mchip_dev != NULL) {
1628                printk(KERN_ERR "meye: only one device allowed!\n");
1629                goto outnotdev;
1630        }
1631
1632        ret = v4l2_device_register(&pcidev->dev, v4l2_dev);
1633        if (ret < 0) {
1634                v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
1635                return ret;
1636        }
1637        ret = -ENOMEM;
1638        meye.mchip_dev = pcidev;
1639        meye.vdev = video_device_alloc();
1640        if (!meye.vdev) {
1641                v4l2_err(v4l2_dev, "video_device_alloc() failed!\n");
1642                goto outnotdev;
1643        }
1644
1645        meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
1646        if (!meye.grab_temp) {
1647                v4l2_err(v4l2_dev, "grab buffer allocation failed\n");
1648                goto outvmalloc;
1649        }
1650
1651        spin_lock_init(&meye.grabq_lock);
1652        if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS,
1653                                GFP_KERNEL)) {
1654                v4l2_err(v4l2_dev, "fifo allocation failed\n");
1655                goto outkfifoalloc1;
1656        }
1657        spin_lock_init(&meye.doneq_lock);
1658        if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS,
1659                                GFP_KERNEL)) {
1660                v4l2_err(v4l2_dev, "fifo allocation failed\n");
1661                goto outkfifoalloc2;
1662        }
1663
1664        memcpy(meye.vdev, &meye_template, sizeof(meye_template));
1665        meye.vdev->v4l2_dev = &meye.v4l2_dev;
1666
1667        ret = -EIO;
1668        if ((ret = sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 1))) {
1669                v4l2_err(v4l2_dev, "meye: unable to power on the camera\n");
1670                v4l2_err(v4l2_dev, "meye: did you enable the camera in "
1671                                "sonypi using the module options ?\n");
1672                goto outsonypienable;
1673        }
1674
1675        if ((ret = pci_enable_device(meye.mchip_dev))) {
1676                v4l2_err(v4l2_dev, "meye: pci_enable_device failed\n");
1677                goto outenabledev;
1678        }
1679
1680        mchip_adr = pci_resource_start(meye.mchip_dev,0);
1681        if (!mchip_adr) {
1682                v4l2_err(v4l2_dev, "meye: mchip has no device base address\n");
1683                goto outregions;
1684        }
1685        if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1686                                pci_resource_len(meye.mchip_dev, 0),
1687                                "meye")) {
1688                v4l2_err(v4l2_dev, "meye: request_mem_region failed\n");
1689                goto outregions;
1690        }
1691        meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1692        if (!meye.mchip_mmregs) {
1693                v4l2_err(v4l2_dev, "meye: ioremap failed\n");
1694                goto outremap;
1695        }
1696
1697        meye.mchip_irq = pcidev->irq;
1698        if (request_irq(meye.mchip_irq, meye_irq,
1699                        IRQF_SHARED, "meye", meye_irq)) {
1700                v4l2_err(v4l2_dev, "request_irq failed\n");
1701                goto outreqirq;
1702        }
1703
1704        pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1705        pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1706
1707        pci_set_master(meye.mchip_dev);
1708
1709        /* Ask the camera to perform a soft reset. */
1710        pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1711
1712        mchip_delay(MCHIP_HIC_CMD, 0);
1713        mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1714
1715        msleep(1);
1716        mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1717
1718        msleep(1);
1719        mchip_set(MCHIP_MM_PCI_MODE, 5);
1720
1721        msleep(1);
1722        mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1723
1724        mutex_init(&meye.lock);
1725        init_waitqueue_head(&meye.proc_list);
1726
1727        v4l2_ctrl_handler_init(&meye.hdl, 3);
1728        v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1729                          V4L2_CID_BRIGHTNESS, 0, 63, 1, 32);
1730        v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1731                          V4L2_CID_HUE, 0, 63, 1, 32);
1732        v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1733                          V4L2_CID_CONTRAST, 0, 63, 1, 32);
1734        v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1735                          V4L2_CID_SATURATION, 0, 63, 1, 32);
1736        v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL);
1737        v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1738                          V4L2_CID_SHARPNESS, 0, 63, 1, 32);
1739        v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL);
1740        v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops,
1741                          V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8);
1742        v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL);
1743        if (meye.hdl.error) {
1744                v4l2_err(v4l2_dev, "couldn't register controls\n");
1745                goto outvideoreg;
1746        }
1747
1748        v4l2_ctrl_handler_setup(&meye.hdl);
1749        meye.vdev->ctrl_handler = &meye.hdl;
1750
1751        if (video_register_device(meye.vdev, VFL_TYPE_GRABBER,
1752                                  video_nr) < 0) {
1753                v4l2_err(v4l2_dev, "video_register_device failed\n");
1754                goto outvideoreg;
1755        }
1756
1757        v4l2_info(v4l2_dev, "Motion Eye Camera Driver v%s.\n",
1758               MEYE_DRIVER_VERSION);
1759        v4l2_info(v4l2_dev, "mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1760               meye.mchip_dev->revision, mchip_adr, meye.mchip_irq);
1761
1762        return 0;
1763
1764outvideoreg:
1765        v4l2_ctrl_handler_free(&meye.hdl);
1766        free_irq(meye.mchip_irq, meye_irq);
1767outreqirq:
1768        iounmap(meye.mchip_mmregs);
1769outremap:
1770        release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1771                           pci_resource_len(meye.mchip_dev, 0));
1772outregions:
1773        pci_disable_device(meye.mchip_dev);
1774outenabledev:
1775        sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1776outsonypienable:
1777        kfifo_free(&meye.doneq);
1778outkfifoalloc2:
1779        kfifo_free(&meye.grabq);
1780outkfifoalloc1:
1781        vfree(meye.grab_temp);
1782outvmalloc:
1783        video_device_release(meye.vdev);
1784outnotdev:
1785        return ret;
1786}
1787
1788static void meye_remove(struct pci_dev *pcidev)
1789{
1790        video_unregister_device(meye.vdev);
1791
1792        mchip_hic_stop();
1793
1794        mchip_dma_free();
1795
1796        /* disable interrupts */
1797        mchip_set(MCHIP_MM_INTA, 0x0);
1798
1799        free_irq(meye.mchip_irq, meye_irq);
1800
1801        iounmap(meye.mchip_mmregs);
1802
1803        release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1804                           pci_resource_len(meye.mchip_dev, 0));
1805
1806        pci_disable_device(meye.mchip_dev);
1807
1808        sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1809
1810        kfifo_free(&meye.doneq);
1811        kfifo_free(&meye.grabq);
1812
1813        vfree(meye.grab_temp);
1814
1815        if (meye.grab_fbuffer) {
1816                rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1817                meye.grab_fbuffer = NULL;
1818        }
1819
1820        printk(KERN_INFO "meye: removed\n");
1821}
1822
1823static struct pci_device_id meye_pci_tbl[] = {
1824        { PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1825        { }
1826};
1827
1828MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1829
1830static struct pci_driver meye_driver = {
1831        .name           = "meye",
1832        .id_table       = meye_pci_tbl,
1833        .probe          = meye_probe,
1834        .remove         = meye_remove,
1835#ifdef CONFIG_PM
1836        .suspend        = meye_suspend,
1837        .resume         = meye_resume,
1838#endif
1839};
1840
1841static int __init meye_init(void)
1842{
1843        gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
1844        if (gbufsize > MEYE_MAX_BUFSIZE)
1845                gbufsize = MEYE_MAX_BUFSIZE;
1846        gbufsize = PAGE_ALIGN(gbufsize);
1847        printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) "
1848                         "for capture\n",
1849                         gbuffers,
1850                         gbufsize / 1024, gbuffers * gbufsize / 1024);
1851        return pci_register_driver(&meye_driver);
1852}
1853
1854static void __exit meye_exit(void)
1855{
1856        pci_unregister_driver(&meye_driver);
1857}
1858
1859module_init(meye_init);
1860module_exit(meye_exit);
1861