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