xref: /linux/drivers/media/platform/dreamchip/rppx1/rpp_params.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 <media/v4l2-isp.h>
9b562e72bSNiklas Söderlund #include <media/videobuf2-v4l2.h>
10b562e72bSNiklas Söderlund 
11b562e72bSNiklas Söderlund #include "rppx1.h"
12b562e72bSNiklas Söderlund 
13b562e72bSNiklas Söderlund #define RPPX1_PARAMS_BLOCK_INFO(block, data) \
14b562e72bSNiklas Söderlund 	[RPPX1_PARAMS_BLOCK_TYPE_ ## block] = { \
15b562e72bSNiklas Söderlund 		.size = sizeof(struct rppx1_ ## data ## _params), \
16b562e72bSNiklas Söderlund 	}
17b562e72bSNiklas Söderlund 
18b562e72bSNiklas Söderlund static const struct v4l2_isp_params_block_type_info
19b562e72bSNiklas Söderlund rppx1_ext_params_blocks_info[] = {
203f8a2a88SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(BLS_PRE1, bls),
213f8a2a88SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(BLS_PRE2, bls),
22*46542592SJai Luthra 	RPPX1_PARAMS_BLOCK_INFO(LIN_PRE1, lin),
23*46542592SJai Luthra 	RPPX1_PARAMS_BLOCK_INFO(LIN_PRE2, lin),
24b39656efSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(LSC_PRE1, lsc),
25b39656efSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(LSC_PRE2, lsc),
269ebf5001SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(AWBG_PRE1, awbg),
279ebf5001SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(AWBG_PRE2, awbg),
28aaeee9b7SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(CCOR_POST, ccor),
299a52f7deSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(HIST_PRE1, hist),
309a52f7deSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(HIST_PRE2, hist),
319a52f7deSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(HIST_POST, hist),
32b020bec4SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(EXM_PRE1, exm),
33b020bec4SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(EXM_PRE2, exm),
34884d6794SNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(WBMEAS_POST, wbmeas),
35d011daefSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(GA_HV, ga),
36d011daefSNiklas Söderlund 	RPPX1_PARAMS_BLOCK_INFO(GA_MV, ga),
37b562e72bSNiklas Söderlund };
38b562e72bSNiklas Söderlund 
39b562e72bSNiklas Söderlund int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size,
40b562e72bSNiklas Söderlund 		 rppx1_reg_write write, void *priv)
41b562e72bSNiklas Söderlund {
42b562e72bSNiklas Söderlund 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
43b562e72bSNiklas Söderlund 	struct v4l2_isp_buffer *cfg;
44b562e72bSNiklas Söderlund 	size_t block_offset;
45b562e72bSNiklas Söderlund 	int ret;
46b562e72bSNiklas Söderlund 
47b562e72bSNiklas Söderlund 	ret = v4l2_isp_params_validate_buffer_size(rpp->dev, vb, max_size);
48b562e72bSNiklas Söderlund 	if (ret)
49b562e72bSNiklas Söderlund 		return ret;
50b562e72bSNiklas Söderlund 
51b562e72bSNiklas Söderlund 	cfg = vb2_plane_vaddr(&vbuf->vb2_buf, 0);
52b562e72bSNiklas Söderlund 
53b562e72bSNiklas Söderlund 	ret = v4l2_isp_params_validate_buffer(rpp->dev, vb, cfg,
54b562e72bSNiklas Söderlund 					      rppx1_ext_params_blocks_info,
55b562e72bSNiklas Söderlund 					      ARRAY_SIZE(rppx1_ext_params_blocks_info));
56b562e72bSNiklas Söderlund 	if (ret)
57b562e72bSNiklas Söderlund 		return ret;
58b562e72bSNiklas Söderlund 
59b562e72bSNiklas Söderlund 	/* Walk the list of parameter blocks and process them. */
60b562e72bSNiklas Söderlund 	block_offset = 0;
61b562e72bSNiklas Söderlund 	while (block_offset < cfg->data_size) {
62b562e72bSNiklas Söderlund 		const union rppx1_params_block *block =
63b562e72bSNiklas Söderlund 			(const union rppx1_params_block *)&cfg->data[block_offset];
64b562e72bSNiklas Söderlund 		struct rpp_module *module;
65b562e72bSNiklas Söderlund 		int ret;
66b562e72bSNiklas Söderlund 
67b562e72bSNiklas Söderlund 		block_offset += block->header.size;
68b562e72bSNiklas Söderlund 
69b562e72bSNiklas Söderlund 		switch (block->header.type) {
703f8a2a88SNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_BLS_PRE1:
713f8a2a88SNiklas Söderlund 			module = &rpp->pre1.bls;
723f8a2a88SNiklas Söderlund 			break;
73*46542592SJai Luthra 		case RPPX1_PARAMS_BLOCK_TYPE_LIN_PRE1:
74*46542592SJai Luthra 			module = &rpp->pre1.lin;
75*46542592SJai Luthra 			break;
76b39656efSNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_LSC_PRE1:
77b39656efSNiklas Söderlund 			module = &rpp->pre1.lsc;
78b39656efSNiklas Söderlund 			break;
799ebf5001SNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1:
809ebf5001SNiklas Söderlund 			module = &rpp->pre1.awbg;
819ebf5001SNiklas Söderlund 			break;
82aaeee9b7SNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_CCOR_POST:
83aaeee9b7SNiklas Söderlund 			module = &rpp->post.ccor;
84aaeee9b7SNiklas Söderlund 			break;
859a52f7deSNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_HIST_POST:
869a52f7deSNiklas Söderlund 			module = &rpp->post.hist;
879a52f7deSNiklas Söderlund 			break;
88b020bec4SNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_EXM_PRE1:
89b020bec4SNiklas Söderlund 			module = &rpp->pre1.exm;
90b020bec4SNiklas Söderlund 			break;
91884d6794SNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST:
92884d6794SNiklas Söderlund 			module = &rpp->post.wbmeas;
93884d6794SNiklas Söderlund 			break;
94d011daefSNiklas Söderlund 		case RPPX1_PARAMS_BLOCK_TYPE_GA_HV:
95d011daefSNiklas Söderlund 			module = &rpp->hv.ga;
96d011daefSNiklas Söderlund 			break;
97b562e72bSNiklas Söderlund 		default:
98b562e72bSNiklas Söderlund 			dev_warn(rpp->dev,
99b562e72bSNiklas Söderlund 				 "Not handled RPPX1 block type: 0x%04x\n",
100b562e72bSNiklas Söderlund 				 block->header.type);
101b562e72bSNiklas Söderlund 			continue;
102b562e72bSNiklas Söderlund 		}
103b562e72bSNiklas Söderlund 
104b562e72bSNiklas Söderlund 		ret = rpp_module_call(module, fill_params, block, write, priv);
105b562e72bSNiklas Söderlund 		if (ret) {
106b562e72bSNiklas Söderlund 			dev_err(rpp->dev,
107b562e72bSNiklas Söderlund 				"Error processing RPPX1 block type: 0x%04x\n",
108b562e72bSNiklas Söderlund 				block->header.type);
109b562e72bSNiklas Söderlund 			return ret;
110b562e72bSNiklas Söderlund 		}
111b562e72bSNiklas Söderlund 	}
112b562e72bSNiklas Söderlund 
113b562e72bSNiklas Söderlund 	return 0;
114b562e72bSNiklas Söderlund }
115b562e72bSNiklas Söderlund EXPORT_SYMBOL_GPL(rppx1_params);
116