linux/drivers/media/video/cpia2/cpia2_core.c
<<
>>
Prefs
   1/****************************************************************************
   2 *
   3 *  Filename: cpia2_core.c
   4 *
   5 *  Copyright 2001, STMicrolectronics, Inc.
   6 *      Contact:  steve.miller@st.com
   7 *
   8 *  Description:
   9 *     This is a USB driver for CPia2 based video cameras.
  10 *     The infrastructure of this driver is based on the cpia usb driver by
  11 *     Jochen Scharrlach and Johannes Erdfeldt.
  12 *
  13 *  This program is free software; you can redistribute it and/or modify
  14 *  it under the terms of the GNU General Public License as published by
  15 *  the Free Software Foundation; either version 2 of the License, or
  16 *  (at your option) any later version.
  17 *
  18 *  This program is distributed in the hope that it will be useful,
  19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 *  GNU General Public License for more details.
  22 *
  23 *  You should have received a copy of the GNU General Public License
  24 *  along with this program; if not, write to the Free Software
  25 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26 *
  27 *  Stripped of 2.4 stuff ready for main kernel submit by
  28 *              Alan Cox <alan@lxorguk.ukuu.org.uk>
  29 *
  30 ****************************************************************************/
  31
  32#include "cpia2.h"
  33
  34#include <linux/slab.h>
  35#include <linux/mm.h>
  36#include <linux/vmalloc.h>
  37#include <linux/firmware.h>
  38
  39/* #define _CPIA2_DEBUG_ */
  40
  41#ifdef _CPIA2_DEBUG_
  42
  43static const char *block_name[] = {
  44        "System",
  45        "VC",
  46        "VP",
  47        "IDATA"
  48};
  49#endif
  50
  51static unsigned int debugs_on;  /* default 0 - DEBUG_REG */
  52
  53
  54/******************************************************************************
  55 *
  56 *  Forward Declarations
  57 *
  58 *****************************************************************************/
  59static int apply_vp_patch(struct camera_data *cam);
  60static int set_default_user_mode(struct camera_data *cam);
  61static int set_vw_size(struct camera_data *cam, int size);
  62static int configure_sensor(struct camera_data *cam,
  63                            int reqwidth, int reqheight);
  64static int config_sensor_410(struct camera_data *cam,
  65                            int reqwidth, int reqheight);
  66static int config_sensor_500(struct camera_data *cam,
  67                            int reqwidth, int reqheight);
  68static int set_all_properties(struct camera_data *cam);
  69static void get_color_params(struct camera_data *cam);
  70static void wake_system(struct camera_data *cam);
  71static void set_lowlight_boost(struct camera_data *cam);
  72static void reset_camera_struct(struct camera_data *cam);
  73static int cpia2_set_high_power(struct camera_data *cam);
  74
  75/* Here we want the physical address of the memory.
  76 * This is used when initializing the contents of the
  77 * area and marking the pages as reserved.
  78 */
  79static inline unsigned long kvirt_to_pa(unsigned long adr)
  80{
  81        unsigned long kva, ret;
  82
  83        kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
  84        kva |= adr & (PAGE_SIZE-1); /* restore the offset */
  85        ret = __pa(kva);
  86        return ret;
  87}
  88
  89static void *rvmalloc(unsigned long size)
  90{
  91        void *mem;
  92        unsigned long adr;
  93
  94        /* Round it off to PAGE_SIZE */
  95        size = PAGE_ALIGN(size);
  96
  97        mem = vmalloc_32(size);
  98        if (!mem)
  99                return NULL;
 100
 101        memset(mem, 0, size);   /* Clear the ram out, no junk to the user */
 102        adr = (unsigned long) mem;
 103
 104        while ((long)size > 0) {
 105                SetPageReserved(vmalloc_to_page((void *)adr));
 106                adr += PAGE_SIZE;
 107                size -= PAGE_SIZE;
 108        }
 109        return mem;
 110}
 111
 112static void rvfree(void *mem, unsigned long size)
 113{
 114        unsigned long adr;
 115
 116        if (!mem)
 117                return;
 118
 119        size = PAGE_ALIGN(size);
 120
 121        adr = (unsigned long) mem;
 122        while ((long)size > 0) {
 123                ClearPageReserved(vmalloc_to_page((void *)adr));
 124                adr += PAGE_SIZE;
 125                size -= PAGE_SIZE;
 126        }
 127        vfree(mem);
 128}
 129
 130/******************************************************************************
 131 *
 132 *  cpia2_do_command
 133 *
 134 *  Send an arbitrary command to the camera.  For commands that read from
 135 *  the camera, copy the buffers into the proper param structures.
 136 *****************************************************************************/
 137int cpia2_do_command(struct camera_data *cam,
 138                     u32 command, u8 direction, u8 param)
 139{
 140        int retval = 0;
 141        struct cpia2_command cmd;
 142        unsigned int device = cam->params.pnp_id.device_type;
 143
 144        cmd.command = command;
 145        cmd.reg_count = 2;      /* default */
 146        cmd.direction = direction;
 147
 148        /***
 149         * Set up the command.
 150         ***/
 151        switch (command) {
 152        case CPIA2_CMD_GET_VERSION:
 153                cmd.req_mode =
 154                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 155                cmd.start = CPIA2_SYSTEM_DEVICE_HI;
 156                break;
 157        case CPIA2_CMD_GET_PNP_ID:
 158                cmd.req_mode =
 159                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 160                cmd.reg_count = 8;
 161                cmd.start = CPIA2_SYSTEM_DESCRIP_VID_HI;
 162                break;
 163        case CPIA2_CMD_GET_ASIC_TYPE:
 164                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
 165                cmd.start = CPIA2_VC_ASIC_ID;
 166                break;
 167        case CPIA2_CMD_GET_SENSOR:
 168                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 169                cmd.start = CPIA2_VP_SENSOR_FLAGS;
 170                break;
 171        case CPIA2_CMD_GET_VP_DEVICE:
 172                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 173                cmd.start = CPIA2_VP_DEVICEH;
 174                break;
 175        case CPIA2_CMD_SET_VP_BRIGHTNESS:
 176                cmd.buffer.block_data[0] = param;       /* Then fall through */
 177        case CPIA2_CMD_GET_VP_BRIGHTNESS:
 178                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 179                cmd.reg_count = 1;
 180                if (device == DEVICE_STV_672)
 181                        cmd.start = CPIA2_VP4_EXPOSURE_TARGET;
 182                else
 183                        cmd.start = CPIA2_VP5_EXPOSURE_TARGET;
 184                break;
 185        case CPIA2_CMD_SET_CONTRAST:
 186                cmd.buffer.block_data[0] = param;       /* Then fall through */
 187        case CPIA2_CMD_GET_CONTRAST:
 188                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 189                cmd.reg_count = 1;
 190                cmd.start = CPIA2_VP_YRANGE;
 191                break;
 192        case CPIA2_CMD_SET_VP_SATURATION:
 193                cmd.buffer.block_data[0] = param;       /* Then fall through */
 194        case CPIA2_CMD_GET_VP_SATURATION:
 195                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 196                cmd.reg_count = 1;
 197                if (device == DEVICE_STV_672)
 198                        cmd.start = CPIA2_VP_SATURATION;
 199                else
 200                        cmd.start = CPIA2_VP5_MCUVSATURATION;
 201                break;
 202        case CPIA2_CMD_SET_VP_GPIO_DATA:
 203                cmd.buffer.block_data[0] = param;       /* Then fall through */
 204        case CPIA2_CMD_GET_VP_GPIO_DATA:
 205                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 206                cmd.reg_count = 1;
 207                cmd.start = CPIA2_VP_GPIO_DATA;
 208                break;
 209        case CPIA2_CMD_SET_VP_GPIO_DIRECTION:
 210                cmd.buffer.block_data[0] = param;       /* Then fall through */
 211        case CPIA2_CMD_GET_VP_GPIO_DIRECTION:
 212                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 213                cmd.reg_count = 1;
 214                cmd.start = CPIA2_VP_GPIO_DIRECTION;
 215                break;
 216        case CPIA2_CMD_SET_VC_MP_GPIO_DATA:
 217                cmd.buffer.block_data[0] = param;       /* Then fall through */
 218        case CPIA2_CMD_GET_VC_MP_GPIO_DATA:
 219                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
 220                cmd.reg_count = 1;
 221                cmd.start = CPIA2_VC_MP_DATA;
 222                break;
 223        case CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION:
 224                cmd.buffer.block_data[0] = param;       /* Then fall through */
 225        case CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION:
 226                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
 227                cmd.reg_count = 1;
 228                cmd.start = CPIA2_VC_MP_DIR;
 229                break;
 230        case CPIA2_CMD_ENABLE_PACKET_CTRL:
 231                cmd.req_mode =
 232                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 233                cmd.start = CPIA2_SYSTEM_INT_PACKET_CTRL;
 234                cmd.reg_count = 1;
 235                cmd.buffer.block_data[0] = param;
 236                break;
 237        case CPIA2_CMD_SET_FLICKER_MODES:
 238                cmd.buffer.block_data[0] = param;       /* Then fall through */
 239        case CPIA2_CMD_GET_FLICKER_MODES:
 240                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 241                cmd.reg_count = 1;
 242                cmd.start = CPIA2_VP_FLICKER_MODES;
 243                break;
 244        case CPIA2_CMD_RESET_FIFO:      /* clear fifo and enable stream block */
 245                cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
 246                cmd.reg_count = 2;
 247                cmd.start = 0;
 248                cmd.buffer.registers[0].index = CPIA2_VC_ST_CTRL;
 249                cmd.buffer.registers[0].value = CPIA2_VC_ST_CTRL_SRC_VC |
 250                    CPIA2_VC_ST_CTRL_DST_USB | CPIA2_VC_ST_CTRL_EOF_DETECT;
 251                cmd.buffer.registers[1].index = CPIA2_VC_ST_CTRL;
 252                cmd.buffer.registers[1].value = CPIA2_VC_ST_CTRL_SRC_VC |
 253                    CPIA2_VC_ST_CTRL_DST_USB |
 254                    CPIA2_VC_ST_CTRL_EOF_DETECT |
 255                    CPIA2_VC_ST_CTRL_FIFO_ENABLE;
 256                break;
 257        case CPIA2_CMD_SET_HI_POWER:
 258                cmd.req_mode =
 259                    CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_SYSTEM;
 260                cmd.reg_count = 2;
 261                cmd.buffer.registers[0].index =
 262                    CPIA2_SYSTEM_SYSTEM_CONTROL;
 263                cmd.buffer.registers[1].index =
 264                    CPIA2_SYSTEM_SYSTEM_CONTROL;
 265                cmd.buffer.registers[0].value = CPIA2_SYSTEM_CONTROL_CLEAR_ERR;
 266                cmd.buffer.registers[1].value =
 267                    CPIA2_SYSTEM_CONTROL_HIGH_POWER;
 268                break;
 269        case CPIA2_CMD_SET_LOW_POWER:
 270                cmd.req_mode =
 271                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 272                cmd.reg_count = 1;
 273                cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL;
 274                cmd.buffer.block_data[0] = 0;
 275                break;
 276        case CPIA2_CMD_CLEAR_V2W_ERR:
 277                cmd.req_mode =
 278                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 279                cmd.reg_count = 1;
 280                cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL;
 281                cmd.buffer.block_data[0] = CPIA2_SYSTEM_CONTROL_CLEAR_ERR;
 282                break;
 283        case CPIA2_CMD_SET_USER_MODE:   /* Then fall through */
 284                cmd.buffer.block_data[0] = param;
 285        case CPIA2_CMD_GET_USER_MODE:
 286                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 287                cmd.reg_count = 1;
 288                if (device == DEVICE_STV_672)
 289                        cmd.start = CPIA2_VP4_USER_MODE;
 290                else
 291                        cmd.start = CPIA2_VP5_USER_MODE;
 292                break;
 293        case CPIA2_CMD_FRAMERATE_REQ:
 294                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 295                cmd.reg_count = 1;
 296                if (device == DEVICE_STV_672)
 297                        cmd.start = CPIA2_VP4_FRAMERATE_REQUEST;
 298                else
 299                        cmd.start = CPIA2_VP5_FRAMERATE_REQUEST;
 300                cmd.buffer.block_data[0] = param;
 301                break;
 302        case CPIA2_CMD_SET_WAKEUP:
 303                cmd.buffer.block_data[0] = param;       /* Then fall through */
 304        case CPIA2_CMD_GET_WAKEUP:
 305                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
 306                cmd.reg_count = 1;
 307                cmd.start = CPIA2_VC_WAKEUP;
 308                break;
 309        case CPIA2_CMD_SET_PW_CONTROL:
 310                cmd.buffer.block_data[0] = param;       /* Then fall through */
 311        case CPIA2_CMD_GET_PW_CONTROL:
 312                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
 313                cmd.reg_count = 1;
 314                cmd.start = CPIA2_VC_PW_CTRL;
 315                break;
 316        case CPIA2_CMD_GET_VP_SYSTEM_STATE:
 317                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 318                cmd.reg_count = 1;
 319                cmd.start = CPIA2_VP_SYSTEMSTATE;
 320                break;
 321        case CPIA2_CMD_SET_SYSTEM_CTRL:
 322                cmd.buffer.block_data[0] = param;       /* Then fall through */
 323        case CPIA2_CMD_GET_SYSTEM_CTRL:
 324                cmd.req_mode =
 325                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 326                cmd.reg_count = 1;
 327                cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL;
 328                break;
 329        case CPIA2_CMD_SET_VP_SYSTEM_CTRL:
 330                cmd.buffer.block_data[0] = param;       /* Then fall through */
 331        case CPIA2_CMD_GET_VP_SYSTEM_CTRL:
 332                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 333                cmd.reg_count = 1;
 334                cmd.start = CPIA2_VP_SYSTEMCTRL;
 335                break;
 336        case CPIA2_CMD_SET_VP_EXP_MODES:
 337                cmd.buffer.block_data[0] = param;       /* Then fall through */
 338        case CPIA2_CMD_GET_VP_EXP_MODES:
 339                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 340                cmd.reg_count = 1;
 341                cmd.start = CPIA2_VP_EXPOSURE_MODES;
 342                break;
 343        case CPIA2_CMD_SET_DEVICE_CONFIG:
 344                cmd.buffer.block_data[0] = param;       /* Then fall through */
 345        case CPIA2_CMD_GET_DEVICE_CONFIG:
 346                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 347                cmd.reg_count = 1;
 348                cmd.start = CPIA2_VP_DEVICE_CONFIG;
 349                break;
 350        case CPIA2_CMD_SET_SERIAL_ADDR:
 351                cmd.buffer.block_data[0] = param;
 352                cmd.req_mode =
 353                    CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
 354                cmd.reg_count = 1;
 355                cmd.start = CPIA2_SYSTEM_VP_SERIAL_ADDR;
 356                break;
 357        case CPIA2_CMD_SET_SENSOR_CR1:
 358                cmd.buffer.block_data[0] = param;
 359                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 360                cmd.reg_count = 1;
 361                cmd.start = CPIA2_SENSOR_CR1;
 362                break;
 363        case CPIA2_CMD_SET_VC_CONTROL:
 364                cmd.buffer.block_data[0] = param;       /* Then fall through */
 365        case CPIA2_CMD_GET_VC_CONTROL:
 366                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
 367                cmd.reg_count = 1;
 368                cmd.start = CPIA2_VC_VC_CTRL;
 369                break;
 370        case CPIA2_CMD_SET_TARGET_KB:
 371                cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
 372                cmd.reg_count = 1;
 373                cmd.buffer.registers[0].index = CPIA2_VC_VC_TARGET_KB;
 374                cmd.buffer.registers[0].value = param;
 375                break;
 376        case CPIA2_CMD_SET_DEF_JPEG_OPT:
 377                cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
 378                cmd.reg_count = 4;
 379                cmd.buffer.registers[0].index = CPIA2_VC_VC_JPEG_OPT;
 380                cmd.buffer.registers[0].value =
 381                    CPIA2_VC_VC_JPEG_OPT_DOUBLE_SQUEEZE;
 382                cmd.buffer.registers[1].index = CPIA2_VC_VC_USER_SQUEEZE;
 383                cmd.buffer.registers[1].value = 20;
 384                cmd.buffer.registers[2].index = CPIA2_VC_VC_CREEP_PERIOD;
 385                cmd.buffer.registers[2].value = 2;
 386                cmd.buffer.registers[3].index = CPIA2_VC_VC_JPEG_OPT;
 387                cmd.buffer.registers[3].value = CPIA2_VC_VC_JPEG_OPT_DEFAULT;
 388                break;
 389        case CPIA2_CMD_REHASH_VP4:
 390                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 391                cmd.reg_count = 1;
 392                cmd.start = CPIA2_VP_REHASH_VALUES;
 393                cmd.buffer.block_data[0] = param;
 394                break;
 395        case CPIA2_CMD_SET_USER_EFFECTS:  /* Note: Be careful with this as
 396                                             this register can also affect
 397                                             flicker modes */
 398                cmd.buffer.block_data[0] = param;      /* Then fall through */
 399        case CPIA2_CMD_GET_USER_EFFECTS:
 400                cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
 401                cmd.reg_count = 1;
 402                if (device == DEVICE_STV_672)
 403                        cmd.start = CPIA2_VP4_USER_EFFECTS;
 404                else
 405                        cmd.start = CPIA2_VP5_USER_EFFECTS;
 406                break;
 407        default:
 408                LOG("DoCommand received invalid command\n");
 409                return -EINVAL;
 410        }
 411
 412        retval = cpia2_send_command(cam, &cmd);
 413        if (retval) {
 414                return retval;
 415        }
 416
 417        /***
 418         * Now copy any results from a read into the appropriate param struct.
 419         ***/
 420        switch (command) {
 421        case CPIA2_CMD_GET_VERSION:
 422                cam->params.version.firmware_revision_hi =
 423                    cmd.buffer.block_data[0];
 424                cam->params.version.firmware_revision_lo =
 425                    cmd.buffer.block_data[1];
 426                break;
 427        case CPIA2_CMD_GET_PNP_ID:
 428                cam->params.pnp_id.vendor = (cmd.buffer.block_data[0] << 8) |
 429                                            cmd.buffer.block_data[1];
 430                cam->params.pnp_id.product = (cmd.buffer.block_data[2] << 8) |
 431                                             cmd.buffer.block_data[3];
 432                cam->params.pnp_id.device_revision =
 433                        (cmd.buffer.block_data[4] << 8) |
 434                        cmd.buffer.block_data[5];
 435                if (cam->params.pnp_id.vendor == 0x553) {
 436                        if (cam->params.pnp_id.product == 0x100) {
 437                                cam->params.pnp_id.device_type = DEVICE_STV_672;
 438                        } else if (cam->params.pnp_id.product == 0x140 ||
 439                                   cam->params.pnp_id.product == 0x151) {
 440                                cam->params.pnp_id.device_type = DEVICE_STV_676;
 441                        }
 442                }
 443                break;
 444        case CPIA2_CMD_GET_ASIC_TYPE:
 445                cam->params.version.asic_id = cmd.buffer.block_data[0];
 446                cam->params.version.asic_rev = cmd.buffer.block_data[1];
 447                break;
 448        case CPIA2_CMD_GET_SENSOR:
 449                cam->params.version.sensor_flags = cmd.buffer.block_data[0];
 450                cam->params.version.sensor_rev = cmd.buffer.block_data[1];
 451                break;
 452        case CPIA2_CMD_GET_VP_DEVICE:
 453                cam->params.version.vp_device_hi = cmd.buffer.block_data[0];
 454                cam->params.version.vp_device_lo = cmd.buffer.block_data[1];
 455                break;
 456        case CPIA2_CMD_GET_VP_BRIGHTNESS:
 457                cam->params.color_params.brightness = cmd.buffer.block_data[0];
 458                break;
 459        case CPIA2_CMD_GET_CONTRAST:
 460                cam->params.color_params.contrast = cmd.buffer.block_data[0];
 461                break;
 462        case CPIA2_CMD_GET_VP_SATURATION:
 463                cam->params.color_params.saturation = cmd.buffer.block_data[0];
 464                break;
 465        case CPIA2_CMD_GET_VP_GPIO_DATA:
 466                cam->params.vp_params.gpio_data = cmd.buffer.block_data[0];
 467                break;
 468        case CPIA2_CMD_GET_VP_GPIO_DIRECTION:
 469                cam->params.vp_params.gpio_direction = cmd.buffer.block_data[0];
 470                break;
 471        case CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION:
 472                cam->params.vc_params.vc_mp_direction =cmd.buffer.block_data[0];
 473                break;
 474        case CPIA2_CMD_GET_VC_MP_GPIO_DATA:
 475                cam->params.vc_params.vc_mp_data = cmd.buffer.block_data[0];
 476                break;
 477        case CPIA2_CMD_GET_FLICKER_MODES:
 478                cam->params.flicker_control.cam_register =
 479                        cmd.buffer.block_data[0];
 480                break;
 481        case CPIA2_CMD_GET_WAKEUP:
 482                cam->params.vc_params.wakeup = cmd.buffer.block_data[0];
 483                break;
 484        case CPIA2_CMD_GET_PW_CONTROL:
 485                cam->params.vc_params.pw_control = cmd.buffer.block_data[0];
 486                break;
 487        case CPIA2_CMD_GET_SYSTEM_CTRL:
 488                cam->params.camera_state.system_ctrl = cmd.buffer.block_data[0];
 489                break;
 490        case CPIA2_CMD_GET_VP_SYSTEM_STATE:
 491                cam->params.vp_params.system_state = cmd.buffer.block_data[0];
 492                break;
 493        case CPIA2_CMD_GET_VP_SYSTEM_CTRL:
 494                cam->params.vp_params.system_ctrl = cmd.buffer.block_data[0];
 495                break;
 496        case CPIA2_CMD_GET_VP_EXP_MODES:
 497                cam->params.vp_params.exposure_modes = cmd.buffer.block_data[0];
 498                break;
 499        case CPIA2_CMD_GET_DEVICE_CONFIG:
 500                cam->params.vp_params.device_config = cmd.buffer.block_data[0];
 501                break;
 502        case CPIA2_CMD_GET_VC_CONTROL:
 503                cam->params.vc_params.vc_control = cmd.buffer.block_data[0];
 504                break;
 505        case CPIA2_CMD_GET_USER_MODE:
 506                cam->params.vp_params.video_mode = cmd.buffer.block_data[0];
 507                break;
 508        case CPIA2_CMD_GET_USER_EFFECTS:
 509                cam->params.vp_params.user_effects = cmd.buffer.block_data[0];
 510                break;
 511        default:
 512                break;
 513        }
 514        return retval;
 515}
 516
 517/******************************************************************************
 518 *
 519 *  cpia2_send_command
 520 *
 521 *****************************************************************************/
 522
 523#define DIR(cmd) ((cmd->direction == TRANSFER_WRITE) ? "Write" : "Read")
 524#define BINDEX(cmd) (cmd->req_mode & 0x03)
 525
 526int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd)
 527{
 528        u8 count;
 529        u8 start;
 530        u8 *buffer;
 531        int retval;
 532
 533        switch (cmd->req_mode & 0x0c) {
 534        case CAMERAACCESS_TYPE_RANDOM:
 535                count = cmd->reg_count * sizeof(struct cpia2_register);
 536                start = 0;
 537                buffer = (u8 *) & cmd->buffer;
 538                if (debugs_on & DEBUG_REG)
 539                        DBG("%s Random: Register block %s\n", DIR(cmd),
 540                            block_name[BINDEX(cmd)]);
 541                break;
 542        case CAMERAACCESS_TYPE_BLOCK:
 543                count = cmd->reg_count;
 544                start = cmd->start;
 545                buffer = cmd->buffer.block_data;
 546                if (debugs_on & DEBUG_REG)
 547                        DBG("%s Block: Register block %s\n", DIR(cmd),
 548                            block_name[BINDEX(cmd)]);
 549                break;
 550        case CAMERAACCESS_TYPE_MASK:
 551                count = cmd->reg_count * sizeof(struct cpia2_reg_mask);
 552                start = 0;
 553                buffer = (u8 *) & cmd->buffer;
 554                if (debugs_on & DEBUG_REG)
 555                        DBG("%s Mask: Register block %s\n", DIR(cmd),
 556                            block_name[BINDEX(cmd)]);
 557                break;
 558        case CAMERAACCESS_TYPE_REPEAT:  /* For patch blocks only */
 559                count = cmd->reg_count;
 560                start = cmd->start;
 561                buffer = cmd->buffer.block_data;
 562                if (debugs_on & DEBUG_REG)
 563                        DBG("%s Repeat: Register block %s\n", DIR(cmd),
 564                            block_name[BINDEX(cmd)]);
 565                break;
 566        default:
 567                LOG("%s: invalid request mode\n",__func__);
 568                return -EINVAL;
 569        }
 570
 571        retval = cpia2_usb_transfer_cmd(cam,
 572                                        buffer,
 573                                        cmd->req_mode,
 574                                        start, count, cmd->direction);
 575#ifdef _CPIA2_DEBUG_
 576        if (debugs_on & DEBUG_REG) {
 577                int i;
 578                for (i = 0; i < cmd->reg_count; i++) {
 579                        if((cmd->req_mode & 0x0c) == CAMERAACCESS_TYPE_BLOCK)
 580                                KINFO("%s Block: [0x%02X] = 0x%02X\n",
 581                                    DIR(cmd), start + i, buffer[i]);
 582                        if((cmd->req_mode & 0x0c) == CAMERAACCESS_TYPE_RANDOM)
 583                                KINFO("%s Random: [0x%02X] = 0x%02X\n",
 584                                    DIR(cmd), cmd->buffer.registers[i].index,
 585                                    cmd->buffer.registers[i].value);
 586                }
 587        }
 588#endif
 589
 590        return retval;
 591};
 592
 593/*************
 594 * Functions to implement camera functionality
 595 *************/
 596/******************************************************************************
 597 *
 598 *  cpia2_get_version_info
 599 *
 600 *****************************************************************************/
 601static void cpia2_get_version_info(struct camera_data *cam)
 602{
 603        cpia2_do_command(cam, CPIA2_CMD_GET_VERSION, TRANSFER_READ, 0);
 604        cpia2_do_command(cam, CPIA2_CMD_GET_PNP_ID, TRANSFER_READ, 0);
 605        cpia2_do_command(cam, CPIA2_CMD_GET_ASIC_TYPE, TRANSFER_READ, 0);
 606        cpia2_do_command(cam, CPIA2_CMD_GET_SENSOR, TRANSFER_READ, 0);
 607        cpia2_do_command(cam, CPIA2_CMD_GET_VP_DEVICE, TRANSFER_READ, 0);
 608}
 609
 610/******************************************************************************
 611 *
 612 *  cpia2_reset_camera
 613 *
 614 *  Called at least during the open process, sets up initial params.
 615 *****************************************************************************/
 616int cpia2_reset_camera(struct camera_data *cam)
 617{
 618        u8 tmp_reg;
 619        int retval = 0;
 620        int i;
 621        struct cpia2_command cmd;
 622
 623        /***
 624         * VC setup
 625         ***/
 626        retval = configure_sensor(cam,
 627                                  cam->params.roi.width,
 628                                  cam->params.roi.height);
 629        if (retval < 0) {
 630                ERR("Couldn't configure sensor, error=%d\n", retval);
 631                return retval;
 632        }
 633
 634        /* Clear FIFO and route/enable stream block */
 635        cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
 636        cmd.direction = TRANSFER_WRITE;
 637        cmd.reg_count = 2;
 638        cmd.buffer.registers[0].index = CPIA2_VC_ST_CTRL;
 639        cmd.buffer.registers[0].value = CPIA2_VC_ST_CTRL_SRC_VC |
 640                CPIA2_VC_ST_CTRL_DST_USB | CPIA2_VC_ST_CTRL_EOF_DETECT;
 641        cmd.buffer.registers[1].index = CPIA2_VC_ST_CTRL;
 642        cmd.buffer.registers[1].value = CPIA2_VC_ST_CTRL_SRC_VC |
 643                CPIA2_VC_ST_CTRL_DST_USB |
 644                CPIA2_VC_ST_CTRL_EOF_DETECT | CPIA2_VC_ST_CTRL_FIFO_ENABLE;
 645
 646        cpia2_send_command(cam, &cmd);
 647
 648        cpia2_set_high_power(cam);
 649
 650        if (cam->params.pnp_id.device_type == DEVICE_STV_672) {
 651                /* Enable button notification */
 652                cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_SYSTEM;
 653                cmd.buffer.registers[0].index = CPIA2_SYSTEM_INT_PACKET_CTRL;
 654                cmd.buffer.registers[0].value =
 655                        CPIA2_SYSTEM_INT_PACKET_CTRL_ENABLE_SW_XX;
 656                cmd.reg_count = 1;
 657                cpia2_send_command(cam, &cmd);
 658        }
 659
 660        schedule_timeout_interruptible(msecs_to_jiffies(100));
 661
 662        if (cam->params.pnp_id.device_type == DEVICE_STV_672)
 663                retval = apply_vp_patch(cam);
 664
 665        /* wait for vp to go to sleep */
 666        schedule_timeout_interruptible(msecs_to_jiffies(100));
 667
 668        /***
 669         * If this is a 676, apply VP5 fixes before we start streaming
 670         ***/
 671        if (cam->params.pnp_id.device_type == DEVICE_STV_676) {
 672                cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP;
 673
 674                /* The following writes improve the picture */
 675                cmd.buffer.registers[0].index = CPIA2_VP5_MYBLACK_LEVEL;
 676                cmd.buffer.registers[0].value = 0; /* reduce from the default
 677                                                    * rec 601 pedestal of 16 */
 678                cmd.buffer.registers[1].index = CPIA2_VP5_MCYRANGE;
 679                cmd.buffer.registers[1].value = 0x92; /* increase from 100% to
 680                                                       * (256/256 - 31) to fill
 681                                                       * available range */
 682                cmd.buffer.registers[2].index = CPIA2_VP5_MYCEILING;
 683                cmd.buffer.registers[2].value = 0xFF; /* Increase from the
 684                                                       * default rec 601 ceiling
 685                                                       * of 240 */
 686                cmd.buffer.registers[3].index = CPIA2_VP5_MCUVSATURATION;
 687                cmd.buffer.registers[3].value = 0xFF; /* Increase from the rec
 688                                                       * 601 100% level (128)
 689                                                       * to 145-192 */
 690                cmd.buffer.registers[4].index = CPIA2_VP5_ANTIFLKRSETUP;
 691                cmd.buffer.registers[4].value = 0x80;  /* Inhibit the
 692                                                        * anti-flicker */
 693
 694                /* The following 4 writes are a fix to allow QVGA to work at 30 fps */
 695                cmd.buffer.registers[5].index = CPIA2_VP_RAM_ADDR_H;
 696                cmd.buffer.registers[5].value = 0x01;
 697                cmd.buffer.registers[6].index = CPIA2_VP_RAM_ADDR_L;
 698                cmd.buffer.registers[6].value = 0xE3;
 699                cmd.buffer.registers[7].index = CPIA2_VP_RAM_DATA;
 700                cmd.buffer.registers[7].value = 0x02;
 701                cmd.buffer.registers[8].index = CPIA2_VP_RAM_DATA;
 702                cmd.buffer.registers[8].value = 0xFC;
 703
 704                cmd.direction = TRANSFER_WRITE;
 705                cmd.reg_count = 9;
 706
 707                cpia2_send_command(cam, &cmd);
 708        }
 709
 710        /* Activate all settings and start the data stream */
 711        /* Set user mode */
 712        set_default_user_mode(cam);
 713
 714        /* Give VP time to wake up */
 715        schedule_timeout_interruptible(msecs_to_jiffies(100));
 716
 717        set_all_properties(cam);
 718
 719        cpia2_do_command(cam, CPIA2_CMD_GET_USER_MODE, TRANSFER_READ, 0);
 720        DBG("After SetAllProperties(cam), user mode is 0x%0X\n",
 721            cam->params.vp_params.video_mode);
 722
 723        /***
 724         * Set audio regulator off.  This and the code to set the compresison
 725         * state are too complex to form a CPIA2_CMD_, and seem to be somewhat
 726         * intertwined.  This stuff came straight from the windows driver.
 727         ***/
 728        /* Turn AutoExposure off in VP and enable the serial bridge to the sensor */
 729        cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_CTRL, TRANSFER_READ, 0);
 730        tmp_reg = cam->params.vp_params.system_ctrl;
 731        cmd.buffer.registers[0].value = tmp_reg &
 732                (tmp_reg & (CPIA2_VP_SYSTEMCTRL_HK_CONTROL ^ 0xFF));
 733
 734        cpia2_do_command(cam, CPIA2_CMD_GET_DEVICE_CONFIG, TRANSFER_READ, 0);
 735        cmd.buffer.registers[1].value = cam->params.vp_params.device_config |
 736                                        CPIA2_VP_DEVICE_CONFIG_SERIAL_BRIDGE;
 737        cmd.buffer.registers[0].index = CPIA2_VP_SYSTEMCTRL;
 738        cmd.buffer.registers[1].index = CPIA2_VP_DEVICE_CONFIG;
 739        cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP;
 740        cmd.reg_count = 2;
 741        cmd.direction = TRANSFER_WRITE;
 742        cmd.start = 0;
 743        cpia2_send_command(cam, &cmd);
 744
 745        /* Set the correct I2C address in the CPiA-2 system register */
 746        cpia2_do_command(cam,
 747                         CPIA2_CMD_SET_SERIAL_ADDR,
 748                         TRANSFER_WRITE,
 749                         CPIA2_SYSTEM_VP_SERIAL_ADDR_SENSOR);
 750
 751        /* Now have sensor access - set bit to turn the audio regulator off */
 752        cpia2_do_command(cam,
 753                         CPIA2_CMD_SET_SENSOR_CR1,
 754                         TRANSFER_WRITE, CPIA2_SENSOR_CR1_DOWN_AUDIO_REGULATOR);
 755
 756        /* Set the correct I2C address in the CPiA-2 system register */
 757        if (cam->params.pnp_id.device_type == DEVICE_STV_672)
 758                cpia2_do_command(cam,
 759                                 CPIA2_CMD_SET_SERIAL_ADDR,
 760                                 TRANSFER_WRITE,
 761                                 CPIA2_SYSTEM_VP_SERIAL_ADDR_VP); // 0x88
 762        else
 763                cpia2_do_command(cam,
 764                                 CPIA2_CMD_SET_SERIAL_ADDR,
 765                                 TRANSFER_WRITE,
 766                                 CPIA2_SYSTEM_VP_SERIAL_ADDR_676_VP); // 0x8a
 767
 768        /* increase signal drive strength */
 769        if (cam->params.pnp_id.device_type == DEVICE_STV_676)
 770                cpia2_do_command(cam,
 771                                 CPIA2_CMD_SET_VP_EXP_MODES,
 772                                 TRANSFER_WRITE,
 773                                 CPIA2_VP_EXPOSURE_MODES_COMPILE_EXP);
 774
 775        /* Start autoexposure */
 776        cpia2_do_command(cam, CPIA2_CMD_GET_DEVICE_CONFIG, TRANSFER_READ, 0);
 777        cmd.buffer.registers[0].value = cam->params.vp_params.device_config &
 778                                  (CPIA2_VP_DEVICE_CONFIG_SERIAL_BRIDGE ^ 0xFF);
 779
 780        cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_CTRL, TRANSFER_READ, 0);
 781        cmd.buffer.registers[1].value =
 782            cam->params.vp_params.system_ctrl | CPIA2_VP_SYSTEMCTRL_HK_CONTROL;
 783
 784        cmd.buffer.registers[0].index = CPIA2_VP_DEVICE_CONFIG;
 785        cmd.buffer.registers[1].index = CPIA2_VP_SYSTEMCTRL;
 786        cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP;
 787        cmd.reg_count = 2;
 788        cmd.direction = TRANSFER_WRITE;
 789
 790        cpia2_send_command(cam, &cmd);
 791
 792        /* Set compression state */
 793        cpia2_do_command(cam, CPIA2_CMD_GET_VC_CONTROL, TRANSFER_READ, 0);
 794        if (cam->params.compression.inhibit_htables) {
 795                tmp_reg = cam->params.vc_params.vc_control |
 796                          CPIA2_VC_VC_CTRL_INHIBIT_H_TABLES;
 797        } else  {
 798                tmp_reg = cam->params.vc_params.vc_control &
 799                          ~CPIA2_VC_VC_CTRL_INHIBIT_H_TABLES;
 800        }
 801        cpia2_do_command(cam, CPIA2_CMD_SET_VC_CONTROL, TRANSFER_WRITE,tmp_reg);
 802
 803        /* Set target size (kb) on vc */
 804        cpia2_do_command(cam, CPIA2_CMD_SET_TARGET_KB,
 805                         TRANSFER_WRITE, cam->params.vc_params.target_kb);
 806
 807        /* Wiggle VC Reset */
 808        /***
 809         * First read and wait a bit.
 810         ***/
 811        for (i = 0; i < 50; i++) {
 812                cpia2_do_command(cam, CPIA2_CMD_GET_PW_CONTROL,
 813                                 TRANSFER_READ, 0);
 814        }
 815
 816        tmp_reg = cam->params.vc_params.pw_control;
 817        tmp_reg &= ~CPIA2_VC_PW_CTRL_VC_RESET_N;
 818
 819        cpia2_do_command(cam, CPIA2_CMD_SET_PW_CONTROL, TRANSFER_WRITE,tmp_reg);
 820
 821        tmp_reg |= CPIA2_VC_PW_CTRL_VC_RESET_N;
 822        cpia2_do_command(cam, CPIA2_CMD_SET_PW_CONTROL, TRANSFER_WRITE,tmp_reg);
 823
 824        cpia2_do_command(cam, CPIA2_CMD_SET_DEF_JPEG_OPT, TRANSFER_WRITE, 0);
 825
 826        cpia2_do_command(cam, CPIA2_CMD_GET_USER_MODE, TRANSFER_READ, 0);
 827        DBG("After VC RESET, user mode is 0x%0X\n",
 828            cam->params.vp_params.video_mode);
 829
 830        return retval;
 831}
 832
 833/******************************************************************************
 834 *
 835 *  cpia2_set_high_power
 836 *
 837 *****************************************************************************/
 838static int cpia2_set_high_power(struct camera_data *cam)
 839{
 840        int i;
 841        for (i = 0; i <= 50; i++) {
 842                /* Read system status */
 843                cpia2_do_command(cam,CPIA2_CMD_GET_SYSTEM_CTRL,TRANSFER_READ,0);
 844
 845                /* If there is an error, clear it */
 846                if(cam->params.camera_state.system_ctrl &
 847                   CPIA2_SYSTEM_CONTROL_V2W_ERR)
 848                        cpia2_do_command(cam, CPIA2_CMD_CLEAR_V2W_ERR,
 849                                         TRANSFER_WRITE, 0);
 850
 851                /* Try to set high power mode */
 852                cpia2_do_command(cam, CPIA2_CMD_SET_SYSTEM_CTRL,
 853                                 TRANSFER_WRITE, 1);
 854
 855                /* Try to read something in VP to check if everything is awake */
 856                cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_STATE,
 857                                 TRANSFER_READ, 0);
 858                if (cam->params.vp_params.system_state &
 859                    CPIA2_VP_SYSTEMSTATE_HK_ALIVE) {
 860                        break;
 861                } else if (i == 50) {
 862                        cam->params.camera_state.power_mode = LO_POWER_MODE;
 863                        ERR("Camera did not wake up\n");
 864                        return -EIO;
 865                }
 866        }
 867
 868        DBG("System now in high power state\n");
 869        cam->params.camera_state.power_mode = HI_POWER_MODE;
 870        return 0;
 871}
 872
 873/******************************************************************************
 874 *
 875 *  cpia2_set_low_power
 876 *
 877 *****************************************************************************/
 878int cpia2_set_low_power(struct camera_data *cam)
 879{
 880        cam->params.camera_state.power_mode = LO_POWER_MODE;
 881        cpia2_do_command(cam, CPIA2_CMD_SET_SYSTEM_CTRL, TRANSFER_WRITE, 0);
 882        return 0;
 883}
 884
 885/******************************************************************************
 886 *
 887 *  apply_vp_patch
 888 *
 889 *****************************************************************************/
 890static int cpia2_send_onebyte_command(struct camera_data *cam,
 891                                      struct cpia2_command *cmd,
 892                                      u8 start, u8 datum)
 893{
 894        cmd->buffer.block_data[0] = datum;
 895        cmd->start = start;
 896        cmd->reg_count = 1;
 897        return cpia2_send_command(cam, cmd);
 898}
 899
 900static int apply_vp_patch(struct camera_data *cam)
 901{
 902        const struct firmware *fw;
 903        const char fw_name[] = "cpia2/stv0672_vp4.bin";
 904        int i, ret;
 905        struct cpia2_command cmd;
 906
 907        ret = request_firmware(&fw, fw_name, &cam->dev->dev);
 908        if (ret) {
 909                printk(KERN_ERR "cpia2: failed to load VP patch \"%s\"\n",
 910                       fw_name);
 911                return ret;
 912        }
 913
 914        cmd.req_mode = CAMERAACCESS_TYPE_REPEAT | CAMERAACCESS_VP;
 915        cmd.direction = TRANSFER_WRITE;
 916
 917        /* First send the start address... */
 918        cpia2_send_onebyte_command(cam, &cmd, 0x0A, fw->data[0]); /* hi */
 919        cpia2_send_onebyte_command(cam, &cmd, 0x0B, fw->data[1]); /* lo */
 920
 921        /* ... followed by the data payload */
 922        for (i = 2; i < fw->size; i += 64) {
 923                cmd.start = 0x0C; /* Data */
 924                cmd.reg_count = min_t(int, 64, fw->size - i);
 925                memcpy(cmd.buffer.block_data, &fw->data[i], cmd.reg_count);
 926                cpia2_send_command(cam, &cmd);
 927        }
 928
 929        /* Next send the start address... */
 930        cpia2_send_onebyte_command(cam, &cmd, 0x0A, fw->data[0]); /* hi */
 931        cpia2_send_onebyte_command(cam, &cmd, 0x0B, fw->data[1]); /* lo */
 932
 933        /* ... followed by the 'goto' command */
 934        cpia2_send_onebyte_command(cam, &cmd, 0x0D, 1);
 935
 936        release_firmware(fw);
 937        return 0;
 938}
 939
 940/******************************************************************************
 941 *
 942 *  set_default_user_mode
 943 *
 944 *****************************************************************************/
 945static int set_default_user_mode(struct camera_data *cam)
 946{
 947        unsigned char user_mode;
 948        unsigned char frame_rate;
 949        int width = cam->params.roi.width;
 950        int height = cam->params.roi.height;
 951
 952        switch (cam->params.version.sensor_flags) {
 953        case CPIA2_VP_SENSOR_FLAGS_404:
 954        case CPIA2_VP_SENSOR_FLAGS_407:
 955        case CPIA2_VP_SENSOR_FLAGS_409:
 956        case CPIA2_VP_SENSOR_FLAGS_410:
 957                if ((width > STV_IMAGE_QCIF_COLS)
 958                    || (height > STV_IMAGE_QCIF_ROWS)) {
 959                        user_mode = CPIA2_VP_USER_MODE_CIF;
 960                } else {
 961                        user_mode = CPIA2_VP_USER_MODE_QCIFDS;
 962                }
 963                frame_rate = CPIA2_VP_FRAMERATE_30;
 964                break;
 965        case CPIA2_VP_SENSOR_FLAGS_500:
 966                if ((width > STV_IMAGE_CIF_COLS)
 967                    || (height > STV_IMAGE_CIF_ROWS)) {
 968                        user_mode = CPIA2_VP_USER_MODE_VGA;
 969                } else {
 970                        user_mode = CPIA2_VP_USER_MODE_QVGADS;
 971                }
 972                if (cam->params.pnp_id.device_type == DEVICE_STV_672)
 973                        frame_rate = CPIA2_VP_FRAMERATE_15;
 974                else
 975                        frame_rate = CPIA2_VP_FRAMERATE_30;
 976                break;
 977        default:
 978                LOG("%s: Invalid sensor flag value 0x%0X\n",__func__,
 979                    cam->params.version.sensor_flags);
 980                return -EINVAL;
 981        }
 982
 983        DBG("Sensor flag = 0x%0x, user mode = 0x%0x, frame rate = 0x%X\n",
 984            cam->params.version.sensor_flags, user_mode, frame_rate);
 985        cpia2_do_command(cam, CPIA2_CMD_SET_USER_MODE, TRANSFER_WRITE,
 986                         user_mode);
 987        if(cam->params.vp_params.frame_rate > 0 &&
 988           frame_rate > cam->params.vp_params.frame_rate)
 989                frame_rate = cam->params.vp_params.frame_rate;
 990
 991        cpia2_set_fps(cam, frame_rate);
 992
 993//      if (cam->params.pnp_id.device_type == DEVICE_STV_676)
 994//              cpia2_do_command(cam,
 995//                               CPIA2_CMD_SET_VP_SYSTEM_CTRL,
 996//                               TRANSFER_WRITE,
 997//                               CPIA2_VP_SYSTEMCTRL_HK_CONTROL |
 998//                               CPIA2_VP_SYSTEMCTRL_POWER_CONTROL);
 999
1000        return 0;
1001}
1002
1003/******************************************************************************
1004 *
1005 *  cpia2_match_video_size
1006 *
1007 *  return the best match, where 'best' is as always
1008 *  the largest that is not bigger than what is requested.
1009 *****************************************************************************/
1010int cpia2_match_video_size(int width, int height)
1011{
1012        if (width >= STV_IMAGE_VGA_COLS && height >= STV_IMAGE_VGA_ROWS)
1013                return VIDEOSIZE_VGA;
1014
1015        if (width >= STV_IMAGE_CIF_COLS && height >= STV_IMAGE_CIF_ROWS)
1016                return VIDEOSIZE_CIF;
1017
1018        if (width >= STV_IMAGE_QVGA_COLS && height >= STV_IMAGE_QVGA_ROWS)
1019                return VIDEOSIZE_QVGA;
1020
1021        if (width >= 288 && height >= 216)
1022                return VIDEOSIZE_288_216;
1023
1024        if (width >= 256 && height >= 192)
1025                return VIDEOSIZE_256_192;
1026
1027        if (width >= 224 && height >= 168)
1028                return VIDEOSIZE_224_168;
1029
1030        if (width >= 192 && height >= 144)
1031                return VIDEOSIZE_192_144;
1032
1033        if (width >= STV_IMAGE_QCIF_COLS && height >= STV_IMAGE_QCIF_ROWS)
1034                return VIDEOSIZE_QCIF;
1035
1036        return -1;
1037}
1038
1039/******************************************************************************
1040 *
1041 *  SetVideoSize
1042 *
1043 *****************************************************************************/
1044static int set_vw_size(struct camera_data *cam, int size)
1045{
1046        int retval = 0;
1047
1048        cam->params.vp_params.video_size = size;
1049
1050        switch (size) {
1051        case VIDEOSIZE_VGA:
1052                DBG("Setting size to VGA\n");
1053                cam->params.roi.width = STV_IMAGE_VGA_COLS;
1054                cam->params.roi.height = STV_IMAGE_VGA_ROWS;
1055                cam->width = STV_IMAGE_VGA_COLS;
1056                cam->height = STV_IMAGE_VGA_ROWS;
1057                break;
1058        case VIDEOSIZE_CIF:
1059                DBG("Setting size to CIF\n");
1060                cam->params.roi.width = STV_IMAGE_CIF_COLS;
1061                cam->params.roi.height = STV_IMAGE_CIF_ROWS;
1062                cam->width = STV_IMAGE_CIF_COLS;
1063                cam->height = STV_IMAGE_CIF_ROWS;
1064                break;
1065        case VIDEOSIZE_QVGA:
1066                DBG("Setting size to QVGA\n");
1067                cam->params.roi.width = STV_IMAGE_QVGA_COLS;
1068                cam->params.roi.height = STV_IMAGE_QVGA_ROWS;
1069                cam->width = STV_IMAGE_QVGA_COLS;
1070                cam->height = STV_IMAGE_QVGA_ROWS;
1071                break;
1072        case VIDEOSIZE_288_216:
1073                cam->params.roi.width = 288;
1074                cam->params.roi.height = 216;
1075                cam->width = 288;
1076                cam->height = 216;
1077                break;
1078        case VIDEOSIZE_256_192:
1079                cam->width = 256;
1080                cam->height = 192;
1081                cam->params.roi.width = 256;
1082                cam->params.roi.height = 192;
1083                break;
1084        case VIDEOSIZE_224_168:
1085                cam->width = 224;
1086                cam->height = 168;
1087                cam->params.roi.width = 224;
1088                cam->params.roi.height = 168;
1089                break;
1090        case VIDEOSIZE_192_144:
1091                cam->width = 192;
1092                cam->height = 144;
1093                cam->params.roi.width = 192;
1094                cam->params.roi.height = 144;
1095                break;
1096        case VIDEOSIZE_QCIF:
1097                DBG("Setting size to QCIF\n");
1098                cam->params.roi.width = STV_IMAGE_QCIF_COLS;
1099                cam->params.roi.height = STV_IMAGE_QCIF_ROWS;
1100                cam->width = STV_IMAGE_QCIF_COLS;
1101                cam->height = STV_IMAGE_QCIF_ROWS;
1102                break;
1103        default:
1104                retval = -EINVAL;
1105        }
1106        return retval;
1107}
1108
1109/******************************************************************************
1110 *
1111 *  configure_sensor
1112 *
1113 *****************************************************************************/
1114static int configure_sensor(struct camera_data *cam,
1115                            int req_width, int req_height)
1116{
1117        int retval;
1118
1119        switch (cam->params.version.sensor_flags) {
1120        case CPIA2_VP_SENSOR_FLAGS_404:
1121        case CPIA2_VP_SENSOR_FLAGS_407:
1122        case CPIA2_VP_SENSOR_FLAGS_409:
1123        case CPIA2_VP_SENSOR_FLAGS_410:
1124                retval = config_sensor_410(cam, req_width, req_height);
1125                break;
1126        case CPIA2_VP_SENSOR_FLAGS_500:
1127                retval = config_sensor_500(cam, req_width, req_height);
1128                break;
1129        default:
1130                return -EINVAL;
1131        }
1132
1133        return retval;
1134}
1135
1136/******************************************************************************
1137 *
1138 *  config_sensor_410
1139 *
1140 *****************************************************************************/
1141static int config_sensor_410(struct camera_data *cam,
1142                            int req_width, int req_height)
1143{
1144        struct cpia2_command cmd;
1145        int i = 0;
1146        int image_size;
1147        int image_type;
1148        int width = req_width;
1149        int height = req_height;
1150
1151        /***
1152         *  Make sure size doesn't exceed CIF.
1153         ***/
1154        if (width > STV_IMAGE_CIF_COLS)
1155                width = STV_IMAGE_CIF_COLS;
1156        if (height > STV_IMAGE_CIF_ROWS)
1157                height = STV_IMAGE_CIF_ROWS;
1158
1159        image_size = cpia2_match_video_size(width, height);
1160
1161        DBG("Config 410: width = %d, height = %d\n", width, height);
1162        DBG("Image size returned is %d\n", image_size);
1163        if (image_size >= 0) {
1164                set_vw_size(cam, image_size);
1165                width = cam->params.roi.width;
1166                height = cam->params.roi.height;
1167
1168                DBG("After set_vw_size(), width = %d, height = %d\n",
1169                    width, height);
1170                if (width <= 176 && height <= 144) {
1171                        DBG("image type = VIDEOSIZE_QCIF\n");
1172                        image_type = VIDEOSIZE_QCIF;
1173                }
1174                else if (width <= 320 && height <= 240) {
1175                        DBG("image type = VIDEOSIZE_QVGA\n");
1176                        image_type = VIDEOSIZE_QVGA;
1177                }
1178                else {
1179                        DBG("image type = VIDEOSIZE_CIF\n");
1180                        image_type = VIDEOSIZE_CIF;
1181                }
1182        } else {
1183                ERR("ConfigSensor410 failed\n");
1184                return -EINVAL;
1185        }
1186
1187        cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
1188        cmd.direction = TRANSFER_WRITE;
1189
1190        /* VC Format */
1191        cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT;
1192        if (image_type == VIDEOSIZE_CIF) {
1193                cmd.buffer.registers[i++].value =
1194                    (u8) (CPIA2_VC_VC_FORMAT_UFIRST |
1195                          CPIA2_VC_VC_FORMAT_SHORTLINE);
1196        } else {
1197                cmd.buffer.registers[i++].value =
1198                    (u8) CPIA2_VC_VC_FORMAT_UFIRST;
1199        }
1200
1201        /* VC Clocks */
1202        cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS;
1203        if (image_type == VIDEOSIZE_QCIF) {
1204                if (cam->params.pnp_id.device_type == DEVICE_STV_672) {
1205                        cmd.buffer.registers[i++].value=
1206                                (u8)(CPIA2_VC_VC_672_CLOCKS_CIF_DIV_BY_3 |
1207                                     CPIA2_VC_VC_672_CLOCKS_SCALING |
1208                                     CPIA2_VC_VC_CLOCKS_LOGDIV2);
1209                        DBG("VC_Clocks (0xc4) should be B\n");
1210                }
1211                else {
1212                        cmd.buffer.registers[i++].value=
1213                                (u8)(CPIA2_VC_VC_676_CLOCKS_CIF_DIV_BY_3 |
1214                                     CPIA2_VC_VC_CLOCKS_LOGDIV2);
1215                }
1216        } else {
1217                if (cam->params.pnp_id.device_type == DEVICE_STV_672) {
1218                        cmd.buffer.registers[i++].value =
1219                           (u8) (CPIA2_VC_VC_672_CLOCKS_CIF_DIV_BY_3 |
1220                                 CPIA2_VC_VC_CLOCKS_LOGDIV0);
1221                }
1222                else {
1223                        cmd.buffer.registers[i++].value =
1224                           (u8) (CPIA2_VC_VC_676_CLOCKS_CIF_DIV_BY_3 |
1225                                 CPIA2_VC_VC_676_CLOCKS_SCALING |
1226                                 CPIA2_VC_VC_CLOCKS_LOGDIV0);
1227                }
1228        }
1229        DBG("VC_Clocks (0xc4) = 0x%0X\n", cmd.buffer.registers[i-1].value);
1230
1231        /* Input reqWidth from VC */
1232        cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO;
1233        if (image_type == VIDEOSIZE_QCIF)
1234                cmd.buffer.registers[i++].value =
1235                    (u8) (STV_IMAGE_QCIF_COLS / 4);
1236        else
1237                cmd.buffer.registers[i++].value =
1238                    (u8) (STV_IMAGE_CIF_COLS / 4);
1239
1240        /* Timings */
1241        cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI;
1242        if (image_type == VIDEOSIZE_QCIF)
1243                cmd.buffer.registers[i++].value = (u8) 0;
1244        else
1245                cmd.buffer.registers[i++].value = (u8) 1;
1246
1247        cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO;
1248        if (image_type == VIDEOSIZE_QCIF)
1249                cmd.buffer.registers[i++].value = (u8) 208;
1250        else
1251                cmd.buffer.registers[i++].value = (u8) 160;
1252
1253        cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI;
1254        if (image_type == VIDEOSIZE_QCIF)
1255                cmd.buffer.registers[i++].value = (u8) 0;
1256        else
1257                cmd.buffer.registers[i++].value = (u8) 1;
1258
1259        cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO;
1260        if (image_type == VIDEOSIZE_QCIF)
1261                cmd.buffer.registers[i++].value = (u8) 160;
1262        else
1263                cmd.buffer.registers[i++].value = (u8) 64;
1264
1265        /* Output Image Size */
1266        cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE;
1267        cmd.buffer.registers[i++].value = cam->params.roi.width / 4;
1268
1269        cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE;
1270        cmd.buffer.registers[i++].value = cam->params.roi.height / 4;
1271
1272        /* Cropping */
1273        cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP;
1274        if (image_type == VIDEOSIZE_QCIF)
1275                cmd.buffer.registers[i++].value =
1276                    (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2);
1277        else
1278                cmd.buffer.registers[i++].value =
1279                    (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2);
1280
1281        cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP;
1282        if (image_type == VIDEOSIZE_QCIF)
1283                cmd.buffer.registers[i++].value =
1284                    (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2);
1285        else
1286                cmd.buffer.registers[i++].value =
1287                    (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2);
1288
1289        /* Scaling registers (defaults) */
1290        cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE;
1291        cmd.buffer.registers[i++].value = (u8) 0;
1292
1293        cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE;
1294        cmd.buffer.registers[i++].value = (u8) 0;
1295
1296        cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN;
1297        cmd.buffer.registers[i++].value = (u8) 31;
1298
1299        cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN;
1300        cmd.buffer.registers[i++].value = (u8) 31;
1301
1302        cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP;
1303        cmd.buffer.registers[i++].value = (u8) 0;
1304
1305        cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP;
1306        cmd.buffer.registers[i++].value = (u8) 0;
1307
1308        cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT;
1309        cmd.buffer.registers[i++].value = (u8) 0x81;    /* = 8/1 = 8 (HIBYTE/LOBYTE) */
1310
1311        cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT;
1312        cmd.buffer.registers[i++].value = (u8) 0x81;    /* = 8/1 = 8 (HIBYTE/LOBYTE) */
1313
1314        cmd.reg_count = i;
1315
1316        cpia2_send_command(cam, &cmd);
1317
1318        return i;
1319}
1320
1321
1322/******************************************************************************
1323 *
1324 *  config_sensor_500(cam)
1325 *
1326 *****************************************************************************/
1327static int config_sensor_500(struct camera_data *cam,
1328                             int req_width, int req_height)
1329{
1330        struct cpia2_command cmd;
1331        int i = 0;
1332        int image_size = VIDEOSIZE_CIF;
1333        int image_type = VIDEOSIZE_VGA;
1334        int width = req_width;
1335        int height = req_height;
1336        unsigned int device = cam->params.pnp_id.device_type;
1337
1338        image_size = cpia2_match_video_size(width, height);
1339
1340        if (width > STV_IMAGE_CIF_COLS || height > STV_IMAGE_CIF_ROWS)
1341                image_type = VIDEOSIZE_VGA;
1342        else if (width > STV_IMAGE_QVGA_COLS || height > STV_IMAGE_QVGA_ROWS)
1343                image_type = VIDEOSIZE_CIF;
1344        else if (width > STV_IMAGE_QCIF_COLS || height > STV_IMAGE_QCIF_ROWS)
1345                image_type = VIDEOSIZE_QVGA;
1346        else
1347                image_type = VIDEOSIZE_QCIF;
1348
1349        if (image_size >= 0) {
1350                set_vw_size(cam, image_size);
1351                width = cam->params.roi.width;
1352                height = cam->params.roi.height;
1353        } else {
1354                ERR("ConfigSensor500 failed\n");
1355                return -EINVAL;
1356        }
1357
1358        DBG("image_size = %d, width = %d, height = %d, type = %d\n",
1359            image_size, width, height, image_type);
1360
1361        cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
1362        cmd.direction = TRANSFER_WRITE;
1363        i = 0;
1364
1365        /* VC Format */
1366        cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT;
1367        cmd.buffer.registers[i].value = (u8) CPIA2_VC_VC_FORMAT_UFIRST;
1368        if (image_type == VIDEOSIZE_QCIF)
1369                cmd.buffer.registers[i].value |= (u8) CPIA2_VC_VC_FORMAT_DECIMATING;
1370        i++;
1371
1372        /* VC Clocks */
1373        cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS;
1374        if (device == DEVICE_STV_672) {
1375                if (image_type == VIDEOSIZE_VGA)
1376                        cmd.buffer.registers[i].value =
1377                                (u8)CPIA2_VC_VC_CLOCKS_LOGDIV1;
1378                else
1379                        cmd.buffer.registers[i].value =
1380                                (u8)(CPIA2_VC_VC_672_CLOCKS_SCALING |
1381                                     CPIA2_VC_VC_CLOCKS_LOGDIV3);
1382        } else {
1383                if (image_type == VIDEOSIZE_VGA)
1384                        cmd.buffer.registers[i].value =
1385                                (u8)CPIA2_VC_VC_CLOCKS_LOGDIV0;
1386                else
1387                        cmd.buffer.registers[i].value =
1388                                (u8)(CPIA2_VC_VC_676_CLOCKS_SCALING |
1389                                     CPIA2_VC_VC_CLOCKS_LOGDIV2);
1390        }
1391        i++;
1392
1393        DBG("VC_CLOCKS = 0x%X\n", cmd.buffer.registers[i-1].value);
1394
1395        /* Input width from VP */
1396        cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO;
1397        if (image_type == VIDEOSIZE_VGA)
1398                cmd.buffer.registers[i].value =
1399                    (u8) (STV_IMAGE_VGA_COLS / 4);
1400        else
1401                cmd.buffer.registers[i].value =
1402                    (u8) (STV_IMAGE_QVGA_COLS / 4);
1403        i++;
1404        DBG("Input width = %d\n", cmd.buffer.registers[i-1].value);
1405
1406        /* Timings */
1407        cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI;
1408        if (image_type == VIDEOSIZE_VGA)
1409                cmd.buffer.registers[i++].value = (u8) 2;
1410        else
1411                cmd.buffer.registers[i++].value = (u8) 1;
1412
1413        cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO;
1414        if (image_type == VIDEOSIZE_VGA)
1415                cmd.buffer.registers[i++].value = (u8) 250;
1416        else if (image_type == VIDEOSIZE_QVGA)
1417                cmd.buffer.registers[i++].value = (u8) 125;
1418        else
1419                cmd.buffer.registers[i++].value = (u8) 160;
1420
1421        cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI;
1422        if (image_type == VIDEOSIZE_VGA)
1423                cmd.buffer.registers[i++].value = (u8) 2;
1424        else
1425                cmd.buffer.registers[i++].value = (u8) 1;
1426
1427        cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO;
1428        if (image_type == VIDEOSIZE_VGA)
1429                cmd.buffer.registers[i++].value = (u8) 12;
1430        else if (image_type == VIDEOSIZE_QVGA)
1431                cmd.buffer.registers[i++].value = (u8) 64;
1432        else
1433                cmd.buffer.registers[i++].value = (u8) 6;
1434
1435        /* Output Image Size */
1436        cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE;
1437        if (image_type == VIDEOSIZE_QCIF)
1438                cmd.buffer.registers[i++].value = STV_IMAGE_CIF_COLS  / 4;
1439        else
1440                cmd.buffer.registers[i++].value = width / 4;
1441
1442        cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE;
1443        if (image_type == VIDEOSIZE_QCIF)
1444                cmd.buffer.registers[i++].value = STV_IMAGE_CIF_ROWS  / 4;
1445        else
1446                cmd.buffer.registers[i++].value = height / 4;
1447
1448        /* Cropping */
1449        cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP;
1450        if (image_type == VIDEOSIZE_VGA)
1451                cmd.buffer.registers[i++].value =
1452                    (u8) (((STV_IMAGE_VGA_COLS / 4) - (width / 4)) / 2);
1453        else if (image_type == VIDEOSIZE_QVGA)
1454                cmd.buffer.registers[i++].value =
1455                    (u8) (((STV_IMAGE_QVGA_COLS / 4) - (width / 4)) / 2);
1456        else if (image_type == VIDEOSIZE_CIF)
1457                cmd.buffer.registers[i++].value =
1458                    (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2);
1459        else /*if (image_type == VIDEOSIZE_QCIF)*/
1460                cmd.buffer.registers[i++].value =
1461                        (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2);
1462
1463        cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP;
1464        if (image_type == VIDEOSIZE_VGA)
1465                cmd.buffer.registers[i++].value =
1466                    (u8) (((STV_IMAGE_VGA_ROWS / 4) - (height / 4)) / 2);
1467        else if (image_type == VIDEOSIZE_QVGA)
1468                cmd.buffer.registers[i++].value =
1469                    (u8) (((STV_IMAGE_QVGA_ROWS / 4) - (height / 4)) / 2);
1470        else if (image_type == VIDEOSIZE_CIF)
1471                cmd.buffer.registers[i++].value =
1472                    (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2);
1473        else /*if (image_type == VIDEOSIZE_QCIF)*/
1474                cmd.buffer.registers[i++].value =
1475                    (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2);
1476
1477        /* Scaling registers (defaults) */
1478        cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE;
1479        if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF)
1480                cmd.buffer.registers[i++].value = (u8) 36;
1481        else
1482                cmd.buffer.registers[i++].value = (u8) 0;
1483
1484        cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE;
1485        if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF)
1486                cmd.buffer.registers[i++].value = (u8) 32;
1487        else
1488                cmd.buffer.registers[i++].value = (u8) 0;
1489
1490        cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN;
1491        if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF)
1492                cmd.buffer.registers[i++].value = (u8) 26;
1493        else
1494                cmd.buffer.registers[i++].value = (u8) 31;
1495
1496        cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN;
1497        if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF)
1498                cmd.buffer.registers[i++].value = (u8) 21;
1499        else
1500                cmd.buffer.registers[i++].value = (u8) 31;
1501
1502        cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP;
1503        cmd.buffer.registers[i++].value = (u8) 0;
1504
1505        cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP;
1506        cmd.buffer.registers[i++].value = (u8) 0;
1507
1508        cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT;
1509        if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF)
1510                cmd.buffer.registers[i++].value = (u8) 0x2B;    /* 2/11 */
1511        else
1512                cmd.buffer.registers[i++].value = (u8) 0x81;    /* 8/1 */
1513
1514        cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT;
1515        if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF)
1516                cmd.buffer.registers[i++].value = (u8) 0x13;    /* 1/3 */
1517        else
1518                cmd.buffer.registers[i++].value = (u8) 0x81;    /* 8/1 */
1519
1520        cmd.reg_count = i;
1521
1522        cpia2_send_command(cam, &cmd);
1523
1524        return i;
1525}
1526
1527
1528/******************************************************************************
1529 *
1530 *  setallproperties
1531 *
1532 *  This sets all user changeable properties to the values in cam->params.
1533 *****************************************************************************/
1534static int set_all_properties(struct camera_data *cam)
1535{
1536        /**
1537         * Don't set target_kb here, it will be set later.
1538         * framerate and user_mode were already set (set_default_user_mode).
1539         **/
1540
1541        cpia2_set_color_params(cam);
1542
1543        cpia2_usb_change_streaming_alternate(cam,
1544                                          cam->params.camera_state.stream_mode);
1545
1546        cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE,
1547                         cam->params.vp_params.user_effects);
1548
1549        cpia2_set_flicker_mode(cam,
1550                               cam->params.flicker_control.flicker_mode_req);
1551
1552        cpia2_do_command(cam,
1553                         CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION,
1554                         TRANSFER_WRITE, cam->params.vp_params.gpio_direction);
1555        cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, TRANSFER_WRITE,
1556                         cam->params.vp_params.gpio_data);
1557
1558        wake_system(cam);
1559
1560        set_lowlight_boost(cam);
1561
1562        return 0;
1563}
1564
1565/******************************************************************************
1566 *
1567 *  cpia2_save_camera_state
1568 *
1569 *****************************************************************************/
1570void cpia2_save_camera_state(struct camera_data *cam)
1571{
1572        get_color_params(cam);
1573        cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0);
1574        cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION, TRANSFER_READ,
1575                         0);
1576        cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DATA, TRANSFER_READ, 0);
1577        /* Don't get framerate or target_kb. Trust the values we already have */
1578}
1579
1580/******************************************************************************
1581 *
1582 *  get_color_params
1583 *
1584 *****************************************************************************/
1585static void get_color_params(struct camera_data *cam)
1586{
1587        cpia2_do_command(cam, CPIA2_CMD_GET_VP_BRIGHTNESS, TRANSFER_READ, 0);
1588        cpia2_do_command(cam, CPIA2_CMD_GET_VP_SATURATION, TRANSFER_READ, 0);
1589        cpia2_do_command(cam, CPIA2_CMD_GET_CONTRAST, TRANSFER_READ, 0);
1590}
1591
1592/******************************************************************************
1593 *
1594 *  cpia2_set_color_params
1595 *
1596 *****************************************************************************/
1597void cpia2_set_color_params(struct camera_data *cam)
1598{
1599        DBG("Setting color params\n");
1600        cpia2_set_brightness(cam, cam->params.color_params.brightness);
1601        cpia2_set_contrast(cam, cam->params.color_params.contrast);
1602        cpia2_set_saturation(cam, cam->params.color_params.saturation);
1603}
1604
1605/******************************************************************************
1606 *
1607 *  cpia2_set_flicker_mode
1608 *
1609 *****************************************************************************/
1610int cpia2_set_flicker_mode(struct camera_data *cam, int mode)
1611{
1612        unsigned char cam_reg;
1613        int err = 0;
1614
1615        if(cam->params.pnp_id.device_type != DEVICE_STV_672)
1616                return -EINVAL;
1617
1618        /* Set the appropriate bits in FLICKER_MODES, preserving the rest */
1619        if((err = cpia2_do_command(cam, CPIA2_CMD_GET_FLICKER_MODES,
1620                                   TRANSFER_READ, 0)))
1621                return err;
1622        cam_reg = cam->params.flicker_control.cam_register;
1623
1624        switch(mode) {
1625        case NEVER_FLICKER:
1626                cam_reg |= CPIA2_VP_FLICKER_MODES_NEVER_FLICKER;
1627                cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ;
1628                break;
1629        case FLICKER_60:
1630                cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER;
1631                cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ;
1632                break;
1633        case FLICKER_50:
1634                cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER;
1635                cam_reg |= CPIA2_VP_FLICKER_MODES_50HZ;
1636                break;
1637        default:
1638                return -EINVAL;
1639        }
1640
1641        if((err = cpia2_do_command(cam, CPIA2_CMD_SET_FLICKER_MODES,
1642                                   TRANSFER_WRITE, cam_reg)))
1643                return err;
1644
1645        /* Set the appropriate bits in EXP_MODES, preserving the rest */
1646        if((err = cpia2_do_command(cam, CPIA2_CMD_GET_VP_EXP_MODES,
1647                                   TRANSFER_READ, 0)))
1648                return err;
1649        cam_reg = cam->params.vp_params.exposure_modes;
1650
1651        if (mode == NEVER_FLICKER) {
1652                cam_reg |= CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER;
1653        } else {
1654                cam_reg &= ~CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER;
1655        }
1656
1657        if((err = cpia2_do_command(cam, CPIA2_CMD_SET_VP_EXP_MODES,
1658                                   TRANSFER_WRITE, cam_reg)))
1659                return err;
1660
1661        if((err = cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4,
1662                                   TRANSFER_WRITE, 1)))
1663                return err;
1664
1665        switch(mode) {
1666        case NEVER_FLICKER:
1667                cam->params.flicker_control.flicker_mode_req = mode;
1668                break;
1669        case FLICKER_60:
1670                cam->params.flicker_control.flicker_mode_req = mode;
1671                cam->params.flicker_control.mains_frequency = 60;
1672                break;
1673        case FLICKER_50:
1674                cam->params.flicker_control.flicker_mode_req = mode;
1675                cam->params.flicker_control.mains_frequency = 50;
1676                break;
1677        default:
1678                err = -EINVAL;
1679        }
1680
1681        return err;
1682}
1683
1684/******************************************************************************
1685 *
1686 *  cpia2_set_property_flip
1687 *
1688 *****************************************************************************/
1689void cpia2_set_property_flip(struct camera_data *cam, int prop_val)
1690{
1691        unsigned char cam_reg;
1692
1693        cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0);
1694        cam_reg = cam->params.vp_params.user_effects;
1695
1696        if (prop_val)
1697        {
1698                cam_reg |= CPIA2_VP_USER_EFFECTS_FLIP;
1699        }
1700        else
1701        {
1702                cam_reg &= ~CPIA2_VP_USER_EFFECTS_FLIP;
1703        }
1704        cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE,
1705                         cam_reg);
1706}
1707
1708/******************************************************************************
1709 *
1710 *  cpia2_set_property_mirror
1711 *
1712 *****************************************************************************/
1713void cpia2_set_property_mirror(struct camera_data *cam, int prop_val)
1714{
1715        unsigned char cam_reg;
1716
1717        cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0);
1718        cam_reg = cam->params.vp_params.user_effects;
1719
1720        if (prop_val)
1721        {
1722                cam_reg |= CPIA2_VP_USER_EFFECTS_MIRROR;
1723        }
1724        else
1725        {
1726                cam_reg &= ~CPIA2_VP_USER_EFFECTS_MIRROR;
1727        }
1728        cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE,
1729                         cam_reg);
1730}
1731
1732/******************************************************************************
1733 *
1734 *  set_target_kb
1735 *
1736 *  The new Target KB is set in cam->params.vc_params.target_kb and
1737 *  activates on reset.
1738 *****************************************************************************/
1739
1740int cpia2_set_target_kb(struct camera_data *cam, unsigned char value)
1741{
1742        DBG("Requested target_kb = %d\n", value);
1743        if (value != cam->params.vc_params.target_kb) {
1744
1745                cpia2_usb_stream_pause(cam);
1746
1747                /* reset camera for new target_kb */
1748                cam->params.vc_params.target_kb = value;
1749                cpia2_reset_camera(cam);
1750
1751                cpia2_usb_stream_resume(cam);
1752        }
1753
1754        return 0;
1755}
1756
1757/******************************************************************************
1758 *
1759 *  cpia2_set_gpio
1760 *
1761 *****************************************************************************/
1762int cpia2_set_gpio(struct camera_data *cam, unsigned char setting)
1763{
1764        int ret;
1765
1766        /* Set the microport direction (register 0x90, should be defined
1767         * already) to 1 (user output), and set the microport data (0x91) to
1768         * the value in the ioctl argument.
1769         */
1770
1771        ret = cpia2_do_command(cam,
1772                               CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION,
1773                               CPIA2_VC_MP_DIR_OUTPUT,
1774                               255);
1775        if (ret < 0)
1776                return ret;
1777        cam->params.vp_params.gpio_direction = 255;
1778
1779        ret = cpia2_do_command(cam,
1780                               CPIA2_CMD_SET_VC_MP_GPIO_DATA,
1781                               CPIA2_VC_MP_DIR_OUTPUT,
1782                               setting);
1783        if (ret < 0)
1784                return ret;
1785        cam->params.vp_params.gpio_data = setting;
1786
1787        return 0;
1788}
1789
1790/******************************************************************************
1791 *
1792 *  cpia2_set_fps
1793 *
1794 *****************************************************************************/
1795int cpia2_set_fps(struct camera_data *cam, int framerate)
1796{
1797        int retval;
1798
1799        switch(framerate) {
1800                case CPIA2_VP_FRAMERATE_30:
1801                case CPIA2_VP_FRAMERATE_25:
1802                        if(cam->params.pnp_id.device_type == DEVICE_STV_672 &&
1803                           cam->params.version.sensor_flags ==
1804                                                    CPIA2_VP_SENSOR_FLAGS_500) {
1805                                return -EINVAL;
1806                        }
1807                        /* Fall through */
1808                case CPIA2_VP_FRAMERATE_15:
1809                case CPIA2_VP_FRAMERATE_12_5:
1810                case CPIA2_VP_FRAMERATE_7_5:
1811                case CPIA2_VP_FRAMERATE_6_25:
1812                        break;
1813                default:
1814                        return -EINVAL;
1815        }
1816
1817        if (cam->params.pnp_id.device_type == DEVICE_STV_672 &&
1818            framerate == CPIA2_VP_FRAMERATE_15)
1819                framerate = 0; /* Work around bug in VP4 */
1820
1821        retval = cpia2_do_command(cam,
1822                                 CPIA2_CMD_FRAMERATE_REQ,
1823                                 TRANSFER_WRITE,
1824                                 framerate);
1825
1826        if(retval == 0)
1827                cam->params.vp_params.frame_rate = framerate;
1828
1829        return retval;
1830}
1831
1832/******************************************************************************
1833 *
1834 *  cpia2_set_brightness
1835 *
1836 *****************************************************************************/
1837void cpia2_set_brightness(struct camera_data *cam, unsigned char value)
1838{
1839        /***
1840         * Don't let the register be set to zero - bug in VP4 - flash of full
1841         * brightness
1842         ***/
1843        if (cam->params.pnp_id.device_type == DEVICE_STV_672 && value == 0)
1844                value++;
1845        DBG("Setting brightness to %d (0x%0x)\n", value, value);
1846        cpia2_do_command(cam,CPIA2_CMD_SET_VP_BRIGHTNESS, TRANSFER_WRITE,value);
1847}
1848
1849/******************************************************************************
1850 *
1851 *  cpia2_set_contrast
1852 *
1853 *****************************************************************************/
1854void cpia2_set_contrast(struct camera_data *cam, unsigned char value)
1855{
1856        DBG("Setting contrast to %d (0x%0x)\n", value, value);
1857        cam->params.color_params.contrast = value;
1858        cpia2_do_command(cam, CPIA2_CMD_SET_CONTRAST, TRANSFER_WRITE, value);
1859}
1860
1861/******************************************************************************
1862 *
1863 *  cpia2_set_saturation
1864 *
1865 *****************************************************************************/
1866void cpia2_set_saturation(struct camera_data *cam, unsigned char value)
1867{
1868        DBG("Setting saturation to %d (0x%0x)\n", value, value);
1869        cam->params.color_params.saturation = value;
1870        cpia2_do_command(cam,CPIA2_CMD_SET_VP_SATURATION, TRANSFER_WRITE,value);
1871}
1872
1873/******************************************************************************
1874 *
1875 *  wake_system
1876 *
1877 *****************************************************************************/
1878static void wake_system(struct camera_data *cam)
1879{
1880        cpia2_do_command(cam, CPIA2_CMD_SET_WAKEUP, TRANSFER_WRITE, 0);
1881}
1882
1883/******************************************************************************
1884 *
1885 *  set_lowlight_boost
1886 *
1887 *  Valid for STV500 sensor only
1888 *****************************************************************************/
1889static void set_lowlight_boost(struct camera_data *cam)
1890{
1891        struct cpia2_command cmd;
1892
1893        if (cam->params.pnp_id.device_type != DEVICE_STV_672 ||
1894            cam->params.version.sensor_flags != CPIA2_VP_SENSOR_FLAGS_500)
1895                return;
1896
1897        cmd.direction = TRANSFER_WRITE;
1898        cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
1899        cmd.reg_count = 3;
1900        cmd.start = CPIA2_VP_RAM_ADDR_H;
1901
1902        cmd.buffer.block_data[0] = 0;   /* High byte of address to write to */
1903        cmd.buffer.block_data[1] = 0x59;        /* Low byte of address to write to */
1904        cmd.buffer.block_data[2] = 0;   /* High byte of data to write */
1905
1906        cpia2_send_command(cam, &cmd);
1907
1908        if (cam->params.vp_params.lowlight_boost) {
1909                cmd.buffer.block_data[0] = 0x02;        /* Low byte data to write */
1910        } else {
1911                cmd.buffer.block_data[0] = 0x06;
1912        }
1913        cmd.start = CPIA2_VP_RAM_DATA;
1914        cmd.reg_count = 1;
1915        cpia2_send_command(cam, &cmd);
1916
1917        /* Rehash the VP4 values */
1918        cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, TRANSFER_WRITE, 1);
1919}
1920
1921/******************************************************************************
1922 *
1923 *  cpia2_set_format
1924 *
1925 *  Assumes that new size is already set in param struct.
1926 *****************************************************************************/
1927void cpia2_set_format(struct camera_data *cam)
1928{
1929        cam->flush = true;
1930
1931        cpia2_usb_stream_pause(cam);
1932
1933        /* reset camera to new size */
1934        cpia2_set_low_power(cam);
1935        cpia2_reset_camera(cam);
1936        cam->flush = false;
1937
1938        cpia2_dbg_dump_registers(cam);
1939
1940        cpia2_usb_stream_resume(cam);
1941}
1942
1943/******************************************************************************
1944 *
1945 * cpia2_dbg_dump_registers
1946 *
1947 *****************************************************************************/
1948void cpia2_dbg_dump_registers(struct camera_data *cam)
1949{
1950#ifdef _CPIA2_DEBUG_
1951        struct cpia2_command cmd;
1952
1953        if (!(debugs_on & DEBUG_DUMP_REGS))
1954                return;
1955
1956        cmd.direction = TRANSFER_READ;
1957
1958        /* Start with bank 0 (SYSTEM) */
1959        cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
1960        cmd.reg_count = 3;
1961        cmd.start = 0;
1962        cpia2_send_command(cam, &cmd);
1963        printk(KERN_DEBUG "System Device Hi      = 0x%X\n",
1964               cmd.buffer.block_data[0]);
1965        printk(KERN_DEBUG "System Device Lo      = 0x%X\n",
1966               cmd.buffer.block_data[1]);
1967        printk(KERN_DEBUG "System_system control = 0x%X\n",
1968               cmd.buffer.block_data[2]);
1969
1970        /* Bank 1 (VC) */
1971        cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
1972        cmd.reg_count = 4;
1973        cmd.start = 0x80;
1974        cpia2_send_command(cam, &cmd);
1975        printk(KERN_DEBUG "ASIC_ID       = 0x%X\n",
1976               cmd.buffer.block_data[0]);
1977        printk(KERN_DEBUG "ASIC_REV      = 0x%X\n",
1978               cmd.buffer.block_data[1]);
1979        printk(KERN_DEBUG "PW_CONTRL     = 0x%X\n",
1980               cmd.buffer.block_data[2]);
1981        printk(KERN_DEBUG "WAKEUP        = 0x%X\n",
1982               cmd.buffer.block_data[3]);
1983
1984        cmd.start = 0xA0;       /* ST_CTRL */
1985        cmd.reg_count = 1;
1986        cpia2_send_command(cam, &cmd);
1987        printk(KERN_DEBUG "Stream ctrl   = 0x%X\n",
1988               cmd.buffer.block_data[0]);
1989
1990        cmd.start = 0xA4;       /* Stream status */
1991        cpia2_send_command(cam, &cmd);
1992        printk(KERN_DEBUG "Stream status = 0x%X\n",
1993               cmd.buffer.block_data[0]);
1994
1995        cmd.start = 0xA8;       /* USB status */
1996        cmd.reg_count = 3;
1997        cpia2_send_command(cam, &cmd);
1998        printk(KERN_DEBUG "USB_CTRL      = 0x%X\n",
1999               cmd.buffer.block_data[0]);
2000        printk(KERN_DEBUG "USB_STRM      = 0x%X\n",
2001               cmd.buffer.block_data[1]);
2002        printk(KERN_DEBUG "USB_STATUS    = 0x%X\n",
2003               cmd.buffer.block_data[2]);
2004
2005        cmd.start = 0xAF;       /* USB settings */
2006        cmd.reg_count = 1;
2007        cpia2_send_command(cam, &cmd);
2008        printk(KERN_DEBUG "USB settings  = 0x%X\n",
2009               cmd.buffer.block_data[0]);
2010
2011        cmd.start = 0xC0;       /* VC stuff */
2012        cmd.reg_count = 26;
2013        cpia2_send_command(cam, &cmd);
2014        printk(KERN_DEBUG "VC Control    = 0x%0X\n",
2015               cmd.buffer.block_data[0]);
2016        printk(KERN_DEBUG "VC Format     = 0x%0X\n",
2017               cmd.buffer.block_data[3]);
2018        printk(KERN_DEBUG "VC Clocks     = 0x%0X\n",
2019               cmd.buffer.block_data[4]);
2020        printk(KERN_DEBUG "VC IHSize     = 0x%0X\n",
2021               cmd.buffer.block_data[5]);
2022        printk(KERN_DEBUG "VC Xlim Hi    = 0x%0X\n",
2023               cmd.buffer.block_data[6]);
2024        printk(KERN_DEBUG "VC XLim Lo    = 0x%0X\n",
2025               cmd.buffer.block_data[7]);
2026        printk(KERN_DEBUG "VC YLim Hi    = 0x%0X\n",
2027               cmd.buffer.block_data[8]);
2028        printk(KERN_DEBUG "VC YLim Lo    = 0x%0X\n",
2029               cmd.buffer.block_data[9]);
2030        printk(KERN_DEBUG "VC OHSize     = 0x%0X\n",
2031               cmd.buffer.block_data[10]);
2032        printk(KERN_DEBUG "VC OVSize     = 0x%0X\n",
2033               cmd.buffer.block_data[11]);
2034        printk(KERN_DEBUG "VC HCrop      = 0x%0X\n",
2035               cmd.buffer.block_data[12]);
2036        printk(KERN_DEBUG "VC VCrop      = 0x%0X\n",
2037               cmd.buffer.block_data[13]);
2038        printk(KERN_DEBUG "VC HPhase     = 0x%0X\n",
2039               cmd.buffer.block_data[14]);
2040        printk(KERN_DEBUG "VC VPhase     = 0x%0X\n",
2041               cmd.buffer.block_data[15]);
2042        printk(KERN_DEBUG "VC HIspan     = 0x%0X\n",
2043               cmd.buffer.block_data[16]);
2044        printk(KERN_DEBUG "VC VIspan     = 0x%0X\n",
2045               cmd.buffer.block_data[17]);
2046        printk(KERN_DEBUG "VC HiCrop     = 0x%0X\n",
2047               cmd.buffer.block_data[18]);
2048        printk(KERN_DEBUG "VC ViCrop     = 0x%0X\n",
2049               cmd.buffer.block_data[19]);
2050        printk(KERN_DEBUG "VC HiFract    = 0x%0X\n",
2051               cmd.buffer.block_data[20]);
2052        printk(KERN_DEBUG "VC ViFract    = 0x%0X\n",
2053               cmd.buffer.block_data[21]);
2054        printk(KERN_DEBUG "VC JPeg Opt   = 0x%0X\n",
2055               cmd.buffer.block_data[22]);
2056        printk(KERN_DEBUG "VC Creep Per  = 0x%0X\n",
2057               cmd.buffer.block_data[23]);
2058        printk(KERN_DEBUG "VC User Sq.   = 0x%0X\n",
2059               cmd.buffer.block_data[24]);
2060        printk(KERN_DEBUG "VC Target KB  = 0x%0X\n",
2061               cmd.buffer.block_data[25]);
2062
2063        /*** VP ***/
2064        cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
2065        cmd.reg_count = 14;
2066        cmd.start = 0;
2067        cpia2_send_command(cam, &cmd);
2068
2069        printk(KERN_DEBUG "VP Dev Hi     = 0x%0X\n",
2070               cmd.buffer.block_data[0]);
2071        printk(KERN_DEBUG "VP Dev Lo     = 0x%0X\n",
2072               cmd.buffer.block_data[1]);
2073        printk(KERN_DEBUG "VP Sys State  = 0x%0X\n",
2074               cmd.buffer.block_data[2]);
2075        printk(KERN_DEBUG "VP Sys Ctrl   = 0x%0X\n",
2076               cmd.buffer.block_data[3]);
2077        printk(KERN_DEBUG "VP Sensor flg = 0x%0X\n",
2078               cmd.buffer.block_data[5]);
2079        printk(KERN_DEBUG "VP Sensor Rev = 0x%0X\n",
2080               cmd.buffer.block_data[6]);
2081        printk(KERN_DEBUG "VP Dev Config = 0x%0X\n",
2082               cmd.buffer.block_data[7]);
2083        printk(KERN_DEBUG "VP GPIO_DIR   = 0x%0X\n",
2084               cmd.buffer.block_data[8]);
2085        printk(KERN_DEBUG "VP GPIO_DATA  = 0x%0X\n",
2086               cmd.buffer.block_data[9]);
2087        printk(KERN_DEBUG "VP Ram ADDR H = 0x%0X\n",
2088               cmd.buffer.block_data[10]);
2089        printk(KERN_DEBUG "VP Ram ADDR L = 0x%0X\n",
2090               cmd.buffer.block_data[11]);
2091        printk(KERN_DEBUG "VP RAM Data   = 0x%0X\n",
2092               cmd.buffer.block_data[12]);
2093        printk(KERN_DEBUG "Do Call       = 0x%0X\n",
2094               cmd.buffer.block_data[13]);
2095
2096        if (cam->params.pnp_id.device_type == DEVICE_STV_672) {
2097                cmd.reg_count = 9;
2098                cmd.start = 0x0E;
2099                cpia2_send_command(cam, &cmd);
2100                printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n",
2101                       cmd.buffer.block_data[0]);
2102                printk(KERN_DEBUG "VP Patch Rev  = 0x%0X\n",
2103                       cmd.buffer.block_data[1]);
2104                printk(KERN_DEBUG "VP Vid Mode   = 0x%0X\n",
2105                       cmd.buffer.block_data[2]);
2106                printk(KERN_DEBUG "VP Framerate  = 0x%0X\n",
2107                       cmd.buffer.block_data[3]);
2108                printk(KERN_DEBUG "VP UserEffect = 0x%0X\n",
2109                       cmd.buffer.block_data[4]);
2110                printk(KERN_DEBUG "VP White Bal  = 0x%0X\n",
2111                       cmd.buffer.block_data[5]);
2112                printk(KERN_DEBUG "VP WB thresh  = 0x%0X\n",
2113                       cmd.buffer.block_data[6]);
2114                printk(KERN_DEBUG "VP Exp Modes  = 0x%0X\n",
2115                       cmd.buffer.block_data[7]);
2116                printk(KERN_DEBUG "VP Exp Target = 0x%0X\n",
2117                       cmd.buffer.block_data[8]);
2118
2119                cmd.reg_count = 1;
2120                cmd.start = 0x1B;
2121                cpia2_send_command(cam, &cmd);
2122                printk(KERN_DEBUG "VP FlickerMds = 0x%0X\n",
2123                       cmd.buffer.block_data[0]);
2124        } else {
2125                cmd.reg_count = 8 ;
2126                cmd.start = 0x0E;
2127                cpia2_send_command(cam, &cmd);
2128                printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n",
2129                       cmd.buffer.block_data[0]);
2130                printk(KERN_DEBUG "VP Patch Rev  = 0x%0X\n",
2131                       cmd.buffer.block_data[1]);
2132                printk(KERN_DEBUG "VP Vid Mode   = 0x%0X\n",
2133                       cmd.buffer.block_data[5]);
2134                printk(KERN_DEBUG "VP Framerate  = 0x%0X\n",
2135                       cmd.buffer.block_data[6]);
2136                printk(KERN_DEBUG "VP UserEffect = 0x%0X\n",
2137                       cmd.buffer.block_data[7]);
2138
2139                cmd.reg_count = 1;
2140                cmd.start = CPIA2_VP5_EXPOSURE_TARGET;
2141                cpia2_send_command(cam, &cmd);
2142                printk(KERN_DEBUG "VP5 Exp Target= 0x%0X\n",
2143                       cmd.buffer.block_data[0]);
2144
2145                cmd.reg_count = 4;
2146                cmd.start = 0x3A;
2147                cpia2_send_command(cam, &cmd);
2148                printk(KERN_DEBUG "VP5 MY Black  = 0x%0X\n",
2149                       cmd.buffer.block_data[0]);
2150                printk(KERN_DEBUG "VP5 MCY Range = 0x%0X\n",
2151                       cmd.buffer.block_data[1]);
2152                printk(KERN_DEBUG "VP5 MYCEILING = 0x%0X\n",
2153                       cmd.buffer.block_data[2]);
2154                printk(KERN_DEBUG "VP5 MCUV Sat  = 0x%0X\n",
2155                       cmd.buffer.block_data[3]);
2156        }
2157#endif
2158}
2159
2160/******************************************************************************
2161 *
2162 *  reset_camera_struct
2163 *
2164 *  Sets all values to the defaults
2165 *****************************************************************************/
2166static void reset_camera_struct(struct camera_data *cam)
2167{
2168        /***
2169         * The following parameter values are the defaults from the register map.
2170         ***/
2171        cam->params.color_params.brightness = DEFAULT_BRIGHTNESS;
2172        cam->params.color_params.contrast = DEFAULT_CONTRAST;
2173        cam->params.color_params.saturation = DEFAULT_SATURATION;
2174        cam->params.vp_params.lowlight_boost = 0;
2175
2176        /* FlickerModes */
2177        cam->params.flicker_control.flicker_mode_req = NEVER_FLICKER;
2178        cam->params.flicker_control.mains_frequency = 60;
2179
2180        /* jpeg params */
2181        cam->params.compression.jpeg_options = CPIA2_VC_VC_JPEG_OPT_DEFAULT;
2182        cam->params.compression.creep_period = 2;
2183        cam->params.compression.user_squeeze = 20;
2184        cam->params.compression.inhibit_htables = false;
2185
2186        /* gpio params */
2187        cam->params.vp_params.gpio_direction = 0;       /* write, the default safe mode */
2188        cam->params.vp_params.gpio_data = 0;
2189
2190        /* Target kb params */
2191        cam->params.vc_params.target_kb = DEFAULT_TARGET_KB;
2192
2193        /***
2194         * Set Sensor FPS as fast as possible.
2195         ***/
2196        if(cam->params.pnp_id.device_type == DEVICE_STV_672) {
2197                if(cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500)
2198                        cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_15;
2199                else
2200                        cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_30;
2201        } else {
2202                cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_30;
2203        }
2204
2205        /***
2206         * Set default video mode as large as possible :
2207         * for vga sensor set to vga, for cif sensor set to CIF.
2208         ***/
2209        if (cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500) {
2210                cam->sensor_type = CPIA2_SENSOR_500;
2211                cam->video_size = VIDEOSIZE_VGA;
2212                cam->params.roi.width = STV_IMAGE_VGA_COLS;
2213                cam->params.roi.height = STV_IMAGE_VGA_ROWS;
2214        } else {
2215                cam->sensor_type = CPIA2_SENSOR_410;
2216                cam->video_size = VIDEOSIZE_CIF;
2217                cam->params.roi.width = STV_IMAGE_CIF_COLS;
2218                cam->params.roi.height = STV_IMAGE_CIF_ROWS;
2219        }
2220
2221        cam->width = cam->params.roi.width;
2222        cam->height = cam->params.roi.height;
2223}
2224
2225/******************************************************************************
2226 *
2227 *  cpia2_init_camera_struct
2228 *
2229 *  Initializes camera struct, does not call reset to fill in defaults.
2230 *****************************************************************************/
2231struct camera_data *cpia2_init_camera_struct(void)
2232{
2233        struct camera_data *cam;
2234
2235        cam = kzalloc(sizeof(*cam), GFP_KERNEL);
2236
2237        if (!cam) {
2238                ERR("couldn't kmalloc cpia2 struct\n");
2239                return NULL;
2240        }
2241
2242
2243        cam->present = 1;
2244        mutex_init(&cam->v4l2_lock);
2245        init_waitqueue_head(&cam->wq_stream);
2246
2247        return cam;
2248}
2249
2250/******************************************************************************
2251 *
2252 *  cpia2_init_camera
2253 *
2254 *  Initializes camera.
2255 *****************************************************************************/
2256int cpia2_init_camera(struct camera_data *cam)
2257{
2258        DBG("Start\n");
2259
2260        cam->mmapped = false;
2261
2262        /* Get sensor and asic types before reset. */
2263        cpia2_set_high_power(cam);
2264        cpia2_get_version_info(cam);
2265        if (cam->params.version.asic_id != CPIA2_ASIC_672) {
2266                ERR("Device IO error (asicID has incorrect value of 0x%X\n",
2267                    cam->params.version.asic_id);
2268                return -ENODEV;
2269        }
2270
2271        /* Set GPIO direction and data to a safe state. */
2272        cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION,
2273                         TRANSFER_WRITE, 0);
2274        cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA,
2275                         TRANSFER_WRITE, 0);
2276
2277        /* resetting struct requires version info for sensor and asic types */
2278        reset_camera_struct(cam);
2279
2280        cpia2_set_low_power(cam);
2281
2282        DBG("End\n");
2283
2284        return 0;
2285}
2286
2287/******************************************************************************
2288 *
2289 *  cpia2_allocate_buffers
2290 *
2291 *****************************************************************************/
2292int cpia2_allocate_buffers(struct camera_data *cam)
2293{
2294        int i;
2295
2296        if(!cam->buffers) {
2297                u32 size = cam->num_frames*sizeof(struct framebuf);
2298                cam->buffers = kmalloc(size, GFP_KERNEL);
2299                if(!cam->buffers) {
2300                        ERR("couldn't kmalloc frame buffer structures\n");
2301                        return -ENOMEM;
2302                }
2303        }
2304
2305        if(!cam->frame_buffer) {
2306                cam->frame_buffer = rvmalloc(cam->frame_size*cam->num_frames);
2307                if (!cam->frame_buffer) {
2308                        ERR("couldn't vmalloc frame buffer data area\n");
2309                        kfree(cam->buffers);
2310                        cam->buffers = NULL;
2311                        return -ENOMEM;
2312                }
2313        }
2314
2315        for(i=0; i<cam->num_frames-1; ++i) {
2316                cam->buffers[i].next = &cam->buffers[i+1];
2317                cam->buffers[i].data = cam->frame_buffer +i*cam->frame_size;
2318                cam->buffers[i].status = FRAME_EMPTY;
2319                cam->buffers[i].length = 0;
2320                cam->buffers[i].max_length = 0;
2321                cam->buffers[i].num = i;
2322        }
2323        cam->buffers[i].next = cam->buffers;
2324        cam->buffers[i].data = cam->frame_buffer +i*cam->frame_size;
2325        cam->buffers[i].status = FRAME_EMPTY;
2326        cam->buffers[i].length = 0;
2327        cam->buffers[i].max_length = 0;
2328        cam->buffers[i].num = i;
2329        cam->curbuff = cam->buffers;
2330        cam->workbuff = cam->curbuff->next;
2331        DBG("buffers=%p, curbuff=%p, workbuff=%p\n", cam->buffers, cam->curbuff,
2332            cam->workbuff);
2333        return 0;
2334}
2335
2336/******************************************************************************
2337 *
2338 *  cpia2_free_buffers
2339 *
2340 *****************************************************************************/
2341void cpia2_free_buffers(struct camera_data *cam)
2342{
2343        if(cam->buffers) {
2344                kfree(cam->buffers);
2345                cam->buffers = NULL;
2346        }
2347        if(cam->frame_buffer) {
2348                rvfree(cam->frame_buffer, cam->frame_size*cam->num_frames);
2349                cam->frame_buffer = NULL;
2350        }
2351}
2352
2353/******************************************************************************
2354 *
2355 *  cpia2_read
2356 *
2357 *****************************************************************************/
2358long cpia2_read(struct camera_data *cam,
2359                char __user *buf, unsigned long count, int noblock)
2360{
2361        struct framebuf *frame;
2362
2363        if (!count)
2364                return 0;
2365
2366        if (!buf) {
2367                ERR("%s: buffer NULL\n",__func__);
2368                return -EINVAL;
2369        }
2370
2371        if (!cam) {
2372                ERR("%s: Internal error, camera_data NULL!\n",__func__);
2373                return -EINVAL;
2374        }
2375
2376        if (!cam->present) {
2377                LOG("%s: camera removed\n",__func__);
2378                return 0;       /* EOF */
2379        }
2380
2381        if (!cam->streaming) {
2382                /* Start streaming */
2383                cpia2_usb_stream_start(cam,
2384                                       cam->params.camera_state.stream_mode);
2385        }
2386
2387        /* Copy cam->curbuff in case it changes while we're processing */
2388        frame = cam->curbuff;
2389        if (noblock && frame->status != FRAME_READY) {
2390                return -EAGAIN;
2391        }
2392
2393        if (frame->status != FRAME_READY) {
2394                mutex_unlock(&cam->v4l2_lock);
2395                wait_event_interruptible(cam->wq_stream,
2396                               !cam->present ||
2397                               (frame = cam->curbuff)->status == FRAME_READY);
2398                mutex_lock(&cam->v4l2_lock);
2399                if (signal_pending(current))
2400                        return -ERESTARTSYS;
2401                if (!cam->present)
2402                        return 0;
2403        }
2404
2405        /* copy data to user space */
2406        if (frame->length > count)
2407                return -EFAULT;
2408        if (copy_to_user(buf, frame->data, frame->length))
2409                return -EFAULT;
2410
2411        count = frame->length;
2412
2413        frame->status = FRAME_EMPTY;
2414
2415        return count;
2416}
2417
2418/******************************************************************************
2419 *
2420 *  cpia2_poll
2421 *
2422 *****************************************************************************/
2423unsigned int cpia2_poll(struct camera_data *cam, struct file *filp,
2424                        poll_table *wait)
2425{
2426        unsigned int status=0;
2427
2428        if (!cam) {
2429                ERR("%s: Internal error, camera_data not found!\n",__func__);
2430                return POLLERR;
2431        }
2432
2433        if (!cam->present)
2434                return POLLHUP;
2435
2436        if(!cam->streaming) {
2437                /* Start streaming */
2438                cpia2_usb_stream_start(cam,
2439                                       cam->params.camera_state.stream_mode);
2440        }
2441
2442        poll_wait(filp, &cam->wq_stream, wait);
2443
2444        if(!cam->present)
2445                status = POLLHUP;
2446        else if(cam->curbuff->status == FRAME_READY)
2447                status = POLLIN | POLLRDNORM;
2448
2449        return status;
2450}
2451
2452/******************************************************************************
2453 *
2454 *  cpia2_remap_buffer
2455 *
2456 *****************************************************************************/
2457int cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma)
2458{
2459        const char *adr = (const char *)vma->vm_start;
2460        unsigned long size = vma->vm_end-vma->vm_start;
2461        unsigned long start_offset = vma->vm_pgoff << PAGE_SHIFT;
2462        unsigned long start = (unsigned long) adr;
2463        unsigned long page, pos;
2464
2465        if (!cam)
2466                return -ENODEV;
2467
2468        DBG("mmap offset:%ld size:%ld\n", start_offset, size);
2469
2470        if (!cam->present)
2471                return -ENODEV;
2472
2473        if (size > cam->frame_size*cam->num_frames  ||
2474            (start_offset % cam->frame_size) != 0 ||
2475            (start_offset+size > cam->frame_size*cam->num_frames))
2476                return -EINVAL;
2477
2478        pos = ((unsigned long) (cam->frame_buffer)) + start_offset;
2479        while (size > 0) {
2480                page = kvirt_to_pa(pos);
2481                if (remap_pfn_range(vma, start, page >> PAGE_SHIFT, PAGE_SIZE, PAGE_SHARED))
2482                        return -EAGAIN;
2483                start += PAGE_SIZE;
2484                pos += PAGE_SIZE;
2485                if (size > PAGE_SIZE)
2486                        size -= PAGE_SIZE;
2487                else
2488                        size = 0;
2489        }
2490
2491        cam->mmapped = true;
2492        return 0;
2493}
2494