]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: rcar-vin: Cache the mbus configuration flags
authorJacopo Mondi <jacopo+renesas@jmondi.org>
Tue, 12 Jun 2018 09:43:27 +0000 (05:43 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 4 Jul 2018 13:19:51 +0000 (09:19 -0400)
Media bus configuration flags and media bus type were so far a property
of each VIN instance, as the subdevice they were connected to was
immutable during the whole system life time.

With the forth-coming introduction of parallel input devices support,
a VIN instance can have the subdevice it is connected to switched at
runtime, from a CSI-2 subdevice to a parallel one and viceversa, through
the modification of links between media entities in the media controller
graph. To avoid discarding the per-subdevice configuration flags retrieved by
v4l2_fwnode parsing facilities, cache them in the 'rvin_graph_entity'
member of each VIN instance, opportunely renamed to 'rvin_parallel_entity'.

Also modify the register configuration function to take mbus flags into
account when running on a bus type that supports them.

The media bus type currently in use will be updated in a follow-up patch
to the link state change notification function.

Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Acked-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@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 87b29be2ea9eb5fa75723c17cbfb9d48c90ec833..7f84c7b9518ab612b417e1184bf90612decd141c 100644 (file)
@@ -524,30 +524,29 @@ static int rvin_parallel_parse_v4l2(struct device *dev,
                                    struct v4l2_async_subdev *asd)
 {
        struct rvin_dev *vin = dev_get_drvdata(dev);
-       struct rvin_graph_entity *rvge =
-               container_of(asd, struct rvin_graph_entity, asd);
+       struct rvin_parallel_entity *rvpe =
+               container_of(asd, struct rvin_parallel_entity, asd);
 
        if (vep->base.port || vep->base.id)
                return -ENOTCONN;
 
-       vin->mbus_cfg.type = vep->bus_type;
+       vin->parallel = rvpe;
+       vin->parallel->mbus_type = vep->bus_type;
 
-       switch (vin->mbus_cfg.type) {
+       switch (vin->parallel->mbus_type) {
        case V4L2_MBUS_PARALLEL:
                vin_dbg(vin, "Found PARALLEL media bus\n");
-               vin->mbus_cfg.flags = vep->bus.parallel.flags;
+               vin->parallel->mbus_flags = vep->bus.parallel.flags;
                break;
        case V4L2_MBUS_BT656:
                vin_dbg(vin, "Found BT656 media bus\n");
-               vin->mbus_cfg.flags = 0;
+               vin->parallel->mbus_flags = 0;
                break;
        default:
                vin_err(vin, "Unknown media bus type\n");
                return -EINVAL;
        }
 
-       vin->parallel = rvge;
-
        return 0;
 }
 
@@ -557,7 +556,7 @@ static int rvin_parallel_graph_init(struct rvin_dev *vin)
 
        ret = v4l2_async_notifier_parse_fwnode_endpoints(
                vin->dev, &vin->notifier,
-               sizeof(struct rvin_graph_entity), rvin_parallel_parse_v4l2);
+               sizeof(struct rvin_parallel_entity), rvin_parallel_parse_v4l2);
        if (ret)
                return ret;
 
@@ -785,10 +784,6 @@ static int rvin_mc_init(struct rvin_dev *vin)
 {
        int ret;
 
-       /* All our sources are CSI-2 */
-       vin->mbus_cfg.type = V4L2_MBUS_CSI2;
-       vin->mbus_cfg.flags = 0;
-
        vin->pad.flags = MEDIA_PAD_FL_SINK;
        ret = media_entity_pads_init(&vin->vdev.entity, 1, &vin->pad);
        if (ret)
index ce9502f15f5be4c8556e91bedc4753286387fb42..1de598120286424ef65b7598518adf533d5f187f 100644 (file)
@@ -659,8 +659,12 @@ static int rvin_setup(struct rvin_dev *vin)
                break;
        case MEDIA_BUS_FMT_UYVY8_2X8:
                /* BT.656 8bit YCbCr422 or BT.601 8bit YCbCr422 */
-               vnmc |= vin->mbus_cfg.type == V4L2_MBUS_BT656 ?
-                       VNMC_INF_YUV8_BT656 : VNMC_INF_YUV8_BT601;
+               if (!vin->is_csi &&
+                   vin->parallel->mbus_type == V4L2_MBUS_BT656)
+                       vnmc |= VNMC_INF_YUV8_BT656;
+               else
+                       vnmc |= VNMC_INF_YUV8_BT601;
+
                input_is_yuv = true;
                break;
        case MEDIA_BUS_FMT_RGB888_1X24:
@@ -668,8 +672,12 @@ static int rvin_setup(struct rvin_dev *vin)
                break;
        case MEDIA_BUS_FMT_UYVY10_2X10:
                /* BT.656 10bit YCbCr422 or BT.601 10bit YCbCr422 */
-               vnmc |= vin->mbus_cfg.type == V4L2_MBUS_BT656 ?
-                       VNMC_INF_YUV10_BT656 : VNMC_INF_YUV10_BT601;
+               if (!vin->is_csi &&
+                   vin->parallel->mbus_type == V4L2_MBUS_BT656)
+                       vnmc |= VNMC_INF_YUV10_BT656;
+               else
+                       vnmc |= VNMC_INF_YUV10_BT601;
+
                input_is_yuv = true;
                break;
        default:
@@ -682,13 +690,15 @@ static int rvin_setup(struct rvin_dev *vin)
        else
                dmr2 = VNDMR2_FTEV | VNDMR2_VLV(1);
 
-       /* Hsync Signal Polarity Select */
-       if (!(vin->mbus_cfg.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
-               dmr2 |= VNDMR2_HPS;
+       if (!vin->is_csi) {
+               /* Hsync Signal Polarity Select */
+               if (!(vin->parallel->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
+                       dmr2 |= VNDMR2_HPS;
 
-       /* Vsync Signal Polarity Select */
-       if (!(vin->mbus_cfg.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
-               dmr2 |= VNDMR2_VPS;
+               /* Vsync Signal Polarity Select */
+               if (!(vin->parallel->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
+                       dmr2 |= VNDMR2_VPS;
+       }
 
        /*
         * Output format
@@ -734,7 +744,7 @@ static int rvin_setup(struct rvin_dev *vin)
 
        if (vin->info->model == RCAR_GEN3) {
                /* Select between CSI-2 and parallel input */
-               if (vin->mbus_cfg.type == V4L2_MBUS_CSI2)
+               if (vin->is_csi)
                        vnmc &= ~VNMC_DPINE;
                else
                        vnmc |= VNMC_DPINE;
index 17b4de4d273487840c49a91c958ae702a3e13554..df2a47e4be3164ba7b36e4d6c7fbd8451588b427 100644 (file)
@@ -75,16 +75,22 @@ struct rvin_video_format {
 };
 
 /**
- * struct rvin_graph_entity - Video endpoint from async framework
+ * struct rvin_parallel_entity - Parallel video input endpoint descriptor
  * @asd:       sub-device descriptor for async framework
  * @subdev:    subdevice matched using async framework
+ * @mbus_type: media bus type
+ * @mbus_flags:        media bus configuration flags
  * @source_pad:        source pad of remote subdevice
  * @sink_pad:  sink pad of remote subdevice
+ *
  */
-struct rvin_graph_entity {
+struct rvin_parallel_entity {
        struct v4l2_async_subdev asd;
        struct v4l2_subdev *subdev;
 
+       enum v4l2_mbus_type mbus_type;
+       unsigned int mbus_flags;
+
        unsigned int source_pad;
        unsigned int sink_pad;
 };
@@ -148,7 +154,8 @@ struct rvin_info {
  * @v4l2_dev:          V4L2 device
  * @ctrl_handler:      V4L2 control handler
  * @notifier:          V4L2 asynchronous subdevs notifier
- * @parallel:          entity in the DT for local parallel subdevice
+ *
+ * @parallel:          parallel input subdevice descriptor
  *
  * @group:             Gen3 CSI group
  * @id:                        Gen3 group id for this VIN
@@ -166,7 +173,8 @@ struct rvin_info {
  * @sequence:          V4L2 buffers sequence number
  * @state:             keeps track of operation state
  *
- * @mbus_cfg:          media bus configuration from DT
+ * @is_csi:            flag to mark the VIN as using a CSI-2 subdevice
+ *
  * @mbus_code:         media bus format code
  * @format:            active V4L2 pixel format
  *
@@ -184,7 +192,8 @@ struct rvin_dev {
        struct v4l2_device v4l2_dev;
        struct v4l2_ctrl_handler ctrl_handler;
        struct v4l2_async_notifier notifier;
-       struct rvin_graph_entity *parallel;
+
+       struct rvin_parallel_entity *parallel;
 
        struct rvin_group *group;
        unsigned int id;
@@ -201,7 +210,8 @@ struct rvin_dev {
        unsigned int sequence;
        enum rvin_dma_state state;
 
-       struct v4l2_mbus_config mbus_cfg;
+       bool is_csi;
+
        u32 mbus_code;
        struct v4l2_pix_format format;