media: xilinx: simplify get fourcc logic
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 10 Jun 2021 09:53:45 +0000 (11:53 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 17 Jun 2021 07:29:41 +0000 (09:29 +0200)
Right now, there are two calls for xvip_get_format_by_fourcc().
If the first one fails, it is called again in order to pick
the first available format: V4L2_PIX_FMT_YUYV.

This ends by producing a smatch warnings:
drivers/media/platform/xilinx/xilinx-dma.c:555 __xvip_dma_try_format() error: 'info' dereferencing possible ERR_PTR()
drivers/media/platform/xilinx/xilinx-dma.c: drivers/media/platform/xilinx/xilinx-dma.c:664 xvip_dma_init() error: 'dma->fmtinfo' dereferencing possible ERR_PTR()

as it is hard for an static analyzer to ensure that calling
xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT) won't return an
error.

So, better to optimize the logic, ensuring that the function
will never return an error.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/xilinx/xilinx-dma.c
drivers/media/platform/xilinx/xilinx-vip.c

index 2a56201..338c366 100644 (file)
@@ -26,7 +26,6 @@
 #include "xilinx-vip.h"
 #include "xilinx-vipp.h"
 
-#define XVIP_DMA_DEF_FORMAT            V4L2_PIX_FMT_YUYV
 #define XVIP_DMA_DEF_WIDTH             1920
 #define XVIP_DMA_DEF_HEIGHT            1080
 
@@ -549,8 +548,6 @@ __xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix,
         * requested format isn't supported.
         */
        info = xvip_get_format_by_fourcc(pix->pixelformat);
-       if (IS_ERR(info))
-               info = xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT);
 
        pix->pixelformat = info->fourcc;
        pix->field = V4L2_FIELD_NONE;
@@ -660,7 +657,7 @@ int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma,
        INIT_LIST_HEAD(&dma->queued_bufs);
        spin_lock_init(&dma->queued_lock);
 
-       dma->fmtinfo = xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT);
+       dma->fmtinfo = xvip_get_format_by_fourcc(V4L2_PIX_FMT_YUYV);
        dma->format.pixelformat = dma->fmtinfo->fourcc;
        dma->format.colorspace = V4L2_COLORSPACE_SRGB;
        dma->format.field = V4L2_FIELD_NONE;
index 6ad61b0..a4eb576 100644 (file)
@@ -70,8 +70,8 @@ EXPORT_SYMBOL_GPL(xvip_get_format_by_code);
  * @fourcc: the format 4CC
  *
  * Return: a pointer to the format information structure corresponding to the
- * given V4L2 format @fourcc, or ERR_PTR if no corresponding format can be
- * found.
+ * given V4L2 format @fourcc. If not found, return a pointer to the first
+ * available format (V4L2_PIX_FMT_YUYV).
  */
 const struct xvip_video_format *xvip_get_format_by_fourcc(u32 fourcc)
 {
@@ -84,7 +84,7 @@ const struct xvip_video_format *xvip_get_format_by_fourcc(u32 fourcc)
                        return format;
        }
 
-       return ERR_PTR(-EINVAL);
+       return &xvip_video_formats[0];
 }
 EXPORT_SYMBOL_GPL(xvip_get_format_by_fourcc);