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 8
31 #define DCAM_PATH_2_FRM_CNT_MAX 8
32 #define DCAM_PATH_0_FRM_CNT_MAX 8
33 #define DCAM_FRM_CNT_MAX 8 /* 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_FRAME_BASE_ID,
177 DCAM_PATH_SUB_SAMPLE_EN_X,
178 DCAM_PATH_SUB_SAMPLE_EN_Y,
179 DCAM_PATH_SUB_SAMPLE_MOD,
180 DCAM_PATH_SLICE_SCALE_EN,
181 DCAM_PATH_SLICE_SCALE_HEIGHT,
183 DCAM_PATH_IS_IN_SCALE_RANGE,
184 DCAM_PATH_IS_SCALE_EN,
185 DCAM_PATH_SLICE_OUT_HEIGHT,
186 DCAM_PATH_DATA_ENDIAN,
189 DCAM_PATH_FRAME_TYPE,
197 enum dcam_sub_sample_mode
209 DCAM_AHB_FRAME_PATH1_DST,
210 DCAM_AHB_FRAME_PATH2_DST,
229 enum dcam_cap_if_mode {
230 DCAM_CAP_IF_CCIR = 0,
235 enum dcam_path_src_sel {
236 DCAM_PATH_FROM_CAP = 0,
241 enum dcam_cap_sensor_mode {
242 DCAM_CAP_MODE_YUV = 0,
245 DCAM_CAP_MODE_RAWRGB,
249 enum dcam_cap_data_bits {
250 DCAM_CAP_12_BITS = 12,
251 DCAM_CAP_10_BITS = 10,
256 DCAM_CAP_BITS_MAX = 0xFF
259 enum dcam_data_endian {
263 DCAM_ENDIAN_HALFLITTLE,
267 enum dcam_output_mode {
268 DCAM_OUTPUT_WORD = 0,
269 DCAM_OUTPUT_HALF_WORD,
272 enum dcam_glb_reg_id {
282 enum dcam_v4l2_wtite_cmd_id {
283 DCAM_V4L2_WRITE_STOP = 0x5AA5,
284 DCAM_V4L2_WRITE_FREE_FRAME = 0xA55A,
288 struct dcam_cap_sync_pol {
297 struct dcam_endian_sel {
304 struct dcam_cap_dec {
311 struct dcam_path_dec {
357 struct dcam_frame *prev;
358 struct dcam_frame *next;
361 struct dcam_get_path_id {
363 uint32_t is_path_work[DCAM_PATH_MAX];
364 uint32_t need_isp_tool;
366 uint32_t need_shrink;
367 struct dcam_size input_size;
368 struct dcam_rect input_trim;
369 struct dcam_size output_size;
372 typedef int (*dcam_isr_func)(struct dcam_frame* frame, void* u_data);
374 int32_t dcam_module_init(enum dcam_cap_if_mode if_mode,
375 enum dcam_cap_sensor_mode sn_mode);
376 int32_t dcam_module_deinit(enum dcam_cap_if_mode if_mode,
377 enum dcam_cap_sensor_mode sn_mode);
378 int32_t dcam_module_en(struct device_node *dn);
379 int32_t dcam_module_dis(struct device_node *dn);
380 int32_t dcam_mipi_clk_en(struct device_node *dn);
381 int32_t dcam_mipi_clk_dis(struct device_node *dn);
382 int32_t dcam_ccir_clk_en(void);
383 int32_t dcam_ccir_clk_dis(void);
384 int32_t dcam_reset(enum dcam_rst_mode reset_mode, uint32_t is_isr);
385 int32_t dcam_set_clk(struct device_node *dn, enum dcam_clk_sel clk_sel);
386 int32_t dcam_update_path(enum dcam_path_index path_index, struct dcam_size *in_size,
387 struct dcam_rect *in_rect, struct dcam_size *out_size);
388 int32_t dcam_start_path(enum dcam_path_index path_index);
389 int32_t dcam_start(void);
390 int32_t dcam_stop_path(enum dcam_path_index path_index);
391 int32_t dcam_stop(void);
392 int32_t dcam_resume(void);
393 int32_t dcam_pause(void);
394 int32_t dcam_reg_isr(enum dcam_irq_id id, dcam_isr_func user_func, void* u_data);
395 int32_t dcam_cap_cfg(enum dcam_cfg_id id, void *param);
396 int32_t dcam_cap_get_info(enum dcam_cfg_id id, void *param);
397 int32_t dcam_path0_cfg(enum dcam_cfg_id id, void *param);
398 int32_t dcam_path1_cfg(enum dcam_cfg_id id, void *param);
399 int32_t dcam_path2_cfg(enum dcam_cfg_id id, void *param);
400 int32_t dcam_get_resizer(uint32_t wait_opt);
401 int32_t dcam_rel_resizer(void);
402 void dcam_int_en(void);
403 void dcam_int_dis(void);
404 int32_t dcam_frame_is_locked(struct dcam_frame *frame);
405 int32_t dcam_frame_lock(struct dcam_frame *frame);
406 int32_t dcam_frame_unlock(struct dcam_frame *frame);
407 int32_t dcam_read_registers(uint32_t* reg_buf, uint32_t *buf_len);
408 int32_t dcam_resize_start(void);
409 int32_t dcam_resize_end(void);
410 int32_t dcam_stop_cap(void);
411 void dcam_glb_reg_awr(uint32_t addr, uint32_t val, uint32_t reg_id);
412 void dcam_glb_reg_owr(uint32_t addr, uint32_t val, uint32_t reg_id);
413 void dcam_glb_reg_mwr(uint32_t addr, uint32_t mask, uint32_t val, uint32_t reg_id);
414 int dcam_scale_coeff_alloc(void);
415 void dcam_scale_coeff_free(void);
416 int32_t dcam_rotation_start(void);
417 int32_t dcam_rotation_end(void);
418 int32_t dcam_get_path_id(struct dcam_get_path_id *path_id, uint32_t *channel_id);
419 int32_t dcam_stop_sc_coeff(void);
420 #endif //_DCAM_DRV_8830_H_