2 *************************************************************************
3 * Rockchip driver for CIF ISP 1.0
4 * (Based on Intel driver for sofiaxxx)
6 * Copyright (C) 2015 Intel Mobile Communications GmbH
7 * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *************************************************************************
17 #include <linux/types.h>
18 #include <linux/kernel.h>
19 #include <linux/slab.h>
20 #include <media/v4l2-device.h>
21 #include <media/v4l2-ioctl.h>
22 #include <linux/videodev2.h>
23 #include <media/videobuf-core.h>
24 #include <media/videobuf-vmalloc.h> /* for ISP statistics */
26 #include <linux/wait.h>
27 #include <linux/sched.h>
28 #include <linux/workqueue.h>
29 #include "cif_isp10_regs.h"
30 #include "cif_isp10_isp.h"
31 #include "cif_isp10_pltfrm.h"
32 #include "cif_isp10.h"
36 #define CIFISP_MODULE_EN(v, m) ((v) |= (m))
37 #define CIFISP_MODULE_DIS(v, m) ((v) &= ~(m))
38 #define CIFISP_MODULE_IS_EN(v, m) (((v) & (m)) == (m))
39 #define CIFISP_MODULE_UPDATE(v, m) ((v) |= (m))
40 #define CIFISP_MODULE_CLR_UPDATE(v, m) ((v) &= ~(m))
41 #define CIFISP_MODULE_IS_UPDATE(v, m) (((v) & (m)) == (m))
44 #define CIFISP_BDM_BYPASS_EN(val) ((val) << 10)
46 #define CIFISP_HIST_PREDIV_SET(val) ((val) << 3)
47 #define CIFISP_HIST_WEIGHT_SET(v0, v1, v2, v3) ((v0) | ((v1) << 8) |\
48 ((v2) << 16) | ((v3) << 24))
49 #define CIFISP_HIST_WINDOW_OFFSET_RESERVED (0xFFFFF000)
50 #define CIFISP_HIST_WINDOW_SIZE_RESERVED (0xFFFFF800)
51 #define CIFISP_HIST_WEIGHT_RESERVED (0xE0E0E0E0)
52 #define CIFISP_MAX_HIST_PREDIVIDER (0x0000007F)
53 #define CIFISP_HIST_ROW_NUM (5)
54 #define CIFISP_HIST_COLUMN_NUM (5)
56 #define CIF_ISP_CTRL_ISP_GAMMA_IN_ENA BIT(6)
57 #define CIF_ISP_CTRL_ISP_AWB_ENA BIT(7)
58 #define CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA BIT(11)
60 #define CIFISP_AWB_GAIN_R_SET(val) ((val) << 16)
61 #define CIFISP_AWB_GAIN_R_READ(val) ((val) >> 16)
62 #define CIFISP_AWB_GAIN_B_READ(val) ((val) & 0xFFFF)
64 #define CIFISP_AWB_YMAX_CMP_EN BIT(2)
65 #define CIFISP_AWB_REF_CR_SET(val) ((val) << 8)
66 #define CIFISP_AWB_REF_CR_READ(val) ((val) >> 8)
67 #define CIFISP_AWB_REF_CB_READ(val) ((val) & 0xFF)
68 #define CIFISP_AWB_MAX_CS_SET(val) ((val) << 8)
69 #define CIFISP_AWB_MAX_CS_READ(val) (((val) >> 8) & 0xFF)
70 #define CIFISP_AWB_MIN_C_READ(val) ((val) & 0xFF)
71 #define CIFISP_AWB_MIN_Y_SET(val) ((val) << 16)
72 #define CIFISP_AWB_MIN_Y_READ(val) (((val) >> 16) & 0xFF)
73 #define CIFISP_AWB_MAX_Y_SET(val) ((val) << 24)
74 #define CIFISP_AWB_MAX_Y_READ(val) ((val) >> 24)
75 #define CIFISP_AWB_MODE_RGB_EN ((1 << 31) | (0x02 << 0))
76 #define CIFISP_AWB_MODE_YCBCR_EN ((0 << 31) | (0x02 << 0))
77 #define CIFISP_AWB_MODE_READ(val) ((val) & 3)
78 #define CIFISP_AWB_YMAX_READ(val) (((val) >> 2) & 1)
80 #define CIFISP_AWB_GET_MEAN_CR(val) ((val) & 0xFF)
81 #define CIFISP_AWB_GET_MEAN_CB(val) (((val) >> 8) & 0xFF)
82 #define CIFISP_AWB_GET_MEAN_Y(val) (((val) >> 16) & 0xFF)
83 #define CIFISP_AWB_GET_MEAN_R(val) ((val) & 0xFF)
84 #define CIFISP_AWB_GET_MEAN_B(val) (((val) >> 8) & 0xFF)
85 #define CIFISP_AWB_GET_MEAN_G(val) (((val) >> 16) & 0xFF)
86 #define CIFISP_AWB_GET_PIXEL_CNT(val) ((val) & 0x3FFFFFF)
88 #define CIFISP_AWB_GAINS_MAX_VAL (0x000003FF)
89 #define CIFISP_AWB_WINDOW_OFFSET_MAX (0x00000FFF)
90 #define CIFISP_AWB_WINDOW_MAX_SIZE (0x00001FFF)
91 #define CIFISP_AWB_CBCR_MAX_REF (0x000000FF)
92 #define CIFISP_AWB_THRES_MAX_YC (0x000000FF)
94 #define CIFISP_EXP_ENA (1)
95 #define CIFISP_EXP_DIS (0)
96 #define CIFISP_EXP_ROW_NUM (5)
97 #define CIFISP_EXP_COLUMN_NUM (5)
98 #define CIFISP_EXP_NUM_LUMA_REGS (CIFISP_EXP_ROW_NUM *\
99 CIFISP_EXP_COLUMN_NUM)
100 #define CIFISP_EXP_MAX_HOFFS (2424)
101 #define CIFISP_EXP_MAX_VOFFS (1806)
102 #define CIFISP_EXP_BLOCK_MAX_HSIZE (516)
103 #define CIFISP_EXP_BLOCK_MIN_HSIZE (35)
104 #define CIFISP_EXP_BLOCK_MAX_VSIZE (390)
105 #define CIFISP_EXP_BLOCK_MIN_VSIZE (28)
106 #define CIFISP_EXP_MAX_HSIZE \
107 (CIFISP_EXP_BLOCK_MAX_HSIZE * CIFISP_EXP_COLUMN_NUM + 1)
108 #define CIFISP_EXP_MIN_HSIZE \
109 (CIFISP_EXP_BLOCK_MIN_HSIZE * CIFISP_EXP_COLUMN_NUM + 1)
110 #define CIFISP_EXP_MAX_VSIZE \
111 (CIFISP_EXP_BLOCK_MAX_VSIZE * CIFISP_EXP_ROW_NUM + 1)
112 #define CIFISP_EXP_MIN_VSIZE \
113 (CIFISP_EXP_BLOCK_MIN_VSIZE * CIFISP_EXP_ROW_NUM + 1)
114 #define CIFISP_EXP_HEIGHT_MASK (0x000007FF)
115 #define CIFISP_EXP_MAX_HOFFSET (0x00000FFF)
116 #define CIFISP_EXP_MAX_VOFFSET (0x00000FFF)
118 #define CIFISP_EXP_CTRL_AUTOSTOP(val) ((val) << 1)
119 #define CIFISP_EXP_CTRL_MEASMODE(val) ((val) << 31)
120 #define CIFISP_EXP_HSIZE(val) ((val) & 0x7FF)
121 #define CIFISP_EXP_VSIZE(val) ((val) & 0x7FE)
123 #define CIFISP_LSC_GRADH_SET(val) ((val) << 11)
124 #define CIFISP_LSC_SECTH_SET(val) ((val) << 10)
127 #define CIFISP_FLT_MODE_MAX (1)
128 #define CIFISP_FLT_CHROMA_MODE_MAX (3)
129 #define CIFISP_FLT_GREEN_STAGE1_MAX (8)
130 #define CIFISP_FLT_MODE(v) ((v) << 1)
131 #define CIFISP_FLT_CHROMA_V_MODE(v) ((v) << 4)
132 #define CIFISP_FLT_CHROMA_H_MODE(v) ((v) << 6)
133 #define CIFISP_FLT_GREEN_STAGE1(v) ((v) << 8)
134 #define CIFISP_FLT_THREAD_RESERVED (0xfffffc00)
135 #define CIFISP_FLT_FAC_RESERVED (0xffffffc0)
136 #define CIFISP_FLT_LUM_WEIGHT_RESERVED (0xfff80000)
137 #define CIFISP_FLT_ENA (1)
138 #define CIFISP_FLT_DIS (0)
140 #define CIFISP_CTK_COEFF_RESERVED 0xFFFFF800
141 #define CIFISP_XTALK_OFFSET_RESERVED 0xFFFFF000
144 #define CIFISP_GOC_MODE_MAX (1)
145 #define CIFISP_GOC_RESERVED 0xFFFFF800
146 #define CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA_READ(value) (((value) >> 11) & 1)
148 #define CIFISP_DPCC_ENA BIT(0)
149 #define CIFISP_DPCC_DIS (0 << 0)
150 #define CIFISP_DPCC_MODE_MAX (0x07)
151 #define CIFISP_DPCC_OUTPUTMODE_MAX (0x0f)
152 #define CIFISP_DPCC_SETUSE_MAX (0x0f)
153 #define CIFISP_DPCC_METHODS_SET_RESERVED (0xFFFFE000)
154 #define CIFISP_DPCC_LINE_THRESH_RESERVED (0xFFFF0000)
155 #define CIFISP_DPCC_LINE_MAD_FAC_RESERVED (0xFFFFC0C0)
156 #define CIFISP_DPCC_PG_FAC_RESERVED (0xFFFFC0C0)
157 #define CIFISP_DPCC_RND_THRESH_RESERVED (0xFFFF0000)
158 #define CIFISP_DPCC_RG_FAC_RESERVED (0xFFFFC0C0)
159 #define CIFISP_DPCC_RO_LIMIT_RESERVED (0xFFFFF000)
160 #define CIFISP_DPCC_RND_OFFS_RESERVED (0xFFFFF000)
162 #define CIFISP_BLS_ENA BIT(0)
163 #define CIFISP_BLS_DIS (0 << 0)
164 #define CIFISP_BLS_MODE_MEASURED BIT(1)
165 #define CIFISP_BLS_MODE_FIXED (0 << 1)
166 #define CIFISP_BLS_WINDOW_1 BIT(2)
167 #define CIFISP_BLS_WINDOW_2 BIT(3)
169 #define CIFISP_DEGAMMA_X_RESERVED \
170 ((1 << 31) | (1 << 27) | (1 << 23) | (1 << 19) |\
171 (1 << 15) | (1 << 11) | (1 << 7) | (1 << 3))
172 #define CIFISP_DEGAMMA_Y_RESERVED 0xFFFFF000
174 #define CIFISP_CPROC_CTRL_RESERVED 0xFFFFFFFE
175 #define CIFISP_CPROC_CONTRAST_RESERVED 0xFFFFFF00
176 #define CIFISP_CPROC_BRIGHTNESS_RESERVED 0xFFFFFF00
177 #define CIFISP_CPROC_HUE_RESERVED 0xFFFFFF00
178 #define CIFISP_CPROC_SATURATION_RESERVED 0xFFFFFF00
179 #define CIFISP_CPROC_MACC_RESERVED 0xE000E000
180 #define CIFISP_CPROC_TONE_RESERVED 0xF000
181 #define CIFISP_CPROC_TONE_Y(value) ((value) << 16)
182 #define CIFISP_CPROC_TONE_C(value) ((value))
183 #define CIFISP_CPROC_TONE_Y_READ(value) ((value) >> 16)
184 #define CIFISP_CPROC_TONE_C_READ(value) ((value) & 0xFFFF)
185 #define CIFISP_CPROC_EN 1
186 #define CIFISP_CPROC_MACC_EN BIT(4)
187 #define CIFISP_CPROC_TMAP_EN BIT(5)
189 #define CIFISP_LSC_SECT_SIZE_RESERVED 0xFC00FC00
190 #define CIFISP_LSC_GRAD_RESERVED 0xF000F000
191 #define CIFISP_LSC_SAMPLE_RESERVED 0xF000F000
192 #define CIFISP_LSC_SECTORS_MAX 16
193 #define CIFISP_LSC_TABLE_DATA(v0, v1) (v0 | ((v1) << 12))
194 #define CIFISP_LSC_SECT_SIZE(v0, v1) (v0 | ((v1) << 16))
195 #define CIFISP_LSC_GRAD_SIZE(v0, v1) (v0 | ((v1) << 16))
197 #define CIFISP_AFC_THRES_RESERVED 0xFFFF0000
198 #define CIFISP_AFC_VAR_SHIFT_RESERVED 0xFFF8FFF8
199 #define CIFISP_AFC_WINDOW_X_RESERVED 0xE000
200 #define CIFISP_AFC_WINDOW_Y_RESERVED 0xF000
201 #define CIFISP_AFC_WINDOW_X_MIN 0x5
202 #define CIFISP_AFC_WINDOW_Y_MIN 0x2
203 #define CIFISP_AFC_WINDOW_X(value) ((value) << 16)
204 #define CIFISP_AFC_WINDOW_Y(value) (value)
205 #define CIFISP_AFC_ENA (1)
206 #define CIFISP_AFC_DIS (0)
209 #define CIFISP_DPF_NF_GAIN_RESERVED 0xFFFFF000
210 #define CIFISP_DPF_SPATIAL_COEFF_MAX 0x1f
211 #define CIFISP_DPF_NLL_COEFF_N_MAX 0x3ff
213 #define CIFISP_DPF_MODE_USE_NF_GAIN BIT(9)
214 #define CIFISP_DPF_MODE_LSC_GAIN_COMP BIT(8)
215 #define CIFISP_DPF_MODE_AWB_GAIN_COMP BIT(7)
216 #define CIFISP_DPF_MODE_NLL_SEGMENTATION(a) ((a) << 6)
217 #define CIFISP_DPF_MODE_RB_FLTSIZE(a) ((a) << 5)
218 #define CIFISP_DPF_MODE_R_FLT_DIS BIT(4)
219 #define CIFISP_DPF_MODE_R_FLT_EN (0 << 4)
220 #define CIFISP_DPF_MODE_GR_FLT_DIS BIT(3)
221 #define CIFISP_DPF_MODE_GR_FLT_EN (0 << 3)
222 #define CIFISP_DPF_MODE_GB_FLT_DIS BIT(2)
223 #define CIFISP_DPF_MODE_GB_FLT_EN (0 << 2)
224 #define CIFISP_DPF_MODE_B_FLT_DIS BIT(1)
225 #define CIFISP_DPF_MODE_B_FLT_EN (0 << 1)
226 #define CIFISP_DPF_MODE_EN BIT(0)
228 #define CIFISP_DEBUG BIT(0)
229 #define CIFISP_ERROR BIT(1)
232 * Empirical rough (relative) times it takes to perform
235 #define CIFISP_MODULE_DPCC_PROC_TIME 3
236 #define CIFISP_MODULE_BLS_PROC_TIME 10
237 #define CIFISP_MODULE_LSC_PROC_TIME 1747
238 #define CIFISP_MODULE_FLT_PROC_TIME 15
239 #define CIFISP_MODULE_BDM_PROC_TIME 1
240 #define CIFISP_MODULE_SDG_PROC_TIME 53
241 #define CIFISP_MODULE_GOC_PROC_TIME 1000
242 #define CIFISP_MODULE_CTK_PROC_TIME 772
243 #define CIFISP_MODULE_AWB_PROC_TIME 8
244 #define CIFISP_MODULE_HST_PROC_TIME 5
245 #define CIFISP_MODULE_AEC_PROC_TIME 5
246 #define CIFISP_MODULE_AWB_GAIN_PROC_TIME 2
247 #define CIFISP_MODULE_CPROC_PROC_TIME 5
248 #define CIFISP_MODULE_AFC_PROC_TIME 8
249 #define CIFISP_MODULE_IE_PROC_TIME 5
250 #define CIFISP_MODULE_DPF_TIME 5
251 #define CIFISP_MODULE_DPF_STRENGTH_TIME 2
252 #define CIFISP_MODULE_CSM_PROC_TIME 8
254 /* For Debugging only!!! */
256 #define CIFISP_MODULE_DEFAULT_VBLANKING_TIME 2000
258 #define V4L2_DEV_DEBUG_LEVEL 0
260 #define CIFISP_DPRINT(level, fmt, arg...) \
262 if (level == CIFISP_ERROR) \
263 pr_err(fmt, ##arg); \
265 pr_debug(fmt, ##arg); \
268 #define cifisp_iowrite32(d, a) \
269 cif_isp10_pltfrm_write_reg(NULL, (u32)(d), isp_dev->base_addr + (a))
270 #define cifisp_ioread32(a) \
271 cif_isp10_pltfrm_read_reg(NULL, isp_dev->base_addr + (a))
272 #define cifisp_iowrite32OR(d, a) \
273 cif_isp10_pltfrm_write_reg_OR(NULL, (u32)(d), isp_dev->base_addr + (a))
274 #define cifisp_iowrite32AND(d, a) \
275 cif_isp10_pltfrm_write_reg_AND(NULL, (u32)(d), isp_dev->base_addr + (a))
278 * Set this flag to enable CIF ISP Register debug
279 * #define CIFISP_DEBUG_REG
282 * Set this flag to dump the parameters
283 * #define CIFISP_DEBUG_PARAM
286 * Set this flag to trace the capture params
287 * #define LOG_CAPTURE_PARAMS
290 * Set this flag to trace the isr execution time
291 * #define LOG_ISR_EXE_TIME
294 * Set this flag to exclude everything except
296 * #define CIFISP_DEBUG_DISABLE_BLOCKS
299 #ifdef LOG_CAPTURE_PARAMS
300 static struct cifisp_last_capture_config g_last_capture_config;
303 #ifdef LOG_ISR_EXE_TIME
304 static unsigned int g_longest_isr_time;
307 /* Functions for Debugging */
308 static void cifisp_param_dump(const void *config, unsigned int module);
309 #ifdef CIFISP_DEBUG_REG
310 static void cifisp_reg_dump(const struct cif_isp10_isp_dev *isp_dev,
311 unsigned int module, int level);
313 #ifdef LOG_CAPTURE_PARAMS
314 static void cifisp_reg_dump_capture(const struct cif_isp10_isp_dev *isp_dev);
317 static int cifisp_module_enable(struct cif_isp10_isp_dev *isp_dev,
318 bool flag, __s32 *value, unsigned int module)
320 unsigned int *curr_ens, *updates, *new_ens;
321 unsigned long lock_flags = 0;
324 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
326 if (module & (CIFISP_MODULE_AWB |
329 CIFISP_MODULE_HST)) {
330 curr_ens = &isp_dev->meas_cfgs.curr->module_ens;
331 new_ens = &isp_dev->meas_cfgs.last_or_new->module_ens;
332 updates = &isp_dev->meas_cfgs.module_updates;
334 curr_ens = &isp_dev->other_cfgs.curr->module_ens;
335 new_ens = &isp_dev->other_cfgs.last_or_new->module_ens;
336 updates = &isp_dev->other_cfgs.module_updates;
340 *value = CIFISP_MODULE_IS_EN(*curr_ens, module);
344 if (CIFISP_MODULE_IS_EN(*curr_ens, module) != *value) {
346 CIFISP_MODULE_EN(*new_ens, module);
348 CIFISP_MODULE_DIS(*new_ens, module);
350 CIFISP_MODULE_UPDATE(*updates, module);
354 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
359 /* ISP BP interface function */
360 static int cifisp_dpcc_param(struct cif_isp10_isp_dev *isp_dev,
361 bool flag, struct cifisp_dpcc_config *arg)
363 unsigned long lock_flags = 0;
365 struct cifisp_dpcc_methods_config *method;
369 CIFISP_DPRINT(CIFISP_ERROR,
370 "arg is NULL: %s\n", __func__);
375 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
379 &isp_dev->other_cfgs.curr->dpcc_config,
384 cifisp_param_dump(arg, CIFISP_MODULE_DPCC);
387 &isp_dev->other_cfgs.curr->dpcc_config,
388 sizeof(*arg)) == 0) {
389 CIFISP_DPRINT(CIFISP_DEBUG,
390 "same param in function: %s\n", __func__);
394 if (arg->mode > CIFISP_DPCC_MODE_MAX ||
395 arg->output_mode > CIFISP_DPCC_OUTPUTMODE_MAX ||
396 arg->set_use > CIFISP_DPCC_SETUSE_MAX ||
397 arg->ro_limits & CIFISP_DPCC_RO_LIMIT_RESERVED ||
398 arg->rnd_offs & CIFISP_DPCC_RND_OFFS_RESERVED) {
399 CIFISP_DPRINT(CIFISP_ERROR,
400 "incompatible param in function: %s\n", __func__);
405 method = &arg->methods[i];
406 for (i = 0; i < CIFISP_DPCC_METHODS_MAX; i++) {
407 if ((method->method &
408 CIFISP_DPCC_METHODS_SET_RESERVED) ||
409 (method->line_thresh &
410 CIFISP_DPCC_LINE_THRESH_RESERVED) ||
411 (method->line_mad_fac &
412 CIFISP_DPCC_LINE_MAD_FAC_RESERVED) ||
414 CIFISP_DPCC_PG_FAC_RESERVED) ||
415 (method->rnd_thresh &
416 CIFISP_DPCC_RND_THRESH_RESERVED) ||
417 (method->rg_fac & CIFISP_DPCC_RG_FAC_RESERVED)) {
418 CIFISP_DPRINT(CIFISP_ERROR,
419 "incompatible param in function: %s\n", __func__);
426 memcpy(&isp_dev->other_cfgs.last_or_new->dpcc_config,
428 sizeof(struct cifisp_dpcc_config));
429 CIFISP_MODULE_UPDATE(
430 isp_dev->other_cfgs.module_updates,
433 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
438 /* ISP black level subtraction interface function */
439 static int cifisp_bls_param(struct cif_isp10_isp_dev *isp_dev,
440 bool flag, struct cifisp_bls_config *arg)
442 unsigned long lock_flags = 0;
448 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
452 &isp_dev->other_cfgs.curr->bls_config,
457 cifisp_param_dump(arg, CIFISP_MODULE_BLS);
460 &isp_dev->other_cfgs.curr->bls_config,
461 sizeof(*arg)) == 0) {
462 CIFISP_DPRINT(CIFISP_DEBUG,
463 "same param in function: %s\n", __func__);
467 if (arg->bls_window1.h_offs > CIFISP_BLS_START_H_MAX ||
468 arg->bls_window1.h_size > CIFISP_BLS_STOP_H_MAX ||
469 arg->bls_window1.v_offs > CIFISP_BLS_START_V_MAX ||
470 arg->bls_window1.v_size > CIFISP_BLS_STOP_V_MAX ||
471 arg->bls_window2.h_offs > CIFISP_BLS_START_H_MAX ||
472 arg->bls_window2.h_size > CIFISP_BLS_STOP_H_MAX ||
473 arg->bls_window2.v_offs > CIFISP_BLS_START_V_MAX ||
474 arg->bls_window2.v_size > CIFISP_BLS_STOP_V_MAX ||
475 arg->bls_samples > CIFISP_BLS_SAMPLES_MAX ||
476 arg->fixed_val.r > CIFISP_BLS_FIX_SUB_MAX ||
477 arg->fixed_val.gr > CIFISP_BLS_FIX_SUB_MAX ||
478 arg->fixed_val.gb > CIFISP_BLS_FIX_SUB_MAX ||
479 arg->fixed_val.b > CIFISP_BLS_FIX_SUB_MAX ||
480 arg->fixed_val.r < (s16)CIFISP_BLS_FIX_SUB_MIN ||
481 arg->fixed_val.gr < (s16)CIFISP_BLS_FIX_SUB_MIN ||
482 arg->fixed_val.gb < (s16)CIFISP_BLS_FIX_SUB_MIN ||
483 arg->fixed_val.b < (s16)CIFISP_BLS_FIX_SUB_MIN) {
484 CIFISP_DPRINT(CIFISP_ERROR,
485 "incompatible param in function: %s\n", __func__);
490 memcpy(&isp_dev->other_cfgs.last_or_new->bls_config,
492 sizeof(struct cifisp_bls_config));
493 CIFISP_MODULE_UPDATE(
494 isp_dev->other_cfgs.module_updates,
497 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
502 /* ISP LS correction interface function */
503 static int cifisp_lsc_param(struct cif_isp10_isp_dev *isp_dev,
504 bool flag, struct cifisp_lsc_config *arg)
507 unsigned long lock_flags = 0;
513 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
517 &isp_dev->other_cfgs.curr->lsc_config,
522 cifisp_param_dump(arg, CIFISP_MODULE_LSC);
525 &isp_dev->other_cfgs.curr->lsc_config,
526 sizeof(*arg)) == 0) {
527 CIFISP_DPRINT(CIFISP_DEBUG,
528 "same param in function: %s\n", __func__);
532 for (i = 0; i < CIFISP_LSC_SIZE_TBL_SIZE; i++) {
533 if ((*(arg->x_size_tbl + i) & CIFISP_LSC_SECT_SIZE_RESERVED) ||
534 (*(arg->y_size_tbl + i) & CIFISP_LSC_SECT_SIZE_RESERVED)) {
535 CIFISP_DPRINT(CIFISP_ERROR,
536 "incompatible sect size x 0x%x y 0x%x in function: %s\n",
537 *(arg->x_size_tbl + i),
538 *(arg->y_size_tbl + i), __func__);
544 for (i = 0; i < CIFISP_LSC_GRAD_TBL_SIZE; i++) {
545 if ((*(arg->x_grad_tbl + i) & CIFISP_LSC_GRAD_RESERVED) ||
546 (*(arg->y_grad_tbl + i) & CIFISP_LSC_GRAD_RESERVED)) {
547 CIFISP_DPRINT(CIFISP_ERROR,
548 "incompatible grad x 0x%x y 0x%xin function: %s\n",
549 *(arg->x_grad_tbl + i),
550 *(arg->y_grad_tbl + i), __func__);
556 for (i = 0; i < CIFISP_LSC_DATA_TBL_SIZE; i++) {
557 if ((*(arg->r_data_tbl + i) &
558 CIFISP_LSC_SAMPLE_RESERVED) ||
559 (*(arg->gr_data_tbl + i) &
560 CIFISP_LSC_SAMPLE_RESERVED) ||
561 (*(arg->gb_data_tbl + i) &
562 CIFISP_LSC_SAMPLE_RESERVED) ||
563 (*(arg->b_data_tbl + i) &
564 CIFISP_LSC_SAMPLE_RESERVED)) {
565 CIFISP_DPRINT(CIFISP_ERROR,
566 "incompatible sample r 0x%x gr 0x%x gb 0x%x b 0x%x in function: %s\n",
567 *(arg->r_data_tbl + i),
568 *(arg->gr_data_tbl + i),
569 *(arg->gb_data_tbl + i),
570 *(arg->b_data_tbl + i), __func__);
576 memcpy(&isp_dev->other_cfgs.last_or_new->lsc_config,
578 sizeof(struct cifisp_lsc_config));
579 CIFISP_MODULE_UPDATE(
580 isp_dev->other_cfgs.module_updates,
583 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
588 /* ISP Filtering function */
589 static int cifisp_flt_param(struct cif_isp10_isp_dev *isp_dev,
590 bool flag, struct cifisp_flt_config *arg)
592 unsigned long lock_flags = 0;
598 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
602 &isp_dev->other_cfgs.curr->flt_config,
607 cifisp_param_dump(arg, CIFISP_MODULE_FLT);
610 &isp_dev->other_cfgs.curr->flt_config,
611 sizeof(*arg)) == 0) {
612 CIFISP_DPRINT(CIFISP_DEBUG,
613 "same param in function: %s\n", __func__);
617 /* Parameter check */
618 if (arg->mode > CIFISP_FLT_MODE_MAX ||
619 arg->grn_stage1 > CIFISP_FLT_GREEN_STAGE1_MAX ||
620 arg->chr_v_mode > CIFISP_FLT_CHROMA_MODE_MAX ||
621 arg->chr_h_mode > CIFISP_FLT_CHROMA_MODE_MAX ||
622 arg->thresh_sh0 & CIFISP_FLT_THREAD_RESERVED ||
623 arg->thresh_sh1 & CIFISP_FLT_THREAD_RESERVED ||
624 arg->thresh_bl0 & CIFISP_FLT_THREAD_RESERVED ||
625 arg->thresh_bl1 & CIFISP_FLT_THREAD_RESERVED ||
626 arg->fac_bl0 & CIFISP_FLT_FAC_RESERVED ||
627 arg->fac_bl1 & CIFISP_FLT_FAC_RESERVED ||
628 arg->fac_sh0 & CIFISP_FLT_FAC_RESERVED ||
629 arg->fac_sh1 & CIFISP_FLT_FAC_RESERVED ||
630 arg->fac_mid & CIFISP_FLT_FAC_RESERVED ||
631 arg->lum_weight & CIFISP_FLT_LUM_WEIGHT_RESERVED) {
632 CIFISP_DPRINT(CIFISP_ERROR,
633 "incompatible param in function: %s\n", __func__);
638 memcpy(&isp_dev->other_cfgs.last_or_new->flt_config,
640 sizeof(struct cifisp_flt_config));
641 CIFISP_MODULE_UPDATE(
642 isp_dev->other_cfgs.module_updates,
645 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
650 /* ISP demosaic interface function */
651 static int cifisp_bdm_param(struct cif_isp10_isp_dev *isp_dev,
652 bool flag, struct cifisp_bdm_config *arg)
654 unsigned long lock_flags = 0;
660 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
664 &isp_dev->other_cfgs.curr->bdm_config,
669 cifisp_param_dump(arg, CIFISP_MODULE_BDM);
672 &isp_dev->other_cfgs.curr->bdm_config,
673 sizeof(*arg)) == 0) {
674 CIFISP_DPRINT(CIFISP_DEBUG,
675 "same param in function: %s\n", __func__);
679 memcpy(&isp_dev->other_cfgs.last_or_new->bdm_config,
681 sizeof(struct cifisp_bdm_config));
682 CIFISP_MODULE_UPDATE(
683 isp_dev->other_cfgs.module_updates,
686 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
691 /* ISP GAMMA correction interface function */
692 static int cifisp_sdg_param(struct cif_isp10_isp_dev *isp_dev,
693 bool flag, struct cifisp_sdg_config *arg)
695 unsigned long lock_flags = 0;
702 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
706 &isp_dev->other_cfgs.curr->sdg_config,
711 cifisp_param_dump(arg, CIFISP_MODULE_SDG);
714 &isp_dev->other_cfgs.curr->sdg_config,
715 sizeof(*arg)) == 0) {
716 CIFISP_DPRINT(CIFISP_DEBUG,
717 "same param in function: %s\n", __func__);
721 if (arg->xa_pnts.gamma_dx0 & CIFISP_DEGAMMA_X_RESERVED ||
722 arg->xa_pnts.gamma_dx1 & CIFISP_DEGAMMA_X_RESERVED) {
723 CIFISP_DPRINT(CIFISP_ERROR,
724 "incompatible param in function: %s\n", __func__);
729 for (i = 0; i < CIFISP_DEGAMMA_CURVE_SIZE; i++) {
730 if ((arg->curve_b.gamma_y[i] & CIFISP_DEGAMMA_Y_RESERVED) ||
731 (arg->curve_r.gamma_y[i] & CIFISP_DEGAMMA_Y_RESERVED) ||
732 (arg->curve_g.gamma_y[i] & CIFISP_DEGAMMA_Y_RESERVED)) {
733 CIFISP_DPRINT(CIFISP_ERROR,
734 "incompatible param in function: %s\n", __func__);
740 memcpy(&isp_dev->other_cfgs.last_or_new->sdg_config,
742 sizeof(struct cifisp_sdg_config));
743 CIFISP_MODULE_UPDATE(
744 isp_dev->other_cfgs.module_updates,
747 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
752 /* ISP GAMMA correction interface function */
753 static int cifisp_goc_param(struct cif_isp10_isp_dev *isp_dev,
754 bool flag, struct cifisp_goc_config *arg)
756 unsigned long lock_flags = 0;
762 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
766 &isp_dev->other_cfgs.curr->goc_config,
771 cifisp_param_dump(arg, CIFISP_MODULE_GOC);
774 &isp_dev->other_cfgs.curr->goc_config,
775 sizeof(*arg)) == 0) {
776 CIFISP_DPRINT(CIFISP_DEBUG,
777 "same param in function: %s\n", __func__);
781 if (arg->mode > CIFISP_GOC_MODE_MAX) {
782 CIFISP_DPRINT(CIFISP_ERROR,
783 "incompatible param 0x%x in function: %s\n",
784 arg->mode, __func__);
789 memcpy(&isp_dev->other_cfgs.last_or_new->goc_config,
791 sizeof(struct cifisp_goc_config));
792 CIFISP_MODULE_UPDATE(
793 isp_dev->other_cfgs.module_updates,
796 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
802 static int cifisp_ctk_param(struct cif_isp10_isp_dev *isp_dev,
803 bool flag, struct cifisp_ctk_config *arg)
805 unsigned long lock_flags = 0;
811 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
815 &isp_dev->other_cfgs.curr->ctk_config,
820 cifisp_param_dump(arg, CIFISP_MODULE_CTK);
823 &isp_dev->other_cfgs.curr->ctk_config,
824 sizeof(*arg)) == 0) {
825 CIFISP_DPRINT(CIFISP_DEBUG,
826 "same param in function: %s\n", __func__);
830 /* Perform parameter check */
831 if (arg->coeff0 & CIFISP_CTK_COEFF_RESERVED ||
832 arg->coeff1 & CIFISP_CTK_COEFF_RESERVED ||
833 arg->coeff2 & CIFISP_CTK_COEFF_RESERVED ||
834 arg->coeff3 & CIFISP_CTK_COEFF_RESERVED ||
835 arg->coeff4 & CIFISP_CTK_COEFF_RESERVED ||
836 arg->coeff5 & CIFISP_CTK_COEFF_RESERVED ||
837 arg->coeff6 & CIFISP_CTK_COEFF_RESERVED ||
838 arg->coeff7 & CIFISP_CTK_COEFF_RESERVED ||
839 arg->coeff8 & CIFISP_CTK_COEFF_RESERVED ||
840 arg->ct_offset_r & CIFISP_XTALK_OFFSET_RESERVED ||
841 arg->ct_offset_g & CIFISP_XTALK_OFFSET_RESERVED ||
842 arg->ct_offset_b & CIFISP_XTALK_OFFSET_RESERVED) {
843 CIFISP_DPRINT(CIFISP_ERROR,
844 "incompatible param in function: %s\n", __func__);
849 memcpy(&isp_dev->other_cfgs.last_or_new->ctk_config,
851 sizeof(struct cifisp_ctk_config));
852 CIFISP_MODULE_UPDATE(
853 isp_dev->other_cfgs.module_updates,
856 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
861 /* ISP White Balance Mode */
862 static int cifisp_awb_meas_param(struct cif_isp10_isp_dev *isp_dev,
863 bool flag, struct cifisp_awb_meas_config *arg)
865 unsigned long lock_flags = 0;
871 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
875 &isp_dev->meas_cfgs.curr->awb_meas_config,
880 cifisp_param_dump(arg, CIFISP_MODULE_AWB);
883 &isp_dev->meas_cfgs.curr->awb_meas_config,
884 sizeof(*arg)) == 0) {
885 CIFISP_DPRINT(CIFISP_DEBUG,
886 "same param in function: %s\n", __func__);
890 if (arg->awb_mode > CIFISP_AWB_MODE_YCBCR ||
891 arg->awb_wnd.h_offs > CIFISP_AWB_WINDOW_OFFSET_MAX ||
892 arg->awb_wnd.v_offs > CIFISP_AWB_WINDOW_OFFSET_MAX ||
893 arg->awb_wnd.h_size > CIFISP_AWB_WINDOW_MAX_SIZE ||
894 arg->awb_wnd.v_size > CIFISP_AWB_WINDOW_MAX_SIZE ||
895 arg->frames > CIFISP_AWB_MAX_FRAMES) {
896 CIFISP_DPRINT(CIFISP_ERROR,
897 "incompatible param in function: %s\n", __func__);
902 memcpy(&isp_dev->meas_cfgs.last_or_new->awb_meas_config,
904 sizeof(struct cifisp_awb_meas_config));
905 CIFISP_MODULE_UPDATE(
906 isp_dev->meas_cfgs.module_updates,
909 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
914 static int cifisp_awb_gain_param(struct cif_isp10_isp_dev *isp_dev,
915 bool flag, struct cifisp_awb_gain_config *arg)
917 unsigned long lock_flags = 0;
923 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
927 &isp_dev->other_cfgs.curr->awb_gain_config,
932 cifisp_param_dump(arg, CIFISP_MODULE_AWB_GAIN);
935 &isp_dev->other_cfgs.curr->awb_gain_config,
936 sizeof(*arg)) == 0) {
937 CIFISP_DPRINT(CIFISP_DEBUG,
938 "same param in function: %s\n", __func__);
942 if (arg->gain_red > CIFISP_AWB_GAINS_MAX_VAL ||
943 arg->gain_green_r > CIFISP_AWB_GAINS_MAX_VAL ||
944 arg->gain_green_b > CIFISP_AWB_GAINS_MAX_VAL ||
945 arg->gain_blue > CIFISP_AWB_GAINS_MAX_VAL) {
946 CIFISP_DPRINT(CIFISP_ERROR,
947 "incompatible param in function: %s\n", __func__);
952 memcpy(&isp_dev->other_cfgs.last_or_new->awb_gain_config,
954 sizeof(struct cifisp_awb_gain_config));
955 CIFISP_MODULE_UPDATE(
956 isp_dev->other_cfgs.module_updates,
957 CIFISP_MODULE_AWB_GAIN);
959 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
964 static int cifisp_aec_param(struct cif_isp10_isp_dev *isp_dev,
965 bool flag, struct cifisp_aec_config *arg)
967 unsigned long lock_flags = 0;
973 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
977 &isp_dev->meas_cfgs.curr->aec_config,
982 cifisp_param_dump(arg, CIFISP_MODULE_AEC);
985 &isp_dev->meas_cfgs.curr->aec_config,
986 sizeof(*arg)) == 0) {
987 CIFISP_DPRINT(CIFISP_DEBUG,
988 "same param in function: %s\n", __func__);
992 if (arg->meas_window.h_offs > CIFISP_EXP_MAX_HOFFS ||
993 arg->meas_window.h_size > CIFISP_EXP_MAX_HSIZE ||
994 arg->meas_window.h_size < CIFISP_EXP_MIN_HSIZE ||
995 arg->meas_window.v_offs > CIFISP_EXP_MAX_VOFFS ||
996 arg->meas_window.v_size > CIFISP_EXP_MAX_VSIZE ||
997 arg->meas_window.v_size < CIFISP_EXP_MIN_VSIZE ||
998 arg->mode > CIFISP_EXP_MEASURING_MODE_1) {
999 CIFISP_DPRINT(CIFISP_ERROR,
1000 "incompatible param in function: %s\n", __func__);
1005 memcpy(&isp_dev->meas_cfgs.last_or_new->aec_config,
1007 sizeof(struct cifisp_aec_config));
1008 CIFISP_MODULE_UPDATE(
1009 isp_dev->meas_cfgs.module_updates,
1012 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1017 static int cifisp_cproc_param(struct cif_isp10_isp_dev *isp_dev,
1018 bool flag, struct cifisp_cproc_config *arg)
1020 unsigned long lock_flags = 0;
1026 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
1028 if (flag == _GET_) {
1030 &isp_dev->other_cfgs.curr->cproc_config,
1035 cifisp_param_dump(arg, CIFISP_MODULE_CPROC);
1038 &isp_dev->other_cfgs.curr->cproc_config,
1039 sizeof(*arg)) == 0) {
1040 CIFISP_DPRINT(CIFISP_DEBUG,
1041 "same param in function: %s\n", __func__);
1045 if (arg->c_out_range & CIFISP_CPROC_CTRL_RESERVED ||
1046 arg->y_out_range & CIFISP_CPROC_CTRL_RESERVED ||
1047 arg->y_in_range & CIFISP_CPROC_CTRL_RESERVED ||
1048 arg->contrast & CIFISP_CPROC_CONTRAST_RESERVED ||
1049 arg->brightness & CIFISP_CPROC_BRIGHTNESS_RESERVED ||
1050 arg->sat & CIFISP_CPROC_SATURATION_RESERVED ||
1051 arg->hue & CIFISP_CPROC_HUE_RESERVED) {
1052 CIFISP_DPRINT(CIFISP_ERROR,
1053 "incompatible param in function: %s\n", __func__);
1058 memcpy(&isp_dev->other_cfgs.last_or_new->cproc_config,
1060 sizeof(struct cifisp_cproc_config));
1061 CIFISP_MODULE_UPDATE(
1062 isp_dev->other_cfgs.module_updates,
1063 CIFISP_MODULE_CPROC);
1065 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1070 static int cifisp_hst_param(struct cif_isp10_isp_dev *isp_dev,
1071 bool flag, struct cifisp_hst_config *arg)
1073 unsigned long lock_flags = 0;
1080 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
1082 if (flag == _GET_) {
1084 &isp_dev->meas_cfgs.curr->hst_config,
1090 &isp_dev->meas_cfgs.curr->hst_config,
1091 sizeof(*arg)) == 0) {
1092 CIFISP_DPRINT(CIFISP_DEBUG,
1093 "same param in function: %s\n", __func__);
1097 if (arg->mode > CIFISP_HISTOGRAM_MODE_Y_HISTOGRAM ||
1098 arg->histogram_predivider > CIFISP_MAX_HIST_PREDIVIDER ||
1099 arg->meas_window.v_offs & CIFISP_HIST_WINDOW_OFFSET_RESERVED ||
1100 arg->meas_window.h_offs & CIFISP_HIST_WINDOW_OFFSET_RESERVED ||
1101 (arg->meas_window.v_size / (CIFISP_HIST_ROW_NUM - 1)) &
1102 CIFISP_HIST_WINDOW_SIZE_RESERVED ||
1103 (arg->meas_window.h_size / (CIFISP_HIST_COLUMN_NUM - 1)) &
1104 CIFISP_HIST_WINDOW_SIZE_RESERVED) {
1105 CIFISP_DPRINT(CIFISP_ERROR,
1106 "incompatible param in function: %s line: %d\n",
1107 __func__, __LINE__);
1112 for (i = 0; i < CIFISP_HISTOGRAM_WEIGHT_GRIDS_SIZE; i++) {
1113 if (arg->hist_weight[i] & CIFISP_HIST_WEIGHT_RESERVED) {
1114 CIFISP_DPRINT(CIFISP_ERROR,
1115 "incompatible param in function: %s line: %d\n",
1116 __func__, __LINE__);
1122 memcpy(&isp_dev->meas_cfgs.last_or_new->hst_config,
1124 sizeof(struct cifisp_hst_config));
1125 CIFISP_MODULE_UPDATE(
1126 isp_dev->meas_cfgs.module_updates,
1129 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1134 static int cifisp_afc_param(struct cif_isp10_isp_dev *isp_dev,
1135 bool flag, struct cifisp_afc_config *arg)
1137 unsigned long lock_flags = 0;
1144 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
1146 if (flag == _GET_) {
1148 &isp_dev->meas_cfgs.curr->afc_config,
1153 cifisp_param_dump(arg, CIFISP_MODULE_AFC);
1156 &isp_dev->meas_cfgs.curr->afc_config,
1157 sizeof(*arg)) == 0) {
1158 CIFISP_DPRINT(CIFISP_DEBUG,
1159 "same param in function: %s\n", __func__);
1163 if (arg->num_afm_win > CIFISP_AFM_MAX_WINDOWS ||
1164 arg->thres & CIFISP_AFC_THRES_RESERVED ||
1165 arg->var_shift & CIFISP_AFC_VAR_SHIFT_RESERVED) {
1166 CIFISP_DPRINT(CIFISP_ERROR,
1167 "incompatible param in function: %s\n", __func__);
1172 for (i = 0; i < arg->num_afm_win; i++) {
1173 if (arg->afm_win[i].h_offs & CIFISP_AFC_WINDOW_X_RESERVED ||
1174 arg->afm_win[i].h_offs < CIFISP_AFC_WINDOW_X_MIN ||
1175 arg->afm_win[i].v_offs & CIFISP_AFC_WINDOW_Y_RESERVED ||
1176 arg->afm_win[i].v_offs < CIFISP_AFC_WINDOW_Y_MIN ||
1177 arg->afm_win[i].h_size & CIFISP_AFC_WINDOW_X_RESERVED ||
1178 arg->afm_win[i].v_size & CIFISP_AFC_WINDOW_Y_RESERVED) {
1179 CIFISP_DPRINT(CIFISP_ERROR,
1180 "incompatible param in function: %s\n",
1187 memcpy(&isp_dev->meas_cfgs.last_or_new->afc_config,
1189 sizeof(struct cifisp_afc_config));
1190 CIFISP_MODULE_UPDATE(
1191 isp_dev->meas_cfgs.module_updates,
1194 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1199 static int cifisp_ie_param(struct cif_isp10_isp_dev *isp_dev,
1200 bool flag, struct cifisp_ie_config *arg)
1202 unsigned long lock_flags = 0;
1208 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
1210 if (flag == _GET_) {
1212 &isp_dev->other_cfgs.curr->ie_config,
1217 cifisp_param_dump(arg, CIFISP_MODULE_IE);
1220 &isp_dev->other_cfgs.curr->ie_config,
1221 sizeof(*arg)) == 0) {
1222 CIFISP_DPRINT(CIFISP_DEBUG,
1223 "same param in function: %s\n", __func__);
1227 if (arg->effect != V4L2_COLORFX_NONE &&
1228 arg->effect != V4L2_COLORFX_BW &&
1229 arg->effect != V4L2_COLORFX_SEPIA &&
1230 arg->effect != V4L2_COLORFX_NEGATIVE &&
1231 arg->effect != V4L2_COLORFX_EMBOSS &&
1232 arg->effect != V4L2_COLORFX_SKETCH &&
1233 arg->effect != V4L2_COLORFX_AQUA &&
1234 arg->effect != V4L2_COLORFX_SET_CBCR) {
1235 CIFISP_DPRINT(CIFISP_ERROR,
1236 "incompatible param in function: %s\n", __func__);
1241 memcpy(&isp_dev->other_cfgs.last_or_new->ie_config,
1243 sizeof(struct cifisp_ie_config));
1244 CIFISP_MODULE_UPDATE(
1245 isp_dev->other_cfgs.module_updates,
1248 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1253 /* ISP De-noise Pre-Filter(DPF) function */
1254 static int cifisp_dpf_param(struct cif_isp10_isp_dev *isp_dev,
1255 bool flag, struct cifisp_dpf_config *arg)
1257 unsigned long lock_flags = 0;
1264 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
1266 if (flag == _GET_) {
1268 &isp_dev->other_cfgs.curr->dpf_config,
1273 cifisp_param_dump(arg, CIFISP_MODULE_DPF);
1276 &isp_dev->other_cfgs.curr->dpf_config,
1277 sizeof(*arg)) == 0) {
1278 CIFISP_DPRINT(CIFISP_DEBUG,
1279 "same param in function: %s\n", __func__);
1283 /* Parameter check */
1284 if ((arg->gain.mode >= CIFISP_DPF_GAIN_USAGE_MAX) ||
1285 (arg->gain.mode < CIFISP_DPF_GAIN_USAGE_DISABLED) ||
1286 (arg->gain.nf_b_gain & CIFISP_DPF_NF_GAIN_RESERVED) ||
1287 (arg->gain.nf_r_gain & CIFISP_DPF_NF_GAIN_RESERVED) ||
1288 (arg->gain.nf_gr_gain & CIFISP_DPF_NF_GAIN_RESERVED) ||
1289 (arg->gain.nf_gb_gain & CIFISP_DPF_NF_GAIN_RESERVED)) {
1290 CIFISP_DPRINT(CIFISP_ERROR,
1291 "incompatible DPF GAIN param in function: %s\n",
1297 for (i = 0; i < CIFISP_DPF_MAX_SPATIAL_COEFFS; i++) {
1298 if ((arg->g_flt.spatial_coeff[i] >
1299 CIFISP_DPF_SPATIAL_COEFF_MAX)) {
1300 CIFISP_DPRINT(CIFISP_ERROR,
1301 "incompatible DPF G Spatial param in function: %s\n",
1307 if (arg->rb_flt.spatial_coeff[i] >
1308 CIFISP_DPF_SPATIAL_COEFF_MAX) {
1309 CIFISP_DPRINT(CIFISP_ERROR,
1310 "incompatible DPF RB Spatial param in function: %s\n",
1317 if ((arg->rb_flt.fltsize != CIFISP_DPF_RB_FILTERSIZE_9x9) &&
1318 (arg->rb_flt.fltsize != CIFISP_DPF_RB_FILTERSIZE_13x9)) {
1319 CIFISP_DPRINT(CIFISP_ERROR,
1320 "incompatible DPF RB filter size param in function: %s\n",
1326 for (i = 0; i < CIFISP_DPF_MAX_NLF_COEFFS; i++) {
1327 if (arg->nll.coeff[i] > CIFISP_DPF_NLL_COEFF_N_MAX) {
1328 CIFISP_DPRINT(CIFISP_ERROR,
1329 "incompatible DPF NLL coeff param in function: %s\n",
1336 if ((arg->nll.scale_mode != CIFISP_NLL_SCALE_LINEAR) &&
1337 (arg->nll.scale_mode != CIFISP_NLL_SCALE_LOGARITHMIC)) {
1338 CIFISP_DPRINT(CIFISP_ERROR,
1339 "incompatible DPF NLL scale mode param in function: %s\n",
1345 memcpy(&isp_dev->other_cfgs.last_or_new->dpf_config,
1347 sizeof(struct cifisp_dpf_config));
1348 CIFISP_MODULE_UPDATE(
1349 isp_dev->other_cfgs.module_updates,
1352 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1357 static int cifisp_dpf_strength_param(struct cif_isp10_isp_dev *isp_dev,
1358 bool flag, struct cifisp_dpf_strength_config *arg)
1360 unsigned long lock_flags = 0;
1366 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
1368 if (flag == _GET_) {
1370 &isp_dev->other_cfgs.curr->dpf_strength_config,
1375 cifisp_param_dump(arg, CIFISP_MODULE_DPF_STRENGTH);
1378 &isp_dev->other_cfgs.curr->dpf_strength_config,
1379 sizeof(*arg)) == 0) {
1380 CIFISP_DPRINT(CIFISP_DEBUG,
1381 "same param in function: %s\n", __func__);
1385 memcpy(&isp_dev->other_cfgs.last_or_new->dpf_strength_config,
1387 sizeof(struct cifisp_dpf_strength_config));
1388 CIFISP_MODULE_UPDATE(
1389 isp_dev->other_cfgs.module_updates,
1390 CIFISP_MODULE_DPF_STRENGTH);
1392 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
1397 static int cifisp_last_capture_config(struct cifisp_last_capture_config *arg)
1399 #ifdef LOG_CAPTURE_PARAMS
1403 memcpy(arg, &g_last_capture_config, sizeof(*arg));
1412 static void cifisp_dpcc_config(const struct cif_isp10_isp_dev *isp_dev)
1414 const struct cifisp_dpcc_config *pconfig =
1415 &isp_dev->other_cfgs.last_or_new->dpcc_config;
1418 cifisp_iowrite32(pconfig->mode, CIF_ISP_DPCC_MODE);
1419 cifisp_iowrite32(pconfig->output_mode, CIF_ISP_DPCC_OUTPUT_MODE);
1420 cifisp_iowrite32(pconfig->set_use, CIF_ISP_DPCC_SET_USE);
1422 cifisp_iowrite32(pconfig->methods[0].method,
1423 CIF_ISP_DPCC_METHODS_SET_1);
1424 cifisp_iowrite32(pconfig->methods[1].method,
1425 CIF_ISP_DPCC_METHODS_SET_2);
1426 cifisp_iowrite32(pconfig->methods[2].method,
1427 CIF_ISP_DPCC_METHODS_SET_3);
1428 for (i = 0; i < CIFISP_DPCC_METHODS_MAX; i++) {
1429 cifisp_iowrite32(pconfig->methods[i].line_thresh,
1430 CIF_ISP_DPCC_LINE_THRESH_1 + 0x14 * i);
1431 cifisp_iowrite32(pconfig->methods[i].line_mad_fac,
1432 CIF_ISP_DPCC_LINE_MAD_FAC_1 + 0x14 * i);
1433 cifisp_iowrite32(pconfig->methods[i].pg_fac,
1434 CIF_ISP_DPCC_PG_FAC_1 + 0x14 * i);
1435 cifisp_iowrite32(pconfig->methods[i].rnd_thresh,
1436 CIF_ISP_DPCC_RND_THRESH_1 + 0x14 * i);
1437 cifisp_iowrite32(pconfig->methods[i].rg_fac,
1438 CIF_ISP_DPCC_RG_FAC_1 + 0x14 * i);
1441 cifisp_iowrite32(pconfig->rnd_offs, CIF_ISP_DPCC_RND_OFFS);
1442 cifisp_iowrite32(pconfig->ro_limits, CIF_ISP_DPCC_RO_LIMITS);
1445 static void cifisp_dpcc_en(const struct cif_isp10_isp_dev *isp_dev)
1447 cifisp_iowrite32OR(CIFISP_DPCC_ENA, CIF_ISP_DPCC_MODE);
1450 static void cifisp_dpcc_end(const struct cif_isp10_isp_dev *isp_dev)
1452 cifisp_iowrite32(CIFISP_DPCC_DIS, CIF_ISP_DPCC_MODE);
1455 /* Lens Shade Correction */
1457 /*****************************************************************************/
1458 static void cifisp_lsc_end(const struct cif_isp10_isp_dev *isp_dev)
1460 cifisp_iowrite32(0, CIF_ISP_LSC_CTRL);
1463 static bool cifisp_lsc_correct_matrix_config(struct cif_isp10_isp_dev *isp_dev)
1466 unsigned int isp_lsc_status, sram_addr, isp_lsc_table_sel;
1468 struct cifisp_lsc_config *pconfig =
1469 &isp_dev->other_cfgs.last_or_new->lsc_config;
1471 isp_lsc_status = cifisp_ioread32(CIF_ISP_LSC_STATUS);
1472 sram_addr = (isp_lsc_status & 0x2U) ? 0U : 153U; /* ( 17 * 18 ) >> 1 */
1474 cifisp_iowrite32(sram_addr, CIF_ISP_LSC_R_TABLE_ADDR);
1475 cifisp_iowrite32(sram_addr, CIF_ISP_LSC_GR_TABLE_ADDR);
1476 cifisp_iowrite32(sram_addr, CIF_ISP_LSC_GB_TABLE_ADDR);
1477 cifisp_iowrite32(sram_addr, CIF_ISP_LSC_B_TABLE_ADDR);
1479 /* program data tables (table size is 9 * 17 = 153) */
1480 for (n = 0; n < ((CIFISP_LSC_SECTORS_MAX + 1) *
1481 (CIFISP_LSC_SECTORS_MAX + 1));
1482 n += CIFISP_LSC_SECTORS_MAX + 1) {
1484 * 17 sectors with 2 values in one DWORD = 9
1485 * DWORDs (8 steps + 1 outside loop)
1487 for (i = 0; i < (CIFISP_LSC_SECTORS_MAX); i += 2) {
1488 data = CIFISP_LSC_TABLE_DATA(pconfig->r_data_tbl[n + i],
1489 pconfig->r_data_tbl[n + i + 1]);
1490 cifisp_iowrite32(data, CIF_ISP_LSC_R_TABLE_DATA);
1492 data = CIFISP_LSC_TABLE_DATA(
1493 pconfig->gr_data_tbl[n + i],
1494 pconfig->gr_data_tbl[n + i + 1]);
1495 cifisp_iowrite32(data, CIF_ISP_LSC_GR_TABLE_DATA);
1497 data = CIFISP_LSC_TABLE_DATA(
1498 pconfig->gb_data_tbl[n + i],
1499 pconfig->gb_data_tbl[n + i + 1]);
1500 cifisp_iowrite32(data, CIF_ISP_LSC_GB_TABLE_DATA);
1502 data = CIFISP_LSC_TABLE_DATA(pconfig->b_data_tbl[n + i],
1503 pconfig->b_data_tbl[n + i + 1]);
1504 cifisp_iowrite32(data, CIF_ISP_LSC_B_TABLE_DATA);
1507 data = CIFISP_LSC_TABLE_DATA(
1508 pconfig->r_data_tbl[n + CIFISP_LSC_SECTORS_MAX],
1509 /* isp_dev->lsc_config.r_data_tbl[n + i] */0);
1510 cifisp_iowrite32(data, CIF_ISP_LSC_R_TABLE_DATA);
1512 data = CIFISP_LSC_TABLE_DATA(
1513 pconfig->gr_data_tbl[n + CIFISP_LSC_SECTORS_MAX],
1514 /* isp_dev->lsc_config.gr_data_tbl[n + i] */0);
1515 cifisp_iowrite32(data, CIF_ISP_LSC_GR_TABLE_DATA);
1517 data = CIFISP_LSC_TABLE_DATA(
1518 pconfig->gb_data_tbl[n + CIFISP_LSC_SECTORS_MAX],
1519 /* isp_dev->lsc_config.gr_data_tbl[n + i] */0);
1520 cifisp_iowrite32(data, CIF_ISP_LSC_GB_TABLE_DATA);
1522 data = CIFISP_LSC_TABLE_DATA(
1523 pconfig->b_data_tbl[n + CIFISP_LSC_SECTORS_MAX],
1524 /* isp_dev->lsc_config.b_data_tbl[n + i] */0);
1525 cifisp_iowrite32(data, CIF_ISP_LSC_B_TABLE_DATA);
1528 isp_lsc_table_sel = (isp_lsc_status & 0x2U) ? 0U : 1U;
1529 cifisp_iowrite32(isp_lsc_table_sel, CIF_ISP_LSC_TABLE_SEL);
1533 /*****************************************************************************/
1534 static bool cifisp_lsc_config(struct cif_isp10_isp_dev *isp_dev)
1538 struct cifisp_lsc_config *pconfig =
1539 &isp_dev->other_cfgs.last_or_new->lsc_config;
1541 if (pconfig->config_width != isp_dev->input_width ||
1542 pconfig->config_height != isp_dev->input_height) {
1543 CIFISP_DPRINT(CIFISP_DEBUG,
1544 "LSC config: lsc_w %d lsc_h %d act_w %d act_h %d\n",
1545 pconfig->config_width,
1546 pconfig->config_height,
1547 isp_dev->input_width,
1548 isp_dev->input_height);
1552 CIFISP_DPRINT(CIFISP_DEBUG,
1553 "LSC config: lsc_w %d lsc_h %d\n",
1554 pconfig->config_width,
1555 pconfig->config_height);
1557 /* To config must be off */
1558 cifisp_iowrite32(0, CIF_ISP_LSC_CTRL);
1560 cifisp_lsc_correct_matrix_config(isp_dev);
1562 if (isp_dev->active_lsc_width !=
1563 pconfig->config_width ||
1564 isp_dev->active_lsc_height !=
1565 pconfig->config_height) {
1566 for (i = 0; i < 4; i++) {
1567 /* program x size tables */
1568 data = CIFISP_LSC_SECT_SIZE(
1569 pconfig->x_size_tbl[i * 2],
1570 pconfig->x_size_tbl[i * 2 + 1]);
1571 cifisp_iowrite32(data, CIF_ISP_LSC_XSIZE_01 + i * 4);
1573 /* program x grad tables */
1574 data = CIFISP_LSC_SECT_SIZE(
1575 pconfig->x_grad_tbl[i * 2],
1576 pconfig->x_grad_tbl[i * 2 + 1]);
1577 cifisp_iowrite32(data, CIF_ISP_LSC_XGRAD_01 + i * 4);
1579 /* program y size tables */
1580 data = CIFISP_LSC_SECT_SIZE(
1581 pconfig->y_size_tbl[i * 2],
1582 pconfig->y_size_tbl[i * 2 + 1]);
1583 cifisp_iowrite32(data, CIF_ISP_LSC_YSIZE_01 + i * 4);
1585 /* program y grad tables */
1586 data = CIFISP_LSC_SECT_SIZE(
1587 pconfig->y_grad_tbl[i * 2],
1588 pconfig->y_grad_tbl[i * 2 + 1]);
1589 cifisp_iowrite32(data, CIF_ISP_LSC_YGRAD_01 + i * 4);
1592 isp_dev->active_lsc_width = pconfig->config_width;
1593 isp_dev->active_lsc_height = pconfig->config_height;
1596 cifisp_iowrite32(1, CIF_ISP_LSC_CTRL);
1601 #ifdef LOG_CAPTURE_PARAMS
1602 static void cifisp_lsc_config_read(const struct cif_isp10_isp_dev *isp_dev,
1603 struct cifisp_lsc_config *pconfig)
1609 /*****************************************************************************/
1610 static void cifisp_bls_get_meas(const struct cif_isp10_isp_dev *isp_dev,
1611 struct cifisp_stat_buffer *pbuf)
1613 const struct cif_isp10_device *cif_dev =
1614 container_of(isp_dev, struct cif_isp10_device, isp_dev);
1615 enum cif_isp10_pix_fmt in_pix_fmt;
1617 in_pix_fmt = cif_dev->config.isp_config.input->pix_fmt;
1618 if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_BGGR(in_pix_fmt)) {
1619 pbuf->params.ae.bls_val.meas_b =
1620 cifisp_ioread32(CIF_ISP_BLS_A_MEASURED);
1621 pbuf->params.ae.bls_val.meas_gb =
1622 cifisp_ioread32(CIF_ISP_BLS_B_MEASURED);
1623 pbuf->params.ae.bls_val.meas_gr =
1624 cifisp_ioread32(CIF_ISP_BLS_C_MEASURED);
1625 pbuf->params.ae.bls_val.meas_r =
1626 cifisp_ioread32(CIF_ISP_BLS_D_MEASURED);
1627 } else if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_GBRG(in_pix_fmt)) {
1628 pbuf->params.ae.bls_val.meas_gb =
1629 cifisp_ioread32(CIF_ISP_BLS_A_MEASURED);
1630 pbuf->params.ae.bls_val.meas_b =
1631 cifisp_ioread32(CIF_ISP_BLS_B_MEASURED);
1632 pbuf->params.ae.bls_val.meas_r =
1633 cifisp_ioread32(CIF_ISP_BLS_C_MEASURED);
1634 pbuf->params.ae.bls_val.meas_gr =
1635 cifisp_ioread32(CIF_ISP_BLS_D_MEASURED);
1636 } else if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_GRBG(in_pix_fmt)) {
1637 pbuf->params.ae.bls_val.meas_gr =
1638 cifisp_ioread32(CIF_ISP_BLS_A_MEASURED);
1639 pbuf->params.ae.bls_val.meas_r =
1640 cifisp_ioread32(CIF_ISP_BLS_B_MEASURED);
1641 pbuf->params.ae.bls_val.meas_b =
1642 cifisp_ioread32(CIF_ISP_BLS_C_MEASURED);
1643 pbuf->params.ae.bls_val.meas_gb =
1644 cifisp_ioread32(CIF_ISP_BLS_D_MEASURED);
1645 } else if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_RGGB(in_pix_fmt)) {
1646 pbuf->params.ae.bls_val.meas_r =
1647 cifisp_ioread32(CIF_ISP_BLS_A_MEASURED);
1648 pbuf->params.ae.bls_val.meas_gr =
1649 cifisp_ioread32(CIF_ISP_BLS_B_MEASURED);
1650 pbuf->params.ae.bls_val.meas_gb =
1651 cifisp_ioread32(CIF_ISP_BLS_C_MEASURED);
1652 pbuf->params.ae.bls_val.meas_b =
1653 cifisp_ioread32(CIF_ISP_BLS_D_MEASURED);
1657 /*****************************************************************************/
1658 static void cifisp_bls_config(const struct cif_isp10_isp_dev *isp_dev)
1660 const struct cifisp_bls_config *pconfig =
1661 &isp_dev->other_cfgs.last_or_new->bls_config;
1662 u32 new_control = 0;
1663 const struct cif_isp10_device *cif_dev =
1664 container_of(isp_dev, struct cif_isp10_device, isp_dev);
1665 enum cif_isp10_pix_fmt in_pix_fmt;
1667 in_pix_fmt = cif_dev->config.isp_config.input->pix_fmt;
1669 /* fixed subtraction values */
1670 if (!pconfig->enable_auto) {
1671 const struct cifisp_bls_fixed_val *pval =
1672 &isp_dev->other_cfgs.last_or_new->bls_config.fixed_val;
1674 if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_BGGR(in_pix_fmt)) {
1675 cifisp_iowrite32(pval->r, CIF_ISP_BLS_D_FIXED);
1676 cifisp_iowrite32(pval->gr, CIF_ISP_BLS_C_FIXED);
1677 cifisp_iowrite32(pval->gb, CIF_ISP_BLS_B_FIXED);
1678 cifisp_iowrite32(pval->b, CIF_ISP_BLS_A_FIXED);
1679 } else if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_GBRG(in_pix_fmt)) {
1680 cifisp_iowrite32(pval->r, CIF_ISP_BLS_C_FIXED);
1681 cifisp_iowrite32(pval->gr, CIF_ISP_BLS_D_FIXED);
1682 cifisp_iowrite32(pval->gb, CIF_ISP_BLS_A_FIXED);
1683 cifisp_iowrite32(pval->b, CIF_ISP_BLS_B_FIXED);
1684 } else if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_GRBG(in_pix_fmt)) {
1685 cifisp_iowrite32(pval->r, CIF_ISP_BLS_B_FIXED);
1686 cifisp_iowrite32(pval->gr, CIF_ISP_BLS_A_FIXED);
1687 cifisp_iowrite32(pval->gb, CIF_ISP_BLS_D_FIXED);
1688 cifisp_iowrite32(pval->b, CIF_ISP_BLS_C_FIXED);
1689 } else if (CIF_ISP10_PIX_FMT_BAYER_PAT_IS_RGGB(in_pix_fmt)) {
1690 cifisp_iowrite32(pval->r, CIF_ISP_BLS_A_FIXED);
1691 cifisp_iowrite32(pval->gr, CIF_ISP_BLS_B_FIXED);
1692 cifisp_iowrite32(pval->gb, CIF_ISP_BLS_C_FIXED);
1693 cifisp_iowrite32(pval->b, CIF_ISP_BLS_D_FIXED);
1696 new_control = CIFISP_BLS_MODE_FIXED;
1697 cifisp_iowrite32(new_control, CIF_ISP_BLS_CTRL);
1699 if (pconfig->en_windows & 2) {
1700 cifisp_iowrite32(pconfig->bls_window2.h_offs,
1701 CIF_ISP_BLS_H2_START);
1702 cifisp_iowrite32(pconfig->bls_window2.h_size,
1703 CIF_ISP_BLS_H2_STOP);
1704 cifisp_iowrite32(pconfig->bls_window2.v_offs,
1705 CIF_ISP_BLS_V2_START);
1706 cifisp_iowrite32(pconfig->bls_window2.v_size,
1707 CIF_ISP_BLS_V2_STOP);
1708 new_control |= CIFISP_BLS_WINDOW_2;
1711 if (pconfig->en_windows & 1) {
1712 cifisp_iowrite32(pconfig->bls_window1.h_offs,
1713 CIF_ISP_BLS_H1_START);
1714 cifisp_iowrite32(pconfig->bls_window1.h_size,
1715 CIF_ISP_BLS_H1_STOP);
1716 cifisp_iowrite32(pconfig->bls_window1.v_offs,
1717 CIF_ISP_BLS_V1_START);
1718 cifisp_iowrite32(pconfig->bls_window1.v_size,
1719 CIF_ISP_BLS_V1_STOP);
1720 new_control |= CIFISP_BLS_WINDOW_1;
1723 cifisp_iowrite32(pconfig->bls_samples, CIF_ISP_BLS_SAMPLES);
1725 new_control |= CIFISP_BLS_MODE_MEASURED;
1727 cifisp_iowrite32(new_control, CIF_ISP_BLS_CTRL);
1731 /*****************************************************************************/
1732 static void cifisp_bls_en(const struct cif_isp10_isp_dev *isp_dev)
1734 cifisp_iowrite32OR(CIFISP_BLS_ENA, CIF_ISP_BLS_CTRL);
1737 /*****************************************************************************/
1738 static void cifisp_bls_end(const struct cif_isp10_isp_dev *isp_dev)
1740 cifisp_iowrite32(CIFISP_BLS_DIS, CIF_ISP_BLS_CTRL);
1743 /* Gamma correction */
1744 /*****************************************************************************/
1745 static void cifisp_sdg_config(const struct cif_isp10_isp_dev *isp_dev)
1747 const struct cifisp_sdg_config *pconfig =
1748 &isp_dev->other_cfgs.last_or_new->sdg_config;
1751 cifisp_iowrite32(pconfig->xa_pnts.gamma_dx0, CIF_ISP_GAMMA_DX_LO);
1752 cifisp_iowrite32(pconfig->xa_pnts.gamma_dx1, CIF_ISP_GAMMA_DX_HI);
1754 for (i = 0; i < CIFISP_DEGAMMA_CURVE_SIZE; i++) {
1755 cifisp_iowrite32(pconfig->curve_r.gamma_y[i],
1756 CIF_ISP_GAMMA_R_Y0 + i * 4);
1757 cifisp_iowrite32(pconfig->curve_g.gamma_y[i],
1758 CIF_ISP_GAMMA_G_Y0 + i * 4);
1759 cifisp_iowrite32(pconfig->curve_b.gamma_y[i],
1760 CIF_ISP_GAMMA_B_Y0 + i * 4);
1764 #ifdef LOG_CAPTURE_PARAMS
1765 static void cifisp_sdg_config_read(const struct cif_isp10_isp_dev *isp_dev,
1766 struct cifisp_sdg_config *pconfig)
1771 /*****************************************************************************/
1772 static void cifisp_sdg_en(const struct cif_isp10_isp_dev *isp_dev)
1774 cifisp_iowrite32OR(CIF_ISP_CTRL_ISP_GAMMA_IN_ENA, CIF_ISP_CTRL);
1777 /*****************************************************************************/
1778 static void cifisp_sdg_end(const struct cif_isp10_isp_dev *isp_dev)
1780 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_GAMMA_IN_ENA, CIF_ISP_CTRL);
1783 /*****************************************************************************/
1784 static void cifisp_goc_config(const struct cif_isp10_isp_dev *isp_dev)
1787 const struct cifisp_goc_config *pconfig =
1788 &isp_dev->other_cfgs.last_or_new->goc_config;
1790 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA, CIF_ISP_CTRL);
1792 cifisp_iowrite32(pconfig->mode, CIF_ISP_GAMMA_OUT_MODE);
1793 for (i = 0; i < CIFISP_GAMMA_OUT_MAX_SAMPLES; i++)
1794 cifisp_iowrite32(pconfig->gamma_y[i],
1795 CIF_ISP_GAMMA_OUT_Y_0 + i * 4);
1798 #ifdef LOG_CAPTURE_PARAMS
1799 static void cifisp_goc_config_read(const struct cif_isp10_isp_dev *isp_dev,
1800 struct cifisp_goc_config *pconfig)
1805 /*****************************************************************************/
1806 static void cifisp_goc_en(const struct cif_isp10_isp_dev *isp_dev)
1808 cifisp_iowrite32OR(CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA, CIF_ISP_CTRL);
1811 /*****************************************************************************/
1812 static void cifisp_goc_end(const struct cif_isp10_isp_dev *isp_dev)
1814 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA, CIF_ISP_CTRL);
1817 /*****************************************************************************/
1818 static void cifisp_bdm_config(const struct cif_isp10_isp_dev *isp_dev)
1820 const struct cifisp_bdm_config *pconfig =
1821 &isp_dev->other_cfgs.last_or_new->bdm_config;
1823 /*set demosaic threshold */
1824 cifisp_iowrite32(pconfig->demosaic_th, CIF_ISP_DEMOSAIC);
1827 /*****************************************************************************/
1828 static void cifisp_bdm_en(const struct cif_isp10_isp_dev *isp_dev)
1830 cifisp_iowrite32AND(~(CIFISP_BDM_BYPASS_EN(1)), CIF_ISP_DEMOSAIC);
1833 /*****************************************************************************/
1834 static void cifisp_bdm_end(const struct cif_isp10_isp_dev *isp_dev)
1836 cifisp_iowrite32(0, CIF_ISP_DEMOSAIC);
1839 /*****************************************************************************/
1840 static void cifisp_flt_config(const struct cif_isp10_isp_dev *isp_dev)
1842 const struct cifisp_flt_config *pconfig =
1843 &isp_dev->other_cfgs.last_or_new->flt_config;
1845 cifisp_iowrite32(pconfig->thresh_bl0,
1846 CIF_ISP_FILT_THRESH_BL0);
1847 cifisp_iowrite32(pconfig->thresh_bl1,
1848 CIF_ISP_FILT_THRESH_BL1);
1849 cifisp_iowrite32(pconfig->thresh_sh0,
1850 CIF_ISP_FILT_THRESH_SH0);
1851 cifisp_iowrite32(pconfig->thresh_sh1,
1852 CIF_ISP_FILT_THRESH_SH1);
1853 cifisp_iowrite32(pconfig->fac_bl0,
1854 CIF_ISP_FILT_FAC_BL0);
1855 cifisp_iowrite32(pconfig->fac_bl1,
1856 CIF_ISP_FILT_FAC_BL1);
1857 cifisp_iowrite32(pconfig->fac_mid,
1858 CIF_ISP_FILT_FAC_MID);
1859 cifisp_iowrite32(pconfig->fac_sh0,
1860 CIF_ISP_FILT_FAC_SH0);
1861 cifisp_iowrite32(pconfig->fac_sh1,
1862 CIF_ISP_FILT_FAC_SH1);
1863 cifisp_iowrite32(pconfig->lum_weight,
1864 CIF_ISP_FILT_LUM_WEIGHT);
1866 cifisp_iowrite32(CIFISP_FLT_MODE(pconfig->mode) |
1867 CIFISP_FLT_CHROMA_V_MODE(pconfig->chr_v_mode) |
1868 CIFISP_FLT_CHROMA_H_MODE(pconfig->chr_h_mode) |
1869 CIFISP_FLT_GREEN_STAGE1(pconfig->grn_stage1),
1873 #ifdef LOG_CAPTURE_PARAMS
1874 static void cifisp_flt_config_read(const struct cif_isp10_isp_dev *isp_dev,
1875 struct cifisp_flt_config *pconfig)
1880 /*****************************************************************************/
1881 static void cifisp_flt_en(const struct cif_isp10_isp_dev *isp_dev)
1883 cifisp_iowrite32OR(CIFISP_FLT_ENA, CIF_ISP_FILT_MODE);
1886 /*****************************************************************************/
1887 static void cifisp_flt_end(const struct cif_isp10_isp_dev *isp_dev)
1889 cifisp_iowrite32(CIFISP_FLT_DIS, CIF_ISP_FILT_MODE);
1892 /* Auto White Balance */
1893 /*****************************************************************************/
1894 static void cifisp_awb_gain_config(const struct cif_isp10_isp_dev *isp_dev)
1896 const struct cifisp_awb_gain_config *pconfig =
1897 &isp_dev->other_cfgs.last_or_new->awb_gain_config;
1899 cifisp_iowrite32(CIFISP_AWB_GAIN_R_SET(pconfig->gain_green_r) |
1900 pconfig->gain_green_b, CIF_ISP_AWB_GAIN_G);
1902 cifisp_iowrite32(CIFISP_AWB_GAIN_R_SET(pconfig->gain_red) |
1903 pconfig->gain_blue, CIF_ISP_AWB_GAIN_RB);
1906 #ifdef LOG_CAPTURE_PARAMS
1907 static void cifisp_awb_gain_config_read(const struct cif_isp10_isp_dev *isp_dev,
1908 struct cifisp_awb_gain_config *pconfig)
1910 unsigned int reg = cifisp_ioread32(CIF_ISP_AWB_GAIN_G);
1912 pconfig->gain_green_r = CIFISP_AWB_GAIN_R_READ(reg);
1913 pconfig->gain_green_b = CIFISP_AWB_GAIN_B_READ(reg);
1914 reg = cifisp_ioread32(CIF_ISP_AWB_GAIN_RB);
1915 pconfig->gain_red = CIFISP_AWB_GAIN_R_READ(reg);
1916 pconfig->gain_blue = CIFISP_AWB_GAIN_B_READ(reg);
1920 /*****************************************************************************/
1921 static void cifisp_awb_meas_config(const struct cif_isp10_isp_dev *isp_dev)
1923 const struct cifisp_awb_meas_config *pconfig =
1924 &isp_dev->meas_cfgs.last_or_new->awb_meas_config;
1925 unsigned int awb_prob = 0;
1927 /* based on the mode,configure the awb module */
1928 if (pconfig->awb_mode == CIFISP_AWB_MODE_RGB) {
1929 awb_prob = CIFISP_AWB_MODE_RGB_EN;
1931 if (pconfig->enable_ymax_cmp)
1932 awb_prob = CIFISP_AWB_YMAX_CMP_EN;
1934 /* Reference Cb and Cr */
1935 cifisp_iowrite32(CIFISP_AWB_REF_CR_SET(pconfig->awb_ref_cr) |
1936 pconfig->awb_ref_cb, CIF_ISP_AWB_REF);
1938 cifisp_iowrite32(CIFISP_AWB_MAX_Y_SET(pconfig->max_y) |
1939 CIFISP_AWB_MIN_Y_SET(pconfig->min_y) |
1940 CIFISP_AWB_MAX_CS_SET(pconfig->max_csum) |
1941 pconfig->min_c, CIF_ISP_AWB_THRESH);
1944 /* Common Configuration */
1945 cifisp_iowrite32(awb_prob, CIF_ISP_AWB_PROP);
1947 cifisp_iowrite32(pconfig->awb_wnd.v_offs,
1948 CIF_ISP_AWB_WND_V_OFFS);
1949 cifisp_iowrite32(pconfig->awb_wnd.h_offs,
1950 CIF_ISP_AWB_WND_H_OFFS);
1951 /* AWB window size */
1952 cifisp_iowrite32(pconfig->awb_wnd.v_size, CIF_ISP_AWB_WND_V_SIZE);
1953 cifisp_iowrite32(pconfig->awb_wnd.h_size, CIF_ISP_AWB_WND_H_SIZE);
1954 /* Number of frames */
1955 cifisp_iowrite32(pconfig->frames, CIF_ISP_AWB_FRAMES);
1958 #ifdef LOG_CAPTURE_PARAMS
1959 static void cifisp_awb_meas_config_read(const struct cif_isp10_isp_dev *isp_dev,
1960 struct cifisp_awb_meas_config *pconfig)
1965 /*****************************************************************************/
1966 static void cifisp_awb_meas_en(struct cif_isp10_isp_dev *isp_dev)
1968 const struct cifisp_awb_meas_config *pconfig =
1969 &isp_dev->meas_cfgs.last_or_new->awb_meas_config;
1970 u32 reg_val = cifisp_ioread32(CIF_ISP_AWB_PROP);
1973 reg_val &= 0xFFFFFFFC;
1975 if (pconfig->awb_mode == CIFISP_AWB_MODE_RGB)
1976 reg_val |= CIFISP_AWB_MODE_RGB_EN;
1978 reg_val |= CIFISP_AWB_MODE_YCBCR_EN;
1980 cifisp_iowrite32(reg_val, CIF_ISP_AWB_PROP);
1982 isp_dev->active_meas |= CIF_ISP_AWB_DONE;
1984 /* Measurements require AWB block be active. */
1985 cifisp_iowrite32OR(CIF_ISP_CTRL_ISP_AWB_ENA, CIF_ISP_CTRL);
1988 /*****************************************************************************/
1989 static void cifisp_awb_meas_end(struct cif_isp10_isp_dev *isp_dev)
1991 u32 reg_val = cifisp_ioread32(CIF_ISP_AWB_PROP);
1994 reg_val &= 0xFFFFFFFC;
1996 cifisp_iowrite32(reg_val, CIF_ISP_AWB_PROP);
1998 isp_dev->active_meas &= ~CIF_ISP_AWB_DONE;
2000 if (!CIFISP_MODULE_IS_EN(
2001 isp_dev->meas_cfgs.last_or_new->module_ens,
2003 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_AWB_ENA,
2007 /*****************************************************************************/
2008 static void cifisp_awb_gain_en(const struct cif_isp10_isp_dev *isp_dev)
2010 cifisp_iowrite32OR(CIF_ISP_CTRL_ISP_AWB_ENA, CIF_ISP_CTRL);
2013 /*****************************************************************************/
2014 static void cifisp_awb_gain_end(const struct cif_isp10_isp_dev *isp_dev)
2016 if (!CIFISP_MODULE_IS_EN(
2017 isp_dev->meas_cfgs.last_or_new->module_ens,
2019 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_AWB_ENA,
2023 /*****************************************************************************/
2024 static void cifisp_get_awb_meas(struct cif_isp10_isp_dev *isp_dev,
2025 struct cifisp_stat_buffer *pbuf)
2027 /* Protect against concurrent access from ISR? */
2029 const struct cifisp_awb_meas_config *pconfig =
2030 &isp_dev->meas_cfgs.curr->awb_meas_config;
2032 pbuf->meas_type |= CIFISP_STAT_AWB;
2033 reg_val = cifisp_ioread32(CIF_ISP_AWB_WHITE_CNT);
2034 pbuf->params.awb.awb_mean[0].cnt =
2035 CIFISP_AWB_GET_PIXEL_CNT(reg_val);
2036 reg_val = cifisp_ioread32(CIF_ISP_AWB_MEAN);
2038 if (pconfig->awb_mode == CIFISP_AWB_MODE_RGB) {
2039 pbuf->params.awb.awb_mean[0].mean_r =
2040 CIFISP_AWB_GET_MEAN_R(reg_val);
2041 pbuf->params.awb.awb_mean[0].mean_b =
2042 CIFISP_AWB_GET_MEAN_B(reg_val);
2043 pbuf->params.awb.awb_mean[0].mean_g =
2044 CIFISP_AWB_GET_MEAN_G(reg_val);
2046 pbuf->params.awb.awb_mean[0].mean_cr =
2047 (u8)CIFISP_AWB_GET_MEAN_CR(reg_val);
2048 pbuf->params.awb.awb_mean[0].mean_cb =
2049 (u8)CIFISP_AWB_GET_MEAN_CB(reg_val);
2050 pbuf->params.awb.awb_mean[0].mean_y =
2051 (u8)CIFISP_AWB_GET_MEAN_Y(reg_val);
2056 /*****************************************************************************/
2057 static void cifisp_aec_config(const struct cif_isp10_isp_dev *isp_dev)
2059 const struct cifisp_aec_config *pconfig =
2060 &isp_dev->meas_cfgs.last_or_new->aec_config;
2061 unsigned int block_hsize, block_vsize;
2063 cifisp_iowrite32(CIFISP_EXP_CTRL_AUTOSTOP(pconfig->autostop) |
2064 CIFISP_EXP_CTRL_MEASMODE(pconfig->mode),
2067 cifisp_iowrite32(pconfig->meas_window.h_offs, CIF_ISP_EXP_H_OFFSET);
2068 cifisp_iowrite32(pconfig->meas_window.v_offs, CIF_ISP_EXP_V_OFFSET);
2070 block_hsize = pconfig->meas_window.h_size /
2071 CIFISP_EXP_COLUMN_NUM - 1;
2072 block_vsize = pconfig->meas_window.v_size /
2073 CIFISP_EXP_ROW_NUM - 1;
2075 cifisp_iowrite32(CIFISP_EXP_HSIZE(block_hsize), CIF_ISP_EXP_H_SIZE);
2076 cifisp_iowrite32(CIFISP_EXP_VSIZE(block_vsize), CIF_ISP_EXP_V_SIZE);
2079 /*****************************************************************************/
2080 static void cifisp_aec_en(struct cif_isp10_isp_dev *isp_dev)
2082 isp_dev->active_meas |= CIF_ISP_EXP_END;
2084 cifisp_iowrite32OR(CIFISP_EXP_ENA, CIF_ISP_EXP_CTRL);
2087 /*****************************************************************************/
2088 static void cifisp_aec_end(struct cif_isp10_isp_dev *isp_dev)
2090 cifisp_iowrite32(CIFISP_EXP_DIS, CIF_ISP_EXP_CTRL);
2092 isp_dev->active_meas &= ~CIF_ISP_EXP_END;
2095 /*****************************************************************************/
2096 static void cifisp_get_aec_meas(struct cif_isp10_isp_dev *isp_dev,
2097 struct cifisp_stat_buffer *pbuf)
2101 pbuf->meas_type |= CIFISP_STAT_AUTOEXP; /*Set the measurement type */
2102 for (i = 0; i < CIFISP_AE_MEAN_MAX; i++) {
2103 pbuf->params.ae.exp_mean[i] =
2104 (u8)cifisp_ioread32(CIF_ISP_EXP_MEAN_00 + i * 4);
2109 /*****************************************************************************/
2110 static void cifisp_ctk_config(const struct cif_isp10_isp_dev *isp_dev)
2115 #ifdef LOG_CAPTURE_PARAMS
2116 static void cifisp_ctk_config_read(const struct cif_isp10_isp_dev *isp_dev,
2117 struct cifisp_ctk_config *pconfig)
2119 pconfig->coeff0 = cifisp_ioread32(CIF_ISP_CT_COEFF_0);
2120 pconfig->coeff1 = cifisp_ioread32(CIF_ISP_CT_COEFF_1);
2121 pconfig->coeff2 = cifisp_ioread32(CIF_ISP_CT_COEFF_2);
2122 pconfig->coeff3 = cifisp_ioread32(CIF_ISP_CT_COEFF_3);
2123 pconfig->coeff4 = cifisp_ioread32(CIF_ISP_CT_COEFF_4);
2124 pconfig->coeff5 = cifisp_ioread32(CIF_ISP_CT_COEFF_5);
2125 pconfig->coeff6 = cifisp_ioread32(CIF_ISP_CT_COEFF_6);
2126 pconfig->coeff7 = cifisp_ioread32(CIF_ISP_CT_COEFF_7);
2127 pconfig->coeff8 = cifisp_ioread32(CIF_ISP_CT_COEFF_8);
2128 pconfig->ct_offset_r = cifisp_ioread32(CIF_ISP_CT_OFFSET_R);
2129 pconfig->ct_offset_g = cifisp_ioread32(CIF_ISP_CT_OFFSET_G);
2130 pconfig->ct_offset_b = cifisp_ioread32(CIF_ISP_CT_OFFSET_B);
2134 /*****************************************************************************/
2135 static void cifisp_ctk_en(const struct cif_isp10_isp_dev *isp_dev)
2137 const struct cifisp_ctk_config *pconfig =
2138 &isp_dev->other_cfgs.last_or_new->ctk_config;
2140 cifisp_iowrite32(pconfig->coeff0, CIF_ISP_CT_COEFF_0);
2141 cifisp_iowrite32(pconfig->coeff1, CIF_ISP_CT_COEFF_1);
2142 cifisp_iowrite32(pconfig->coeff2, CIF_ISP_CT_COEFF_2);
2143 cifisp_iowrite32(pconfig->coeff3, CIF_ISP_CT_COEFF_3);
2144 cifisp_iowrite32(pconfig->coeff4, CIF_ISP_CT_COEFF_4);
2145 cifisp_iowrite32(pconfig->coeff5, CIF_ISP_CT_COEFF_5);
2146 cifisp_iowrite32(pconfig->coeff6, CIF_ISP_CT_COEFF_6);
2147 cifisp_iowrite32(pconfig->coeff7, CIF_ISP_CT_COEFF_7);
2148 cifisp_iowrite32(pconfig->coeff8, CIF_ISP_CT_COEFF_8);
2149 cifisp_iowrite32(pconfig->ct_offset_r, CIF_ISP_CT_OFFSET_R);
2150 cifisp_iowrite32(pconfig->ct_offset_g, CIF_ISP_CT_OFFSET_G);
2151 cifisp_iowrite32(pconfig->ct_offset_b, CIF_ISP_CT_OFFSET_B);
2154 /*****************************************************************************/
2155 static void cifisp_ctk_end(const struct cif_isp10_isp_dev *isp_dev)
2157 /* Write back the default values. */
2158 cifisp_iowrite32(0x80, CIF_ISP_CT_COEFF_0);
2159 cifisp_iowrite32(0, CIF_ISP_CT_COEFF_1);
2160 cifisp_iowrite32(0, CIF_ISP_CT_COEFF_2);
2161 cifisp_iowrite32(0, CIF_ISP_CT_COEFF_3);
2162 cifisp_iowrite32(0x80, CIF_ISP_CT_COEFF_4);
2163 cifisp_iowrite32(0, CIF_ISP_CT_COEFF_5);
2164 cifisp_iowrite32(0, CIF_ISP_CT_COEFF_6);
2165 cifisp_iowrite32(0, CIF_ISP_CT_COEFF_7);
2166 cifisp_iowrite32(0x80, CIF_ISP_CT_COEFF_8);
2168 cifisp_iowrite32(0, CIF_ISP_CT_OFFSET_R);
2169 cifisp_iowrite32(0, CIF_ISP_CT_OFFSET_G);
2170 cifisp_iowrite32(0, CIF_ISP_CT_OFFSET_B);
2174 /*****************************************************************************/
2175 static void cifisp_cproc_config(const struct cif_isp10_isp_dev *isp_dev,
2176 enum cif_isp10_pix_fmt_quantization quantization)
2178 const struct cifisp_cproc_config *pconfig =
2179 &isp_dev->other_cfgs.last_or_new->cproc_config;
2180 const struct cifisp_ie_config *ie_pconfig =
2181 &isp_dev->other_cfgs.last_or_new->ie_config;
2183 cifisp_iowrite32(pconfig->contrast, CIF_C_PROC_CONTRAST);
2184 cifisp_iowrite32(pconfig->hue, CIF_C_PROC_HUE);
2185 cifisp_iowrite32(pconfig->sat, CIF_C_PROC_SATURATION);
2186 cifisp_iowrite32(pconfig->brightness, CIF_C_PROC_BRIGHTNESS);
2188 if ((quantization != CIF_ISP10_QUANTIZATION_FULL_RANGE) ||
2189 (ie_pconfig->effect != V4L2_COLORFX_NONE)) {
2191 ~(CIF_C_PROC_YOUT_FULL |
2192 CIF_C_PROC_YIN_FULL |
2193 CIF_C_PROC_COUT_FULL),
2197 (CIF_C_PROC_YOUT_FULL |
2198 CIF_C_PROC_YIN_FULL |
2199 CIF_C_PROC_COUT_FULL),
2204 #ifdef LOG_CAPTURE_PARAMS
2205 static void cifisp_cproc_config_read(const struct cif_isp10_isp_dev *isp_dev,
2206 struct cifisp_cproc_config *pconfig)
2210 pconfig->contrast = cifisp_ioread32(CIF_C_PROC_CONTRAST);
2211 pconfig->hue = cifisp_ioread32(CIF_C_PROC_HUE);
2212 pconfig->sat = cifisp_ioread32(CIF_C_PROC_SATURATION);
2213 pconfig->brightness = cifisp_ioread32(CIF_C_PROC_BRIGHTNESS);
2214 reg = cifisp_ioread32(CIF_C_PROC_CTRL);
2215 pconfig->y_out_range = (reg >> 1) & 1;
2216 pconfig->y_in_range = (reg >> 2) & 1;
2217 pconfig->c_out_range = (reg >> 3) & 1;
2221 /*****************************************************************************/
2222 static void cifisp_cproc_en(const struct cif_isp10_isp_dev *isp_dev)
2224 cifisp_iowrite32OR(CIFISP_CPROC_EN, CIF_C_PROC_CTRL);
2227 /*****************************************************************************/
2228 static void cifisp_cproc_end(const struct cif_isp10_isp_dev *isp_dev)
2230 cifisp_iowrite32AND(~CIFISP_CPROC_EN, CIF_C_PROC_CTRL);
2233 static void cifisp_afc_config(const struct cif_isp10_isp_dev *isp_dev)
2235 const struct cifisp_afc_config *pconfig =
2236 &isp_dev->meas_cfgs.last_or_new->afc_config;
2237 int num_of_win = pconfig->num_afm_win, i;
2239 /* Switch off to configure. Enabled during normal flow in frame isr. */
2240 cifisp_iowrite32(0, CIF_ISP_AFM_CTRL);
2242 for (i = 0; i < num_of_win; i++) {
2244 CIFISP_AFC_WINDOW_X(pconfig->afm_win[0].h_offs) |
2245 CIFISP_AFC_WINDOW_Y(pconfig->afm_win[0].v_offs),
2246 CIF_ISP_AFM_LT_A + i * 8);
2248 CIFISP_AFC_WINDOW_X(pconfig->afm_win[0].h_size +
2249 pconfig->afm_win[0].h_offs) |
2250 CIFISP_AFC_WINDOW_Y(pconfig->afm_win[0].v_size +
2251 pconfig->afm_win[0].v_offs),
2252 CIF_ISP_AFM_RB_A + i * 8);
2255 cifisp_iowrite32(pconfig->thres, CIF_ISP_AFM_THRES);
2256 cifisp_iowrite32(pconfig->var_shift, CIF_ISP_AFM_VAR_SHIFT);
2259 /*****************************************************************************/
2260 static void cifisp_afc_en(struct cif_isp10_isp_dev *isp_dev)
2262 isp_dev->active_meas |= CIF_ISP_AFM_FIN;
2264 cifisp_iowrite32(CIFISP_AFC_ENA, CIF_ISP_AFM_CTRL);
2267 /*****************************************************************************/
2268 static void cifisp_afc_end(struct cif_isp10_isp_dev *isp_dev)
2270 cifisp_iowrite32(CIFISP_AFC_DIS, CIF_ISP_AFM_CTRL);
2271 isp_dev->active_meas &= ~CIF_ISP_AFM_FIN;
2274 /*****************************************************************************/
2275 static void cifisp_get_afc_meas(struct cif_isp10_isp_dev *isp_dev,
2276 struct cifisp_stat_buffer *pbuf)
2278 pbuf->meas_type = CIFISP_STAT_AFM_FIN;
2280 pbuf->params.af.window[0].sum =
2281 cifisp_ioread32(CIF_ISP_AFM_SUM_A);
2282 pbuf->params.af.window[0].lum =
2283 cifisp_ioread32(CIF_ISP_AFM_LUM_A);
2284 pbuf->params.af.window[1].sum =
2285 cifisp_ioread32(CIF_ISP_AFM_SUM_B);
2286 pbuf->params.af.window[1].lum =
2287 cifisp_ioread32(CIF_ISP_AFM_LUM_B);
2288 pbuf->params.af.window[2].sum =
2289 cifisp_ioread32(CIF_ISP_AFM_SUM_C);
2290 pbuf->params.af.window[2].lum =
2291 cifisp_ioread32(CIF_ISP_AFM_LUM_C);
2294 /* HISTOGRAM CALCULATION */
2295 /*****************************************************************************/
2296 static void cifisp_hst_config(const struct cif_isp10_isp_dev *isp_dev)
2298 const struct cifisp_hst_config *pconfig =
2299 &isp_dev->meas_cfgs.last_or_new->hst_config;
2300 unsigned int block_hsize, block_vsize;
2302 cifisp_iowrite32(CIFISP_HIST_PREDIV_SET(pconfig->histogram_predivider),
2304 cifisp_iowrite32(pconfig->meas_window.h_offs, CIF_ISP_HIST_H_OFFS);
2305 cifisp_iowrite32(pconfig->meas_window.v_offs, CIF_ISP_HIST_V_OFFS);
2307 block_hsize = pconfig->meas_window.h_size /
2308 CIFISP_HIST_COLUMN_NUM - 1;
2309 block_vsize = pconfig->meas_window.v_size /
2310 CIFISP_HIST_ROW_NUM - 1;
2312 cifisp_iowrite32(block_hsize, CIF_ISP_HIST_H_SIZE);
2313 cifisp_iowrite32(block_vsize, CIF_ISP_HIST_V_SIZE);
2315 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[0],
2316 pconfig->hist_weight[1], pconfig->hist_weight[2],
2317 pconfig->hist_weight[3]), CIF_ISP_HIST_WEIGHT_00TO30);
2318 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[4],
2319 pconfig->hist_weight[5], pconfig->hist_weight[6],
2320 pconfig->hist_weight[7]), CIF_ISP_HIST_WEIGHT_40TO21);
2321 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[8],
2322 pconfig->hist_weight[9], pconfig->hist_weight[10],
2323 pconfig->hist_weight[11]), CIF_ISP_HIST_WEIGHT_31TO12);
2324 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[12],
2325 pconfig->hist_weight[13], pconfig->hist_weight[14],
2326 pconfig->hist_weight[15]), CIF_ISP_HIST_WEIGHT_22TO03);
2327 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[16],
2328 pconfig->hist_weight[17], pconfig->hist_weight[18],
2329 pconfig->hist_weight[19]), CIF_ISP_HIST_WEIGHT_13TO43);
2330 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[20],
2331 pconfig->hist_weight[21], pconfig->hist_weight[22],
2332 pconfig->hist_weight[23]), CIF_ISP_HIST_WEIGHT_04TO34);
2333 cifisp_iowrite32(CIFISP_HIST_WEIGHT_SET(pconfig->hist_weight[24],
2334 0, 0, 0), CIF_ISP_HIST_WEIGHT_44);
2337 static void cifisp_hst_en(struct cif_isp10_isp_dev *isp_dev)
2339 const struct cifisp_hst_config *pconfig =
2340 &isp_dev->meas_cfgs.last_or_new->hst_config;
2342 isp_dev->active_meas |= CIF_ISP_HIST_MEASURE_RDY;
2344 cifisp_iowrite32OR(pconfig->mode,
2348 /*****************************************************************************/
2349 static void cifisp_hst_end(struct cif_isp10_isp_dev *isp_dev)
2351 /* Disable measurement */
2352 cifisp_iowrite32(CIFISP_HISTOGRAM_MODE_DISABLE,
2355 isp_dev->active_meas &= ~CIF_ISP_HIST_MEASURE_RDY;
2358 /*****************************************************************************/
2359 static void cifisp_get_hst_meas(const struct cif_isp10_isp_dev *isp_dev,
2360 struct cifisp_stat_buffer *pbuf)
2364 pbuf->meas_type |= CIFISP_STAT_HIST;
2365 for (i = 0; i < CIFISP_HIST_BIN_N_MAX; i++) {
2366 pbuf->params.hist.hist_bins[i] =
2367 cifisp_ioread32(CIF_ISP_HIST_BIN_0 + (i * 4));
2372 /*****************************************************************************/
2373 static void cifisp_ie_config(const struct cif_isp10_isp_dev *isp_dev)
2375 const struct cifisp_ie_config *pconfig =
2376 &isp_dev->other_cfgs.last_or_new->ie_config;
2378 switch (pconfig->effect) {
2379 case V4L2_COLORFX_SET_CBCR:
2380 cifisp_iowrite32(pconfig->eff_tint, CIF_IMG_EFF_TINT);
2383 * Color selection is similar to water color(AQUA):
2384 * grayscale + selected color w threshold
2386 case V4L2_COLORFX_AQUA:
2387 cifisp_iowrite32(pconfig->color_sel, CIF_IMG_EFF_COLOR_SEL);
2389 case V4L2_COLORFX_EMBOSS:
2390 cifisp_iowrite32(pconfig->eff_mat_1, CIF_IMG_EFF_MAT_1);
2391 cifisp_iowrite32(pconfig->eff_mat_2, CIF_IMG_EFF_MAT_2);
2392 cifisp_iowrite32(pconfig->eff_mat_3, CIF_IMG_EFF_MAT_3);
2394 case V4L2_COLORFX_SKETCH:
2395 cifisp_iowrite32(pconfig->eff_mat_3, CIF_IMG_EFF_MAT_3);
2396 cifisp_iowrite32(pconfig->eff_mat_4, CIF_IMG_EFF_MAT_4);
2397 cifisp_iowrite32(pconfig->eff_mat_5, CIF_IMG_EFF_MAT_5);
2404 static void cifisp_ie_en(const struct cif_isp10_isp_dev *isp_dev)
2406 const struct cifisp_ie_config *pconfig =
2407 &isp_dev->other_cfgs.last_or_new->ie_config;
2408 enum cif_isp10_image_effect effect;
2410 switch (pconfig->effect) {
2411 case V4L2_COLORFX_SEPIA:
2412 case V4L2_COLORFX_SET_CBCR:
2413 effect = CIF_ISP10_IE_SEPIA;
2415 case V4L2_COLORFX_BW:
2416 effect = CIF_ISP10_IE_BW;
2418 case V4L2_COLORFX_NEGATIVE:
2419 effect = CIF_ISP10_IE_NEGATIVE;
2421 case V4L2_COLORFX_EMBOSS:
2422 effect = CIF_ISP10_IE_EMBOSS;
2424 case V4L2_COLORFX_SKETCH:
2425 effect = CIF_ISP10_IE_SKETCH;
2427 case V4L2_COLORFX_AQUA:
2428 effect = CIF_ISP10_IE_C_SEL;
2430 case V4L2_COLORFX_NONE:
2432 effect = CIF_ISP10_IE_NONE;
2436 if (effect < CIF_ISP10_IE_NONE) {
2437 cifisp_iowrite32OR(CIF_ICCL_IE_CLK, CIF_ICCL);
2438 cifisp_iowrite32(CIF_IMG_EFF_CTRL_ENABLE |
2439 effect << 1, CIF_IMG_EFF_CTRL);
2440 cifisp_iowrite32OR(CIF_IMG_EFF_CTRL_CFG_UPD, CIF_IMG_EFF_CTRL);
2441 } else if (effect == CIF_ISP10_IE_NONE) {
2442 cifisp_iowrite32AND(~CIF_IMG_EFF_CTRL_ENABLE, CIF_IMG_EFF_CTRL);
2443 cifisp_iowrite32AND(~CIF_ICCL_IE_CLK, CIF_ICCL);
2447 static void cifisp_ie_end(const struct cif_isp10_isp_dev *isp_dev)
2449 /* Disable measurement */
2450 cifisp_iowrite32AND(~CIF_IMG_EFF_CTRL_ENABLE, CIF_IMG_EFF_CTRL);
2451 cifisp_iowrite32AND(~CIF_ICCL_IE_CLK, CIF_ICCL);
2454 static void cifisp_csm_config(const struct cif_isp10_isp_dev *isp_dev,
2455 enum cif_isp10_pix_fmt_quantization quantization)
2457 const struct cifisp_ie_config *pconfig =
2458 &isp_dev->other_cfgs.last_or_new->ie_config;
2460 if ((quantization != CIF_ISP10_QUANTIZATION_FULL_RANGE) ||
2461 ((pconfig->effect != V4L2_COLORFX_NONE) &&
2462 CIFISP_MODULE_IS_EN(
2463 isp_dev->other_cfgs.last_or_new->module_ens,
2464 CIFISP_MODULE_CPROC))) {
2465 /* Limit range conversion */
2466 cifisp_iowrite32(0x21, CIF_ISP_CC_COEFF_0);
2467 cifisp_iowrite32(0x40, CIF_ISP_CC_COEFF_1);
2468 cifisp_iowrite32(0xd, CIF_ISP_CC_COEFF_2);
2469 cifisp_iowrite32(0x1ed, CIF_ISP_CC_COEFF_3);
2470 cifisp_iowrite32(0x1db, CIF_ISP_CC_COEFF_4);
2471 cifisp_iowrite32(0x38, CIF_ISP_CC_COEFF_5);
2472 cifisp_iowrite32(0x38, CIF_ISP_CC_COEFF_6);
2473 cifisp_iowrite32(0x1d1, CIF_ISP_CC_COEFF_7);
2474 cifisp_iowrite32(0x1f7, CIF_ISP_CC_COEFF_8);
2475 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA,
2477 cifisp_iowrite32AND(~CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA,
2480 cifisp_iowrite32(0x26, CIF_ISP_CC_COEFF_0);
2481 cifisp_iowrite32(0x4b, CIF_ISP_CC_COEFF_1);
2482 cifisp_iowrite32(0xf, CIF_ISP_CC_COEFF_2);
2483 cifisp_iowrite32(0x1ea, CIF_ISP_CC_COEFF_3);
2484 cifisp_iowrite32(0x1d6, CIF_ISP_CC_COEFF_4);
2485 cifisp_iowrite32(0x40, CIF_ISP_CC_COEFF_5);
2486 cifisp_iowrite32(0x40, CIF_ISP_CC_COEFF_6);
2487 cifisp_iowrite32(0x1ca, CIF_ISP_CC_COEFF_7);
2488 cifisp_iowrite32(0x1f6, CIF_ISP_CC_COEFF_8);
2489 cifisp_iowrite32OR(CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA,
2491 cifisp_iowrite32OR(CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA,
2497 /*****************************************************************************/
2498 static void cifisp_dpf_config(const struct cif_isp10_isp_dev *isp_dev)
2500 const struct cifisp_dpf_config *pconfig =
2501 &isp_dev->other_cfgs.last_or_new->dpf_config;
2502 unsigned int isp_dpf_mode;
2504 unsigned int spatial_coeff;
2506 isp_dpf_mode = 0x00;
2508 switch (pconfig->gain.mode) {
2509 case CIFISP_DPF_GAIN_USAGE_DISABLED:
2511 case CIFISP_DPF_GAIN_USAGE_NF_GAINS:
2512 isp_dpf_mode |= CIFISP_DPF_MODE_USE_NF_GAIN |
2513 CIFISP_DPF_MODE_AWB_GAIN_COMP;
2515 case CIFISP_DPF_GAIN_USAGE_LSC_GAINS:
2516 isp_dpf_mode |= CIFISP_DPF_MODE_LSC_GAIN_COMP;
2518 case CIFISP_DPF_GAIN_USAGE_NF_LSC_GAINS:
2519 isp_dpf_mode |= CIFISP_DPF_MODE_USE_NF_GAIN |
2520 CIFISP_DPF_MODE_AWB_GAIN_COMP |
2521 CIFISP_DPF_MODE_LSC_GAIN_COMP;
2523 case CIFISP_DPF_GAIN_USAGE_AWB_GAINS:
2524 isp_dpf_mode |= CIFISP_DPF_MODE_AWB_GAIN_COMP;
2526 case CIFISP_DPF_GAIN_USAGE_AWB_LSC_GAINS:
2527 isp_dpf_mode |= CIFISP_DPF_MODE_LSC_GAIN_COMP |
2528 CIFISP_DPF_MODE_AWB_GAIN_COMP;
2535 CIFISP_DPF_MODE_NLL_SEGMENTATION(pconfig->nll.scale_mode);
2537 CIFISP_DPF_MODE_RB_FLTSIZE(pconfig->rb_flt.fltsize);
2539 isp_dpf_mode |= (pconfig->rb_flt.r_enable) ?
2540 CIFISP_DPF_MODE_R_FLT_EN : CIFISP_DPF_MODE_R_FLT_DIS;
2541 isp_dpf_mode |= (pconfig->rb_flt.b_enable) ?
2542 CIFISP_DPF_MODE_B_FLT_EN : CIFISP_DPF_MODE_B_FLT_DIS;
2543 isp_dpf_mode |= (pconfig->g_flt.gb_enable) ?
2544 CIFISP_DPF_MODE_GB_FLT_EN : CIFISP_DPF_MODE_GB_FLT_DIS;
2545 isp_dpf_mode |= (pconfig->g_flt.gr_enable) ?
2546 CIFISP_DPF_MODE_GR_FLT_EN : CIFISP_DPF_MODE_GR_FLT_DIS;
2548 cifisp_iowrite32(isp_dpf_mode, CIF_ISP_DPF_MODE);
2549 cifisp_iowrite32(pconfig->gain.nf_b_gain, CIF_ISP_DPF_NF_GAIN_B);
2550 cifisp_iowrite32(pconfig->gain.nf_r_gain, CIF_ISP_DPF_NF_GAIN_R);
2551 cifisp_iowrite32(pconfig->gain.nf_gb_gain, CIF_ISP_DPF_NF_GAIN_GB);
2552 cifisp_iowrite32(pconfig->gain.nf_gr_gain, CIF_ISP_DPF_NF_GAIN_GR);
2554 for (i = 0; i < CIFISP_DPF_MAX_NLF_COEFFS; i++) {
2555 cifisp_iowrite32(pconfig->nll.coeff[i],
2556 CIF_ISP_DPF_NULL_COEFF_0 + i * 4);
2559 spatial_coeff = pconfig->g_flt.spatial_coeff[0] |
2560 ((unsigned int)pconfig->g_flt.spatial_coeff[1] << 8) |
2561 ((unsigned int)pconfig->g_flt.spatial_coeff[2] << 16) |
2562 ((unsigned int)pconfig->g_flt.spatial_coeff[3] << 24);
2563 cifisp_iowrite32(spatial_coeff, CIF_ISP_DPF_S_WEIGHT_G_1_4);
2564 spatial_coeff = pconfig->g_flt.spatial_coeff[4] |
2565 ((unsigned int)pconfig->g_flt.spatial_coeff[5] << 8);
2566 cifisp_iowrite32(spatial_coeff, CIF_ISP_DPF_S_WEIGHT_G_5_6);
2567 spatial_coeff = pconfig->rb_flt.spatial_coeff[0] |
2568 ((unsigned int)pconfig->rb_flt.spatial_coeff[1] << 8) |
2569 ((unsigned int)pconfig->rb_flt.spatial_coeff[2] << 16) |
2570 ((unsigned int)pconfig->rb_flt.spatial_coeff[3] << 24);
2571 cifisp_iowrite32(spatial_coeff, CIF_ISP_DPF_S_WEIGHT_RB_1_4);
2572 spatial_coeff = pconfig->rb_flt.spatial_coeff[4] |
2573 ((unsigned int)pconfig->rb_flt.spatial_coeff[5] << 8);
2574 cifisp_iowrite32(spatial_coeff, CIF_ISP_DPF_S_WEIGHT_RB_5_6);
2577 static void cifisp_dpf_strength_config(const struct cif_isp10_isp_dev *isp_dev)
2579 const struct cifisp_dpf_strength_config *pconfig =
2580 &isp_dev->other_cfgs.last_or_new->dpf_strength_config;
2582 cifisp_iowrite32(pconfig->b, CIF_ISP_DPF_STRENGTH_B);
2583 cifisp_iowrite32(pconfig->g, CIF_ISP_DPF_STRENGTH_G);
2584 cifisp_iowrite32(pconfig->r, CIF_ISP_DPF_STRENGTH_R);
2587 static void cifisp_dpf_en(struct cif_isp10_isp_dev *isp_dev)
2589 cifisp_iowrite32OR(CIFISP_DPF_MODE_EN,
2593 static void cifisp_dpf_end(struct cif_isp10_isp_dev *isp_dev)
2595 cifisp_iowrite32AND(~CIFISP_DPF_MODE_EN,
2599 /* ================================QUEUE OPS ================== */
2600 static int cifisp_stat_vbq_setup(struct videobuf_queue *vq,
2601 unsigned int *cnt, unsigned int *size)
2603 *size = sizeof(struct cifisp_stat_buffer);
2608 static void cifisp_stat_vbq_release(struct videobuf_queue *vq,
2609 struct videobuf_buffer *vb)
2611 CIFISP_DPRINT(CIFISP_DEBUG, "Releasing buffer entry!\n");
2613 videobuf_waiton(vq, vb, 0, 0);
2615 videobuf_vmalloc_free(vb);
2617 CIFISP_DPRINT(CIFISP_DEBUG, "Releasing buffer exit!\n");
2620 static int cifisp_stat_vbq_prepare(struct videobuf_queue *vq,
2621 struct videobuf_buffer *vb,
2622 enum v4l2_field field)
2626 vb->size = sizeof(struct cifisp_stat_buffer);
2631 if (vb->state == VIDEOBUF_NEEDS_INIT)
2632 err = videobuf_iolock(vq, vb, NULL);
2635 vb->state = VIDEOBUF_PREPARED;
2637 cifisp_stat_vbq_release(vq, vb);
2642 static void cifisp_stat_vbq_queue(struct videobuf_queue *vq,
2643 struct videobuf_buffer *vb)
2645 struct cif_isp10_isp_dev *isp_dev = vq->priv_data;
2647 vb->state = VIDEOBUF_QUEUED;
2649 CIFISP_DPRINT(CIFISP_DEBUG, "Queueing stat buffer!\n");
2651 list_add_tail(&vb->queue, &isp_dev->stat);
2655 static struct videobuf_queue_ops cifisp_stat_qops = {
2656 .buf_setup = cifisp_stat_vbq_setup,
2657 .buf_prepare = cifisp_stat_vbq_prepare,
2658 .buf_queue = cifisp_stat_vbq_queue,
2659 .buf_release = cifisp_stat_vbq_release,
2662 /* ================== IOCTL implementation ========================= */
2663 static int cifisp_reqbufs(struct file *file, void *priv,
2664 struct v4l2_requestbuffers *p)
2666 struct cif_isp10_isp_dev *isp_dev =
2667 video_get_drvdata(video_devdata(file));
2669 CIFISP_DPRINT(CIFISP_DEBUG,
2670 " %s: %s: p->type %d p->count %d\n",
2671 ISP_VDEV_NAME, __func__, p->type, p->count);
2673 return videobuf_reqbufs(&isp_dev->vbq_stat, p);
2676 static int cifisp_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
2678 struct cif_isp10_isp_dev *isp_dev =
2679 video_get_drvdata(video_devdata(file));
2681 CIFISP_DPRINT(CIFISP_DEBUG,
2682 " %s: %s: p->type %d p->index %d\n",
2683 ISP_VDEV_NAME, __func__, p->type, p->index);
2685 return videobuf_querybuf(&isp_dev->vbq_stat, p);
2688 static int cifisp_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
2690 struct cif_isp10_isp_dev *isp_dev =
2691 video_get_drvdata(video_devdata(file));
2693 CIFISP_DPRINT(CIFISP_DEBUG,
2694 " %s: %s: p->type %d p->index %d\n",
2695 ISP_VDEV_NAME, __func__, p->type, p->index);
2697 return videobuf_qbuf(&isp_dev->vbq_stat, p);
2700 /* ========================================================== */
2702 static int cifisp_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
2704 struct cif_isp10_isp_dev *isp_dev =
2705 video_get_drvdata(video_devdata(file));
2707 CIFISP_DPRINT(CIFISP_DEBUG,
2708 " %s: %s: p->type %d p->index %d\n",
2709 ISP_VDEV_NAME, __func__, p->type, p->index);
2711 return videobuf_dqbuf(&isp_dev->vbq_stat, p,
2712 file->f_flags & O_NONBLOCK);
2715 static int cifisp_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
2717 struct cif_isp10_isp_dev *isp_dev =
2718 video_get_drvdata(video_devdata(file));
2720 int ret = videobuf_streamon(&isp_dev->vbq_stat);
2723 isp_dev->streamon = true;
2725 CIFISP_DPRINT(CIFISP_DEBUG,
2726 " %s: %s: ret %d\n", ISP_VDEV_NAME, __func__, ret);
2731 /* ========================================================== */
2732 static int cifisp_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
2734 struct cif_isp10_isp_dev *isp_dev =
2735 video_get_drvdata(video_devdata(file));
2738 drain_workqueue(isp_dev->readout_wq);
2740 ret = videobuf_streamoff(&isp_dev->vbq_stat);
2743 isp_dev->streamon = false;
2745 CIFISP_DPRINT(CIFISP_DEBUG,
2746 " %s: %s: ret %d\n", ISP_VDEV_NAME, __func__, ret);
2751 static int cifisp_g_ctrl(struct file *file, void *priv, struct v4l2_control *vc)
2755 struct cif_isp10_isp_dev *isp_dev =
2756 video_get_drvdata(video_devdata(file));
2759 case V4L2_CID_CIFISP_DPCC:
2760 ret = cifisp_module_enable(
2764 CIFISP_MODULE_DPCC);
2766 case V4L2_CID_CIFISP_BLS:
2767 ret = cifisp_module_enable(
2773 case V4L2_CID_CIFISP_SDG:
2774 ret = cifisp_module_enable(
2780 case V4L2_CID_CIFISP_LSC:
2781 ret = cifisp_module_enable(
2787 case V4L2_CID_CIFISP_AWB_MEAS:
2788 ret = cifisp_module_enable(
2794 case V4L2_CID_CIFISP_AWB_GAIN:
2795 ret = cifisp_module_enable(
2799 CIFISP_MODULE_AWB_GAIN);
2801 case V4L2_CID_CIFISP_FLT:
2802 ret = cifisp_module_enable(
2808 case V4L2_CID_CIFISP_BDM:
2809 ret = cifisp_module_enable(
2815 case V4L2_CID_CIFISP_CTK:
2816 ret = cifisp_module_enable(
2822 case V4L2_CID_CIFISP_GOC:
2823 ret = cifisp_module_enable(
2829 case V4L2_CID_CIFISP_HST:
2830 ret = cifisp_module_enable(
2836 case V4L2_CID_CIFISP_AEC:
2837 ret = cifisp_module_enable(
2843 case V4L2_CID_CIFISP_CPROC:
2844 ret = cifisp_module_enable(
2848 CIFISP_MODULE_CPROC);
2850 case V4L2_CID_CIFISP_AFC:
2851 ret = cifisp_module_enable(
2857 case V4L2_CID_CIFISP_IE:
2858 ret = cifisp_module_enable(
2864 case V4L2_CID_CIFISP_DPF:
2865 ret = cifisp_module_enable(
2878 static int cifisp_s_ctrl(struct file *file, void *priv, struct v4l2_control *vc)
2880 struct cif_isp10_isp_dev *isp_dev =
2881 video_get_drvdata(video_devdata(file));
2885 case V4L2_CID_CIFISP_DPCC:
2886 ret = cifisp_module_enable(
2890 CIFISP_MODULE_DPCC);
2892 case V4L2_CID_CIFISP_BLS:
2893 ret = cifisp_module_enable(
2899 case V4L2_CID_CIFISP_SDG:
2900 ret = cifisp_module_enable(
2906 case V4L2_CID_CIFISP_LSC:
2907 ret = cifisp_module_enable(
2913 case V4L2_CID_CIFISP_AWB_MEAS:
2914 ret = cifisp_module_enable(
2920 case V4L2_CID_CIFISP_AWB_GAIN:
2921 ret = cifisp_module_enable(
2925 CIFISP_MODULE_AWB_GAIN);
2927 case V4L2_CID_CIFISP_FLT:
2928 ret = cifisp_module_enable(
2934 case V4L2_CID_CIFISP_BDM:
2935 ret = cifisp_module_enable(
2941 case V4L2_CID_CIFISP_CTK:
2942 ret = cifisp_module_enable(
2948 case V4L2_CID_CIFISP_GOC:
2949 ret = cifisp_module_enable(
2955 case V4L2_CID_CIFISP_HST:
2956 ret = cifisp_module_enable(
2962 case V4L2_CID_CIFISP_AEC:
2963 ret = cifisp_module_enable(
2969 case V4L2_CID_CIFISP_CPROC:
2970 ret = cifisp_module_enable(
2974 CIFISP_MODULE_CPROC);
2976 case V4L2_CID_CIFISP_AFC:
2977 ret = cifisp_module_enable(
2983 case V4L2_CID_CIFISP_IE:
2984 ret = cifisp_module_enable(
2990 case V4L2_CID_CIFISP_DPF:
2991 ret = cifisp_module_enable(
3004 static long cifisp_ioctl_default(struct file *file,
3005 void *fh, bool valid_prio, unsigned int cmd, void *arg)
3007 struct cif_isp10_isp_dev *isp = video_get_drvdata(video_devdata(file));
3011 case CIFISP_IOC_G_DPCC:
3012 ret = cifisp_dpcc_param(isp, _GET_, arg);
3014 case CIFISP_IOC_S_DPCC:
3015 ret = cifisp_dpcc_param(isp, _SET_, arg);
3017 case CIFISP_IOC_G_BLS:
3018 ret = cifisp_bls_param(isp, _GET_, arg);
3020 case CIFISP_IOC_S_BLS:
3021 ret = cifisp_bls_param(isp, _SET_, arg);
3023 case CIFISP_IOC_G_SDG:
3024 ret = cifisp_sdg_param(isp, _GET_, arg);
3026 case CIFISP_IOC_S_SDG:
3027 ret = cifisp_sdg_param(isp, _SET_, arg);
3029 case CIFISP_IOC_G_LSC:
3030 ret = cifisp_lsc_param(isp, _GET_, arg);
3032 case CIFISP_IOC_S_LSC:
3033 ret = cifisp_lsc_param(isp, _SET_, arg);
3035 case CIFISP_IOC_G_AWB_MEAS:
3036 ret = cifisp_awb_meas_param(isp, _GET_, arg);
3038 case CIFISP_IOC_S_AWB_MEAS:
3039 ret = cifisp_awb_meas_param(isp, _SET_, arg);
3041 case CIFISP_IOC_G_AWB_GAIN:
3042 ret = cifisp_awb_gain_param(isp, _GET_, arg);
3044 case CIFISP_IOC_S_AWB_GAIN:
3045 ret = cifisp_awb_gain_param(isp, _SET_, arg);
3047 case CIFISP_IOC_G_FLT:
3048 ret = cifisp_flt_param(isp, _GET_, arg);
3050 case CIFISP_IOC_S_FLT:
3051 ret = cifisp_flt_param(isp, _SET_, arg);
3053 case CIFISP_IOC_G_BDM:
3054 ret = cifisp_bdm_param(isp, _GET_, arg);
3056 case CIFISP_IOC_S_BDM:
3057 ret = cifisp_bdm_param(isp, _SET_, arg);
3059 case CIFISP_IOC_G_CTK:
3060 ret = cifisp_ctk_param(isp, _GET_, arg);
3062 case CIFISP_IOC_S_CTK:
3063 ret = cifisp_ctk_param(isp, _SET_, arg);
3065 case CIFISP_IOC_G_GOC:
3066 ret = cifisp_goc_param(isp, _GET_, arg);
3068 case CIFISP_IOC_S_GOC:
3069 ret = cifisp_goc_param(isp, _SET_, arg);
3071 case CIFISP_IOC_G_HST:
3072 ret = cifisp_hst_param(isp, _GET_, arg);
3074 case CIFISP_IOC_S_HST:
3075 ret = cifisp_hst_param(isp, _SET_, arg);
3077 case CIFISP_IOC_G_AEC:
3078 ret = cifisp_aec_param(isp, _GET_, arg);
3080 case CIFISP_IOC_S_AEC:
3081 ret = cifisp_aec_param(isp, _SET_, arg);
3083 case CIFISP_IOC_G_CPROC:
3084 ret = cifisp_cproc_param(isp, _GET_, arg);
3086 case CIFISP_IOC_S_CPROC:
3087 ret = cifisp_cproc_param(isp, _SET_, arg);
3089 case CIFISP_IOC_G_AFC:
3090 ret = cifisp_afc_param(isp, _GET_, arg);
3092 case CIFISP_IOC_S_AFC:
3093 ret = cifisp_afc_param(isp, _SET_, arg);
3095 case CIFISP_IOC_G_IE:
3096 ret = cifisp_ie_param(isp, _GET_, arg);
3098 case CIFISP_IOC_S_IE:
3099 ret = cifisp_ie_param(isp, _SET_, arg);
3101 case CIFISP_IOC_G_DPF:
3102 ret = cifisp_dpf_param(isp, _GET_, arg);
3104 case CIFISP_IOC_S_DPF:
3105 ret = cifisp_dpf_param(isp, _SET_, arg);
3107 case CIFISP_IOC_G_DPF_STRENGTH:
3108 ret = cifisp_dpf_strength_param(isp, _GET_, arg);
3110 case CIFISP_IOC_S_DPF_STRENGTH:
3111 ret = cifisp_dpf_strength_param(isp, _SET_, arg);
3113 case CIFISP_IOC_G_LAST_CONFIG:
3114 ret = cifisp_last_capture_config(arg);
3123 static int cifisp_g_fmt_vid_cap(struct file *file, void *fh,
3124 struct v4l2_format *f)
3127 * Dummy function needed to allow allocation of
3128 * buffers on this device
3133 static int cifisp_querycap(struct file *file,
3134 void *priv, struct v4l2_capability *cap)
3136 struct video_device *vdev = video_devdata(file);
3137 struct cif_isp10_isp_dev *isp_dev = video_get_drvdata(vdev);
3139 strcpy(cap->driver, DRIVER_NAME);
3140 strlcpy(cap->card, vdev->name, sizeof(cap->card));
3141 snprintf(cap->bus_info, sizeof(cap->bus_info),
3142 "platform:" DRIVER_NAME "-%03i",
3145 cap->capabilities = V4L2_CAP_DEVICE_CAPS;
3146 cap->device_caps = V4L2_CAP_DEVICE_CAPS;
3150 /* ISP video device IOCTLs */
3151 static const struct v4l2_ioctl_ops cifisp_ioctl = {
3152 .vidioc_reqbufs = cifisp_reqbufs,
3153 .vidioc_querybuf = cifisp_querybuf,
3154 .vidioc_qbuf = cifisp_qbuf,
3155 .vidioc_dqbuf = cifisp_dqbuf,
3156 .vidioc_streamon = cifisp_streamon,
3157 .vidioc_streamoff = cifisp_streamoff,
3158 .vidioc_g_ctrl = cifisp_g_ctrl,
3159 .vidioc_s_ctrl = cifisp_s_ctrl,
3160 .vidioc_default = cifisp_ioctl_default,
3161 .vidioc_g_fmt_vid_cap = cifisp_g_fmt_vid_cap,
3162 .vidioc_querycap = cifisp_querycap
3165 /* ======================================================== */
3167 static unsigned int cifisp_poll(struct file *file,
3168 struct poll_table_struct *wait)
3170 struct cif_isp10_isp_dev *isp_dev =
3171 video_get_drvdata(video_devdata(file));
3174 ret = videobuf_poll_stream(file, &isp_dev->vbq_stat, wait);
3176 CIFISP_DPRINT(CIFISP_DEBUG,
3177 "Polling on vbq_stat buffer %d\n", ret);
3182 /* ======================================================== */
3183 static int cifisp_mmap(struct file *file, struct vm_area_struct *vma)
3185 struct cif_isp10_isp_dev *isp_dev =
3186 video_get_drvdata(video_devdata(file));
3188 return videobuf_mmap_mapper(&isp_dev->vbq_stat, vma);
3191 /* ddl@rock-chips.com: v1.0.8 */
3192 static int cifisp_reset(struct file *file)
3194 struct cif_isp10_isp_dev *isp_dev =
3195 video_get_drvdata(video_devdata(file));
3197 memset(isp_dev->other_cfgs.cfgs, 0, sizeof(isp_dev->other_cfgs.cfgs));
3198 memset(isp_dev->meas_cfgs.cfgs, 0, sizeof(isp_dev->meas_cfgs.cfgs));
3200 isp_dev->other_cfgs.last_or_new = &isp_dev->other_cfgs.cfgs[0];
3201 isp_dev->other_cfgs.curr = &isp_dev->other_cfgs.cfgs[1];
3202 isp_dev->other_cfgs.module_updates = 0;
3204 isp_dev->meas_cfgs.last_or_new = &isp_dev->meas_cfgs.cfgs[0];
3205 isp_dev->meas_cfgs.curr = &isp_dev->meas_cfgs.cfgs[1];
3206 isp_dev->meas_cfgs.module_updates = 0;
3207 isp_dev->active_lsc_width = 0;
3208 isp_dev->active_lsc_height = 0;
3210 isp_dev->streamon = false;
3211 isp_dev->active_meas = 0;
3212 isp_dev->frame_id = 0;
3213 isp_dev->cif_ism_cropping = false;
3217 static int cifisp_open(struct file *file)
3219 CIFISP_DPRINT(CIFISP_DEBUG, "cifisp_open\n");
3226 static int cifisp_close(struct file *file)
3228 struct cif_isp10_isp_dev *isp_dev =
3229 video_get_drvdata(video_devdata(file));
3231 CIFISP_DPRINT(CIFISP_DEBUG, "cifisp_close\n");
3233 videobuf_stop(&isp_dev->vbq_stat);
3234 videobuf_mmap_free(&isp_dev->vbq_stat);
3236 /* cifisp_reset(file); */
3240 struct v4l2_file_operations cifisp_fops = {
3241 .mmap = cifisp_mmap,
3242 .unlocked_ioctl = video_ioctl2,
3243 #ifdef CONFIG_COMPAT
3244 .compat_ioctl32 = video_ioctl2,
3246 .poll = cifisp_poll,
3247 .open = cifisp_open,
3248 .release = cifisp_close
3251 static void cifisp_release(struct video_device *vdev)
3253 struct cif_isp10_isp_dev *isp_dev = video_get_drvdata(vdev);
3255 CIFISP_DPRINT(CIFISP_DEBUG, "cifisp_release\n");
3256 video_device_release(vdev);
3257 destroy_workqueue(isp_dev->readout_wq);
3260 /************************************************************/
3261 int register_cifisp_device(struct cif_isp10_isp_dev *isp_dev,
3262 struct video_device *vdev_cifisp,
3263 struct v4l2_device *v4l2_dev,
3264 void __iomem *cif_reg_baseaddress)
3266 isp_dev->base_addr = cif_reg_baseaddress;
3267 WARN_ON(!(isp_dev->base_addr));
3269 INIT_LIST_HEAD(&isp_dev->stat);
3270 spin_lock_init(&isp_dev->irq_lock);
3271 spin_lock_init(&isp_dev->config_lock);
3272 strlcpy(vdev_cifisp->name, ISP_VDEV_NAME, sizeof(vdev_cifisp->name));
3273 vdev_cifisp->vfl_type = V4L2_CAP_VIDEO_CAPTURE;
3274 video_set_drvdata(vdev_cifisp, isp_dev);
3275 vdev_cifisp->ioctl_ops = &cifisp_ioctl;
3276 vdev_cifisp->fops = &cifisp_fops;
3279 * This might not release all resources,
3280 * but unregistering is anyway not going to happen.
3282 vdev_cifisp->release = cifisp_release;
3283 mutex_init(&isp_dev->mutex);
3285 * Provide a mutex to v4l2 core. It will be used
3286 * to protect all fops and v4l2 ioctls.
3288 vdev_cifisp->lock = &isp_dev->mutex;
3289 vdev_cifisp->v4l2_dev = v4l2_dev;
3291 videobuf_queue_vmalloc_init(
3296 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3298 sizeof(struct videobuf_buffer),
3300 NULL); /* ext_lock: NULL */
3302 if (video_register_device(vdev_cifisp, VFL_TYPE_GRABBER, -1) < 0) {
3303 dev_err(&vdev_cifisp->dev,
3304 "could not register Video for Linux device\n");
3308 CIFISP_DPRINT(CIFISP_DEBUG,
3309 "%s: CIFISP vdev minor = %d\n",
3310 __func__, vdev_cifisp->minor);
3312 isp_dev->readout_wq =
3313 alloc_workqueue("measurement_queue",
3314 WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
3316 if (!isp_dev->readout_wq)
3319 isp_dev->v_blanking_us = CIFISP_MODULE_DEFAULT_VBLANKING_TIME;
3324 void unregister_cifisp_device(struct video_device *vdev_cifisp)
3326 if (!IS_ERR_OR_NULL(vdev_cifisp))
3327 video_unregister_device(vdev_cifisp);
3330 static void cifisp_dump_reg(struct cif_isp10_isp_dev *isp_dev, int level)
3332 #ifdef CIFISP_DEBUG_REG
3333 if (isp_dev->dpcc_en)
3334 cifisp_reg_dump(isp_dev, CIFISP_MODULE_DPCC, level);
3336 if (isp_dev->lsc_en)
3337 cifisp_reg_dump(isp_dev, CIFISP_MODULE_LSC, level);
3339 if (isp_dev->bls_en)
3340 cifisp_reg_dump(isp_dev, CIFISP_MODULE_BLS, level);
3342 if (isp_dev->sdg_en)
3343 cifisp_reg_dump(isp_dev, CIFISP_MODULE_SDG, level);
3345 if (isp_dev->goc_en)
3346 cifisp_reg_dump(isp_dev, CIFISP_MODULE_GOC, level);
3348 if (isp_dev->bdm_en)
3349 cifisp_reg_dump(isp_dev, CIFISP_MODULE_BDM, level);
3351 if (isp_dev->flt_en)
3352 cifisp_reg_dump(isp_dev, CIFISP_MODULE_FLT, level);
3354 if (isp_dev->awb_meas_en || isp_dev->awb_gain_en)
3355 cifisp_reg_dump(isp_dev, CIFISP_MODULE_AWB, level);
3357 if (isp_dev->aec_en)
3358 cifisp_reg_dump(isp_dev, CIFISP_MODULE_AEC, level);
3360 if (isp_dev->ctk_en)
3361 cifisp_reg_dump(isp_dev, CIFISP_MODULE_CTK, level);
3363 if (isp_dev->cproc_en)
3364 cifisp_reg_dump(isp_dev, CIFISP_MODULE_CPROC, level);
3366 if (isp_dev->afc_en)
3367 cifisp_reg_dump(isp_dev, CIFISP_MODULE_AFC, level);
3369 if (isp_dev->hst_en)
3370 cifisp_reg_dump(isp_dev, CIFISP_MODULE_HST, level);
3374 static inline void cifisp_meas_config_swap(
3375 struct cif_isp10_isp_dev *isp_dev)
3377 struct cifisp_isp_meas_cfg *new_cfg;
3379 new_cfg = isp_dev->meas_cfgs.last_or_new;
3380 new_cfg->s_frame_id = isp_dev->frame_id;
3381 isp_dev->meas_cfgs.last_or_new =
3382 isp_dev->meas_cfgs.curr;
3383 isp_dev->meas_cfgs.curr = new_cfg;
3386 static inline void cifisp_other_config_swap(
3387 struct cif_isp10_isp_dev *isp_dev)
3389 struct cifisp_isp_other_cfg *new_cfg;
3391 new_cfg = isp_dev->other_cfgs.last_or_new;
3392 new_cfg->s_frame_id = isp_dev->frame_id;
3393 isp_dev->other_cfgs.last_or_new =
3394 isp_dev->other_cfgs.curr;
3395 isp_dev->other_cfgs.curr = new_cfg;
3398 /* Not called when the camera active, thus not isr protection. */
3399 void cifisp_configure_isp(
3400 struct cif_isp10_isp_dev *isp_dev,
3401 enum cif_isp10_pix_fmt in_pix_fmt,
3402 enum cif_isp10_pix_fmt_quantization quantization)
3404 unsigned int *other_ens, *other_updates;
3405 unsigned int *meas_ens, *meas_updates;
3407 CIFISP_DPRINT(CIFISP_DEBUG, "%s\n", __func__);
3409 mutex_lock(&isp_dev->mutex);
3410 spin_lock(&isp_dev->config_lock);
3412 other_ens = &isp_dev->other_cfgs.last_or_new->module_ens;
3413 other_updates = &isp_dev->other_cfgs.module_updates;
3414 meas_ens = &isp_dev->meas_cfgs.last_or_new->module_ens;
3415 meas_updates = &isp_dev->meas_cfgs.module_updates;
3416 isp_dev->quantization = quantization;
3417 if (CIF_ISP10_PIX_FMT_IS_RAW_BAYER(in_pix_fmt)) {
3418 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_DPCC)) {
3419 cifisp_dpcc_config(isp_dev);
3420 cifisp_dpcc_en(isp_dev);
3421 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3422 CIFISP_MODULE_DPCC);
3425 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_LSC)) {
3426 if (cifisp_lsc_config(isp_dev))
3427 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3431 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_BLS)) {
3432 cifisp_bls_config(isp_dev);
3433 cifisp_bls_en(isp_dev);
3434 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3438 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_SDG)) {
3439 cifisp_sdg_config(isp_dev);
3440 cifisp_sdg_en(isp_dev);
3441 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3445 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_GOC)) {
3446 cifisp_goc_config(isp_dev);
3447 cifisp_goc_en(isp_dev);
3448 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3452 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_BDM)) {
3453 cifisp_bdm_config(isp_dev);
3454 cifisp_bdm_en(isp_dev);
3455 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3459 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_FLT)) {
3460 cifisp_flt_config(isp_dev);
3461 cifisp_flt_en(isp_dev);
3462 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3466 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_AWB_GAIN)) {
3467 cifisp_awb_gain_config(isp_dev);
3468 cifisp_awb_gain_en(isp_dev);
3469 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3470 CIFISP_MODULE_AWB_GAIN);
3473 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_CTK)) {
3474 cifisp_ctk_config(isp_dev);
3475 cifisp_ctk_en(isp_dev);
3476 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3480 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_CPROC)) {
3481 cifisp_cproc_config(isp_dev, quantization);
3482 cifisp_cproc_en(isp_dev);
3483 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3484 CIFISP_MODULE_CPROC);
3487 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_IE)) {
3488 cifisp_ie_config(isp_dev);
3489 cifisp_ie_en(isp_dev);
3490 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3494 cifisp_csm_config(isp_dev, quantization);
3496 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_DPF)) {
3497 cifisp_dpf_config(isp_dev);
3498 cifisp_dpf_strength_config(isp_dev);
3499 cifisp_dpf_en(isp_dev);
3500 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3501 CIFISP_MODULE_DPF | CIFISP_MODULE_DPF_STRENGTH);
3504 if (CIFISP_MODULE_IS_EN(*meas_ens, CIFISP_MODULE_AFC)) {
3505 cifisp_afc_config(isp_dev);
3506 cifisp_afc_en(isp_dev);
3507 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3511 if (CIFISP_MODULE_IS_EN(*meas_ens, CIFISP_MODULE_AWB)) {
3512 cifisp_awb_meas_config(isp_dev);
3513 cifisp_awb_meas_en(isp_dev);
3514 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3518 if (CIFISP_MODULE_IS_EN(*meas_ens, CIFISP_MODULE_AEC)) {
3519 cifisp_aec_config(isp_dev);
3520 cifisp_aec_en(isp_dev);
3521 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3525 if (CIFISP_MODULE_IS_EN(*meas_ens, CIFISP_MODULE_HST)) {
3526 cifisp_hst_config(isp_dev);
3527 cifisp_hst_en(isp_dev);
3528 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3532 /* Disable modules for yuv */
3533 cifisp_dpcc_end(isp_dev);
3534 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3535 CIFISP_MODULE_DPCC);
3537 cifisp_lsc_end(isp_dev);
3538 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3541 cifisp_bls_end(isp_dev);
3542 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3545 cifisp_sdg_end(isp_dev);
3546 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3549 cifisp_goc_end(isp_dev);
3550 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3553 cifisp_bdm_end(isp_dev);
3554 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3557 cifisp_flt_end(isp_dev);
3558 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3561 cifisp_awb_meas_end(isp_dev);
3562 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3565 cifisp_awb_gain_end(isp_dev);
3566 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3567 CIFISP_MODULE_AWB_GAIN);
3569 cifisp_aec_end(isp_dev);
3570 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3573 cifisp_ctk_end(isp_dev);
3574 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3577 cifisp_dpf_end(isp_dev);
3578 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3581 /* cproc can be used for yuv in reduced range */
3582 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_CPROC)) {
3583 cifisp_cproc_config(isp_dev, false);
3584 cifisp_cproc_en(isp_dev);
3585 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3586 CIFISP_MODULE_CPROC);
3589 cifisp_hst_end(isp_dev);
3590 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3593 cifisp_afc_end(isp_dev);
3594 CIFISP_MODULE_CLR_UPDATE(*meas_updates,
3596 /* ie can be used for yuv */
3597 if (CIFISP_MODULE_IS_EN(*other_ens, CIFISP_MODULE_IE)) {
3598 cifisp_ie_config(isp_dev);
3599 cifisp_ie_en(isp_dev);
3600 CIFISP_MODULE_CLR_UPDATE(*other_updates,
3603 cifisp_ie_end(isp_dev);
3607 cifisp_dump_reg(isp_dev, CIFISP_DEBUG);
3609 cifisp_meas_config_swap(isp_dev);
3610 cifisp_other_config_swap(isp_dev);
3612 memcpy(isp_dev->other_cfgs.last_or_new,
3613 isp_dev->other_cfgs.curr,
3614 sizeof(struct cifisp_isp_other_cfg));
3615 memcpy(isp_dev->meas_cfgs.last_or_new,
3616 isp_dev->meas_cfgs.curr,
3617 sizeof(struct cifisp_isp_meas_cfg));
3619 spin_unlock(&isp_dev->config_lock);
3620 mutex_unlock(&isp_dev->mutex);
3623 void cifisp_frame_in(
3624 struct cif_isp10_isp_dev *isp_dev,
3625 const struct timeval *fi_t)
3627 /* Called in an interrupt context. */
3628 isp_dev->fi_t = *fi_t;
3631 void cifisp_v_start(
3632 struct cif_isp10_isp_dev *isp_dev,
3633 const struct timeval *vs_t)
3635 /* Called in an interrupt context. */
3636 isp_dev->frame_id += 2;
3637 isp_dev->vs_t = *vs_t;
3640 /* Not called when the camera active, thus not isr protection. */
3641 void cifisp_disable_isp(struct cif_isp10_isp_dev *isp_dev)
3643 CIFISP_DPRINT(CIFISP_DEBUG, "%s\n", __func__);
3645 mutex_lock(&isp_dev->mutex);
3647 cifisp_dpcc_end(isp_dev);
3648 cifisp_lsc_end(isp_dev);
3649 cifisp_bls_end(isp_dev);
3650 cifisp_sdg_end(isp_dev);
3651 cifisp_goc_end(isp_dev);
3652 cifisp_bdm_end(isp_dev);
3653 cifisp_flt_end(isp_dev);
3654 cifisp_awb_meas_end(isp_dev);
3655 cifisp_awb_gain_end(isp_dev);
3656 cifisp_aec_end(isp_dev);
3657 cifisp_ctk_end(isp_dev);
3658 cifisp_cproc_end(isp_dev);
3659 cifisp_hst_end(isp_dev);
3660 cifisp_afc_end(isp_dev);
3661 cifisp_ie_end(isp_dev);
3662 cifisp_dpf_end(isp_dev);
3665 * Isp isn't active, isp interrupt isn't enabled, spin_lock is enough;
3667 spin_lock(&isp_dev->config_lock);
3669 isp_dev->other_cfgs.last_or_new->module_ens = 0;
3670 isp_dev->meas_cfgs.last_or_new->module_ens = 0;
3673 * 1. Swap last_or_new and curr pointer;
3674 * 2. Sync last_or_new and curr configuration;
3676 cifisp_meas_config_swap(isp_dev);
3677 cifisp_other_config_swap(isp_dev);
3679 memcpy(isp_dev->other_cfgs.last_or_new,
3680 isp_dev->other_cfgs.curr,
3681 sizeof(struct cifisp_isp_other_cfg));
3682 memcpy(isp_dev->meas_cfgs.last_or_new,
3683 isp_dev->meas_cfgs.curr,
3684 sizeof(struct cifisp_isp_meas_cfg));
3686 spin_unlock(&isp_dev->config_lock);
3688 mutex_unlock(&isp_dev->mutex);
3691 static void cifisp_send_measurement(
3692 struct cif_isp10_isp_dev *isp_dev,
3693 struct cif_isp10_isp_readout_work *meas_work)
3695 unsigned long lock_flags = 0;
3696 struct videobuf_buffer *vb = NULL;
3697 unsigned int active_meas = isp_dev->active_meas;
3698 struct cifisp_stat_buffer *stat_buf;
3699 struct cif_isp10_device *cif_dev =
3700 container_of(isp_dev, struct cif_isp10_device, isp_dev);
3702 spin_lock_irqsave(&isp_dev->irq_lock, lock_flags);
3703 if (isp_dev->frame_id != meas_work->frame_id) {
3704 spin_unlock_irqrestore(&isp_dev->irq_lock, lock_flags);
3705 CIFISP_DPRINT(CIFISP_ERROR,
3706 "Measurement late(%d, %d)\n",
3708 meas_work->frame_id);
3712 if (!list_empty(&isp_dev->stat)) {
3713 vb = list_first_entry(&isp_dev->stat,
3714 struct videobuf_buffer, queue);
3716 spin_unlock_irqrestore(&isp_dev->irq_lock, lock_flags);
3717 CIFISP_DPRINT(CIFISP_DEBUG,
3718 "Not enought measurement bufs\n");
3722 spin_unlock_irqrestore(&isp_dev->irq_lock, lock_flags);
3723 vb->state = VIDEOBUF_ACTIVE;
3725 stat_buf = (struct cifisp_stat_buffer *)videobuf_to_vmalloc(vb);
3726 memset(stat_buf, 0x00, sizeof(struct cifisp_stat_buffer));
3728 if (active_meas & CIF_ISP_AWB_DONE)
3729 cifisp_get_awb_meas(isp_dev, stat_buf);
3731 if (active_meas & CIF_ISP_AFM_FIN)
3732 cifisp_get_afc_meas(isp_dev, stat_buf);
3734 if (active_meas & CIF_ISP_EXP_END) {
3735 cifisp_get_aec_meas(isp_dev, stat_buf);
3736 cifisp_bls_get_meas(isp_dev, stat_buf);
3739 if (active_meas & CIF_ISP_HIST_MEASURE_RDY)
3740 cifisp_get_hst_meas(isp_dev, stat_buf);
3742 spin_lock_irqsave(&isp_dev->irq_lock, lock_flags);
3744 if (isp_dev->frame_id != meas_work->frame_id) {
3745 spin_unlock_irqrestore(&isp_dev->irq_lock, lock_flags);
3746 CIFISP_DPRINT(CIFISP_ERROR,
3747 "Measurement late(%d, %d)\n",
3749 meas_work->frame_id);
3753 vb->ts = isp_dev->vs_t;
3754 list_del(&vb->queue);
3755 spin_unlock_irqrestore(&isp_dev->irq_lock, lock_flags);
3757 if (active_meas & CIF_ISP_AWB_DONE) {
3758 memcpy(&isp_dev->meas_stats.stat.params.awb,
3759 &stat_buf->params.awb,
3760 sizeof(struct cifisp_awb_stat));
3761 isp_dev->meas_stats.stat.meas_type |= CIFISP_STAT_AWB;
3763 if (active_meas & CIF_ISP_AFM_FIN) {
3764 memcpy(&isp_dev->meas_stats.stat.params.af,
3765 &stat_buf->params.af,
3766 sizeof(struct cifisp_af_stat));
3767 isp_dev->meas_stats.stat.meas_type |= CIFISP_STAT_AFM_FIN;
3769 if (active_meas & CIF_ISP_EXP_END) {
3770 cif_isp10_sensor_mode_data_sync(cif_dev,
3771 meas_work->frame_id,
3772 &stat_buf->sensor_mode);
3773 memcpy(&isp_dev->meas_stats.stat.params.ae,
3774 &stat_buf->params.ae,
3775 sizeof(struct cifisp_ae_stat));
3776 memcpy(&isp_dev->meas_stats.stat.sensor_mode,
3777 &stat_buf->sensor_mode,
3778 sizeof(struct isp_supplemental_sensor_mode_data));
3780 isp_dev->meas_stats.stat.meas_type |= CIFISP_STAT_AUTOEXP;
3782 if (active_meas & CIF_ISP_HIST_MEASURE_RDY) {
3783 memcpy(&isp_dev->meas_stats.stat.params.hist,
3784 &stat_buf->params.hist,
3785 sizeof(struct cifisp_hist_stat));
3786 isp_dev->meas_stats.stat.meas_type |= CIFISP_STAT_HIST;
3788 isp_dev->meas_stats.g_frame_id = meas_work->frame_id;
3790 vb->field_count = meas_work->frame_id;
3791 vb->state = VIDEOBUF_DONE;
3794 CIFISP_DPRINT(CIFISP_DEBUG,
3795 "Measurement done(%d, %d)\n",
3801 if (vb && (vb->state == VIDEOBUF_ACTIVE))
3802 vb->state = VIDEOBUF_QUEUED;
3805 void cifisp_isp_readout_work(struct work_struct *work)
3807 struct cif_isp10_isp_readout_work *readout_work =
3808 (struct cif_isp10_isp_readout_work *)work;
3809 struct cif_isp10_isp_dev *isp_dev =
3810 readout_work->isp_dev;
3811 struct cif_isp10_device *cif_dev =
3812 container_of(isp_dev, struct cif_isp10_device, isp_dev);
3813 unsigned long int lock_flags;
3815 if (!isp_dev->streamon)
3818 switch (readout_work->readout) {
3819 case CIF_ISP10_ISP_READOUT_MEAS:
3820 cifisp_send_measurement(isp_dev, readout_work);
3823 case CIF_ISP10_ISP_READOUT_META: {
3824 struct cifisp_isp_other_cfg *other_new = NULL;
3825 struct cifisp_isp_meas_cfg *meas_new = NULL;
3826 struct cifisp_stat_buffer *stat_new = NULL;
3828 spin_lock_irqsave(&isp_dev->config_lock, lock_flags);
3830 if (isp_dev->other_cfgs.module_updates == 0) {
3831 if (readout_work->frame_id ==
3832 isp_dev->other_cfgs.curr->s_frame_id)
3833 other_new = isp_dev->other_cfgs.last_or_new;
3834 else if (readout_work->frame_id >
3835 isp_dev->other_cfgs.curr->s_frame_id)
3836 other_new = isp_dev->other_cfgs.curr;
3841 if (isp_dev->meas_cfgs.module_updates == 0) {
3842 if (readout_work->frame_id ==
3843 isp_dev->meas_cfgs.curr->s_frame_id)
3844 meas_new = isp_dev->meas_cfgs.last_or_new;
3845 else if (readout_work->frame_id >
3846 isp_dev->meas_cfgs.curr->s_frame_id)
3847 meas_new = isp_dev->meas_cfgs.curr;
3852 if ((isp_dev->meas_stats.g_frame_id ==
3853 readout_work->frame_id) &&
3854 isp_dev->meas_stats.stat.meas_type)
3855 stat_new = &isp_dev->meas_stats.stat;
3859 cif_isp10_s_isp_metadata(
3865 spin_unlock_irqrestore(&isp_dev->config_lock, lock_flags);
3873 kfree((void *)work);
3876 static inline bool cifisp_isp_isr_other_config(
3877 struct cif_isp10_isp_dev *isp_dev,
3878 unsigned int *time_left)
3880 unsigned int time_in = *time_left;
3884 ens = &isp_dev->other_cfgs.last_or_new->module_ens;
3886 if (CIFISP_MODULE_IS_UPDATE(
3887 isp_dev->other_cfgs.module_updates,
3888 CIFISP_MODULE_DPCC)) {
3889 /*update dpc config */
3890 cifisp_dpcc_config(isp_dev);
3892 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_DPCC))
3893 cifisp_dpcc_en(isp_dev);
3895 cifisp_dpcc_end(isp_dev);
3897 CIFISP_MODULE_CLR_UPDATE(
3898 isp_dev->other_cfgs.module_updates,
3899 CIFISP_MODULE_DPCC);
3901 *time_left -= CIFISP_MODULE_DPCC_PROC_TIME;
3903 CIFISP_DPRINT(CIFISP_DEBUG,
3904 "dpcc time-left :%d\n",
3908 if (CIFISP_MODULE_IS_UPDATE(
3909 isp_dev->other_cfgs.module_updates,
3910 CIFISP_MODULE_BLS) &&
3911 *time_left >= CIFISP_MODULE_BLS_PROC_TIME) {
3912 /* update bls config */
3913 cifisp_bls_config(isp_dev);
3915 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_BLS))
3916 cifisp_bls_en(isp_dev);
3918 cifisp_bls_end(isp_dev);
3920 CIFISP_MODULE_CLR_UPDATE(
3921 isp_dev->other_cfgs.module_updates,
3924 *time_left -= CIFISP_MODULE_BLS_PROC_TIME;
3925 CIFISP_DPRINT(CIFISP_DEBUG,
3926 "bls time-left :%d\n",
3930 if (CIFISP_MODULE_IS_UPDATE(
3931 isp_dev->other_cfgs.module_updates,
3932 CIFISP_MODULE_SDG) &&
3933 *time_left >= CIFISP_MODULE_SDG_PROC_TIME) {
3934 /* update sdg config */
3935 cifisp_sdg_config(isp_dev);
3937 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_SDG))
3938 cifisp_sdg_en(isp_dev);
3940 cifisp_sdg_end(isp_dev);
3942 CIFISP_MODULE_CLR_UPDATE(
3943 isp_dev->other_cfgs.module_updates,
3946 *time_left -= CIFISP_MODULE_SDG_PROC_TIME;
3947 CIFISP_DPRINT(CIFISP_DEBUG,
3948 "sdg time-left :%d\n",
3952 if (CIFISP_MODULE_IS_UPDATE(
3953 isp_dev->other_cfgs.module_updates,
3954 CIFISP_MODULE_LSC) &&
3955 *time_left >= CIFISP_MODULE_LSC_PROC_TIME) {
3956 /* update lsc config */
3959 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_LSC)) {
3960 if (!cifisp_lsc_config(isp_dev))
3963 cifisp_lsc_end(isp_dev);
3967 CIFISP_MODULE_CLR_UPDATE(
3968 isp_dev->other_cfgs.module_updates,
3971 *time_left -= CIFISP_MODULE_LSC_PROC_TIME;
3972 CIFISP_DPRINT(CIFISP_DEBUG,
3973 "lsc time-left :%d\n",
3977 if (CIFISP_MODULE_IS_UPDATE(
3978 isp_dev->other_cfgs.module_updates,
3979 CIFISP_MODULE_AWB_GAIN) &&
3980 *time_left >= CIFISP_MODULE_AWB_GAIN_PROC_TIME) {
3981 /* update awb gains */
3982 cifisp_awb_gain_config(isp_dev);
3984 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_AWB_GAIN))
3985 cifisp_awb_gain_en(isp_dev);
3987 cifisp_awb_gain_end(isp_dev);
3989 CIFISP_MODULE_CLR_UPDATE(
3990 isp_dev->other_cfgs.module_updates,
3991 CIFISP_MODULE_AWB_GAIN);
3993 *time_left -= CIFISP_MODULE_AWB_GAIN_PROC_TIME;
3994 CIFISP_DPRINT(CIFISP_DEBUG,
3995 "awb-g time-left :%d\n",
3999 if (CIFISP_MODULE_IS_UPDATE(
4000 isp_dev->other_cfgs.module_updates,
4001 CIFISP_MODULE_BDM) &&
4002 *time_left >= CIFISP_MODULE_BDM_PROC_TIME) {
4003 /* update bdm config */
4004 cifisp_bdm_config(isp_dev);
4006 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_BDM))
4007 cifisp_bdm_en(isp_dev);
4009 cifisp_bdm_end(isp_dev);
4011 CIFISP_MODULE_CLR_UPDATE(
4012 isp_dev->other_cfgs.module_updates,
4015 *time_left -= CIFISP_MODULE_BDM_PROC_TIME;
4016 CIFISP_DPRINT(CIFISP_DEBUG,
4017 "bdm time-left :%d\n",
4021 if (CIFISP_MODULE_IS_UPDATE(
4022 isp_dev->other_cfgs.module_updates,
4023 CIFISP_MODULE_FLT) &&
4024 *time_left >= CIFISP_MODULE_FLT_PROC_TIME) {
4025 /* update filter config */
4026 cifisp_flt_config(isp_dev);
4028 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_FLT))
4029 cifisp_flt_en(isp_dev);
4031 cifisp_flt_end(isp_dev);
4033 CIFISP_MODULE_CLR_UPDATE(
4034 isp_dev->other_cfgs.module_updates,
4037 *time_left -= CIFISP_MODULE_FLT_PROC_TIME;
4038 CIFISP_DPRINT(CIFISP_DEBUG,
4039 "flt time-left :%d\n",
4043 if (CIFISP_MODULE_IS_UPDATE(
4044 isp_dev->other_cfgs.module_updates,
4045 CIFISP_MODULE_CTK) &&
4046 *time_left >= CIFISP_MODULE_CTK_PROC_TIME) {
4047 /* update ctk config */
4048 cifisp_ctk_config(isp_dev);
4050 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_CTK))
4051 cifisp_ctk_en(isp_dev);
4053 cifisp_ctk_end(isp_dev);
4055 CIFISP_MODULE_CLR_UPDATE(
4056 isp_dev->other_cfgs.module_updates,
4059 *time_left -= CIFISP_MODULE_CTK_PROC_TIME;
4060 CIFISP_DPRINT(CIFISP_DEBUG,
4061 "ctk time-left :%d\n",
4065 if (CIFISP_MODULE_IS_UPDATE(
4066 isp_dev->other_cfgs.module_updates,
4067 CIFISP_MODULE_GOC) &&
4068 *time_left >= CIFISP_MODULE_GOC_PROC_TIME) {
4069 /* update goc config */
4070 cifisp_goc_config(isp_dev);
4072 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_GOC))
4073 cifisp_goc_en(isp_dev);
4075 cifisp_goc_end(isp_dev);
4077 CIFISP_MODULE_CLR_UPDATE(
4078 isp_dev->other_cfgs.module_updates,
4081 *time_left -= CIFISP_MODULE_GOC_PROC_TIME;
4082 CIFISP_DPRINT(CIFISP_DEBUG,
4083 "goc time-left :%d\n",
4087 if (CIFISP_MODULE_IS_UPDATE(
4088 isp_dev->other_cfgs.module_updates,
4089 CIFISP_MODULE_CPROC) &&
4090 *time_left >= CIFISP_MODULE_CPROC_PROC_TIME) {
4091 /* update cprc config */
4092 cifisp_cproc_config(
4094 isp_dev->quantization);
4096 cifisp_csm_config(isp_dev,
4097 isp_dev->quantization);
4099 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_CPROC))
4100 cifisp_cproc_en(isp_dev);
4102 cifisp_cproc_end(isp_dev);
4104 CIFISP_MODULE_CLR_UPDATE(
4105 isp_dev->other_cfgs.module_updates,
4106 CIFISP_MODULE_CPROC);
4108 *time_left -= CIFISP_MODULE_CPROC_PROC_TIME;
4109 CIFISP_DPRINT(CIFISP_DEBUG,
4110 "cproc time-left :%d\n",
4114 if (CIFISP_MODULE_IS_UPDATE(
4115 isp_dev->other_cfgs.module_updates,
4116 CIFISP_MODULE_IE) &&
4117 *time_left >= CIFISP_MODULE_IE_PROC_TIME) {
4118 /* update ie config */
4119 cifisp_ie_config(isp_dev);
4121 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_IE))
4122 cifisp_ie_en(isp_dev);
4124 cifisp_ie_end(isp_dev);
4126 CIFISP_MODULE_CLR_UPDATE(
4127 isp_dev->other_cfgs.module_updates,
4130 *time_left -= CIFISP_MODULE_IE_PROC_TIME;
4131 CIFISP_DPRINT(CIFISP_DEBUG,
4132 "ie time-left :%d\n",
4136 if (CIFISP_MODULE_IS_UPDATE(
4137 isp_dev->other_cfgs.module_updates,
4138 CIFISP_MODULE_DPF) &&
4139 *time_left >= CIFISP_MODULE_DPF_TIME) {
4140 /* update dpf config */
4141 cifisp_dpf_config(isp_dev);
4143 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_DPF))
4144 cifisp_dpf_en(isp_dev);
4146 cifisp_dpf_end(isp_dev);
4148 CIFISP_MODULE_CLR_UPDATE(
4149 isp_dev->other_cfgs.module_updates,
4152 *time_left -= CIFISP_MODULE_DPF_TIME;
4153 CIFISP_DPRINT(CIFISP_DEBUG,
4154 "dpf time-left :%d\n",
4158 if (CIFISP_MODULE_IS_UPDATE(
4159 isp_dev->other_cfgs.module_updates,
4160 CIFISP_MODULE_DPF_STRENGTH) &&
4161 *time_left >= CIFISP_MODULE_DPF_STRENGTH_TIME) {
4162 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_DPF)) {
4163 /* update dpf strength config */
4164 cifisp_dpf_strength_config(isp_dev);
4165 cifisp_dpf_en(isp_dev);
4167 cifisp_dpf_end(isp_dev);
4170 CIFISP_MODULE_CLR_UPDATE(
4171 isp_dev->other_cfgs.module_updates,
4172 CIFISP_MODULE_DPF_STRENGTH);
4174 *time_left -= CIFISP_MODULE_DPF_STRENGTH_TIME;
4175 CIFISP_DPRINT(CIFISP_DEBUG,
4176 "dpf strength time-left :%d\n",
4180 config_chk = time_in > *time_left;
4182 cifisp_other_config_swap(isp_dev);
4187 static inline bool cifisp_isp_isr_meas_config(
4188 struct cif_isp10_isp_dev *isp_dev,
4189 unsigned int *time_left)
4191 unsigned int time_in = *time_left;
4195 ens = &isp_dev->meas_cfgs.last_or_new->module_ens;
4197 if (CIFISP_MODULE_IS_UPDATE(
4198 isp_dev->meas_cfgs.module_updates,
4199 CIFISP_MODULE_AWB)) {
4200 /* update awb config */
4201 cifisp_awb_meas_config(isp_dev);
4203 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_AWB))
4204 cifisp_awb_meas_en(isp_dev);
4206 cifisp_awb_meas_end(isp_dev);
4208 CIFISP_MODULE_CLR_UPDATE(
4209 isp_dev->meas_cfgs.module_updates,
4211 *time_left -= CIFISP_MODULE_AWB_PROC_TIME;
4214 if (CIFISP_MODULE_IS_UPDATE(
4215 isp_dev->meas_cfgs.module_updates,
4216 CIFISP_MODULE_AFC)) {
4217 /* update afc config */
4218 cifisp_afc_config(isp_dev);
4220 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_AFC))
4221 cifisp_afc_en(isp_dev);
4223 cifisp_afc_end(isp_dev);
4225 CIFISP_MODULE_CLR_UPDATE(
4226 isp_dev->meas_cfgs.module_updates,
4228 *time_left -= CIFISP_MODULE_AFC_PROC_TIME;
4231 if (CIFISP_MODULE_IS_UPDATE(
4232 isp_dev->meas_cfgs.module_updates,
4233 CIFISP_MODULE_HST)) {
4234 /* update hst config */
4235 cifisp_hst_config(isp_dev);
4237 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_HST))
4238 cifisp_hst_en(isp_dev);
4240 cifisp_hst_end(isp_dev);
4242 CIFISP_MODULE_CLR_UPDATE(
4243 isp_dev->meas_cfgs.module_updates,
4245 *time_left -= CIFISP_MODULE_HST_PROC_TIME;
4248 if (CIFISP_MODULE_IS_UPDATE(
4249 isp_dev->meas_cfgs.module_updates,
4250 CIFISP_MODULE_AEC)) {
4251 /* update aec config */
4252 cifisp_aec_config(isp_dev);
4254 if (CIFISP_MODULE_IS_EN(*ens, CIFISP_MODULE_AEC))
4255 cifisp_aec_en(isp_dev);
4257 cifisp_aec_end(isp_dev);
4259 CIFISP_MODULE_CLR_UPDATE(
4260 isp_dev->meas_cfgs.module_updates,
4262 *time_left -= CIFISP_MODULE_AEC_PROC_TIME;
4265 config_chk = time_in > *time_left;
4267 cifisp_meas_config_swap(isp_dev);
4272 int cifisp_isp_isr(struct cif_isp10_isp_dev *isp_dev, u32 isp_mis)
4274 unsigned int isp_mis_tmp = 0;
4275 struct cif_isp10_isp_readout_work *work;
4276 unsigned int time_left = isp_dev->v_blanking_us;
4277 #ifdef LOG_ISR_EXE_TIME
4278 ktime_t in_t = ktime_get();
4280 if (isp_mis & (CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR))
4283 if (isp_mis & CIF_ISP_FRAME) {
4284 u32 isp_ris = cifisp_ioread32(CIF_ISP_RIS);
4287 (CIF_ISP_AWB_DONE | CIF_ISP_AFM_FIN |
4288 CIF_ISP_EXP_END | CIF_ISP_HIST_MEASURE_RDY),
4290 isp_mis_tmp = cifisp_ioread32(CIF_ISP_MIS);
4292 (CIF_ISP_AWB_DONE | CIF_ISP_AFM_FIN |
4293 CIF_ISP_EXP_END | CIF_ISP_HIST_MEASURE_RDY))
4294 CIFISP_DPRINT(CIFISP_ERROR,
4295 "isp icr 3A info err: 0x%x\n",
4298 CIFISP_DPRINT(CIFISP_DEBUG, "isp_ris 0x%x\n", isp_ris);
4300 if (((isp_dev->meas_cfgs.module_updates &
4301 (CIFISP_MODULE_AWB |
4303 CIFISP_MODULE_AFC)) == 0) &&
4304 isp_dev->active_meas &&
4305 ((isp_dev->active_meas & isp_ris) ==
4306 isp_dev->active_meas)) {
4307 work = (struct cif_isp10_isp_readout_work *)
4309 struct cif_isp10_isp_readout_work),
4312 INIT_WORK((struct work_struct *)work,
4313 cifisp_isp_readout_work);
4314 work->readout = CIF_ISP10_ISP_READOUT_MEAS;
4315 work->isp_dev = isp_dev;
4316 work->frame_id = isp_dev->frame_id;
4317 if (!queue_work(isp_dev->readout_wq,
4318 (struct work_struct *)work)) {
4319 CIFISP_DPRINT(CIFISP_ERROR,
4320 "Could not schedule work\n");
4321 kfree((void *)work);
4324 CIFISP_DPRINT(CIFISP_ERROR,
4325 "Could not allocate work\n");
4330 * Then update changed configs. Some of them involve
4331 * lot of register writes. Do those only one per frame.
4332 * Do the updates in the order of the processing flow.
4334 spin_lock(&isp_dev->config_lock);
4335 if (cifisp_isp_isr_other_config(isp_dev, &time_left) == false)
4336 cifisp_isp_isr_meas_config(isp_dev, &time_left);
4337 spin_unlock(&isp_dev->config_lock);
4339 cifisp_dump_reg(isp_dev, CIFISP_DEBUG);
4341 #ifdef LOG_ISR_EXE_TIME
4342 if (isp_mis & (CIF_ISP_EXP_END | CIF_ISP_AWB_DONE |
4343 CIF_ISP_FRAME | CIF_ISP_HIST_MEASURE_RDY)) {
4344 unsigned int diff_us =
4345 ktime_to_us(ktime_sub(ktime_get(), in_t));
4347 if (diff_us > g_longest_isr_time)
4348 g_longest_isr_time = diff_us;
4350 pr_info("isp_isr time %d %d\n", diff_us, g_longest_isr_time);
4357 static void cifisp_param_dump(const void *config, unsigned int module)
4359 #ifdef CIFISP_DEBUG_PARAM
4361 case CIFISP_MODULE_AWB_GAIN:{
4362 struct cifisp_awb_gain_config *pconfig =
4363 (struct cifisp_awb_gain_config *)config;
4364 CIFISP_DPRINT(CIFISP_DEBUG,
4365 "#### %s: AWB Gain Parameters - BEGIN ####\n",
4367 CIFISP_DPRINT(CIFISP_DEBUG, "g_g: %d\n",
4368 pconfig->gain_green_r);
4369 CIFISP_DPRINT(CIFISP_DEBUG, "g_b: %d\n",
4370 pconfig->gain_green_b);
4371 CIFISP_DPRINT(CIFISP_DEBUG, "r: %d\n",
4373 CIFISP_DPRINT(CIFISP_DEBUG, "b: %d\n",
4374 pconfig->gain_blue);
4375 CIFISP_DPRINT(CIFISP_DEBUG,
4376 "#### %s: AWB Gain Parameters - END ####\n",
4380 case CIFISP_MODULE_DPCC:{
4384 case CIFISP_MODULE_BLS:{
4385 struct cifisp_bls_config *pconfig =
4386 (struct cifisp_bls_config *)config;
4387 struct cifisp_bls_fixed_val *pval = &pconfig->fixed_val;
4389 CIFISP_DPRINT(CIFISP_DEBUG,
4390 "#### %s: BLS Parameters - BEGIN ####\n",
4392 CIFISP_DPRINT(CIFISP_DEBUG, " enable_auto: %d\n",
4393 pconfig->enable_auto);
4394 CIFISP_DPRINT(CIFISP_DEBUG, " en_windows: %d\n",
4395 pconfig->en_windows);
4396 CIFISP_DPRINT(CIFISP_DEBUG,
4397 " bls_window1.h_offs: %d\n",
4398 pconfig->bls_window1.h_offs);
4399 CIFISP_DPRINT(CIFISP_DEBUG,
4400 " bls_window1.v_offs: %d\n",
4401 pconfig->bls_window1.v_offs);
4402 CIFISP_DPRINT(CIFISP_DEBUG,
4403 " bls_window1.h_size: %d\n",
4404 pconfig->bls_window1.h_size);
4405 CIFISP_DPRINT(CIFISP_DEBUG,
4406 " bls_window1.v_size: %d\n",
4407 pconfig->bls_window1.v_size);
4408 CIFISP_DPRINT(CIFISP_DEBUG,
4409 " bls_window2.h_offs: %d\n",
4410 pconfig->bls_window2.h_offs);
4411 CIFISP_DPRINT(CIFISP_DEBUG,
4412 " bls_window2.v_offs: %d\n",
4413 pconfig->bls_window2.v_offs);
4414 CIFISP_DPRINT(CIFISP_DEBUG,
4415 " bls_window2.h_size: %d\n",
4416 pconfig->bls_window2.h_size);
4417 CIFISP_DPRINT(CIFISP_DEBUG,
4418 " bls_window2.v_size: %d\n",
4419 pconfig->bls_window2.v_size);
4420 CIFISP_DPRINT(CIFISP_DEBUG, " bls_samples: %d\n",
4421 pconfig->bls_samples);
4422 CIFISP_DPRINT(CIFISP_DEBUG, " fixed_A: %d\n",
4424 CIFISP_DPRINT(CIFISP_DEBUG, " fixed_B: %d\n",
4426 CIFISP_DPRINT(CIFISP_DEBUG, " fixed_C: %d\n",
4428 CIFISP_DPRINT(CIFISP_DEBUG, " fixed_D: %d\n",
4430 CIFISP_DPRINT(CIFISP_DEBUG,
4431 "#### %s: BLS Parameters - END ####\n",
4434 case CIFISP_MODULE_LSC:{
4435 CIFISP_DPRINT(CIFISP_DEBUG,
4436 "#### LSC Parameters - BEGIN ####\n");
4437 CIFISP_DPRINT(CIFISP_DEBUG,
4438 "#### LSC Parameters - END ####\n");
4441 case CIFISP_MODULE_FLT:{
4442 struct cifisp_flt_config *pconfig =
4443 (struct cifisp_flt_config *)config;
4444 CIFISP_DPRINT(CIFISP_DEBUG,
4445 "#### %s: FLT Parameters - BEGIN ####\n",
4447 CIFISP_DPRINT(CIFISP_DEBUG,
4448 " flt_mask_sharp0: %d\n",
4449 pconfig->flt_mask_sharp0);
4450 CIFISP_DPRINT(CIFISP_DEBUG,
4451 " flt_mask_sharp1: %d\n",
4452 pconfig->flt_mask_sharp1);
4453 CIFISP_DPRINT(CIFISP_DEBUG, " flt_mask_diag: %d\n",
4454 pconfig->flt_mask_diag);
4455 CIFISP_DPRINT(CIFISP_DEBUG,
4456 " flt_mask_blur_max: %d\n",
4457 pconfig->flt_mask_blur_max);
4458 CIFISP_DPRINT(CIFISP_DEBUG, " flt_mask_blur: %d\n",
4459 pconfig->flt_mask_blur);
4460 CIFISP_DPRINT(CIFISP_DEBUG, " flt_mask_lin: %d\n",
4461 pconfig->flt_mask_lin);
4462 CIFISP_DPRINT(CIFISP_DEBUG, " flt_mask_orth: %d\n",
4463 pconfig->flt_mask_orth);
4464 CIFISP_DPRINT(CIFISP_DEBUG,
4465 " flt_mask_v_diag: %d\n",
4466 pconfig->flt_mask_v_diag);
4467 CIFISP_DPRINT(CIFISP_DEBUG,
4468 " flt_mask_h_diag: %d\n",
4469 pconfig->flt_mask_h_diag);
4470 CIFISP_DPRINT(CIFISP_DEBUG,
4471 " flt_lum_weight: %d\n",
4472 pconfig->flt_lum_weight);
4473 CIFISP_DPRINT(CIFISP_DEBUG, " flt_blur_th0: %d\n",
4474 pconfig->flt_blur_th0);
4475 CIFISP_DPRINT(CIFISP_DEBUG, " flt_blur_th1: %d\n",
4476 pconfig->flt_blur_th1);
4477 CIFISP_DPRINT(CIFISP_DEBUG, " flt_sharp0_th: %d\n",
4478 pconfig->flt_sharp0_th);
4479 CIFISP_DPRINT(CIFISP_DEBUG, " flt_sharp1_th: %d\n",
4480 pconfig->flt_sharp1_th);
4481 CIFISP_DPRINT(CIFISP_DEBUG,
4482 " flt_chrom_h_mode: %d\n",
4483 pconfig->flt_chrom_h_mode);
4484 CIFISP_DPRINT(CIFISP_DEBUG,
4485 " flt_chrom_v_mode: %d\n",
4486 pconfig->flt_chrom_v_mode);
4487 CIFISP_DPRINT(CIFISP_DEBUG,
4488 " flt_diag_sharp_mode: %d\n",
4489 pconfig->flt_diag_sharp_mode);
4490 CIFISP_DPRINT(CIFISP_DEBUG, " flt_mode: %d\n",
4492 CIFISP_DPRINT(CIFISP_DEBUG,
4493 "#### %s: FLT Parameters - END ####\n",
4497 case CIFISP_MODULE_BDM:{
4498 struct cifisp_bdm_config *pconfig =
4499 (struct cifisp_bdm_config *)config;
4500 CIFISP_DPRINT(CIFISP_DEBUG,
4501 "#### %s: BDM Parameters - BEGIN ####\n",
4503 CIFISP_DPRINT(CIFISP_DEBUG, " demosaic_th: %d\n",
4504 pconfig->demosaic_th);
4505 CIFISP_DPRINT(CIFISP_DEBUG,
4506 "#### %s: BDM Parameters - END ####\n",
4510 case CIFISP_MODULE_SDG:{
4511 struct cifisp_sdg_config *pconfig =
4512 (struct cifisp_sdg_config *)config;
4515 CIFISP_DPRINT(CIFISP_DEBUG,
4516 "#### %s: SDG Parameters - BEGIN ####\n",
4518 CIFISP_DPRINT(CIFISP_DEBUG,
4519 " RED -Curve parameters\n");
4520 for (i = 0; i < CIFISP_DEGAMMA_CURVE_SIZE; i++) {
4521 CIFISP_DPRINT(CIFISP_DEBUG,
4522 " gamma_y[%d]: %d\n",
4523 pconfig->curve_r.gamma_y[i]);
4525 CIFISP_DPRINT(CIFISP_DEBUG,
4526 " GREEN -Curve parameters\n");
4527 for (i = 0; i < CIFISP_DEGAMMA_CURVE_SIZE; i++) {
4528 CIFISP_DPRINT(CIFISP_DEBUG,
4529 " gamma_y[%d]: %d\n",
4530 pconfig->curve_g.gamma_y[i]);
4532 CIFISP_DPRINT(CIFISP_DEBUG,
4533 " BLUE -Curve parameters\n");
4534 for (i = 0; i < CIFISP_DEGAMMA_CURVE_SIZE; i++) {
4535 CIFISP_DPRINT(CIFISP_DEBUG,
4536 " gamma_y[%d]: %d\n",
4537 pconfig->curve_b.gamma_y[i]);
4539 CIFISP_DPRINT(CIFISP_DEBUG,
4540 "#### %s: SDG Parameters - END ####\n",
4544 case CIFISP_MODULE_GOC:{
4545 CIFISP_DPRINT(CIFISP_DEBUG,
4546 "#### %s: GOC Parameters - BEGIN ####\n",
4548 CIFISP_DPRINT(CIFISP_DEBUG,
4549 "#### %s: GOC Parameters - END ####\n",
4553 case CIFISP_MODULE_CTK:{
4554 struct cifisp_ctk_config *pconfig =
4555 (struct cifisp_ctk_config *)config;
4556 CIFISP_DPRINT(CIFISP_DEBUG,
4557 "#### %s: CTK Parameters - BEGIN ####\n",
4559 CIFISP_DPRINT(CIFISP_DEBUG, " coeff0: %d\n",
4561 CIFISP_DPRINT(CIFISP_DEBUG, " coeff1: %d\n",
4563 CIFISP_DPRINT(CIFISP_DEBUG, " coeff2: %d\n",
4565 CIFISP_DPRINT(CIFISP_DEBUG, " coeff3: %d\n",
4567 CIFISP_DPRINT(CIFISP_DEBUG, " coeff4: %d\n",
4569 CIFISP_DPRINT(CIFISP_DEBUG, " coeff5: %d\n",
4571 CIFISP_DPRINT(CIFISP_DEBUG, " coeff6: %d\n",
4573 CIFISP_DPRINT(CIFISP_DEBUG, " coeff7: %d\n",
4575 CIFISP_DPRINT(CIFISP_DEBUG, " coeff8: %d\n",
4577 CIFISP_DPRINT(CIFISP_DEBUG, " ct_offset_r: %d\n",
4578 pconfig->ct_offset_r);
4579 CIFISP_DPRINT(CIFISP_DEBUG, " ct_offset_g: %d\n",
4580 pconfig->ct_offset_g);
4581 CIFISP_DPRINT(CIFISP_DEBUG, " ct_offset_b: %d\n",
4582 pconfig->ct_offset_b);
4583 CIFISP_DPRINT(CIFISP_DEBUG,
4584 "#### %s: CTK Parameters - END ####\n",
4588 case CIFISP_MODULE_AWB:{
4589 struct cifisp_awb_meas_config *pconfig =
4590 (struct cifisp_awb_meas_config *)config;
4591 CIFISP_DPRINT(CIFISP_DEBUG,
4592 "#### %s: AWB Parameters - BEGIN ####\n",
4594 CIFISP_DPRINT(CIFISP_DEBUG, " awb_mode: %d\n",
4596 CIFISP_DPRINT(CIFISP_DEBUG, " max_y: %d\n",
4598 CIFISP_DPRINT(CIFISP_DEBUG, " min_y: %d\n",
4600 CIFISP_DPRINT(CIFISP_DEBUG, " max_csum: %d\n",
4602 CIFISP_DPRINT(CIFISP_DEBUG, " min_c: %d\n",
4604 CIFISP_DPRINT(CIFISP_DEBUG, " frames: %d\n",
4606 CIFISP_DPRINT(CIFISP_DEBUG, " awb_ref_cr: %d\n",
4607 pconfig->awb_ref_cr);
4608 CIFISP_DPRINT(CIFISP_DEBUG, " awb_ref_cb: %d\n",
4609 pconfig->awb_ref_cb);
4610 CIFISP_DPRINT(CIFISP_DEBUG, " gb_sat: %d\n",
4612 CIFISP_DPRINT(CIFISP_DEBUG, " gr_sat: %d\n",
4614 CIFISP_DPRINT(CIFISP_DEBUG, " r_sat: %d\n",
4616 CIFISP_DPRINT(CIFISP_DEBUG, " grid_h_dim: %d\n",
4617 pconfig->grid_h_dim);
4618 CIFISP_DPRINT(CIFISP_DEBUG, " grid_v_dim: %d\n",
4619 pconfig->grid_v_dim);
4620 CIFISP_DPRINT(CIFISP_DEBUG, " grid_h_dist: %d\n",
4621 pconfig->grid_h_dist);
4622 CIFISP_DPRINT(CIFISP_DEBUG, " grid_v_dist: %d\n",
4623 pconfig->grid_v_dist);
4624 CIFISP_DPRINT(CIFISP_DEBUG,
4625 " enable_ymax_cmp: %d\n",
4626 pconfig->enable_ymax_cmp);
4627 CIFISP_DPRINT(CIFISP_DEBUG, " rgb_meas_pnt: %d\n",
4628 pconfig->rgb_meas_pnt);
4629 CIFISP_DPRINT(CIFISP_DEBUG, " AWB Window size\n");
4630 CIFISP_DPRINT(CIFISP_DEBUG, " h_offs: %d\n",
4631 pconfig->awb_wnd.h_offs);
4632 CIFISP_DPRINT(CIFISP_DEBUG, " v_offs: %d\n",
4633 pconfig->awb_wnd.v_offs);
4634 CIFISP_DPRINT(CIFISP_DEBUG, " h_size: %d\n",
4635 pconfig->awb_wnd.h_size);
4636 CIFISP_DPRINT(CIFISP_DEBUG, " v_size: %d\n",
4637 pconfig->awb_wnd.v_size);
4638 CIFISP_DPRINT(CIFISP_DEBUG,
4639 "#### %s: AWB Parameters - END ####\n",
4643 case CIFISP_MODULE_HST:{
4644 struct cifisp_hst_config *pconfig =
4645 (struct cifisp_hst_config *)config;
4646 CIFISP_DPRINT(CIFISP_DEBUG,
4647 "#### %s: HST Parameters - BEGIN ####\n",
4649 CIFISP_DPRINT(CIFISP_DEBUG, " mode: %d\n",
4651 CIFISP_DPRINT(CIFISP_DEBUG,
4652 " histogram_predivider: %d\n",
4653 pconfig->histogram_predivider);
4654 CIFISP_DPRINT(CIFISP_DEBUG, " HST Window size\n");
4655 CIFISP_DPRINT(CIFISP_DEBUG, " h_offs: %d\n",
4656 pconfig->meas_window.h_offs);
4657 CIFISP_DPRINT(CIFISP_DEBUG, " v_offs: %d\n",
4658 pconfig->meas_window.v_offs);
4659 CIFISP_DPRINT(CIFISP_DEBUG, " h_size: %d\n",
4660 pconfig->meas_window.h_size);
4661 CIFISP_DPRINT(CIFISP_DEBUG, " v_size: %d\n",
4662 pconfig->meas_window.v_size);
4663 CIFISP_DPRINT(CIFISP_DEBUG,
4664 "#### %s: HST Parameters - END ####\n",
4669 case CIFISP_MODULE_AEC:{
4670 struct cifisp_aec_config *pconfig =
4671 (struct cifisp_aec_config *)config;
4672 CIFISP_DPRINT(CIFISP_DEBUG,
4673 "#### %s: AEC Parameters - BEGIN ####\n",
4675 CIFISP_DPRINT(CIFISP_DEBUG, " autostop: %d\n",
4677 CIFISP_DPRINT(CIFISP_DEBUG, " AEC Window size\n");
4678 CIFISP_DPRINT(CIFISP_DEBUG, " h_offs: %d\n",
4679 pconfig->meas_window.h_offs);
4680 CIFISP_DPRINT(CIFISP_DEBUG, " v_offs: %d\n",
4681 pconfig->meas_window.v_offs);
4682 CIFISP_DPRINT(CIFISP_DEBUG, " h_size: %d\n",
4683 pconfig->meas_window.h_size);
4684 CIFISP_DPRINT(CIFISP_DEBUG, " v_size: %d\n",
4685 pconfig->meas_window.v_size);
4686 CIFISP_DPRINT(CIFISP_DEBUG,
4687 "#### %s: AEC Parameters - END ####\n",
4691 case CIFISP_MODULE_CPROC:{
4692 struct cifisp_cproc_config *pconfig =
4693 (struct cifisp_cproc_config *)config;
4694 CIFISP_DPRINT(CIFISP_DEBUG,
4695 "#### %s: CPROC Parameters - BEGIN ####\n",
4697 CIFISP_DPRINT(CIFISP_DEBUG, " contrast: %d\n",
4699 CIFISP_DPRINT(CIFISP_DEBUG, " hue: %d\n",
4701 CIFISP_DPRINT(CIFISP_DEBUG, " sat: %d\n",
4703 CIFISP_DPRINT(CIFISP_DEBUG, " brightness: %d\n",
4704 pconfig->brightness);
4705 CIFISP_DPRINT(CIFISP_DEBUG,
4706 "#### %s: CPROC Parameters - END ####\n",
4709 case CIFISP_MODULE_YCFLT:{
4710 struct cifisp_ycflt_config *pconfig =
4711 (struct cifisp_ycflt_config *)config;
4712 CIFISP_DPRINT(CIFISP_DEBUG,
4713 "#### %s: YCFLT Parameters - BEGIN ####\n",
4715 CIFISP_DPRINT(CIFISP_DEBUG, " chr_ss_ctrl: %d\n",
4716 CIFISP_DPRINT(CIFISP_DEBUG, " ctrl: %d\n",
4718 CIFISP_DPRINT(CIFISP_DEBUG, " chr_ss_ctrl: %d\n",
4719 pconfig->chr_ss_ctrl);
4720 CIFISP_DPRINT(CIFISP_DEBUG, " chr_ss_fac: %d\n",
4721 pconfig->chr_ss_fac);
4722 CIFISP_DPRINT(CIFISP_DEBUG, " chr_ss_offs: %d\n",
4723 pconfig->chr_ss_offs);
4724 CIFISP_DPRINT(CIFISP_DEBUG, " chr_nr_ctrl: %d\n",
4725 pconfig->chr_nr_ctrl);
4726 CIFISP_DPRINT(CIFISP_DEBUG,
4727 " lum_eenr_edge_gain: %d\n",
4728 pconfig->lum_eenr_edge_gain);
4729 CIFISP_DPRINT(CIFISP_DEBUG,
4730 " lum_eenr_corner_gain: %d\n",
4731 pconfig->lum_eenr_corner_gain);
4732 CIFISP_DPRINT(CIFISP_DEBUG,
4733 " lum_eenr_fc_crop_neg: %d\n",
4734 pconfig->lum_eenr_fc_crop_neg);
4735 CIFISP_DPRINT(CIFISP_DEBUG,
4736 " lum_eenr_fc_crop_pos: %d\n",
4737 pconfig->lum_eenr_fc_crop_pos);
4738 CIFISP_DPRINT(CIFISP_DEBUG,
4739 " lum_eenr_fc_gain_neg: %d\n",
4740 pconfig->lum_eenr_fc_gain_neg);
4741 CIFISP_DPRINT(CIFISP_DEBUG,
4742 " lum_eenr_fc_gain_pos: %d\n",
4743 pconfig->lum_eenr_fc_gain_pos);
4744 CIFISP_DPRINT(CIFISP_DEBUG,
4745 "#### %s: YCFLT Parameters - END ####\n",
4749 case CIFISP_MODULE_AFC:{
4750 struct cifisp_afc_config *pconfig =
4751 (struct cifisp_afc_config *)config;
4752 CIFISP_DPRINT(CIFISP_DEBUG,
4753 "#### %s: AFC Parameters - BEGIN ####\n",
4755 CIFISP_DPRINT(CIFISP_DEBUG,
4756 " window A %d %d %d %d\n",
4757 pconfig->afm_win[0].h_offs,
4758 pconfig->afm_win[0].v_offs,
4759 pconfig->afm_win[0].h_size,
4760 pconfig->afm_win[0].v_size);
4761 CIFISP_DPRINT(CIFISP_DEBUG,
4762 " window B %d %d %d %d\n",
4763 pconfig->afm_win[1].h_offs,
4764 pconfig->afm_win[1].v_offs,
4765 pconfig->afm_win[1].h_size,
4766 pconfig->afm_win[1].v_size);
4767 CIFISP_DPRINT(CIFISP_DEBUG,
4768 " window C %d %d %d %d\n",
4769 pconfig->afm_win[2].h_offs,
4770 pconfig->afm_win[2].v_offs,
4771 pconfig->afm_win[2].h_size,
4772 pconfig->afm_win[2].v_size);
4773 CIFISP_DPRINT(CIFISP_DEBUG, " thres: %d\n",
4775 CIFISP_DPRINT(CIFISP_DEBUG, " var_shift: %d\n",
4776 pconfig->var_shift);
4779 case CIFISP_MODULE_IE: {
4780 struct cifisp_ie_config *pconfig =
4781 (struct cifisp_ie_config *)config;
4782 CIFISP_DPRINT(CIFISP_DEBUG,
4783 "effect %d, %x, %x, %x, %x, %x, %x %d\n",
4784 pconfig->effect, pconfig->color_sel,
4785 pconfig->eff_mat_1, pconfig->eff_mat_2,
4786 pconfig->eff_mat_3, pconfig->eff_mat_4,
4787 pconfig->eff_mat_5, pconfig->eff_tint);
4791 CIFISP_DPRINT(CIFISP_DEBUG,
4792 "####%s: Invalid Module ID ####\n", ISP_VDEV_NAME);
4798 #ifdef LOG_CAPTURE_PARAMS
4799 static void cifisp_reg_dump_capture(const struct cif_isp10_isp_dev *isp_dev)
4801 memset(&g_last_capture_config, 0, sizeof(g_last_capture_config));
4803 if (isp_dev->bls_en) {
4804 g_last_capture_config.bls.fixed_val.fixed_a =
4805 cifisp_ioread32(CIF_ISP_BLS_A_FIXED);
4806 g_last_capture_config.bls.fixed_val.fixed_b =
4807 cifisp_ioread32(CIF_ISP_BLS_B_FIXED);
4808 g_last_capture_config.bls.fixed_val.fixed_c =
4809 cifisp_ioread32(CIF_ISP_BLS_C_FIXED);
4810 g_last_capture_config.bls.fixed_val.fixed_d =
4811 cifisp_ioread32(CIF_ISP_BLS_D_FIXED);
4814 if (isp_dev->lsc_en)
4815 cifisp_lsc_config_read(isp_dev, &g_last_capture_config.lsc);
4817 if (isp_dev->flt_en)
4818 cifisp_flt_config_read(isp_dev, &g_last_capture_config.flt);
4820 if (isp_dev->bdm_en)
4821 g_last_capture_config.bdm.demosaic_th =
4822 cifisp_ioread32(CIF_ISP_DEMOSAIC);
4824 if (isp_dev->sdg_en)
4825 cifisp_sdg_config_read(isp_dev, &g_last_capture_config.sdg);
4827 if (isp_dev->goc_en)
4828 cifisp_goc_config_read(isp_dev, &g_last_capture_config.goc);
4830 if (isp_dev->ctk_en)
4831 cifisp_ctk_config_read(isp_dev, &g_last_capture_config.ctk);
4833 if (isp_dev->awb_meas_en)
4834 cifisp_awb_meas_config_read(isp_dev,
4835 &g_last_capture_config.awb_meas);
4837 if (isp_dev->awb_gain_en)
4838 cifisp_awb_gain_config_read(isp_dev,
4839 &g_last_capture_config.awb_gain);
4841 if (isp_dev->cproc_en)
4842 cifisp_cproc_config_read(isp_dev, &g_last_capture_config.cproc);
4846 #ifdef CIFISP_DEBUG_REG
4847 static void cifisp_reg_dump(const struct cif_isp10_isp_dev *isp_dev,
4848 unsigned int module, int level)
4851 case CIFISP_MODULE_DPCC:
4852 CIFISP_DPRINT(level, "#### BPC Registers - BEGIN ####\n");
4853 CIFISP_DPRINT(level, "#### BPC Registers - END ####\n");
4855 case CIFISP_MODULE_BLS:
4856 CIFISP_DPRINT(level, "#### BLS Registers - BEGIN ####\n");
4857 CIFISP_DPRINT(level, " CIF_ISP_BLS_CTRL: %d\n",
4858 cifisp_ioread32(CIF_ISP_BLS_CTRL));
4859 CIFISP_DPRINT(level, " CIF_ISP_BLS_SAMPLES: %d\n",
4860 cifisp_ioread32(CIF_ISP_BLS_SAMPLES));
4861 CIFISP_DPRINT(level, " CIF_ISP_BLS_H1_START: %d\n",
4862 cifisp_ioread32(CIF_ISP_BLS_H1_START));
4863 CIFISP_DPRINT(level, " CIF_ISP_BLS_H1_STOP: %d\n",
4864 cifisp_ioread32(CIF_ISP_BLS_H1_STOP));
4865 CIFISP_DPRINT(level, " CIF_ISP_BLS_H1_START: %d\n",
4866 cifisp_ioread32(CIF_ISP_BLS_H1_START));
4867 CIFISP_DPRINT(level, " CIF_ISP_BLS_V1_START: %d\n",
4868 cifisp_ioread32(CIF_ISP_BLS_V1_START));
4869 CIFISP_DPRINT(level, " CIF_ISP_BLS_V1_STOP: %d\n",
4870 cifisp_ioread32(CIF_ISP_BLS_V1_STOP));
4871 CIFISP_DPRINT(level, " CIF_ISP_BLS_H2_START: %d\n",
4872 cifisp_ioread32(CIF_ISP_BLS_H2_START));
4873 CIFISP_DPRINT(level, " CIF_ISP_BLS_H2_STOP: %d\n",
4874 cifisp_ioread32(CIF_ISP_BLS_H2_STOP));
4875 CIFISP_DPRINT(level, " CIF_ISP_BLS_V2_START: %d\n",
4876 cifisp_ioread32(CIF_ISP_BLS_V2_START));
4877 CIFISP_DPRINT(level, " CIF_ISP_BLS_V2_STOP: %d\n",
4878 cifisp_ioread32(CIF_ISP_BLS_V2_STOP));
4879 CIFISP_DPRINT(level, "#### BLS Registers - END ####\n");
4881 case CIFISP_MODULE_LSC:
4882 CIFISP_DPRINT(level, "#### LSC Registers - BEGIN ####\n");
4883 CIFISP_DPRINT(level, "#### LSC Registers - END ####\n");
4885 case CIFISP_MODULE_FLT:{
4886 CIFISP_DPRINT(level,
4887 "#### %s: FLT Registers - BEGIN ####\n",
4889 CIFISP_DPRINT(level,
4890 " CIF_ISP_FILT_MODE: %d\n",
4891 cifisp_ioread32(CIF_ISP_FILT_MODE));
4892 CIFISP_DPRINT(level,
4893 " CIF_ISP_FILT_LUM_WEIGHT: %d\n",
4894 cifisp_ioread32(CIF_ISP_FILT_LUM_WEIGHT));
4895 CIFISP_DPRINT(level,
4896 "#### %s: FLT Registers - END ####\n",
4901 case CIFISP_MODULE_BDM:{
4902 CIFISP_DPRINT(level,
4903 "#### %s: BDM Registers - BEGIN ####\n",
4905 CIFISP_DPRINT(level, " CIF_ISP_DEMOSAIC: %d\n",
4906 cifisp_ioread32(CIF_ISP_DEMOSAIC));
4907 CIFISP_DPRINT(level,
4908 "#### %s: BDM Registers - END ####\n",
4913 case CIFISP_MODULE_SDG:{
4914 CIFISP_DPRINT(level,
4915 "#### %s: SDG Registers - BEGIN ####\n",
4917 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_DX_LO: %d\n",
4918 cifisp_ioread32(CIF_ISP_GAMMA_DX_LO));
4919 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_DX_HI: %d\n",
4920 cifisp_ioread32(CIF_ISP_GAMMA_DX_HI));
4922 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y0: %d\n",
4923 cifisp_ioread32(CIF_ISP_GAMMA_R_Y0));
4924 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y1: %d\n",
4925 cifisp_ioread32(CIF_ISP_GAMMA_R_Y1));
4926 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y2: %d\n",
4927 cifisp_ioread32(CIF_ISP_GAMMA_R_Y2));
4928 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y3: %d\n",
4929 cifisp_ioread32(CIF_ISP_GAMMA_R_Y3));
4930 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y4: %d\n",
4931 cifisp_ioread32(CIF_ISP_GAMMA_R_Y4));
4932 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y5: %d\n",
4933 cifisp_ioread32(CIF_ISP_GAMMA_R_Y5));
4934 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y6: %d\n",
4935 cifisp_ioread32(CIF_ISP_GAMMA_R_Y6));
4936 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y7: %d\n",
4937 cifisp_ioread32(CIF_ISP_GAMMA_R_Y7));
4938 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y8: %d\n",
4939 cifisp_ioread32(CIF_ISP_GAMMA_R_Y8));
4940 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y9: %d\n",
4941 cifisp_ioread32(CIF_ISP_GAMMA_R_Y9));
4942 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y10: %d\n",
4943 cifisp_ioread32(CIF_ISP_GAMMA_R_Y10));
4944 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y11: %d\n",
4945 cifisp_ioread32(CIF_ISP_GAMMA_R_Y11));
4946 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y12: %d\n",
4947 cifisp_ioread32(CIF_ISP_GAMMA_R_Y12));
4948 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y13: %d\n",
4949 cifisp_ioread32(CIF_ISP_GAMMA_R_Y13));
4950 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y14: %d\n",
4951 cifisp_ioread32(CIF_ISP_GAMMA_R_Y14));
4952 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y15: %d\n",
4953 cifisp_ioread32(CIF_ISP_GAMMA_R_Y15));
4954 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_R_Y16: %d\n",
4955 cifisp_ioread32(CIF_ISP_GAMMA_R_Y16));
4957 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y0: %d\n",
4958 cifisp_ioread32(CIF_ISP_GAMMA_G_Y0));
4959 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y1: %d\n",
4960 cifisp_ioread32(CIF_ISP_GAMMA_G_Y1));
4961 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y2: %d\n",
4962 cifisp_ioread32(CIF_ISP_GAMMA_G_Y2));
4963 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y3: %d\n",
4964 cifisp_ioread32(CIF_ISP_GAMMA_G_Y3));
4965 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y4: %d\n",
4966 cifisp_ioread32(CIF_ISP_GAMMA_G_Y4));
4967 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y5: %d\n",
4968 cifisp_ioread32(CIF_ISP_GAMMA_G_Y5));
4969 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y6: %d\n",
4970 cifisp_ioread32(CIF_ISP_GAMMA_G_Y6));
4971 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y7: %d\n",
4972 cifisp_ioread32(CIF_ISP_GAMMA_G_Y7));
4973 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y8: %d\n",
4974 cifisp_ioread32(CIF_ISP_GAMMA_G_Y8));
4975 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y9: %d\n",
4976 cifisp_ioread32(CIF_ISP_GAMMA_G_Y9));
4977 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y10: %d\n",
4978 cifisp_ioread32(CIF_ISP_GAMMA_G_Y10));
4979 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y11: %d\n",
4980 cifisp_ioread32(CIF_ISP_GAMMA_G_Y11));
4981 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y12: %d\n",
4982 cifisp_ioread32(CIF_ISP_GAMMA_G_Y12));
4983 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y13: %d\n",
4984 cifisp_ioread32(CIF_ISP_GAMMA_G_Y13));
4985 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y14: %d\n",
4986 cifisp_ioread32(CIF_ISP_GAMMA_G_Y14));
4987 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y15: %d\n",
4988 cifisp_ioread32(CIF_ISP_GAMMA_G_Y15));
4989 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_G_Y16: %d\n",
4990 cifisp_ioread32(CIF_ISP_GAMMA_G_Y16));
4992 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y0: %d\n",
4993 cifisp_ioread32(CIF_ISP_GAMMA_B_Y0));
4994 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y1: %d\n",
4995 cifisp_ioread32(CIF_ISP_GAMMA_B_Y1));
4996 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y2: %d\n",
4997 cifisp_ioread32(CIF_ISP_GAMMA_B_Y2));
4998 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y3: %d\n",
4999 cifisp_ioread32(CIF_ISP_GAMMA_B_Y3));
5000 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y4: %d\n",
5001 cifisp_ioread32(CIF_ISP_GAMMA_B_Y4));
5002 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y5: %d\n",
5003 cifisp_ioread32(CIF_ISP_GAMMA_B_Y5));
5004 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y6: %d\n",
5005 cifisp_ioread32(CIF_ISP_GAMMA_B_Y6));
5006 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y7: %d\n",
5007 cifisp_ioread32(CIF_ISP_GAMMA_B_Y7));
5008 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y8: %d\n",
5009 cifisp_ioread32(CIF_ISP_GAMMA_B_Y8));
5010 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y9: %d\n",
5011 cifisp_ioread32(CIF_ISP_GAMMA_B_Y9));
5012 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y10: %d\n",
5013 cifisp_ioread32(CIF_ISP_GAMMA_B_Y10));
5014 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y11: %d\n",
5015 cifisp_ioread32(CIF_ISP_GAMMA_B_Y11));
5016 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y12: %d\n",
5017 cifisp_ioread32(CIF_ISP_GAMMA_B_Y12));
5018 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y13: %d\n",
5019 cifisp_ioread32(CIF_ISP_GAMMA_B_Y13));
5020 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y14: %d\n",
5021 cifisp_ioread32(CIF_ISP_GAMMA_B_Y14));
5022 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y15: %d\n",
5023 cifisp_ioread32(CIF_ISP_GAMMA_B_Y15));
5024 CIFISP_DPRINT(level, " CIF_ISP_GAMMA_B_Y16: %d\n",
5025 cifisp_ioread32(CIF_ISP_GAMMA_B_Y16));
5026 CIFISP_DPRINT(level,
5027 "#### %s: SDG Registers - END ####\n",
5032 case CIFISP_MODULE_GOC:{
5033 CIFISP_DPRINT(level,
5034 "#### %s: GOC Registers - BEGIN ####\n",
5036 CIFISP_DPRINT(level,
5037 "#### %s: GOC registers - END ####\n",
5042 case CIFISP_MODULE_CTK:{
5043 CIFISP_DPRINT(level,
5044 "#### %s: CTK Registers - BEGIN ####\n",
5046 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_0: %d\n",
5047 cifisp_ioread32(CIF_ISP_CT_COEFF_0));
5048 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_1: %d\n",
5049 cifisp_ioread32(CIF_ISP_CT_COEFF_1));
5050 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_2: %d\n",
5051 cifisp_ioread32(CIF_ISP_CT_COEFF_2));
5052 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_3: %d\n",
5053 cifisp_ioread32(CIF_ISP_CT_COEFF_3));
5054 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_4: %d\n",
5055 cifisp_ioread32(CIF_ISP_CT_COEFF_4));
5056 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_5: %d\n",
5057 cifisp_ioread32(CIF_ISP_CT_COEFF_5));
5058 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_6: %d\n",
5059 cifisp_ioread32(CIF_ISP_CT_COEFF_6));
5060 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_7: %d\n",
5061 cifisp_ioread32(CIF_ISP_CT_COEFF_7));
5062 CIFISP_DPRINT(level, " CIF_ISP_CT_COEFF_8: %d\n",
5063 cifisp_ioread32(CIF_ISP_CT_COEFF_8));
5064 CIFISP_DPRINT(level, " CIF_ISP_CT_OFFSET_R: %d\n",
5065 cifisp_ioread32(CIF_ISP_CT_OFFSET_R));
5066 CIFISP_DPRINT(level, " CIF_ISP_CT_OFFSET_G: %d\n",
5067 cifisp_ioread32(CIF_ISP_CT_OFFSET_G));
5068 CIFISP_DPRINT(level, " CIF_ISP_CT_OFFSET_B: %d\n",
5069 cifisp_ioread32(CIF_ISP_CT_OFFSET_B));
5070 CIFISP_DPRINT(level,
5071 "#### %s: CTK Registers - END ####\n",
5076 case CIFISP_MODULE_AWB:{
5077 CIFISP_DPRINT(level,
5078 "#### %s: AWB Registers - BEGIN ####\n",
5080 CIFISP_DPRINT(level, " CIF_ISP_AWB_PROP: %x\n",
5081 cifisp_ioread32(CIF_ISP_AWB_PROP));
5082 CIFISP_DPRINT(level, " CIF_ISP_AWB_GAIN_G: %x\n",
5083 cifisp_ioread32(CIF_ISP_AWB_GAIN_G));
5084 CIFISP_DPRINT(level, " CIF_ISP_AWB_GAIN_RB: %x\n",
5085 cifisp_ioread32(CIF_ISP_AWB_GAIN_RB));
5086 CIFISP_DPRINT(level, " CIF_ISP_AWB_REF: %x\n",
5087 cifisp_ioread32(CIF_ISP_AWB_REF));
5088 CIFISP_DPRINT(level, " CIF_ISP_AWB_GAIN_RB: %x\n",
5089 cifisp_ioread32(CIF_ISP_AWB_PROP));
5090 CIFISP_DPRINT(level, " CIF_ISP_AWB_FRAMES: %x\n",
5091 cifisp_ioread32(CIF_ISP_AWB_FRAMES));
5092 CIFISP_DPRINT(level,
5093 "#### %s: AWB Registers - END ####\n",
5098 case CIFISP_MODULE_HST:{
5099 CIFISP_DPRINT(level,
5100 "#### %s: HST Registers - BEGIN ####\n",
5102 CIFISP_DPRINT(level, " CIF_ISP_HIST_PROP: %d\n",
5103 cifisp_ioread32(CIF_ISP_HIST_PROP));
5104 CIFISP_DPRINT(level, " CIF_ISP_HIST_H_OFFS: %d\n",
5105 cifisp_ioread32(CIF_ISP_HIST_H_OFFS));
5106 CIFISP_DPRINT(level, " CIF_ISP_HIST_H_SIZE: %d\n",
5107 cifisp_ioread32(CIF_ISP_HIST_H_SIZE));
5108 CIFISP_DPRINT(level, " CIF_ISP_HIST_V_OFFS: %d\n",
5109 cifisp_ioread32(CIF_ISP_HIST_V_OFFS));
5110 CIFISP_DPRINT(level, " CIF_ISP_HIST_V_SIZE: %d\n",
5111 cifisp_ioread32(CIF_ISP_HIST_V_SIZE));
5112 CIFISP_DPRINT(level,
5113 "#### %s: HST Registers - END ####\n",
5118 case CIFISP_MODULE_AEC:{
5119 CIFISP_DPRINT(level,
5120 "#### %s: AEC Registers - BEGIN ####\n",
5122 CIFISP_DPRINT(level, " CIF_ISP_EXP_CTRL: %d\n",
5123 cifisp_ioread32(CIF_ISP_EXP_CTRL));
5124 CIFISP_DPRINT(level, " CIF_ISP_EXP_H_OFFSET: %d\n",
5125 cifisp_ioread32(CIF_ISP_EXP_H_OFFSET));
5126 CIFISP_DPRINT(level, " CIF_ISP_EXP_V_OFFSET: %d\n",
5127 cifisp_ioread32(CIF_ISP_EXP_V_OFFSET));
5128 CIFISP_DPRINT(level, " CIF_ISP_EXP_H_SIZE: %d\n",
5129 cifisp_ioread32(CIF_ISP_EXP_H_SIZE));
5130 CIFISP_DPRINT(level, " CIF_ISP_EXP_V_SIZE: %d\n",
5131 cifisp_ioread32(CIF_ISP_EXP_V_SIZE));
5132 CIFISP_DPRINT(level,
5133 "#### %s: AEC Registers - END ####\n",
5138 case CIFISP_MODULE_CPROC:{
5139 CIFISP_DPRINT(level,
5140 "#### %s: CPROC Registers - BEGIN ####\n",
5142 CIFISP_DPRINT(level, " ctrl: %d\n",
5143 cifisp_ioread32(CIF_C_PROC_CTRL));
5144 CIFISP_DPRINT(level, " contrast: %d\n",
5145 cifisp_ioread32(CIF_C_PROC_CONTRAST));
5146 CIFISP_DPRINT(level, " hue: %d\n",
5147 cifisp_ioread32(CIF_C_PROC_HUE));
5148 CIFISP_DPRINT(level, " sat: %d\n",
5149 cifisp_ioread32(CIF_C_PROC_SATURATION));
5150 CIFISP_DPRINT(level, " brightness: %d\n",
5151 cifisp_ioread32(CIF_C_PROC_BRIGHTNESS));
5152 CIFISP_DPRINT(level,
5153 "#### %s: CPROC Registers - END ####\n",
5157 case CIFISP_MODULE_AFC:{
5158 CIFISP_DPRINT(level,
5159 "#### %s: AFC Registers - BEGIN ####\n",
5161 CIFISP_DPRINT(level, " afm_ctr: %d\n",
5162 cifisp_ioread32(CIF_ISP_AFM_CTRL));
5163 CIFISP_DPRINT(level, " afm_lt_a: %d\n",
5164 cifisp_ioread32(CIF_ISP_AFM_LT_A));
5165 CIFISP_DPRINT(level, " afm_rb_a: %d\n",
5166 cifisp_ioread32(CIF_ISP_AFM_RB_A));
5167 CIFISP_DPRINT(level, " afm_lt_b: %d\n",
5168 cifisp_ioread32(CIF_ISP_AFM_LT_B));
5169 CIFISP_DPRINT(level, " afm_rb_b: %d\n",
5170 cifisp_ioread32(CIF_ISP_AFM_RB_B));
5171 CIFISP_DPRINT(level, " afm_lt_c: %d\n",
5172 cifisp_ioread32(CIF_ISP_AFM_LT_C));
5173 CIFISP_DPRINT(level, " afm_rb_c: %d\n",
5174 cifisp_ioread32(CIF_ISP_AFM_RB_C));
5175 CIFISP_DPRINT(level, " afm_thres: %d\n",
5176 cifisp_ioread32(CIF_ISP_AFM_THRES));
5177 CIFISP_DPRINT(level, " afm_var_shift: %d\n",
5178 cifisp_ioread32(CIF_ISP_AFM_VAR_SHIFT));
5179 CIFISP_DPRINT(level,
5180 "#### %s: YCFLT Registers - END ####\n",
5185 CIFISP_DPRINT(level, "####%s: Invalid Module ID ####\n",