[PATCH v7 16/18] media: rppx1: Add support for Bayer Demosaicing
From: Jai Luthra
Date: Fri Apr 10 2026 - 05:10:28 EST
From: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
Extend the RPPX1 driver to allow setting the Bayer Demosaicing
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 | 7 ++
drivers/media/platform/dreamchip/rppx1/rppx1_db.c | 82 ++++++++++++++++++++++
2 files changed, 89 insertions(+)
diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_params.c b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
index 9969517eb1902d1002ea3c7b26a6ca15fa974fa6..07ce9d22265a444038bb8bdc91c129a47cb94e0d 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_params.c
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
@@ -18,6 +18,8 @@ static const struct v4l2_isp_params_block_type_info
rppx1_ext_params_blocks_info[] = {
RPPX1_PARAMS_BLOCK_INFO(BLS, bls),
RPPX1_PARAMS_BLOCK_INFO(AWB_GAIN, awb_gain),
+ RPPX1_PARAMS_BLOCK_INFO(FLT, flt),
+ RPPX1_PARAMS_BLOCK_INFO(BDM, bdm),
RPPX1_PARAMS_BLOCK_INFO(CTK, ctk),
RPPX1_PARAMS_BLOCK_INFO(GOC, goc),
RPPX1_PARAMS_BLOCK_INFO(LSC, lsc),
@@ -64,6 +66,11 @@ int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size,
case RPPX1_PARAMS_BLOCK_TYPE_AWB_GAIN:
module = &rpp->pre1.awbg;
break;
+ case RPPX1_PARAMS_BLOCK_TYPE_FLT:
+ case RPPX1_PARAMS_BLOCK_TYPE_BDM:
+ /* Both types handled by the same block. */
+ module = &rpp->post.db;
+ break;
case RPPX1_PARAMS_BLOCK_TYPE_CTK:
module = &rpp->post.ccor;
break;
diff --git a/drivers/media/platform/dreamchip/rppx1/rppx1_db.c b/drivers/media/platform/dreamchip/rppx1/rppx1_db.c
index 5e233896cfc8b66e7d90770171b77a2fabc3cd9b..c9f6d2d0dc57eec1adc11bef4fca4e1a52afb0e6 100644
--- a/drivers/media/platform/dreamchip/rppx1/rppx1_db.c
+++ b/drivers/media/platform/dreamchip/rppx1/rppx1_db.c
@@ -39,6 +39,88 @@ static int rppx1_db_probe(struct rpp_module *mod)
return 0;
}
+static int
+rppx1_db_fill_params_flt(struct rpp_module *mod,
+ const union rppx1_params_block *block,
+ rppx1_reg_write write, void *priv)
+{
+ const struct rppx1_params_flt_config *cfg = &block->flt;
+
+ /* If the modules is disabled, simply bypass it. */
+ if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ write(priv, mod->base + FILT_MODE_REG, 0);
+ return 0;
+ }
+
+ /* Native values are at RPP 18-bit precision. */
+ write(priv, mod->base + FILT_THRESH_BL0_REG, cfg->thresh_bl0);
+ write(priv, mod->base + FILT_THRESH_BL0_REG, cfg->thresh_bl1);
+ write(priv, mod->base + FILT_THRESH_SH0_REG, cfg->thresh_sh0);
+ write(priv, mod->base + FILT_THRESH_SH1_REG, cfg->thresh_sh1);
+
+ /* Native values are at RPP 8-bit precision. */
+ write(priv, mod->base + FILT_FAC_BL0_REG, cfg->fac_bl0);
+ write(priv, mod->base + FILT_FAC_BL1_REG, cfg->fac_bl1);
+ write(priv, mod->base + FILT_FAC_MID_REG, cfg->fac_mid);
+ write(priv, mod->base + FILT_FAC_SH0_REG, cfg->fac_sh0);
+ write(priv, mod->base + FILT_FAC_SH1_REG, cfg->fac_sh1);
+
+ /*
+ * The lum_weight field is provided in RPP register format:
+ *
+ * 31 unused
+ * 30:28 lum_weight_gain
+ * 27:24 unused
+ * 23:12 lum_weight_kink
+ * 11:0 lum_weight_min
+ */
+ write(priv, mod->base + FILT_LUM_WEIGHT_REG, cfg->lum_weight);
+
+ write(priv, mod->base + FILT_MODE_REG,
+ (cfg->chr_v_mode << 4) |
+ (cfg->chr_h_mode << 6) |
+ (cfg->grn_stage1 << 8) |
+ (cfg->mode ? FILT_MODE_FILT_MODE : 0) |
+ FILT_MODE_FILT_ENABLE);
+
+ return 0;
+}
+
+static int
+rppx1_db_fill_params_bdm(struct rpp_module *mod,
+ const union rppx1_params_block *block,
+ rppx1_reg_write write, void *priv)
+{
+ const struct rppx1_params_bdm_config *cfg = &block->bdm;
+
+ /* If the modules is disabled, simply bypass it. */
+ if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ write(priv, mod->base + DEMOSAIC_REG, 0x400);
+ return 0;
+ }
+
+ /* Native threshold is at RPP 16-bit precision. */
+ write(priv, mod->base + DEMOSAIC_REG, cfg->demosaic_th);
+
+ return 0;
+}
+
+static int
+rppx1_db_fill_params(struct rpp_module *mod,
+ const union rppx1_params_block *block,
+ rppx1_reg_write write, void *priv)
+{
+ switch (block->header.type) {
+ case RPPX1_PARAMS_BLOCK_TYPE_FLT:
+ return rppx1_db_fill_params_flt(mod, block, write, priv);
+ case RPPX1_PARAMS_BLOCK_TYPE_BDM:
+ return rppx1_db_fill_params_bdm(mod, block, write, priv);
+ }
+
+ return -EINVAL;
+}
+
const struct rpp_module_ops rppx1_db_ops = {
.probe = rppx1_db_probe,
+ .fill_params = rppx1_db_fill_params,
};
--
2.53.0