[PATCH v7 18/18] media: rppx1: Add support for Sensor (Gamma) Linearization

From: Jai Luthra

Date: Fri Apr 10 2026 - 05:10:57 EST


Extend the RPPX1 driver to allow setting the Sensor (Gamma)
Linearization 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: Jai Luthra <jai.luthra+renesas@xxxxxxxxxxxxxxxx>
---
.../media/platform/dreamchip/rppx1/rpp_params.c | 4 +++
drivers/media/platform/dreamchip/rppx1/rppx1_lin.c | 31 ++++++++++++++++++++++
2 files changed, 35 insertions(+)

diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_params.c b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
index 2847647dcf42d7975dee446c8e29c87828db746c..696688856540a88e28ec6ccaa9cd436c64cc9edc 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_params.c
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
@@ -17,6 +17,7 @@
static const struct v4l2_isp_params_block_type_info
rppx1_ext_params_blocks_info[] = {
RPPX1_PARAMS_BLOCK_INFO(BLS, bls),
+ RPPX1_PARAMS_BLOCK_INFO(LIN, lin),
RPPX1_PARAMS_BLOCK_INFO(AWB_GAIN, awb_gain),
RPPX1_PARAMS_BLOCK_INFO(FLT, flt),
RPPX1_PARAMS_BLOCK_INFO(BDM, bdm),
@@ -65,6 +66,9 @@ int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size,
case RPPX1_PARAMS_BLOCK_TYPE_BLS:
module = &rpp->pre1.bls;
break;
+ case RPPX1_PARAMS_BLOCK_TYPE_LIN:
+ module = &rpp->pre1.lin;
+ break;
case RPPX1_PARAMS_BLOCK_TYPE_AWB_GAIN:
module = &rpp->pre1.awbg;
break;
diff --git a/drivers/media/platform/dreamchip/rppx1/rppx1_lin.c b/drivers/media/platform/dreamchip/rppx1/rppx1_lin.c
index e4b0a7be76656c4bc04408500c7ca60709bebf79..24c005ba9b9287504113bbea83f8a076f88df423 100644
--- a/drivers/media/platform/dreamchip/rppx1/rppx1_lin.c
+++ b/drivers/media/platform/dreamchip/rppx1/rppx1_lin.c
@@ -54,7 +54,38 @@ static int rppx1_lin_start(struct rpp_module *mod,
return 0;
}

+static int rppx1_lin_fill_params(struct rpp_module *mod,
+ const union rppx1_params_block *block,
+ rppx1_reg_write write, void *priv)
+{
+ const struct rppx1_params_lin_config *cfg = &block->lin;
+ const unsigned int shift = 24 - mod->info.lin.colorbits;
+
+ if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ write(priv, mod->base + LIN_ENABLE_REG, 0);
+ return 0;
+ }
+
+ write(priv, mod->base + LIN_DX_LO_REG, cfg->xa_pnts.gamma_dx[0]);
+ write(priv, mod->base + LIN_DX_HI_REG, cfg->xa_pnts.gamma_dx[1]);
+
+ for (unsigned int i = 0; i < LIN_SAMPLES_NUM; i++) {
+ write(priv, mod->base + LIN_R_Y_REG(i),
+ cfg->curve_r.gamma_y[i] >> shift);
+ write(priv, mod->base + LIN_G_Y_REG(i),
+ cfg->curve_g.gamma_y[i] >> shift);
+ write(priv, mod->base + LIN_B_Y_REG(i),
+ cfg->curve_b.gamma_y[i] >> shift);
+ }
+
+ if ((cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_ENABLE))
+ write(priv, mod->base + LIN_ENABLE_REG, LIN_ENABLE_GAMMA_IN_EN);
+
+ return 0;
+}
+
const struct rpp_module_ops rppx1_lin_ops = {
.probe = rppx1_lin_probe,
.start = rppx1_lin_start,
+ .fill_params = rppx1_lin_fill_params,
};

--
2.53.0