2 * Copyright (C) 2012 Spreadtrum Communications Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #ifndef _DCAM_DRV_8830_H_
15 #define _DCAM_DRV_8830_H_
17 #include <linux/types.h>
19 #include "parse_hwinfo.h"
24 #define DCAM_TRACE printk
26 #define DCAM_TRACE pr_debug
29 #define DCAM_WAIT_FOREVER 0xFFFFFFFF
30 #define DCAM_PATH_1_FRM_CNT_MAX 10
31 #define DCAM_PATH_2_FRM_CNT_MAX 10/*4*/
32 #define DCAM_PATH_0_FRM_CNT_MAX 10
33 #define DCAM_FRM_CNT_MAX 10 /* max between path_1_frm_cnt and path_2_frm_cnt */
34 #define DCAM_HEIGHT_MIN 4
35 #define DCAM_JPEG_LENGTH_MIN 30720 /*640X480 div 10*/
37 enum dcam_swtich_status {
46 DCAM_RTN_PARA_ERR = 0x10,
49 DCAM_RTN_MASTER_SEL_ERR,
53 DCAM_RTN_CAP_FRAME_SEL_ERR = 0x20,
54 DCAM_RTN_CAP_IN_FORMAT_ERR,
55 DCAM_RTN_CAP_IN_BITS_ERR,
56 DCAM_RTN_CAP_IN_YUV_ERR,
57 DCAM_RTN_CAP_SYNC_POL_ERR,
58 DCAM_RTN_CAP_SKIP_FRAME_ERR,
59 DCAM_RTN_CAP_FRAME_DECI_ERR,
60 DCAM_RTN_CAP_XY_DECI_ERR,
61 DCAM_RTN_CAP_FRAME_SIZE_ERR,
62 DCAM_RTN_CAP_SENSOR_MODE_ERR,
63 DCAM_RTN_CAP_JPEG_BUF_LEN_ERR,
64 DCAM_RTN_CAP_IF_MODE_ERR,
66 DCAM_RTN_PATH_SRC_SIZE_ERR = 0x30,
67 DCAM_RTN_PATH_TRIM_SIZE_ERR,
68 DCAM_RTN_PATH_DES_SIZE_ERR,
69 DCAM_RTN_PATH_IN_FMT_ERR,
70 DCAM_RTN_PATH_OUT_FMT_ERR,
72 DCAM_RTN_PATH_SUB_SAMPLE_ERR,
73 DCAM_RTN_PATH_ADDR_ERR,
74 DCAM_RTN_PATH_FRAME_TOO_MANY,
75 DCAM_RTN_PATH_FRAME_LOCKED,
77 DCAM_RTN_PATH_GEN_COEFF_ERR,
78 DCAM_RTN_PATH_SRC_ERR,
79 DCAM_RTN_PATH_ENDIAN_ERR,
80 DCAM_RTN_PATH_FRM_DECI_ERR,
91 enum dcam_path_index {
92 DCAM_PATH_IDX_NONE = 0,
96 DCAM_PATH_IDX_ALL = 7,
112 enum dcam_cap_pattern {
120 enum dcam_capture_mode {
121 DCAM_CAPTURE_MODE_SINGLE = 0,
122 DCAM_CAPTURE_MODE_MULTIPLE,
123 DCAM_CAPTURE_MODE_MAX
144 DCAM_PATH1_SLICE_DONE,
145 DCAM_PATH2_SLICE_DONE,
153 DCAM_CAP_SYNC_POL = 0,
155 DCAM_CAP_DATA_PACKET,
157 DCAM_CAP_PRE_SKIP_CNT,
159 DCAM_CAP_FRM_COUNT_CLR,
160 DCAM_CAP_FRM_COUNT_GET,
162 DCAM_CAP_IMAGE_XY_DECI,
163 DCAM_CAP_JPEG_GET_LENGTH,
164 DCAM_CAP_JPEG_SET_BUF_LEN,
166 DCAM_CAP_SAMPLE_MODE,
169 DCAM_PATH_INPUT_SIZE,
170 DCAM_PATH_INPUT_RECT,
171 DCAM_PATH_INPUT_ADDR,
172 DCAM_PATH_OUTPUT_SIZE,
173 DCAM_PATH_OUTPUT_FORMAT,
174 DCAM_PATH_OUTPUT_ADDR,
175 DCAM_PATH_OUTPUT_RESERVED_ADDR,
176 DCAM_PATH_FRAME_BASE_ID,
178 DCAM_PATH_SUB_SAMPLE_EN_X,
179 DCAM_PATH_SUB_SAMPLE_EN_Y,
180 DCAM_PATH_SUB_SAMPLE_MOD,
181 DCAM_PATH_SLICE_SCALE_EN,
182 DCAM_PATH_SLICE_SCALE_HEIGHT,
184 DCAM_PATH_IS_IN_SCALE_RANGE,
185 DCAM_PATH_IS_SCALE_EN,
186 DCAM_PATH_SLICE_OUT_HEIGHT,
187 DCAM_PATH_DATA_ENDIAN,
190 DCAM_PATH_FRAME_TYPE,
198 enum dcam_sub_sample_mode
210 DCAM_AHB_FRAME_PATH1_DST,
211 DCAM_AHB_FRAME_PATH2_DST,
230 enum dcam_cap_if_mode {
231 DCAM_CAP_IF_CCIR = 0,
236 enum dcam_path_src_sel {
237 DCAM_PATH_FROM_CAP = 0,
242 enum dcam_cap_sensor_mode {
243 DCAM_CAP_MODE_YUV = 0,
246 DCAM_CAP_MODE_RAWRGB,
250 enum dcam_cap_data_bits {
251 DCAM_CAP_12_BITS = 12,
252 DCAM_CAP_10_BITS = 10,
257 DCAM_CAP_BITS_MAX = 0xFF
260 enum dcam_data_endian {
264 DCAM_ENDIAN_HALFLITTLE,
268 enum dcam_output_mode {
269 DCAM_OUTPUT_WORD = 0,
270 DCAM_OUTPUT_HALF_WORD,
271 DCAM_OUTPUT_YVYU_1FRAME,
275 enum dcam_glb_reg_id {
285 enum dcam_v4l2_wtite_cmd_id {
286 DCAM_V4L2_WRITE_STOP = 0x5AA5,
287 DCAM_V4L2_WRITE_FREE_FRAME = 0xA55A,
291 struct dcam_cap_sync_pol {
300 struct dcam_endian_sel {
307 struct dcam_cap_dec {
314 struct dcam_path_dec {
367 struct dcam_frame *prev;
368 struct dcam_frame *next;
371 struct dcam_get_path_id {
373 uint32_t is_path_work[DCAM_PATH_MAX];
374 uint32_t need_isp_tool;
376 uint32_t need_shrink;
377 struct dcam_size input_size;
378 struct dcam_rect input_trim;
379 struct dcam_size output_size;
382 struct dcam_path_info {
384 uint32_t support_yuv;
385 uint32_t support_raw;
386 uint32_t support_jpeg;
387 uint32_t support_scaling;
388 uint32_t support_trim;
389 uint32_t is_scaleing_path;
392 struct dcam_path_capability {
394 struct dcam_path_info path_info[DCAM_PATH_MAX];
398 typedef int (*dcam_isr_func)(struct dcam_frame* frame, void* u_data);
400 int32_t dcam_module_init(enum dcam_cap_if_mode if_mode,
401 enum dcam_cap_sensor_mode sn_mode);
402 int32_t dcam_module_deinit(enum dcam_cap_if_mode if_mode,
403 enum dcam_cap_sensor_mode sn_mode);
404 int32_t dcam_module_en(struct device_node *dn);
405 int32_t dcam_module_dis(struct device_node *dn);
406 int32_t dcam_mipi_clk_en(struct device_node *dn);
407 int32_t dcam_mipi_clk_dis(struct device_node *dn);
408 int32_t dcam_ccir_clk_en(void);
409 int32_t dcam_ccir_clk_dis(void);
410 int32_t dcam_reset(enum dcam_rst_mode reset_mode, uint32_t is_isr);
411 int32_t dcam_set_clk(struct device_node *dn, enum dcam_clk_sel clk_sel);
412 int32_t dcam_update_path(enum dcam_path_index path_index, struct dcam_size *in_size,
413 struct dcam_rect *in_rect, struct dcam_size *out_size);
414 int32_t dcam_start_path(enum dcam_path_index path_index);
415 int32_t dcam_start(void);
416 int32_t dcam_stop_path(enum dcam_path_index path_index);
417 int32_t dcam_stop(void);
418 int32_t dcam_resume(void);
419 int32_t dcam_pause(void);
420 int32_t dcam_reg_isr(enum dcam_irq_id id, dcam_isr_func user_func, void* u_data);
421 int32_t dcam_cap_cfg(enum dcam_cfg_id id, void *param);
422 int32_t dcam_cap_get_info(enum dcam_cfg_id id, void *param);
423 int32_t dcam_path0_cfg(enum dcam_cfg_id id, void *param);
424 int32_t dcam_path1_cfg(enum dcam_cfg_id id, void *param);
425 int32_t dcam_path2_cfg(enum dcam_cfg_id id, void *param);
426 int32_t dcam_get_resizer(uint32_t wait_opt);
427 int32_t dcam_rel_resizer(void);
428 void dcam_int_en(void);
429 void dcam_int_dis(void);
430 int32_t dcam_frame_is_locked(struct dcam_frame *frame);
431 int32_t dcam_frame_lock(struct dcam_frame *frame);
432 int32_t dcam_frame_unlock(struct dcam_frame *frame);
433 int32_t dcam_read_registers(uint32_t* reg_buf, uint32_t *buf_len);
434 int32_t dcam_resize_start(void);
435 int32_t dcam_resize_end(void);
436 int32_t dcam_stop_cap(void);
437 void dcam_glb_reg_awr(uint32_t addr, uint32_t val, uint32_t reg_id);
438 void dcam_glb_reg_owr(uint32_t addr, uint32_t val, uint32_t reg_id);
439 void dcam_glb_reg_mwr(uint32_t addr, uint32_t mask, uint32_t val, uint32_t reg_id);
440 int dcam_scale_coeff_alloc(void);
441 void dcam_scale_coeff_free(void);
442 int32_t dcam_rotation_start(void);
443 int32_t dcam_rotation_end(void);
444 int32_t dcam_get_path_id(struct dcam_get_path_id *path_id, uint32_t *channel_id);
445 int32_t dcam_stop_sc_coeff(void);
446 int32_t dcam_get_path_capability(struct dcam_path_capability *capacity);
448 #endif //_DCAM_DRV_8830_H_