diff options
Diffstat (limited to 'drivers/video/fbdev/omap2/dss/dss-of.c')
-rw-r--r-- | drivers/video/fbdev/omap2/dss/dss-of.c | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/drivers/video/fbdev/omap2/dss/dss-of.c b/drivers/video/fbdev/omap2/dss/dss-of.c index a4b20aaf6142..928ee639c0c1 100644 --- a/drivers/video/fbdev/omap2/dss/dss-of.c +++ b/drivers/video/fbdev/omap2/dss/dss-of.c | |||
@@ -20,6 +20,8 @@ | |||
20 | 20 | ||
21 | #include <video/omapdss.h> | 21 | #include <video/omapdss.h> |
22 | 22 | ||
23 | #include "dss.h" | ||
24 | |||
23 | struct device_node * | 25 | struct device_node * |
24 | omapdss_of_get_next_port(const struct device_node *parent, | 26 | omapdss_of_get_next_port(const struct device_node *parent, |
25 | struct device_node *prev) | 27 | struct device_node *prev) |
@@ -84,20 +86,17 @@ omapdss_of_get_next_endpoint(const struct device_node *parent, | |||
84 | } | 86 | } |
85 | EXPORT_SYMBOL_GPL(omapdss_of_get_next_endpoint); | 87 | EXPORT_SYMBOL_GPL(omapdss_of_get_next_endpoint); |
86 | 88 | ||
87 | static struct device_node * | 89 | struct device_node *dss_of_port_get_parent_device(struct device_node *port) |
88 | omapdss_of_get_remote_device_node(const struct device_node *node) | ||
89 | { | 90 | { |
90 | struct device_node *np; | 91 | struct device_node *np; |
91 | int i; | 92 | int i; |
92 | 93 | ||
93 | np = of_parse_phandle(node, "remote-endpoint", 0); | 94 | if (!port) |
94 | |||
95 | if (!np) | ||
96 | return NULL; | 95 | return NULL; |
97 | 96 | ||
98 | np = of_get_next_parent(np); | 97 | np = of_get_next_parent(port); |
99 | 98 | ||
100 | for (i = 0; i < 3 && np; ++i) { | 99 | for (i = 0; i < 2 && np; ++i) { |
101 | struct property *prop; | 100 | struct property *prop; |
102 | 101 | ||
103 | prop = of_find_property(np, "compatible", NULL); | 102 | prop = of_find_property(np, "compatible", NULL); |
@@ -111,6 +110,31 @@ omapdss_of_get_remote_device_node(const struct device_node *node) | |||
111 | return NULL; | 110 | return NULL; |
112 | } | 111 | } |
113 | 112 | ||
113 | u32 dss_of_port_get_port_number(struct device_node *port) | ||
114 | { | ||
115 | int r; | ||
116 | u32 reg; | ||
117 | |||
118 | r = of_property_read_u32(port, "reg", ®); | ||
119 | if (r) | ||
120 | reg = 0; | ||
121 | |||
122 | return reg; | ||
123 | } | ||
124 | |||
125 | static struct device_node *omapdss_of_get_remote_port(const struct device_node *node) | ||
126 | { | ||
127 | struct device_node *np; | ||
128 | |||
129 | np = of_parse_phandle(node, "remote-endpoint", 0); | ||
130 | if (!np) | ||
131 | return NULL; | ||
132 | |||
133 | np = of_get_next_parent(np); | ||
134 | |||
135 | return np; | ||
136 | } | ||
137 | |||
114 | struct device_node * | 138 | struct device_node * |
115 | omapdss_of_get_first_endpoint(const struct device_node *parent) | 139 | omapdss_of_get_first_endpoint(const struct device_node *parent) |
116 | { | 140 | { |
@@ -133,27 +157,25 @@ struct omap_dss_device * | |||
133 | omapdss_of_find_source_for_first_ep(struct device_node *node) | 157 | omapdss_of_find_source_for_first_ep(struct device_node *node) |
134 | { | 158 | { |
135 | struct device_node *ep; | 159 | struct device_node *ep; |
136 | struct device_node *src_node; | 160 | struct device_node *src_port; |
137 | struct omap_dss_device *src; | 161 | struct omap_dss_device *src; |
138 | 162 | ||
139 | ep = omapdss_of_get_first_endpoint(node); | 163 | ep = omapdss_of_get_first_endpoint(node); |
140 | if (!ep) | 164 | if (!ep) |
141 | return ERR_PTR(-EINVAL); | 165 | return ERR_PTR(-EINVAL); |
142 | 166 | ||
143 | src_node = omapdss_of_get_remote_device_node(ep); | 167 | src_port = omapdss_of_get_remote_port(ep); |
144 | 168 | if (!src_port) { | |
145 | of_node_put(ep); | 169 | of_node_put(ep); |
146 | |||
147 | if (!src_node) | ||
148 | return ERR_PTR(-EINVAL); | 170 | return ERR_PTR(-EINVAL); |
171 | } | ||
149 | 172 | ||
150 | src = omap_dss_find_output_by_node(src_node); | 173 | of_node_put(ep); |
151 | 174 | ||
152 | of_node_put(src_node); | 175 | src = omap_dss_find_output_by_port_node(src_port); |
153 | 176 | ||
154 | if (!src) | 177 | of_node_put(src_port); |
155 | return ERR_PTR(-EPROBE_DEFER); | ||
156 | 178 | ||
157 | return src; | 179 | return src ? src : ERR_PTR(-EPROBE_DEFER); |
158 | } | 180 | } |
159 | EXPORT_SYMBOL_GPL(omapdss_of_find_source_for_first_ep); | 181 | EXPORT_SYMBOL_GPL(omapdss_of_find_source_for_first_ep); |