[media] soc_camera: rcar_vin: Add ARGB8888 caputre format support
authorKoji Matsuoka <koji.matsuoka.xm@renesas.com>
Sun, 24 Jan 2016 16:13:29 +0000 (14:13 -0200)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Thu, 3 Mar 2016 09:51:41 +0000 (06:51 -0300)
This patch adds ARGB8888 capture format support for R-Car Gen3.

Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/soc_camera/rcar_vin.c

index dc75a80794fb92658f0ab375d924eeeed74b3467..3b8edf458964dcb76097493db6d40a4fc7d266fc 100644 (file)
 #define VNDMR_EXRGB            (1 << 8)
 #define VNDMR_BPSM             (1 << 4)
 #define VNDMR_DTMD_YCSEP       (1 << 1)
-#define VNDMR_DTMD_ARGB1555    (1 << 0)
+#define VNDMR_DTMD_ARGB                (1 << 0)
 
 /* Video n Data Mode Register 2 bits */
 #define VNDMR2_VPS             (1 << 30)
@@ -643,21 +643,26 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)
                output_is_yuv = true;
                break;
        case V4L2_PIX_FMT_RGB555X:
-               dmr = VNDMR_DTMD_ARGB1555;
+               dmr = VNDMR_DTMD_ARGB;
                break;
        case V4L2_PIX_FMT_RGB565:
                dmr = 0;
                break;
        case V4L2_PIX_FMT_RGB32:
-               if (priv->chip == RCAR_GEN2 || priv->chip == RCAR_H1 ||
-                   priv->chip == RCAR_E1) {
-                       dmr = VNDMR_EXRGB;
-                       break;
-               }
+               if (priv->chip != RCAR_GEN2 && priv->chip != RCAR_H1 &&
+                   priv->chip != RCAR_E1)
+                       goto e_format;
+
+               dmr = VNDMR_EXRGB;
+               break;
+       case V4L2_PIX_FMT_ARGB32:
+               if (priv->chip != RCAR_GEN3)
+                       goto e_format;
+
+               dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
+               break;
        default:
-               dev_warn(icd->parent, "Invalid fourcc format (0x%x)\n",
-                        icd->current_fmt->host_fmt->fourcc);
-               return -EINVAL;
+               goto e_format;
        }
 
        /* Always update on field change */
@@ -679,6 +684,11 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)
        iowrite32(vnmc | VNMC_ME, priv->base + VNMC_REG);
 
        return 0;
+
+e_format:
+       dev_warn(icd->parent, "Invalid fourcc format (0x%x)\n",
+                icd->current_fmt->host_fmt->fourcc);
+       return -EINVAL;
 }
 
 static void rcar_vin_capture(struct rcar_vin_priv *priv)
@@ -1304,6 +1314,14 @@ static const struct soc_mbus_pixelfmt rcar_vin_formats[] = {
                .order                  = SOC_MBUS_ORDER_LE,
                .layout                 = SOC_MBUS_LAYOUT_PACKED,
        },
+       {
+               .fourcc                 = V4L2_PIX_FMT_ARGB32,
+               .name                   = "ARGB8888",
+               .bits_per_sample        = 32,
+               .packing                = SOC_MBUS_PACKING_NONE,
+               .order                  = SOC_MBUS_ORDER_LE,
+               .layout                 = SOC_MBUS_LAYOUT_PACKED,
+       },
 };
 
 static int rcar_vin_get_formats(struct soc_camera_device *icd, unsigned int idx,
@@ -1611,6 +1629,7 @@ static int rcar_vin_set_fmt(struct soc_camera_device *icd,
        case V4L2_PIX_FMT_RGB32:
                can_scale = priv->chip != RCAR_E1;
                break;
+       case V4L2_PIX_FMT_ARGB32:
        case V4L2_PIX_FMT_UYVY:
        case V4L2_PIX_FMT_YUYV:
        case V4L2_PIX_FMT_RGB565: