[media] atmel-isi: support RGB565 output when sensor output YUV formats
authorJosh Wu <josh.wu@atmel.com>
Tue, 3 Nov 2015 05:45:12 +0000 (03:45 -0200)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 17 Nov 2015 17:33:17 +0000 (15:33 -0200)
This patch enable Atmel ISI preview path to convert the YUV to RGB format.

Signed-off-by: Josh Wu <josh.wu@atmel.com>
[g.liakhovetski@gmx.de: removed superfluous parentheses]
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/soc_camera/atmel-isi.c

index b70754f496f089e59c6d1c16eb01db54e60c3df9..f5f815d792b7ec56094ed9abe6da153189f214a5 100644 (file)
@@ -146,6 +146,10 @@ static void configure_geometry(struct atmel_isi *isi, u32 width,
                u32 height, const struct soc_camera_format_xlate *xlate)
 {
        u32 cfg2, psize;
+       u32 fourcc = xlate->host_fmt->fourcc;
+
+       isi->enable_preview_path = fourcc == V4L2_PIX_FMT_RGB565 ||
+                                  fourcc == V4L2_PIX_FMT_RGB32;
 
        /* According to sensor's output format to set cfg2 */
        switch (xlate->code) {
@@ -195,8 +199,9 @@ static bool is_supported(struct soc_camera_device *icd,
        case V4L2_PIX_FMT_UYVY:
        case V4L2_PIX_FMT_YVYU:
        case V4L2_PIX_FMT_VYUY:
+       /* RGB */
+       case V4L2_PIX_FMT_RGB565:
                return true;
-       /* RGB, TODO */
        default:
                return false;
        }
@@ -686,6 +691,14 @@ static const struct soc_mbus_pixelfmt isi_camera_formats[] = {
                .order                  = SOC_MBUS_ORDER_LE,
                .layout                 = SOC_MBUS_LAYOUT_PACKED,
        },
+       {
+               .fourcc                 = V4L2_PIX_FMT_RGB565,
+               .name                   = "RGB565",
+               .bits_per_sample        = 8,
+               .packing                = SOC_MBUS_PACKING_2X8_PADHI,
+               .order                  = SOC_MBUS_ORDER_LE,
+               .layout                 = SOC_MBUS_LAYOUT_PACKED,
+       },
 };
 
 /* This will be corrected as we get more formats */
@@ -742,7 +755,7 @@ static int isi_camera_get_formats(struct soc_camera_device *icd,
                                  struct soc_camera_format_xlate *xlate)
 {
        struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
-       int formats = 0, ret;
+       int formats = 0, ret, i, n;
        /* sensor format */
        struct v4l2_subdev_mbus_code_enum code = {
                .which = V4L2_SUBDEV_FORMAT_ACTIVE,
@@ -776,11 +789,11 @@ static int isi_camera_get_formats(struct soc_camera_device *icd,
        case MEDIA_BUS_FMT_VYUY8_2X8:
        case MEDIA_BUS_FMT_YUYV8_2X8:
        case MEDIA_BUS_FMT_YVYU8_2X8:
-               formats++;
-               if (xlate) {
-                       xlate->host_fmt = &isi_camera_formats[0];
+               n = ARRAY_SIZE(isi_camera_formats);
+               formats += n;
+               for (i = 0; xlate && i < n; i++, xlate++) {
+                       xlate->host_fmt = &isi_camera_formats[i];
                        xlate->code     = code.code;
-                       xlate++;
                        dev_dbg(icd->parent, "Providing format %s using code %d\n",
                                isi_camera_formats[0].name, code.code);
                }