1a10e763bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
20c0d06caSMauro Carvalho Chehab /*
30c0d06caSMauro Carvalho Chehab  * Driver for the po1030 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  * Register defines taken from Pascal Stangs Procyon Armlib
150c0d06caSMauro Carvalho Chehab  */
160c0d06caSMauro Carvalho Chehab 
170c0d06caSMauro Carvalho Chehab #ifndef M5602_PO1030_H_
180c0d06caSMauro Carvalho Chehab #define M5602_PO1030_H_
190c0d06caSMauro Carvalho Chehab 
200c0d06caSMauro Carvalho Chehab #include "m5602_sensor.h"
210c0d06caSMauro Carvalho Chehab 
220c0d06caSMauro Carvalho Chehab /*****************************************************************************/
230c0d06caSMauro Carvalho Chehab 
240c0d06caSMauro Carvalho Chehab #define PO1030_DEVID_H		0x00
250c0d06caSMauro Carvalho Chehab #define PO1030_DEVID_L		0x01
260c0d06caSMauro Carvalho Chehab #define PO1030_FRAMEWIDTH_H	0x04
270c0d06caSMauro Carvalho Chehab #define PO1030_FRAMEWIDTH_L	0x05
280c0d06caSMauro Carvalho Chehab #define PO1030_FRAMEHEIGHT_H	0x06
290c0d06caSMauro Carvalho Chehab #define PO1030_FRAMEHEIGHT_L	0x07
300c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWX_H	0x08
310c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWX_L	0x09
320c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWY_H	0x0a
330c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWY_L	0x0b
340c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWWIDTH_H	0x0c
350c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWWIDTH_L	0x0d
360c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWHEIGHT_H	0x0e
370c0d06caSMauro Carvalho Chehab #define PO1030_WINDOWHEIGHT_L	0x0f
380c0d06caSMauro Carvalho Chehab 
390c0d06caSMauro Carvalho Chehab #define PO1030_GLOBALIBIAS	0x12
400c0d06caSMauro Carvalho Chehab #define PO1030_PIXELIBIAS	0x13
410c0d06caSMauro Carvalho Chehab 
420c0d06caSMauro Carvalho Chehab #define PO1030_GLOBALGAIN	0x15
430c0d06caSMauro Carvalho Chehab #define PO1030_RED_GAIN		0x16
440c0d06caSMauro Carvalho Chehab #define PO1030_GREEN_1_GAIN	0x17
450c0d06caSMauro Carvalho Chehab #define PO1030_BLUE_GAIN	0x18
460c0d06caSMauro Carvalho Chehab #define PO1030_GREEN_2_GAIN	0x19
470c0d06caSMauro Carvalho Chehab 
480c0d06caSMauro Carvalho Chehab #define PO1030_INTEGLINES_H	0x1a
490c0d06caSMauro Carvalho Chehab #define PO1030_INTEGLINES_M	0x1b
500c0d06caSMauro Carvalho Chehab #define PO1030_INTEGLINES_L	0x1c
510c0d06caSMauro Carvalho Chehab 
520c0d06caSMauro Carvalho Chehab #define PO1030_CONTROL1		0x1d
530c0d06caSMauro Carvalho Chehab #define PO1030_CONTROL2		0x1e
540c0d06caSMauro Carvalho Chehab #define PO1030_CONTROL3		0x1f
550c0d06caSMauro Carvalho Chehab #define PO1030_CONTROL4		0x20
560c0d06caSMauro Carvalho Chehab 
570c0d06caSMauro Carvalho Chehab #define PO1030_PERIOD50_H	0x23
580c0d06caSMauro Carvalho Chehab #define PO1030_PERIOD50_L	0x24
590c0d06caSMauro Carvalho Chehab #define PO1030_PERIOD60_H	0x25
600c0d06caSMauro Carvalho Chehab #define PO1030_PERIOD60_L	0x26
610c0d06caSMauro Carvalho Chehab #define PO1030_REGCLK167	0x27
620c0d06caSMauro Carvalho Chehab #define PO1030_FLICKER_DELTA50	0x28
630c0d06caSMauro Carvalho Chehab #define PO1030_FLICKERDELTA60	0x29
640c0d06caSMauro Carvalho Chehab 
650c0d06caSMauro Carvalho Chehab #define PO1030_ADCOFFSET	0x2c
660c0d06caSMauro Carvalho Chehab 
670c0d06caSMauro Carvalho Chehab /* Gamma Correction Coeffs */
680c0d06caSMauro Carvalho Chehab #define PO1030_GC0		0x2d
690c0d06caSMauro Carvalho Chehab #define PO1030_GC1		0x2e
700c0d06caSMauro Carvalho Chehab #define PO1030_GC2		0x2f
710c0d06caSMauro Carvalho Chehab #define PO1030_GC3		0x30
720c0d06caSMauro Carvalho Chehab #define PO1030_GC4		0x31
730c0d06caSMauro Carvalho Chehab #define PO1030_GC5		0x32
740c0d06caSMauro Carvalho Chehab #define PO1030_GC6		0x33
750c0d06caSMauro Carvalho Chehab #define PO1030_GC7		0x34
760c0d06caSMauro Carvalho Chehab 
770c0d06caSMauro Carvalho Chehab /* Color Transform Matrix */
780c0d06caSMauro Carvalho Chehab #define PO1030_CT0		0x35
790c0d06caSMauro Carvalho Chehab #define PO1030_CT1		0x36
800c0d06caSMauro Carvalho Chehab #define PO1030_CT2		0x37
810c0d06caSMauro Carvalho Chehab #define PO1030_CT3		0x38
820c0d06caSMauro Carvalho Chehab #define PO1030_CT4		0x39
830c0d06caSMauro Carvalho Chehab #define PO1030_CT5		0x3a
840c0d06caSMauro Carvalho Chehab #define PO1030_CT6		0x3b
850c0d06caSMauro Carvalho Chehab #define PO1030_CT7		0x3c
860c0d06caSMauro Carvalho Chehab #define PO1030_CT8		0x3d
870c0d06caSMauro Carvalho Chehab 
880c0d06caSMauro Carvalho Chehab #define PO1030_AUTOCTRL1	0x3e
890c0d06caSMauro Carvalho Chehab #define PO1030_AUTOCTRL2	0x3f
900c0d06caSMauro Carvalho Chehab 
910c0d06caSMauro Carvalho Chehab #define PO1030_YTARGET		0x40
920c0d06caSMauro Carvalho Chehab #define PO1030_GLOBALGAINMIN	0x41
930c0d06caSMauro Carvalho Chehab #define PO1030_GLOBALGAINMAX	0x42
940c0d06caSMauro Carvalho Chehab 
950c0d06caSMauro Carvalho Chehab #define PO1030_AWB_RED_TUNING	0x47
960c0d06caSMauro Carvalho Chehab #define PO1030_AWB_BLUE_TUNING	0x48
970c0d06caSMauro Carvalho Chehab 
980c0d06caSMauro Carvalho Chehab /* Output format control */
990c0d06caSMauro Carvalho Chehab #define PO1030_OUTFORMCTRL1	0x5a
1000c0d06caSMauro Carvalho Chehab #define PO1030_OUTFORMCTRL2	0x5b
1010c0d06caSMauro Carvalho Chehab #define PO1030_OUTFORMCTRL3	0x5c
1020c0d06caSMauro Carvalho Chehab #define PO1030_OUTFORMCTRL4	0x5d
1030c0d06caSMauro Carvalho Chehab #define PO1030_OUTFORMCTRL5	0x5e
1040c0d06caSMauro Carvalho Chehab 
1050c0d06caSMauro Carvalho Chehab #define PO1030_EDGE_ENH_OFF	0x5f
1060c0d06caSMauro Carvalho Chehab #define PO1030_EGA		0x60
1070c0d06caSMauro Carvalho Chehab 
1080c0d06caSMauro Carvalho Chehab #define PO1030_Cb_U_GAIN	0x63
1090c0d06caSMauro Carvalho Chehab #define PO1030_Cr_V_GAIN	0x64
1100c0d06caSMauro Carvalho Chehab 
1110c0d06caSMauro Carvalho Chehab #define PO1030_YCONTRAST	0x74
1120c0d06caSMauro Carvalho Chehab #define PO1030_YSATURATION	0x75
1130c0d06caSMauro Carvalho Chehab 
1140c0d06caSMauro Carvalho Chehab #define PO1030_HFLIP		(1 << 7)
1150c0d06caSMauro Carvalho Chehab #define PO1030_VFLIP		(1 << 6)
1160c0d06caSMauro Carvalho Chehab 
1170c0d06caSMauro Carvalho Chehab #define PO1030_HREF_ENABLE	(1 << 6)
1180c0d06caSMauro Carvalho Chehab 
1190c0d06caSMauro Carvalho Chehab #define PO1030_RAW_RGB_BAYER	0x4
1200c0d06caSMauro Carvalho Chehab 
1210c0d06caSMauro Carvalho Chehab #define PO1030_FRAME_EQUAL	(1 << 3)
1220c0d06caSMauro Carvalho Chehab #define PO1030_AUTO_SUBSAMPLING (1 << 4)
1230c0d06caSMauro Carvalho Chehab 
1240c0d06caSMauro Carvalho Chehab #define PO1030_WEIGHT_WIN_2X	(1 << 3)
1250c0d06caSMauro Carvalho Chehab 
1260c0d06caSMauro Carvalho Chehab #define PO1030_SHUTTER_MODE	(1 << 6)
1270c0d06caSMauro Carvalho Chehab #define PO1030_AUTO_SUBSAMPLING	(1 << 4)
1280c0d06caSMauro Carvalho Chehab #define PO1030_FRAME_EQUAL	(1 << 3)
1290c0d06caSMauro Carvalho Chehab 
1300c0d06caSMauro Carvalho Chehab #define PO1030_SENSOR_RESET	(1 << 5)
1310c0d06caSMauro Carvalho Chehab 
1320c0d06caSMauro Carvalho Chehab #define PO1030_SUBSAMPLING	(1 << 6)
1330c0d06caSMauro Carvalho Chehab 
1340c0d06caSMauro Carvalho Chehab /*****************************************************************************/
1350c0d06caSMauro Carvalho Chehab 
1360c0d06caSMauro Carvalho Chehab #define PO1030_GLOBAL_GAIN_DEFAULT	0x12
1370c0d06caSMauro Carvalho Chehab #define PO1030_EXPOSURE_DEFAULT		0x0085
1380c0d06caSMauro Carvalho Chehab #define PO1030_BLUE_GAIN_DEFAULT	0x36
1390c0d06caSMauro Carvalho Chehab #define PO1030_RED_GAIN_DEFAULT		0x36
1400c0d06caSMauro Carvalho Chehab #define PO1030_GREEN_GAIN_DEFAULT	0x40
1410c0d06caSMauro Carvalho Chehab 
1420c0d06caSMauro Carvalho Chehab /*****************************************************************************/
1430c0d06caSMauro Carvalho Chehab 
1440c0d06caSMauro Carvalho Chehab /* Kernel module parameters */
1450c0d06caSMauro Carvalho Chehab extern int force_sensor;
1460c0d06caSMauro Carvalho Chehab extern bool dump_sensor;
1470c0d06caSMauro Carvalho Chehab 
1480c0d06caSMauro Carvalho Chehab int po1030_probe(struct sd *sd);
1490c0d06caSMauro Carvalho Chehab int po1030_init(struct sd *sd);
150c84e412fSHans de Goede int po1030_init_controls(struct sd *sd);
1510c0d06caSMauro Carvalho Chehab int po1030_start(struct sd *sd);
1520c0d06caSMauro Carvalho Chehab void po1030_disconnect(struct sd *sd);
1530c0d06caSMauro Carvalho Chehab 
1540c0d06caSMauro Carvalho Chehab static const struct m5602_sensor po1030 = {
1550c0d06caSMauro Carvalho Chehab 	.name = "PO1030",
1560c0d06caSMauro Carvalho Chehab 
1570c0d06caSMauro Carvalho Chehab 	.i2c_slave_id = 0xdc,
1580c0d06caSMauro Carvalho Chehab 	.i2c_regW = 1,
1590c0d06caSMauro Carvalho Chehab 
1600c0d06caSMauro Carvalho Chehab 	.probe = po1030_probe,
1610c0d06caSMauro Carvalho Chehab 	.init = po1030_init,
162c84e412fSHans de Goede 	.init_controls = po1030_init_controls,
1630c0d06caSMauro Carvalho Chehab 	.start = po1030_start,
1640c0d06caSMauro Carvalho Chehab 	.disconnect = po1030_disconnect,
1650c0d06caSMauro Carvalho Chehab };
1660c0d06caSMauro Carvalho Chehab #endif
167