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