xref: /OK3568_Linux_fs/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020 Rockchip Electronics Co., Ltd. */
3 
4 #include <linux/kfifo.h>
5 #include <media/v4l2-common.h>
6 #include <media/v4l2-ioctl.h>
7 #include <media/videobuf2-core.h>
8 #include <media/videobuf2-vmalloc.h>	/* for ISP statistics */
9 #include "dev.h"
10 #include "regs.h"
11 #include "common.h"
12 #include "isp_stats.h"
13 #include "isp_stats_v21.h"
14 
15 #define ISP2X_SIAWB_GET_MEAN_CR_R(x)	((x) & 0xFF)
16 #define ISP2X_SIAWB_GET_MEAN_CB_B(x)	(((x) >> 8) & 0xFF)
17 #define ISP2X_SIAWB_GET_MEAN_Y_G(x)	(((x) >> 16) & 0xFF)
18 #define ISP2X_SIAWB_GET_PIXEL_CNT(x)	((x) & 0x3FFFFFF)
19 
20 #define ISP2X_HIST_GET_BIN0(x)		((x) & 0xFFFF)
21 #define ISP2X_HIST_GET_BIN1(x)		(((x) >> 16) & 0xFFFF)
22 
23 #define ISP2X_3A_MEAS_DONE		BIT(31)
24 
25 #define ISP2X_EXP_GET_MEAN_xy0(x)	((x) & 0xFF)
26 #define ISP2X_EXP_GET_MEAN_xy1(x)	(((x) >> 8) & 0xFF)
27 #define ISP2X_EXP_GET_MEAN_xy2(x)	(((x) >> 16) & 0xFF)
28 #define ISP2X_EXP_GET_MEAN_xy3(x)	(((x) >> 24) & 0xFF)
29 
30 #define ISP2X_RAWAEBIG_GET_MEAN_G(x)	((x) & 0xFFF)
31 #define ISP2X_RAWAEBIG_GET_MEAN_B(x)	(((x) >> 12) & 0x3FF)
32 #define ISP2X_RAWAEBIG_GET_MEAN_R(x)	(((x) >> 22) & 0x3FF)
33 
34 #define ISP2X_RAWAF_INT_LINE0_EN	BIT(27)
35 
isp_module_done(struct rkisp_isp_stats_vdev * stats_vdev,u32 reg,u32 value)36 static void isp_module_done(struct rkisp_isp_stats_vdev *stats_vdev,
37 			    u32 reg, u32 value)
38 {
39 	void __iomem *base = stats_vdev->dev->hw_dev->base_addr;
40 
41 	writel(value, base + reg);
42 }
43 
44 static int
rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)45 rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
46 				struct rkisp_isp21_stat_buffer *pbuf)
47 {
48 	u64 msb, lsb;
49 	u32 value;
50 	int i;
51 
52 	value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_CTRL, true);
53 	if (!(value & ISP2X_3A_MEAS_DONE))
54 		return -ENODATA;
55 
56 	if (!pbuf)
57 		return 0;
58 
59 	pbuf->meas_type |= ISP2X_STAT_RAWAWB;
60 	for (i = 0; i < ISP21_RAWAWB_HSTBIN_NUM / 2; i++) {
61 		value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_Y_HIST01 + 4 * i, true);
62 		pbuf->params.rawawb.ro_yhist_bin[2 * i] = value & 0xFFFF;
63 		pbuf->params.rawawb.ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
64 	}
65 
66 	for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
67 		pbuf->params.rawawb.ro_rawawb_sum_rgain_nor[i] =
68 			rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_RGAIN_NOR_0 + 0x30 * i, true);
69 		pbuf->params.rawawb.ro_rawawb_sum_bgain_nor[i] =
70 			rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_BGAIN_NOR_0 + 0x30 * i, true);
71 		pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
72 			rkisp_read(stats_vdev->dev, ISP21_RAWAWB_WP_NUM_NOR_0 + 0x30 * i, true);
73 		pbuf->params.rawawb.ro_rawawb_sum_rgain_big[i] =
74 			rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_RGAIN_BIG_0 + 0x30 * i, true);
75 		pbuf->params.rawawb.ro_rawawb_sum_bgain_big[i] =
76 			rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_BGAIN_BIG_0 + 0x30 * i, true);
77 		pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
78 			rkisp_read(stats_vdev->dev, ISP21_RAWAWB_WP_NUM_BIG_0 + 0x30 * i, true);
79 	}
80 
81 	for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
82 		lsb = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_RAM_DATA_BASE, true);
83 		msb = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_RAM_DATA_BASE, true);
84 		pbuf->params.rawawb.ramdata[i].b = lsb & 0x3FFFF;
85 		pbuf->params.rawawb.ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
86 		pbuf->params.rawawb.ramdata[i].r = (msb & 0x3FFFF0) >> 4;
87 		pbuf->params.rawawb.ramdata[i].wp = (msb & 0xFFC00000) >> 22;
88 	}
89 
90 	return 0;
91 }
92 
93 static int
rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)94 rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
95 			       struct rkisp_isp21_stat_buffer *pbuf)
96 {
97 	struct isp2x_rawaf_stat *af;
98 	u32 value, read_line;
99 	u32 line_num[ISP2X_RAWAF_LINE_NUM + 1];
100 	int i;
101 
102 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
103 	if (!(value & ISP2X_3A_MEAS_DONE))
104 		return -ENODATA;
105 
106 	if (!pbuf)
107 		return 0;
108 
109 	af = &pbuf->params.rawaf;
110 	pbuf->meas_type |= ISP2X_STAT_RAWAF;
111 	af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
112 	af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
113 	af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
114 	af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
115 	af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
116 
117 	memset(line_num, 0, sizeof(line_num));
118 	line_num[ISP2X_RAWAF_LINE_NUM] = ISP2X_RAWAF_SUMDATA_ROW;
119 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_LINE, true);
120 	for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
121 		if (value & (ISP2X_RAWAF_INT_LINE0_EN << i)) {
122 			line_num[i] = (value >> (4 * i)) & 0xF;
123 			line_num[ISP2X_RAWAF_LINE_NUM] -= line_num[i];
124 		}
125 	}
126 
127 	read_line = 0;
128 	for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
129 		if (af->int_state & (1 << i))
130 			read_line += line_num[i];
131 	}
132 
133 	if (!read_line)
134 		read_line = line_num[ISP2X_RAWAF_LINE_NUM];
135 
136 	for (i = 0; i < read_line * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
137 		af->ramdata[i] = rkisp_read(stats_vdev->dev, ISP_RAWAF_RAM_DATA, true);
138 
139 	return 0;
140 }
141 
142 static int
rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)143 rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
144 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
145 {
146 	u32 addr, value;
147 	int i;
148 
149 	switch (blk_no) {
150 	case 0:
151 		addr = RAWAE_BIG1_BASE;
152 		break;
153 	case 1:
154 		addr = RAWAE_BIG2_BASE;
155 		break;
156 	case 2:
157 		addr = RAWAE_BIG3_BASE;
158 		break;
159 	default:
160 		addr = RAWAE_BIG1_BASE;
161 		break;
162 	}
163 
164 	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
165 	if (!(value & ISP2X_3A_MEAS_DONE))
166 		return -ENODATA;
167 
168 	if (!ae)
169 		return 0;
170 
171 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
172 		ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
173 
174 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
175 		ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
176 
177 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
178 		ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
179 
180 	for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
181 		value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_RO_MEAN_BASE_ADDR, true);
182 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
183 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
184 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
185 	}
186 
187 	return 0;
188 }
189 
190 static int
rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)191 rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
192 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
193 {
194 	u32 addr, value;
195 	int i;
196 
197 	switch (blk_no) {
198 	case 0:
199 		addr = ISP_RAWHIST_BIG1_BASE;
200 		break;
201 	case 1:
202 		addr = ISP_RAWHIST_BIG2_BASE;
203 		break;
204 	case 2:
205 		addr = ISP_RAWHIST_BIG3_BASE;
206 		break;
207 	default:
208 		addr = ISP_RAWHIST_BIG1_BASE;
209 		break;
210 	}
211 
212 	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
213 	if (!(value & ISP2X_3A_MEAS_DONE))
214 		return -ENODATA;
215 
216 	if (!hst)
217 		return 0;
218 
219 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
220 		hst->hist_bin[i] = rkisp_read(stats_vdev->dev,
221 					      addr + ISP_RAWHIST_BIG_RO_BASE_BIN, true);
222 	}
223 
224 	return 0;
225 }
226 
227 static int
rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)228 rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
229 				struct rkisp_isp21_stat_buffer *pbuf)
230 {
231 	int ret = 0;
232 
233 	if (!pbuf) {
234 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1);
235 	} else {
236 		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1);
237 		if (!ret)
238 			pbuf->meas_type |= ISP2X_STAT_RAWAE1;
239 	}
240 
241 	return ret;
242 }
243 
244 static int
rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)245 rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
246 				 struct rkisp_isp21_stat_buffer *pbuf)
247 {
248 	int ret = 0;
249 
250 	if (!pbuf) {
251 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1);
252 	} else {
253 		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1);
254 		if (!ret)
255 			pbuf->meas_type |= ISP2X_STAT_RAWHST1;
256 	}
257 
258 	return ret;
259 }
260 
261 static int
rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)262 rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
263 				struct rkisp_isp21_stat_buffer *pbuf)
264 {
265 	int ret = 0;
266 
267 	if (!pbuf) {
268 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2);
269 	} else {
270 		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae2, 2);
271 		if (!ret)
272 			pbuf->meas_type |= ISP2X_STAT_RAWAE2;
273 	}
274 
275 	return ret;
276 }
277 
278 static int
rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)279 rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
280 				 struct rkisp_isp21_stat_buffer *pbuf)
281 {
282 	int ret = 0;
283 
284 	if (!pbuf) {
285 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2);
286 	} else {
287 		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2);
288 		if (!ret)
289 			pbuf->meas_type |= ISP2X_STAT_RAWHST2;
290 	}
291 
292 	return ret;
293 }
294 
295 static int
rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)296 rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
297 				struct rkisp_isp21_stat_buffer *pbuf)
298 {
299 	int ret = 0;
300 
301 	if (!pbuf) {
302 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0);
303 	} else {
304 		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0);
305 		if (!ret)
306 			pbuf->meas_type |= ISP2X_STAT_RAWAE3;
307 	}
308 
309 	return ret;
310 }
311 
312 static int
rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)313 rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
314 				 struct rkisp_isp21_stat_buffer *pbuf)
315 {
316 	int ret = 0;
317 
318 	if (!pbuf) {
319 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0);
320 	} else {
321 		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0);
322 		if (!ret)
323 			pbuf->meas_type |= ISP2X_STAT_RAWHST3;
324 	}
325 
326 	return ret;
327 }
328 
329 static int
rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)330 rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
331 				   struct rkisp_isp21_stat_buffer *pbuf)
332 {
333 	struct isp2x_rawaelite_stat *ae;
334 	u32 value;
335 	int i;
336 
337 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
338 	if ((value & ISP2X_3A_MEAS_DONE) == 0)
339 		return -ENODATA;
340 
341 	if (!pbuf)
342 		return 0;
343 
344 	pbuf->meas_type |= ISP2X_STAT_RAWAE0;
345 	ae = &pbuf->params.rawae0;
346 	for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
347 		value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_RO_MEAN + 4 * i, true);
348 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
349 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
350 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
351 	}
352 
353 	return 0;
354 }
355 
356 static int
rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)357 rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
358 				    struct rkisp_isp21_stat_buffer *pbuf)
359 {
360 	struct isp2x_rawhistlite_stat *hst;
361 	u32 value;
362 	int i;
363 
364 	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
365 	if ((value & ISP2X_3A_MEAS_DONE) == 0)
366 		return -ENODATA;
367 
368 	if (!pbuf)
369 		return 0;
370 
371 	pbuf->meas_type |= ISP2X_STAT_RAWHST0;
372 	hst = &pbuf->params.rawhist0;
373 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
374 		hst->hist_bin[i] = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_RO_BASE_BIN, true);
375 
376 	return 0;
377 }
378 
379 static int
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)380 rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev,
381 			  struct rkisp_isp21_stat_buffer *pbuf)
382 {
383 	struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt;
384 	enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
385 	struct isp2x_bls_stat *bls;
386 	u32 value;
387 
388 	if (!pbuf)
389 		return 0;
390 
391 	bls = &pbuf->params.bls;
392 	value = rkisp_read(stats_vdev->dev, ISP_BLS_CTRL, true);
393 	if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
394 		pbuf->meas_type |= ISP2X_STAT_BLS;
395 
396 		switch (raw_type) {
397 		case RAW_BGGR:
398 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
399 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
400 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
401 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
402 			break;
403 		case RAW_GBRG:
404 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
405 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
406 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
407 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
408 			break;
409 		case RAW_GRBG:
410 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
411 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
412 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
413 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
414 			break;
415 		case RAW_RGGB:
416 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
417 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
418 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
419 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
420 			break;
421 		default:
422 			break;
423 		}
424 	}
425 	return 0;
426 }
427 
428 static int
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)429 rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev,
430 			   struct rkisp_isp21_stat_buffer *pbuf)
431 {
432 	struct isp21_dhaz_stat *dhaz;
433 	u32 value, i;
434 
435 	if (!pbuf)
436 		return 0;
437 
438 	dhaz = &pbuf->params.dhaz;
439 	value = rkisp_read(stats_vdev->dev, ISP_DHAZ_CTRL, true);
440 	if (value & ISP_DHAZ_ENMUX) {
441 		pbuf->meas_type |= ISP2X_STAT_DHAZ;
442 
443 		value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD0, true);
444 		dhaz->dhaz_adp_air_base = value >> 16;
445 		dhaz->dhaz_adp_wt = value & 0xFFFF;
446 
447 		value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD1, true);
448 		dhaz->dhaz_adp_gratio = value >> 16;
449 		dhaz->dhaz_adp_tmax = value & 0xFFFF;
450 
451 		for (i = 0; i < ISP21_DHAZ_HIST_IIR_NUM / 2; i++) {
452 			value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG0 + 4 * i, true);
453 			dhaz->h_rgb_iir[2 * i] = value & 0xFFFF;
454 			dhaz->h_rgb_iir[2 * i + 1] = value >> 16;
455 		}
456 	}
457 	return 0;
458 }
459 
460 static struct rkisp_stats_v21_ops __maybe_unused rkisp_stats_reg_ops_v21 = {
461 	.get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg,
462 	.get_rawaf_meas = rkisp_stats_get_rawaf_meas_reg,
463 	.get_rawae0_meas = rkisp_stats_get_rawaelite_meas_reg,
464 	.get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_reg,
465 	.get_rawae1_meas = rkisp_stats_get_rawae1_meas_reg,
466 	.get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_reg,
467 	.get_rawae2_meas = rkisp_stats_get_rawae2_meas_reg,
468 	.get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_reg,
469 	.get_rawae3_meas = rkisp_stats_get_rawae3_meas_reg,
470 	.get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_reg,
471 	.get_bls_stats = rkisp_stats_get_bls_stats,
472 	.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
473 };
474 
475 static int
rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)476 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
477 				struct rkisp_isp21_stat_buffer *pbuf)
478 {
479 	struct isp21_rawawb_meas_stat *rawawb;
480 	u32 value, rd_buf_idx;
481 	u32 *reg_addr, *raw_addr;
482 	u64 msb, lsb;
483 	u32 i;
484 
485 	if (!pbuf)
486 		return 0;
487 
488 	rawawb = &pbuf->params.rawawb;
489 	pbuf->meas_type |= ISP2X_STAT_RAWAWB;
490 	rd_buf_idx = stats_vdev->rd_buf_idx;
491 	raw_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2000;
492 	reg_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2710;
493 	for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
494 		rawawb->ro_rawawb_sum_rgain_nor[i] =
495 			reg_addr[(0x20 * i + 0x0) / 4];
496 		rawawb->ro_rawawb_sum_bgain_nor[i] =
497 			reg_addr[(0x20 * i + 0x4) / 4];
498 		rawawb->ro_rawawb_wp_num_nor[i] =
499 			reg_addr[(0x20 * i + 0x8) / 4];
500 		rawawb->ro_rawawb_sum_rgain_big[i] =
501 			reg_addr[(0x20 * i + 0x10) / 4];
502 		rawawb->ro_rawawb_sum_bgain_big[i] =
503 			reg_addr[(0x20 * i + 0x14) / 4];
504 		rawawb->ro_rawawb_wp_num_big[i] =
505 			reg_addr[(0x20 * i + 0x18) / 4];
506 	}
507 
508 	for (i = 0; i < ISP21_RAWAWB_HSTBIN_NUM / 2; i++) {
509 		value = reg_addr[(0x04 * i + 0xE0) / 4];
510 		rawawb->ro_yhist_bin[2 * i] = value & 0xFFFF;
511 		rawawb->ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
512 	}
513 
514 	for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
515 		lsb = raw_addr[2 * i];
516 		msb = raw_addr[2 * i + 1];
517 		rawawb->ramdata[i].b = lsb & 0x3FFFF;
518 		rawawb->ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
519 		rawawb->ramdata[i].r = (msb & 0x3FFFF0) >> 4;
520 		rawawb->ramdata[i].wp = (msb & 0xFFC00000) >> 22;
521 	}
522 	return 0;
523 }
524 
525 static int
rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)526 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
527 			       struct rkisp_isp21_stat_buffer *pbuf)
528 {
529 	u32 *ddr_addr;
530 	struct isp2x_rawaf_stat *af;
531 	u32 i, rd_buf_idx;
532 
533 	if (!pbuf)
534 		return 0;
535 
536 	af = &pbuf->params.rawaf;
537 	pbuf->meas_type |= ISP2X_STAT_RAWAF;
538 
539 	rd_buf_idx = stats_vdev->rd_buf_idx;
540 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x1C00;
541 
542 	af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
543 	af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
544 	af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
545 	af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
546 	af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
547 
548 	for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
549 		af->ramdata[i] = ddr_addr[i];
550 
551 	return 0;
552 }
553 
554 static int
rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)555 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
556 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
557 {
558 	u32 *ddr_addr;
559 	u32 i, value, addr, rd_buf_idx;
560 
561 	rd_buf_idx = stats_vdev->rd_buf_idx;
562 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr;
563 
564 	switch (blk_no) {
565 	case 1:
566 		addr = RAWAE_BIG2_BASE;
567 		ddr_addr += 0x0390 >> 2;
568 		break;
569 	case 2:
570 		addr = RAWAE_BIG3_BASE;
571 		ddr_addr += 0x0720 >> 2;
572 		break;
573 	default:
574 		addr = RAWAE_BIG1_BASE;
575 		break;
576 	}
577 
578 	if (!ae)
579 		return 0;
580 
581 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
582 		ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
583 
584 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
585 		ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
586 
587 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
588 		ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
589 
590 	for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
591 		value = ddr_addr[i];
592 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
593 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
594 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
595 	}
596 
597 	return 0;
598 }
599 
600 static int
rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)601 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
602 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
603 {
604 	u32 *ddr_addr;
605 	u32 i, rd_buf_idx;
606 
607 	rd_buf_idx = stats_vdev->rd_buf_idx;
608 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00;
609 
610 	switch (blk_no) {
611 	case 1:
612 		ddr_addr += 0x0800 >> 2;
613 		break;
614 	case 2:
615 		ddr_addr += 0x0C00 >> 2;
616 		break;
617 	default:
618 		break;
619 	}
620 
621 	if (!hst)
622 		return 0;
623 
624 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
625 		hst->hist_bin[i] = ddr_addr[i];
626 
627 	return 0;
628 }
629 
630 static int
rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)631 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
632 				struct rkisp_isp21_stat_buffer *pbuf)
633 {
634 	int ret = 0;
635 
636 	if (!pbuf) {
637 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
638 	} else {
639 		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
640 		if (!ret)
641 			pbuf->meas_type |= ISP2X_STAT_RAWAE1;
642 	}
643 
644 	return ret;
645 }
646 
647 static int
rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)648 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
649 				 struct rkisp_isp21_stat_buffer *pbuf)
650 {
651 	int ret = 0;
652 
653 	if (!pbuf) {
654 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
655 	} else {
656 		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
657 		if (!ret)
658 			pbuf->meas_type |= ISP2X_STAT_RAWHST1;
659 	}
660 
661 	return ret;
662 }
663 
664 static int
rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)665 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
666 				struct rkisp_isp21_stat_buffer *pbuf)
667 {
668 	int ret = 0;
669 
670 	if (!pbuf) {
671 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
672 	} else {
673 		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
674 		if (!ret)
675 			pbuf->meas_type |= ISP2X_STAT_RAWAE2;
676 	}
677 
678 	return ret;
679 }
680 
681 static int
rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)682 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
683 				 struct rkisp_isp21_stat_buffer *pbuf)
684 {
685 	int ret = 0;
686 
687 	if (!pbuf) {
688 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
689 	} else {
690 		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
691 		if (!ret)
692 			pbuf->meas_type |= ISP2X_STAT_RAWHST2;
693 	}
694 
695 	return ret;
696 }
697 
698 static int
rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)699 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
700 				struct rkisp_isp21_stat_buffer *pbuf)
701 {
702 	int ret = 0;
703 
704 	if (!pbuf) {
705 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
706 	} else {
707 		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
708 		if (!ret)
709 			pbuf->meas_type |= ISP2X_STAT_RAWAE3;
710 	}
711 
712 	return ret;
713 }
714 
715 static int
rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)716 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
717 				 struct rkisp_isp21_stat_buffer *pbuf)
718 {
719 	int ret = 0;
720 
721 	if (!pbuf) {
722 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
723 	} else {
724 		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
725 		if (!ret)
726 			pbuf->meas_type |= ISP2X_STAT_RAWHST3;
727 	}
728 
729 	return ret;
730 }
731 
732 static int
rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)733 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
734 				   struct rkisp_isp21_stat_buffer *pbuf)
735 {
736 	struct isp2x_rawaelite_stat *ae;
737 	u32 *ddr_addr;
738 	u32 i, value, rd_buf_idx;
739 
740 	if (!pbuf)
741 		return 0;
742 
743 	pbuf->meas_type |= ISP2X_STAT_RAWAE0;
744 	ae = &pbuf->params.rawae0;
745 	rd_buf_idx = stats_vdev->rd_buf_idx;
746 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0;
747 	for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
748 		value = ddr_addr[i];
749 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
750 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
751 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
752 	}
753 
754 	return 0;
755 }
756 
757 static int
rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)758 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
759 				    struct rkisp_isp21_stat_buffer *pbuf)
760 {
761 	struct isp2x_rawhistlite_stat *hst;
762 	u32 *ddr_addr, rd_buf_idx, i;
763 
764 	if (!pbuf)
765 		return 0;
766 
767 	pbuf->meas_type |= ISP2X_STAT_RAWHST0;
768 	hst = &pbuf->params.rawhist0;
769 	rd_buf_idx = stats_vdev->rd_buf_idx;
770 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00 + 0x0400;
771 
772 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
773 		hst->hist_bin[i] = ddr_addr[i];
774 
775 	return 0;
776 }
777 
778 static struct rkisp_stats_v21_ops __maybe_unused rkisp_stats_ddr_ops_v21 = {
779 	.get_rawawb_meas = rkisp_stats_get_rawawb_meas_ddr,
780 	.get_rawaf_meas = rkisp_stats_get_rawaf_meas_ddr,
781 	.get_rawae0_meas = rkisp_stats_get_rawaelite_meas_ddr,
782 	.get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_ddr,
783 	.get_rawae1_meas = rkisp_stats_get_rawae1_meas_ddr,
784 	.get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_ddr,
785 	.get_rawae2_meas = rkisp_stats_get_rawae2_meas_ddr,
786 	.get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_ddr,
787 	.get_rawae3_meas = rkisp_stats_get_rawae3_meas_ddr,
788 	.get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_ddr,
789 	.get_bls_stats = rkisp_stats_get_bls_stats,
790 	.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
791 };
792 
793 static int
rkisp_stats_restart_rawawb_meas(struct rkisp_isp_stats_vdev * stats_vdev)794 rkisp_stats_restart_rawawb_meas(struct rkisp_isp_stats_vdev *stats_vdev)
795 {
796 	u32 value;
797 
798 	value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_CTRL, true);
799 	if (value & ISP2X_3A_MEAS_DONE)
800 		isp_module_done(stats_vdev, ISP21_RAWAWB_CTRL, value);
801 	return 0;
802 }
803 
804 static int
rkisp_stats_restart_rawaf_meas(struct rkisp_isp_stats_vdev * stats_vdev)805 rkisp_stats_restart_rawaf_meas(struct rkisp_isp_stats_vdev *stats_vdev)
806 {
807 	u32 value;
808 
809 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
810 	if (value & ISP2X_3A_MEAS_DONE) {
811 		rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
812 		isp_module_done(stats_vdev, ISP_RAWAF_CTRL, value);
813 	}
814 	return 0;
815 }
816 
817 static int
rkisp_stats_restart_rawaebig_meas(struct rkisp_isp_stats_vdev * stats_vdev,u32 blk_no)818 rkisp_stats_restart_rawaebig_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 blk_no)
819 {
820 	u32 addr, value;
821 
822 	switch (blk_no) {
823 	case 0:
824 		addr = RAWAE_BIG1_BASE;
825 		break;
826 	case 1:
827 		addr = RAWAE_BIG2_BASE;
828 		break;
829 	case 2:
830 		addr = RAWAE_BIG3_BASE;
831 		break;
832 	default:
833 		addr = RAWAE_BIG1_BASE;
834 		break;
835 	}
836 
837 	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
838 	if (value & ISP2X_3A_MEAS_DONE)
839 		isp_module_done(stats_vdev, addr + RAWAE_BIG_CTRL, value);
840 	return 0;
841 }
842 
843 static int
rkisp_stats_restart_rawhstbig_meas(struct rkisp_isp_stats_vdev * stats_vdev,u32 blk_no)844 rkisp_stats_restart_rawhstbig_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 blk_no)
845 {
846 	u32 addr, value;
847 
848 	switch (blk_no) {
849 	case 0:
850 		addr = ISP_RAWHIST_BIG1_BASE;
851 		break;
852 	case 1:
853 		addr = ISP_RAWHIST_BIG2_BASE;
854 		break;
855 	case 2:
856 		addr = ISP_RAWHIST_BIG3_BASE;
857 		break;
858 	default:
859 		addr = ISP_RAWHIST_BIG1_BASE;
860 		break;
861 	}
862 
863 	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
864 	if (value & ISP2X_3A_MEAS_DONE)
865 		isp_module_done(stats_vdev, addr + ISP_RAWHIST_BIG_CTRL, value);
866 	return 0;
867 }
868 
869 static int
rkisp_stats_restart_rawae1_meas(struct rkisp_isp_stats_vdev * stats_vdev)870 rkisp_stats_restart_rawae1_meas(struct rkisp_isp_stats_vdev *stats_vdev)
871 {
872 	return rkisp_stats_restart_rawaebig_meas(stats_vdev, 1);
873 }
874 
875 static int
rkisp_stats_restart_rawhst1_meas(struct rkisp_isp_stats_vdev * stats_vdev)876 rkisp_stats_restart_rawhst1_meas(struct rkisp_isp_stats_vdev *stats_vdev)
877 {
878 	return rkisp_stats_restart_rawhstbig_meas(stats_vdev, 1);
879 }
880 
881 static int
rkisp_stats_restart_rawae2_meas(struct rkisp_isp_stats_vdev * stats_vdev)882 rkisp_stats_restart_rawae2_meas(struct rkisp_isp_stats_vdev *stats_vdev)
883 {
884 	return rkisp_stats_restart_rawaebig_meas(stats_vdev, 2);
885 }
886 
887 static int
rkisp_stats_restart_rawhst2_meas(struct rkisp_isp_stats_vdev * stats_vdev)888 rkisp_stats_restart_rawhst2_meas(struct rkisp_isp_stats_vdev *stats_vdev)
889 {
890 	return rkisp_stats_restart_rawhstbig_meas(stats_vdev, 2);
891 }
892 
893 static int
rkisp_stats_restart_rawae3_meas(struct rkisp_isp_stats_vdev * stats_vdev)894 rkisp_stats_restart_rawae3_meas(struct rkisp_isp_stats_vdev *stats_vdev)
895 {
896 	return rkisp_stats_restart_rawaebig_meas(stats_vdev, 0);
897 }
898 
899 static int
rkisp_stats_restart_rawhst3_meas(struct rkisp_isp_stats_vdev * stats_vdev)900 rkisp_stats_restart_rawhst3_meas(struct rkisp_isp_stats_vdev *stats_vdev)
901 {
902 	return rkisp_stats_restart_rawhstbig_meas(stats_vdev, 0);
903 }
904 
905 static int
rkisp_stats_restart_rawae0_meas(struct rkisp_isp_stats_vdev * stats_vdev)906 rkisp_stats_restart_rawae0_meas(struct rkisp_isp_stats_vdev *stats_vdev)
907 {
908 	u32 value;
909 
910 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
911 	if (value & ISP2X_3A_MEAS_DONE)
912 		isp_module_done(stats_vdev, ISP_RAWAE_LITE_CTRL, value);
913 	return 0;
914 }
915 
916 static int
rkisp_stats_restart_rawhst0_meas(struct rkisp_isp_stats_vdev * stats_vdev)917 rkisp_stats_restart_rawhst0_meas(struct rkisp_isp_stats_vdev *stats_vdev)
918 {
919 	u32 value;
920 
921 	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
922 	if (value & ISP2X_3A_MEAS_DONE)
923 		isp_module_done(stats_vdev, ISP_RAWHIST_LITE_CTRL, value);
924 	return 0;
925 }
926 
927 static void
rkisp_stats_restart_meas(struct rkisp_isp_stats_vdev * stats_vdev)928 rkisp_stats_restart_meas(struct rkisp_isp_stats_vdev *stats_vdev)
929 {
930 	rkisp_stats_restart_rawawb_meas(stats_vdev);
931 	rkisp_stats_restart_rawaf_meas(stats_vdev);
932 	rkisp_stats_restart_rawae1_meas(stats_vdev);
933 	rkisp_stats_restart_rawae2_meas(stats_vdev);
934 	rkisp_stats_restart_rawae3_meas(stats_vdev);
935 	rkisp_stats_restart_rawae0_meas(stats_vdev);
936 	rkisp_stats_restart_rawhst1_meas(stats_vdev);
937 	rkisp_stats_restart_rawhst2_meas(stats_vdev);
938 	rkisp_stats_restart_rawhst3_meas(stats_vdev);
939 	rkisp_stats_restart_rawhst0_meas(stats_vdev);
940 }
941 
942 static void
rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)943 rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev *stats_vdev,
944 			  struct rkisp_isp_readout_work *meas_work)
945 {
946 	unsigned int cur_frame_id = -1;
947 	struct rkisp_buffer *cur_buf = stats_vdev->cur_buf;
948 	struct rkisp_isp21_stat_buffer *cur_stat_buf = NULL;
949 	struct rkisp_stats_v21_ops *ops =
950 		(struct rkisp_stats_v21_ops *)stats_vdev->priv_ops;
951 	struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev;
952 	int ret = 0;
953 
954 	cur_frame_id = meas_work->frame_id;
955 	spin_lock(&stats_vdev->rd_lock);
956 	/* get one empty buffer */
957 	if (!cur_buf) {
958 		if (!list_empty(&stats_vdev->stat)) {
959 			cur_buf = list_first_entry(&stats_vdev->stat,
960 						   struct rkisp_buffer, queue);
961 			list_del(&cur_buf->queue);
962 		}
963 	}
964 	spin_unlock(&stats_vdev->rd_lock);
965 
966 	if (cur_buf) {
967 		cur_stat_buf =
968 			(struct rkisp_isp21_stat_buffer *)(cur_buf->vaddr[0]);
969 		cur_stat_buf->frame_id = cur_frame_id;
970 		cur_stat_buf->params_id = params_vdev->cur_frame_id;
971 	}
972 
973 	if (meas_work->isp_ris & ISP2X_AFM_SUM_OF)
974 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
975 			  "ISP2X_AFM_SUM_OF\n");
976 
977 	if (meas_work->isp_ris & ISP2X_AFM_LUM_OF)
978 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
979 			  "ISP2X_AFM_LUM_OF\n");
980 
981 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB)
982 		ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
983 
984 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF)
985 		ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
986 
987 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_SUM)
988 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
989 			  "ISP2X_3A_RAWAF_SUM\n");
990 
991 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_LUM)
992 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
993 			  "ISP2X_3A_RAWAF_LUM\n");
994 
995 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG)
996 		ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
997 
998 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG)
999 		ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
1000 
1001 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0)
1002 		ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
1003 
1004 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1)
1005 		ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
1006 
1007 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2)
1008 		ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
1009 
1010 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0)
1011 		ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
1012 
1013 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1)
1014 		ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
1015 
1016 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2)
1017 		ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
1018 
1019 	if (meas_work->isp_ris & ISP2X_FRAME) {
1020 		ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf);
1021 		ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
1022 	}
1023 
1024 	rkisp_stats_restart_meas(stats_vdev);
1025 
1026 	if (cur_buf && !ret) {
1027 		vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
1028 				      sizeof(struct rkisp_isp2x_stat_buffer));
1029 		cur_buf->vb.sequence = cur_frame_id;
1030 		cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
1031 		vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1032 		cur_buf = NULL;
1033 	}
1034 
1035 	stats_vdev->cur_buf = cur_buf;
1036 }
1037 
1038 static void
rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1039 rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev *stats_vdev,
1040 		    u32 isp_ris, u32 isp3a_ris)
1041 {
1042 	struct rkisp_device *dev = stats_vdev->dev;
1043 	struct rkisp_isp_readout_work work;
1044 	u32 iq_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
1045 		ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF;
1046 	u32 cur_frame_id, isp_mis_tmp = 0, iq_3a_mask = 0;
1047 	u32 wr_buf_idx, temp_isp_ris, temp_isp3a_ris;
1048 
1049 	rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
1050 
1051 	if (IS_HDR_RDBK(dev->hdr.op_mode))
1052 		iq_3a_mask = ISP2X_3A_RAWAE_BIG;
1053 
1054 	spin_lock(&stats_vdev->irq_lock);
1055 
1056 	temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true);
1057 	temp_isp3a_ris = rkisp_read(stats_vdev->dev, ISP_ISP3A_RIS, true);
1058 	isp_mis_tmp = isp_ris & iq_isr_mask;
1059 	if (isp_mis_tmp) {
1060 		rkisp_write(stats_vdev->dev, ISP_ISP_ICR, isp_mis_tmp, true);
1061 
1062 		isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP_MIS, true);
1063 		if (isp_mis_tmp)
1064 			v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1065 				 "isp icr 3A info err: 0x%x 0x%x\n",
1066 				 isp_mis_tmp, isp_ris);
1067 	}
1068 
1069 	isp_mis_tmp = isp3a_ris & iq_3a_mask;
1070 	if (isp_mis_tmp) {
1071 		rkisp_write(stats_vdev->dev, ISP_ISP3A_ICR, isp_mis_tmp, true);
1072 
1073 		isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP3A_MIS, true);
1074 		if (isp_mis_tmp)
1075 			v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1076 				 "isp3A icr 3A info err: 0x%x 0x%x\n",
1077 				 isp_mis_tmp, isp_ris);
1078 	}
1079 
1080 	if (!stats_vdev->streamon)
1081 		goto unlock;
1082 
1083 	if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) {
1084 		wr_buf_idx = stats_vdev->wr_buf_idx;
1085 		stats_vdev->rd_buf_idx = wr_buf_idx;
1086 		rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]);
1087 		wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
1088 		stats_vdev->wr_buf_idx = wr_buf_idx;
1089 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1090 			    RKISP_RD_STATS_BUF_SIZE, false);
1091 		rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1092 			    stats_vdev->stats_buf[wr_buf_idx].dma_addr, false);
1093 		rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1094 			       SW_3A_DDR_WRITE_EN, false);
1095 	}
1096 
1097 
1098 	if (isp_ris & CIF_ISP_FRAME) {
1099 		work.readout = RKISP_ISP_READOUT_MEAS;
1100 		work.frame_id = cur_frame_id;
1101 		work.isp_ris = temp_isp_ris | isp_ris;
1102 		work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
1103 		work.timestamp = ktime_get_ns();
1104 
1105 		rkisp_stats_send_meas_v21(stats_vdev, &work);
1106 	}
1107 
1108 unlock:
1109 	spin_unlock(&stats_vdev->irq_lock);
1110 }
1111 
1112 static void
rkisp_stats_rdbk_enable_v21(struct rkisp_isp_stats_vdev * stats_vdev,bool en)1113 rkisp_stats_rdbk_enable_v21(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
1114 {
1115 	if (!en) {
1116 		stats_vdev->isp_rdbk = 0;
1117 		stats_vdev->isp3a_rdbk = 0;
1118 	}
1119 
1120 	stats_vdev->rdbk_mode = en;
1121 }
1122 
1123 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
1124 	.isr_hdl = rkisp_stats_isr_v21,
1125 	.send_meas = rkisp_stats_send_meas_v21,
1126 	.rdbk_enable = rkisp_stats_rdbk_enable_v21,
1127 };
1128 
rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev * stats_vdev)1129 void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev)
1130 {
1131 	stats_vdev->rd_stats_from_ddr = false;
1132 	stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
1133 
1134 	if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode) &&
1135 	    stats_vdev->stats_buf[0].mem_priv) {
1136 		stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21;
1137 		stats_vdev->rd_stats_from_ddr = true;
1138 		stats_vdev->rd_buf_idx = 0;
1139 		stats_vdev->wr_buf_idx = 0;
1140 
1141 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1142 			    RKISP_RD_STATS_BUF_SIZE, false);
1143 		rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1144 			    stats_vdev->stats_buf[0].dma_addr, false);
1145 		rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1146 			       SW_3A_DDR_WRITE_EN, false);
1147 	}
1148 }
1149 
rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev * stats_vdev)1150 void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
1151 {
1152 	int i;
1153 
1154 	stats_vdev->vdev_fmt.fmt.meta.dataformat =
1155 		V4L2_META_FMT_RK_ISP1_STAT_3A;
1156 	stats_vdev->vdev_fmt.fmt.meta.buffersize =
1157 		sizeof(struct rkisp_isp2x_stat_buffer);
1158 
1159 	stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
1160 	stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
1161 	stats_vdev->rd_stats_from_ddr = false;
1162 
1163 	for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
1164 		stats_vdev->stats_buf[i].is_need_vaddr = true;
1165 		stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
1166 		rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1167 	}
1168 }
1169 
rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev * stats_vdev)1170 void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
1171 {
1172 	int i;
1173 
1174 	for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
1175 		rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1176 }
1177 
1178