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