V4L/DVB (10672): sh_mobile_ceu_camera: include NV* formats into the format list only...
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Mon, 23 Feb 2009 15:12:58 +0000 (12:12 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:52 +0000 (12:42 -0300)
Currently, if an soc-camera device, connected to the sh_mobile_ceu_camera
camera host driver, supports several formats from the UYVY, VYUY, YUYV, YVYU
set, the driver would add four NV* formats for each of them. This patch fixes
this misbehaviour.

Reported-by: Kuninori Morimoto <morimoto.kuninori@renesas.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/sh_mobile_ceu_camera.c

index 8a1badb..ed3bfc4 100644 (file)
@@ -586,11 +586,29 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, int idx,
        if (ret < 0)
                return 0;
 
+       /* Beginning of a pass */
+       if (!idx)
+               icd->host_priv = NULL;
+
        switch (icd->formats[idx].fourcc) {
        case V4L2_PIX_FMT_UYVY:
        case V4L2_PIX_FMT_VYUY:
        case V4L2_PIX_FMT_YUYV:
        case V4L2_PIX_FMT_YVYU:
+               if (icd->host_priv)
+                       goto add_single_format;
+
+               /*
+                * Our case is simple so far: for any of the above four camera
+                * formats we add all our four synthesized NV* formats, so,
+                * just marking the device with a single flag suffices. If
+                * the format generation rules are more complex, you would have
+                * to actually hang your already added / counted formats onto
+                * the host_priv pointer and check whether the format you're
+                * going to add now is already there.
+                */
+               icd->host_priv = (void *)sh_mobile_ceu_formats;
+
                n = ARRAY_SIZE(sh_mobile_ceu_formats);
                formats += n;
                for (k = 0; xlate && k < n; k++) {
@@ -603,6 +621,7 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, int idx,
                                icd->formats[idx].name);
                }
        default:
+add_single_format:
                /* Generic pass-through */
                formats++;
                if (xlate) {