[PATCH v7 15/18] media: rppx1: Add support for Gamma Correction
From: Jai Luthra
Date: Fri Apr 10 2026 - 05:10:17 EST
From: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
Extend the RPPX1 driver to allow setting the Gamma Correction
configuration using the parameter buffer format. It uses the RPPX1
framework for parameters and its writer abstraction to allow the user to
control how (and when) configuration is applied to the RPPX1.
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
Signed-off-by: Jai Luthra <jai.luthra+renesas@xxxxxxxxxxxxxxxx>
---
.../media/platform/dreamchip/rppx1/rpp_params.c | 4 +++
drivers/media/platform/dreamchip/rppx1/rppx1_ga.c | 34 ++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_params.c b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
index 386c36fe0e19fa52d53691d77405d31d844c5445..9969517eb1902d1002ea3c7b26a6ca15fa974fa6 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_params.c
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
@@ -19,6 +19,7 @@ rppx1_ext_params_blocks_info[] = {
RPPX1_PARAMS_BLOCK_INFO(BLS, bls),
RPPX1_PARAMS_BLOCK_INFO(AWB_GAIN, awb_gain),
RPPX1_PARAMS_BLOCK_INFO(CTK, ctk),
+ RPPX1_PARAMS_BLOCK_INFO(GOC, goc),
RPPX1_PARAMS_BLOCK_INFO(LSC, lsc),
RPPX1_PARAMS_BLOCK_INFO(AWB_MEAS, awb_meas),
RPPX1_PARAMS_BLOCK_INFO(HST_MEAS, hst),
@@ -66,6 +67,9 @@ int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size,
case RPPX1_PARAMS_BLOCK_TYPE_CTK:
module = &rpp->post.ccor;
break;
+ case RPPX1_PARAMS_BLOCK_TYPE_GOC:
+ module = &rpp->hv.ga;
+ break;
case RPPX1_PARAMS_BLOCK_TYPE_LSC:
module = &rpp->pre1.lsc;
break;
diff --git a/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c b/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c
index d6c7f951cf2972a8d633b7915818e26f8d0a1cf5..18b527569c8ecf9ccfd5f92f67e51371a068af8e 100644
--- a/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c
+++ b/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c
@@ -43,7 +43,41 @@ static int rppx1_ga_start(struct rpp_module *mod,
return 0;
}
+static int
+rppx1_ga_fill_params(struct rpp_module *mod,
+ const union rppx1_params_block *block,
+ rppx1_reg_write write, void *priv)
+{
+ const struct rppx1_params_goc_config *cfg = &block->goc;
+
+ /* If the modules is disabled, simply bypass it. */
+ if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ write(priv, mod->base + GAMMA_OUT_ENABLE_REG, 0);
+ return 0;
+ }
+
+ write(priv, mod->base + GAMMA_OUT_MODE_REG,
+ cfg->mode ? GAMMA_OUT_ENABLE_GAMMA_OUT_EN : 0);
+
+ /*
+ * The native params are 24-bit while the RPP can be 12 or 24 bit.
+ * Figure out how much we need to adjust the input values.
+ */
+ const unsigned int shift = 24 - mod->info.ga.colorbits;
+
+ for (unsigned int i = 0; i < RPPX1_GAMMA_OUT_MAX_SAMPLES; i++)
+ write(priv, mod->base + GAMMA_OUT_Y_REG(i),
+ cfg->gamma_y[i] >> shift);
+
+ /* Enable module. */
+ write(priv, mod->base + GAMMA_OUT_ENABLE_REG,
+ GAMMA_OUT_ENABLE_GAMMA_OUT_EN);
+
+ return 0;
+}
+
const struct rpp_module_ops rppx1_ga_ops = {
.probe = rppx1_ga_probe,
.start = rppx1_ga_start,
+ .fill_params = rppx1_ga_fill_params,
};
--
2.53.0