1a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/*
2cb7a01ac324bf2ee2c666f37ac867e4135f9785aMauro Carvalho Chehab * drivers/media/i2c/tcm825x.h
3a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus *
4a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * Register definitions for the TCM825X CameraChip.
5a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus *
6a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * Author: David Cohen (david.cohen@indt.org.br)
7a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus *
8a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * This file is licensed under the terms of the GNU General Public License
9a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * version 2. This program is licensed "as is" without any warranty of any
10a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * kind, whether express or implied.
11a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus *
12a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * This file was based on ov9640.h from MontaVista
13a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus */
14a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
15a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#ifndef TCM825X_H
16a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_H
17a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
18a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#include <linux/videodev2.h>
19a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
20a03636cb21af1d22a894a5a863b2ba3c3687da63Hans Verkuil#include "v4l2-int-device.h"
21a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
22a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_NAME "tcm825x"
23a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
24576f7d34871f64ac3064f5fc3892c67a90cd1677ileana@telecom-paristech.fr#define TCM825X_MASK(x) (x & 0x00ff)
25576f7d34871f64ac3064f5fc3892c67a90cd1677ileana@telecom-paristech.fr#define TCM825X_ADDR(x) ((x & 0xff00) >> 8)
26a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
27a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* The TCM825X I2C sensor chip has a fixed slave address of 0x3d. */
28a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_I2C_ADDR	0x3d
29a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
30a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/*
31a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * define register offsets for the TCM825X sensor chip
32a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * OFFSET(8 bits) + MASK(8 bits)
33a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * MASK bit 4 and 3 are used when the register uses more than one address
34a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus */
35a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FPS		0x0280
36a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ACF		0x0240
37a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DOUTBUF		0x020C
38a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DCLKP		0x0202
39a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ACFDET		0x0201
40a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DOUTSW		0x0380
41a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DATAHZ		0x0340
42a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PICSIZ		0x033c
43a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PICFMT		0x0302
44a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_V_INV		0x0480
45a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_H_INV		0x0440
46a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRLSW		0x0430
47a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_V_LENGTH	0x040F
48a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCSW		0x0580
49a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRLIM		0x0560
50a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRSPD_U        0x051F
51a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRSPD_L        0x06FF
52a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AG		0x07FF
53a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRSPD2         0x06FF
54a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCMODE         0x0830
55a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCH            0x080F
56a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCL            0x09FF
57a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AWBSW           0x0A80
58a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MRG             0x0BFF
59a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MBG             0x0CFF
60a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_GAMSW           0x0D80
61a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTG            0x0EFF
62a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTG            0x0FFF
63a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTCORE         0x10F0
64a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTCORE         0x100F
65a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_CONT            0x11FF
66a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_BRIGHT          0x12FF
67a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VHUE            0x137F
68a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UHUE            0x147F
69a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VGAIN           0x153F
70a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UGAIN           0x163F
71a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UVCORE          0x170F
72a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_SATU            0x187F
73a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MHMODE          0x1980
74a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MHLPFSEL        0x1940
75a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YMODE           0x1930
76a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MIXHG           0x1907
77a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_LENS            0x1A3F
78a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGLIM           0x1BE0
79a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_LENSRPOL        0x1B10
80a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_LENSRGAIN       0x1B0F
81a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ES100S          0x1CFF
82a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ES120S          0x1DFF
83a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DMASK           0x1EC0
84a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_CODESW          0x1E20
85a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_CODESEL         0x1E10
86a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_TESPIC          0x1E04
87a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PICSEL          0x1E03
88a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HNUM            0x20FF
89a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VOUTPH          0x287F
90a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESROUT          0x327F
91a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESROUT2         0x33FF
92a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGOUT           0x34FF
93a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DGOUT           0x353F
94a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGSLOW1         0x39C0
95a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FLLSMODE        0x3930
96a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FLLSLIM         0x390F
97a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DETSEL          0x3AF0
98a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ACDETNC         0x3A0F
99a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGSLOW2         0x3BC0
100a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DG              0x3B3F
101a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_REJHLEV         0x3CFF
102a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCLOCK         0x3D80
103a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FPSLNKSW        0x3D40
104a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCSPD          0x3D30
105a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_REJH            0x3D03
106a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_SHESRSW         0x3E80
107a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESLIMSEL        0x3E40
108a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_SHESRSPD        0x3E30
109a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ELSTEP          0x3E0C
110a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ELSTART         0x3E03
111a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGMIN           0x3FFF
112a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PREGRG          0x423F
113a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PREGBG          0x433F
114a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PRERG           0x443F
115a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PREBG           0x453F
116a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKBR           0x477F
117a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKGR           0x487F
118a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKRB           0x497F
119a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKGB           0x4A7F
120a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKRG           0x4B7F
121a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKBG           0x4C7F
122a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTCSW          0x4D80
123a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTCSW          0x4D40
124a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTCYL           0x4D3F
125a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTPSW          0x4E80
126a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTPSW          0x4E40
127a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTCGAIN         0x4E3F
128a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTLLIMSW        0x4F10
129a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTLYLIM         0x4F0F
130a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTLMSK       0x5080
131a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTL          0x503F
132a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTHMSK       0x5180
133a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTH          0x513F
134a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UVSKNC          0x527F
135a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UVLJ            0x537F
136a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBGMIN          0x54FF
137a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBGMAX          0x55FF
138a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBSPDUP         0x5603
139a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALLAREA         0x5820
140a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBLOCK          0x5810
141a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WB2SP           0x580F
142a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_KIZUSW          0x5920
143a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PBRSW           0x5910
144a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ABCSW           0x5903
145a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PBDLV           0x5AFF
146a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PBC1LV          0x5BFF
147a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
148a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_NUM_REGS	(TCM825X_ADDR(TCM825X_PBC1LV) + 1)
149a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
150a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_BYTES_PER_PIXEL 2
151a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
152a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_REG_TERM 0xff		/* terminating list entry for reg */
153a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VAL_TERM 0xff		/* terminating list entry for val */
154a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
155a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* define a structure for tcm825x register initialization values */
156a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusstruct tcm825x_reg {
157a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	u8 val;
158a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	u16 reg;
159a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus};
160a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
161a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusenum image_size { subQCIF = 0, QQVGA, QCIF, QVGA, CIF, VGA };
162a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusenum pixel_format { YUV422 = 0, RGB565 };
163a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define NUM_IMAGE_SIZES 6
164a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define NUM_PIXEL_FORMATS 2
165a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
1662060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus#define TCM825X_XCLK_MIN	11900000
1672060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus#define TCM825X_XCLK_MAX	25000000
1682060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus
169a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusstruct capture_size {
170a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	unsigned long width;
171a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	unsigned long height;
172a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus};
173a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
174a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusstruct tcm825x_platform_data {
175a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	/* Is the sensor usable? Doesn't yet mean it's there, but you
176a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	 * can try! */
177a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	int (*is_okay)(void);
178a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	/* Set power state, zero is off, non-zero is on. */
179a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	int (*power_set)(int power);
180a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	/* Default registers written after power-on or reset. */
1813e1e788341e64adea9996b20ebbbce21b5aa7f68Uma Sharma	const struct tcm825x_reg * (*default_regs)(void);
182a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	int (*needs_reset)(struct v4l2_int_device *s, void *buf,
183a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus			   struct v4l2_pix_format *fmt);
1842060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus	int (*ifparm)(struct v4l2_ifparm *p);
18534cb61693e204897a6ae37d56a1e07d0cdd8cdbfSakari Ailus	int (*is_upside_down)(void);
186a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus};
187a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
188a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* Array of image sizes supported by TCM825X.  These must be ordered from
189a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * smallest image size to largest.
190a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus */
191e23b290716ad9355d9f17b569c8c9e659ff68aa7Tobias Klauserstatic const struct capture_size tcm825x_sizes[] = {
192a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	{ 128,  96 }, /* subQCIF */
193a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	{ 160, 120 }, /* QQVGA */
194a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	{ 176, 144 }, /* QCIF */
195a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	{ 320, 240 }, /* QVGA */
196a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	{ 352, 288 }, /* CIF */
197a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus	{ 640, 480 }, /* VGA */
198a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus};
199a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus
200a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#endif /* ifndef TCM825X_H */
201