OSDN Git Service

media: v4l: fwnode: Make use of newly specified bus types
authorSakari Ailus <sakari.ailus@linux.intel.com>
Tue, 2 Jan 2018 13:14:30 +0000 (08:14 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Thu, 4 Oct 2018 20:10:18 +0000 (16:10 -0400)
Add support for parsing CSI-2 D-PHY, parallel or Bt.656 bus explicitly.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Steve Longerbeam <steve_longerbeam@mentor.com>
Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Tested-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/v4l2-core/v4l2-fwnode.c

index aa3d28c..2d0d2fa 100644 (file)
@@ -123,8 +123,16 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode,
        return 0;
 }
 
+#define PARALLEL_MBUS_FLAGS (V4L2_MBUS_HSYNC_ACTIVE_HIGH |     \
+                            V4L2_MBUS_HSYNC_ACTIVE_LOW |       \
+                            V4L2_MBUS_VSYNC_ACTIVE_HIGH |      \
+                            V4L2_MBUS_VSYNC_ACTIVE_LOW |       \
+                            V4L2_MBUS_FIELD_EVEN_HIGH |        \
+                            V4L2_MBUS_FIELD_EVEN_LOW)
+
 static void v4l2_fwnode_endpoint_parse_parallel_bus(
-       struct fwnode_handle *fwnode, struct v4l2_fwnode_endpoint *vep)
+       struct fwnode_handle *fwnode, struct v4l2_fwnode_endpoint *vep,
+       enum v4l2_fwnode_bus_type bus_type)
 {
        struct v4l2_fwnode_bus_parallel *bus = &vep->bus.parallel;
        unsigned int flags = 0;
@@ -189,16 +197,23 @@ static void v4l2_fwnode_endpoint_parse_parallel_bus(
                pr_debug("data-enable-active %s\n", v ? "high" : "low");
        }
 
-       bus->flags = flags;
-       if (flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH |
-                    V4L2_MBUS_HSYNC_ACTIVE_LOW |
-                    V4L2_MBUS_VSYNC_ACTIVE_HIGH |
-                    V4L2_MBUS_VSYNC_ACTIVE_LOW |
-                    V4L2_MBUS_FIELD_EVEN_HIGH |
-                    V4L2_MBUS_FIELD_EVEN_LOW))
+       switch (bus_type) {
+       default:
+               bus->flags = flags;
+               if (flags & PARALLEL_MBUS_FLAGS)
+                       vep->bus_type = V4L2_MBUS_PARALLEL;
+               else
+                       vep->bus_type = V4L2_MBUS_BT656;
+               break;
+       case V4L2_FWNODE_BUS_TYPE_PARALLEL:
                vep->bus_type = V4L2_MBUS_PARALLEL;
-       else
+               bus->flags = flags;
+               break;
+       case V4L2_FWNODE_BUS_TYPE_BT656:
                vep->bus_type = V4L2_MBUS_BT656;
+               bus->flags = flags & ~PARALLEL_MBUS_FLAGS;
+               break;
+       }
 }
 
 static void
@@ -258,7 +273,8 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
                        return rval;
 
                if (vep->bus_type == V4L2_MBUS_UNKNOWN)
-                       v4l2_fwnode_endpoint_parse_parallel_bus(fwnode, vep);
+                       v4l2_fwnode_endpoint_parse_parallel_bus(
+                               fwnode, vep, V4L2_MBUS_UNKNOWN);
 
                break;
        case V4L2_FWNODE_BUS_TYPE_CCP2:
@@ -266,6 +282,18 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
                v4l2_fwnode_endpoint_parse_csi1_bus(fwnode, vep, bus_type);
 
                break;
+       case V4L2_FWNODE_BUS_TYPE_CSI2_DPHY:
+               vep->bus_type = V4L2_MBUS_CSI2_DPHY;
+               rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep);
+               if (rval)
+                       return rval;
+
+               break;
+       case V4L2_FWNODE_BUS_TYPE_PARALLEL:
+       case V4L2_FWNODE_BUS_TYPE_BT656:
+               v4l2_fwnode_endpoint_parse_parallel_bus(fwnode, vep, bus_type);
+
+               break;
        default:
                pr_warn("unsupported bus type %u\n", bus_type);
                return -EINVAL;