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