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