1a10e763bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
20c0d06caSMauro Carvalho Chehab /*
30c0d06caSMauro Carvalho Chehab  * Driver for the ov9650 sensor
40c0d06caSMauro Carvalho Chehab  *
50c0d06caSMauro Carvalho Chehab  * Copyright (C) 2008 Erik Andrén
60c0d06caSMauro Carvalho Chehab  * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
70c0d06caSMauro Carvalho Chehab  * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
80c0d06caSMauro Carvalho Chehab  *
90c0d06caSMauro Carvalho Chehab  * Portions of code to USB interface and ALi driver software,
100c0d06caSMauro Carvalho Chehab  * Copyright (c) 2006 Willem Duinker
110c0d06caSMauro Carvalho Chehab  * v4l2 interface modeled after the V4L2 driver
120c0d06caSMauro Carvalho Chehab  * for SN9C10x PC Camera Controllers
130c0d06caSMauro Carvalho Chehab  */
140c0d06caSMauro Carvalho Chehab 
150c0d06caSMauro Carvalho Chehab #ifndef M5602_OV9650_H_
160c0d06caSMauro Carvalho Chehab #define M5602_OV9650_H_
170c0d06caSMauro Carvalho Chehab 
180c0d06caSMauro Carvalho Chehab #include <linux/dmi.h>
190c0d06caSMauro Carvalho Chehab #include "m5602_sensor.h"
200c0d06caSMauro Carvalho Chehab 
210c0d06caSMauro Carvalho Chehab /*****************************************************************************/
220c0d06caSMauro Carvalho Chehab 
230c0d06caSMauro Carvalho Chehab #define OV9650_GAIN			0x00
240c0d06caSMauro Carvalho Chehab #define OV9650_BLUE			0x01
250c0d06caSMauro Carvalho Chehab #define OV9650_RED			0x02
260c0d06caSMauro Carvalho Chehab #define OV9650_VREF			0x03
270c0d06caSMauro Carvalho Chehab #define OV9650_COM1			0x04
280c0d06caSMauro Carvalho Chehab #define OV9650_BAVE			0x05
290c0d06caSMauro Carvalho Chehab #define OV9650_GEAVE			0x06
300c0d06caSMauro Carvalho Chehab #define OV9650_RSVD7			0x07
310c0d06caSMauro Carvalho Chehab #define OV9650_COM2			0x09
320c0d06caSMauro Carvalho Chehab #define OV9650_PID			0x0a
330c0d06caSMauro Carvalho Chehab #define OV9650_VER			0x0b
340c0d06caSMauro Carvalho Chehab #define OV9650_COM3			0x0c
350c0d06caSMauro Carvalho Chehab #define OV9650_COM4			0x0d
360c0d06caSMauro Carvalho Chehab #define OV9650_COM5			0x0e
370c0d06caSMauro Carvalho Chehab #define OV9650_COM6			0x0f
380c0d06caSMauro Carvalho Chehab #define OV9650_AECH			0x10
390c0d06caSMauro Carvalho Chehab #define OV9650_CLKRC			0x11
400c0d06caSMauro Carvalho Chehab #define OV9650_COM7			0x12
410c0d06caSMauro Carvalho Chehab #define OV9650_COM8			0x13
420c0d06caSMauro Carvalho Chehab #define OV9650_COM9			0x14
430c0d06caSMauro Carvalho Chehab #define OV9650_COM10			0x15
440c0d06caSMauro Carvalho Chehab #define OV9650_RSVD16			0x16
450c0d06caSMauro Carvalho Chehab #define OV9650_HSTART			0x17
460c0d06caSMauro Carvalho Chehab #define OV9650_HSTOP			0x18
470c0d06caSMauro Carvalho Chehab #define OV9650_VSTRT			0x19
480c0d06caSMauro Carvalho Chehab #define OV9650_VSTOP			0x1a
490c0d06caSMauro Carvalho Chehab #define OV9650_PSHFT			0x1b
500c0d06caSMauro Carvalho Chehab #define OV9650_MVFP			0x1e
510c0d06caSMauro Carvalho Chehab #define OV9650_AEW			0x24
520c0d06caSMauro Carvalho Chehab #define OV9650_AEB			0x25
530c0d06caSMauro Carvalho Chehab #define OV9650_VPT			0x26
540c0d06caSMauro Carvalho Chehab #define OV9650_BBIAS			0x27
550c0d06caSMauro Carvalho Chehab #define OV9650_GbBIAS			0x28
560c0d06caSMauro Carvalho Chehab #define OV9650_Gr_COM			0x29
570c0d06caSMauro Carvalho Chehab #define OV9650_RBIAS			0x2c
580c0d06caSMauro Carvalho Chehab #define OV9650_HREF			0x32
590c0d06caSMauro Carvalho Chehab #define OV9650_CHLF			0x33
600c0d06caSMauro Carvalho Chehab #define OV9650_ARBLM			0x34
610c0d06caSMauro Carvalho Chehab #define OV9650_RSVD35			0x35
620c0d06caSMauro Carvalho Chehab #define OV9650_RSVD36			0x36
630c0d06caSMauro Carvalho Chehab #define OV9650_ADC			0x37
640c0d06caSMauro Carvalho Chehab #define OV9650_ACOM38			0x38
650c0d06caSMauro Carvalho Chehab #define OV9650_OFON			0x39
660c0d06caSMauro Carvalho Chehab #define OV9650_TSLB			0x3a
670c0d06caSMauro Carvalho Chehab #define OV9650_COM12			0x3c
680c0d06caSMauro Carvalho Chehab #define OV9650_COM13			0x3d
690c0d06caSMauro Carvalho Chehab #define OV9650_COM15			0x40
700c0d06caSMauro Carvalho Chehab #define OV9650_COM16			0x41
710c0d06caSMauro Carvalho Chehab #define OV9650_LCC1			0x62
720c0d06caSMauro Carvalho Chehab #define OV9650_LCC2			0x63
730c0d06caSMauro Carvalho Chehab #define OV9650_LCC3			0x64
740c0d06caSMauro Carvalho Chehab #define OV9650_LCC4			0x65
750c0d06caSMauro Carvalho Chehab #define OV9650_LCC5			0x66
760c0d06caSMauro Carvalho Chehab #define OV9650_HV			0x69
770c0d06caSMauro Carvalho Chehab #define OV9650_DBLV			0x6b
780c0d06caSMauro Carvalho Chehab #define OV9650_COM21			0x8b
790c0d06caSMauro Carvalho Chehab #define OV9650_COM22			0x8c
800c0d06caSMauro Carvalho Chehab #define OV9650_COM24			0x8e
810c0d06caSMauro Carvalho Chehab #define OV9650_DBLC1			0x8f
820c0d06caSMauro Carvalho Chehab #define OV9650_RSVD94			0x94
830c0d06caSMauro Carvalho Chehab #define OV9650_RSVD95			0x95
840c0d06caSMauro Carvalho Chehab #define OV9650_RSVD96			0x96
850c0d06caSMauro Carvalho Chehab #define OV9650_LCCFB			0x9d
860c0d06caSMauro Carvalho Chehab #define OV9650_LCCFR			0x9e
870c0d06caSMauro Carvalho Chehab #define OV9650_AECHM			0xa1
880c0d06caSMauro Carvalho Chehab #define OV9650_COM26			0xa5
890c0d06caSMauro Carvalho Chehab #define OV9650_ACOMA8			0xa8
900c0d06caSMauro Carvalho Chehab #define OV9650_ACOMA9			0xa9
910c0d06caSMauro Carvalho Chehab 
920c0d06caSMauro Carvalho Chehab #define OV9650_REGISTER_RESET		(1 << 7)
930c0d06caSMauro Carvalho Chehab #define OV9650_VGA_SELECT		(1 << 6)
940c0d06caSMauro Carvalho Chehab #define OV9650_CIF_SELECT		(1 << 5)
950c0d06caSMauro Carvalho Chehab #define OV9650_QVGA_SELECT		(1 << 4)
960c0d06caSMauro Carvalho Chehab #define OV9650_QCIF_SELECT		(1 << 3)
970c0d06caSMauro Carvalho Chehab #define OV9650_RGB_SELECT		(1 << 2)
980c0d06caSMauro Carvalho Chehab #define OV9650_RAW_RGB_SELECT		(1 << 0)
990c0d06caSMauro Carvalho Chehab 
1000c0d06caSMauro Carvalho Chehab #define OV9650_FAST_AGC_AEC		(1 << 7)
1010c0d06caSMauro Carvalho Chehab #define OV9650_AEC_UNLIM_STEP_SIZE	(1 << 6)
1020c0d06caSMauro Carvalho Chehab #define OV9650_BANDING			(1 << 5)
1030c0d06caSMauro Carvalho Chehab #define OV9650_AGC_EN			(1 << 2)
1040c0d06caSMauro Carvalho Chehab #define OV9650_AWB_EN			(1 << 1)
1050c0d06caSMauro Carvalho Chehab #define OV9650_AEC_EN			(1 << 0)
1060c0d06caSMauro Carvalho Chehab 
1070c0d06caSMauro Carvalho Chehab #define OV9650_VARIOPIXEL		(1 << 2)
1080c0d06caSMauro Carvalho Chehab #define OV9650_SYSTEM_CLK_SEL		(1 << 7)
1090c0d06caSMauro Carvalho Chehab #define OV9650_SLAM_MODE		(1 << 4)
1100c0d06caSMauro Carvalho Chehab 
1110c0d06caSMauro Carvalho Chehab #define OV9650_QVGA_VARIOPIXEL		(1 << 7)
1120c0d06caSMauro Carvalho Chehab 
1130c0d06caSMauro Carvalho Chehab #define OV9650_VFLIP			(1 << 4)
1140c0d06caSMauro Carvalho Chehab #define OV9650_HFLIP			(1 << 5)
1150c0d06caSMauro Carvalho Chehab 
1160c0d06caSMauro Carvalho Chehab #define OV9650_SOFT_SLEEP		(1 << 4)
1170c0d06caSMauro Carvalho Chehab #define OV9650_OUTPUT_DRIVE_2X		(1 << 0)
1180c0d06caSMauro Carvalho Chehab 
1190c0d06caSMauro Carvalho Chehab #define OV9650_DENOISE_ENABLE		(1 << 5)
1200c0d06caSMauro Carvalho Chehab #define OV9650_WHITE_PIXEL_ENABLE	(1 << 1)
1210c0d06caSMauro Carvalho Chehab #define OV9650_WHITE_PIXEL_OPTION	(1 << 0)
1220c0d06caSMauro Carvalho Chehab 
1230c0d06caSMauro Carvalho Chehab #define OV9650_LEFT_OFFSET		0x62
1240c0d06caSMauro Carvalho Chehab 
1250c0d06caSMauro Carvalho Chehab #define GAIN_DEFAULT			0x14
1260c0d06caSMauro Carvalho Chehab #define RED_GAIN_DEFAULT		0x70
1270c0d06caSMauro Carvalho Chehab #define BLUE_GAIN_DEFAULT		0x20
1280c0d06caSMauro Carvalho Chehab #define EXPOSURE_DEFAULT		0x1ff
1290c0d06caSMauro Carvalho Chehab 
1300c0d06caSMauro Carvalho Chehab /*****************************************************************************/
1310c0d06caSMauro Carvalho Chehab 
1320c0d06caSMauro Carvalho Chehab /* Kernel module parameters */
1330c0d06caSMauro Carvalho Chehab extern int force_sensor;
1340c0d06caSMauro Carvalho Chehab extern bool dump_sensor;
1350c0d06caSMauro Carvalho Chehab 
1360c0d06caSMauro Carvalho Chehab int ov9650_probe(struct sd *sd);
1370c0d06caSMauro Carvalho Chehab int ov9650_init(struct sd *sd);
138c84e412fSHans de Goede int ov9650_init_controls(struct sd *sd);
1390c0d06caSMauro Carvalho Chehab int ov9650_start(struct sd *sd);
1400c0d06caSMauro Carvalho Chehab int ov9650_stop(struct sd *sd);
1410c0d06caSMauro Carvalho Chehab void ov9650_disconnect(struct sd *sd);
1420c0d06caSMauro Carvalho Chehab 
1430c0d06caSMauro Carvalho Chehab static const struct m5602_sensor ov9650 = {
1440c0d06caSMauro Carvalho Chehab 	.name = "OV9650",
1450c0d06caSMauro Carvalho Chehab 	.i2c_slave_id = 0x60,
1460c0d06caSMauro Carvalho Chehab 	.i2c_regW = 1,
1470c0d06caSMauro Carvalho Chehab 	.probe = ov9650_probe,
1480c0d06caSMauro Carvalho Chehab 	.init = ov9650_init,
149c84e412fSHans de Goede 	.init_controls = ov9650_init_controls,
1500c0d06caSMauro Carvalho Chehab 	.start = ov9650_start,
1510c0d06caSMauro Carvalho Chehab 	.stop = ov9650_stop,
1520c0d06caSMauro Carvalho Chehab 	.disconnect = ov9650_disconnect,
1530c0d06caSMauro Carvalho Chehab };
1540c0d06caSMauro Carvalho Chehab 
1550c0d06caSMauro Carvalho Chehab #endif
156