xref: /openbmc/linux/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1  // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2  /*
3   * Rockchip ISP1 Driver - Params subdevice
4   *
5   * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
6   */
7  
8  #include <media/v4l2-common.h>
9  #include <media/v4l2-event.h>
10  #include <media/v4l2-ioctl.h>
11  #include <media/videobuf2-core.h>
12  #include <media/videobuf2-vmalloc.h>	/* for ISP params */
13  
14  #include "rkisp1-common.h"
15  
16  #define RKISP1_PARAMS_DEV_NAME	RKISP1_DRIVER_NAME "_params"
17  
18  #define RKISP1_ISP_PARAMS_REQ_BUFS_MIN	2
19  #define RKISP1_ISP_PARAMS_REQ_BUFS_MAX	8
20  
21  #define RKISP1_ISP_DPCC_METHODS_SET(n) \
22  			(RKISP1_CIF_ISP_DPCC_METHODS_SET_1 + 0x4 * (n))
23  #define RKISP1_ISP_DPCC_LINE_THRESH(n) \
24  			(RKISP1_CIF_ISP_DPCC_LINE_THRESH_1 + 0x14 * (n))
25  #define RKISP1_ISP_DPCC_LINE_MAD_FAC(n) \
26  			(RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_1 + 0x14 * (n))
27  #define RKISP1_ISP_DPCC_PG_FAC(n) \
28  			(RKISP1_CIF_ISP_DPCC_PG_FAC_1 + 0x14 * (n))
29  #define RKISP1_ISP_DPCC_RND_THRESH(n) \
30  			(RKISP1_CIF_ISP_DPCC_RND_THRESH_1 + 0x14 * (n))
31  #define RKISP1_ISP_DPCC_RG_FAC(n) \
32  			(RKISP1_CIF_ISP_DPCC_RG_FAC_1 + 0x14 * (n))
33  #define RKISP1_ISP_CC_COEFF(n) \
34  			(RKISP1_CIF_ISP_CC_COEFF_0 + (n) * 4)
35  
36  static inline void
rkisp1_param_set_bits(struct rkisp1_params * params,u32 reg,u32 bit_mask)37  rkisp1_param_set_bits(struct rkisp1_params *params, u32 reg, u32 bit_mask)
38  {
39  	u32 val;
40  
41  	val = rkisp1_read(params->rkisp1, reg);
42  	rkisp1_write(params->rkisp1, reg, val | bit_mask);
43  }
44  
45  static inline void
rkisp1_param_clear_bits(struct rkisp1_params * params,u32 reg,u32 bit_mask)46  rkisp1_param_clear_bits(struct rkisp1_params *params, u32 reg, u32 bit_mask)
47  {
48  	u32 val;
49  
50  	val = rkisp1_read(params->rkisp1, reg);
51  	rkisp1_write(params->rkisp1, reg, val & ~bit_mask);
52  }
53  
54  /* ISP BP interface function */
rkisp1_dpcc_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_dpcc_config * arg)55  static void rkisp1_dpcc_config(struct rkisp1_params *params,
56  			       const struct rkisp1_cif_isp_dpcc_config *arg)
57  {
58  	unsigned int i;
59  	u32 mode;
60  
61  	/*
62  	 * The enable bit is controlled in rkisp1_isp_isr_other_config() and
63  	 * must be preserved. The grayscale mode should be configured
64  	 * automatically based on the media bus code on the ISP sink pad, so
65  	 * only the STAGE1_ENABLE bit can be set by userspace.
66  	 */
67  	mode = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_DPCC_MODE);
68  	mode &= RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE;
69  	mode |= arg->mode & RKISP1_CIF_ISP_DPCC_MODE_STAGE1_ENABLE;
70  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_MODE, mode);
71  
72  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_OUTPUT_MODE,
73  		     arg->output_mode & RKISP1_CIF_ISP_DPCC_OUTPUT_MODE_MASK);
74  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_SET_USE,
75  		     arg->set_use & RKISP1_CIF_ISP_DPCC_SET_USE_MASK);
76  
77  	for (i = 0; i < RKISP1_CIF_ISP_DPCC_METHODS_MAX; i++) {
78  		rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_METHODS_SET(i),
79  			     arg->methods[i].method &
80  			     RKISP1_CIF_ISP_DPCC_METHODS_SET_MASK);
81  		rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_LINE_THRESH(i),
82  			     arg->methods[i].line_thresh &
83  			     RKISP1_CIF_ISP_DPCC_LINE_THRESH_MASK);
84  		rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_LINE_MAD_FAC(i),
85  			     arg->methods[i].line_mad_fac &
86  			     RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_MASK);
87  		rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_PG_FAC(i),
88  			     arg->methods[i].pg_fac &
89  			     RKISP1_CIF_ISP_DPCC_PG_FAC_MASK);
90  		rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_RND_THRESH(i),
91  			     arg->methods[i].rnd_thresh &
92  			     RKISP1_CIF_ISP_DPCC_RND_THRESH_MASK);
93  		rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_RG_FAC(i),
94  			     arg->methods[i].rg_fac &
95  			     RKISP1_CIF_ISP_DPCC_RG_FAC_MASK);
96  	}
97  
98  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_RND_OFFS,
99  		     arg->rnd_offs & RKISP1_CIF_ISP_DPCC_RND_OFFS_MASK);
100  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_RO_LIMITS,
101  		     arg->ro_limits & RKISP1_CIF_ISP_DPCC_RO_LIMIT_MASK);
102  }
103  
104  /* ISP black level subtraction interface function */
rkisp1_bls_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_bls_config * arg)105  static void rkisp1_bls_config(struct rkisp1_params *params,
106  			      const struct rkisp1_cif_isp_bls_config *arg)
107  {
108  	/* avoid to override the old enable value */
109  	u32 new_control;
110  
111  	new_control = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_BLS_CTRL);
112  	new_control &= RKISP1_CIF_ISP_BLS_ENA;
113  	/* fixed subtraction values */
114  	if (!arg->enable_auto) {
115  		const struct rkisp1_cif_isp_bls_fixed_val *pval =
116  								&arg->fixed_val;
117  
118  		switch (params->raw_type) {
119  		case RKISP1_RAW_BGGR:
120  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
121  				     pval->r);
122  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
123  				     pval->gr);
124  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
125  				     pval->gb);
126  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
127  				     pval->b);
128  			break;
129  		case RKISP1_RAW_GBRG:
130  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
131  				     pval->r);
132  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
133  				     pval->gr);
134  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
135  				     pval->gb);
136  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
137  				     pval->b);
138  			break;
139  		case RKISP1_RAW_GRBG:
140  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
141  				     pval->r);
142  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
143  				     pval->gr);
144  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
145  				     pval->gb);
146  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
147  				     pval->b);
148  			break;
149  		case RKISP1_RAW_RGGB:
150  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
151  				     pval->r);
152  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
153  				     pval->gr);
154  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
155  				     pval->gb);
156  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
157  				     pval->b);
158  			break;
159  		default:
160  			break;
161  		}
162  
163  	} else {
164  		if (arg->en_windows & BIT(1)) {
165  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H2_START,
166  				     arg->bls_window2.h_offs);
167  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H2_STOP,
168  				     arg->bls_window2.h_size);
169  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V2_START,
170  				     arg->bls_window2.v_offs);
171  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V2_STOP,
172  				     arg->bls_window2.v_size);
173  			new_control |= RKISP1_CIF_ISP_BLS_WINDOW_2;
174  		}
175  
176  		if (arg->en_windows & BIT(0)) {
177  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H1_START,
178  				     arg->bls_window1.h_offs);
179  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H1_STOP,
180  				     arg->bls_window1.h_size);
181  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V1_START,
182  				     arg->bls_window1.v_offs);
183  			rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V1_STOP,
184  				     arg->bls_window1.v_size);
185  			new_control |= RKISP1_CIF_ISP_BLS_WINDOW_1;
186  		}
187  
188  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_SAMPLES,
189  			     arg->bls_samples);
190  
191  		new_control |= RKISP1_CIF_ISP_BLS_MODE_MEASURED;
192  	}
193  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_CTRL, new_control);
194  }
195  
196  /* ISP LS correction interface function */
197  static void
rkisp1_lsc_matrix_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_lsc_config * pconfig)198  rkisp1_lsc_matrix_config_v10(struct rkisp1_params *params,
199  			     const struct rkisp1_cif_isp_lsc_config *pconfig)
200  {
201  	struct rkisp1_device *rkisp1 = params->rkisp1;
202  	u32 lsc_status, sram_addr, lsc_table_sel;
203  	unsigned int i, j;
204  
205  	lsc_status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_LSC_STATUS);
206  
207  	/* RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
208  	sram_addr = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ?
209  		    RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_0 :
210  		    RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153;
211  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_ADDR, sram_addr);
212  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_ADDR, sram_addr);
213  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_ADDR, sram_addr);
214  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_ADDR, sram_addr);
215  
216  	/* program data tables (table size is 9 * 17 = 153) */
217  	for (i = 0; i < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; i++) {
218  		const __u16 *r_tbl = pconfig->r_data_tbl[i];
219  		const __u16 *gr_tbl = pconfig->gr_data_tbl[i];
220  		const __u16 *gb_tbl = pconfig->gb_data_tbl[i];
221  		const __u16 *b_tbl = pconfig->b_data_tbl[i];
222  
223  		/*
224  		 * 17 sectors with 2 values in one DWORD = 9
225  		 * DWORDs (2nd value of last DWORD unused)
226  		 */
227  		for (j = 0; j < RKISP1_CIF_ISP_LSC_SAMPLES_MAX - 1; j += 2) {
228  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA,
229  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(
230  					r_tbl[j], r_tbl[j + 1]));
231  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA,
232  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(
233  					gr_tbl[j], gr_tbl[j + 1]));
234  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA,
235  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(
236  					gb_tbl[j], gb_tbl[j + 1]));
237  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA,
238  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(
239  					b_tbl[j], b_tbl[j + 1]));
240  		}
241  
242  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA,
243  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(r_tbl[j], 0));
244  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA,
245  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(gr_tbl[j], 0));
246  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA,
247  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(gb_tbl[j], 0));
248  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA,
249  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(b_tbl[j], 0));
250  	}
251  
252  	lsc_table_sel = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ?
253  			RKISP1_CIF_ISP_LSC_TABLE_0 : RKISP1_CIF_ISP_LSC_TABLE_1;
254  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_TABLE_SEL, lsc_table_sel);
255  }
256  
257  static void
rkisp1_lsc_matrix_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_lsc_config * pconfig)258  rkisp1_lsc_matrix_config_v12(struct rkisp1_params *params,
259  			     const struct rkisp1_cif_isp_lsc_config *pconfig)
260  {
261  	struct rkisp1_device *rkisp1 = params->rkisp1;
262  	u32 lsc_status, sram_addr, lsc_table_sel;
263  	unsigned int i, j;
264  
265  	lsc_status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_LSC_STATUS);
266  
267  	/* RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
268  	sram_addr = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ?
269  		    RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_0 :
270  		    RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153;
271  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_ADDR, sram_addr);
272  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_ADDR, sram_addr);
273  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_ADDR, sram_addr);
274  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_ADDR, sram_addr);
275  
276  	/* program data tables (table size is 9 * 17 = 153) */
277  	for (i = 0; i < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; i++) {
278  		const __u16 *r_tbl = pconfig->r_data_tbl[i];
279  		const __u16 *gr_tbl = pconfig->gr_data_tbl[i];
280  		const __u16 *gb_tbl = pconfig->gb_data_tbl[i];
281  		const __u16 *b_tbl = pconfig->b_data_tbl[i];
282  
283  		/*
284  		 * 17 sectors with 2 values in one DWORD = 9
285  		 * DWORDs (2nd value of last DWORD unused)
286  		 */
287  		for (j = 0; j < RKISP1_CIF_ISP_LSC_SAMPLES_MAX - 1; j += 2) {
288  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA,
289  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(
290  					r_tbl[j], r_tbl[j + 1]));
291  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA,
292  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(
293  					gr_tbl[j], gr_tbl[j + 1]));
294  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA,
295  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(
296  					gb_tbl[j], gb_tbl[j + 1]));
297  			rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA,
298  				     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(
299  					b_tbl[j], b_tbl[j + 1]));
300  		}
301  
302  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA,
303  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(r_tbl[j], 0));
304  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA,
305  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(gr_tbl[j], 0));
306  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA,
307  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(gb_tbl[j], 0));
308  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA,
309  			     RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(b_tbl[j], 0));
310  	}
311  
312  	lsc_table_sel = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ?
313  			RKISP1_CIF_ISP_LSC_TABLE_0 : RKISP1_CIF_ISP_LSC_TABLE_1;
314  	rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_TABLE_SEL, lsc_table_sel);
315  }
316  
rkisp1_lsc_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_lsc_config * arg)317  static void rkisp1_lsc_config(struct rkisp1_params *params,
318  			      const struct rkisp1_cif_isp_lsc_config *arg)
319  {
320  	struct rkisp1_device *rkisp1 = params->rkisp1;
321  	u32 lsc_ctrl, data;
322  	unsigned int i;
323  
324  	/* To config must be off , store the current status firstly */
325  	lsc_ctrl = rkisp1_read(rkisp1, RKISP1_CIF_ISP_LSC_CTRL);
326  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL,
327  				RKISP1_CIF_ISP_LSC_CTRL_ENA);
328  	params->ops->lsc_matrix_config(params, arg);
329  
330  	for (i = 0; i < RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE / 2; i++) {
331  		/* program x size tables */
332  		data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->x_size_tbl[i * 2],
333  						    arg->x_size_tbl[i * 2 + 1]);
334  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_XSIZE(i), data);
335  
336  		/* program x grad tables */
337  		data = RKISP1_CIF_ISP_LSC_SECT_GRAD(arg->x_grad_tbl[i * 2],
338  						    arg->x_grad_tbl[i * 2 + 1]);
339  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_XGRAD(i), data);
340  
341  		/* program y size tables */
342  		data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->y_size_tbl[i * 2],
343  						    arg->y_size_tbl[i * 2 + 1]);
344  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_YSIZE(i), data);
345  
346  		/* program y grad tables */
347  		data = RKISP1_CIF_ISP_LSC_SECT_GRAD(arg->y_grad_tbl[i * 2],
348  						    arg->y_grad_tbl[i * 2 + 1]);
349  		rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_YGRAD(i), data);
350  	}
351  
352  	/* restore the lsc ctrl status */
353  	if (lsc_ctrl & RKISP1_CIF_ISP_LSC_CTRL_ENA)
354  		rkisp1_param_set_bits(params, RKISP1_CIF_ISP_LSC_CTRL,
355  				      RKISP1_CIF_ISP_LSC_CTRL_ENA);
356  	else
357  		rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL,
358  					RKISP1_CIF_ISP_LSC_CTRL_ENA);
359  }
360  
361  /* ISP Filtering function */
rkisp1_flt_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_flt_config * arg)362  static void rkisp1_flt_config(struct rkisp1_params *params,
363  			      const struct rkisp1_cif_isp_flt_config *arg)
364  {
365  	u32 filt_mode;
366  
367  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_BL0,
368  		     arg->thresh_bl0);
369  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_BL1,
370  		     arg->thresh_bl1);
371  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_SH0,
372  		     arg->thresh_sh0);
373  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_SH1,
374  		     arg->thresh_sh1);
375  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_BL0,
376  		     arg->fac_bl0);
377  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_BL1,
378  		     arg->fac_bl1);
379  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_MID,
380  		     arg->fac_mid);
381  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_SH0,
382  		     arg->fac_sh0);
383  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_SH1,
384  		     arg->fac_sh1);
385  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_LUM_WEIGHT,
386  		     arg->lum_weight);
387  
388  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE,
389  		     (arg->mode ? RKISP1_CIF_ISP_FLT_MODE_DNR : 0) |
390  		     RKISP1_CIF_ISP_FLT_CHROMA_V_MODE(arg->chr_v_mode) |
391  		     RKISP1_CIF_ISP_FLT_CHROMA_H_MODE(arg->chr_h_mode) |
392  		     RKISP1_CIF_ISP_FLT_GREEN_STAGE1(arg->grn_stage1));
393  
394  	/* avoid to override the old enable value */
395  	filt_mode = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE);
396  	filt_mode &= RKISP1_CIF_ISP_FLT_ENA;
397  	if (arg->mode)
398  		filt_mode |= RKISP1_CIF_ISP_FLT_MODE_DNR;
399  	filt_mode |= RKISP1_CIF_ISP_FLT_CHROMA_V_MODE(arg->chr_v_mode) |
400  		     RKISP1_CIF_ISP_FLT_CHROMA_H_MODE(arg->chr_h_mode) |
401  		     RKISP1_CIF_ISP_FLT_GREEN_STAGE1(arg->grn_stage1);
402  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE, filt_mode);
403  }
404  
405  /* ISP demosaic interface function */
rkisp1_bdm_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_bdm_config * arg)406  static int rkisp1_bdm_config(struct rkisp1_params *params,
407  			     const struct rkisp1_cif_isp_bdm_config *arg)
408  {
409  	u32 bdm_th;
410  
411  	/* avoid to override the old enable value */
412  	bdm_th = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_DEMOSAIC);
413  	bdm_th &= RKISP1_CIF_ISP_DEMOSAIC_BYPASS;
414  	bdm_th |= arg->demosaic_th & ~RKISP1_CIF_ISP_DEMOSAIC_BYPASS;
415  	/* set demosaic threshold */
416  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DEMOSAIC, bdm_th);
417  	return 0;
418  }
419  
420  /* ISP GAMMA correction interface function */
rkisp1_sdg_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_sdg_config * arg)421  static void rkisp1_sdg_config(struct rkisp1_params *params,
422  			      const struct rkisp1_cif_isp_sdg_config *arg)
423  {
424  	unsigned int i;
425  
426  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_DX_LO,
427  		     arg->xa_pnts.gamma_dx0);
428  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_DX_HI,
429  		     arg->xa_pnts.gamma_dx1);
430  
431  	for (i = 0; i < RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE; i++) {
432  		rkisp1_write(params->rkisp1,
433  			     RKISP1_CIF_ISP_GAMMA_R_Y0 + i * 4,
434  			     arg->curve_r.gamma_y[i]);
435  		rkisp1_write(params->rkisp1,
436  			     RKISP1_CIF_ISP_GAMMA_G_Y0 + i * 4,
437  			     arg->curve_g.gamma_y[i]);
438  		rkisp1_write(params->rkisp1,
439  			     RKISP1_CIF_ISP_GAMMA_B_Y0 + i * 4,
440  			     arg->curve_b.gamma_y[i]);
441  	}
442  }
443  
444  /* ISP GAMMA correction interface function */
rkisp1_goc_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_goc_config * arg)445  static void rkisp1_goc_config_v10(struct rkisp1_params *params,
446  				  const struct rkisp1_cif_isp_goc_config *arg)
447  {
448  	unsigned int i;
449  
450  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
451  				RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
452  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_OUT_MODE_V10,
453  		     arg->mode);
454  
455  	for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10; i++)
456  		rkisp1_write(params->rkisp1,
457  			     RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V10 + i * 4,
458  			     arg->gamma_y[i]);
459  }
460  
rkisp1_goc_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_goc_config * arg)461  static void rkisp1_goc_config_v12(struct rkisp1_params *params,
462  				  const struct rkisp1_cif_isp_goc_config *arg)
463  {
464  	unsigned int i;
465  	u32 value;
466  
467  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
468  				RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
469  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_OUT_MODE_V12,
470  		     arg->mode);
471  
472  	for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 / 2; i++) {
473  		value = RKISP1_CIF_ISP_GAMMA_VALUE_V12(
474  			arg->gamma_y[2 * i + 1],
475  			arg->gamma_y[2 * i]);
476  		rkisp1_write(params->rkisp1,
477  			     RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V12 + i * 4, value);
478  	}
479  }
480  
481  /* ISP Cross Talk */
rkisp1_ctk_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_ctk_config * arg)482  static void rkisp1_ctk_config(struct rkisp1_params *params,
483  			      const struct rkisp1_cif_isp_ctk_config *arg)
484  {
485  	unsigned int i, j, k = 0;
486  
487  	for (i = 0; i < 3; i++)
488  		for (j = 0; j < 3; j++)
489  			rkisp1_write(params->rkisp1,
490  				     RKISP1_CIF_ISP_CT_COEFF_0 + 4 * k++,
491  				     arg->coeff[i][j]);
492  	for (i = 0; i < 3; i++)
493  		rkisp1_write(params->rkisp1,
494  			     RKISP1_CIF_ISP_CT_OFFSET_R + i * 4,
495  			     arg->ct_offset[i]);
496  }
497  
rkisp1_ctk_enable(struct rkisp1_params * params,bool en)498  static void rkisp1_ctk_enable(struct rkisp1_params *params, bool en)
499  {
500  	if (en)
501  		return;
502  
503  	/* Write back the default values. */
504  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_0, 0x80);
505  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_1, 0);
506  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_2, 0);
507  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_3, 0);
508  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_4, 0x80);
509  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_5, 0);
510  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_6, 0);
511  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_7, 0);
512  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_8, 0x80);
513  
514  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_OFFSET_R, 0);
515  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_OFFSET_G, 0);
516  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_OFFSET_B, 0);
517  }
518  
519  /* ISP White Balance Mode */
rkisp1_awb_meas_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_awb_meas_config * arg)520  static void rkisp1_awb_meas_config_v10(struct rkisp1_params *params,
521  				       const struct rkisp1_cif_isp_awb_meas_config *arg)
522  {
523  	u32 reg_val = 0;
524  	/* based on the mode,configure the awb module */
525  	if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_YCBCR) {
526  		/* Reference Cb and Cr */
527  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_REF_V10,
528  			     RKISP1_CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) |
529  			     arg->awb_ref_cb);
530  		/* Yc Threshold */
531  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_THRESH_V10,
532  			     RKISP1_CIF_ISP_AWB_MAX_Y_SET(arg->max_y) |
533  			     RKISP1_CIF_ISP_AWB_MIN_Y_SET(arg->min_y) |
534  			     RKISP1_CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) |
535  			     arg->min_c);
536  	}
537  
538  	reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10);
539  	if (arg->enable_ymax_cmp)
540  		reg_val |= RKISP1_CIF_ISP_AWB_YMAX_CMP_EN;
541  	else
542  		reg_val &= ~RKISP1_CIF_ISP_AWB_YMAX_CMP_EN;
543  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10, reg_val);
544  
545  	/* window offset */
546  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_V_OFFS_V10,
547  		     arg->awb_wnd.v_offs);
548  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_H_OFFS_V10,
549  		     arg->awb_wnd.h_offs);
550  	/* AWB window size */
551  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_V_SIZE_V10,
552  		     arg->awb_wnd.v_size);
553  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_H_SIZE_V10,
554  		     arg->awb_wnd.h_size);
555  	/* Number of frames */
556  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_FRAMES_V10,
557  		     arg->frames);
558  }
559  
rkisp1_awb_meas_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_awb_meas_config * arg)560  static void rkisp1_awb_meas_config_v12(struct rkisp1_params *params,
561  				       const struct rkisp1_cif_isp_awb_meas_config *arg)
562  {
563  	u32 reg_val = 0;
564  	/* based on the mode,configure the awb module */
565  	if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_YCBCR) {
566  		/* Reference Cb and Cr */
567  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_REF_V12,
568  			     RKISP1_CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) |
569  			     arg->awb_ref_cb);
570  		/* Yc Threshold */
571  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_THRESH_V12,
572  			     RKISP1_CIF_ISP_AWB_MAX_Y_SET(arg->max_y) |
573  			     RKISP1_CIF_ISP_AWB_MIN_Y_SET(arg->min_y) |
574  			     RKISP1_CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) |
575  			     arg->min_c);
576  	}
577  
578  	reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12);
579  	if (arg->enable_ymax_cmp)
580  		reg_val |= RKISP1_CIF_ISP_AWB_YMAX_CMP_EN;
581  	else
582  		reg_val &= ~RKISP1_CIF_ISP_AWB_YMAX_CMP_EN;
583  	reg_val &= ~RKISP1_CIF_ISP_AWB_SET_FRAMES_MASK_V12;
584  	reg_val |= RKISP1_CIF_ISP_AWB_SET_FRAMES_V12(arg->frames);
585  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12, reg_val);
586  
587  	/* window offset */
588  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_OFFS_V12,
589  		     arg->awb_wnd.v_offs << 16 | arg->awb_wnd.h_offs);
590  	/* AWB window size */
591  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_SIZE_V12,
592  		     arg->awb_wnd.v_size << 16 | arg->awb_wnd.h_size);
593  }
594  
595  static void
rkisp1_awb_meas_enable_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_awb_meas_config * arg,bool en)596  rkisp1_awb_meas_enable_v10(struct rkisp1_params *params,
597  			   const struct rkisp1_cif_isp_awb_meas_config *arg,
598  			   bool en)
599  {
600  	u32 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10);
601  
602  	/* switch off */
603  	reg_val &= RKISP1_CIF_ISP_AWB_MODE_MASK_NONE;
604  
605  	if (en) {
606  		if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_RGB)
607  			reg_val |= RKISP1_CIF_ISP_AWB_MODE_RGB_EN;
608  		else
609  			reg_val |= RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN;
610  
611  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10,
612  			     reg_val);
613  
614  		/* Measurements require AWB block be active. */
615  		rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
616  				      RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
617  	} else {
618  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10,
619  			     reg_val);
620  		rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
621  					RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
622  	}
623  }
624  
625  static void
rkisp1_awb_meas_enable_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_awb_meas_config * arg,bool en)626  rkisp1_awb_meas_enable_v12(struct rkisp1_params *params,
627  			   const struct rkisp1_cif_isp_awb_meas_config *arg,
628  			   bool en)
629  {
630  	u32 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12);
631  
632  	/* switch off */
633  	reg_val &= RKISP1_CIF_ISP_AWB_MODE_MASK_NONE;
634  
635  	if (en) {
636  		if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_RGB)
637  			reg_val |= RKISP1_CIF_ISP_AWB_MODE_RGB_EN;
638  		else
639  			reg_val |= RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN;
640  
641  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12,
642  			     reg_val);
643  
644  		/* Measurements require AWB block be active. */
645  		rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
646  				      RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
647  	} else {
648  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12,
649  			     reg_val);
650  		rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
651  					RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
652  	}
653  }
654  
655  static void
rkisp1_awb_gain_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_awb_gain_config * arg)656  rkisp1_awb_gain_config_v10(struct rkisp1_params *params,
657  			   const struct rkisp1_cif_isp_awb_gain_config *arg)
658  {
659  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_G_V10,
660  		     RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) |
661  		     arg->gain_green_b);
662  
663  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_RB_V10,
664  		     RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) |
665  		     arg->gain_blue);
666  }
667  
668  static void
rkisp1_awb_gain_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_awb_gain_config * arg)669  rkisp1_awb_gain_config_v12(struct rkisp1_params *params,
670  			   const struct rkisp1_cif_isp_awb_gain_config *arg)
671  {
672  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_G_V12,
673  		     RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) |
674  		     arg->gain_green_b);
675  
676  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_RB_V12,
677  		     RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) |
678  		     arg->gain_blue);
679  }
680  
rkisp1_aec_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_aec_config * arg)681  static void rkisp1_aec_config_v10(struct rkisp1_params *params,
682  				  const struct rkisp1_cif_isp_aec_config *arg)
683  {
684  	unsigned int block_hsize, block_vsize;
685  	u32 exp_ctrl;
686  
687  	/* avoid to override the old enable value */
688  	exp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL);
689  	exp_ctrl &= RKISP1_CIF_ISP_EXP_ENA;
690  	if (arg->autostop)
691  		exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP;
692  	if (arg->mode == RKISP1_CIF_ISP_EXP_MEASURING_MODE_1)
693  		exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_MEASMODE_1;
694  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL, exp_ctrl);
695  
696  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_H_OFFSET_V10,
697  		     arg->meas_window.h_offs);
698  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_V_OFFSET_V10,
699  		     arg->meas_window.v_offs);
700  
701  	block_hsize = arg->meas_window.h_size /
702  		      RKISP1_CIF_ISP_EXP_COLUMN_NUM_V10 - 1;
703  	block_vsize = arg->meas_window.v_size /
704  		      RKISP1_CIF_ISP_EXP_ROW_NUM_V10 - 1;
705  
706  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_H_SIZE_V10,
707  		     RKISP1_CIF_ISP_EXP_H_SIZE_SET_V10(block_hsize));
708  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_V_SIZE_V10,
709  		     RKISP1_CIF_ISP_EXP_V_SIZE_SET_V10(block_vsize));
710  }
711  
rkisp1_aec_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_aec_config * arg)712  static void rkisp1_aec_config_v12(struct rkisp1_params *params,
713  			       const struct rkisp1_cif_isp_aec_config *arg)
714  {
715  	u32 exp_ctrl;
716  	u32 block_hsize, block_vsize;
717  	u32 wnd_num_idx = 1;
718  	static const u32 ae_wnd_num[] = { 5, 9, 15, 15 };
719  
720  	/* avoid to override the old enable value */
721  	exp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL);
722  	exp_ctrl &= RKISP1_CIF_ISP_EXP_ENA;
723  	if (arg->autostop)
724  		exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP;
725  	if (arg->mode == RKISP1_CIF_ISP_EXP_MEASURING_MODE_1)
726  		exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_MEASMODE_1;
727  	exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_WNDNUM_SET_V12(wnd_num_idx);
728  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL, exp_ctrl);
729  
730  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_OFFS_V12,
731  		     RKISP1_CIF_ISP_EXP_V_OFFSET_SET_V12(arg->meas_window.v_offs) |
732  		     RKISP1_CIF_ISP_EXP_H_OFFSET_SET_V12(arg->meas_window.h_offs));
733  
734  	block_hsize = arg->meas_window.h_size / ae_wnd_num[wnd_num_idx] - 1;
735  	block_vsize = arg->meas_window.v_size / ae_wnd_num[wnd_num_idx] - 1;
736  
737  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_SIZE_V12,
738  		     RKISP1_CIF_ISP_EXP_V_SIZE_SET_V12(block_vsize) |
739  		     RKISP1_CIF_ISP_EXP_H_SIZE_SET_V12(block_hsize));
740  }
741  
rkisp1_cproc_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_cproc_config * arg)742  static void rkisp1_cproc_config(struct rkisp1_params *params,
743  				const struct rkisp1_cif_isp_cproc_config *arg)
744  {
745  	struct rkisp1_cif_isp_isp_other_cfg *cur_other_cfg =
746  		container_of(arg, struct rkisp1_cif_isp_isp_other_cfg, cproc_config);
747  	struct rkisp1_cif_isp_ie_config *cur_ie_config =
748  						&cur_other_cfg->ie_config;
749  	u32 effect = cur_ie_config->effect;
750  	u32 quantization = params->quantization;
751  
752  	rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_CONTRAST,
753  		     arg->contrast);
754  	rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_HUE, arg->hue);
755  	rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_SATURATION, arg->sat);
756  	rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_BRIGHTNESS,
757  		     arg->brightness);
758  
759  	if (quantization != V4L2_QUANTIZATION_FULL_RANGE ||
760  	    effect != V4L2_COLORFX_NONE) {
761  		rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL,
762  					RKISP1_CIF_C_PROC_YOUT_FULL |
763  					RKISP1_CIF_C_PROC_YIN_FULL |
764  					RKISP1_CIF_C_PROC_COUT_FULL);
765  	} else {
766  		rkisp1_param_set_bits(params, RKISP1_CIF_C_PROC_CTRL,
767  				      RKISP1_CIF_C_PROC_YOUT_FULL |
768  				      RKISP1_CIF_C_PROC_YIN_FULL |
769  				      RKISP1_CIF_C_PROC_COUT_FULL);
770  	}
771  }
772  
rkisp1_hst_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_hst_config * arg)773  static void rkisp1_hst_config_v10(struct rkisp1_params *params,
774  				  const struct rkisp1_cif_isp_hst_config *arg)
775  {
776  	unsigned int block_hsize, block_vsize;
777  	static const u32 hist_weight_regs[] = {
778  		RKISP1_CIF_ISP_HIST_WEIGHT_00TO30_V10,
779  		RKISP1_CIF_ISP_HIST_WEIGHT_40TO21_V10,
780  		RKISP1_CIF_ISP_HIST_WEIGHT_31TO12_V10,
781  		RKISP1_CIF_ISP_HIST_WEIGHT_22TO03_V10,
782  		RKISP1_CIF_ISP_HIST_WEIGHT_13TO43_V10,
783  		RKISP1_CIF_ISP_HIST_WEIGHT_04TO34_V10,
784  	};
785  	const u8 *weight;
786  	unsigned int i;
787  	u32 hist_prop;
788  
789  	/* avoid to override the old enable value */
790  	hist_prop = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_HIST_PROP_V10);
791  	hist_prop &= RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10;
792  	hist_prop |= RKISP1_CIF_ISP_HIST_PREDIV_SET_V10(arg->histogram_predivider);
793  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_PROP_V10, hist_prop);
794  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_H_OFFS_V10,
795  		     arg->meas_window.h_offs);
796  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_V_OFFS_V10,
797  		     arg->meas_window.v_offs);
798  
799  	block_hsize = arg->meas_window.h_size /
800  		      RKISP1_CIF_ISP_HIST_COLUMN_NUM_V10 - 1;
801  	block_vsize = arg->meas_window.v_size / RKISP1_CIF_ISP_HIST_ROW_NUM_V10 - 1;
802  
803  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_H_SIZE_V10,
804  		     block_hsize);
805  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_V_SIZE_V10,
806  		     block_vsize);
807  
808  	weight = arg->hist_weight;
809  	for (i = 0; i < ARRAY_SIZE(hist_weight_regs); ++i, weight += 4)
810  		rkisp1_write(params->rkisp1, hist_weight_regs[i],
811  			     RKISP1_CIF_ISP_HIST_WEIGHT_SET_V10(weight[0], weight[1],
812  								weight[2], weight[3]));
813  
814  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_WEIGHT_44_V10,
815  		     weight[0] & 0x1F);
816  }
817  
rkisp1_hst_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_hst_config * arg)818  static void rkisp1_hst_config_v12(struct rkisp1_params *params,
819  				  const struct rkisp1_cif_isp_hst_config *arg)
820  {
821  	unsigned int i, j;
822  	u32 block_hsize, block_vsize;
823  	u32 wnd_num_idx, hist_weight_num, hist_ctrl, value;
824  	u8 weight15x15[RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12];
825  	static const u32 hist_wnd_num[] = { 5, 9, 15, 15 };
826  
827  	/* now we just support 9x9 window */
828  	wnd_num_idx = 1;
829  	memset(weight15x15, 0x00, sizeof(weight15x15));
830  	/* avoid to override the old enable value */
831  	hist_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_HIST_CTRL_V12);
832  	hist_ctrl &= RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 |
833  		     RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12;
834  	hist_ctrl = hist_ctrl |
835  		    RKISP1_CIF_ISP_HIST_CTRL_INTRSEL_SET_V12(1) |
836  		    RKISP1_CIF_ISP_HIST_CTRL_DATASEL_SET_V12(0) |
837  		    RKISP1_CIF_ISP_HIST_CTRL_WATERLINE_SET_V12(0) |
838  		    RKISP1_CIF_ISP_HIST_CTRL_AUTOSTOP_SET_V12(0) |
839  		    RKISP1_CIF_ISP_HIST_CTRL_WNDNUM_SET_V12(1) |
840  		    RKISP1_CIF_ISP_HIST_CTRL_STEPSIZE_SET_V12(arg->histogram_predivider);
841  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_CTRL_V12, hist_ctrl);
842  
843  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_OFFS_V12,
844  		     RKISP1_CIF_ISP_HIST_OFFS_SET_V12(arg->meas_window.h_offs,
845  						      arg->meas_window.v_offs));
846  
847  	block_hsize = arg->meas_window.h_size / hist_wnd_num[wnd_num_idx] - 1;
848  	block_vsize = arg->meas_window.v_size / hist_wnd_num[wnd_num_idx] - 1;
849  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_SIZE_V12,
850  		     RKISP1_CIF_ISP_HIST_SIZE_SET_V12(block_hsize, block_vsize));
851  
852  	for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
853  		for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
854  			weight15x15[i * RKISP1_CIF_ISP_HIST_ROW_NUM_V12 + j] =
855  				arg->hist_weight[i * hist_wnd_num[wnd_num_idx] + j];
856  		}
857  	}
858  
859  	hist_weight_num = RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12;
860  	for (i = 0; i < (hist_weight_num / 4); i++) {
861  		value = RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12(
862  				 weight15x15[4 * i + 0],
863  				 weight15x15[4 * i + 1],
864  				 weight15x15[4 * i + 2],
865  				 weight15x15[4 * i + 3]);
866  		rkisp1_write(params->rkisp1,
867  			     RKISP1_CIF_ISP_HIST_WEIGHT_V12 + 4 * i, value);
868  	}
869  	value = RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12(weight15x15[4 * i + 0], 0, 0, 0);
870  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_WEIGHT_V12 + 4 * i,
871  		     value);
872  }
873  
874  static void
rkisp1_hst_enable_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_hst_config * arg,bool en)875  rkisp1_hst_enable_v10(struct rkisp1_params *params,
876  		      const struct rkisp1_cif_isp_hst_config *arg, bool en)
877  {
878  	if (en)	{
879  		u32 hist_prop = rkisp1_read(params->rkisp1,
880  					    RKISP1_CIF_ISP_HIST_PROP_V10);
881  
882  		hist_prop &= ~RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10;
883  		hist_prop |= arg->mode;
884  		rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10,
885  				      hist_prop);
886  	} else {
887  		rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10,
888  					RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10);
889  	}
890  }
891  
892  static void
rkisp1_hst_enable_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_hst_config * arg,bool en)893  rkisp1_hst_enable_v12(struct rkisp1_params *params,
894  		      const struct rkisp1_cif_isp_hst_config *arg, bool en)
895  {
896  	if (en) {
897  		u32 hist_ctrl = rkisp1_read(params->rkisp1,
898  					    RKISP1_CIF_ISP_HIST_CTRL_V12);
899  
900  		hist_ctrl &= ~RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12;
901  		hist_ctrl |= RKISP1_CIF_ISP_HIST_CTRL_MODE_SET_V12(arg->mode);
902  		hist_ctrl |= RKISP1_CIF_ISP_HIST_CTRL_EN_SET_V12(1);
903  		rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_CTRL_V12,
904  				      hist_ctrl);
905  	} else {
906  		rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_CTRL_V12,
907  					RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 |
908  					RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12);
909  	}
910  }
911  
rkisp1_afm_config_v10(struct rkisp1_params * params,const struct rkisp1_cif_isp_afc_config * arg)912  static void rkisp1_afm_config_v10(struct rkisp1_params *params,
913  				  const struct rkisp1_cif_isp_afc_config *arg)
914  {
915  	size_t num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win),
916  				  arg->num_afm_win);
917  	u32 afm_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL);
918  	unsigned int i;
919  
920  	/* Switch off to configure. */
921  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
922  				RKISP1_CIF_ISP_AFM_ENA);
923  
924  	for (i = 0; i < num_of_win; i++) {
925  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_LT_A + i * 8,
926  			     RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_offs) |
927  			     RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_offs));
928  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_RB_A + i * 8,
929  			     RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_size +
930  							 arg->afm_win[i].h_offs) |
931  			     RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_size +
932  							 arg->afm_win[i].v_offs));
933  	}
934  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_THRES, arg->thres);
935  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_VAR_SHIFT,
936  		     arg->var_shift);
937  	/* restore afm status */
938  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL, afm_ctrl);
939  }
940  
rkisp1_afm_config_v12(struct rkisp1_params * params,const struct rkisp1_cif_isp_afc_config * arg)941  static void rkisp1_afm_config_v12(struct rkisp1_params *params,
942  				  const struct rkisp1_cif_isp_afc_config *arg)
943  {
944  	size_t num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win),
945  				  arg->num_afm_win);
946  	u32 afm_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL);
947  	u32 lum_var_shift, afm_var_shift;
948  	unsigned int i;
949  
950  	/* Switch off to configure. */
951  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
952  				RKISP1_CIF_ISP_AFM_ENA);
953  
954  	for (i = 0; i < num_of_win; i++) {
955  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_LT_A + i * 8,
956  			     RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_offs) |
957  			     RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_offs));
958  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_RB_A + i * 8,
959  			     RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_size +
960  							 arg->afm_win[i].h_offs) |
961  			     RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_size +
962  							 arg->afm_win[i].v_offs));
963  	}
964  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_THRES, arg->thres);
965  
966  	lum_var_shift = RKISP1_CIF_ISP_AFM_GET_LUM_SHIFT_a_V12(arg->var_shift);
967  	afm_var_shift = RKISP1_CIF_ISP_AFM_GET_AFM_SHIFT_a_V12(arg->var_shift);
968  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_VAR_SHIFT,
969  		     RKISP1_CIF_ISP_AFM_SET_SHIFT_a_V12(lum_var_shift, afm_var_shift) |
970  		     RKISP1_CIF_ISP_AFM_SET_SHIFT_b_V12(lum_var_shift, afm_var_shift) |
971  		     RKISP1_CIF_ISP_AFM_SET_SHIFT_c_V12(lum_var_shift, afm_var_shift));
972  
973  	/* restore afm status */
974  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL, afm_ctrl);
975  }
976  
rkisp1_ie_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_ie_config * arg)977  static void rkisp1_ie_config(struct rkisp1_params *params,
978  			     const struct rkisp1_cif_isp_ie_config *arg)
979  {
980  	u32 eff_ctrl;
981  
982  	eff_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL);
983  	eff_ctrl &= ~RKISP1_CIF_IMG_EFF_CTRL_MODE_MASK;
984  
985  	if (params->quantization == V4L2_QUANTIZATION_FULL_RANGE)
986  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_YCBCR_FULL;
987  
988  	switch (arg->effect) {
989  	case V4L2_COLORFX_SEPIA:
990  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SEPIA;
991  		break;
992  	case V4L2_COLORFX_SET_CBCR:
993  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_TINT,
994  			     arg->eff_tint);
995  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SEPIA;
996  		break;
997  		/*
998  		 * Color selection is similar to water color(AQUA):
999  		 * grayscale + selected color w threshold
1000  		 */
1001  	case V4L2_COLORFX_AQUA:
1002  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_COLOR_SEL;
1003  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_COLOR_SEL,
1004  			     arg->color_sel);
1005  		break;
1006  	case V4L2_COLORFX_EMBOSS:
1007  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_EMBOSS;
1008  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_1,
1009  			     arg->eff_mat_1);
1010  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_2,
1011  			     arg->eff_mat_2);
1012  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_3,
1013  			     arg->eff_mat_3);
1014  		break;
1015  	case V4L2_COLORFX_SKETCH:
1016  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SKETCH;
1017  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_3,
1018  			     arg->eff_mat_3);
1019  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_4,
1020  			     arg->eff_mat_4);
1021  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_5,
1022  			     arg->eff_mat_5);
1023  		break;
1024  	case V4L2_COLORFX_BW:
1025  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_BLACKWHITE;
1026  		break;
1027  	case V4L2_COLORFX_NEGATIVE:
1028  		eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_NEGATIVE;
1029  		break;
1030  	default:
1031  		break;
1032  	}
1033  
1034  	rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL, eff_ctrl);
1035  }
1036  
rkisp1_ie_enable(struct rkisp1_params * params,bool en)1037  static void rkisp1_ie_enable(struct rkisp1_params *params, bool en)
1038  {
1039  	if (en) {
1040  		rkisp1_param_set_bits(params, RKISP1_CIF_VI_ICCL,
1041  				      RKISP1_CIF_VI_ICCL_IE_CLK);
1042  		rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL,
1043  			     RKISP1_CIF_IMG_EFF_CTRL_ENABLE);
1044  		rkisp1_param_set_bits(params, RKISP1_CIF_IMG_EFF_CTRL,
1045  				      RKISP1_CIF_IMG_EFF_CTRL_CFG_UPD);
1046  	} else {
1047  		rkisp1_param_clear_bits(params, RKISP1_CIF_IMG_EFF_CTRL,
1048  					RKISP1_CIF_IMG_EFF_CTRL_ENABLE);
1049  		rkisp1_param_clear_bits(params, RKISP1_CIF_VI_ICCL,
1050  					RKISP1_CIF_VI_ICCL_IE_CLK);
1051  	}
1052  }
1053  
rkisp1_csm_config(struct rkisp1_params * params)1054  static void rkisp1_csm_config(struct rkisp1_params *params)
1055  {
1056  	struct csm_coeffs {
1057  		u16 limited[9];
1058  		u16 full[9];
1059  	};
1060  	static const struct csm_coeffs rec601_coeffs = {
1061  		.limited = {
1062  			0x0021, 0x0042, 0x000d,
1063  			0x01ed, 0x01db, 0x0038,
1064  			0x0038, 0x01d1, 0x01f7,
1065  		},
1066  		.full = {
1067  			0x0026, 0x004b, 0x000f,
1068  			0x01ea, 0x01d6, 0x0040,
1069  			0x0040, 0x01ca, 0x01f6,
1070  		},
1071  	};
1072  	static const struct csm_coeffs rec709_coeffs = {
1073  		.limited = {
1074  			0x0018, 0x0050, 0x0008,
1075  			0x01f3, 0x01d5, 0x0038,
1076  			0x0038, 0x01cd, 0x01fb,
1077  		},
1078  		.full = {
1079  			0x001b, 0x005c, 0x0009,
1080  			0x01f1, 0x01cf, 0x0040,
1081  			0x0040, 0x01c6, 0x01fa,
1082  		},
1083  	};
1084  	static const struct csm_coeffs rec2020_coeffs = {
1085  		.limited = {
1086  			0x001d, 0x004c, 0x0007,
1087  			0x01f0, 0x01d8, 0x0038,
1088  			0x0038, 0x01cd, 0x01fb,
1089  		},
1090  		.full = {
1091  			0x0022, 0x0057, 0x0008,
1092  			0x01ee, 0x01d2, 0x0040,
1093  			0x0040, 0x01c5, 0x01fb,
1094  		},
1095  	};
1096  	static const struct csm_coeffs smpte240m_coeffs = {
1097  		.limited = {
1098  			0x0018, 0x004f, 0x000a,
1099  			0x01f3, 0x01d5, 0x0038,
1100  			0x0038, 0x01ce, 0x01fa,
1101  		},
1102  		.full = {
1103  			0x001b, 0x005a, 0x000b,
1104  			0x01f1, 0x01cf, 0x0040,
1105  			0x0040, 0x01c7, 0x01f9,
1106  		},
1107  	};
1108  
1109  	const struct csm_coeffs *coeffs;
1110  	const u16 *csm;
1111  	unsigned int i;
1112  
1113  	switch (params->ycbcr_encoding) {
1114  	case V4L2_YCBCR_ENC_601:
1115  	default:
1116  		coeffs = &rec601_coeffs;
1117  		break;
1118  	case V4L2_YCBCR_ENC_709:
1119  		coeffs = &rec709_coeffs;
1120  		break;
1121  	case V4L2_YCBCR_ENC_BT2020:
1122  		coeffs = &rec2020_coeffs;
1123  		break;
1124  	case V4L2_YCBCR_ENC_SMPTE240M:
1125  		coeffs = &smpte240m_coeffs;
1126  		break;
1127  	}
1128  
1129  	if (params->quantization == V4L2_QUANTIZATION_FULL_RANGE) {
1130  		csm = coeffs->full;
1131  		rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
1132  				      RKISP1_CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1133  				      RKISP1_CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA);
1134  	} else {
1135  		csm = coeffs->limited;
1136  		rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1137  					RKISP1_CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1138  					RKISP1_CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA);
1139  	}
1140  
1141  	for (i = 0; i < 9; i++)
1142  		rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CC_COEFF_0 + i * 4,
1143  			     csm[i]);
1144  }
1145  
1146  /* ISP De-noise Pre-Filter(DPF) function */
rkisp1_dpf_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_dpf_config * arg)1147  static void rkisp1_dpf_config(struct rkisp1_params *params,
1148  			      const struct rkisp1_cif_isp_dpf_config *arg)
1149  {
1150  	unsigned int isp_dpf_mode, spatial_coeff, i;
1151  
1152  	switch (arg->gain.mode) {
1153  	case RKISP1_CIF_ISP_DPF_GAIN_USAGE_NF_GAINS:
1154  		isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_USE_NF_GAIN |
1155  			       RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP;
1156  		break;
1157  	case RKISP1_CIF_ISP_DPF_GAIN_USAGE_LSC_GAINS:
1158  		isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP;
1159  		break;
1160  	case RKISP1_CIF_ISP_DPF_GAIN_USAGE_NF_LSC_GAINS:
1161  		isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_USE_NF_GAIN |
1162  			       RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP |
1163  			       RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP;
1164  		break;
1165  	case RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_GAINS:
1166  		isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP;
1167  		break;
1168  	case RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_LSC_GAINS:
1169  		isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP |
1170  			       RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP;
1171  		break;
1172  	case RKISP1_CIF_ISP_DPF_GAIN_USAGE_DISABLED:
1173  	default:
1174  		isp_dpf_mode = 0;
1175  		break;
1176  	}
1177  
1178  	if (arg->nll.scale_mode == RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC)
1179  		isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_NLL_SEGMENTATION;
1180  	if (arg->rb_flt.fltsize == RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9)
1181  		isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_RB_FLTSIZE_9x9;
1182  	if (!arg->rb_flt.r_enable)
1183  		isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_R_FLT_DIS;
1184  	if (!arg->rb_flt.b_enable)
1185  		isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_B_FLT_DIS;
1186  	if (!arg->g_flt.gb_enable)
1187  		isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_GB_FLT_DIS;
1188  	if (!arg->g_flt.gr_enable)
1189  		isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_GR_FLT_DIS;
1190  
1191  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_DPF_MODE,
1192  			      isp_dpf_mode);
1193  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_B,
1194  		     arg->gain.nf_b_gain);
1195  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_R,
1196  		     arg->gain.nf_r_gain);
1197  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_GB,
1198  		     arg->gain.nf_gb_gain);
1199  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_GR,
1200  		     arg->gain.nf_gr_gain);
1201  
1202  	for (i = 0; i < RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS; i++) {
1203  		rkisp1_write(params->rkisp1,
1204  			     RKISP1_CIF_ISP_DPF_NULL_COEFF_0 + i * 4,
1205  			     arg->nll.coeff[i]);
1206  	}
1207  
1208  	spatial_coeff = arg->g_flt.spatial_coeff[0] |
1209  			(arg->g_flt.spatial_coeff[1] << 8) |
1210  			(arg->g_flt.spatial_coeff[2] << 16) |
1211  			(arg->g_flt.spatial_coeff[3] << 24);
1212  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_G_1_4,
1213  		     spatial_coeff);
1214  
1215  	spatial_coeff = arg->g_flt.spatial_coeff[4] |
1216  			(arg->g_flt.spatial_coeff[5] << 8);
1217  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_G_5_6,
1218  		     spatial_coeff);
1219  
1220  	spatial_coeff = arg->rb_flt.spatial_coeff[0] |
1221  			(arg->rb_flt.spatial_coeff[1] << 8) |
1222  			(arg->rb_flt.spatial_coeff[2] << 16) |
1223  			(arg->rb_flt.spatial_coeff[3] << 24);
1224  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_RB_1_4,
1225  		     spatial_coeff);
1226  
1227  	spatial_coeff = arg->rb_flt.spatial_coeff[4] |
1228  			(arg->rb_flt.spatial_coeff[5] << 8);
1229  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_RB_5_6,
1230  		     spatial_coeff);
1231  }
1232  
1233  static void
rkisp1_dpf_strength_config(struct rkisp1_params * params,const struct rkisp1_cif_isp_dpf_strength_config * arg)1234  rkisp1_dpf_strength_config(struct rkisp1_params *params,
1235  			   const struct rkisp1_cif_isp_dpf_strength_config *arg)
1236  {
1237  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_STRENGTH_B, arg->b);
1238  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_STRENGTH_G, arg->g);
1239  	rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_STRENGTH_R, arg->r);
1240  }
1241  
1242  static void
rkisp1_isp_isr_other_config(struct rkisp1_params * params,const struct rkisp1_params_cfg * new_params)1243  rkisp1_isp_isr_other_config(struct rkisp1_params *params,
1244  			    const struct rkisp1_params_cfg *new_params)
1245  {
1246  	unsigned int module_en_update, module_cfg_update, module_ens;
1247  
1248  	module_en_update = new_params->module_en_update;
1249  	module_cfg_update = new_params->module_cfg_update;
1250  	module_ens = new_params->module_ens;
1251  
1252  	/* update dpc config */
1253  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPCC)
1254  		rkisp1_dpcc_config(params,
1255  				   &new_params->others.dpcc_config);
1256  
1257  	if (module_en_update & RKISP1_CIF_ISP_MODULE_DPCC) {
1258  		if (module_ens & RKISP1_CIF_ISP_MODULE_DPCC)
1259  			rkisp1_param_set_bits(params,
1260  					      RKISP1_CIF_ISP_DPCC_MODE,
1261  					      RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE);
1262  		else
1263  			rkisp1_param_clear_bits(params,
1264  						RKISP1_CIF_ISP_DPCC_MODE,
1265  						RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE);
1266  	}
1267  
1268  	/* update bls config */
1269  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_BLS)
1270  		rkisp1_bls_config(params,
1271  				  &new_params->others.bls_config);
1272  
1273  	if (module_en_update & RKISP1_CIF_ISP_MODULE_BLS) {
1274  		if (module_ens & RKISP1_CIF_ISP_MODULE_BLS)
1275  			rkisp1_param_set_bits(params,
1276  					      RKISP1_CIF_ISP_BLS_CTRL,
1277  					      RKISP1_CIF_ISP_BLS_ENA);
1278  		else
1279  			rkisp1_param_clear_bits(params,
1280  						RKISP1_CIF_ISP_BLS_CTRL,
1281  						RKISP1_CIF_ISP_BLS_ENA);
1282  	}
1283  
1284  	/* update sdg config */
1285  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_SDG)
1286  		rkisp1_sdg_config(params,
1287  				  &new_params->others.sdg_config);
1288  
1289  	if (module_en_update & RKISP1_CIF_ISP_MODULE_SDG) {
1290  		if (module_ens & RKISP1_CIF_ISP_MODULE_SDG)
1291  			rkisp1_param_set_bits(params,
1292  					      RKISP1_CIF_ISP_CTRL,
1293  					      RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA);
1294  		else
1295  			rkisp1_param_clear_bits(params,
1296  						RKISP1_CIF_ISP_CTRL,
1297  						RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA);
1298  	}
1299  
1300  	/* update awb gains */
1301  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN)
1302  		params->ops->awb_gain_config(params, &new_params->others.awb_gain_config);
1303  
1304  	if (module_en_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN) {
1305  		if (module_ens & RKISP1_CIF_ISP_MODULE_AWB_GAIN)
1306  			rkisp1_param_set_bits(params,
1307  					      RKISP1_CIF_ISP_CTRL,
1308  					      RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
1309  		else
1310  			rkisp1_param_clear_bits(params,
1311  						RKISP1_CIF_ISP_CTRL,
1312  						RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
1313  	}
1314  
1315  	/* update bdm config */
1316  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_BDM)
1317  		rkisp1_bdm_config(params,
1318  				  &new_params->others.bdm_config);
1319  
1320  	if (module_en_update & RKISP1_CIF_ISP_MODULE_BDM) {
1321  		if (module_ens & RKISP1_CIF_ISP_MODULE_BDM)
1322  			rkisp1_param_set_bits(params,
1323  					      RKISP1_CIF_ISP_DEMOSAIC,
1324  					      RKISP1_CIF_ISP_DEMOSAIC_BYPASS);
1325  		else
1326  			rkisp1_param_clear_bits(params,
1327  						RKISP1_CIF_ISP_DEMOSAIC,
1328  						RKISP1_CIF_ISP_DEMOSAIC_BYPASS);
1329  	}
1330  
1331  	/* update filter config */
1332  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_FLT)
1333  		rkisp1_flt_config(params,
1334  				  &new_params->others.flt_config);
1335  
1336  	if (module_en_update & RKISP1_CIF_ISP_MODULE_FLT) {
1337  		if (module_ens & RKISP1_CIF_ISP_MODULE_FLT)
1338  			rkisp1_param_set_bits(params,
1339  					      RKISP1_CIF_ISP_FILT_MODE,
1340  					      RKISP1_CIF_ISP_FLT_ENA);
1341  		else
1342  			rkisp1_param_clear_bits(params,
1343  						RKISP1_CIF_ISP_FILT_MODE,
1344  						RKISP1_CIF_ISP_FLT_ENA);
1345  	}
1346  
1347  	/* update ctk config */
1348  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_CTK)
1349  		rkisp1_ctk_config(params,
1350  				  &new_params->others.ctk_config);
1351  
1352  	if (module_en_update & RKISP1_CIF_ISP_MODULE_CTK)
1353  		rkisp1_ctk_enable(params, !!(module_ens & RKISP1_CIF_ISP_MODULE_CTK));
1354  
1355  	/* update goc config */
1356  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_GOC)
1357  		params->ops->goc_config(params, &new_params->others.goc_config);
1358  
1359  	if (module_en_update & RKISP1_CIF_ISP_MODULE_GOC) {
1360  		if (module_ens & RKISP1_CIF_ISP_MODULE_GOC)
1361  			rkisp1_param_set_bits(params,
1362  					      RKISP1_CIF_ISP_CTRL,
1363  					      RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
1364  		else
1365  			rkisp1_param_clear_bits(params,
1366  						RKISP1_CIF_ISP_CTRL,
1367  						RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
1368  	}
1369  
1370  	/* update cproc config */
1371  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_CPROC)
1372  		rkisp1_cproc_config(params,
1373  				    &new_params->others.cproc_config);
1374  
1375  	if (module_en_update & RKISP1_CIF_ISP_MODULE_CPROC) {
1376  		if (module_ens & RKISP1_CIF_ISP_MODULE_CPROC)
1377  			rkisp1_param_set_bits(params,
1378  					      RKISP1_CIF_C_PROC_CTRL,
1379  					      RKISP1_CIF_C_PROC_CTR_ENABLE);
1380  		else
1381  			rkisp1_param_clear_bits(params,
1382  						RKISP1_CIF_C_PROC_CTRL,
1383  						RKISP1_CIF_C_PROC_CTR_ENABLE);
1384  	}
1385  
1386  	/* update ie config */
1387  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_IE)
1388  		rkisp1_ie_config(params, &new_params->others.ie_config);
1389  
1390  	if (module_en_update & RKISP1_CIF_ISP_MODULE_IE)
1391  		rkisp1_ie_enable(params, !!(module_ens & RKISP1_CIF_ISP_MODULE_IE));
1392  
1393  	/* update dpf config */
1394  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF)
1395  		rkisp1_dpf_config(params, &new_params->others.dpf_config);
1396  
1397  	if (module_en_update & RKISP1_CIF_ISP_MODULE_DPF) {
1398  		if (module_ens & RKISP1_CIF_ISP_MODULE_DPF)
1399  			rkisp1_param_set_bits(params,
1400  					      RKISP1_CIF_ISP_DPF_MODE,
1401  					      RKISP1_CIF_ISP_DPF_MODE_EN);
1402  		else
1403  			rkisp1_param_clear_bits(params,
1404  						RKISP1_CIF_ISP_DPF_MODE,
1405  						RKISP1_CIF_ISP_DPF_MODE_EN);
1406  	}
1407  
1408  	if ((module_en_update & RKISP1_CIF_ISP_MODULE_DPF_STRENGTH) ||
1409  	    (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF_STRENGTH)) {
1410  		/* update dpf strength config */
1411  		rkisp1_dpf_strength_config(params,
1412  					   &new_params->others.dpf_strength_config);
1413  	}
1414  }
1415  
1416  static void
rkisp1_isp_isr_lsc_config(struct rkisp1_params * params,const struct rkisp1_params_cfg * new_params)1417  rkisp1_isp_isr_lsc_config(struct rkisp1_params *params,
1418  			  const struct rkisp1_params_cfg *new_params)
1419  {
1420  	unsigned int module_en_update, module_cfg_update, module_ens;
1421  
1422  	module_en_update = new_params->module_en_update;
1423  	module_cfg_update = new_params->module_cfg_update;
1424  	module_ens = new_params->module_ens;
1425  
1426  	/* update lsc config */
1427  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_LSC)
1428  		rkisp1_lsc_config(params,
1429  				  &new_params->others.lsc_config);
1430  
1431  	if (module_en_update & RKISP1_CIF_ISP_MODULE_LSC) {
1432  		if (module_ens & RKISP1_CIF_ISP_MODULE_LSC)
1433  			rkisp1_param_set_bits(params,
1434  					      RKISP1_CIF_ISP_LSC_CTRL,
1435  					      RKISP1_CIF_ISP_LSC_CTRL_ENA);
1436  		else
1437  			rkisp1_param_clear_bits(params,
1438  						RKISP1_CIF_ISP_LSC_CTRL,
1439  						RKISP1_CIF_ISP_LSC_CTRL_ENA);
1440  	}
1441  }
1442  
rkisp1_isp_isr_meas_config(struct rkisp1_params * params,struct rkisp1_params_cfg * new_params)1443  static void rkisp1_isp_isr_meas_config(struct rkisp1_params *params,
1444  				       struct  rkisp1_params_cfg *new_params)
1445  {
1446  	unsigned int module_en_update, module_cfg_update, module_ens;
1447  
1448  	module_en_update = new_params->module_en_update;
1449  	module_cfg_update = new_params->module_cfg_update;
1450  	module_ens = new_params->module_ens;
1451  
1452  	/* update awb config */
1453  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB)
1454  		params->ops->awb_meas_config(params, &new_params->meas.awb_meas_config);
1455  
1456  	if (module_en_update & RKISP1_CIF_ISP_MODULE_AWB)
1457  		params->ops->awb_meas_enable(params,
1458  					     &new_params->meas.awb_meas_config,
1459  					     !!(module_ens & RKISP1_CIF_ISP_MODULE_AWB));
1460  
1461  	/* update afc config */
1462  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AFC)
1463  		params->ops->afm_config(params,
1464  					&new_params->meas.afc_config);
1465  
1466  	if (module_en_update & RKISP1_CIF_ISP_MODULE_AFC) {
1467  		if (module_ens & RKISP1_CIF_ISP_MODULE_AFC)
1468  			rkisp1_param_set_bits(params,
1469  					      RKISP1_CIF_ISP_AFM_CTRL,
1470  					      RKISP1_CIF_ISP_AFM_ENA);
1471  		else
1472  			rkisp1_param_clear_bits(params,
1473  						RKISP1_CIF_ISP_AFM_CTRL,
1474  						RKISP1_CIF_ISP_AFM_ENA);
1475  	}
1476  
1477  	/* update hst config */
1478  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_HST)
1479  		params->ops->hst_config(params,
1480  					&new_params->meas.hst_config);
1481  
1482  	if (module_en_update & RKISP1_CIF_ISP_MODULE_HST)
1483  		params->ops->hst_enable(params,
1484  					&new_params->meas.hst_config,
1485  					!!(module_ens & RKISP1_CIF_ISP_MODULE_HST));
1486  
1487  	/* update aec config */
1488  	if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AEC)
1489  		params->ops->aec_config(params,
1490  					&new_params->meas.aec_config);
1491  
1492  	if (module_en_update & RKISP1_CIF_ISP_MODULE_AEC) {
1493  		if (module_ens & RKISP1_CIF_ISP_MODULE_AEC)
1494  			rkisp1_param_set_bits(params,
1495  					      RKISP1_CIF_ISP_EXP_CTRL,
1496  					      RKISP1_CIF_ISP_EXP_ENA);
1497  		else
1498  			rkisp1_param_clear_bits(params,
1499  						RKISP1_CIF_ISP_EXP_CTRL,
1500  						RKISP1_CIF_ISP_EXP_ENA);
1501  	}
1502  }
1503  
rkisp1_params_get_buffer(struct rkisp1_params * params,struct rkisp1_buffer ** buf,struct rkisp1_params_cfg ** cfg)1504  static bool rkisp1_params_get_buffer(struct rkisp1_params *params,
1505  				     struct rkisp1_buffer **buf,
1506  				     struct rkisp1_params_cfg **cfg)
1507  {
1508  	if (list_empty(&params->params))
1509  		return false;
1510  
1511  	*buf = list_first_entry(&params->params, struct rkisp1_buffer, queue);
1512  	*cfg = vb2_plane_vaddr(&(*buf)->vb.vb2_buf, 0);
1513  
1514  	return true;
1515  }
1516  
rkisp1_params_complete_buffer(struct rkisp1_params * params,struct rkisp1_buffer * buf,unsigned int frame_sequence)1517  static void rkisp1_params_complete_buffer(struct rkisp1_params *params,
1518  					  struct rkisp1_buffer *buf,
1519  					  unsigned int frame_sequence)
1520  {
1521  	list_del(&buf->queue);
1522  
1523  	buf->vb.sequence = frame_sequence;
1524  	vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1525  }
1526  
rkisp1_params_isr(struct rkisp1_device * rkisp1)1527  void rkisp1_params_isr(struct rkisp1_device *rkisp1)
1528  {
1529  	struct rkisp1_params *params = &rkisp1->params;
1530  	struct rkisp1_params_cfg *new_params;
1531  	struct rkisp1_buffer *cur_buf;
1532  
1533  	spin_lock(&params->config_lock);
1534  
1535  	if (!rkisp1_params_get_buffer(params, &cur_buf, &new_params))
1536  		goto unlock;
1537  
1538  	rkisp1_isp_isr_other_config(params, new_params);
1539  	rkisp1_isp_isr_lsc_config(params, new_params);
1540  	rkisp1_isp_isr_meas_config(params, new_params);
1541  
1542  	/* update shadow register immediately */
1543  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
1544  			      RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD);
1545  
1546  	/*
1547  	 * This isr is called when the ISR finishes processing a frame
1548  	 * (RKISP1_CIF_ISP_FRAME). Configurations performed here will be
1549  	 * applied on the next frame. Since frame_sequence is updated on the
1550  	 * vertical sync signal, we should use frame_sequence + 1 here to
1551  	 * indicate to userspace on which frame these parameters are being
1552  	 * applied.
1553  	 */
1554  	rkisp1_params_complete_buffer(params, cur_buf,
1555  				      rkisp1->isp.frame_sequence + 1);
1556  
1557  unlock:
1558  	spin_unlock(&params->config_lock);
1559  }
1560  
1561  static const struct rkisp1_cif_isp_awb_meas_config rkisp1_awb_params_default_config = {
1562  	{
1563  		0, 0, RKISP1_DEFAULT_WIDTH, RKISP1_DEFAULT_HEIGHT
1564  	},
1565  	RKISP1_CIF_ISP_AWB_MODE_YCBCR, 200, 30, 20, 20, 0, 128, 128
1566  };
1567  
1568  static const struct rkisp1_cif_isp_aec_config rkisp1_aec_params_default_config = {
1569  	RKISP1_CIF_ISP_EXP_MEASURING_MODE_0,
1570  	RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP_0,
1571  	{
1572  		RKISP1_DEFAULT_WIDTH >> 2, RKISP1_DEFAULT_HEIGHT >> 2,
1573  		RKISP1_DEFAULT_WIDTH >> 1, RKISP1_DEFAULT_HEIGHT >> 1
1574  	}
1575  };
1576  
1577  static const struct rkisp1_cif_isp_hst_config rkisp1_hst_params_default_config = {
1578  	RKISP1_CIF_ISP_HISTOGRAM_MODE_RGB_COMBINED,
1579  	3,
1580  	{
1581  		RKISP1_DEFAULT_WIDTH >> 2, RKISP1_DEFAULT_HEIGHT >> 2,
1582  		RKISP1_DEFAULT_WIDTH >> 1, RKISP1_DEFAULT_HEIGHT >> 1
1583  	},
1584  	{
1585  		0, /* To be filled in with 0x01 at runtime. */
1586  	}
1587  };
1588  
1589  static const struct rkisp1_cif_isp_afc_config rkisp1_afc_params_default_config = {
1590  	1,
1591  	{
1592  		{
1593  			300, 225, 200, 150
1594  		}
1595  	},
1596  	4,
1597  	14
1598  };
1599  
rkisp1_params_pre_configure(struct rkisp1_params * params,enum rkisp1_fmt_raw_pat_type bayer_pat,enum v4l2_quantization quantization,enum v4l2_ycbcr_encoding ycbcr_encoding)1600  void rkisp1_params_pre_configure(struct rkisp1_params *params,
1601  				 enum rkisp1_fmt_raw_pat_type bayer_pat,
1602  				 enum v4l2_quantization quantization,
1603  				 enum v4l2_ycbcr_encoding ycbcr_encoding)
1604  {
1605  	struct rkisp1_cif_isp_hst_config hst = rkisp1_hst_params_default_config;
1606  	struct rkisp1_params_cfg *new_params;
1607  	struct rkisp1_buffer *cur_buf;
1608  
1609  	params->quantization = quantization;
1610  	params->ycbcr_encoding = ycbcr_encoding;
1611  	params->raw_type = bayer_pat;
1612  
1613  	params->ops->awb_meas_config(params, &rkisp1_awb_params_default_config);
1614  	params->ops->awb_meas_enable(params, &rkisp1_awb_params_default_config,
1615  				     true);
1616  
1617  	params->ops->aec_config(params, &rkisp1_aec_params_default_config);
1618  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_EXP_CTRL,
1619  			      RKISP1_CIF_ISP_EXP_ENA);
1620  
1621  	params->ops->afm_config(params, &rkisp1_afc_params_default_config);
1622  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
1623  			      RKISP1_CIF_ISP_AFM_ENA);
1624  
1625  	memset(hst.hist_weight, 0x01, sizeof(hst.hist_weight));
1626  	params->ops->hst_config(params, &hst);
1627  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10,
1628  			      rkisp1_hst_params_default_config.mode);
1629  
1630  	rkisp1_csm_config(params);
1631  
1632  	spin_lock_irq(&params->config_lock);
1633  
1634  	/* apply the first buffer if there is one already */
1635  
1636  	if (!rkisp1_params_get_buffer(params, &cur_buf, &new_params))
1637  		goto unlock;
1638  
1639  	rkisp1_isp_isr_other_config(params, new_params);
1640  	rkisp1_isp_isr_meas_config(params, new_params);
1641  
1642  	/* update shadow register immediately */
1643  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
1644  			      RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD);
1645  
1646  unlock:
1647  	spin_unlock_irq(&params->config_lock);
1648  }
1649  
rkisp1_params_post_configure(struct rkisp1_params * params)1650  void rkisp1_params_post_configure(struct rkisp1_params *params)
1651  {
1652  	struct rkisp1_params_cfg *new_params;
1653  	struct rkisp1_buffer *cur_buf;
1654  
1655  	spin_lock_irq(&params->config_lock);
1656  
1657  	/*
1658  	 * Apply LSC parameters from the first buffer (if any is already
1659  	 * available. This must be done after the ISP gets started in the
1660  	 * ISP8000Nano v18.02 (found in the i.MX8MP) as access to the LSC RAM
1661  	 * is gated by the ISP_CTRL.ISP_ENABLE bit. As this initialization
1662  	 * ordering doesn't affect other ISP versions negatively, do so
1663  	 * unconditionally.
1664  	 */
1665  
1666  	if (!rkisp1_params_get_buffer(params, &cur_buf, &new_params))
1667  		goto unlock;
1668  
1669  	rkisp1_isp_isr_lsc_config(params, new_params);
1670  
1671  	/* update shadow register immediately */
1672  	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
1673  			      RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD);
1674  
1675  	rkisp1_params_complete_buffer(params, cur_buf, 0);
1676  
1677  unlock:
1678  	spin_unlock_irq(&params->config_lock);
1679  }
1680  
1681  /*
1682   * Not called when the camera is active, therefore there is no need to acquire
1683   * a lock.
1684   */
rkisp1_params_disable(struct rkisp1_params * params)1685  void rkisp1_params_disable(struct rkisp1_params *params)
1686  {
1687  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPCC_MODE,
1688  				RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE);
1689  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL,
1690  				RKISP1_CIF_ISP_LSC_CTRL_ENA);
1691  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_BLS_CTRL,
1692  				RKISP1_CIF_ISP_BLS_ENA);
1693  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1694  				RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA);
1695  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1696  				RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
1697  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DEMOSAIC,
1698  				RKISP1_CIF_ISP_DEMOSAIC_BYPASS);
1699  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_FILT_MODE,
1700  				RKISP1_CIF_ISP_FLT_ENA);
1701  	params->ops->awb_meas_enable(params, NULL, false);
1702  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1703  				RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
1704  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_EXP_CTRL,
1705  				RKISP1_CIF_ISP_EXP_ENA);
1706  	rkisp1_ctk_enable(params, false);
1707  	rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL,
1708  				RKISP1_CIF_C_PROC_CTR_ENABLE);
1709  	params->ops->hst_enable(params, NULL, false);
1710  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
1711  				RKISP1_CIF_ISP_AFM_ENA);
1712  	rkisp1_ie_enable(params, false);
1713  	rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPF_MODE,
1714  				RKISP1_CIF_ISP_DPF_MODE_EN);
1715  }
1716  
1717  static const struct rkisp1_params_ops rkisp1_v10_params_ops = {
1718  	.lsc_matrix_config = rkisp1_lsc_matrix_config_v10,
1719  	.goc_config = rkisp1_goc_config_v10,
1720  	.awb_meas_config = rkisp1_awb_meas_config_v10,
1721  	.awb_meas_enable = rkisp1_awb_meas_enable_v10,
1722  	.awb_gain_config = rkisp1_awb_gain_config_v10,
1723  	.aec_config = rkisp1_aec_config_v10,
1724  	.hst_config = rkisp1_hst_config_v10,
1725  	.hst_enable = rkisp1_hst_enable_v10,
1726  	.afm_config = rkisp1_afm_config_v10,
1727  };
1728  
1729  static struct rkisp1_params_ops rkisp1_v12_params_ops = {
1730  	.lsc_matrix_config = rkisp1_lsc_matrix_config_v12,
1731  	.goc_config = rkisp1_goc_config_v12,
1732  	.awb_meas_config = rkisp1_awb_meas_config_v12,
1733  	.awb_meas_enable = rkisp1_awb_meas_enable_v12,
1734  	.awb_gain_config = rkisp1_awb_gain_config_v12,
1735  	.aec_config = rkisp1_aec_config_v12,
1736  	.hst_config = rkisp1_hst_config_v12,
1737  	.hst_enable = rkisp1_hst_enable_v12,
1738  	.afm_config = rkisp1_afm_config_v12,
1739  };
1740  
rkisp1_params_enum_fmt_meta_out(struct file * file,void * priv,struct v4l2_fmtdesc * f)1741  static int rkisp1_params_enum_fmt_meta_out(struct file *file, void *priv,
1742  					   struct v4l2_fmtdesc *f)
1743  {
1744  	struct video_device *video = video_devdata(file);
1745  	struct rkisp1_params *params = video_get_drvdata(video);
1746  
1747  	if (f->index > 0 || f->type != video->queue->type)
1748  		return -EINVAL;
1749  
1750  	f->pixelformat = params->vdev_fmt.fmt.meta.dataformat;
1751  
1752  	return 0;
1753  }
1754  
rkisp1_params_g_fmt_meta_out(struct file * file,void * fh,struct v4l2_format * f)1755  static int rkisp1_params_g_fmt_meta_out(struct file *file, void *fh,
1756  					struct v4l2_format *f)
1757  {
1758  	struct video_device *video = video_devdata(file);
1759  	struct rkisp1_params *params = video_get_drvdata(video);
1760  	struct v4l2_meta_format *meta = &f->fmt.meta;
1761  
1762  	if (f->type != video->queue->type)
1763  		return -EINVAL;
1764  
1765  	memset(meta, 0, sizeof(*meta));
1766  	meta->dataformat = params->vdev_fmt.fmt.meta.dataformat;
1767  	meta->buffersize = params->vdev_fmt.fmt.meta.buffersize;
1768  
1769  	return 0;
1770  }
1771  
rkisp1_params_querycap(struct file * file,void * priv,struct v4l2_capability * cap)1772  static int rkisp1_params_querycap(struct file *file,
1773  				  void *priv, struct v4l2_capability *cap)
1774  {
1775  	struct video_device *vdev = video_devdata(file);
1776  
1777  	strscpy(cap->driver, RKISP1_DRIVER_NAME, sizeof(cap->driver));
1778  	strscpy(cap->card, vdev->name, sizeof(cap->card));
1779  	strscpy(cap->bus_info, RKISP1_BUS_INFO, sizeof(cap->bus_info));
1780  
1781  	return 0;
1782  }
1783  
1784  /* ISP params video device IOCTLs */
1785  static const struct v4l2_ioctl_ops rkisp1_params_ioctl = {
1786  	.vidioc_reqbufs = vb2_ioctl_reqbufs,
1787  	.vidioc_querybuf = vb2_ioctl_querybuf,
1788  	.vidioc_create_bufs = vb2_ioctl_create_bufs,
1789  	.vidioc_qbuf = vb2_ioctl_qbuf,
1790  	.vidioc_dqbuf = vb2_ioctl_dqbuf,
1791  	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
1792  	.vidioc_expbuf = vb2_ioctl_expbuf,
1793  	.vidioc_streamon = vb2_ioctl_streamon,
1794  	.vidioc_streamoff = vb2_ioctl_streamoff,
1795  	.vidioc_enum_fmt_meta_out = rkisp1_params_enum_fmt_meta_out,
1796  	.vidioc_g_fmt_meta_out = rkisp1_params_g_fmt_meta_out,
1797  	.vidioc_s_fmt_meta_out = rkisp1_params_g_fmt_meta_out,
1798  	.vidioc_try_fmt_meta_out = rkisp1_params_g_fmt_meta_out,
1799  	.vidioc_querycap = rkisp1_params_querycap,
1800  	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1801  	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1802  };
1803  
rkisp1_params_vb2_queue_setup(struct vb2_queue * vq,unsigned int * num_buffers,unsigned int * num_planes,unsigned int sizes[],struct device * alloc_devs[])1804  static int rkisp1_params_vb2_queue_setup(struct vb2_queue *vq,
1805  					 unsigned int *num_buffers,
1806  					 unsigned int *num_planes,
1807  					 unsigned int sizes[],
1808  					 struct device *alloc_devs[])
1809  {
1810  	*num_buffers = clamp_t(u32, *num_buffers,
1811  			       RKISP1_ISP_PARAMS_REQ_BUFS_MIN,
1812  			       RKISP1_ISP_PARAMS_REQ_BUFS_MAX);
1813  
1814  	*num_planes = 1;
1815  
1816  	sizes[0] = sizeof(struct rkisp1_params_cfg);
1817  
1818  	return 0;
1819  }
1820  
rkisp1_params_vb2_buf_queue(struct vb2_buffer * vb)1821  static void rkisp1_params_vb2_buf_queue(struct vb2_buffer *vb)
1822  {
1823  	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1824  	struct rkisp1_buffer *params_buf =
1825  		container_of(vbuf, struct rkisp1_buffer, vb);
1826  	struct vb2_queue *vq = vb->vb2_queue;
1827  	struct rkisp1_params *params = vq->drv_priv;
1828  
1829  	spin_lock_irq(&params->config_lock);
1830  	list_add_tail(&params_buf->queue, &params->params);
1831  	spin_unlock_irq(&params->config_lock);
1832  }
1833  
rkisp1_params_vb2_buf_prepare(struct vb2_buffer * vb)1834  static int rkisp1_params_vb2_buf_prepare(struct vb2_buffer *vb)
1835  {
1836  	if (vb2_plane_size(vb, 0) < sizeof(struct rkisp1_params_cfg))
1837  		return -EINVAL;
1838  
1839  	vb2_set_plane_payload(vb, 0, sizeof(struct rkisp1_params_cfg));
1840  
1841  	return 0;
1842  }
1843  
rkisp1_params_vb2_stop_streaming(struct vb2_queue * vq)1844  static void rkisp1_params_vb2_stop_streaming(struct vb2_queue *vq)
1845  {
1846  	struct rkisp1_params *params = vq->drv_priv;
1847  	struct rkisp1_buffer *buf;
1848  	LIST_HEAD(tmp_list);
1849  
1850  	/*
1851  	 * we first move the buffers into a local list 'tmp_list'
1852  	 * and then we can iterate it and call vb2_buffer_done
1853  	 * without holding the lock
1854  	 */
1855  	spin_lock_irq(&params->config_lock);
1856  	list_splice_init(&params->params, &tmp_list);
1857  	spin_unlock_irq(&params->config_lock);
1858  
1859  	list_for_each_entry(buf, &tmp_list, queue)
1860  		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
1861  }
1862  
1863  static const struct vb2_ops rkisp1_params_vb2_ops = {
1864  	.queue_setup = rkisp1_params_vb2_queue_setup,
1865  	.wait_prepare = vb2_ops_wait_prepare,
1866  	.wait_finish = vb2_ops_wait_finish,
1867  	.buf_queue = rkisp1_params_vb2_buf_queue,
1868  	.buf_prepare = rkisp1_params_vb2_buf_prepare,
1869  	.stop_streaming = rkisp1_params_vb2_stop_streaming,
1870  
1871  };
1872  
1873  static const struct v4l2_file_operations rkisp1_params_fops = {
1874  	.mmap = vb2_fop_mmap,
1875  	.unlocked_ioctl = video_ioctl2,
1876  	.poll = vb2_fop_poll,
1877  	.open = v4l2_fh_open,
1878  	.release = vb2_fop_release
1879  };
1880  
rkisp1_params_init_vb2_queue(struct vb2_queue * q,struct rkisp1_params * params)1881  static int rkisp1_params_init_vb2_queue(struct vb2_queue *q,
1882  					struct rkisp1_params *params)
1883  {
1884  	struct rkisp1_vdev_node *node;
1885  
1886  	node = container_of(q, struct rkisp1_vdev_node, buf_queue);
1887  
1888  	q->type = V4L2_BUF_TYPE_META_OUTPUT;
1889  	q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
1890  	q->drv_priv = params;
1891  	q->ops = &rkisp1_params_vb2_ops;
1892  	q->mem_ops = &vb2_vmalloc_memops;
1893  	q->buf_struct_size = sizeof(struct rkisp1_buffer);
1894  	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1895  	q->lock = &node->vlock;
1896  
1897  	return vb2_queue_init(q);
1898  }
1899  
rkisp1_init_params(struct rkisp1_params * params)1900  static void rkisp1_init_params(struct rkisp1_params *params)
1901  {
1902  	params->vdev_fmt.fmt.meta.dataformat =
1903  		V4L2_META_FMT_RK_ISP1_PARAMS;
1904  	params->vdev_fmt.fmt.meta.buffersize =
1905  		sizeof(struct rkisp1_params_cfg);
1906  
1907  	if (params->rkisp1->info->isp_ver == RKISP1_V12)
1908  		params->ops = &rkisp1_v12_params_ops;
1909  	else
1910  		params->ops = &rkisp1_v10_params_ops;
1911  }
1912  
rkisp1_params_register(struct rkisp1_device * rkisp1)1913  int rkisp1_params_register(struct rkisp1_device *rkisp1)
1914  {
1915  	struct rkisp1_params *params = &rkisp1->params;
1916  	struct rkisp1_vdev_node *node = &params->vnode;
1917  	struct video_device *vdev = &node->vdev;
1918  	int ret;
1919  
1920  	params->rkisp1 = rkisp1;
1921  	mutex_init(&node->vlock);
1922  	INIT_LIST_HEAD(&params->params);
1923  	spin_lock_init(&params->config_lock);
1924  
1925  	strscpy(vdev->name, RKISP1_PARAMS_DEV_NAME, sizeof(vdev->name));
1926  
1927  	video_set_drvdata(vdev, params);
1928  	vdev->ioctl_ops = &rkisp1_params_ioctl;
1929  	vdev->fops = &rkisp1_params_fops;
1930  	vdev->release = video_device_release_empty;
1931  	/*
1932  	 * Provide a mutex to v4l2 core. It will be used
1933  	 * to protect all fops and v4l2 ioctls.
1934  	 */
1935  	vdev->lock = &node->vlock;
1936  	vdev->v4l2_dev = &rkisp1->v4l2_dev;
1937  	vdev->queue = &node->buf_queue;
1938  	vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_META_OUTPUT;
1939  	vdev->vfl_dir = VFL_DIR_TX;
1940  	rkisp1_params_init_vb2_queue(vdev->queue, params);
1941  	rkisp1_init_params(params);
1942  	video_set_drvdata(vdev, params);
1943  
1944  	node->pad.flags = MEDIA_PAD_FL_SOURCE;
1945  	ret = media_entity_pads_init(&vdev->entity, 1, &node->pad);
1946  	if (ret)
1947  		goto error;
1948  
1949  	ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
1950  	if (ret) {
1951  		dev_err(rkisp1->dev,
1952  			"failed to register %s, ret=%d\n", vdev->name, ret);
1953  		goto error;
1954  	}
1955  
1956  	return 0;
1957  
1958  error:
1959  	media_entity_cleanup(&vdev->entity);
1960  	mutex_destroy(&node->vlock);
1961  	return ret;
1962  }
1963  
rkisp1_params_unregister(struct rkisp1_device * rkisp1)1964  void rkisp1_params_unregister(struct rkisp1_device *rkisp1)
1965  {
1966  	struct rkisp1_params *params = &rkisp1->params;
1967  	struct rkisp1_vdev_node *node = &params->vnode;
1968  	struct video_device *vdev = &node->vdev;
1969  
1970  	if (!video_is_registered(vdev))
1971  		return;
1972  
1973  	vb2_video_unregister_device(vdev);
1974  	media_entity_cleanup(&vdev->entity);
1975  	mutex_destroy(&node->vlock);
1976  }
1977