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