media: rcar-vin: Enable YDS bit depending on bus_width and data_shift
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Sun, 13 Sep 2020 18:16:08 +0000 (20:16 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sat, 26 Sep 2020 08:58:46 +0000 (10:58 +0200)
Enable YDS bit if bus_width and data_shift is set to 8 in parallel mode
for MEDIA_BUS_FMT_UYVY8_2X8 format.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/rcar-vin/rcar-core.c
drivers/media/platform/rcar-vin/rcar-dma.c
drivers/media/platform/rcar-vin/rcar-vin.h

index f68da01..34d003e 100644 (file)
@@ -620,12 +620,11 @@ static int rvin_parallel_parse_v4l2(struct device *dev,
 
        switch (vin->parallel->mbus_type) {
        case V4L2_MBUS_PARALLEL:
-               vin_dbg(vin, "Found PARALLEL media bus\n");
-               vin->parallel->mbus_flags = vep->bus.parallel.flags;
-               break;
        case V4L2_MBUS_BT656:
-               vin_dbg(vin, "Found BT656 media bus\n");
-               vin->parallel->mbus_flags = 0;
+               vin_dbg(vin, "Found %s media bus\n",
+                       vin->parallel->mbus_type == V4L2_MBUS_PARALLEL ?
+                       "PARALLEL" : "BT656");
+               vin->parallel->bus = vep->bus.parallel;
                break;
        default:
                vin_err(vin, "Unknown media bus type\n");
index a5dbb90..d067439 100644 (file)
 #define VNDMR2_VPS             (1 << 30)
 #define VNDMR2_HPS             (1 << 29)
 #define VNDMR2_CES             (1 << 28)
+#define VNDMR2_YDS             (1 << 22)
 #define VNDMR2_FTEV            (1 << 17)
 #define VNDMR2_VLV(n)          ((n & 0xf) << 12)
 
@@ -698,16 +699,26 @@ static int rvin_setup(struct rvin_dev *vin)
 
        if (!vin->is_csi) {
                /* Hsync Signal Polarity Select */
-               if (!(vin->parallel->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
+               if (!(vin->parallel->bus.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
                        dmr2 |= VNDMR2_HPS;
 
                /* Vsync Signal Polarity Select */
-               if (!(vin->parallel->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
+               if (!(vin->parallel->bus.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
                        dmr2 |= VNDMR2_VPS;
 
                /* Data Enable Polarity Select */
-               if (vin->parallel->mbus_flags & V4L2_MBUS_DATA_ENABLE_LOW)
+               if (vin->parallel->bus.flags & V4L2_MBUS_DATA_ENABLE_LOW)
                        dmr2 |= VNDMR2_CES;
+
+               switch (vin->mbus_code) {
+               case MEDIA_BUS_FMT_UYVY8_2X8:
+                       if (vin->parallel->bus.bus_width == 8 &&
+                           vin->parallel->bus.data_shift == 8)
+                               dmr2 |= VNDMR2_YDS;
+                       break;
+               default:
+                       break;
+               }
        }
 
        /*
index c19d077..8396e0e 100644 (file)
@@ -19,6 +19,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-dev.h>
 #include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
 #include <media/videobuf2-v4l2.h>
 
 /* Number of HW buffers */
@@ -92,7 +93,7 @@ struct rvin_video_format {
  * @asd:       sub-device descriptor for async framework
  * @subdev:    subdevice matched using async framework
  * @mbus_type: media bus type
- * @mbus_flags:        media bus configuration flags
+ * @bus:       media bus parallel configuration
  * @source_pad:        source pad of remote subdevice
  * @sink_pad:  sink pad of remote subdevice
  *
@@ -102,7 +103,7 @@ struct rvin_parallel_entity {
        struct v4l2_subdev *subdev;
 
        enum v4l2_mbus_type mbus_type;
-       unsigned int mbus_flags;
+       struct v4l2_fwnode_bus_parallel bus;
 
        unsigned int source_pad;
        unsigned int sink_pad;