1#ifndef __UAPI_LINUX_MSM_CAM_SENSOR_H
2#define __UAPI_LINUX_MSM_CAM_SENSOR_H
3
4#include <linux/v4l2-mediabus.h>
5#include <media/msm_camsensor_sdk.h>
6
7#include <linux/types.h>
8#include <linux/i2c.h>
9
10#define I2C_SEQ_REG_SETTING_MAX   5
11
12#define MSM_SENSOR_MCLK_8HZ   8000000
13#define MSM_SENSOR_MCLK_16HZ  16000000
14#define MSM_SENSOR_MCLK_24HZ  24000000
15
16#define MAX_SENSOR_NAME 32
17#define MAX_ACTUATOR_AF_TOTAL_STEPS 1024
18
19#define MAX_OIS_MOD_NAME_SIZE 32
20#define MAX_OIS_NAME_SIZE 32
21#define MAX_OIS_REG_SETTINGS 800
22
23#define MOVE_NEAR 0
24#define MOVE_FAR  1
25
26#define MSM_ACTUATOR_MOVE_SIGNED_FAR -1
27#define MSM_ACTUATOR_MOVE_SIGNED_NEAR  1
28
29#define MAX_ACTUATOR_REGION  5
30
31#define MAX_EEPROM_NAME 32
32
33#define MAX_AF_ITERATIONS 3
34#define MAX_NUMBER_OF_STEPS 47
35#define MAX_REGULATOR 5
36
37#define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */
38#define MSM_V4L2_PIX_FMT_SBGGR14 v4l2_fourcc('B', 'G', '1', '4')
39	/* 14  BGBG.. GRGR.. */
40#define MSM_V4L2_PIX_FMT_SGBRG14 v4l2_fourcc('G', 'B', '1', '4')
41	/* 14  GBGB.. RGRG.. */
42#define MSM_V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4')
43	/* 14  GRGR.. BGBG.. */
44#define MSM_V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4')
45	/* 14  RGRG.. GBGB.. */
46
47enum flash_type {
48	LED_FLASH = 1,
49	STROBE_FLASH,
50	GPIO_FLASH
51};
52
53enum msm_sensor_resolution_t {
54	MSM_SENSOR_RES_FULL,
55	MSM_SENSOR_RES_QTR,
56	MSM_SENSOR_RES_2,
57	MSM_SENSOR_RES_3,
58	MSM_SENSOR_RES_4,
59	MSM_SENSOR_RES_5,
60	MSM_SENSOR_RES_6,
61	MSM_SENSOR_RES_7,
62	MSM_SENSOR_INVALID_RES,
63};
64
65enum msm_camera_stream_type_t {
66	MSM_CAMERA_STREAM_PREVIEW,
67	MSM_CAMERA_STREAM_SNAPSHOT,
68	MSM_CAMERA_STREAM_VIDEO,
69	MSM_CAMERA_STREAM_INVALID,
70};
71
72enum sensor_sub_module_t {
73	SUB_MODULE_SENSOR,
74	SUB_MODULE_CHROMATIX,
75	SUB_MODULE_ACTUATOR,
76	SUB_MODULE_EEPROM,
77	SUB_MODULE_LED_FLASH,
78	SUB_MODULE_STROBE_FLASH,
79	SUB_MODULE_CSID,
80	SUB_MODULE_CSID_3D,
81	SUB_MODULE_CSIPHY,
82	SUB_MODULE_CSIPHY_3D,
83	SUB_MODULE_OIS,
84	SUB_MODULE_EXT,
85	SUB_MODULE_MAX,
86};
87
88enum {
89	MSM_CAMERA_EFFECT_MODE_OFF,
90	MSM_CAMERA_EFFECT_MODE_MONO,
91	MSM_CAMERA_EFFECT_MODE_NEGATIVE,
92	MSM_CAMERA_EFFECT_MODE_SOLARIZE,
93	MSM_CAMERA_EFFECT_MODE_SEPIA,
94	MSM_CAMERA_EFFECT_MODE_POSTERIZE,
95	MSM_CAMERA_EFFECT_MODE_WHITEBOARD,
96	MSM_CAMERA_EFFECT_MODE_BLACKBOARD,
97	MSM_CAMERA_EFFECT_MODE_AQUA,
98	MSM_CAMERA_EFFECT_MODE_EMBOSS,
99	MSM_CAMERA_EFFECT_MODE_SKETCH,
100	MSM_CAMERA_EFFECT_MODE_NEON,
101	MSM_CAMERA_EFFECT_MODE_MAX
102};
103
104enum {
105	MSM_CAMERA_WB_MODE_AUTO,
106	MSM_CAMERA_WB_MODE_CUSTOM,
107	MSM_CAMERA_WB_MODE_INCANDESCENT,
108	MSM_CAMERA_WB_MODE_FLUORESCENT,
109	MSM_CAMERA_WB_MODE_WARM_FLUORESCENT,
110	MSM_CAMERA_WB_MODE_DAYLIGHT,
111	MSM_CAMERA_WB_MODE_CLOUDY_DAYLIGHT,
112	MSM_CAMERA_WB_MODE_TWILIGHT,
113	MSM_CAMERA_WB_MODE_SHADE,
114	MSM_CAMERA_WB_MODE_OFF,
115	MSM_CAMERA_WB_MODE_MAX
116};
117
118enum {
119	MSM_CAMERA_SCENE_MODE_OFF,
120	MSM_CAMERA_SCENE_MODE_AUTO,
121	MSM_CAMERA_SCENE_MODE_LANDSCAPE,
122	MSM_CAMERA_SCENE_MODE_SNOW,
123	MSM_CAMERA_SCENE_MODE_BEACH,
124	MSM_CAMERA_SCENE_MODE_SUNSET,
125	MSM_CAMERA_SCENE_MODE_NIGHT,
126	MSM_CAMERA_SCENE_MODE_PORTRAIT,
127	MSM_CAMERA_SCENE_MODE_BACKLIGHT,
128	MSM_CAMERA_SCENE_MODE_SPORTS,
129	MSM_CAMERA_SCENE_MODE_ANTISHAKE,
130	MSM_CAMERA_SCENE_MODE_FLOWERS,
131	MSM_CAMERA_SCENE_MODE_CANDLELIGHT,
132	MSM_CAMERA_SCENE_MODE_FIREWORKS,
133	MSM_CAMERA_SCENE_MODE_PARTY,
134	MSM_CAMERA_SCENE_MODE_NIGHT_PORTRAIT,
135	MSM_CAMERA_SCENE_MODE_THEATRE,
136	MSM_CAMERA_SCENE_MODE_ACTION,
137	MSM_CAMERA_SCENE_MODE_AR,
138	MSM_CAMERA_SCENE_MODE_FACE_PRIORITY,
139	MSM_CAMERA_SCENE_MODE_BARCODE,
140	MSM_CAMERA_SCENE_MODE_HDR,
141	MSM_CAMERA_SCENE_MODE_MAX
142};
143
144enum csid_cfg_type_t {
145	CSID_INIT,
146	CSID_CFG,
147	CSID_TESTMODE_CFG,
148	CSID_RELEASE,
149};
150
151enum csiphy_cfg_type_t {
152	CSIPHY_INIT,
153	CSIPHY_CFG,
154	CSIPHY_RELEASE,
155};
156
157enum camera_vreg_type {
158	VREG_TYPE_DEFAULT,
159	VREG_TYPE_CUSTOM,
160};
161
162enum sensor_af_t {
163	SENSOR_AF_FOCUSSED,
164	SENSOR_AF_NOT_FOCUSSED,
165};
166
167enum cci_i2c_master_t {
168	MASTER_0,
169	MASTER_1,
170	MASTER_MAX,
171};
172
173struct msm_camera_i2c_array_write_config {
174	struct msm_camera_i2c_reg_setting conf_array;
175	uint16_t slave_addr;
176};
177
178struct msm_camera_i2c_read_config {
179	uint16_t slave_addr;
180	uint16_t reg_addr;
181	enum msm_camera_i2c_reg_addr_type addr_type;
182	enum msm_camera_i2c_data_type data_type;
183	uint16_t data;
184};
185
186struct msm_camera_csi2_params {
187	struct msm_camera_csid_params csid_params;
188	struct msm_camera_csiphy_params csiphy_params;
189	uint8_t csi_clk_scale_enable;
190};
191
192struct msm_camera_csi_lane_params {
193	uint16_t csi_lane_assign;
194	uint16_t csi_lane_mask;
195};
196
197struct csi_lane_params_t {
198	uint16_t csi_lane_assign;
199	uint8_t csi_lane_mask;
200	uint8_t csi_if;
201	int8_t csid_core[2];
202	uint8_t csi_phy_sel;
203};
204
205struct msm_sensor_info_t {
206	char     sensor_name[MAX_SENSOR_NAME];
207	uint32_t session_id;
208	int32_t  subdev_id[SUB_MODULE_MAX];
209	int32_t  subdev_intf[SUB_MODULE_MAX];
210	uint8_t  is_mount_angle_valid;
211	uint32_t sensor_mount_angle;
212	int modes_supported;
213	enum camb_position_t position;
214};
215
216struct camera_vreg_t {
217	const char *reg_name;
218	int min_voltage;
219	int max_voltage;
220	int op_mode;
221	uint32_t delay;
222	const char *custom_vreg_name;
223	enum camera_vreg_type type;
224};
225
226struct sensorb_cfg_data {
227	int cfgtype;
228	union {
229		struct msm_sensor_info_t      sensor_info;
230		struct msm_sensor_init_params sensor_init_params;
231		void                         *setting;
232		struct msm_sensor_i2c_sync_params sensor_i2c_sync_params;
233	} cfg;
234};
235
236struct csid_cfg_data {
237	enum csid_cfg_type_t cfgtype;
238	union {
239		uint32_t csid_version;
240		struct msm_camera_csid_params *csid_params;
241		struct msm_camera_csid_testmode_parms *csid_testmode_params;
242	} cfg;
243};
244
245struct csiphy_cfg_data {
246	enum csiphy_cfg_type_t cfgtype;
247	union {
248		struct msm_camera_csiphy_params *csiphy_params;
249		struct msm_camera_csi_lane_params *csi_lane_params;
250	} cfg;
251};
252
253enum eeprom_cfg_type_t {
254	CFG_EEPROM_GET_INFO,
255	CFG_EEPROM_GET_CAL_DATA,
256	CFG_EEPROM_READ_CAL_DATA,
257	CFG_EEPROM_WRITE_DATA,
258	CFG_EEPROM_GET_MM_INFO,
259	CFG_EEPROM_INIT,
260};
261
262struct eeprom_get_t {
263	uint32_t num_bytes;
264};
265
266struct eeprom_read_t {
267	uint8_t *dbuffer;
268	uint32_t num_bytes;
269};
270
271struct eeprom_write_t {
272	uint8_t *dbuffer;
273	uint32_t num_bytes;
274};
275
276struct eeprom_get_cmm_t {
277	uint32_t cmm_support;
278	uint32_t cmm_compression;
279	uint32_t cmm_size;
280};
281
282struct msm_eeprom_info_t {
283	struct msm_sensor_power_setting_array *power_setting_array;
284	enum i2c_freq_mode_t i2c_freq_mode;
285	struct msm_eeprom_memory_map_array *mem_map_array;
286};
287
288struct msm_eeprom_cfg_data {
289	enum eeprom_cfg_type_t cfgtype;
290	uint8_t is_supported;
291	union {
292		char eeprom_name[MAX_SENSOR_NAME];
293		struct eeprom_get_t get_data;
294		struct eeprom_read_t read_data;
295		struct eeprom_write_t write_data;
296		struct eeprom_get_cmm_t get_cmm_data;
297		struct msm_eeprom_info_t eeprom_info;
298	} cfg;
299};
300
301enum msm_sensor_cfg_type_t {
302	CFG_SET_SLAVE_INFO,
303	CFG_SLAVE_READ_I2C,
304	CFG_WRITE_I2C_ARRAY,
305	CFG_SLAVE_WRITE_I2C_ARRAY,
306	CFG_WRITE_I2C_SEQ_ARRAY,
307	CFG_POWER_UP,
308	CFG_POWER_DOWN,
309	CFG_SET_STOP_STREAM_SETTING,
310	CFG_GET_SENSOR_INFO,
311	CFG_GET_SENSOR_INIT_PARAMS,
312	CFG_SET_INIT_SETTING,
313	CFG_SET_RESOLUTION,
314	CFG_SET_STOP_STREAM,
315	CFG_SET_START_STREAM,
316	CFG_SET_SATURATION,
317	CFG_SET_CONTRAST,
318	CFG_SET_SHARPNESS,
319	CFG_SET_ISO,
320	CFG_SET_EXPOSURE_COMPENSATION,
321	CFG_SET_ANTIBANDING,
322	CFG_SET_BESTSHOT_MODE,
323	CFG_SET_EFFECT,
324	CFG_SET_WHITE_BALANCE,
325	CFG_SET_AUTOFOCUS,
326	CFG_CANCEL_AUTOFOCUS,
327	CFG_SET_STREAM_TYPE,
328	CFG_SET_I2C_SYNC_PARAM,
329	CFG_WRITE_I2C_ARRAY_ASYNC,
330	CFG_WRITE_I2C_ARRAY_SYNC,
331	CFG_WRITE_I2C_ARRAY_SYNC_BLOCK,
332};
333
334enum msm_actuator_cfg_type_t {
335	CFG_GET_ACTUATOR_INFO,
336	CFG_SET_ACTUATOR_INFO,
337	CFG_SET_DEFAULT_FOCUS,
338	CFG_MOVE_FOCUS,
339	CFG_SET_POSITION,
340	CFG_ACTUATOR_POWERDOWN,
341	CFG_ACTUATOR_POWERUP,
342	CFG_ACTUATOR_INIT,
343};
344
345enum msm_ois_cfg_type_t {
346	CFG_OIS_INIT,
347	CFG_OIS_POWERDOWN,
348	CFG_OIS_POWERUP,
349	CFG_OIS_CONTROL,
350	CFG_OIS_I2C_WRITE_SEQ_TABLE,
351};
352
353enum msm_ois_i2c_operation {
354	MSM_OIS_WRITE = 0,
355	MSM_OIS_POLL,
356};
357
358struct reg_settings_ois_t {
359	uint16_t reg_addr;
360	enum msm_camera_i2c_reg_addr_type addr_type;
361	uint32_t reg_data;
362	enum msm_camera_i2c_data_type data_type;
363	enum msm_ois_i2c_operation i2c_operation;
364	uint32_t delay;
365};
366
367struct msm_ois_params_t {
368	uint16_t data_size;
369	uint16_t setting_size;
370	uint32_t i2c_addr;
371	enum i2c_freq_mode_t i2c_freq_mode;
372	enum msm_camera_i2c_reg_addr_type i2c_addr_type;
373	enum msm_camera_i2c_data_type i2c_data_type;
374	struct reg_settings_ois_t *settings;
375};
376
377struct msm_ois_set_info_t {
378	struct msm_ois_params_t ois_params;
379};
380
381struct msm_actuator_move_params_t {
382	int8_t dir;
383	int8_t sign_dir;
384	int16_t dest_step_pos;
385	int32_t num_steps;
386	uint16_t curr_lens_pos;
387	struct damping_params_t *ringing_params;
388};
389
390struct msm_actuator_tuning_params_t {
391	int16_t initial_code;
392	uint16_t pwd_step;
393	uint16_t region_size;
394	uint32_t total_steps;
395	struct region_params_t *region_params;
396};
397
398struct park_lens_data_t {
399	uint32_t damping_step;
400	uint32_t damping_delay;
401	uint32_t hw_params;
402	uint32_t max_step;
403};
404
405struct msm_actuator_params_t {
406	enum actuator_type act_type;
407	uint8_t reg_tbl_size;
408	uint16_t data_size;
409	uint16_t init_setting_size;
410	uint32_t i2c_addr;
411	enum i2c_freq_mode_t i2c_freq_mode;
412	enum msm_camera_i2c_reg_addr_type i2c_addr_type;
413	enum msm_camera_i2c_data_type i2c_data_type;
414	struct msm_actuator_reg_params_t *reg_tbl_params;
415	struct reg_settings_t *init_settings;
416	struct park_lens_data_t park_lens;
417};
418
419struct msm_actuator_set_info_t {
420	struct msm_actuator_params_t actuator_params;
421	struct msm_actuator_tuning_params_t af_tuning_params;
422};
423
424struct msm_actuator_get_info_t {
425	uint32_t focal_length_num;
426	uint32_t focal_length_den;
427	uint32_t f_number_num;
428	uint32_t f_number_den;
429	uint32_t f_pix_num;
430	uint32_t f_pix_den;
431	uint32_t total_f_dist_num;
432	uint32_t total_f_dist_den;
433	uint32_t hor_view_angle_num;
434	uint32_t hor_view_angle_den;
435	uint32_t ver_view_angle_num;
436	uint32_t ver_view_angle_den;
437};
438
439enum af_camera_name {
440	ACTUATOR_MAIN_CAM_0,
441	ACTUATOR_MAIN_CAM_1,
442	ACTUATOR_MAIN_CAM_2,
443	ACTUATOR_MAIN_CAM_3,
444	ACTUATOR_MAIN_CAM_4,
445	ACTUATOR_MAIN_CAM_5,
446	ACTUATOR_WEB_CAM_0,
447	ACTUATOR_WEB_CAM_1,
448	ACTUATOR_WEB_CAM_2,
449};
450
451struct msm_ois_cfg_data {
452	int cfgtype;
453	union {
454		struct msm_ois_set_info_t set_info;
455		struct msm_camera_i2c_seq_reg_setting *settings;
456	} cfg;
457};
458
459struct msm_actuator_set_position_t {
460	uint16_t number_of_steps;
461	uint32_t hw_params;
462	uint16_t pos[MAX_NUMBER_OF_STEPS];
463	uint16_t delay[MAX_NUMBER_OF_STEPS];
464};
465
466struct msm_actuator_cfg_data {
467	int cfgtype;
468	uint8_t is_af_supported;
469	union {
470		struct msm_actuator_move_params_t move;
471		struct msm_actuator_set_info_t set_info;
472		struct msm_actuator_get_info_t get_info;
473		struct msm_actuator_set_position_t setpos;
474		enum af_camera_name cam_name;
475	} cfg;
476};
477
478enum msm_camera_led_config_t {
479	MSM_CAMERA_LED_OFF,
480	MSM_CAMERA_LED_LOW,
481	MSM_CAMERA_LED_HIGH,
482	MSM_CAMERA_LED_INIT,
483	MSM_CAMERA_LED_RELEASE,
484};
485
486struct msm_camera_led_cfg_t {
487	enum msm_camera_led_config_t cfgtype;
488	int32_t torch_current[MAX_LED_TRIGGERS];
489	int32_t flash_current[MAX_LED_TRIGGERS];
490	int32_t flash_duration[MAX_LED_TRIGGERS];
491};
492
493struct msm_flash_init_info_t {
494	enum msm_flash_driver_type flash_driver_type;
495	uint32_t slave_addr;
496	enum i2c_freq_mode_t i2c_freq_mode;
497	struct msm_sensor_power_setting_array *power_setting_array;
498	struct msm_camera_i2c_reg_setting_array *settings;
499};
500
501struct msm_flash_cfg_data_t {
502	enum msm_flash_cfg_type_t cfg_type;
503	int32_t flash_current[MAX_LED_TRIGGERS];
504	int32_t flash_duration[MAX_LED_TRIGGERS];
505	union {
506		struct msm_flash_init_info_t *flash_init_info;
507		struct msm_camera_i2c_reg_setting_array *settings;
508	} cfg;
509};
510
511/* sensor init structures and enums */
512enum msm_sensor_init_cfg_type_t {
513	CFG_SINIT_PROBE,
514	CFG_SINIT_PROBE_DONE,
515	CFG_SINIT_PROBE_WAIT_DONE,
516};
517
518struct sensor_init_cfg_data {
519	enum msm_sensor_init_cfg_type_t cfgtype;
520	struct msm_sensor_info_t        probed_info;
521	char                            entity_name[MAX_SENSOR_NAME];
522	union {
523		void *setting;
524	} cfg;
525};
526
527#define VIDIOC_MSM_SENSOR_CFG \
528	_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data)
529
530#define VIDIOC_MSM_SENSOR_RELEASE \
531	_IO('V', BASE_VIDIOC_PRIVATE + 2)
532
533#define VIDIOC_MSM_SENSOR_GET_SUBDEV_ID \
534	_IOWR('V', BASE_VIDIOC_PRIVATE + 3, uint32_t)
535
536#define VIDIOC_MSM_CSIPHY_IO_CFG \
537	_IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct csiphy_cfg_data)
538
539#define VIDIOC_MSM_CSID_IO_CFG \
540	_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csid_cfg_data)
541
542#define VIDIOC_MSM_ACTUATOR_CFG \
543	_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data)
544
545#define VIDIOC_MSM_FLASH_LED_DATA_CFG \
546	_IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct msm_camera_led_cfg_t)
547
548#define VIDIOC_MSM_EEPROM_CFG \
549	_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data)
550
551#define VIDIOC_MSM_SENSOR_GET_AF_STATUS \
552	_IOWR('V', BASE_VIDIOC_PRIVATE + 9, uint32_t)
553
554#define VIDIOC_MSM_SENSOR_INIT_CFG \
555	_IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct sensor_init_cfg_data)
556
557#define VIDIOC_MSM_OIS_CFG \
558	_IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct msm_ois_cfg_data)
559
560#define VIDIOC_MSM_FLASH_CFG \
561	_IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_flash_cfg_data_t)
562
563#endif
564
565