162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2001 Jean-Fredric Clere, Nikolas Zimmermann, Georg Acher
462306a36Sopenharmony_ci *		      Mark Cave-Ayland, Carlo E Prelz, Dick Streefland
562306a36Sopenharmony_ci * Copyright (c) 2002, 2003 Tuukka Toivonen
662306a36Sopenharmony_ci * Copyright (c) 2008 Erik Andrén
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * P/N 861037:      Sensor HDCS1000        ASIC STV0600
962306a36Sopenharmony_ci * P/N 861050-0010: Sensor HDCS1000        ASIC STV0600
1062306a36Sopenharmony_ci * P/N 861050-0020: Sensor Photobit PB100  ASIC STV0600-1 - QuickCam Express
1162306a36Sopenharmony_ci * P/N 861055:      Sensor ST VV6410       ASIC STV0610   - LEGO cam
1262306a36Sopenharmony_ci * P/N 861075-0040: Sensor HDCS1000        ASIC
1362306a36Sopenharmony_ci * P/N 961179-0700: Sensor ST VV6410       ASIC STV0602   - Dexxa WebCam USB
1462306a36Sopenharmony_ci * P/N 861040-0000: Sensor ST VV6410       ASIC STV0610   - QuickCam Web
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef STV06XX_VV6410_H_
1862306a36Sopenharmony_ci#define STV06XX_VV6410_H_
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "stv06xx_sensor.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define VV6410_COLS			416
2362306a36Sopenharmony_ci#define VV6410_ROWS			320
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* Status registers */
2662306a36Sopenharmony_ci/* Chip identification number including revision indicator */
2762306a36Sopenharmony_ci#define VV6410_DEVICEH			0x00
2862306a36Sopenharmony_ci#define VV6410_DEVICEL			0x01
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* User can determine whether timed I2C data
3162306a36Sopenharmony_ci   has been consumed by interrogating flag states */
3262306a36Sopenharmony_ci#define VV6410_STATUS0			0x02
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* Current line counter value */
3562306a36Sopenharmony_ci#define VV6410_LINECOUNTH		0x03
3662306a36Sopenharmony_ci#define VV6410_LINECOUNTL		0x04
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* End x coordinate of image size */
3962306a36Sopenharmony_ci#define VV6410_XENDH			0x05
4062306a36Sopenharmony_ci#define VV6410_XENDL			0x06
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* End y coordinate of image size */
4362306a36Sopenharmony_ci#define VV6410_YENDH			0x07
4462306a36Sopenharmony_ci#define VV6410_YENDL			0x08
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* This is the average pixel value returned from the
4762306a36Sopenharmony_ci   dark line offset cancellation algorithm */
4862306a36Sopenharmony_ci#define VV6410_DARKAVGH			0x09
4962306a36Sopenharmony_ci#define VV6410_DARKAVGL			0x0a
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* This is the average pixel value returned from the
5262306a36Sopenharmony_ci   black line offset cancellation algorithm  */
5362306a36Sopenharmony_ci#define VV6410_BLACKAVGH		0x0b
5462306a36Sopenharmony_ci#define VV6410_BLACKAVGL		0x0c
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* Flags to indicate whether the x or y image coordinates have been clipped */
5762306a36Sopenharmony_ci#define VV6410_STATUS1			0x0d
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/* Setup registers */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Low-power/sleep modes & video timing */
6262306a36Sopenharmony_ci#define VV6410_SETUP0			0x10
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci/* Various parameters */
6562306a36Sopenharmony_ci#define VV6410_SETUP1			0x11
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/* Contains pixel counter reset value used by external sync */
6862306a36Sopenharmony_ci#define VV6410_SYNCVALUE		0x12
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* Frame grabbing modes (FST, LST and QCK) */
7162306a36Sopenharmony_ci#define VV6410_FGMODES			0x14
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/* FST and QCK mapping modes. */
7462306a36Sopenharmony_ci#define VV6410_PINMAPPING		0x15
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* Data resolution */
7762306a36Sopenharmony_ci#define VV6410_DATAFORMAT		0x16
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/* Output coding formats */
8062306a36Sopenharmony_ci#define VV6410_OPFORMAT			0x17
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/* Various mode select bits */
8362306a36Sopenharmony_ci#define VV6410_MODESELECT		0x18
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/* Exposure registers */
8662306a36Sopenharmony_ci/* Fine exposure. */
8762306a36Sopenharmony_ci#define VV6410_FINEH			0x20
8862306a36Sopenharmony_ci#define VV6410_FINEL			0x21
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* Coarse exposure */
9162306a36Sopenharmony_ci#define VV6410_COARSEH			0x22
9262306a36Sopenharmony_ci#define VV6410_COARSEL			0x23
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* Analog gain setting */
9562306a36Sopenharmony_ci#define VV6410_ANALOGGAIN		0x24
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* Clock division */
9862306a36Sopenharmony_ci#define VV6410_CLKDIV			0x25
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci/* Dark line offset cancellation value */
10162306a36Sopenharmony_ci#define VV6410_DARKOFFSETH		0x2c
10262306a36Sopenharmony_ci#define VV6410_DARKOFFSETL		0x2d
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/* Dark line offset cancellation enable */
10562306a36Sopenharmony_ci#define VV6410_DARKOFFSETSETUP		0x2e
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci/* Video timing registers */
10862306a36Sopenharmony_ci/* Line Length (Pixel Clocks) */
10962306a36Sopenharmony_ci#define VV6410_LINELENGTHH		0x52
11062306a36Sopenharmony_ci#define VV6410_LINELENGTHL		0x53
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/* X-co-ordinate of top left corner of region of interest (x-offset) */
11362306a36Sopenharmony_ci#define VV6410_XOFFSETH			0x57
11462306a36Sopenharmony_ci#define VV6410_XOFFSETL			0x58
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci/* Y-coordinate of top left corner of region of interest (y-offset) */
11762306a36Sopenharmony_ci#define VV6410_YOFFSETH			0x59
11862306a36Sopenharmony_ci#define VV6410_YOFFSETL			0x5a
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/* Field length (Lines) */
12162306a36Sopenharmony_ci#define VV6410_FIELDLENGTHH		0x61
12262306a36Sopenharmony_ci#define VV6410_FIELDLENGTHL		0x62
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/* System registers */
12562306a36Sopenharmony_ci/* Black offset cancellation default value */
12662306a36Sopenharmony_ci#define VV6410_BLACKOFFSETH		0x70
12762306a36Sopenharmony_ci#define VV6410_BLACKOFFSETL		0x71
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/* Black offset cancellation setup */
13062306a36Sopenharmony_ci#define VV6410_BLACKOFFSETSETUP		0x72
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/* Analog Control Register 0 */
13362306a36Sopenharmony_ci#define VV6410_CR0			0x75
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci/* Analog Control Register 1 */
13662306a36Sopenharmony_ci#define VV6410_CR1			0x76
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci/* ADC Setup Register */
13962306a36Sopenharmony_ci#define VV6410_AS0			0x77
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci/* Analog Test Register */
14262306a36Sopenharmony_ci#define VV6410_AT0			0x78
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/* Audio Amplifier Setup Register */
14562306a36Sopenharmony_ci#define VV6410_AT1			0x79
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#define VV6410_HFLIP			(1 << 3)
14862306a36Sopenharmony_ci#define VV6410_VFLIP			(1 << 4)
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define VV6410_LOW_POWER_MODE		(1 << 0)
15162306a36Sopenharmony_ci#define VV6410_SOFT_RESET		(1 << 2)
15262306a36Sopenharmony_ci#define VV6410_PAL_25_FPS		(0 << 3)
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci#define VV6410_CLK_DIV_2		(1 << 1)
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci#define VV6410_FINE_EXPOSURE		320
15762306a36Sopenharmony_ci#define VV6410_COARSE_EXPOSURE		192
15862306a36Sopenharmony_ci#define VV6410_DEFAULT_GAIN		5
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci#define VV6410_SUBSAMPLE		0x01
16162306a36Sopenharmony_ci#define VV6410_CROP_TO_QVGA		0x02
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define VV6410_CIF_LINELENGTH		415
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistatic int vv6410_probe(struct sd *sd);
16662306a36Sopenharmony_cistatic int vv6410_start(struct sd *sd);
16762306a36Sopenharmony_cistatic int vv6410_init(struct sd *sd);
16862306a36Sopenharmony_cistatic int vv6410_init_controls(struct sd *sd);
16962306a36Sopenharmony_cistatic int vv6410_stop(struct sd *sd);
17062306a36Sopenharmony_cistatic int vv6410_dump(struct sd *sd);
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/* V4L2 controls supported by the driver */
17362306a36Sopenharmony_cistatic int vv6410_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
17462306a36Sopenharmony_cistatic int vv6410_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
17562306a36Sopenharmony_cistatic int vv6410_set_analog_gain(struct gspca_dev *gspca_dev, __s32 val);
17662306a36Sopenharmony_cistatic int vv6410_set_exposure(struct gspca_dev *gspca_dev, __s32 val);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ciconst struct stv06xx_sensor stv06xx_sensor_vv6410 = {
17962306a36Sopenharmony_ci	.name = "ST VV6410",
18062306a36Sopenharmony_ci	.i2c_flush = 5,
18162306a36Sopenharmony_ci	.i2c_addr = 0x20,
18262306a36Sopenharmony_ci	.i2c_len = 1,
18362306a36Sopenharmony_ci	/* FIXME (see if we can lower packet_size-s, needs testing, and also
18462306a36Sopenharmony_ci	   adjusting framerate when the bandwidth gets lower) */
18562306a36Sopenharmony_ci	.min_packet_size = { 1023 },
18662306a36Sopenharmony_ci	.max_packet_size = { 1023 },
18762306a36Sopenharmony_ci	.init = vv6410_init,
18862306a36Sopenharmony_ci	.init_controls = vv6410_init_controls,
18962306a36Sopenharmony_ci	.probe = vv6410_probe,
19062306a36Sopenharmony_ci	.start = vv6410_start,
19162306a36Sopenharmony_ci	.stop = vv6410_stop,
19262306a36Sopenharmony_ci	.dump = vv6410_dump,
19362306a36Sopenharmony_ci};
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci/* If NULL, only single value to write, stored in len */
19662306a36Sopenharmony_cistruct stv_init {
19762306a36Sopenharmony_ci	u16 addr;
19862306a36Sopenharmony_ci	u8 data;
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic const struct stv_init stv_bridge_init[] = {
20262306a36Sopenharmony_ci	/* This reg is written twice. Some kind of reset? */
20362306a36Sopenharmony_ci	{STV_RESET, 0x80},
20462306a36Sopenharmony_ci	{STV_RESET, 0x00},
20562306a36Sopenharmony_ci	{STV_SCAN_RATE, 0x00},
20662306a36Sopenharmony_ci	{STV_I2C_FLUSH, 0x04},
20762306a36Sopenharmony_ci	{STV_REG00, 0x0b},
20862306a36Sopenharmony_ci	{STV_REG01, 0xa7},
20962306a36Sopenharmony_ci	{STV_REG02, 0xb7},
21062306a36Sopenharmony_ci	{STV_REG03, 0x00},
21162306a36Sopenharmony_ci	{STV_REG04, 0x00},
21262306a36Sopenharmony_ci	{0x1536, 0x02},
21362306a36Sopenharmony_ci	{0x1537, 0x00},
21462306a36Sopenharmony_ci	{0x1538, 0x60},
21562306a36Sopenharmony_ci	{0x1539, 0x01},
21662306a36Sopenharmony_ci	{0x153a, 0x20},
21762306a36Sopenharmony_ci	{0x153b, 0x01},
21862306a36Sopenharmony_ci};
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic const u8 vv6410_sensor_init[][2] = {
22162306a36Sopenharmony_ci	/* Setup registers */
22262306a36Sopenharmony_ci	{VV6410_SETUP0,	VV6410_SOFT_RESET},
22362306a36Sopenharmony_ci	{VV6410_SETUP0,	VV6410_LOW_POWER_MODE},
22462306a36Sopenharmony_ci	/* Use shuffled read-out mode */
22562306a36Sopenharmony_ci	{VV6410_SETUP1,	BIT(6)},
22662306a36Sopenharmony_ci	/* All modes to 1, FST, Fast QCK, Free running QCK, Free running LST, FST will qualify visible pixels */
22762306a36Sopenharmony_ci	{VV6410_FGMODES, BIT(6) | BIT(4) | BIT(2) | BIT(0)},
22862306a36Sopenharmony_ci	{VV6410_PINMAPPING, 0x00},
22962306a36Sopenharmony_ci	/* Pre-clock generator divide off */
23062306a36Sopenharmony_ci	{VV6410_DATAFORMAT, BIT(7) | BIT(0)},
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	{VV6410_CLKDIV,	VV6410_CLK_DIV_2},
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	/* System registers */
23562306a36Sopenharmony_ci	/* Enable voltage doubler */
23662306a36Sopenharmony_ci	{VV6410_AS0, BIT(6) | BIT(4) | BIT(3) | BIT(2) | BIT(1)},
23762306a36Sopenharmony_ci	{VV6410_AT0, 0x00},
23862306a36Sopenharmony_ci	/* Power up audio, differential */
23962306a36Sopenharmony_ci	{VV6410_AT1, BIT(4) | BIT(0)},
24062306a36Sopenharmony_ci};
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci#endif
243