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