media: atomisp: Make bds_factors_list be type of struct u32_fract
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 18 Nov 2022 18:43:09 +0000 (18:43 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 25 Nov 2022 08:25:38 +0000 (08:25 +0000)
The list contains the Bayer scale index, and rational fraction of it.
The struct u32_fract is suitable type to hold that. Convert the driver
to use latter instead of former.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_binarydesc.h
drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_binarydesc.c
drivers/staging/media/atomisp/pci/runtime/binary/src/binary.c
drivers/staging/media/atomisp/pci/sh_css_param_shading.c

index 965cfda50707009d6f9ea5972b5acf76f78da5aa..e42eeaeb3ee471049ffaaf2480984709bc1ad4cb 100644 (file)
@@ -16,6 +16,8 @@
 #ifndef __IA_CSS_PIPE_BINARYDESC_H__
 #define __IA_CSS_PIPE_BINARYDESC_H__
 
+#include <linux/math.h>
+
 #include <ia_css_types.h>              /* ia_css_pipe */
 #include <ia_css_frame_public.h>       /* ia_css_frame_info */
 #include <ia_css_binary.h>             /* ia_css_binary_descr */
@@ -56,17 +58,12 @@ void ia_css_pipe_get_vfpp_binarydesc(
  *
  * @param[in] bds_factor: The bayer downscaling factor.
  *             (= The bds_factor member in the sh_css_bds_factor structure.)
- * @param[out] bds_factor_numerator: The numerator of the bayer downscaling factor.
- *             (= The numerator member in the sh_css_bds_factor structure.)
- * @param[out] bds_factor_denominator: The denominator of the bayer downscaling factor.
- *             (= The denominator member in the sh_css_bds_factor structure.)
+ * @param[out] bds: The rational fraction of the bayer downscaling factor.
+ *             (= The respective member in the sh_css_bds_factor structure.)
  * @return     0 or error code upon error.
  *
  */
-int sh_css_bds_factor_get_numerator_denominator(
-    unsigned int bds_factor,
-    unsigned int *bds_factor_numerator,
-    unsigned int *bds_factor_denominator);
+int sh_css_bds_factor_get_fract(unsigned int bds_factor, struct u32_fract *bds);
 
 /* @brief Get a binary descriptor for preview stage.
  *
index 7dd0e4a53c8bf55c0613f1057b153b33955ff762..06664ce75b6085827300e4e92302f4758713522f 100644 (file)
@@ -13,6 +13,9 @@
  * more details.
  */
 
+#include <linux/kernel.h>
+#include <linux/math.h>
+
 #include "ia_css_pipe_binarydesc.h"
 #include "ia_css_frame_format.h"
 #include "ia_css_pipe.h"
@@ -23,7 +26,6 @@
 #include <assert_support.h>
 /* HRT_GDC_N */
 #include "gdc_device.h"
-#include <linux/kernel.h>
 
 /* This module provides a binary descriptions to used to find a binary. Since,
  * every stage is associated with a binary, it implicity helps stage
@@ -126,40 +128,29 @@ void ia_css_pipe_get_vfpp_binarydesc(
        IA_CSS_LEAVE_PRIVATE("");
 }
 
-static struct sh_css_bds_factor bds_factors_list[] = {
-       {1, 1, SH_CSS_BDS_FACTOR_1_00},
-       {5, 4, SH_CSS_BDS_FACTOR_1_25},
-       {3, 2, SH_CSS_BDS_FACTOR_1_50},
-       {2, 1, SH_CSS_BDS_FACTOR_2_00},
-       {9, 4, SH_CSS_BDS_FACTOR_2_25},
-       {5, 2, SH_CSS_BDS_FACTOR_2_50},
-       {3, 1, SH_CSS_BDS_FACTOR_3_00},
-       {4, 1, SH_CSS_BDS_FACTOR_4_00},
-       {9, 2, SH_CSS_BDS_FACTOR_4_50},
-       {5, 1, SH_CSS_BDS_FACTOR_5_00},
-       {6, 1, SH_CSS_BDS_FACTOR_6_00},
-       {8, 1, SH_CSS_BDS_FACTOR_8_00}
+static struct u32_fract bds_factors_list[] = {
+       [SH_CSS_BDS_FACTOR_1_00] = {1, 1},
+       [SH_CSS_BDS_FACTOR_1_25] = {5, 4},
+       [SH_CSS_BDS_FACTOR_1_50] = {3, 2},
+       [SH_CSS_BDS_FACTOR_2_00] = {2, 1},
+       [SH_CSS_BDS_FACTOR_2_25] = {9, 4},
+       [SH_CSS_BDS_FACTOR_2_50] = {5, 2},
+       [SH_CSS_BDS_FACTOR_3_00] = {3, 1},
+       [SH_CSS_BDS_FACTOR_4_00] = {4, 1},
+       [SH_CSS_BDS_FACTOR_4_50] = {9, 2},
+       [SH_CSS_BDS_FACTOR_5_00] = {5, 1},
+       [SH_CSS_BDS_FACTOR_6_00] = {6, 1},
+       [SH_CSS_BDS_FACTOR_8_00] = {8, 1},
 };
 
-int sh_css_bds_factor_get_numerator_denominator(
-    unsigned int bds_factor,
-    unsigned int *bds_factor_numerator,
-    unsigned int *bds_factor_denominator)
+int sh_css_bds_factor_get_fract(unsigned int bds_factor, struct u32_fract *bds)
 {
-       unsigned int i;
-
-       /* Loop over all bds factors until a match is found */
-       for (i = 0; i < ARRAY_SIZE(bds_factors_list); i++) {
-               if (bds_factors_list[i].bds_factor == bds_factor) {
-                       *bds_factor_numerator = bds_factors_list[i].numerator;
-                       *bds_factor_denominator = bds_factors_list[i].denominator;
-                       return 0;
-               }
-       }
+       /* Throw an error since bds_factor cannot be found in bds_factors_list */
+       if (bds_factor >= ARRAY_SIZE(bds_factors_list))
+               return -EINVAL;
 
-       /* Throw an error since bds_factor cannot be found
-       in bds_factors_list */
-       return -EINVAL;
+       *bds = bds_factors_list[bds_factor];
+       return 0;
 }
 
 int binarydesc_calculate_bds_factor(
@@ -194,7 +185,7 @@ int binarydesc_calculate_bds_factor(
                            (out_h * num / den <= in_h);
 
                if (cond) {
-                       *bds_factor = bds_factors_list[i].bds_factor;
+                       *bds_factor = i;
                        return 0;
                }
        }
index 406ed5fb4c6a41f11b0d0ca87b84e0285373c44e..768da86b8c2c10283d87e48f354cd49af65dd9bd 100644 (file)
@@ -13,6 +13,8 @@
  * more details.
  */
 
+#include <linux/math.h>
+
 #include <math_support.h>
 #include <gdc_device.h>        /* HR_GDC_N */
 
@@ -128,16 +130,8 @@ ia_css_binary_compute_shading_table_bayer_origin(
 {
        int err;
 
-       /* Numerator and denominator of the fixed bayer downscaling factor.
-       (numerator >= denominator) */
-       unsigned int bds_num, bds_den;
-
-       /* Horizontal/Vertical ratio of bayer scaling
-       between input area and output area. */
-       unsigned int bs_hor_ratio_in;
-       unsigned int bs_hor_ratio_out;
-       unsigned int bs_ver_ratio_in;
-       unsigned int bs_ver_ratio_out;
+       /* Rational fraction of the fixed bayer downscaling factor. */
+       struct u32_fract bds;
 
        /* Left padding set by InputFormatter. */
        unsigned int left_padding_bqs;                  /* in bqs */
@@ -158,19 +152,11 @@ ia_css_binary_compute_shading_table_bayer_origin(
        unsigned int bad_bqs_on_top_before_bs;  /* in bqs */
        unsigned int bad_bqs_on_top_after_bs;   /* in bqs */
 
-       /* Get the numerator and denominator of bayer downscaling factor. */
-       err = sh_css_bds_factor_get_numerator_denominator
-       (required_bds_factor, &bds_num, &bds_den);
+       /* Get the rational fraction of bayer downscaling factor. */
+       err = sh_css_bds_factor_get_fract(required_bds_factor, &bds);
        if (err)
                return err;
 
-       /* Set the horizontal/vertical ratio of bayer scaling
-       between input area and output area. */
-       bs_hor_ratio_in  = bds_num;
-       bs_hor_ratio_out = bds_den;
-       bs_ver_ratio_in  = bds_num;
-       bs_ver_ratio_out = bds_den;
-
        /* Set the left padding set by InputFormatter. (ifmtr.c) */
        if (stream_config->left_padding == -1)
                left_padding_bqs = _ISP_BQS(binary->left_padding);
@@ -228,18 +214,18 @@ ia_css_binary_compute_shading_table_bayer_origin(
        located on the shading table during the shading correction. */
        res->sc_bayer_origin_x_bqs_on_shading_table =
                ((left_padding_adjusted_bqs + bad_bqs_on_left_before_bs)
-               * bs_hor_ratio_out + bs_hor_ratio_in / 2) / bs_hor_ratio_in
+               * bds.denominator + bds.numerator / 2) / bds.numerator
                + bad_bqs_on_left_after_bs;
-       /* "+ bs_hor_ratio_in/2": rounding for division by bs_hor_ratio_in */
+       /* "+ bds.numerator / 2": rounding for division by bds.numerator */
        res->sc_bayer_origin_y_bqs_on_shading_table =
-               (bad_bqs_on_top_before_bs * bs_ver_ratio_out + bs_ver_ratio_in / 2) / bs_ver_ratio_in
+               (bad_bqs_on_top_before_bs * bds.denominator + bds.numerator / 2) / bds.numerator
                + bad_bqs_on_top_after_bs;
-       /* "+ bs_ver_ratio_in/2": rounding for division by bs_ver_ratio_in */
+       /* "+ bds.numerator / 2": rounding for division by bds.numerator */
 
-       res->bayer_scale_hor_ratio_in  = (uint32_t)bs_hor_ratio_in;
-       res->bayer_scale_hor_ratio_out = (uint32_t)bs_hor_ratio_out;
-       res->bayer_scale_ver_ratio_in  = (uint32_t)bs_ver_ratio_in;
-       res->bayer_scale_ver_ratio_out = (uint32_t)bs_ver_ratio_out;
+       res->bayer_scale_hor_ratio_in  = bds.numerator;
+       res->bayer_scale_hor_ratio_out = bds.denominator;
+       res->bayer_scale_ver_ratio_in  = bds.numerator;
+       res->bayer_scale_ver_ratio_out = bds.denominator;
 
        return err;
 }
index 41a4c91623196c7d2c0a92166e188a2ee4b132e9..5b43cc65626902c0dca1ed88f40097582026bc0d 100644 (file)
@@ -13,6 +13,7 @@
  * more details.
  */
 
+#include <linux/math.h>
 #include <linux/slab.h>
 
 #include <math_support.h>
@@ -239,10 +240,9 @@ prepare_shading_table(const struct ia_css_shading_table *in_table,
 {
        unsigned int input_width, input_height, table_width, table_height, i;
        unsigned int left_padding, top_padding, left_cropping;
-       unsigned int bds_numerator, bds_denominator;
-       int right_padding;
-
        struct ia_css_shading_table *result;
+       struct u32_fract bds;
+       int right_padding;
 
        assert(target_table);
        assert(binary);
@@ -265,17 +265,16 @@ prepare_shading_table(const struct ia_css_shading_table *in_table,
        left_cropping = (binary->info->sp.pipeline.left_cropping == 0) ?
                        binary->dvs_envelope.width : 2 * ISP_VEC_NELEMS;
 
-       sh_css_bds_factor_get_numerator_denominator
-       (bds_factor, &bds_numerator, &bds_denominator);
+       sh_css_bds_factor_get_fract(bds_factor, &bds);
 
        left_padding  = (left_padding + binary->info->sp.pipeline.left_cropping) *
-                       bds_numerator / bds_denominator -
+                       bds.numerator / bds.denominator -
                        binary->info->sp.pipeline.left_cropping;
        right_padding = (binary->internal_frame_info.res.width -
-                        binary->effective_in_frame_res.width * bds_denominator /
-                        bds_numerator - left_cropping) * bds_numerator / bds_denominator;
-       top_padding = binary->info->sp.pipeline.top_cropping * bds_numerator /
-                     bds_denominator -
+                        binary->effective_in_frame_res.width * bds.denominator /
+                        bds.numerator - left_cropping) * bds.numerator / bds.denominator;
+       top_padding = binary->info->sp.pipeline.top_cropping * bds.numerator /
+                     bds.denominator -
                      binary->info->sp.pipeline.top_cropping;
 
        /*