mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
media: v4l: fwnode: Parse MiPI DisCo for C-PHY line-orders
Extend the fwnode parsing to validate and fill in the CSI-2 C-PHY line-orders order properties as defined in MIPI Discovery and Configuration (DisCo) Specification for Imaging. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> [Sakari Ailus: Use ARRAY_SIZE() instead of an integer.] Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
91a7088096
commit
573b4adddb
@ -127,7 +127,7 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode,
|
|||||||
{
|
{
|
||||||
struct v4l2_mbus_config_mipi_csi2 *bus = &vep->bus.mipi_csi2;
|
struct v4l2_mbus_config_mipi_csi2 *bus = &vep->bus.mipi_csi2;
|
||||||
bool have_clk_lane = false, have_data_lanes = false,
|
bool have_clk_lane = false, have_data_lanes = false,
|
||||||
have_lane_polarities = false;
|
have_lane_polarities = false, have_line_orders = false;
|
||||||
unsigned int flags = 0, lanes_used = 0;
|
unsigned int flags = 0, lanes_used = 0;
|
||||||
u32 array[1 + V4L2_MBUS_CSI2_MAX_DATA_LANES];
|
u32 array[1 + V4L2_MBUS_CSI2_MAX_DATA_LANES];
|
||||||
u32 clock_lane = 0;
|
u32 clock_lane = 0;
|
||||||
@ -197,6 +197,17 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode,
|
|||||||
have_lane_polarities = true;
|
have_lane_polarities = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rval = fwnode_property_count_u32(fwnode, "line-orders");
|
||||||
|
if (rval > 0) {
|
||||||
|
if (rval != num_data_lanes) {
|
||||||
|
pr_warn("invalid number of line-orders entries (need %u, got %u)\n",
|
||||||
|
num_data_lanes, rval);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
have_line_orders = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) {
|
if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) {
|
||||||
clock_lane = v;
|
clock_lane = v;
|
||||||
pr_debug("clock lane position %u\n", v);
|
pr_debug("clock lane position %u\n", v);
|
||||||
@ -250,6 +261,36 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode,
|
|||||||
} else {
|
} else {
|
||||||
pr_debug("no lane polarities defined, assuming not inverted\n");
|
pr_debug("no lane polarities defined, assuming not inverted\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (have_line_orders) {
|
||||||
|
fwnode_property_read_u32_array(fwnode,
|
||||||
|
"line-orders", array,
|
||||||
|
num_data_lanes);
|
||||||
|
|
||||||
|
for (i = 0; i < num_data_lanes; i++) {
|
||||||
|
static const char * const orders[] = {
|
||||||
|
"ABC", "ACB", "BAC", "BCA", "CAB", "CBA"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (array[i] >= ARRAY_SIZE(orders)) {
|
||||||
|
pr_warn("lane %u invalid line-order assuming ABC (got %u)\n",
|
||||||
|
i, array[i]);
|
||||||
|
bus->line_orders[i] =
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_ABC;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus->line_orders[i] = array[i];
|
||||||
|
pr_debug("lane %u line order %s", i,
|
||||||
|
orders[array[i]]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < num_data_lanes; i++)
|
||||||
|
bus->line_orders[i] =
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_ABC;
|
||||||
|
|
||||||
|
pr_debug("no line orders defined, assuming ABC\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -73,6 +73,24 @@
|
|||||||
|
|
||||||
#define V4L2_MBUS_CSI2_MAX_DATA_LANES 8
|
#define V4L2_MBUS_CSI2_MAX_DATA_LANES 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum v4l2_mbus_csi2_cphy_line_orders_type - CSI-2 C-PHY line order
|
||||||
|
* @V4L2_MBUS_CSI2_CPHY_LINE_ORDER_ABC: C-PHY line order ABC (default)
|
||||||
|
* @V4L2_MBUS_CSI2_CPHY_LINE_ORDER_ACB: C-PHY line order ACB
|
||||||
|
* @V4L2_MBUS_CSI2_CPHY_LINE_ORDER_BAC: C-PHY line order BAC
|
||||||
|
* @V4L2_MBUS_CSI2_CPHY_LINE_ORDER_BCA: C-PHY line order BCA
|
||||||
|
* @V4L2_MBUS_CSI2_CPHY_LINE_ORDER_CAB: C-PHY line order CAB
|
||||||
|
* @V4L2_MBUS_CSI2_CPHY_LINE_ORDER_CBA: C-PHY line order CBA
|
||||||
|
*/
|
||||||
|
enum v4l2_mbus_csi2_cphy_line_orders_type {
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_ABC,
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_ACB,
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_BAC,
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_BCA,
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_CAB,
|
||||||
|
V4L2_MBUS_CSI2_CPHY_LINE_ORDER_CBA,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct v4l2_mbus_config_mipi_csi2 - MIPI CSI-2 data bus configuration
|
* struct v4l2_mbus_config_mipi_csi2 - MIPI CSI-2 data bus configuration
|
||||||
* @flags: media bus (V4L2_MBUS_*) flags
|
* @flags: media bus (V4L2_MBUS_*) flags
|
||||||
@ -81,6 +99,8 @@
|
|||||||
* @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
|
* @lane_polarities: polarity of the lanes. The order is the same of
|
||||||
* the physical lanes.
|
* the physical lanes.
|
||||||
|
* @line_orders: line order of the data lanes. The order is the same of the
|
||||||
|
* physical lanes.
|
||||||
*/
|
*/
|
||||||
struct v4l2_mbus_config_mipi_csi2 {
|
struct v4l2_mbus_config_mipi_csi2 {
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
@ -88,6 +108,7 @@ struct v4l2_mbus_config_mipi_csi2 {
|
|||||||
unsigned char clock_lane;
|
unsigned char clock_lane;
|
||||||
unsigned char num_data_lanes;
|
unsigned char num_data_lanes;
|
||||||
bool lane_polarities[1 + V4L2_MBUS_CSI2_MAX_DATA_LANES];
|
bool lane_polarities[1 + V4L2_MBUS_CSI2_MAX_DATA_LANES];
|
||||||
|
enum v4l2_mbus_csi2_cphy_line_orders_type line_orders[V4L2_MBUS_CSI2_MAX_DATA_LANES];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user