Commit b6eec1c4 authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

[media] v4l: of: Read lane-polarities endpoint property

Add lane_polarities field to struct v4l2_of_bus_mipi_csi2 and write the
contents of the lane-polarities property to it. The field tells the polarity
of the physical lanes starting from the first one. Any unused lanes are
ignored, i.e. only the polarity of the used lanes is specified.

Also rework reading the "data-lanes" property a little.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@iki.fi>
Acked-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 9e1ee1b7
...@@ -19,11 +19,10 @@ ...@@ -19,11 +19,10 @@
#include <media/v4l2-of.h> #include <media/v4l2-of.h>
static void v4l2_of_parse_csi_bus(const struct device_node *node, static int v4l2_of_parse_csi_bus(const struct device_node *node,
struct v4l2_of_endpoint *endpoint) struct v4l2_of_endpoint *endpoint)
{ {
struct v4l2_of_bus_mipi_csi2 *bus = &endpoint->bus.mipi_csi2; struct v4l2_of_bus_mipi_csi2 *bus = &endpoint->bus.mipi_csi2;
u32 data_lanes[ARRAY_SIZE(bus->data_lanes)];
struct property *prop; struct property *prop;
bool have_clk_lane = false; bool have_clk_lane = false;
unsigned int flags = 0; unsigned int flags = 0;
...@@ -32,16 +31,34 @@ static void v4l2_of_parse_csi_bus(const struct device_node *node, ...@@ -32,16 +31,34 @@ static void v4l2_of_parse_csi_bus(const struct device_node *node,
prop = of_find_property(node, "data-lanes", NULL); prop = of_find_property(node, "data-lanes", NULL);
if (prop) { if (prop) {
const __be32 *lane = NULL; const __be32 *lane = NULL;
int i; unsigned int i;
for (i = 0; i < ARRAY_SIZE(data_lanes); i++) { for (i = 0; i < ARRAY_SIZE(bus->data_lanes); i++) {
lane = of_prop_next_u32(prop, lane, &data_lanes[i]); lane = of_prop_next_u32(prop, lane, &v);
if (!lane) if (!lane)
break; break;
bus->data_lanes[i] = v;
} }
bus->num_data_lanes = i; bus->num_data_lanes = i;
while (i--) }
bus->data_lanes[i] = data_lanes[i];
prop = of_find_property(node, "lane-polarities", NULL);
if (prop) {
const __be32 *polarity = NULL;
unsigned int i;
for (i = 0; i < ARRAY_SIZE(bus->lane_polarities); i++) {
polarity = of_prop_next_u32(prop, polarity, &v);
if (!polarity)
break;
bus->lane_polarities[i] = v;
}
if (i < 1 + bus->num_data_lanes /* clock + data */) {
pr_warn("%s: too few lane-polarities entries (need %u, got %u)\n",
node->full_name, 1 + bus->num_data_lanes, i);
return -EINVAL;
}
} }
if (!of_property_read_u32(node, "clock-lanes", &v)) { if (!of_property_read_u32(node, "clock-lanes", &v)) {
...@@ -56,6 +73,8 @@ static void v4l2_of_parse_csi_bus(const struct device_node *node, ...@@ -56,6 +73,8 @@ static void v4l2_of_parse_csi_bus(const struct device_node *node,
bus->flags = flags; bus->flags = flags;
endpoint->bus_type = V4L2_MBUS_CSI2; endpoint->bus_type = V4L2_MBUS_CSI2;
return 0;
} }
static void v4l2_of_parse_parallel_bus(const struct device_node *node, static void v4l2_of_parse_parallel_bus(const struct device_node *node,
...@@ -127,11 +146,15 @@ static void v4l2_of_parse_parallel_bus(const struct device_node *node, ...@@ -127,11 +146,15 @@ static void v4l2_of_parse_parallel_bus(const struct device_node *node,
int v4l2_of_parse_endpoint(const struct device_node *node, int v4l2_of_parse_endpoint(const struct device_node *node,
struct v4l2_of_endpoint *endpoint) struct v4l2_of_endpoint *endpoint)
{ {
int rval;
of_graph_parse_endpoint(node, &endpoint->base); of_graph_parse_endpoint(node, &endpoint->base);
endpoint->bus_type = 0; endpoint->bus_type = 0;
memset(&endpoint->bus, 0, sizeof(endpoint->bus)); memset(&endpoint->bus, 0, sizeof(endpoint->bus));
v4l2_of_parse_csi_bus(node, endpoint); rval = v4l2_of_parse_csi_bus(node, endpoint);
if (rval)
return rval;
/* /*
* Parse the parallel video bus properties only if none * Parse the parallel video bus properties only if none
* of the MIPI CSI-2 specific properties were found. * of the MIPI CSI-2 specific properties were found.
......
...@@ -29,12 +29,15 @@ struct device_node; ...@@ -29,12 +29,15 @@ struct device_node;
* @data_lanes: an array of physical data lane indexes * @data_lanes: an array of physical data lane indexes
* @clock_lane: physical lane index of the clock lane * @clock_lane: physical lane index of the clock lane
* @num_data_lanes: number of data lanes * @num_data_lanes: number of data lanes
* @lane_polarities: polarity of the lanes. The order is the same of
* the physical lanes.
*/ */
struct v4l2_of_bus_mipi_csi2 { struct v4l2_of_bus_mipi_csi2 {
unsigned int flags; unsigned int flags;
unsigned char data_lanes[4]; unsigned char data_lanes[4];
unsigned char clock_lane; unsigned char clock_lane;
unsigned short num_data_lanes; unsigned short num_data_lanes;
bool lane_polarities[5];
}; };
/** /**
......
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