On Thu Jul 30 19:12:34 2026 +0200, Niklas Söderlund wrote:
> Extend the RPPX1 driver to allow setting the white balance gain
> configuration parameters. 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 <[email protected]>
> Co-developed-by: Jai Luthra <[email protected]>
> Signed-off-by: Jai Luthra <[email protected]>
> Co-developed-by: Jacopo Mondi <[email protected]>
> Signed-off-by: Jacopo Mondi <[email protected]>
> Reviewed-by: Jacopo Mondi <[email protected]>
> Signed-off-by: Sakari Ailus <[email protected]>

Patch committed.

Thanks,
Sakari Ailus

 .../media/platform/dreamchip/rppx1/rpp_module.h    |  1 +
 .../media/platform/dreamchip/rppx1/rpp_params.c    |  5 +++
 .../media/platform/dreamchip/rppx1/rppx1_awbg.c    | 32 +++++++++++++++++
 include/uapi/linux/media/dreamchip/rppx1-config.h  | 40 +++++++++++++++++++++-
 4 files changed, 77 insertions(+), 1 deletion(-)

---

diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_module.h 
b/drivers/media/platform/dreamchip/rppx1/rpp_module.h
index 64a1b848f1ea..0e36b717b4ef 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_module.h
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_module.h
@@ -47,6 +47,7 @@ void rpp_module_clrset(struct rpp_module *mod, u32 offset, 
u32 mask, u32 value);
 
 union rppx1_params_block {
        struct v4l2_isp_block_header header;
+       struct rppx1_awbg_params awbg;
        struct rppx1_wbmeas_params wbmeas;
 };
 
diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_params.c 
b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
index 7325abeba92a..17bbcf366970 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_params.c
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
@@ -17,6 +17,8 @@
 
 static const struct v4l2_isp_params_block_type_info
 rppx1_ext_params_blocks_info[] = {
+       RPPX1_PARAMS_BLOCK_INFO(AWBG_PRE1, awbg),
+       RPPX1_PARAMS_BLOCK_INFO(AWBG_PRE2, awbg),
        RPPX1_PARAMS_BLOCK_INFO(WBMEAS_POST, wbmeas),
 };
 
@@ -51,6 +53,9 @@ int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, 
size_t max_size,
                block_offset += block->header.size;
 
                switch (block->header.type) {
+               case RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1:
+                       module = &rpp->pre1.awbg;
+                       break;
                case RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST:
                        module = &rpp->post.wbmeas;
                        break;
diff --git a/drivers/media/platform/dreamchip/rppx1/rppx1_awbg.c 
b/drivers/media/platform/dreamchip/rppx1/rppx1_awbg.c
index 4a242b41142b..f30e12d6f880 100644
--- a/drivers/media/platform/dreamchip/rppx1/rppx1_awbg.c
+++ b/drivers/media/platform/dreamchip/rppx1/rppx1_awbg.c
@@ -26,6 +26,38 @@ static int rppx1_awbg_probe(struct rpp_module *mod)
        return 0;
 }
 
+static int
+rppx1_awbg_fill_params(struct rpp_module *mod,
+                      const union rppx1_params_block *block,
+                      rppx1_reg_write write, void *priv)
+{
+       const struct rppx1_awbg_params *cfg = &block->awbg;
+
+       /* If the modules is disabled, simply bypass it. */
+       if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+               write(priv, mod->base + AWB_ENABLE_REG, 0);
+               return 0;
+       }
+
+       /*
+        * RPP gains are 18-bit with 12 bit fractional part and 0x1000 = 1.0,
+        * giving a possible range of 0.0 to 64.0. NOTE: RPP documentation is
+        * contradictory this is the register definition, the function
+        * description states 0x400 = 1.0 AND 18-bit with 12 fractional bits,
+        * which is not possible...
+        */
+
+       write(priv, mod->base + AWB_GAIN_GR_REG, cfg->gain_green_r);
+       write(priv, mod->base + AWB_GAIN_GB_REG, cfg->gain_green_b);
+       write(priv, mod->base + AWB_GAIN_R_REG, cfg->gain_red);
+       write(priv, mod->base + AWB_GAIN_B_REG, cfg->gain_blue);
+
+       write(priv, mod->base + AWB_ENABLE_REG, AWB_ENABLE_AWB_GAIN_EN);
+
+       return 0;
+}
+
 const struct rpp_module_ops rppx1_awbg_ops = {
        .probe = rppx1_awbg_probe,
+       .fill_params = rppx1_awbg_fill_params,
 };
diff --git a/include/uapi/linux/media/dreamchip/rppx1-config.h 
b/include/uapi/linux/media/dreamchip/rppx1-config.h
index f674b041664e..b388a9003d8b 100644
--- a/include/uapi/linux/media/dreamchip/rppx1-config.h
+++ b/include/uapi/linux/media/dreamchip/rppx1-config.h
@@ -47,9 +47,15 @@ struct rppx1_window {
  * NOTE: Only append to the enumeration as the numbers are uAPI.
  *
  * @RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST: AWB Measurement Configuration
+ * @RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1: PRE1 pipe White Balance Gains
+ * @RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE2: PRE2 White Balance Gains
+ * @RPPX1_PARAMS_BLOCK_TYPE_AWBG_POST: MAIN_POST White Balance Gains
  */
 enum rppx1_params_block_type {
        RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST,
+       RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1,
+       RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE2,
+       RPPX1_PARAMS_BLOCK_TYPE_AWBG_POST,
 };
 
 /**
@@ -114,6 +120,35 @@ struct rppx1_wbmeas_params {
        __u32 reserved3;
 };
 
+/**
+ * struct rppx1_awbg_params  - WB gain configuration
+ *
+ * The RPP-X1 White Balance Gain module is available in the PRE1 and PRE2
+ * pre-fusion pipes and in the MAIN_POST post-fusion pipe. Userspace selects
+ * which pipe to operate by setting the @header.type field to
+ * RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1, RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE2
+ * or RPPX1_PARAMS_BLOCK_TYPE_AWBG_POST.
+ *
+ * The White Balance module allows to specify per-color channel gains, 
expressed
+ * as unsigned fixed-point values as 18 bits unsigned integers in Q6.12 format
+ * with a maximum of 63.999.
+ *
+ * @header: block header (type = RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1 or
+ *         type = RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE2 or
+ *         type = RPPX1_PARAMS_BLOCK_TYPE_AWBG_POST)
+ * @gain_red: gain for red component, 18-bit (unsigned Q6.12)
+ * @gain_green_r: gain for green component in red lines, 18-bit (unsigned 
Q6.12)
+ * @gain_blue: gain for blue component, 18-bit (unsigned Q6.12)
+ * @gain_green_b: gain for green component in blue lines, 18-bit (unsigned 
Q6.12)
+ */
+struct rppx1_awbg_params {
+       struct v4l2_isp_params_block_header header;
+       __u32 gain_red;
+       __u32 gain_green_r;
+       __u32 gain_blue;
+       __u32 gain_green_b;
+};
+
 /**
  * RPPX1_PARAMS_MAX_SIZE - Maximum size of all RPP-X1 parameter blocks
  *
@@ -121,7 +156,10 @@ struct rppx1_wbmeas_params {
  * multiple pipes.
  */
 #define RPPX1_PARAMS_MAX_SIZE                                          \
-       (sizeof(struct rppx1_wbmeas_params))
+       (sizeof(struct rppx1_wbmeas_params)                     +       \
+       sizeof(struct rppx1_awbg_params)                        +       \
+       sizeof(struct rppx1_awbg_params)                        +       \
+       sizeof(struct rppx1_awbg_params))
 
 /* ---------------------------------------------------------------------------
  * Statistics Structures
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to