media: v4l: fwnode: Use V4L2 fwnode endpoint media bus type if set

Use the given media bus type set by the caller. If none is given (i.e. the
mbus type is V4L2_MBUS_UNKNOWN, or 0), fall back to the old behaviour.
This is to obtain the information from the DT or try to guess the bus
type.

-ENXIO is returned if the caller sets the bus type but that does not match
with what's in DT. Also return -ENXIO if bus type detection failed to
separate this from the rest of the errors.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Steve Longerbeam <steve_longerbeam@mentor.com>
Tested-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Sakari Ailus 2018-07-19 11:22:49 -04:00 committed by Mauro Carvalho Chehab
parent 3eb32c264d
commit e7b2f5185e

View file

@ -404,7 +404,7 @@ v4l2_fwnode_endpoint_parse_csi1_bus(struct fwnode_handle *fwnode,
static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode, static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
struct v4l2_fwnode_endpoint *vep) struct v4l2_fwnode_endpoint *vep)
{ {
u32 bus_type = 0; u32 bus_type = V4L2_FWNODE_BUS_TYPE_GUESS;
enum v4l2_mbus_type mbus_type; enum v4l2_mbus_type mbus_type;
int rval; int rval;
@ -427,13 +427,24 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
v4l2_fwnode_bus_type_to_string(bus_type), bus_type, v4l2_fwnode_bus_type_to_string(bus_type), bus_type,
v4l2_fwnode_mbus_type_to_string(vep->bus_type), v4l2_fwnode_mbus_type_to_string(vep->bus_type),
vep->bus_type); vep->bus_type);
mbus_type = v4l2_fwnode_bus_type_to_mbus(bus_type); mbus_type = v4l2_fwnode_bus_type_to_mbus(bus_type);
switch (mbus_type) { if (vep->bus_type != V4L2_MBUS_UNKNOWN) {
if (mbus_type != V4L2_MBUS_UNKNOWN &&
vep->bus_type != mbus_type) {
pr_debug("expecting bus type %s\n",
v4l2_fwnode_mbus_type_to_string(
vep->bus_type));
return -ENXIO;
}
} else {
vep->bus_type = mbus_type;
}
switch (vep->bus_type) {
case V4L2_MBUS_UNKNOWN: case V4L2_MBUS_UNKNOWN:
rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep, rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep,
mbus_type); V4L2_MBUS_UNKNOWN);
if (rval) if (rval)
return rval; return rval;
@ -448,20 +459,20 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
break; break;
case V4L2_MBUS_CCP2: case V4L2_MBUS_CCP2:
case V4L2_MBUS_CSI1: case V4L2_MBUS_CSI1:
v4l2_fwnode_endpoint_parse_csi1_bus(fwnode, vep, mbus_type); v4l2_fwnode_endpoint_parse_csi1_bus(fwnode, vep, vep->bus_type);
break; break;
case V4L2_MBUS_CSI2_DPHY: case V4L2_MBUS_CSI2_DPHY:
vep->bus_type = V4L2_MBUS_CSI2_DPHY;
rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep, rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep,
mbus_type); vep->bus_type);
if (rval) if (rval)
return rval; return rval;
break; break;
case V4L2_MBUS_PARALLEL: case V4L2_MBUS_PARALLEL:
case V4L2_MBUS_BT656: case V4L2_MBUS_BT656:
v4l2_fwnode_endpoint_parse_parallel_bus(fwnode, vep, mbus_type); v4l2_fwnode_endpoint_parse_parallel_bus(fwnode, vep,
vep->bus_type);
break; break;
default: default: