1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Driver for the ov9650 sensor
4   *
5   * Copyright (C) 2008 Erik AndrĂ©n
6   * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
7   * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
8   *
9   * Portions of code to USB interface and ALi driver software,
10   * Copyright (c) 2006 Willem Duinker
11   * v4l2 interface modeled after the V4L2 driver
12   * for SN9C10x PC Camera Controllers
13   */
14  
15  #ifndef M5602_OV9650_H_
16  #define M5602_OV9650_H_
17  
18  #include <linux/dmi.h>
19  #include "m5602_sensor.h"
20  
21  /*****************************************************************************/
22  
23  #define OV9650_GAIN			0x00
24  #define OV9650_BLUE			0x01
25  #define OV9650_RED			0x02
26  #define OV9650_VREF			0x03
27  #define OV9650_COM1			0x04
28  #define OV9650_BAVE			0x05
29  #define OV9650_GEAVE			0x06
30  #define OV9650_RSVD7			0x07
31  #define OV9650_COM2			0x09
32  #define OV9650_PID			0x0a
33  #define OV9650_VER			0x0b
34  #define OV9650_COM3			0x0c
35  #define OV9650_COM4			0x0d
36  #define OV9650_COM5			0x0e
37  #define OV9650_COM6			0x0f
38  #define OV9650_AECH			0x10
39  #define OV9650_CLKRC			0x11
40  #define OV9650_COM7			0x12
41  #define OV9650_COM8			0x13
42  #define OV9650_COM9			0x14
43  #define OV9650_COM10			0x15
44  #define OV9650_RSVD16			0x16
45  #define OV9650_HSTART			0x17
46  #define OV9650_HSTOP			0x18
47  #define OV9650_VSTRT			0x19
48  #define OV9650_VSTOP			0x1a
49  #define OV9650_PSHFT			0x1b
50  #define OV9650_MVFP			0x1e
51  #define OV9650_AEW			0x24
52  #define OV9650_AEB			0x25
53  #define OV9650_VPT			0x26
54  #define OV9650_BBIAS			0x27
55  #define OV9650_GbBIAS			0x28
56  #define OV9650_Gr_COM			0x29
57  #define OV9650_RBIAS			0x2c
58  #define OV9650_HREF			0x32
59  #define OV9650_CHLF			0x33
60  #define OV9650_ARBLM			0x34
61  #define OV9650_RSVD35			0x35
62  #define OV9650_RSVD36			0x36
63  #define OV9650_ADC			0x37
64  #define OV9650_ACOM38			0x38
65  #define OV9650_OFON			0x39
66  #define OV9650_TSLB			0x3a
67  #define OV9650_COM12			0x3c
68  #define OV9650_COM13			0x3d
69  #define OV9650_COM15			0x40
70  #define OV9650_COM16			0x41
71  #define OV9650_LCC1			0x62
72  #define OV9650_LCC2			0x63
73  #define OV9650_LCC3			0x64
74  #define OV9650_LCC4			0x65
75  #define OV9650_LCC5			0x66
76  #define OV9650_HV			0x69
77  #define OV9650_DBLV			0x6b
78  #define OV9650_COM21			0x8b
79  #define OV9650_COM22			0x8c
80  #define OV9650_COM24			0x8e
81  #define OV9650_DBLC1			0x8f
82  #define OV9650_RSVD94			0x94
83  #define OV9650_RSVD95			0x95
84  #define OV9650_RSVD96			0x96
85  #define OV9650_LCCFB			0x9d
86  #define OV9650_LCCFR			0x9e
87  #define OV9650_AECHM			0xa1
88  #define OV9650_COM26			0xa5
89  #define OV9650_ACOMA8			0xa8
90  #define OV9650_ACOMA9			0xa9
91  
92  #define OV9650_REGISTER_RESET		(1 << 7)
93  #define OV9650_VGA_SELECT		(1 << 6)
94  #define OV9650_CIF_SELECT		(1 << 5)
95  #define OV9650_QVGA_SELECT		(1 << 4)
96  #define OV9650_QCIF_SELECT		(1 << 3)
97  #define OV9650_RGB_SELECT		(1 << 2)
98  #define OV9650_RAW_RGB_SELECT		(1 << 0)
99  
100  #define OV9650_FAST_AGC_AEC		(1 << 7)
101  #define OV9650_AEC_UNLIM_STEP_SIZE	(1 << 6)
102  #define OV9650_BANDING			(1 << 5)
103  #define OV9650_AGC_EN			(1 << 2)
104  #define OV9650_AWB_EN			(1 << 1)
105  #define OV9650_AEC_EN			(1 << 0)
106  
107  #define OV9650_VARIOPIXEL		(1 << 2)
108  #define OV9650_SYSTEM_CLK_SEL		(1 << 7)
109  #define OV9650_SLAM_MODE		(1 << 4)
110  
111  #define OV9650_QVGA_VARIOPIXEL		(1 << 7)
112  
113  #define OV9650_VFLIP			(1 << 4)
114  #define OV9650_HFLIP			(1 << 5)
115  
116  #define OV9650_SOFT_SLEEP		(1 << 4)
117  #define OV9650_OUTPUT_DRIVE_2X		(1 << 0)
118  
119  #define OV9650_DENOISE_ENABLE		(1 << 5)
120  #define OV9650_WHITE_PIXEL_ENABLE	(1 << 1)
121  #define OV9650_WHITE_PIXEL_OPTION	(1 << 0)
122  
123  #define OV9650_LEFT_OFFSET		0x62
124  
125  #define GAIN_DEFAULT			0x14
126  #define RED_GAIN_DEFAULT		0x70
127  #define BLUE_GAIN_DEFAULT		0x20
128  #define EXPOSURE_DEFAULT		0x1ff
129  
130  /*****************************************************************************/
131  
132  /* Kernel module parameters */
133  extern int force_sensor;
134  extern bool dump_sensor;
135  
136  int ov9650_probe(struct sd *sd);
137  int ov9650_init(struct sd *sd);
138  int ov9650_init_controls(struct sd *sd);
139  int ov9650_start(struct sd *sd);
140  int ov9650_stop(struct sd *sd);
141  void ov9650_disconnect(struct sd *sd);
142  
143  static const struct m5602_sensor ov9650 = {
144  	.name = "OV9650",
145  	.i2c_slave_id = 0x60,
146  	.i2c_regW = 1,
147  	.probe = ov9650_probe,
148  	.init = ov9650_init,
149  	.init_controls = ov9650_init_controls,
150  	.start = ov9650_start,
151  	.stop = ov9650_stop,
152  	.disconnect = ov9650_disconnect,
153  };
154  
155  #endif
156