xref: /linux/drivers/media/platform/dreamchip/rppx1/rpp_stats.c (revision f4cdf7ca9a1fdcca413157df19753f388a5a224e)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2026 Renesas Electronics Corp.
4  * Copyright (C) 2026 Ideas on Board Oy
5  * Copyright (C) 2026 Ragnatech AB
6  */
7 
8 #include "rppx1.h"
9 #include "rpp_module.h"
10 
11 #include <media/v4l2-isp.h>
12 
13 #define RPPX1_STATS_BLOCK_INFO(type, block) \
14 	[RPPX1_STATS_BLOCK_TYPE_ ## type] = { \
15 		.size = sizeof(struct rppx1_ ## block ## _stats), \
16 	}
17 
18 static const struct v4l2_isp_stats_block_type_info
19 rppx1_stats_blocks_info[] = {
20 	RPPX1_STATS_BLOCK_INFO(HIST_POST, hist),
21 	RPPX1_STATS_BLOCK_INFO(EXM_PRE1, exm),
22 	RPPX1_STATS_BLOCK_INFO(WBMEAS_POST, wbmeas),
23 };
24 
25 #define rppx1_init_stats_block(rpp, buf, type)				\
26 	((union rppx1_stats_block *)					\
27 	v4l2_isp_stats_init_block((rpp)->dev, (buf),			\
28 				  rppx1_stats_blocks_info,		\
29 				  ARRAY_SIZE(rppx1_stats_blocks_info),	\
30 				  (type), RPPX1_STATS_MAX_SIZE))	\
31 
32 void rppx1_stats_fill_isr(struct rppx1 *rpp, u32 isc, void *buf)
33 {
34 	struct v4l2_isp_buffer *stats = buf;
35 	union rppx1_stats_block *block;
36 
37 	v4l2_isp_stats_init_buffer(stats, V4L2_ISP_VERSION_V1);
38 
39 	if (isc & RPPX1_IRQ_ID_POST_HIST_MEAS) {
40 		block = rppx1_init_stats_block(rpp, stats,
41 					       RPPX1_STATS_BLOCK_TYPE_HIST_POST);
42 		if (IS_ERR(block))
43 			return;
44 
45 		rpp_module_call(&rpp->post.hist, fill_stats, block);
46 	}
47 
48 	if (isc & RPPX1_IRQ_ID_PRE1_EXM) {
49 		block = rppx1_init_stats_block(rpp, stats,
50 					       RPPX1_STATS_BLOCK_TYPE_EXM_PRE1);
51 		if (IS_ERR(block))
52 			return;
53 
54 		rpp_module_call(&rpp->pre1.exm, fill_stats, block);
55 	}
56 
57 	if (isc & RPPX1_IRQ_ID_POST_AWB_MEAS) {
58 		block = rppx1_init_stats_block(rpp, stats,
59 					       RPPX1_STATS_BLOCK_TYPE_WBMEAS_POST);
60 		if (IS_ERR(block))
61 			return;
62 
63 		rpp_module_call(&rpp->post.wbmeas, fill_stats, block);
64 	}
65 }
66 EXPORT_SYMBOL_GPL(rppx1_stats_fill_isr);
67