1c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*
2c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * USB Driver for ALi m5602 based webcams
3c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren *
40c505e688bb22c1b4431b4c07cd1fcff22fe37a2Erik Andren * Copyright (C) 2008 Erik Andrén
5c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
6c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
7c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren *
8c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Portions of code to USB interface and ALi driver software,
9c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * Copyright (c) 2006 Willem Duinker
10c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * v4l2 interface modeled after the V4L2 driver
11c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * for SN9C10x PC Camera Controllers
12c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren *
13c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * This program is free software; you can redistribute it and/or
14c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * modify it under the terms of the GNU General Public License as
15c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren * published by the Free Software Foundation, version 2.
16c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren *
17c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren */
18c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
19c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#ifndef M5602_BRIDGE_H_
20c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_BRIDGE_H_
21c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
22be2a9fae7be36864777e4b66f925d7af11578d99Jean-François Moine#include <linux/slab.h>
23c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#include "gspca.h"
24c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
25c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define MODULE_NAME "ALi m5602"
26c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
27c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*****************************************************************************/
28c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
29000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SENSOR_TYPE		0x00
30000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SENSOR_CTRL		0x01
31000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_LINE_OF_FRAME_H	0x02
32000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_LINE_OF_FRAME_L	0x03
33000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_PIX_OF_LINE_H		0x04
34000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_PIX_OF_LINE_L		0x05
35000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_VSYNC_PARA		0x06
36000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_HSYNC_PARA		0x07
37000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TEST_MODE_1		0x08
38000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TEST_MODE_2		0x09
39000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SIG_INI		0x0a
40000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_DS_PARA		0x0e
41000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TRIG_PARA		0x0f
42000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_CLK_PD			0x10
43000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_MCU_CLK_CTRL		0x12
44000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_MCU_CLK_DIV		0x13
45000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SEN_CLK_CTRL		0x14
46000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SEN_CLK_DIV		0x15
47000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_AUD_CLK_CTRL		0x16
48000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_AUD_CLK_DIV		0x17
4986c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_AC_LINK_STATE		0x22
5086c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_PCM_SLOT_INDEX		0x24
5186c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_GPIO_SLOT_INDEX	0x25
5286c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_STATUS_ADDRESS_H	0x28
5386c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_STATUS_DATA_L	0x29
5486c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_STATUS_DATA_H	0x2a
5586c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACTX_COMMAND_ADDRESS	0x31
5686c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACRX_COMMAND_DATA_L	0x32
5786c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_OB_ACTX_COMMAND_DATA_H	0X33
58000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_DEVCTR1		0x41
59000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPSETR0		0x42
60000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPAFCTR		0x47
61000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPBFCTR		0x49
62000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_EPEFCTR		0x4f
63000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_TEST_REG		0x53
64000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ALT2SIZE		0x54
65000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ALT3SIZE		0x55
66000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_OBSFRAME		0x56
67000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_PWR_CTL		0x59
68000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ADC_CTRL		0x60
69000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_ADC_DATA		0x61
70000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_MISC_CTRL		0x62
71000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SNAPSHOT		0x63
72000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_1		0x64
73000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_2		0x65
74000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_3		0x66
75000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_SCRATCH_4		0x67
76000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_CTRL		0x68
77000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_CLK_DIV		0x69
78000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_DEV_ADDR		0x6a
79000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_REG_ADDR		0x6b
80000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_DATA		0x6c
81000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_I2C_STATUS		0x6d
82000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DAT_H		0x70
83000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DAT_L		0x71
84000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DIR_H		0x72
85000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DIR_L		0x73
86000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_EN_H		0x74
87000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_EN_L		0x75
88000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DAT		0x76
89000e177f78466be2487ac4983291abb7b0ff0be7Erik Andrén#define M5602_XB_GPIO_DIR		0x77
9086c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_SEN_CLK_CONTROL	0x80
9186c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_SEN_CLK_DIVISION	0x81
9286c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_CPR_CLK_CONTROL	0x82
9386c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_CPR_CLK_DIVISION	0x83
9486c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_MCU_CLK_CONTROL	0x84
9586c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_MCU_CLK_DIVISION	0x85
9686c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_DCT_CLK_CONTROL	0x86
9786c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_DCT_CLK_DIVISION	0x87
9886c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_EC_CLK_CONTROL		0x88
9986c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_EC_CLK_DIVISION	0x89
10086c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_LBUF_CLK_CONTROL	0x8a
10186c9fb5118820af4740ef1d0896fdd4f0923039fErik Andr?n#define M5602_XB_LBUF_CLK_DIVISION	0x8b
102c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
1039267b1e8249983ecaded94bf23253a66a5cc55fcErik Andrén#define I2C_BUSY 0x80
104c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
105c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*****************************************************************************/
106c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
107c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* Driver info */
108c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define DRIVER_AUTHOR "ALi m5602 Linux Driver Project"
109c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define DRIVER_DESC "ALi m5602 webcam driver"
110c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
111c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_ISOC_ENDPOINT_ADDR 0x81
112c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_INTR_ENDPOINT_ADDR 0x82
113c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
114c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#define M5602_URB_MSG_TIMEOUT   5000
115c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
116c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/*****************************************************************************/
117c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
118c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* A skeleton used for sending messages to the m5602 bridge */
119c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenstatic const unsigned char bridge_urb_skeleton[] = {
120c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x13, 0x00, 0x81, 0x00
121c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren};
122c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
123c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren/* A skeleton used for sending messages to the sensor */
124c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenstatic const unsigned char sensor_urb_skeleton[] = {
125c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x23, M5602_XB_GPIO_EN_H, 0x81, 0x06,
126c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x23, M5602_XB_MISC_CTRL, 0x81, 0x80,
127c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x13, M5602_XB_I2C_DEV_ADDR, 0x81, 0x00,
128c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x13, M5602_XB_I2C_REG_ADDR, 0x81, 0x00,
129c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x13, M5602_XB_I2C_DATA, 0x81, 0x00,
130c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	0x13, M5602_XB_I2C_CTRL, 0x81, 0x11
131c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren};
132c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
133c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenstruct sd {
134c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	struct gspca_dev gspca_dev;
135c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
136c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	/* A pointer to the currently connected sensor */
137e4cc4fcc7b85ec32f05343b02229492c06baba1aErik Andr?n	const struct m5602_sensor *sensor;
138c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
139c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	/* The current frame's id, used to detect frame boundaries */
140c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	u8 frame_id;
141c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
142c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	/* The current frame count */
143c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren	u32 frame_count;
144c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede
145c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	/* Camera rotation polling thread for "flipable" cams */
146c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	struct task_struct *rotation_thread;
147c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede
148c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	struct { /* auto-white-bal + green/red/blue balance control cluster */
149c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *auto_white_bal;
150c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *red_bal;
151c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *blue_bal;
152c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *green_bal;
153c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	};
154c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	struct { /* autoexpo / expo cluster */
155c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *autoexpo;
156c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *expo;
157c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	};
158c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	struct { /* autogain / gain cluster */
159c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *autogain;
160c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *gain;
161c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	};
162c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	struct { /* hflip/vflip cluster */
163c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *hflip;
164c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede		struct v4l2_ctrl *vflip;
165c84e412f6f3be6ba262b1b9691ce57593b576c90Hans de Goede	};
166c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren};
167c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
168c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenint m5602_read_bridge(
169ff1e6a2155a42f99a9ded8362be2962b1089296bErik Andrén	struct sd *sd, const u8 address, u8 *i2c_data);
170c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
171c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andrenint m5602_write_bridge(
172ff1e6a2155a42f99a9ded8362be2962b1089296bErik Andrén	struct sd *sd, const u8 address, const u8 i2c_data);
173c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren
1746dc4cff0c391c691dae56486f854534658fdfea8Erik Andrénint m5602_write_sensor(struct sd *sd, const u8 address,
1756dc4cff0c391c691dae56486f854534658fdfea8Erik Andrén		       u8 *i2c_data, const u8 len);
1766dc4cff0c391c691dae56486f854534658fdfea8Erik Andrén
177e7a7f5103bddf2491760677cdd715a865b889072Erik Andrénint m5602_read_sensor(struct sd *sd, const u8 address,
178e7a7f5103bddf2491760677cdd715a865b889072Erik Andrén		      u8 *i2c_data, const u8 len);
179e7a7f5103bddf2491760677cdd715a865b889072Erik Andrén
180c109f8168f259ea1f1ab7009c6b99dbe8ea0e2b2Erik Andren#endif
181