1ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************
2ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
3ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  Filename: cpia2.h
4ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
5ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  Copyright 2001, STMicrolectronics, Inc.
6ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
7ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  Contact:  steve.miller@st.com
8ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
9ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  Description:
10ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *     This is a USB driver for CPiA2 based video cameras.
11ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
12ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *     This driver is modelled on the cpia usb driver by
13ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *     Jochen Scharrlach and Johannes Erdfeldt.
14ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
15ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  This program is free software; you can redistribute it and/or modify
16ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  it under the terms of the GNU General Public License as published by
17ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  the Free Software Foundation; either version 2 of the License, or
18ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  (at your option) any later version.
19ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
20ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  This program is distributed in the hope that it will be useful,
21ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  but WITHOUT ANY WARRANTY; without even the implied warranty of
22ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  GNU General Public License for more details.
24ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
25ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  You should have received a copy of the GNU General Public License
26ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  along with this program; if not, write to the Free Software
27ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *
29ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ****************************************************************************/
30ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
31ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifndef __CPIA2_H__
32ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define __CPIA2_H__
33ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
34873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil#include <linux/videodev2.h>
35ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#include <linux/usb.h>
36ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#include <linux/poll.h>
376c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil#include <media/v4l2-common.h>
386c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil#include <media/v4l2-device.h>
396c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil#include <media/v4l2-ctrls.h>
40ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
41ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#include "cpia2_registers.h"
42ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
43ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* define for verbose debug output */
44ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox//#define _CPIA2_DEBUG_
45ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
46ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/***
47ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Image defines
48ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/
49ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
50ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/*  Misc constants */
51ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define ALLOW_CORRUPT 0		/* Causes collater to discard checksum */
52ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
53ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* USB Transfer mode */
54ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define XFER_ISOC 0
55ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define XFER_BULK 1
56ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
57ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* USB Alternates */
58ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_CMDONLY 0
59ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_BULK 1
60ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_ISO_1 2	/*  128 bytes/ms */
61ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_ISO_2 3	/*  384 bytes/ms */
62ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_ISO_3 4	/*  640 bytes/ms */
63ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_ISO_4 5	/*  768 bytes/ms */
64ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_ISO_5 6	/*  896 bytes/ms */
65ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define USBIF_ISO_6 7	/* 1023 bytes/ms */
66ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
67ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Flicker Modes */
68ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define NEVER_FLICKER   0
69ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define FLICKER_60      60
70ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define FLICKER_50      50
71ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
72ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Debug flags */
73ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEBUG_NONE          0
74ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEBUG_REG           0x00000001
75ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEBUG_DUMP_PATCH    0x00000002
76ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEBUG_DUMP_REGS     0x00000004
77ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
78ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/***
79ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Video frame sizes
80ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/
81ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxenum {
82ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_VGA = 0,	/* 640x480 */
83ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_CIF,		/* 352x288 */
84ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_QVGA,		/* 320x240 */
85ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_QCIF,		/* 176x144 */
86ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_288_216,
87ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_256_192,
88ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_224_168,
89ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	VIDEOSIZE_192_144,
90ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
91ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
92ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_CIF_ROWS    288
93ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_CIF_COLS    352
94ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
95ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_QCIF_ROWS   144
96ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_QCIF_COLS   176
97ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
98ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_VGA_ROWS    480
99ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_VGA_COLS    640
100ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
101ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_QVGA_ROWS   240
102ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define STV_IMAGE_QVGA_COLS   320
103ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
104ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define JPEG_MARKER_COM (1<<6)	/* Comment segment */
105ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
106ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/***
107ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Enums
108ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/
109ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Sensor types available with cpia2 asics */
110ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxenum sensors {
111ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_SENSOR_410,
112ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_SENSOR_500
113ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
114ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
115ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Asic types available in the CPiA2 architecture */
116ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define  CPIA2_ASIC_672 0x67
117ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
118ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Device types (stv672, stv676, etc) */
119ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define  DEVICE_STV_672   0x0001
120ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define  DEVICE_STV_676   0x0002
121ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
122ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxenum frame_status {
123ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	FRAME_EMPTY,
124ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	FRAME_READING,		/* In the process of being grabbed into */
125ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	FRAME_READY,		/* Ready to be read */
126ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	FRAME_ERROR,
127ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
128ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
129ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/***
130ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Register access (for USB request byte)
131ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/
132ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxenum {
133ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CAMERAACCESS_SYSTEM = 0,
134ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CAMERAACCESS_VC,
135ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CAMERAACCESS_VP,
136ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CAMERAACCESS_IDATA
137ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
138ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
139ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMERAACCESS_TYPE_BLOCK    0x00
140ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMERAACCESS_TYPE_RANDOM   0x04
141ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMERAACCESS_TYPE_MASK     0x08
142ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMERAACCESS_TYPE_REPEAT   0x0C
143ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
144ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define TRANSFER_READ 0
145ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define TRANSFER_WRITE 1
146ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
147ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEFAULT_ALT   USBIF_ISO_6
148ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEFAULT_BRIGHTNESS 0x46
149ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEFAULT_CONTRAST 0x93
150ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DEFAULT_SATURATION 0x7f
151ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
152ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Power state */
153ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define HI_POWER_MODE CPIA2_SYSTEM_CONTROL_HIGH_POWER
154ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define LO_POWER_MODE CPIA2_SYSTEM_CONTROL_LOW_POWER
155ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
156ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
157ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/********
158ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Commands
159ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *******/
160ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxenum {
161ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_NONE = 0,
162ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VERSION,
163ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_PNP_ID,
164ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_ASIC_TYPE,
165ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_SENSOR,
166ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_DEVICE,
167ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_BRIGHTNESS,
168ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VP_BRIGHTNESS,
169ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_CONTRAST,
170ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_CONTRAST,
171ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_SATURATION,
172ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VP_SATURATION,
173ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_GPIO_DIRECTION,
174ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VP_GPIO_DIRECTION,
175ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_GPIO_DATA,
176ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VP_GPIO_DATA,
177ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION,
178ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION,
179ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VC_MP_GPIO_DATA,
180ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VC_MP_GPIO_DATA,
181ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_ENABLE_PACKET_CTRL,
182ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_FLICKER_MODES,
183ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_FLICKER_MODES,
184ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_RESET_FIFO,	/* clear fifo and enable stream block */
185ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_HI_POWER,
186ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_LOW_POWER,
187ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_CLEAR_V2W_ERR,
188ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_USER_MODE,
189ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_USER_MODE,
190ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_FRAMERATE_REQ,
191ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_COMPRESSION_STATE,
192ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_WAKEUP,
193ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_WAKEUP,
194ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_PW_CONTROL,
195ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_PW_CONTROL,
196ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_SYSTEM_CTRL,
197ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_SYSTEM_CTRL,
198ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_SYSTEM_STATE,
199ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_SYSTEM_CTRL,
200ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VP_SYSTEM_CTRL,
201ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VP_EXP_MODES,
202ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VP_EXP_MODES,
203ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_DEVICE_CONFIG,
204ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_DEVICE_CONFIG,
205ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_SERIAL_ADDR,
206ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_SENSOR_CR1,
207ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_VC_CONTROL,
208ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_VC_CONTROL,
209ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_TARGET_KB,
210ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_DEF_JPEG_OPT,
211ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_REHASH_VP4,
212ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_GET_USER_EFFECTS,
213ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	CPIA2_CMD_SET_USER_EFFECTS
214ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
215ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
216ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxenum user_cmd {
217ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	COMMAND_NONE = 0x00000001,
218ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	COMMAND_SET_FPS = 0x00000002,
219ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	COMMAND_SET_COLOR_PARAMS = 0x00000004,
220ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	COMMAND_GET_COLOR_PARAMS = 0x00000008,
221ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	COMMAND_SET_FORMAT = 0x00000010,	/* size, etc */
222ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	COMMAND_SET_FLICKER = 0x00000020
223ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
224ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
225ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/***
226ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Some defines specific to the 676 chip
227ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/
228ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMACC_CIF      0x01
229ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMACC_VGA      0x02
230ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMACC_QCIF     0x04
231ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define CAMACC_QVGA     0x08
232ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
233ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
234ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct cpia2_register {
235ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 index;
236ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 value;
237ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
238ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
239ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct cpia2_reg_mask {
240ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 index;
241ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 and_mask;
242ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 or_mask;
243ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 fill;
244ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
245ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
246ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct cpia2_command {
247ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u32 command;
248ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 req_mode;		/* (Block or random) | registerBank */
249ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 reg_count;
250ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 direction;
251ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 start;
252ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	union reg_types {
253ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		struct cpia2_register registers[32];
254ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		struct cpia2_reg_mask masks[16];
255ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 block_data[64];
256ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 *patch_data;	/* points to function defined block */
257ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} buffer;
258ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
259ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
260ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct camera_params {
261ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
262ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 firmware_revision_hi; /* For system register set (bank 0) */
263ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 firmware_revision_lo;
264ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 asic_id;	/* Video Compressor set (bank 1) */
265ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 asic_rev;
266ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vp_device_hi;	/* Video Processor set (bank 2) */
267ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vp_device_lo;
268ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 sensor_flags;
269ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 sensor_rev;
270ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} version;
271ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
272ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
273ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u32 device_type;     /* enumerated from vendor/product ids.
274ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox				      * Currently, either STV_672 or STV_676 */
275ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u16 vendor;
276ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u16 product;
277ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u16 device_revision;
278ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} pnp_id;
279ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
280ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
281ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 brightness;	/* CPIA2_VP_EXPOSURE_TARGET */
282ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 contrast;	/* Note: this is CPIA2_VP_YRANGE */
283ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 saturation;	/*  CPIA2_VP_SATURATION */
284ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} color_params;
285ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
286ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
287ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 cam_register;
288ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 flicker_mode_req;	/* 1 if flicker on, else never flicker */
289ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} flicker_control;
290ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
291ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
292ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 jpeg_options;
293ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 creep_period;
294ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 user_squeeze;
295ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 inhibit_htables;
296ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} compression;
297ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
298ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
299ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 ohsize;	/* output image size */
300ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 ovsize;
301ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 hcrop;	/* cropping start_pos/4 */
302ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vcrop;
303ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 hphase;	/* scaling registers */
304ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vphase;
305ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 hispan;
306ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vispan;
307ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 hicrop;
308ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vicrop;
309ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 hifraction;
310ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vifraction;
311ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} image_size;
312ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
313ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
314ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		int width;	/* actual window width */
315ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		int height;	/* actual window height */
316ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} roi;
317ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
318ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
319ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 video_mode;
320ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 frame_rate;
321ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 video_size;	/* Not a register, just a convenience for cropped sizes */
322ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 gpio_direction;
323ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 gpio_data;
324ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 system_ctrl;
325ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 system_state;
326ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 lowlight_boost;	/* Bool: 0 = off, 1 = on */
327ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 device_config;
328ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 exposure_modes;
329ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 user_effects;
330ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} vp_params;
331ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
332ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
333ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 pw_control;
334ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 wakeup;
335ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vc_control;
336ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vc_mp_direction;
337ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 vc_mp_data;
3386c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil		u8 quality;
339ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} vc_params;
340ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
341ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct {
342ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 power_mode;
343ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 system_ctrl;
344ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 stream_mode;	/* This is the current alternate for usb drivers */
345ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		u8 allow_corrupt;
346ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	} camera_state;
347ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
348ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
349ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define NUM_SBUF    2
350ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
351ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct cpia2_sbuf {
352ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	char *data;
353ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct urb *urb;
354ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
355ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
356ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct framebuf {
357ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct timeval timestamp;
358ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	unsigned long seq;
359ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int num;
360ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int length;
361ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int max_length;
362ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	volatile enum frame_status status;
363ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 *data;
364ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct framebuf *next;
365ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
366ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
367ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstruct camera_data {
368ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	/* locks */
3696c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	struct v4l2_device v4l2_dev;
370d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil	struct mutex v4l2_lock;	/* serialize file operations */
3716c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	struct v4l2_ctrl_handler hdl;
3726c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	struct {
3736c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil		/* Lights control cluster */
3746c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil		struct v4l2_ctrl *top_light;
3756c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil		struct v4l2_ctrl *bottom_light;
3766c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	};
3776c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	struct v4l2_ctrl *usb_alt;
378ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
379ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	/* camera status */
380ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int first_image_seen;
381ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	enum sensors sensor_type;
382ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 flush;
3836c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	struct v4l2_fh *stream_fh;
384ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 mmapped;
385ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int streaming;		/* 0 = no, 1 = yes */
386ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int xfer_mode;		/* XFER_BULK or XFER_ISOC */
387ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct camera_params params;	/* camera settings */
388ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
389ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	/* v4l */
390ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int video_size;			/* VIDEO_SIZE_ */
3916c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil	struct video_device vdev;	/* v4l videodev */
392873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil	u32 width;
393873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil	u32 height;			/* Its size */
394ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	__u32 pixelformat;       /* Format fourcc      */
395ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
396ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	/* USB */
397ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct usb_device *dev;
398ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	unsigned char iface;
399ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	unsigned int cur_alt;
400ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	unsigned int old_alt;
401ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct cpia2_sbuf sbuf[NUM_SBUF];	/* Double buffering */
402ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
403ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	wait_queue_head_t wq_stream;
404ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
405ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	/* Buffering */
406ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u32 frame_size;
407ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int num_frames;
408ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	unsigned long frame_count;
409ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	u8 *frame_buffer;	/* frame buffer data */
410ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct framebuf *buffers;
411ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct framebuf * volatile curbuff;
412ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	struct framebuf *workbuff;
413ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
414ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	/* MJPEG Extension */
415ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int APPn;		/* Number of APP segment to be written, must be 0..15 */
416ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int APP_len;		/* Length of data in JPEG APPn segment */
417ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	char APP_data[60];	/* Data in the JPEG APPn segment. */
418ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
419ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	int COM_len;		/* Length of data in JPEG COM segment */
420ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox	char COM_data[60];	/* Data in JPEG COM segment */
421ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox};
422ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
423ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* v4l */
424ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_register_camera(struct camera_data *cam);
425ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_unregister_camera(struct camera_data *cam);
4266c493f8b28c6744995e92801a20dca192635dd22Hans Verkuilvoid cpia2_camera_release(struct v4l2_device *v4l2_dev);
427ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
428ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* core */
429ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_reset_camera(struct camera_data *cam);
430ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_low_power(struct camera_data *cam);
431ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_dbg_dump_registers(struct camera_data *cam);
432ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_match_video_size(int width, int height);
433ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_camera_state(struct camera_data *cam);
434ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_save_camera_state(struct camera_data *cam);
435ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_color_params(struct camera_data *cam);
436ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_brightness(struct camera_data *cam, unsigned char value);
437ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_contrast(struct camera_data *cam, unsigned char value);
438ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_saturation(struct camera_data *cam, unsigned char value);
439ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_flicker_mode(struct camera_data *cam, int mode);
440ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_format(struct camera_data *cam);
441ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd);
442ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_do_command(struct camera_data *cam,
443ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		     unsigned int command,
444ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox		     unsigned char direction, unsigned char param);
4456c493f8b28c6744995e92801a20dca192635dd22Hans Verkuilstruct camera_data *cpia2_init_camera_struct(struct usb_interface *intf);
446ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_init_camera(struct camera_data *cam);
447ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_allocate_buffers(struct camera_data *cam);
448ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_free_buffers(struct camera_data *cam);
449ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxlong cpia2_read(struct camera_data *cam,
450fb9c280d4c6d4586670e3dfd041d8258db36b330Randy Dunlap		char __user *buf, unsigned long count, int noblock);
451ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxunsigned int cpia2_poll(struct camera_data *cam,
452ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox			struct file *filp, poll_table *wait);
453ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma);
454ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_property_flip(struct camera_data *cam, int prop_val);
455ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_property_mirror(struct camera_data *cam, int prop_val);
456ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_gpio(struct camera_data *cam, unsigned char setting);
457ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_fps(struct camera_data *cam, int framerate);
458ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
459ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* usb */
460ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_init(void);
461ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_usb_cleanup(void);
462ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_transfer_cmd(struct camera_data *cam, void *registers,
463ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox			   u8 request, u8 start, u8 count, u8 direction);
464ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_stream_start(struct camera_data *cam, unsigned int alternate);
465ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_stream_stop(struct camera_data *cam);
466ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_stream_pause(struct camera_data *cam);
467ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_stream_resume(struct camera_data *cam);
468ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_usb_change_streaming_alternate(struct camera_data *cam,
469ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox					 unsigned int alt);
470ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
471ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
472ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* ----------------------- debug functions ---------------------- */
473ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifdef _CPIA2_DEBUG_
474ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define ALOG(lev, fmt, args...) printk(lev "%s:%d %s(): " fmt, __FILE__, __LINE__, __func__, ## args)
475ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define LOG(fmt, args...) ALOG(KERN_INFO, fmt, ## args)
476ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define ERR(fmt, args...) ALOG(KERN_ERR, fmt, ## args)
477ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DBG(fmt, args...) ALOG(KERN_DEBUG, fmt, ## args)
478ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#else
479ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define ALOG(fmt,args...) printk(fmt,##args)
480ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define LOG(fmt,args...) ALOG(KERN_INFO "cpia2: "fmt,##args)
481ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define ERR(fmt,args...) ALOG(KERN_ERR "cpia2: "fmt,##args)
482ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define DBG(fmn,args...) do {} while(0)
483ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif
484ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* No function or lineno, for shorter lines */
485ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#define KINFO(fmt, args...) printk(KERN_INFO fmt,##args)
486ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox
487ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif
488