1#ifndef __LINUX_MSM_CAM_SENSOR_H
2#define __LINUX_MSM_CAM_SENSOR_H
3
4#ifdef MSM_CAMERA_BIONIC
5#include <sys/types.h>
6#endif
7#include <linux/types.h>
8#include <linux/v4l2-mediabus.h>
9#include <linux/i2c.h>
10
11#define I2C_SEQ_REG_SETTING_MAX   5
12#define I2C_SEQ_REG_DATA_MAX      20
13#define MAX_CID                   16
14
15#define MSM_SENSOR_MCLK_8HZ   8000000
16#define MSM_SENSOR_MCLK_16HZ  16000000
17#define MSM_SENSOR_MCLK_24HZ  24000000
18
19#define GPIO_OUT_LOW          (0 << 1)
20#define GPIO_OUT_HIGH         (1 << 1)
21
22#define CSI_EMBED_DATA        0x12
23#define CSI_RESERVED_DATA_0   0x13
24#define CSI_YUV422_8          0x1E
25#define CSI_RAW8              0x2A
26#define CSI_RAW10             0x2B
27#define CSI_RAW12             0x2C
28
29#define CSI_DECODE_6BIT         0
30#define CSI_DECODE_8BIT         1
31#define CSI_DECODE_10BIT        2
32#define CSI_DECODE_DPCM_10_8_10 5
33
34#define MAX_SENSOR_NAME 32
35
36#define MAX_ACT_MOD_NAME_SIZE 32
37#define MAX_ACT_NAME_SIZE 32
38#define NUM_ACTUATOR_DIR 2
39#define MAX_ACTUATOR_SCENARIO 8
40#define MAX_ACTUATOR_REGION 5
41#define MAX_ACTUATOR_INIT_SET 12
42#define MAX_ACTUATOR_REG_TBL_SIZE 8
43
44#define MOVE_NEAR 0
45#define MOVE_FAR  1
46
47#define MAX_EEPROM_NAME 32
48
49enum msm_camera_i2c_reg_addr_type {
50	MSM_CAMERA_I2C_BYTE_ADDR = 1,
51	MSM_CAMERA_I2C_WORD_ADDR,
52	MSM_CAMERA_I2C_3B_ADDR,
53};
54
55enum msm_camera_i2c_data_type {
56	MSM_CAMERA_I2C_BYTE_DATA = 1,
57	MSM_CAMERA_I2C_WORD_DATA,
58	MSM_CAMERA_I2C_SET_BYTE_MASK,
59	MSM_CAMERA_I2C_UNSET_BYTE_MASK,
60	MSM_CAMERA_I2C_SET_WORD_MASK,
61	MSM_CAMERA_I2C_UNSET_WORD_MASK,
62	MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA,
63};
64
65enum msm_sensor_power_seq_type_t {
66	SENSOR_CLK,
67	SENSOR_GPIO,
68	SENSOR_VREG,
69	SENSOR_I2C_MUX,
70};
71
72enum msm_sensor_clk_type_t {
73	SENSOR_CAM_MCLK,
74	SENSOR_CAM_CLK,
75	SENSOR_CAM_CLK_MAX,
76};
77
78enum msm_sensor_power_seq_gpio_t {
79	SENSOR_GPIO_RESET,
80	SENSOR_GPIO_STANDBY,
81	SENSOR_GPIO_VANA,
82	SENSOR_GPIO_VDIG,
83	SENSOR_GPIO_VIO,
84	SENSOR_GPIO_VCM,
85	SENSOR_GPIO_OIS_LDO_EN,
86	SENSOR_GPIO_OIS_RESET,
87	SENSOR_GPIO_MAX,
88};
89
90enum msm_camera_vreg_name_t {
91	CAM_VDIG,
92	CAM_VIO,
93	CAM_VANA,
94	CAM_VAF,
95	CAM_VREG_MAX,
96};
97
98enum msm_sensor_resolution_t {
99	MSM_SENSOR_RES_FULL,
100	MSM_SENSOR_RES_QTR,
101	MSM_SENSOR_RES_2,
102	MSM_SENSOR_RES_3,
103	MSM_SENSOR_RES_4,
104	MSM_SENSOR_RES_5,
105	MSM_SENSOR_RES_6,
106	MSM_SENSOR_RES_7,
107	MSM_SENSOR_INVALID_RES,
108};
109
110enum sensor_sub_module_t {
111	SUB_MODULE_SENSOR,
112	SUB_MODULE_CHROMATIX,
113	SUB_MODULE_ACTUATOR,
114	SUB_MODULE_EEPROM,
115	SUB_MODULE_LED_FLASH,
116	SUB_MODULE_STROBE_FLASH,
117	SUB_MODULE_CSID,
118	SUB_MODULE_CSID_3D,
119	SUB_MODULE_CSIPHY,
120	SUB_MODULE_CSIPHY_3D,
121	SUB_MODULE_MAX,
122};
123
124enum csid_cfg_type_t {
125	CSID_INIT,
126	CSID_CFG,
127	CSID_RELEASE,
128};
129
130enum csiphy_cfg_type_t {
131	CSIPHY_INIT,
132	CSIPHY_CFG,
133	CSIPHY_RELEASE,
134};
135
136enum camera_vreg_type {
137	REG_LDO,
138	REG_VS,
139	REG_GPIO,
140};
141
142struct msm_sensor_power_setting {
143	enum msm_sensor_power_seq_type_t seq_type;
144	uint16_t seq_val;
145	long config_val;
146	uint16_t delay;
147	void *data[10];
148};
149
150struct msm_sensor_power_setting_array {
151	struct msm_sensor_power_setting *power_setting;
152	uint16_t size;
153};
154
155struct msm_sensor_id_info_t {
156	uint16_t sensor_id_reg_addr;
157	uint16_t sensor_id;
158};
159
160struct msm_camera_sensor_slave_info {
161	uint16_t slave_addr;
162	enum msm_camera_i2c_reg_addr_type addr_type;
163	struct msm_sensor_id_info_t sensor_id_info;
164	struct msm_sensor_power_setting_array power_setting_array;
165};
166
167struct msm_camera_i2c_reg_array {
168	uint16_t reg_addr;
169	uint16_t reg_data;
170};
171
172struct msm_camera_i2c_reg_setting {
173	struct msm_camera_i2c_reg_array *reg_setting;
174	uint16_t size;
175	enum msm_camera_i2c_reg_addr_type addr_type;
176	enum msm_camera_i2c_data_type data_type;
177	uint16_t delay;
178};
179
180struct msm_camera_i2c_seq_reg_array {
181	uint16_t reg_addr;
182	uint8_t reg_data[I2C_SEQ_REG_DATA_MAX];
183	uint16_t reg_data_size;
184};
185
186struct msm_camera_i2c_seq_reg_setting {
187	struct msm_camera_i2c_seq_reg_array *reg_setting;
188	uint16_t size;
189	enum msm_camera_i2c_reg_addr_type addr_type;
190	uint16_t delay;
191};
192
193struct msm_camera_i2c_array_write_config {
194	struct msm_camera_i2c_reg_setting conf_array;
195	uint16_t slave_addr;
196};
197
198struct msm_camera_i2c_read_config {
199	uint16_t slave_addr;
200	uint16_t reg_addr;
201	enum msm_camera_i2c_data_type data_type;
202	uint16_t *data;
203};
204
205struct msm_camera_csid_vc_cfg {
206	uint8_t cid;
207	uint8_t dt;
208	uint8_t decode_format;
209};
210
211struct msm_camera_csid_lut_params {
212	uint8_t num_cid;
213	struct msm_camera_csid_vc_cfg *vc_cfg[MAX_CID];
214};
215
216struct msm_camera_csid_params {
217	uint8_t lane_cnt;
218	uint16_t lane_assign;
219	uint8_t phy_sel;
220	struct msm_camera_csid_lut_params lut_params;
221};
222
223struct msm_camera_csiphy_params {
224	uint8_t lane_cnt;
225	uint8_t settle_cnt;
226	uint16_t lane_mask;
227	uint8_t combo_mode;
228	uint8_t csid_core;
229};
230
231struct msm_camera_csi2_params {
232	struct msm_camera_csid_params csid_params;
233	struct msm_camera_csiphy_params csiphy_params;
234};
235
236struct msm_camera_csi_lane_params {
237	uint16_t csi_lane_assign;
238	uint16_t csi_lane_mask;
239};
240
241struct csi_lane_params_t {
242	uint16_t csi_lane_assign;
243	uint8_t csi_lane_mask;
244	uint8_t csi_if;
245	uint8_t csid_core[2];
246	uint8_t csi_phy_sel;
247};
248
249struct msm_sensor_info_t {
250	char sensor_name[MAX_SENSOR_NAME];
251	int32_t    session_id;
252	int32_t     subdev_id[SUB_MODULE_MAX];
253};
254
255struct msm_sensor_ois_info_t {
256	char ois_provider[MAX_SENSOR_NAME];
257	int16_t gyro[2];
258	int16_t target[2];
259	int16_t hall[2];
260	uint8_t is_stable;
261};
262
263enum ois_mode_t {
264	OIS_MODE_PREVIEW_CAPTURE,
265	OIS_MODE_VIDEO,
266	OIS_MODE_CAPTURE,
267	OIS_MODE_CENTERING_ONLY,
268	OIS_MODE_CENTERING_OFF
269};
270
271enum ois_ver_t {
272	OIS_VER_RELEASE,
273	OIS_VER_CALIBRATION,
274	OIS_VER_DEBUG
275};
276
277struct camera_vreg_t {
278	const char *reg_name;
279	enum camera_vreg_type type;
280	int min_voltage;
281	int max_voltage;
282	int op_mode;
283	uint32_t delay;
284};
285
286enum camb_position_t {
287	BACK_CAMERA_B,
288	FRONT_CAMERA_B,
289};
290
291enum camerab_mode_t {
292	CAMERA_MODE_2D_B = (1<<0),
293	CAMERA_MODE_3D_B = (1<<1)
294};
295
296struct msm_sensor_init_params {
297	/* mask of modes supported: 2D, 3D */
298	int                 modes_supported;
299	/* sensor position: front, back */
300	enum camb_position_t position;
301	/* sensor mount angle */
302	uint32_t            sensor_mount_angle;
303	int                 ois_supported;
304};
305
306struct sensorb_cfg_data {
307	int cfgtype;
308	union {
309		struct msm_sensor_info_t      sensor_info;
310		struct msm_sensor_init_params sensor_init_params;
311		struct msm_sensor_ois_info_t  ois_info;
312		void                         *setting;
313	} cfg;
314};
315
316struct csid_cfg_data {
317	enum csid_cfg_type_t cfgtype;
318	union {
319		uint32_t csid_version;
320		struct msm_camera_csid_params *csid_params;
321	} cfg;
322};
323
324struct csiphy_cfg_data {
325	enum csiphy_cfg_type_t cfgtype;
326	union {
327		struct msm_camera_csiphy_params *csiphy_params;
328		struct msm_camera_csi_lane_params *csi_lane_params;
329	} cfg;
330};
331
332enum eeprom_cfg_type_t {
333	CFG_EEPROM_GET_INFO,
334	CFG_EEPROM_GET_CAL_DATA,
335	CFG_EEPROM_READ_CAL_DATA,
336	CFG_EEPROM_WRITE_DATA,
337};
338struct eeprom_get_t {
339	uint16_t num_bytes;
340};
341
342struct eeprom_read_t {
343	uint8_t *dbuffer;
344	uint16_t num_bytes;
345};
346
347struct eeprom_write_t {
348	uint8_t *dbuffer;
349	uint16_t num_bytes;
350};
351
352struct msm_eeprom_cfg_data {
353	enum eeprom_cfg_type_t cfgtype;
354	uint8_t is_supported;
355	union {
356		char eeprom_name[MAX_SENSOR_NAME];
357		struct eeprom_get_t get_data;
358		struct eeprom_read_t read_data;
359		struct eeprom_write_t write_data;
360	} cfg;
361};
362
363enum msm_sensor_cfg_type_t {
364	CFG_SET_SLAVE_INFO,
365	CFG_SLAVE_READ_I2C,
366	CFG_WRITE_I2C_ARRAY,
367	CFG_SLAVE_WRITE_I2C_ARRAY,
368	CFG_WRITE_I2C_SEQ_ARRAY,
369	CFG_POWER_UP,
370	CFG_POWER_DOWN,
371	CFG_SET_STOP_STREAM_SETTING,
372	CFG_GET_SENSOR_INFO,
373	CFG_GET_SENSOR_INIT_PARAMS,
374	CFG_SET_INIT_SETTING,
375	CFG_SET_RESOLUTION,
376	CFG_SET_STOP_STREAM,
377	CFG_SET_START_STREAM,
378	CFG_OIS_ON,
379	CFG_OIS_OFF,
380	CFG_GET_OIS_INFO,
381	CFG_SET_OIS_MODE,
382	CFG_OIS_MOVE_LENS
383};
384
385enum msm_actuator_cfg_type_t {
386	CFG_GET_ACTUATOR_INFO,
387	CFG_SET_ACTUATOR_INFO,
388	CFG_SET_DEFAULT_FOCUS,
389	CFG_MOVE_FOCUS,
390};
391
392enum actuator_type {
393	ACTUATOR_VCM,
394	ACTUATOR_PIEZO,
395};
396
397enum msm_actuator_data_type {
398	MSM_ACTUATOR_BYTE_DATA = 1,
399	MSM_ACTUATOR_WORD_DATA,
400};
401
402enum msm_actuator_addr_type {
403	MSM_ACTUATOR_BYTE_ADDR = 1,
404	MSM_ACTUATOR_WORD_ADDR,
405};
406
407struct reg_settings_t {
408	uint16_t reg_addr;
409	uint16_t reg_data;
410};
411
412struct region_params_t {
413	/* [0] = ForwardDirection Macro boundary
414	   [1] = ReverseDirection Inf boundary
415        */
416	uint16_t step_bound[2];
417	uint16_t code_per_step;
418};
419
420struct damping_params_t {
421	uint32_t damping_step;
422	uint32_t damping_delay;
423	uint32_t hw_params;
424};
425
426struct msm_actuator_move_params_t {
427	int8_t dir;
428	int8_t sign_dir;
429	int16_t dest_step_pos;
430	int32_t num_steps;
431	int32_t num_steps_inf_pos;
432	struct damping_params_t *ringing_params;
433};
434
435struct msm_actuator_tuning_params_t {
436	int16_t initial_code;
437	uint16_t pwd_step;
438	uint16_t region_size;
439	uint32_t total_steps;
440	struct region_params_t *region_params;
441};
442
443struct msm_actuator_params_t {
444	enum actuator_type act_type;
445	uint8_t reg_tbl_size;
446	uint16_t data_size;
447	uint16_t init_setting_size;
448	uint32_t i2c_addr;
449	enum msm_actuator_addr_type i2c_addr_type;
450	enum msm_actuator_data_type i2c_data_type;
451	struct msm_actuator_reg_params_t *reg_tbl_params;
452	struct reg_settings_t *init_settings;
453};
454
455struct msm_actuator_set_info_t {
456	struct msm_actuator_params_t actuator_params;
457	struct msm_actuator_tuning_params_t af_tuning_params;
458};
459
460struct msm_actuator_get_info_t {
461	uint32_t focal_length_num;
462	uint32_t focal_length_den;
463	uint32_t f_number_num;
464	uint32_t f_number_den;
465	uint32_t f_pix_num;
466	uint32_t f_pix_den;
467	uint32_t total_f_dist_num;
468	uint32_t total_f_dist_den;
469	uint32_t hor_view_angle_num;
470	uint32_t hor_view_angle_den;
471	uint32_t ver_view_angle_num;
472	uint32_t ver_view_angle_den;
473};
474
475enum af_camera_name {
476	ACTUATOR_MAIN_CAM_0,
477	ACTUATOR_MAIN_CAM_1,
478	ACTUATOR_MAIN_CAM_2,
479	ACTUATOR_MAIN_CAM_3,
480	ACTUATOR_MAIN_CAM_4,
481	ACTUATOR_MAIN_CAM_5,
482	ACTUATOR_WEB_CAM_0,
483	ACTUATOR_WEB_CAM_1,
484	ACTUATOR_WEB_CAM_2,
485};
486
487struct msm_actuator_cfg_data {
488	int cfgtype;
489	uint8_t is_af_supported;
490	union {
491		struct msm_actuator_move_params_t move;
492		struct msm_actuator_set_info_t set_info;
493		struct msm_actuator_get_info_t get_info;
494		enum af_camera_name cam_name;
495	} cfg;
496};
497
498enum msm_actuator_write_type {
499	MSM_ACTUATOR_WRITE_HW_DAMP,
500	MSM_ACTUATOR_WRITE_DAC,
501};
502
503struct msm_actuator_reg_params_t {
504	enum msm_actuator_write_type reg_write_type;
505	uint32_t hw_mask;
506	uint16_t reg_addr;
507	uint16_t hw_shift;
508	uint16_t data_shift;
509};
510
511enum msm_camera_led_config_t {
512	MSM_CAMERA_LED_OFF,
513	MSM_CAMERA_LED_LOW,
514	MSM_CAMERA_LED_HIGH,
515	MSM_CAMERA_LED_INIT,
516	MSM_CAMERA_LED_RELEASE,
517};
518
519struct msm_camera_led_cfg_t {
520	enum msm_camera_led_config_t cfgtype;
521};
522
523#define VIDIOC_MSM_SENSOR_CFG \
524	_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data)
525
526#define VIDIOC_MSM_SENSOR_RELEASE \
527	_IO('V', BASE_VIDIOC_PRIVATE + 2)
528
529#define VIDIOC_MSM_SENSOR_GET_SUBDEV_ID \
530	_IOWR('V', BASE_VIDIOC_PRIVATE + 3, uint32_t)
531
532#define VIDIOC_MSM_CSIPHY_IO_CFG \
533	_IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct csid_cfg_data)
534
535#define VIDIOC_MSM_CSID_IO_CFG \
536	_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csiphy_cfg_data)
537
538#define VIDIOC_MSM_ACTUATOR_CFG \
539	_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data)
540
541#define VIDIOC_MSM_FLASH_LED_DATA_CFG \
542	_IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct msm_camera_led_cfg_t)
543
544#define VIDIOC_MSM_EEPROM_CFG \
545	_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data)
546
547#define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */
548
549#endif /* __LINUX_MSM_CAM_SENSOR_H */
550