]> git.hungrycats.org Git - linux/commitdiff
media: rkisp1: Add helper function to swap colour channels
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 8 Aug 2024 20:41:01 +0000 (22:41 +0200)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 14 Aug 2024 13:42:56 +0000 (16:42 +0300)
The BLS parameters passed by userspace are specified for named colour
channels (R, Gr, Gb and B), while the hardware registers reference
positions in the 2x2 CFA pattern (A, B, C and D).

The BLS values are swapped based on the CFA pattern when writing to or
reading from registers, using hand-roled switch statements. The logic is
duplicated already, and new code will require similar processing. Move
the swap logic to a shared function, using static data to control the
channels order.

Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/media/platform/rockchip/rkisp1/rkisp1-common.c
drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c

index f956b90a407a100dc3e00d0a3cfe373ab83b01b3..60c97bb7b18b3b3205c9488c34c2cb9183a2a072 100644 (file)
@@ -178,3 +178,17 @@ void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
 
        rkisp1_sd_adjust_crop_rect(crop, &crop_bounds);
 }
+
+void rkisp1_bls_swap_regs(enum rkisp1_fmt_raw_pat_type pattern,
+                         const u32 input[4], u32 output[4])
+{
+       static const unsigned int swap[4][4] = {
+               [RKISP1_RAW_RGGB] = { 0, 1, 2, 3 },
+               [RKISP1_RAW_GRBG] = { 1, 0, 3, 2 },
+               [RKISP1_RAW_GBRG] = { 2, 3, 0, 1 },
+               [RKISP1_RAW_BGGR] = { 3, 2, 1, 0 },
+       };
+
+       for (unsigned int i = 0; i < 4; ++i)
+               output[i] = input[swap[pattern][i]];
+}
index c1689c0fa05a589b7b1d9422819d8ba95a8ab9ea..a5207926157976ac90ccb27c807f3fe92677419d 100644 (file)
@@ -603,6 +603,9 @@ void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
 void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
                           const struct v4l2_mbus_framefmt *bounds);
 
+void rkisp1_bls_swap_regs(enum rkisp1_fmt_raw_pat_type pattern,
+                         const u32 input[4], u32 output[4]);
+
 /*
  * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code
  *
index 85ef92f3f364b585fb15be4cb29bc563f67b6fbb..43df8079cf8f9c61e7754d2a60058639addfba77 100644 (file)
@@ -165,54 +165,20 @@ static void rkisp1_bls_config(struct rkisp1_params *params,
        new_control &= RKISP1_CIF_ISP_BLS_ENA;
        /* fixed subtraction values */
        if (!arg->enable_auto) {
-               const struct rkisp1_cif_isp_bls_fixed_val *pval =
-                                                               &arg->fixed_val;
-
-               switch (params->raw_type) {
-               case RKISP1_RAW_BGGR:
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
-                                    pval->r);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
-                                    pval->gr);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
-                                    pval->gb);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
-                                    pval->b);
-                       break;
-               case RKISP1_RAW_GBRG:
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
-                                    pval->r);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
-                                    pval->gr);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
-                                    pval->gb);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
-                                    pval->b);
-                       break;
-               case RKISP1_RAW_GRBG:
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
-                                    pval->r);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
-                                    pval->gr);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
-                                    pval->gb);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
-                                    pval->b);
-                       break;
-               case RKISP1_RAW_RGGB:
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED,
-                                    pval->r);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED,
-                                    pval->gr);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED,
-                                    pval->gb);
-                       rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED,
-                                    pval->b);
-                       break;
-               default:
-                       break;
-               }
-
+               static const u32 regs[] = {
+                       RKISP1_CIF_ISP_BLS_A_FIXED,
+                       RKISP1_CIF_ISP_BLS_B_FIXED,
+                       RKISP1_CIF_ISP_BLS_C_FIXED,
+                       RKISP1_CIF_ISP_BLS_D_FIXED,
+               };
+               u32 swapped[4];
+
+               rkisp1_bls_swap_regs(params->raw_type, regs, swapped);
+
+               rkisp1_write(params->rkisp1, swapped[0], arg->fixed_val.r);
+               rkisp1_write(params->rkisp1, swapped[1], arg->fixed_val.gr);
+               rkisp1_write(params->rkisp1, swapped[2], arg->fixed_val.gb);
+               rkisp1_write(params->rkisp1, swapped[3], arg->fixed_val.b);
        } else {
                if (arg->en_windows & BIT(1)) {
                        rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H2_START,
index 2795eef91bddbce849516d6ae67404c31aa5f15d..a502719e916a92bcf4cbc53bc0895e591e23a894 100644 (file)
@@ -304,48 +304,25 @@ static void rkisp1_stats_get_hst_meas_v12(struct rkisp1_stats *stats,
 static void rkisp1_stats_get_bls_meas(struct rkisp1_stats *stats,
                                      struct rkisp1_stat_buffer *pbuf)
 {
+       static const u32 regs[] = {
+               RKISP1_CIF_ISP_BLS_A_MEASURED,
+               RKISP1_CIF_ISP_BLS_B_MEASURED,
+               RKISP1_CIF_ISP_BLS_C_MEASURED,
+               RKISP1_CIF_ISP_BLS_D_MEASURED,
+       };
        struct rkisp1_device *rkisp1 = stats->rkisp1;
        const struct rkisp1_mbus_info *in_fmt = rkisp1->isp.sink_fmt;
        struct rkisp1_cif_isp_bls_meas_val *bls_val;
+       u32 swapped[4];
+
+       rkisp1_bls_swap_regs(in_fmt->bayer_pat, regs, swapped);
 
        bls_val = &pbuf->params.ae.bls_val;
-       if (in_fmt->bayer_pat == RKISP1_RAW_BGGR) {
-               bls_val->meas_b =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
-               bls_val->meas_gb =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
-               bls_val->meas_gr =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
-               bls_val->meas_r =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
-       } else if (in_fmt->bayer_pat == RKISP1_RAW_GBRG) {
-               bls_val->meas_gb =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
-               bls_val->meas_b =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
-               bls_val->meas_r =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
-               bls_val->meas_gr =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
-       } else if (in_fmt->bayer_pat == RKISP1_RAW_GRBG) {
-               bls_val->meas_gr =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
-               bls_val->meas_r =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
-               bls_val->meas_b =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
-               bls_val->meas_gb =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
-       } else if (in_fmt->bayer_pat == RKISP1_RAW_RGGB) {
-               bls_val->meas_r =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
-               bls_val->meas_gr =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
-               bls_val->meas_gb =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
-               bls_val->meas_b =
-                       rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
-       }
+
+       bls_val->meas_r = rkisp1_read(rkisp1, swapped[0]);
+       bls_val->meas_gr = rkisp1_read(rkisp1, swapped[1]);
+       bls_val->meas_gb = rkisp1_read(rkisp1, swapped[2]);
+       bls_val->meas_b = rkisp1_read(rkisp1, swapped[3]);
 }
 
 static const struct rkisp1_stats_ops rkisp1_v10_stats_ops = {