xref: /linux/drivers/media/platform/dreamchip/rppx1/rpp_stats.c (revision f4cdf7ca9a1fdcca413157df19753f388a5a224e)
1b562e72bSNiklas Söderlund // SPDX-License-Identifier: GPL-2.0
2b562e72bSNiklas Söderlund /*
3b562e72bSNiklas Söderlund  * Copyright (C) 2026 Renesas Electronics Corp.
4b562e72bSNiklas Söderlund  * Copyright (C) 2026 Ideas on Board Oy
5b562e72bSNiklas Söderlund  * Copyright (C) 2026 Ragnatech AB
6b562e72bSNiklas Söderlund  */
7b562e72bSNiklas Söderlund 
8b562e72bSNiklas Söderlund #include "rppx1.h"
9b562e72bSNiklas Söderlund #include "rpp_module.h"
10b562e72bSNiklas Söderlund 
11b562e72bSNiklas Söderlund #include <media/v4l2-isp.h>
12b562e72bSNiklas Söderlund 
13b562e72bSNiklas Söderlund #define RPPX1_STATS_BLOCK_INFO(type, block) \
14b562e72bSNiklas Söderlund 	[RPPX1_STATS_BLOCK_TYPE_ ## type] = { \
15b562e72bSNiklas Söderlund 		.size = sizeof(struct rppx1_ ## block ## _stats), \
16b562e72bSNiklas Söderlund 	}
17b562e72bSNiklas Söderlund 
18884d6794SNiklas Söderlund static const struct v4l2_isp_stats_block_type_info
19884d6794SNiklas Söderlund rppx1_stats_blocks_info[] = {
20*9a52f7deSNiklas Söderlund 	RPPX1_STATS_BLOCK_INFO(HIST_POST, hist),
21b020bec4SNiklas Söderlund 	RPPX1_STATS_BLOCK_INFO(EXM_PRE1, exm),
22884d6794SNiklas Söderlund 	RPPX1_STATS_BLOCK_INFO(WBMEAS_POST, wbmeas),
23884d6794SNiklas Söderlund };
24884d6794SNiklas Söderlund 
25b562e72bSNiklas Söderlund #define rppx1_init_stats_block(rpp, buf, type)				\
26b562e72bSNiklas Söderlund 	((union rppx1_stats_block *)					\
27b562e72bSNiklas Söderlund 	v4l2_isp_stats_init_block((rpp)->dev, (buf),			\
28b562e72bSNiklas Söderlund 				  rppx1_stats_blocks_info,		\
29b562e72bSNiklas Söderlund 				  ARRAY_SIZE(rppx1_stats_blocks_info),	\
30b562e72bSNiklas Söderlund 				  (type), RPPX1_STATS_MAX_SIZE))	\
31b562e72bSNiklas Söderlund 
32b562e72bSNiklas Söderlund void rppx1_stats_fill_isr(struct rppx1 *rpp, u32 isc, void *buf)
33b562e72bSNiklas Söderlund {
34884d6794SNiklas Söderlund 	struct v4l2_isp_buffer *stats = buf;
35884d6794SNiklas Söderlund 	union rppx1_stats_block *block;
36884d6794SNiklas Söderlund 
37884d6794SNiklas Söderlund 	v4l2_isp_stats_init_buffer(stats, V4L2_ISP_VERSION_V1);
38884d6794SNiklas Söderlund 
39*9a52f7deSNiklas Söderlund 	if (isc & RPPX1_IRQ_ID_POST_HIST_MEAS) {
40*9a52f7deSNiklas Söderlund 		block = rppx1_init_stats_block(rpp, stats,
41*9a52f7deSNiklas Söderlund 					       RPPX1_STATS_BLOCK_TYPE_HIST_POST);
42*9a52f7deSNiklas Söderlund 		if (IS_ERR(block))
43*9a52f7deSNiklas Söderlund 			return;
44*9a52f7deSNiklas Söderlund 
45*9a52f7deSNiklas Söderlund 		rpp_module_call(&rpp->post.hist, fill_stats, block);
46*9a52f7deSNiklas Söderlund 	}
47*9a52f7deSNiklas Söderlund 
48b020bec4SNiklas Söderlund 	if (isc & RPPX1_IRQ_ID_PRE1_EXM) {
49b020bec4SNiklas Söderlund 		block = rppx1_init_stats_block(rpp, stats,
50b020bec4SNiklas Söderlund 					       RPPX1_STATS_BLOCK_TYPE_EXM_PRE1);
51b020bec4SNiklas Söderlund 		if (IS_ERR(block))
52b020bec4SNiklas Söderlund 			return;
53b020bec4SNiklas Söderlund 
54b020bec4SNiklas Söderlund 		rpp_module_call(&rpp->pre1.exm, fill_stats, block);
55b020bec4SNiklas Söderlund 	}
56b020bec4SNiklas Söderlund 
57884d6794SNiklas Söderlund 	if (isc & RPPX1_IRQ_ID_POST_AWB_MEAS) {
58884d6794SNiklas Söderlund 		block = rppx1_init_stats_block(rpp, stats,
59884d6794SNiklas Söderlund 					       RPPX1_STATS_BLOCK_TYPE_WBMEAS_POST);
60884d6794SNiklas Söderlund 		if (IS_ERR(block))
61884d6794SNiklas Söderlund 			return;
62884d6794SNiklas Söderlund 
63884d6794SNiklas Söderlund 		rpp_module_call(&rpp->post.wbmeas, fill_stats, block);
64884d6794SNiklas Söderlund 	}
65b562e72bSNiklas Söderlund }
66b562e72bSNiklas Söderlund EXPORT_SYMBOL_GPL(rppx1_stats_fill_isr);
67