On Thu Dec 12 10:17:34 2024 +0100, Alain Volmat wrote:
> Avoid duplication of enumerated pixelformat on the bytecap
> video capture device.  Indeed, since the bytecap format list
> contains both CSI & parallel 16bits formats, ensure that same
> pixelformat are not reported twice when performing enumeration
> of supported formats.
> 
> Signed-off-by: Alain Volmat <alain.vol...@foss.st.com>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 .../st/stm32/stm32-dcmipp/dcmipp-bytecap.c         | 42 +++++++++++-----------
 1 file changed, 21 insertions(+), 21 deletions(-)

---

diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-bytecap.c 
b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-bytecap.c
index da80e1aa37ca..1c1b6b48918e 100644
--- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-bytecap.c
+++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-bytecap.c
@@ -268,34 +268,34 @@ static int dcmipp_bytecap_enum_fmt_vid_cap(struct file 
*file, void *priv,
 {
        const struct dcmipp_bytecap_pix_map *vpix;
        unsigned int index = f->index;
-       unsigned int i;
+       unsigned int i, prev_pixelformat = 0;
 
-       if (f->mbus_code) {
-               /*
-                * If a media bus code is specified, only enumerate formats
-                * compatible with it.
-                */
-               for (i = 0; i < ARRAY_SIZE(dcmipp_bytecap_pix_map_list); i++) {
-                       vpix = &dcmipp_bytecap_pix_map_list[i];
-                       if (vpix->code != f->mbus_code)
-                               continue;
+       /*
+        * List up all formats (or only ones matching f->mbus_code), taking
+        * care of removing duplicated entries (due to support of both
+        * parallel & csi 16 bits formats
+        */
+       for (i = 0; i < ARRAY_SIZE(dcmipp_bytecap_pix_map_list); i++) {
+               vpix = &dcmipp_bytecap_pix_map_list[i];
+               /* Skip formats not matching requested mbus code */
+               if (f->mbus_code && vpix->code != f->mbus_code)
+                       continue;
 
-                       if (index == 0)
-                               break;
+               /* Skip duplicated pixelformat */
+               if (vpix->pixelformat == prev_pixelformat)
+                       continue;
 
-                       index--;
-               }
+               prev_pixelformat = vpix->pixelformat;
 
-               if (i == ARRAY_SIZE(dcmipp_bytecap_pix_map_list))
-                       return -EINVAL;
-       } else {
-               /* Otherwise, enumerate all formats. */
-               if (f->index >= ARRAY_SIZE(dcmipp_bytecap_pix_map_list))
-                       return -EINVAL;
+               if (index == 0)
+                       break;
 
-               vpix = &dcmipp_bytecap_pix_map_list[f->index];
+               index--;
        }
 
+       if (i == ARRAY_SIZE(dcmipp_bytecap_pix_map_list))
+               return -EINVAL;
+
        f->pixelformat = vpix->pixelformat;
 
        return 0;

Reply via email to