xref: /linux/drivers/media/platform/dreamchip/rppx1/rppx1_ga.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 "rpp_module.h"
9 
10 #define GAMMA_OUT_VERSION_REG			0x0000
11 
12 #define GAMMA_OUT_ENABLE_REG			0x0004
13 #define GAMMA_OUT_ENABLE_GAMMA_OUT_EN		BIT(0)
14 
15 #define GAMMA_OUT_MODE_REG			0x0008
16 #define GAMMA_OUT_MODE_GAMMA_OUT_EQU_SEGM	BIT(0)
17 
18 #define GAMMA_OUT_Y_REG(n)			(0x000c + (4 * (n)))
19 
20 #define GAMMA_OUT_HV_GAMMA_CURVE_MASK		GENMASK(11, 0)
21 #define GAMMA_OUT_MV_GAMMA_CURVE_MASK		GENMASK(23, 0)
22 
23 static int rppx1_ga_probe(struct rpp_module *mod)
24 {
25 	/* Version check. */
26 	switch (rpp_module_read(mod, GAMMA_OUT_VERSION_REG)) {
27 	case 1:
28 		/* 12-bit. */
29 		break;
30 	case 2:
31 		/* 24-bit. */
32 		break;
33 	default:
34 		return -EINVAL;
35 	}
36 
37 	return 0;
38 }
39 
40 static int rppx1_ga_start(struct rpp_module *mod,
41 			  const struct v4l2_mbus_framefmt *fmt)
42 {
43 	/* Disable stage. */
44 	rpp_module_write(mod, GAMMA_OUT_ENABLE_REG, 0);
45 
46 	return 0;
47 }
48 
49 static int
50 rppx1_ga_fill_params(struct rpp_module *mod,
51 		     const union rppx1_params_block *block,
52 		     rppx1_reg_write write, void *priv)
53 {
54 	const struct rppx1_ga_params *cfg = &block->ga;
55 	u32 mask;
56 
57 	/* If the modules is disabled, simply bypass it. */
58 	if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
59 		write(priv, mod->base + GAMMA_OUT_ENABLE_REG, 0);
60 		return 0;
61 	}
62 
63 	switch (cfg->header.type) {
64 	case RPPX1_PARAMS_BLOCK_TYPE_GA_HV:
65 		mask = GAMMA_OUT_HV_GAMMA_CURVE_MASK;
66 		break;
67 	case RPPX1_PARAMS_BLOCK_TYPE_GA_MV:
68 		mask = GAMMA_OUT_MV_GAMMA_CURVE_MASK;
69 		break;
70 	default:
71 		return -EINVAL;
72 	}
73 
74 	write(priv, mod->base + GAMMA_OUT_MODE_REG, cfg->mode);
75 
76 	for (unsigned int i = 0; i < RPPX1_GA_MAX_SAMPLES; i++)
77 		write(priv, mod->base + GAMMA_OUT_Y_REG(i),
78 		      cfg->gamma_y[i] & mask);
79 
80 	/* Enable module. */
81 	write(priv, mod->base + GAMMA_OUT_ENABLE_REG,
82 	      GAMMA_OUT_ENABLE_GAMMA_OUT_EN);
83 
84 	return 0;
85 }
86 
87 const struct rpp_module_ops rppx1_ga_ops = {
88 	.probe = rppx1_ga_probe,
89 	.start = rppx1_ga_start,
90 	.fill_params = rppx1_ga_fill_params,
91 };
92