[PATCH v3 06/10] media: v4l2-mediabus: Add support for DisplayPort media bus

From: Paweł Anikiel
Date: Tue May 07 2024 - 11:57:18 EST


Add new definitions, a config struct, and a parser for the DisplayPort
media bus.

Signed-off-by: Paweł Anikiel <panikiel@xxxxxxxxxx>
---
drivers/media/v4l2-core/v4l2-fwnode.c | 38 +++++++++++++++++++++++++++
include/media/v4l2-fwnode.h | 5 ++++
include/media/v4l2-mediabus.h | 17 ++++++++++++
3 files changed, 60 insertions(+)

diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c b/drivers/media/v4l2-core/v4l2-fwnode.c
index 89c7192148df..49ea4d264eb2 100644
--- a/drivers/media/v4l2-core/v4l2-fwnode.c
+++ b/drivers/media/v4l2-core/v4l2-fwnode.c
@@ -67,6 +67,10 @@ static const struct v4l2_fwnode_bus_conv {
V4L2_FWNODE_BUS_TYPE_DPI,
V4L2_MBUS_DPI,
"DPI",
+ }, {
+ V4L2_FWNODE_BUS_TYPE_DISPLAYPORT,
+ V4L2_MBUS_DISPLAYPORT,
+ "DisplayPort",
}
};

@@ -417,6 +421,33 @@ v4l2_fwnode_endpoint_parse_csi1_bus(struct fwnode_handle *fwnode,
vep->bus_type = V4L2_MBUS_CSI1;
}

+static int
+v4l2_fwnode_endpoint_parse_dp_bus(struct fwnode_handle *fwnode,
+ struct v4l2_fwnode_endpoint *vep,
+ enum v4l2_mbus_type bus_type)
+{
+ struct v4l2_mbus_config_displayport *bus = &vep->bus.displayport;
+ u32 array[4];
+ int count;
+ int i;
+
+ count = fwnode_property_count_u32(fwnode, "data-lanes");
+ if (count < 0)
+ return count;
+ if (!(count == 1 || count == 2 || count == 4))
+ return -EINVAL;
+ fwnode_property_read_u32_array(fwnode, "data-lanes", array, count);
+
+ for (i = 0; i < count; i++)
+ bus->data_lanes[i] = array[i];
+ bus->num_data_lanes = count;
+ bus->multi_stream_support = fwnode_property_present(fwnode, "multi-stream-support");
+
+ vep->bus_type = V4L2_MBUS_DISPLAYPORT;
+
+ return 0;
+}
+
static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
struct v4l2_fwnode_endpoint *vep)
{
@@ -482,6 +513,13 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
v4l2_fwnode_endpoint_parse_parallel_bus(fwnode, vep,
vep->bus_type);

+ break;
+ case V4L2_MBUS_DISPLAYPORT:
+ rval = v4l2_fwnode_endpoint_parse_dp_bus(fwnode, vep,
+ vep->bus_type);
+ if (rval)
+ return rval;
+
break;
default:
pr_warn("unsupported bus type %u\n", mbus_type);
diff --git a/include/media/v4l2-fwnode.h b/include/media/v4l2-fwnode.h
index f7c57c776589..777a61015ca0 100644
--- a/include/media/v4l2-fwnode.h
+++ b/include/media/v4l2-fwnode.h
@@ -36,6 +36,8 @@
* @bus.mipi_csi2: embedded &struct v4l2_mbus_config_mipi_csi2.
* Used if the bus is MIPI Alliance's Camera Serial
* Interface version 2 (MIPI CSI2).
+ * @bus.displayport: embedded &struct v4l2_mbus_config_displayport.
+ * Used if the bus is VESA DisplayPort.
* @link_frequencies: array of supported link frequencies
* @nr_of_link_frequencies: number of elements in link_frequenccies array
*/
@@ -46,6 +48,7 @@ struct v4l2_fwnode_endpoint {
struct v4l2_mbus_config_parallel parallel;
struct v4l2_mbus_config_mipi_csi1 mipi_csi1;
struct v4l2_mbus_config_mipi_csi2 mipi_csi2;
+ struct v4l2_mbus_config_displayport displayport;
} bus;
u64 *link_frequencies;
unsigned int nr_of_link_frequencies;
@@ -166,6 +169,7 @@ struct v4l2_fwnode_connector {
* @V4L2_FWNODE_BUS_TYPE_PARALLEL: Camera Parallel Interface bus
* @V4L2_FWNODE_BUS_TYPE_BT656: BT.656 video format bus-type
* @V4L2_FWNODE_BUS_TYPE_DPI: Video Parallel Interface bus
+ * @V4L2_FWNODE_BUS_TYPE_DISPLAYPORT: DisplayPort bus
* @NR_OF_V4L2_FWNODE_BUS_TYPE: Number of bus-types
*/
enum v4l2_fwnode_bus_type {
@@ -177,6 +181,7 @@ enum v4l2_fwnode_bus_type {
V4L2_FWNODE_BUS_TYPE_PARALLEL,
V4L2_FWNODE_BUS_TYPE_BT656,
V4L2_FWNODE_BUS_TYPE_DPI,
+ V4L2_FWNODE_BUS_TYPE_DISPLAYPORT,
NR_OF_V4L2_FWNODE_BUS_TYPE
};

diff --git a/include/media/v4l2-mediabus.h b/include/media/v4l2-mediabus.h
index 5bce6e423e94..74b5d96f5050 100644
--- a/include/media/v4l2-mediabus.h
+++ b/include/media/v4l2-mediabus.h
@@ -120,6 +120,18 @@ struct v4l2_mbus_config_mipi_csi1 {
unsigned char clock_lane;
};

+/**
+ * struct v4l2_mbus_config_displayport - DisplayPort data bus configuration
+ * @data_lanes: an array of physical data lane indexes
+ * @num_data_lanes: number of data lanes
+ * @multi_stream_support: multi stream transport support
+ */
+struct v4l2_mbus_config_displayport {
+ unsigned char data_lanes[4];
+ unsigned char num_data_lanes;
+ bool multi_stream_support;
+};
+
/**
* enum v4l2_mbus_type - media bus type
* @V4L2_MBUS_UNKNOWN: unknown bus type, no V4L2 mediabus configuration
@@ -131,6 +143,7 @@ struct v4l2_mbus_config_mipi_csi1 {
* @V4L2_MBUS_CSI2_DPHY: MIPI CSI-2 serial interface, with D-PHY
* @V4L2_MBUS_CSI2_CPHY: MIPI CSI-2 serial interface, with C-PHY
* @V4L2_MBUS_DPI: MIPI VIDEO DPI interface
+ * @V4L2_MBUS_DISPLAYPORT: DisplayPort interface
* @V4L2_MBUS_INVALID: invalid bus type (keep as last)
*/
enum v4l2_mbus_type {
@@ -142,6 +155,7 @@ enum v4l2_mbus_type {
V4L2_MBUS_CSI2_DPHY,
V4L2_MBUS_CSI2_CPHY,
V4L2_MBUS_DPI,
+ V4L2_MBUS_DISPLAYPORT,
V4L2_MBUS_INVALID,
};

@@ -159,6 +173,8 @@ enum v4l2_mbus_type {
* @bus.mipi_csi2: embedded &struct v4l2_mbus_config_mipi_csi2.
* Used if the bus is MIPI Alliance's Camera Serial
* Interface version 2 (MIPI CSI2).
+ * @bus.displayport: embedded &struct v4l2_mbus_config_displayport.
+ * Used if the bus is VESA DisplayPort interface.
*/
struct v4l2_mbus_config {
enum v4l2_mbus_type type;
@@ -166,6 +182,7 @@ struct v4l2_mbus_config {
struct v4l2_mbus_config_parallel parallel;
struct v4l2_mbus_config_mipi_csi1 mipi_csi1;
struct v4l2_mbus_config_mipi_csi2 mipi_csi2;
+ struct v4l2_mbus_config_displayport displayport;
} bus;
};

--
2.45.0.rc1.225.g2a3ae87e7f-goog