]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
[media] of: move common endpoint parsing to drivers/of
authorPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 14 Feb 2014 10:53:56 +0000 (11:53 +0100)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Thu, 6 Mar 2014 16:41:48 +0000 (17:41 +0100)
This patch adds a new struct of_endpoint which is then embedded in struct
v4l2_of_endpoint and contains the endpoint properties that are not V4L2
(or even media) specific: the port number, endpoint id, local device tree
node and remote endpoint phandle. of_graph_parse_endpoint parses those
properties and is used by v4l2_of_parse_endpoint, which just adds the
V4L2 MBUS information to the containing v4l2_of_endpoint structure.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Acked-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Acked-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
drivers/media/platform/exynos4-is/media-dev.c
drivers/media/platform/exynos4-is/mipi-csis.c
drivers/media/v4l2-core/v4l2-of.c
drivers/of/base.c
include/linux/of_graph.h
include/media/v4l2-of.h

index d0f82da59ac54cbc8c30fa1dc514161994620b63..04d6ecdd314cb10014c696ec296e329b291e0ea3 100644 (file)
@@ -469,10 +469,10 @@ static int fimc_md_parse_port_node(struct fimc_md *fmd,
                return 0;
 
        v4l2_of_parse_endpoint(ep, &endpoint);
-       if (WARN_ON(endpoint.port == 0) || index >= FIMC_MAX_SENSORS)
+       if (WARN_ON(endpoint.base.port == 0) || index >= FIMC_MAX_SENSORS)
                return -EINVAL;
 
-       pd->mux_id = (endpoint.port - 1) & 0x1;
+       pd->mux_id = (endpoint.base.port - 1) & 0x1;
 
        rem = of_graph_get_remote_port_parent(ep);
        of_node_put(ep);
@@ -494,13 +494,13 @@ static int fimc_md_parse_port_node(struct fimc_md *fmd,
                return -EINVAL;
        }
 
-       if (fimc_input_is_parallel(endpoint.port)) {
+       if (fimc_input_is_parallel(endpoint.base.port)) {
                if (endpoint.bus_type == V4L2_MBUS_PARALLEL)
                        pd->sensor_bus_type = FIMC_BUS_TYPE_ITU_601;
                else
                        pd->sensor_bus_type = FIMC_BUS_TYPE_ITU_656;
                pd->flags = endpoint.bus.parallel.flags;
-       } else if (fimc_input_is_mipi_csi(endpoint.port)) {
+       } else if (fimc_input_is_mipi_csi(endpoint.base.port)) {
                /*
                 * MIPI CSI-2: only input mux selection and
                 * the sensor's clock frequency is needed.
@@ -508,7 +508,7 @@ static int fimc_md_parse_port_node(struct fimc_md *fmd,
                pd->sensor_bus_type = FIMC_BUS_TYPE_MIPI_CSI2;
        } else {
                v4l2_err(&fmd->v4l2_dev, "Wrong port id (%u) at node %s\n",
-                        endpoint.port, rem->full_name);
+                        endpoint.base.port, rem->full_name);
        }
        /*
         * For FIMC-IS handled sensors, that are placed under i2c-isp device
index fd1ae6549607fe90c8793de5616f6fa5660c46ec..3678ba59725cf807cec7fa63527f0dd4ce3d3f1f 100644 (file)
@@ -772,7 +772,7 @@ static int s5pcsis_parse_dt(struct platform_device *pdev,
        /* Get port node and validate MIPI-CSI channel id. */
        v4l2_of_parse_endpoint(node, &endpoint);
 
-       state->index = endpoint.port - FIMC_INPUT_MIPI_CSI2_0;
+       state->index = endpoint.base.port - FIMC_INPUT_MIPI_CSI2_0;
        if (state->index < 0 || state->index >= CSIS_MAX_ENTITIES)
                return -ENXIO;
 
index f919db358bbec8b9c2cfe669b4951b16f1a849d6..b4ed9a955fbe0d779ad44b92a2780ff5d9808826 100644 (file)
@@ -127,17 +127,9 @@ static void v4l2_of_parse_parallel_bus(const struct device_node *node,
 int v4l2_of_parse_endpoint(const struct device_node *node,
                           struct v4l2_of_endpoint *endpoint)
 {
-       struct device_node *port_node = of_get_parent(node);
-
-       memset(endpoint, 0, offsetof(struct v4l2_of_endpoint, head));
-
-       endpoint->local_node = node;
-       /*
-        * It doesn't matter whether the two calls below succeed.
-        * If they don't then the default value 0 is used.
-        */
-       of_property_read_u32(port_node, "reg", &endpoint->port);
-       of_property_read_u32(node, "reg", &endpoint->id);
+       of_graph_parse_endpoint(node, &endpoint->base);
+       endpoint->bus_type = 0;
+       memset(&endpoint->bus, 0, sizeof(endpoint->bus));
 
        v4l2_of_parse_csi_bus(node, endpoint);
        /*
@@ -147,8 +139,6 @@ int v4l2_of_parse_endpoint(const struct device_node *node,
        if (endpoint->bus.mipi_csi2.flags == 0)
                v4l2_of_parse_parallel_bus(node, endpoint);
 
-       of_node_put(port_node);
-
        return 0;
 }
 EXPORT_SYMBOL(v4l2_of_parse_endpoint);
index a8e47d37cc7f03b03d08970785d1b0120c4838c8..715144af3a83b2592cde314aae0148376ae361cd 100644 (file)
@@ -1984,6 +1984,34 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
        return NULL;
 }
 
+/**
+ * of_graph_parse_endpoint() - parse common endpoint node properties
+ * @node: pointer to endpoint device_node
+ * @endpoint: pointer to the OF endpoint data structure
+ *
+ * The caller should hold a reference to @node.
+ */
+int of_graph_parse_endpoint(const struct device_node *node,
+                           struct of_endpoint *endpoint)
+{
+       struct device_node *port_node = of_get_parent(node);
+
+       memset(endpoint, 0, sizeof(*endpoint));
+
+       endpoint->local_node = node;
+       /*
+        * It doesn't matter whether the two calls below succeed.
+        * If they don't then the default value 0 is used.
+        */
+       of_property_read_u32(port_node, "reg", &endpoint->port);
+       of_property_read_u32(node, "reg", &endpoint->id);
+
+       of_node_put(port_node);
+
+       return 0;
+}
+EXPORT_SYMBOL(of_graph_parse_endpoint);
+
 /**
  * of_graph_get_next_endpoint() - get next endpoint node
  * @parent: pointer to the parent device node
index 3bbeb609a360f992692c1fc67d9255bd9194db7c..2b233db762372db2ae981c4d1f2046bd856be74e 100644 (file)
 #ifndef __LINUX_OF_GRAPH_H
 #define __LINUX_OF_GRAPH_H
 
+/**
+ * struct of_endpoint - the OF graph endpoint data structure
+ * @port: identifier (value of reg property) of a port this endpoint belongs to
+ * @id: identifier (value of reg property) of this endpoint
+ * @local_node: pointer to device_node of this endpoint
+ */
+struct of_endpoint {
+       unsigned int port;
+       unsigned int id;
+       const struct device_node *local_node;
+};
+
 #ifdef CONFIG_OF
+int of_graph_parse_endpoint(const struct device_node *node,
+                               struct of_endpoint *endpoint);
 struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
                                        struct device_node *previous);
 struct device_node *of_graph_get_remote_port_parent(
@@ -22,6 +36,12 @@ struct device_node *of_graph_get_remote_port_parent(
 struct device_node *of_graph_get_remote_port(const struct device_node *node);
 #else
 
+static inline int of_graph_parse_endpoint(const struct device_node *node,
+                                       struct of_endpoint *endpoint);
+{
+       return -ENOSYS;
+}
+
 static inline struct device_node *of_graph_get_next_endpoint(
                                        const struct device_node *parent,
                                        struct device_node *previous)
index 3a49735c56a0b5671f57e00878d0943dd4550115..70fa7b7b04879fc100bfce80cc79308260900e96 100644 (file)
@@ -51,17 +51,13 @@ struct v4l2_of_bus_parallel {
 
 /**
  * struct v4l2_of_endpoint - the endpoint data structure
- * @port: identifier (value of reg property) of a port this endpoint belongs to
- * @id: identifier (value of reg property) of this endpoint
- * @local_node: pointer to device_node of this endpoint
+ * @base: struct of_endpoint containing port, id, and local of_node
  * @bus_type: bus type
  * @bus: bus configuration data structure
  * @head: list head for this structure
  */
 struct v4l2_of_endpoint {
-       unsigned int port;
-       unsigned int id;
-       const struct device_node *local_node;
+       struct of_endpoint base;
        enum v4l2_mbus_type bus_type;
        union {
                struct v4l2_of_bus_parallel parallel;