On Fri, 23 Jan 2009, Magnus Damm wrote: > On Fri, Jan 23, 2009 at 9:28 AM, Kuninori Morimoto > <morimoto.kuninori@xxxxxxxxxxx> wrote: > > NV12/21/16/61 had been added every time > > UYVY/VYUY/YUYV/YVYU appears on get_formats. > > This patch modify this problem. > > That's one way to do it. Every similar driver has to do the same thing. Yuck. > > Or we could have a better translation framework that does OR for us, > using for instance bitmaps. This has been on my list for a while now, but I'm quite busy these days, but I think I now have an idea how to fix this problem in a less destructive way, withoug undermining the soc-camera algorithms:-) Please, have a look at the patch below. Does it fix the problem for you? If not - how can we modify it to work for you? Notice - not even completely compile tested:-) Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer Fix multiple inclusion of NV* formats into the available format list. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@xxxxxx> --- diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c index a53f5bb..b8234c7 100644 --- a/drivers/media/video/sh_mobile_ceu_camera.c +++ b/drivers/media/video/sh_mobile_ceu_camera.c @@ -585,11 +585,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++) { @@ -602,6 +620,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) { -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html