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 *****************************************************************************/ 5221039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab 5231039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab#define DIR(cmd) ((cmd->direction == TRANSFER_WRITE) ? "Write" : "Read") 5241039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab#define BINDEX(cmd) (cmd->req_mode & 0x03) 5251039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab 526ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd) 527ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 528ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 count; 529ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 start; 530ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 *buffer; 531ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval; 532ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 533ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (cmd->req_mode & 0x0c) { 534ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_RANDOM: 535ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count * sizeof(struct cpia2_register); 536ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = 0; 537ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = (u8 *) & cmd->buffer; 538ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5391039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Random: Register block %s\n", DIR(cmd), 5401039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 541ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 542ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_BLOCK: 543ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count; 544ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = cmd->start; 545ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = cmd->buffer.block_data; 546ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5471039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Block: Register block %s\n", DIR(cmd), 5481039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 549ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 550ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_MASK: 551ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count * sizeof(struct cpia2_reg_mask); 552ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = 0; 553ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = (u8 *) & cmd->buffer; 554ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5551039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Mask: Register block %s\n", DIR(cmd), 5561039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 557ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 558ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_REPEAT: /* For patch blocks only */ 559ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count; 560ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = cmd->start; 561ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = cmd->buffer.block_data; 562ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5631039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Repeat: Register block %s\n", DIR(cmd), 5641039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 565ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 566ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 56794205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison LOG("%s: invalid request mode\n",__func__); 568ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 569ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 570ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 571ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = cpia2_usb_transfer_cmd(cam, 572ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer, 573ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd->req_mode, 574ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start, count, cmd->direction); 575ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifdef _CPIA2_DEBUG_ 576ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) { 577ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 578ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for (i = 0; i < cmd->reg_count; i++) { 579ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((cmd->req_mode & 0x0c) == CAMERAACCESS_TYPE_BLOCK) 580ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox KINFO("%s Block: [0x%02X] = 0x%02X\n", 5811039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DIR(cmd), start + i, buffer[i]); 582ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((cmd->req_mode & 0x0c) == CAMERAACCESS_TYPE_RANDOM) 583ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox KINFO("%s Random: [0x%02X] = 0x%02X\n", 5841039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DIR(cmd), cmd->buffer.registers[i].index, 585ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd->buffer.registers[i].value); 586ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 587ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 588ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif 589ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 590ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 591ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox}; 592ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 593ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/************* 594ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Functions to implement camera functionality 595ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *************/ 596ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 597ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 598ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_get_version_info 599ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 600ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 601ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void cpia2_get_version_info(struct camera_data *cam) 602ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 603ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VERSION, TRANSFER_READ, 0); 604ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_PNP_ID, TRANSFER_READ, 0); 605ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_ASIC_TYPE, TRANSFER_READ, 0); 606ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_SENSOR, TRANSFER_READ, 0); 607ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_DEVICE, TRANSFER_READ, 0); 608ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 609ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 610ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 611ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 612ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_reset_camera 613ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 614ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Called at least during the open process, sets up initial params. 615ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 616ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_reset_camera(struct camera_data *cam) 617ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 618ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 tmp_reg; 619ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval = 0; 620ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 621ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 622ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 623ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 624ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * VC setup 625ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 626ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = configure_sensor(cam, 627ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width, 628ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height); 629ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (retval < 0) { 630ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("Couldn't configure sensor, error=%d\n", retval); 631ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 632ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 633ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 634ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Clear FIFO and route/enable stream block */ 635ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 636ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 637ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 638ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VC_ST_CTRL; 639ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = CPIA2_VC_ST_CTRL_SRC_VC | 640ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_DST_USB | CPIA2_VC_ST_CTRL_EOF_DETECT; 641ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VC_ST_CTRL; 642ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = CPIA2_VC_ST_CTRL_SRC_VC | 643ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_DST_USB | 644ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_EOF_DETECT | CPIA2_VC_ST_CTRL_FIFO_ENABLE; 645ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 646ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 647ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 648ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_high_power(cam); 649ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 650ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 651ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Enable button notification */ 652ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_SYSTEM; 653ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_SYSTEM_INT_PACKET_CTRL; 654ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = 655ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_INT_PACKET_CTRL_ENABLE_SW_XX; 656ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 657ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 658ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 659ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 66097989ada7628da262eafb4bebce0a319c7cb0f5fRobert P. J. Day schedule_timeout_interruptible(msecs_to_jiffies(100)); 661ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 662ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) 663ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = apply_vp_patch(cam); 664ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 665ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* wait for vp to go to sleep */ 66697989ada7628da262eafb4bebce0a319c7cb0f5fRobert P. J. Day schedule_timeout_interruptible(msecs_to_jiffies(100)); 667ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 668ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 669ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * If this is a 676, apply VP5 fixes before we start streaming 670ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 671ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_676) { 672ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP; 673ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 674ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* The following writes improve the picture */ 675ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VP5_MYBLACK_LEVEL; 676ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = 0; /* reduce from the default 677ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * rec 601 pedestal of 16 */ 678ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VP5_MCYRANGE; 679ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = 0x92; /* increase from 100% to 680ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * (256/256 - 31) to fill 681ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * available range */ 682ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[2].index = CPIA2_VP5_MYCEILING; 683ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[2].value = 0xFF; /* Increase from the 684ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * default rec 601 ceiling 685ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * of 240 */ 686ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[3].index = CPIA2_VP5_MCUVSATURATION; 687ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[3].value = 0xFF; /* Increase from the rec 688ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 601 100% level (128) 689ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * to 145-192 */ 690ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[4].index = CPIA2_VP5_ANTIFLKRSETUP; 691ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[4].value = 0x80; /* Inhibit the 692ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * anti-flicker */ 693ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 694ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* The following 4 writes are a fix to allow QVGA to work at 30 fps */ 695ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[5].index = CPIA2_VP_RAM_ADDR_H; 696ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[5].value = 0x01; 697ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[6].index = CPIA2_VP_RAM_ADDR_L; 698ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[6].value = 0xE3; 699ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[7].index = CPIA2_VP_RAM_DATA; 700ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[7].value = 0x02; 701ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[8].index = CPIA2_VP_RAM_DATA; 702ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[8].value = 0xFC; 703ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 704ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 705ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 9; 706ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 707ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 708ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 709ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 710ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Activate all settings and start the data stream */ 711ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set user mode */ 712ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_default_user_mode(cam); 713ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 714ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Give VP time to wake up */ 71597989ada7628da262eafb4bebce0a319c7cb0f5fRobert P. J. Day schedule_timeout_interruptible(msecs_to_jiffies(100)); 716ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 717ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_all_properties(cam); 718ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 719ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_MODE, TRANSFER_READ, 0); 720ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("After SetAllProperties(cam), user mode is 0x%0X\n", 721ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_mode); 722ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 723ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 724ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set audio regulator off. This and the code to set the compresison 725ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * state are too complex to form a CPIA2_CMD_, and seem to be somewhat 726ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * intertwined. This stuff came straight from the windows driver. 727ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 728ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Turn AutoExposure off in VP and enable the serial bridge to the sensor */ 729ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_CTRL, TRANSFER_READ, 0); 730ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vp_params.system_ctrl; 731ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = tmp_reg & 732ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (tmp_reg & (CPIA2_VP_SYSTEMCTRL_HK_CONTROL ^ 0xFF)); 733ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 734ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_DEVICE_CONFIG, TRANSFER_READ, 0); 735ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = cam->params.vp_params.device_config | 736ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_DEVICE_CONFIG_SERIAL_BRIDGE; 737ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VP_SYSTEMCTRL; 738ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VP_DEVICE_CONFIG; 739ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP; 740ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 741ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 742ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 743ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 744ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 745ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the correct I2C address in the CPiA-2 system register */ 746ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 747ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SERIAL_ADDR, 748ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 749ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_VP_SERIAL_ADDR_SENSOR); 750ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 751ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Now have sensor access - set bit to turn the audio regulator off */ 752ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 753ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SENSOR_CR1, 754ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, CPIA2_SENSOR_CR1_DOWN_AUDIO_REGULATOR); 755ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 756ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the correct I2C address in the CPiA-2 system register */ 757ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) 758ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 759ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SERIAL_ADDR, 760ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 761ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_VP_SERIAL_ADDR_VP); // 0x88 762ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 763ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 764ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SERIAL_ADDR, 765ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 766ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_VP_SERIAL_ADDR_676_VP); // 0x8a 767ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 768ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* increase signal drive strength */ 769ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_676) 770ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 771ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VP_EXP_MODES, 772ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 773ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_EXPOSURE_MODES_COMPILE_EXP); 774ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 775ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start autoexposure */ 776ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_DEVICE_CONFIG, TRANSFER_READ, 0); 777ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = cam->params.vp_params.device_config & 778ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (CPIA2_VP_DEVICE_CONFIG_SERIAL_BRIDGE ^ 0xFF); 779ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 780ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_CTRL, TRANSFER_READ, 0); 781ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = 782ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.system_ctrl | CPIA2_VP_SYSTEMCTRL_HK_CONTROL; 783ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 784ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VP_DEVICE_CONFIG; 785ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VP_SYSTEMCTRL; 786ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP; 787ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 788ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 789ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 790ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 791ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 792ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set compression state */ 793ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VC_CONTROL, TRANSFER_READ, 0); 794ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.compression.inhibit_htables) { 795ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vc_params.vc_control | 796ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CTRL_INHIBIT_H_TABLES; 797ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 798ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vc_params.vc_control & 799ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ~CPIA2_VC_VC_CTRL_INHIBIT_H_TABLES; 800ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 801ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_CONTROL, TRANSFER_WRITE,tmp_reg); 802ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 803ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set target size (kb) on vc */ 804ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_TARGET_KB, 805ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam->params.vc_params.target_kb); 806ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 807ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Wiggle VC Reset */ 808ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 809ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * First read and wait a bit. 810ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 811ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for (i = 0; i < 50; i++) { 812ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_PW_CONTROL, 813ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0); 814ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 815ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 816ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vc_params.pw_control; 817ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg &= ~CPIA2_VC_PW_CTRL_VC_RESET_N; 818ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 819ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_PW_CONTROL, TRANSFER_WRITE,tmp_reg); 820ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 821ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg |= CPIA2_VC_PW_CTRL_VC_RESET_N; 822ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_PW_CONTROL, TRANSFER_WRITE,tmp_reg); 823ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 824ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_DEF_JPEG_OPT, TRANSFER_WRITE, 0); 825ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 826ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_MODE, TRANSFER_READ, 0); 827ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("After VC RESET, user mode is 0x%0X\n", 828ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_mode); 829ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 830ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 831ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 832ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 833ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 834ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 835ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_high_power 836ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 837ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 838ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int cpia2_set_high_power(struct camera_data *cam) 839ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 840ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 841ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for (i = 0; i <= 50; i++) { 842ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Read system status */ 843ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam,CPIA2_CMD_GET_SYSTEM_CTRL,TRANSFER_READ,0); 844ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 845ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* If there is an error, clear it */ 846ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.camera_state.system_ctrl & 847ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_CONTROL_V2W_ERR) 848ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_CLEAR_V2W_ERR, 849ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 0); 850ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 851ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Try to set high power mode */ 852ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_SYSTEM_CTRL, 853ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 1); 854ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 855ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Try to read something in VP to check if everything is awake */ 856ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_STATE, 857ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0); 858ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.vp_params.system_state & 859ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_SYSTEMSTATE_HK_ALIVE) { 860ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 861ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else if (i == 50) { 862ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.power_mode = LO_POWER_MODE; 863ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("Camera did not wake up\n"); 864ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EIO; 865ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 866ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 867ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 868ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("System now in high power state\n"); 869ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.power_mode = HI_POWER_MODE; 870ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 871ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 872ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 873ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 874ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 875ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_low_power 876ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 877ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 878ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_low_power(struct camera_data *cam) 879ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 880ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.power_mode = LO_POWER_MODE; 881ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_SYSTEM_CTRL, TRANSFER_WRITE, 0); 882ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 883ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 884ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 885ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 886ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 887ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * apply_vp_patch 888ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 889ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 89004a33e406a062cd1bb55014ee17a3558109a2d74David Woodhousestatic int cpia2_send_onebyte_command(struct camera_data *cam, 89104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse struct cpia2_command *cmd, 89204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse u8 start, u8 datum) 89304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse{ 89404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd->buffer.block_data[0] = datum; 89504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd->start = start; 89604a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd->reg_count = 1; 89704a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse return cpia2_send_command(cam, cmd); 89804a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse} 89904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 900ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int apply_vp_patch(struct camera_data *cam) 901ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 90204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse const struct firmware *fw; 90304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse const char fw_name[] = "cpia2/stv0672_vp4.bin"; 90404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse int i, ret; 905ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 906ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 90704a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse ret = request_firmware(&fw, fw_name, &cam->dev->dev); 90804a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse if (ret) { 90904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse printk(KERN_ERR "cpia2: failed to load VP patch \"%s\"\n", 91004a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse fw_name); 91104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse return ret; 91204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse } 91304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 914ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_REPEAT | CAMERAACCESS_VP; 915ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 916ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 91704a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* First send the start address... */ 91804a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0A, fw->data[0]); /* hi */ 91904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0B, fw->data[1]); /* lo */ 920ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 92104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* ... followed by the data payload */ 92204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse for (i = 2; i < fw->size; i += 64) { 92304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd.start = 0x0C; /* Data */ 92404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd.reg_count = min_t(int, 64, fw->size - i); 92504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse memcpy(cmd.buffer.block_data, &fw->data[i], cmd.reg_count); 926ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 927ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 928ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 92904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* Next send the start address... */ 93004a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0A, fw->data[0]); /* hi */ 93104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0B, fw->data[1]); /* lo */ 93204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 93304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* ... followed by the 'goto' command */ 93404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0D, 1); 93504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 93604a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse release_firmware(fw); 937ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 938ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 939ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 940ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 941ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 942ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * set_default_user_mode 943ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 944ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 945ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_default_user_mode(struct camera_data *cam) 946ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 947ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char user_mode; 948ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char frame_rate; 949ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int width = cam->params.roi.width; 950ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int height = cam->params.roi.height; 951ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 952ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (cam->params.version.sensor_flags) { 953ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_404: 954ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_407: 955ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_409: 956ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_410: 957ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if ((width > STV_IMAGE_QCIF_COLS) 958ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox || (height > STV_IMAGE_QCIF_ROWS)) { 959ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_CIF; 960ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 961ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_QCIFDS; 962ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 963ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = CPIA2_VP_FRAMERATE_30; 964ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 965ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_500: 966ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if ((width > STV_IMAGE_CIF_COLS) 967ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox || (height > STV_IMAGE_CIF_ROWS)) { 968ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_VGA; 969ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 970ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_QVGADS; 971ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 972ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) 973ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = CPIA2_VP_FRAMERATE_15; 974ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 975ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = CPIA2_VP_FRAMERATE_30; 976ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 977ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 97894205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison LOG("%s: Invalid sensor flag value 0x%0X\n",__func__, 979ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags); 980ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 981ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 982ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 983ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Sensor flag = 0x%0x, user mode = 0x%0x, frame rate = 0x%X\n", 984ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags, user_mode, frame_rate); 985ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_MODE, TRANSFER_WRITE, 986ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode); 987ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.vp_params.frame_rate > 0 && 988ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate > cam->params.vp_params.frame_rate) 989ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = cam->params.vp_params.frame_rate; 990ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 991ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_fps(cam, frame_rate); 992ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 993ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// if (cam->params.pnp_id.device_type == DEVICE_STV_676) 994ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// cpia2_do_command(cam, 995ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// CPIA2_CMD_SET_VP_SYSTEM_CTRL, 996ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// TRANSFER_WRITE, 997ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// CPIA2_VP_SYSTEMCTRL_HK_CONTROL | 998ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// CPIA2_VP_SYSTEMCTRL_POWER_CONTROL); 999ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1000ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1001ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1002ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1003ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1004ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1005ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_match_video_size 1006ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1007ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * return the best match, where 'best' is as always 1008ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * the largest that is not bigger than what is requested. 1009ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1010ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_match_video_size(int width, int height) 1011ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1012ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_VGA_COLS && height >= STV_IMAGE_VGA_ROWS) 1013ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_VGA; 1014ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1015ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_CIF_COLS && height >= STV_IMAGE_CIF_ROWS) 1016ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_CIF; 1017ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1018ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_QVGA_COLS && height >= STV_IMAGE_QVGA_ROWS) 1019ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_QVGA; 1020ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1021ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 288 && height >= 216) 1022ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_288_216; 1023ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1024ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 256 && height >= 192) 1025ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_256_192; 1026ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1027ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 224 && height >= 168) 1028ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_224_168; 1029ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1030ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 192 && height >= 144) 1031ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_192_144; 1032ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1033ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_QCIF_COLS && height >= STV_IMAGE_QCIF_ROWS) 1034ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_QCIF; 1035ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1036ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -1; 1037ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1038ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1039ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1040ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1041ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * SetVideoSize 1042ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1043ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1044ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_vw_size(struct camera_data *cam, int size) 1045ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1046ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval = 0; 1047ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1048ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_size = size; 1049ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1050ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (size) { 1051ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_VGA: 1052ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to VGA\n"); 1053ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_VGA_COLS; 1054ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_VGA_ROWS; 1055873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_VGA_COLS; 1056873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_VGA_ROWS; 1057ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1058ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_CIF: 1059ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to CIF\n"); 1060ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_CIF_COLS; 1061ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_CIF_ROWS; 1062873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_CIF_COLS; 1063873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_CIF_ROWS; 1064ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1065ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_QVGA: 1066ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to QVGA\n"); 1067ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_QVGA_COLS; 1068ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_QVGA_ROWS; 1069873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_QVGA_COLS; 1070873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_QVGA_ROWS; 1071ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1072ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_288_216: 1073ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 288; 1074ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 216; 1075873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 288; 1076873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 216; 1077ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1078ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_256_192: 1079873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 256; 1080873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 192; 1081ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 256; 1082ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 192; 1083ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1084ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_224_168: 1085873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 224; 1086873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 168; 1087ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 224; 1088ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 168; 1089ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1090ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_192_144: 1091873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 192; 1092873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 144; 1093ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 192; 1094ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 144; 1095ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1096ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_QCIF: 1097ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to QCIF\n"); 1098ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_QCIF_COLS; 1099ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_QCIF_ROWS; 1100873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_QCIF_COLS; 1101873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_QCIF_ROWS; 1102ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1103ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1104ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = -EINVAL; 1105ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1106ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 1107ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1108ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1109ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1110ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1111ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * configure_sensor 1112ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1113ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1114ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int configure_sensor(struct camera_data *cam, 1115ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int req_width, int req_height) 1116ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1117ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval; 1118ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1119ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (cam->params.version.sensor_flags) { 1120ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_404: 1121ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_407: 1122ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_409: 1123ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_410: 1124ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = config_sensor_410(cam, req_width, req_height); 1125ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1126ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_500: 1127ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = config_sensor_500(cam, req_width, req_height); 1128ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1129ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1130ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1131ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1132ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1133ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 1134ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1135ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1136ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1137ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1138ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * config_sensor_410 1139ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1140ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1141ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int config_sensor_410(struct camera_data *cam, 1142ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int req_width, int req_height) 1143ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1144ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1145ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i = 0; 1146ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_size; 1147ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_type; 1148ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int width = req_width; 1149ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int height = req_height; 1150ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1151ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 1152ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Make sure size doesn't exceed CIF. 1153ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 1154ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width > STV_IMAGE_CIF_COLS) 1155ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width = STV_IMAGE_CIF_COLS; 1156ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (height > STV_IMAGE_CIF_ROWS) 1157ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox height = STV_IMAGE_CIF_ROWS; 1158ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1159ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_size = cpia2_match_video_size(width, height); 1160ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1161ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Config 410: width = %d, height = %d\n", width, height); 1162ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Image size returned is %d\n", image_size); 1163ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_size >= 0) { 1164ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_vw_size(cam, image_size); 1165ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width = cam->params.roi.width; 1166ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox height = cam->params.roi.height; 1167ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1168ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("After set_vw_size(), width = %d, height = %d\n", 1169ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width, height); 1170ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width <= 176 && height <= 144) { 1171ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image type = VIDEOSIZE_QCIF\n"); 1172ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QCIF; 1173ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1174ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (width <= 320 && height <= 240) { 1175ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image type = VIDEOSIZE_QVGA\n"); 1176ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QVGA; 1177ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1178ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else { 1179ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image type = VIDEOSIZE_CIF\n"); 1180ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_CIF; 1181ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1182ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1183ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("ConfigSensor410 failed\n"); 1184ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1185ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1186ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1187ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 1188ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 1189ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1190ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Format */ 1191ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT; 1192ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF) { 1193ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1194ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (CPIA2_VC_VC_FORMAT_UFIRST | 1195ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_FORMAT_SHORTLINE); 1196ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1197ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1198ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) CPIA2_VC_VC_FORMAT_UFIRST; 1199ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1200ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1201ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Clocks */ 1202ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS; 1203ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) { 1204ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 1205ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value= 1206ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_672_CLOCKS_CIF_DIV_BY_3 | 1207ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_672_CLOCKS_SCALING | 1208ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV2); 1209ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("VC_Clocks (0xc4) should be B\n"); 1210ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1211ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else { 1212ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value= 1213ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_676_CLOCKS_CIF_DIV_BY_3 | 1214ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV2); 1215ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1216ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1217ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 1218ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1219ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (CPIA2_VC_VC_672_CLOCKS_CIF_DIV_BY_3 | 1220ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV0); 1221ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1222ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else { 1223ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1224ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (CPIA2_VC_VC_676_CLOCKS_CIF_DIV_BY_3 | 1225ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_676_CLOCKS_SCALING | 1226ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV0); 1227ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1228ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1229ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("VC_Clocks (0xc4) = 0x%0X\n", cmd.buffer.registers[i-1].value); 1230ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1231ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Input reqWidth from VC */ 1232ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO; 1233ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1234ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1235ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_QCIF_COLS / 4); 1236ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1237ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1238ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_CIF_COLS / 4); 1239ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1240ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Timings */ 1241ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI; 1242ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1243ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1244ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1245ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1246ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1247ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO; 1248ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1249ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 208; 1250ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1251ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 160; 1252ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1253ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI; 1254ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1255ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1256ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1257ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1258ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1259ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO; 1260ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1261ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 160; 1262ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1263ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 64; 1264ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1265ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Output Image Size */ 1266ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE; 1267ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = cam->params.roi.width / 4; 1268ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1269ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE; 1270ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = cam->params.roi.height / 4; 1271ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1272ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Cropping */ 1273ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP; 1274ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1275ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1276ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2); 1277ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1278ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1279ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2); 1280ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1281ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP; 1282ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1283ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1284ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2); 1285ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1286ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1287ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2); 1288ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1289ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Scaling registers (defaults) */ 1290ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE; 1291ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1292ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1293ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE; 1294ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1295ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1296ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN; 1297ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1298ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1299ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN; 1300ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1301ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1302ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP; 1303ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1304ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1305ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP; 1306ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1307ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1308ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT; 1309ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* = 8/1 = 8 (HIBYTE/LOBYTE) */ 1310ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1311ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT; 1312ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* = 8/1 = 8 (HIBYTE/LOBYTE) */ 1313ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1314ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = i; 1315ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1316ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1317ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1318ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return i; 1319ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1320ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1321ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1322ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1323ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1324ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * config_sensor_500(cam) 1325ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1326ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1327ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int config_sensor_500(struct camera_data *cam, 1328ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int req_width, int req_height) 1329ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1330ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1331ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i = 0; 1332ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_size = VIDEOSIZE_CIF; 1333ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_type = VIDEOSIZE_VGA; 1334ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int width = req_width; 1335ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int height = req_height; 1336ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned int device = cam->params.pnp_id.device_type; 1337ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1338ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_size = cpia2_match_video_size(width, height); 1339ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1340ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width > STV_IMAGE_CIF_COLS || height > STV_IMAGE_CIF_ROWS) 1341ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_VGA; 1342ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (width > STV_IMAGE_QVGA_COLS || height > STV_IMAGE_QVGA_ROWS) 1343ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_CIF; 1344ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (width > STV_IMAGE_QCIF_COLS || height > STV_IMAGE_QCIF_ROWS) 1345ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QVGA; 1346ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1347ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QCIF; 1348ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1349ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_size >= 0) { 1350ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_vw_size(cam, image_size); 1351ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width = cam->params.roi.width; 1352ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox height = cam->params.roi.height; 1353ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1354ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("ConfigSensor500 failed\n"); 1355ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1356ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1357ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1358ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image_size = %d, width = %d, height = %d, type = %d\n", 1359ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_size, width, height, image_type); 1360ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1361ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 1362ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 1363ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i = 0; 1364ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1365ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Format */ 1366ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT; 1367ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = (u8) CPIA2_VC_VC_FORMAT_UFIRST; 1368ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1369ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value |= (u8) CPIA2_VC_VC_FORMAT_DECIMATING; 1370ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i++; 1371ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1372ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Clocks */ 1373ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS; 1374ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) { 1375ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1376ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1377ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)CPIA2_VC_VC_CLOCKS_LOGDIV1; 1378ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1379ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1380ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_672_CLOCKS_SCALING | 1381ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV3); 1382ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1383ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1384ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1385ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)CPIA2_VC_VC_CLOCKS_LOGDIV0; 1386ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1387ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1388ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_676_CLOCKS_SCALING | 1389ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV2); 1390ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1391ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i++; 1392ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1393ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("VC_CLOCKS = 0x%X\n", cmd.buffer.registers[i-1].value); 1394ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1395ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Input width from VP */ 1396ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO; 1397ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1398ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1399ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_VGA_COLS / 4); 1400ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1401ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1402ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_QVGA_COLS / 4); 1403ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i++; 1404ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Input width = %d\n", cmd.buffer.registers[i-1].value); 1405ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1406ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Timings */ 1407ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI; 1408ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1409ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 2; 1410ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1411ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1412ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1413ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO; 1414ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1415ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 250; 1416ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1417ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 125; 1418ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1419ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 160; 1420ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1421ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI; 1422ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1423ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 2; 1424ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1425ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1426ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1427ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO; 1428ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1429ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 12; 1430ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1431ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 64; 1432ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1433ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 6; 1434ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1435ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Output Image Size */ 1436ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE; 1437ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1438ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = STV_IMAGE_CIF_COLS / 4; 1439ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1440ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = width / 4; 1441ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1442ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE; 1443ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1444ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = STV_IMAGE_CIF_ROWS / 4; 1445ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1446ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = height / 4; 1447ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1448ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Cropping */ 1449ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP; 1450ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1451ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1452ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_VGA_COLS / 4) - (width / 4)) / 2); 1453ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1454ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1455ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QVGA_COLS / 4) - (width / 4)) / 2); 1456ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_CIF) 1457ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1458ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2); 1459ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else /*if (image_type == VIDEOSIZE_QCIF)*/ 1460ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1461ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2); 1462ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1463ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP; 1464ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1465ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1466ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_VGA_ROWS / 4) - (height / 4)) / 2); 1467ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1468ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1469ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QVGA_ROWS / 4) - (height / 4)) / 2); 1470ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_CIF) 1471ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1472ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2); 1473ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else /*if (image_type == VIDEOSIZE_QCIF)*/ 1474ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1475ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2); 1476ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1477ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Scaling registers (defaults) */ 1478ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE; 1479ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1480ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 36; 1481ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1482ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1483ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1484ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE; 1485ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1486ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 32; 1487ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1488ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1489ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1490ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN; 1491ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1492ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 26; 1493ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1494ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1495ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1496ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN; 1497ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1498ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 21; 1499ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1500ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1501ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1502ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP; 1503ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1504ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1505ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP; 1506ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1507ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1508ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT; 1509ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1510ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x2B; /* 2/11 */ 1511ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1512ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* 8/1 */ 1513ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1514ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT; 1515ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1516ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x13; /* 1/3 */ 1517ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1518ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* 8/1 */ 1519ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1520ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = i; 1521ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1522ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1523ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1524ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return i; 1525ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1526ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1527ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1528ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1529ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1530ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * setallproperties 1531ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1532ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * This sets all user changeable properties to the values in cam->params. 1533ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1534d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic int set_all_properties(struct camera_data *cam) 1535ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1536ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /** 1537ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Don't set target_kb here, it will be set later. 1538ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * framerate and user_mode were already set (set_default_user_mode). 1539ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox **/ 1540ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1541ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_color_params(cam); 1542ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1543ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_change_streaming_alternate(cam, 1544ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.stream_mode); 1545ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1546ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, 1547ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.user_effects); 1548ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1549ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_flicker_mode(cam, 1550ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req); 1551ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1552ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 1553ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 1554ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam->params.vp_params.gpio_direction); 1555ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, TRANSFER_WRITE, 1556ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data); 1557ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1558ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox wake_system(cam); 1559ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1560ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_lowlight_boost(cam); 1561ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1562ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1563ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1564ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1565ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1566ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1567ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_save_camera_state 1568ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1569ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1570ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_save_camera_state(struct camera_data *cam) 1571ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1572ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox get_color_params(cam); 1573ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); 1574ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION, TRANSFER_READ, 1575ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 0); 1576ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DATA, TRANSFER_READ, 0); 1577ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Don't get framerate or target_kb. Trust the values we already have */ 1578ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1579ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1580ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1581ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1582ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * get_color_params 1583ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1584ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1585d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void get_color_params(struct camera_data *cam) 1586ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1587ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_BRIGHTNESS, TRANSFER_READ, 0); 1588ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SATURATION, TRANSFER_READ, 0); 1589ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_CONTRAST, TRANSFER_READ, 0); 1590ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1591ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1592ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1593ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1594ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_color_params 1595ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1596ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1597ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_color_params(struct camera_data *cam) 1598ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1599ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting color params\n"); 1600ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_brightness(cam, cam->params.color_params.brightness); 1601ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_contrast(cam, cam->params.color_params.contrast); 1602ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_saturation(cam, cam->params.color_params.saturation); 1603ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1604ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1605ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1606ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1607ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_flicker_mode 1608ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1609ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1610ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_flicker_mode(struct camera_data *cam, int mode) 1611ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1612ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char cam_reg; 1613ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int err = 0; 1614ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1615ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.pnp_id.device_type != DEVICE_STV_672) 1616ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1617ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1618ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the appropriate bits in FLICKER_MODES, preserving the rest */ 1619ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_GET_FLICKER_MODES, 1620ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0))) 1621ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1622ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.flicker_control.cam_register; 1623ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1624ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch(mode) { 1625ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case NEVER_FLICKER: 1626ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; 1627ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ; 1628ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1629ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_60: 1630ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; 1631ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ; 1632ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1633ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_50: 1634ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; 1635ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_FLICKER_MODES_50HZ; 1636ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1637ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1638ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1639ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1640ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1641ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_SET_FLICKER_MODES, 1642ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam_reg))) 1643ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1644ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1645ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the appropriate bits in EXP_MODES, preserving the rest */ 1646ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_GET_VP_EXP_MODES, 1647ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0))) 1648ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1649ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.vp_params.exposure_modes; 1650ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1651ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (mode == NEVER_FLICKER) { 1652ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER; 1653ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1654ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER; 1655ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1656ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1657ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_SET_VP_EXP_MODES, 1658ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam_reg))) 1659ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1660ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1661ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, 1662ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 1))) 1663ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1664ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1665ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch(mode) { 1666ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case NEVER_FLICKER: 1667ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req = mode; 1668ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1669ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_60: 1670ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req = mode; 1671ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.mains_frequency = 60; 1672ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1673ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_50: 1674ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req = mode; 1675ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.mains_frequency = 50; 1676ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1677ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1678ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox err = -EINVAL; 1679ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1680ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1681ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1682ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1683ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1684ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1685ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1686ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_property_flip 1687ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1688ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1689ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_property_flip(struct camera_data *cam, int prop_val) 1690ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1691ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char cam_reg; 1692ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1693ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); 1694ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.vp_params.user_effects; 1695ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1696ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (prop_val) 1697ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1698ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_USER_EFFECTS_FLIP; 1699ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1700ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1701ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1702ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_USER_EFFECTS_FLIP; 1703ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1704ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, 1705ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg); 1706ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1707ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1708ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1709ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1710ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_property_mirror 1711ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1712ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1713ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_property_mirror(struct camera_data *cam, int prop_val) 1714ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1715ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char cam_reg; 1716ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1717ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); 1718ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.vp_params.user_effects; 1719ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1720ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (prop_val) 1721ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1722ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_USER_EFFECTS_MIRROR; 1723ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1724ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1725ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1726ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_USER_EFFECTS_MIRROR; 1727ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1728ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, 1729ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg); 1730ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1731ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1732ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1733ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1734ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * set_target_kb 1735ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1736ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * The new Target KB is set in cam->params.vc_params.target_kb and 1737ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * activates on reset. 1738ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1739ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1740ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_target_kb(struct camera_data *cam, unsigned char value) 1741ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1742ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Requested target_kb = %d\n", value); 1743ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (value != cam->params.vc_params.target_kb) { 1744ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1745ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_pause(cam); 1746ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1747ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* reset camera for new target_kb */ 1748ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.target_kb = value; 1749ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_reset_camera(cam); 1750ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1751ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_resume(cam); 1752ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1753ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1754ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1755ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1756ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1757ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1758ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1759ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_gpio 1760ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1761ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1762ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_gpio(struct camera_data *cam, unsigned char setting) 1763ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1764ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int ret; 1765ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1766ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the microport direction (register 0x90, should be defined 1767ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * already) to 1 (user output), and set the microport data (0x91) to 1768ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * the value in the ioctl argument. 1769ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox */ 1770ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1771ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ret = cpia2_do_command(cam, 1772ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 1773ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_MP_DIR_OUTPUT, 1774ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 255); 1775ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (ret < 0) 1776ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return ret; 1777ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_direction = 255; 1778ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1779ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ret = cpia2_do_command(cam, 1780ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VC_MP_GPIO_DATA, 1781ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_MP_DIR_OUTPUT, 1782ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox setting); 1783ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (ret < 0) 1784ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return ret; 1785ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data = setting; 1786ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1787ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1788ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1789ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1790ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1791ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1792ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_fps 1793ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1794ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1795ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_fps(struct camera_data *cam, int framerate) 1796ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1797ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval; 1798ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1799ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch(framerate) { 1800ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_30: 1801ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_25: 1802ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.pnp_id.device_type == DEVICE_STV_672 && 1803ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags == 1804ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_SENSOR_FLAGS_500) { 1805ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1806ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1807ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Fall through */ 1808ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_15: 1809ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_12_5: 1810ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_7_5: 1811ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_6_25: 1812ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1813ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1814ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1815ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1816ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1817ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672 && 1818ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox framerate == CPIA2_VP_FRAMERATE_15) 1819ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox framerate = 0; /* Work around bug in VP4 */ 1820ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1821ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = cpia2_do_command(cam, 1822ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_FRAMERATE_REQ, 1823ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 1824ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox framerate); 1825ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1826ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(retval == 0) 1827ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = framerate; 1828ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1829ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 1830ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1831ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1832ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1833ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1834ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_brightness 1835ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1836ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1837ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_brightness(struct camera_data *cam, unsigned char value) 1838ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1839ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 1840ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Don't let the register be set to zero - bug in VP4 - flash of full 1841ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * brightness 1842ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 1843ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672 && value == 0) 1844ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox value++; 1845ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting brightness to %d (0x%0x)\n", value, value); 1846ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam,CPIA2_CMD_SET_VP_BRIGHTNESS, TRANSFER_WRITE,value); 1847ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1848ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1849ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1850ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1851ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_contrast 1852ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1853ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1854ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_contrast(struct camera_data *cam, unsigned char value) 1855ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1856ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting contrast to %d (0x%0x)\n", value, value); 1857ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.color_params.contrast = value; 1858ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_CONTRAST, TRANSFER_WRITE, value); 1859ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1860ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1861ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1862ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1863ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_saturation 1864ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1865ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1866ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_saturation(struct camera_data *cam, unsigned char value) 1867ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1868ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting saturation to %d (0x%0x)\n", value, value); 1869ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.color_params.saturation = value; 1870ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam,CPIA2_CMD_SET_VP_SATURATION, TRANSFER_WRITE,value); 1871ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1872ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1873ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1874ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1875ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * wake_system 1876ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1877ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1878d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void wake_system(struct camera_data *cam) 1879ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1880ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_WAKEUP, TRANSFER_WRITE, 0); 1881ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1882ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1883ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1884ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1885ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * set_lowlight_boost 1886ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1887ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Valid for STV500 sensor only 1888ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1889d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void set_lowlight_boost(struct camera_data *cam) 1890ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1891ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1892ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1893ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type != DEVICE_STV_672 || 1894ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags != CPIA2_VP_SENSOR_FLAGS_500) 1895ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return; 1896ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1897ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 1898ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 1899ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 3; 1900ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_RAM_ADDR_H; 1901ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1902ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0; /* High byte of address to write to */ 1903ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1] = 0x59; /* Low byte of address to write to */ 1904ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2] = 0; /* High byte of data to write */ 1905ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1906ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1907ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1908ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.vp_params.lowlight_boost) { 1909ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0x02; /* Low byte data to write */ 1910ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1911ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0x06; 1912ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1913ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_RAM_DATA; 1914ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 1915ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1916ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1917ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Rehash the VP4 values */ 1918ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, TRANSFER_WRITE, 1); 1919ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1920ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1921ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1922ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1923ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_format 1924ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1925ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Assumes that new size is already set in param struct. 1926ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1927ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_format(struct camera_data *cam) 1928ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1929ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->flush = true; 1930ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1931ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_pause(cam); 1932ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1933ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* reset camera to new size */ 1934ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_low_power(cam); 1935ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_reset_camera(cam); 1936ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->flush = false; 1937ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1938ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_dbg_dump_registers(cam); 1939ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1940ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_resume(cam); 1941ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1942ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1943ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1944ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1945ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_dbg_dump_registers 1946ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1947ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1948ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_dbg_dump_registers(struct camera_data *cam) 1949ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1950ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifdef _CPIA2_DEBUG_ 1951ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1952ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1953ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!(debugs_on & DEBUG_DUMP_REGS)) 1954ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return; 1955ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1956ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_READ; 1957ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1958ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start with bank 0 (SYSTEM) */ 1959ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 1960ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 3; 1961ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 1962ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1963ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "System Device Hi = 0x%X\n", 1964ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1965ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "System Device Lo = 0x%X\n", 1966ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 1967ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "System_system control = 0x%X\n", 1968ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 1969ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1970ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Bank 1 (VC) */ 1971ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 1972ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 4; 1973ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x80; 1974ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1975ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "ASIC_ID = 0x%X\n", 1976ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1977ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "ASIC_REV = 0x%X\n", 1978ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 1979ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "PW_CONTRL = 0x%X\n", 1980ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 1981ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "WAKEUP = 0x%X\n", 1982ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 1983ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1984ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xA0; /* ST_CTRL */ 1985ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 1986ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1987ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "Stream ctrl = 0x%X\n", 1988ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1989ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1990ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xA4; /* Stream status */ 1991ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1992ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "Stream status = 0x%X\n", 1993ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1994ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1995ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xA8; /* USB status */ 1996ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 3; 1997ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1998ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB_CTRL = 0x%X\n", 1999ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2000ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB_STRM = 0x%X\n", 2001ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2002ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB_STATUS = 0x%X\n", 2003ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2004ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2005ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xAF; /* USB settings */ 2006ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 2007ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2008ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB settings = 0x%X\n", 2009ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2010ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2011ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xC0; /* VC stuff */ 2012ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 26; 2013ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2014ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Control = 0x%0X\n", 2015ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2016ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Format = 0x%0X\n", 2017ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2018ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Clocks = 0x%0X\n", 2019ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[4]); 2020ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC IHSize = 0x%0X\n", 2021ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2022ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Xlim Hi = 0x%0X\n", 2023ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2024ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC XLim Lo = 0x%0X\n", 2025ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2026ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC YLim Hi = 0x%0X\n", 2027ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[8]); 2028ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC YLim Lo = 0x%0X\n", 2029ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[9]); 2030ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC OHSize = 0x%0X\n", 2031ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[10]); 2032ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC OVSize = 0x%0X\n", 2033ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[11]); 2034ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HCrop = 0x%0X\n", 2035ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[12]); 2036ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC VCrop = 0x%0X\n", 2037ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[13]); 2038ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HPhase = 0x%0X\n", 2039ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[14]); 2040ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC VPhase = 0x%0X\n", 2041ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[15]); 2042ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HIspan = 0x%0X\n", 2043ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[16]); 2044ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC VIspan = 0x%0X\n", 2045ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[17]); 2046ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HiCrop = 0x%0X\n", 2047ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[18]); 2048ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC ViCrop = 0x%0X\n", 2049ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[19]); 2050ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HiFract = 0x%0X\n", 2051ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[20]); 2052ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC ViFract = 0x%0X\n", 2053ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[21]); 2054ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC JPeg Opt = 0x%0X\n", 2055ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[22]); 2056ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Creep Per = 0x%0X\n", 2057ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[23]); 2058ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC User Sq. = 0x%0X\n", 2059ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[24]); 2060ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Target KB = 0x%0X\n", 2061ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[25]); 2062ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2063ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** VP ***/ 2064ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 2065ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 14; 2066ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 2067ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2068ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2069ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Dev Hi = 0x%0X\n", 2070ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2071ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Dev Lo = 0x%0X\n", 2072ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2073ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sys State = 0x%0X\n", 2074ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2075ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sys Ctrl = 0x%0X\n", 2076ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2077ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sensor flg = 0x%0X\n", 2078ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2079ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sensor Rev = 0x%0X\n", 2080ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2081ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Dev Config = 0x%0X\n", 2082ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2083ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP GPIO_DIR = 0x%0X\n", 2084ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[8]); 2085ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP GPIO_DATA = 0x%0X\n", 2086ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[9]); 2087ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Ram ADDR H = 0x%0X\n", 2088ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[10]); 2089ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Ram ADDR L = 0x%0X\n", 2090ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[11]); 2091ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP RAM Data = 0x%0X\n", 2092ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[12]); 2093ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "Do Call = 0x%0X\n", 2094ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[13]); 2095ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2096ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 2097ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 9; 2098ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x0E; 2099ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2100ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n", 2101ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2102ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Patch Rev = 0x%0X\n", 2103ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2104ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Vid Mode = 0x%0X\n", 2105ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2106ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Framerate = 0x%0X\n", 2107ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2108ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP UserEffect = 0x%0X\n", 2109ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[4]); 2110ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP White Bal = 0x%0X\n", 2111ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2112ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP WB thresh = 0x%0X\n", 2113ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2114ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Exp Modes = 0x%0X\n", 2115ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2116ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Exp Target = 0x%0X\n", 2117ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[8]); 2118ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2119ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 2120ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x1B; 2121ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2122ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP FlickerMds = 0x%0X\n", 2123ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2124ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 2125ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 8 ; 2126ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x0E; 2127ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2128ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n", 2129ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2130ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Patch Rev = 0x%0X\n", 2131ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2132ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Vid Mode = 0x%0X\n", 2133ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2134ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Framerate = 0x%0X\n", 2135ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2136ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP UserEffect = 0x%0X\n", 2137ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2138ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2139ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 2140ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_EXPOSURE_TARGET; 2141ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2142ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 Exp Target= 0x%0X\n", 2143ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2144ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2145ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 4; 2146ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x3A; 2147ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2148ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MY Black = 0x%0X\n", 2149ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2150ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MCY Range = 0x%0X\n", 2151ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2152ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MYCEILING = 0x%0X\n", 2153ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2154ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MCUV Sat = 0x%0X\n", 2155ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2156ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2157ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif 2158ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2159ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2160ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2161ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2162ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * reset_camera_struct 2163ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2164ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Sets all values to the defaults 2165ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2166d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void reset_camera_struct(struct camera_data *cam) 2167ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2168ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 2169ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * The following parameter values are the defaults from the register map. 2170ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 2171ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.color_params.brightness = DEFAULT_BRIGHTNESS; 2172ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.color_params.contrast = DEFAULT_CONTRAST; 2173ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.color_params.saturation = DEFAULT_SATURATION; 2174ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.lowlight_boost = 0; 2175ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2176ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* FlickerModes */ 2177ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req = NEVER_FLICKER; 2178ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.mains_frequency = 60; 2179ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2180ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* jpeg params */ 2181ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.jpeg_options = CPIA2_VC_VC_JPEG_OPT_DEFAULT; 2182ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.creep_period = 2; 2183ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.user_squeeze = 20; 2184ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.inhibit_htables = false; 2185ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2186ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* gpio params */ 2187ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_direction = 0; /* write, the default safe mode */ 2188ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data = 0; 2189ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2190ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Target kb params */ 2191ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.target_kb = DEFAULT_TARGET_KB; 2192ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2193ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 2194ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set Sensor FPS as fast as possible. 2195ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 2196ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.pnp_id.device_type == DEVICE_STV_672) { 2197ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500) 2198ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_15; 2199ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 2200ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_30; 2201ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 2202ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_30; 2203ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2204ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2205ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 2206ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set default video mode as large as possible : 2207ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * for vga sensor set to vga, for cif sensor set to CIF. 2208ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 2209ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500) { 2210ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->sensor_type = CPIA2_SENSOR_500; 2211ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->video_size = VIDEOSIZE_VGA; 2212ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_VGA_COLS; 2213ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_VGA_ROWS; 2214ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 2215ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->sensor_type = CPIA2_SENSOR_410; 2216ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->video_size = VIDEOSIZE_CIF; 2217ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_CIF_COLS; 2218ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_CIF_ROWS; 2219ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2220ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2221873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = cam->params.roi.width; 2222873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = cam->params.roi.height; 2223ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2224ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2225ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2226ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2227ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_init_camera_struct 2228ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2229ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Initializes camera struct, does not call reset to fill in defaults. 2230ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2231ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct camera_data *cpia2_init_camera_struct(void) 2232ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2233ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct camera_data *cam; 2234ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2235dd00cc486ab1c17049a535413d1751ef3482141cYoann Padioleau cam = kzalloc(sizeof(*cam), GFP_KERNEL); 2236ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2237ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam) { 2238ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("couldn't kmalloc cpia2 struct\n"); 2239ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return NULL; 2240ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2241ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2242ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2243ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->present = 1; 2244d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil mutex_init(&cam->v4l2_lock); 2245ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox init_waitqueue_head(&cam->wq_stream); 2246ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2247ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return cam; 2248ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2249ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2250ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2251ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2252ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_init_camera 2253ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2254ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Initializes camera. 2255ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2256ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_init_camera(struct camera_data *cam) 2257ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2258ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Start\n"); 2259ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2260ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->mmapped = false; 2261ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2262ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Get sensor and asic types before reset. */ 2263ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_high_power(cam); 2264ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_get_version_info(cam); 2265ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.version.asic_id != CPIA2_ASIC_672) { 2266ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("Device IO error (asicID has incorrect value of 0x%X\n", 2267ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.asic_id); 2268ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENODEV; 2269ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2270ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2271ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set GPIO direction and data to a safe state. */ 2272ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 2273ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 0); 2274ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, 2275ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 0); 2276ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2277ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* resetting struct requires version info for sensor and asic types */ 2278ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox reset_camera_struct(cam); 2279ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2280ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_low_power(cam); 2281ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2282ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("End\n"); 2283ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2284ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2285ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2286ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2287ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2288ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2289ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_allocate_buffers 2290ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2291ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2292ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_allocate_buffers(struct camera_data *cam) 2293ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2294ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 2295ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2296ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->buffers) { 2297ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u32 size = cam->num_frames*sizeof(struct framebuf); 2298ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers = kmalloc(size, GFP_KERNEL); 2299ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->buffers) { 2300ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("couldn't kmalloc frame buffer structures\n"); 2301ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENOMEM; 2302ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2303ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2304ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2305ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->frame_buffer) { 2306ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->frame_buffer = rvmalloc(cam->frame_size*cam->num_frames); 2307ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam->frame_buffer) { 2308ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("couldn't vmalloc frame buffer data area\n"); 2309ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox kfree(cam->buffers); 2310ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers = NULL; 2311ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENOMEM; 2312ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2313ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2314ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2315ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for(i=0; i<cam->num_frames-1; ++i) { 2316ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].next = &cam->buffers[i+1]; 2317ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].data = cam->frame_buffer +i*cam->frame_size; 2318ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].status = FRAME_EMPTY; 2319ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].length = 0; 2320ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].max_length = 0; 2321ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].num = i; 2322ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2323ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].next = cam->buffers; 2324ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].data = cam->frame_buffer +i*cam->frame_size; 2325ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].status = FRAME_EMPTY; 2326ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].length = 0; 2327ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].max_length = 0; 2328ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].num = i; 2329ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->curbuff = cam->buffers; 2330ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->workbuff = cam->curbuff->next; 2331ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("buffers=%p, curbuff=%p, workbuff=%p\n", cam->buffers, cam->curbuff, 2332ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->workbuff); 2333ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2334ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2335ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2336ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2337ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2338ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_free_buffers 2339ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2340ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2341ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_free_buffers(struct camera_data *cam) 2342ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2343ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->buffers) { 2344ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox kfree(cam->buffers); 2345ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers = NULL; 2346ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2347ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->frame_buffer) { 2348ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox rvfree(cam->frame_buffer, cam->frame_size*cam->num_frames); 2349ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->frame_buffer = NULL; 2350ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2351ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2352ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2353ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2354ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2355ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_read 2356ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2357ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2358ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxlong cpia2_read(struct camera_data *cam, 2359ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox char __user *buf, unsigned long count, int noblock) 2360ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2361ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct framebuf *frame; 2362d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil 2363d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!count) 2364ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2365ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2366ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!buf) { 236794205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison ERR("%s: buffer NULL\n",__func__); 2368ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 2369ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2370ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2371ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam) { 237294205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison ERR("%s: Internal error, camera_data NULL!\n",__func__); 2373ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 2374ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2375ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2376ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam->present) { 237794205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison LOG("%s: camera removed\n",__func__); 2378ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; /* EOF */ 2379ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2380ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2381d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!cam->streaming) { 2382ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start streaming */ 2383ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_start(cam, 2384ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.stream_mode); 2385ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2386ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2387ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Copy cam->curbuff in case it changes while we're processing */ 2388ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame = cam->curbuff; 2389ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (noblock && frame->status != FRAME_READY) { 2390ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EAGAIN; 2391ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2392ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2393d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (frame->status != FRAME_READY) { 2394d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil mutex_unlock(&cam->v4l2_lock); 2395ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox wait_event_interruptible(cam->wq_stream, 2396ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox !cam->present || 2397ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (frame = cam->curbuff)->status == FRAME_READY); 2398d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil mutex_lock(&cam->v4l2_lock); 2399ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (signal_pending(current)) 2400ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ERESTARTSYS; 2401d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!cam->present) 2402ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2403ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2404ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2405ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* copy data to user space */ 2406d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (frame->length > count) 2407ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EFAULT; 2408d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (copy_to_user(buf, frame->data, frame->length)) 2409ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EFAULT; 2410ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2411ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = frame->length; 2412ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2413ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame->status = FRAME_EMPTY; 2414ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2415ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return count; 2416ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2417ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2418ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2419ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2420ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_poll 2421ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2422ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2423ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxunsigned int cpia2_poll(struct camera_data *cam, struct file *filp, 2424ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox poll_table *wait) 2425ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2426ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned int status=0; 2427ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2428d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!cam) { 242994205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison ERR("%s: Internal error, camera_data not found!\n",__func__); 2430ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return POLLERR; 2431ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2432ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2433d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!cam->present) 2434ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return POLLHUP; 2435ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2436ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->streaming) { 2437ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start streaming */ 2438ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_start(cam, 2439ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.stream_mode); 2440ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2441ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2442ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox poll_wait(filp, &cam->wq_stream, wait); 2443ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2444ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->present) 2445ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox status = POLLHUP; 2446ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if(cam->curbuff->status == FRAME_READY) 2447ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox status = POLLIN | POLLRDNORM; 2448ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2449ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return status; 2450ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2451ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2452ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2453ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2454ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_remap_buffer 2455ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2456ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2457ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma) 2458ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2459ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox const char *adr = (const char *)vma->vm_start; 2460ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long size = vma->vm_end-vma->vm_start; 2461ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long start_offset = vma->vm_pgoff << PAGE_SHIFT; 2462ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long start = (unsigned long) adr; 2463ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long page, pos; 2464ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2465ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam) 2466ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENODEV; 2467ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2468ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("mmap offset:%ld size:%ld\n", start_offset, size); 2469ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2470d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!cam->present) 2471ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENODEV; 2472ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2473ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (size > cam->frame_size*cam->num_frames || 2474ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (start_offset % cam->frame_size) != 0 || 2475d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil (start_offset+size > cam->frame_size*cam->num_frames)) 2476ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 2477ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2478ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox pos = ((unsigned long) (cam->frame_buffer)) + start_offset; 2479ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox while (size > 0) { 2480ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox page = kvirt_to_pa(pos); 2481d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (remap_pfn_range(vma, start, page >> PAGE_SHIFT, PAGE_SIZE, PAGE_SHARED)) 2482ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EAGAIN; 2483ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start += PAGE_SIZE; 2484ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox pos += PAGE_SIZE; 2485ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (size > PAGE_SIZE) 2486ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size -= PAGE_SIZE; 2487ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 2488ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size = 0; 2489ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2490ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2491ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->mmapped = true; 2492ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2493ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2494