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