Commit 158e2a53 authored by Jacopo Mondi's avatar Jacopo Mondi Committed by Mauro Carvalho Chehab

media: rcar-vin: Cache the mbus configuration flags

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