media: qcom: camss: Move format related functions
authorRadoslav Tsvetkov <quic_rtsvetko@quicinc.com>
Wed, 22 May 2024 15:46:56 +0000 (18:46 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Sat, 29 Jun 2024 10:20:04 +0000 (12:20 +0200)
Move out the format related helper functions from vfe and video in a
separate file. The goal here is to create a format API.

Signed-off-by: Radoslav Tsvetkov <quic_rtsvetko@quicinc.com>
Signed-off-by: Gjorgji Rosikopulos <quic_grosikop@quicinc.com>
Acked-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/qcom/camss/Makefile
drivers/media/platform/qcom/camss/camss-format.c [new file with mode: 0644]
drivers/media/platform/qcom/camss/camss-format.h
drivers/media/platform/qcom/camss/camss-vfe.c
drivers/media/platform/qcom/camss/camss-video.c

index 0d4389ab312d1e74e18098532022245b63cacdb6..e636968a1126cdfcb5c7e848c62efa1a2174dcfb 100644 (file)
@@ -19,5 +19,6 @@ qcom-camss-objs += \
                camss-vfe-gen1.o \
                camss-vfe.o \
                camss-video.o \
+               camss-format.o \
 
 obj-$(CONFIG_VIDEO_QCOM_CAMSS) += qcom-camss.o
diff --git a/drivers/media/platform/qcom/camss/camss-format.c b/drivers/media/platform/qcom/camss/camss-format.c
new file mode 100644 (file)
index 0000000..4a3d554
--- /dev/null
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * camss-format.c
+ *
+ * Qualcomm MSM Camera Subsystem - Format helpers
+ *
+ * Copyright (c) 2023, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Technologies, Inc.
+ */
+#include <linux/bug.h>
+#include <linux/errno.h>
+
+#include "camss-format.h"
+
+/*
+ * camss_format_get_bpp - Map media bus format to bits per pixel
+ * @formats: supported media bus formats array
+ * @nformats: size of @formats array
+ * @code: media bus format code
+ *
+ * Return number of bits per pixel
+ */
+u8 camss_format_get_bpp(const struct camss_format_info *formats, unsigned int nformats, u32 code)
+{
+       unsigned int i;
+
+       for (i = 0; i < nformats; i++)
+               if (code == formats[i].code)
+                       return formats[i].mbus_bpp;
+
+       WARN(1, "Unknown format\n");
+
+       return formats[0].mbus_bpp;
+}
+
+/*
+ * camss_format_find_code - Find a format code in an array
+ * @code: a pointer to media bus format codes array
+ * @n_code: size of @code array
+ * @index: index of code in the array
+ * @req_code: required code
+ *
+ * Return media bus format code
+ */
+u32 camss_format_find_code(u32 *code, unsigned int n_code, unsigned int index, u32 req_code)
+{
+       unsigned int i;
+
+       if (!req_code && index >= n_code)
+               return 0;
+
+       for (i = 0; i < n_code; i++) {
+               if (req_code) {
+                       if (req_code == code[i])
+                               return req_code;
+               } else {
+                       if (i == index)
+                               return code[i];
+               }
+       }
+
+       return code[0];
+}
+
+/*
+ * camss_format_find_format - Find a format in an array
+ * @code: media bus format code
+ * @pixelformat: V4L2 pixel format FCC identifier
+ * @formats: a pointer to formats array
+ * @nformats: size of @formats array
+ *
+ * Return index of a format or a negative error code otherwise
+ */
+int camss_format_find_format(u32 code, u32 pixelformat, const struct camss_format_info *formats,
+                            unsigned int nformats)
+{
+       unsigned int i;
+
+       for (i = 0; i < nformats; i++) {
+               if (formats[i].code == code &&
+                   formats[i].pixelformat == pixelformat)
+                       return i;
+       }
+
+       for (i = 0; i < nformats; i++) {
+               if (formats[i].code == code)
+                       return i;
+       }
+
+       return -EINVAL;
+}
index e0231ca6a5cabd89faa32c862cc75c7f53fb282b..923a48c9c3fb6d0e9c0c1f087509f70f68049e4b 100644 (file)
@@ -54,4 +54,9 @@ struct camss_formats {
        const struct camss_format_info *formats;
 };
 
+u8 camss_format_get_bpp(const struct camss_format_info *formats, unsigned int nformats, u32 code);
+u32 camss_format_find_code(u32 *code, unsigned int n_code, unsigned int index, u32 req_code);
+int camss_format_find_format(u32 code, u32 pixelformat, const struct camss_format_info *formats,
+                            unsigned int nformats);
+
 #endif /* __CAMSS_FORMAT_H__ */
index 2d5a64c055f10a514bbce694e41a7795dbe79cb1..83c5a36d071fcc32c4b8a89e4e429dc1820df139 100644 (file)
@@ -278,48 +278,6 @@ const struct camss_formats vfe_formats_pix_845 = {
        .formats = formats_rdi_845
 };
 
-/*
- * vfe_get_bpp - map media bus format to bits per pixel
- * @formats: supported media bus formats array
- * @nformats: size of @formats array
- * @code: media bus format code
- *
- * Return number of bits per pixel
- */
-static u8 vfe_get_bpp(const struct camss_format_info *formats,
-                     unsigned int nformats, u32 code)
-{
-       unsigned int i;
-
-       for (i = 0; i < nformats; i++)
-               if (code == formats[i].code)
-                       return formats[i].mbus_bpp;
-
-       WARN(1, "Unknown format\n");
-
-       return formats[0].mbus_bpp;
-}
-
-static u32 vfe_find_code(u32 *code, unsigned int n_code,
-                        unsigned int index, u32 req_code)
-{
-       int i;
-
-       if (!req_code && (index >= n_code))
-               return 0;
-
-       for (i = 0; i < n_code; i++)
-               if (req_code) {
-                       if (req_code == code[i])
-                               return req_code;
-               } else {
-                       if (i == index)
-                               return code[i];
-               }
-
-       return code[0];
-}
-
 static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                            unsigned int index, u32 src_req_code)
 {
@@ -335,8 +293,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_YUYV8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                case MEDIA_BUS_FMT_YVYU8_1X16:
                {
@@ -345,8 +303,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_YVYU8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                case MEDIA_BUS_FMT_UYVY8_1X16:
                {
@@ -355,8 +313,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_UYVY8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                case MEDIA_BUS_FMT_VYUY8_1X16:
                {
@@ -365,8 +323,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_VYUY8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                default:
                        if (index > 0)
@@ -391,8 +349,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_YUYV8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                case MEDIA_BUS_FMT_YVYU8_1X16:
                {
@@ -404,8 +362,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_YVYU8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                case MEDIA_BUS_FMT_UYVY8_1X16:
                {
@@ -417,8 +375,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_UYVY8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                case MEDIA_BUS_FMT_VYUY8_1X16:
                {
@@ -430,8 +388,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
                                MEDIA_BUS_FMT_VYUY8_1_5X8,
                        };
 
-                       return vfe_find_code(src_code, ARRAY_SIZE(src_code),
-                                            index, src_req_code);
+                       return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
+                                                     index, src_req_code);
                }
                default:
                        if (index > 0)
@@ -714,9 +672,9 @@ static int vfe_set_clock_rates(struct vfe_device *vfe)
                                } else {
                                        struct vfe_line *l = &vfe->line[j];
 
-                                       bpp = vfe_get_bpp(l->formats,
-                                               l->nformats,
-                                               l->fmt[MSM_VFE_PAD_SINK].code);
+                                       bpp = camss_format_get_bpp(l->formats,
+                                                                  l->nformats,
+                                                                  l->fmt[MSM_VFE_PAD_SINK].code);
                                        tmp = pixel_clock[j] * bpp / 64;
                                }
 
@@ -795,9 +753,9 @@ static int vfe_check_clock_rates(struct vfe_device *vfe)
                                } else {
                                        struct vfe_line *l = &vfe->line[j];
 
-                                       bpp = vfe_get_bpp(l->formats,
-                                               l->nformats,
-                                               l->fmt[MSM_VFE_PAD_SINK].code);
+                                       bpp = camss_format_get_bpp(l->formats,
+                                                                  l->nformats,
+                                                                  l->fmt[MSM_VFE_PAD_SINK].code);
                                        tmp = pixel_clock[j] * bpp / 64;
                                }
 
index 2fe70683846991e966afac046bcec4f19497363d..cd72feca618ca42be14016ee55978a4ce74d75bd 100644 (file)
  * Helper functions
  */
 
-static int video_find_format(u32 code, u32 pixelformat,
-                            const struct camss_format_info *formats,
-                            unsigned int nformats)
-{
-       int i;
-
-       for (i = 0; i < nformats; i++) {
-               if (formats[i].code == code &&
-                   formats[i].pixelformat == pixelformat)
-                       return i;
-       }
-
-       for (i = 0; i < nformats; i++)
-               if (formats[i].code == code)
-                       return i;
-
-       WARN_ON(1);
-
-       return -EINVAL;
-}
-
 /*
  * video_mbus_to_pix_mp - Convert v4l2_mbus_framefmt to v4l2_pix_format_mplane
  * @mbus: v4l2_mbus_framefmt format (input)
@@ -121,9 +100,8 @@ static int video_get_subdev_format(struct camss_video *video,
        if (ret)
                return ret;
 
-       ret = video_find_format(fmt.format.code,
-                               format->fmt.pix_mp.pixelformat,
-                               video->formats, video->nformats);
+       ret = camss_format_find_format(fmt.format.code, format->fmt.pix_mp.pixelformat,
+                                      video->formats, video->nformats);
        if (ret < 0)
                return ret;