162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Driver for the po1030 sensor.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2008 Erik Andrén
662306a36Sopenharmony_ci * Copyright (c) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
762306a36Sopenharmony_ci * Copyright (c) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Portions of code to USB interface and ALi driver software,
1062306a36Sopenharmony_ci * Copyright (c) 2006 Willem Duinker
1162306a36Sopenharmony_ci * v4l2 interface modeled after the V4L2 driver
1262306a36Sopenharmony_ci * for SN9C10x PC Camera Controllers
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * Register defines taken from Pascal Stangs Procyon Armlib
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef M5602_PO1030_H_
1862306a36Sopenharmony_ci#define M5602_PO1030_H_
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "m5602_sensor.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/*****************************************************************************/
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define PO1030_DEVID_H		0x00
2562306a36Sopenharmony_ci#define PO1030_DEVID_L		0x01
2662306a36Sopenharmony_ci#define PO1030_FRAMEWIDTH_H	0x04
2762306a36Sopenharmony_ci#define PO1030_FRAMEWIDTH_L	0x05
2862306a36Sopenharmony_ci#define PO1030_FRAMEHEIGHT_H	0x06
2962306a36Sopenharmony_ci#define PO1030_FRAMEHEIGHT_L	0x07
3062306a36Sopenharmony_ci#define PO1030_WINDOWX_H	0x08
3162306a36Sopenharmony_ci#define PO1030_WINDOWX_L	0x09
3262306a36Sopenharmony_ci#define PO1030_WINDOWY_H	0x0a
3362306a36Sopenharmony_ci#define PO1030_WINDOWY_L	0x0b
3462306a36Sopenharmony_ci#define PO1030_WINDOWWIDTH_H	0x0c
3562306a36Sopenharmony_ci#define PO1030_WINDOWWIDTH_L	0x0d
3662306a36Sopenharmony_ci#define PO1030_WINDOWHEIGHT_H	0x0e
3762306a36Sopenharmony_ci#define PO1030_WINDOWHEIGHT_L	0x0f
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define PO1030_GLOBALIBIAS	0x12
4062306a36Sopenharmony_ci#define PO1030_PIXELIBIAS	0x13
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define PO1030_GLOBALGAIN	0x15
4362306a36Sopenharmony_ci#define PO1030_RED_GAIN		0x16
4462306a36Sopenharmony_ci#define PO1030_GREEN_1_GAIN	0x17
4562306a36Sopenharmony_ci#define PO1030_BLUE_GAIN	0x18
4662306a36Sopenharmony_ci#define PO1030_GREEN_2_GAIN	0x19
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define PO1030_INTEGLINES_H	0x1a
4962306a36Sopenharmony_ci#define PO1030_INTEGLINES_M	0x1b
5062306a36Sopenharmony_ci#define PO1030_INTEGLINES_L	0x1c
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define PO1030_CONTROL1		0x1d
5362306a36Sopenharmony_ci#define PO1030_CONTROL2		0x1e
5462306a36Sopenharmony_ci#define PO1030_CONTROL3		0x1f
5562306a36Sopenharmony_ci#define PO1030_CONTROL4		0x20
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define PO1030_PERIOD50_H	0x23
5862306a36Sopenharmony_ci#define PO1030_PERIOD50_L	0x24
5962306a36Sopenharmony_ci#define PO1030_PERIOD60_H	0x25
6062306a36Sopenharmony_ci#define PO1030_PERIOD60_L	0x26
6162306a36Sopenharmony_ci#define PO1030_REGCLK167	0x27
6262306a36Sopenharmony_ci#define PO1030_FLICKER_DELTA50	0x28
6362306a36Sopenharmony_ci#define PO1030_FLICKERDELTA60	0x29
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define PO1030_ADCOFFSET	0x2c
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/* Gamma Correction Coeffs */
6862306a36Sopenharmony_ci#define PO1030_GC0		0x2d
6962306a36Sopenharmony_ci#define PO1030_GC1		0x2e
7062306a36Sopenharmony_ci#define PO1030_GC2		0x2f
7162306a36Sopenharmony_ci#define PO1030_GC3		0x30
7262306a36Sopenharmony_ci#define PO1030_GC4		0x31
7362306a36Sopenharmony_ci#define PO1030_GC5		0x32
7462306a36Sopenharmony_ci#define PO1030_GC6		0x33
7562306a36Sopenharmony_ci#define PO1030_GC7		0x34
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/* Color Transform Matrix */
7862306a36Sopenharmony_ci#define PO1030_CT0		0x35
7962306a36Sopenharmony_ci#define PO1030_CT1		0x36
8062306a36Sopenharmony_ci#define PO1030_CT2		0x37
8162306a36Sopenharmony_ci#define PO1030_CT3		0x38
8262306a36Sopenharmony_ci#define PO1030_CT4		0x39
8362306a36Sopenharmony_ci#define PO1030_CT5		0x3a
8462306a36Sopenharmony_ci#define PO1030_CT6		0x3b
8562306a36Sopenharmony_ci#define PO1030_CT7		0x3c
8662306a36Sopenharmony_ci#define PO1030_CT8		0x3d
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#define PO1030_AUTOCTRL1	0x3e
8962306a36Sopenharmony_ci#define PO1030_AUTOCTRL2	0x3f
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci#define PO1030_YTARGET		0x40
9262306a36Sopenharmony_ci#define PO1030_GLOBALGAINMIN	0x41
9362306a36Sopenharmony_ci#define PO1030_GLOBALGAINMAX	0x42
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#define PO1030_AWB_RED_TUNING	0x47
9662306a36Sopenharmony_ci#define PO1030_AWB_BLUE_TUNING	0x48
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/* Output format control */
9962306a36Sopenharmony_ci#define PO1030_OUTFORMCTRL1	0x5a
10062306a36Sopenharmony_ci#define PO1030_OUTFORMCTRL2	0x5b
10162306a36Sopenharmony_ci#define PO1030_OUTFORMCTRL3	0x5c
10262306a36Sopenharmony_ci#define PO1030_OUTFORMCTRL4	0x5d
10362306a36Sopenharmony_ci#define PO1030_OUTFORMCTRL5	0x5e
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define PO1030_EDGE_ENH_OFF	0x5f
10662306a36Sopenharmony_ci#define PO1030_EGA		0x60
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define PO1030_Cb_U_GAIN	0x63
10962306a36Sopenharmony_ci#define PO1030_Cr_V_GAIN	0x64
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci#define PO1030_YCONTRAST	0x74
11262306a36Sopenharmony_ci#define PO1030_YSATURATION	0x75
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#define PO1030_HFLIP		(1 << 7)
11562306a36Sopenharmony_ci#define PO1030_VFLIP		(1 << 6)
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#define PO1030_HREF_ENABLE	(1 << 6)
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define PO1030_RAW_RGB_BAYER	0x4
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#define PO1030_FRAME_EQUAL	(1 << 3)
12262306a36Sopenharmony_ci#define PO1030_AUTO_SUBSAMPLING (1 << 4)
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#define PO1030_WEIGHT_WIN_2X	(1 << 3)
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#define PO1030_SHUTTER_MODE	(1 << 6)
12762306a36Sopenharmony_ci#define PO1030_AUTO_SUBSAMPLING	(1 << 4)
12862306a36Sopenharmony_ci#define PO1030_FRAME_EQUAL	(1 << 3)
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#define PO1030_SENSOR_RESET	(1 << 5)
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#define PO1030_SUBSAMPLING	(1 << 6)
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/*****************************************************************************/
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci#define PO1030_GLOBAL_GAIN_DEFAULT	0x12
13762306a36Sopenharmony_ci#define PO1030_EXPOSURE_DEFAULT		0x0085
13862306a36Sopenharmony_ci#define PO1030_BLUE_GAIN_DEFAULT	0x36
13962306a36Sopenharmony_ci#define PO1030_RED_GAIN_DEFAULT		0x36
14062306a36Sopenharmony_ci#define PO1030_GREEN_GAIN_DEFAULT	0x40
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci/*****************************************************************************/
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/* Kernel module parameters */
14562306a36Sopenharmony_ciextern int force_sensor;
14662306a36Sopenharmony_ciextern bool dump_sensor;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ciint po1030_probe(struct sd *sd);
14962306a36Sopenharmony_ciint po1030_init(struct sd *sd);
15062306a36Sopenharmony_ciint po1030_init_controls(struct sd *sd);
15162306a36Sopenharmony_ciint po1030_start(struct sd *sd);
15262306a36Sopenharmony_civoid po1030_disconnect(struct sd *sd);
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistatic const struct m5602_sensor po1030 = {
15562306a36Sopenharmony_ci	.name = "PO1030",
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	.i2c_slave_id = 0xdc,
15862306a36Sopenharmony_ci	.i2c_regW = 1,
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	.probe = po1030_probe,
16162306a36Sopenharmony_ci	.init = po1030_init,
16262306a36Sopenharmony_ci	.init_controls = po1030_init_controls,
16362306a36Sopenharmony_ci	.start = po1030_start,
16462306a36Sopenharmony_ci	.disconnect = po1030_disconnect,
16562306a36Sopenharmony_ci};
16662306a36Sopenharmony_ci#endif
167