aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-06-15 06:07:12 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-07-11 10:38:28 -0400
commit7e435aad38083f378ba7889d8b8fdcdbfe7088e7 (patch)
tree5bbdc53757bc3a2e596160ff938c5be7a2855c58 /drivers/gpu
parent4c834452aad01531db949414f94f817a86348d59 (diff)
drm: add of_graph endpoint helper to find possible CRTCs
Add a helper to allow encoders to find their possible CRTCs from the OF graph without having to re-implement this functionality. We add a device_node to drm_crtc which corresponds with the port node in the DT description of the CRTC device. We can then scan the DRM device list for CRTCs to find their index, matching the appropriate CRTC using the port device_node, thus building up the possible CRTC mask. Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/Makefile1
-rw-r--r--drivers/gpu/drm/drm_of.c67
2 files changed, 68 insertions, 0 deletions
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index dd2ba4269740..533d011eab3e 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -20,6 +20,7 @@ drm-$(CONFIG_COMPAT) += drm_ioc32.o
20drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o 20drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
21drm-$(CONFIG_PCI) += ati_pcigart.o 21drm-$(CONFIG_PCI) += ati_pcigart.o
22drm-$(CONFIG_DRM_PANEL) += drm_panel.o 22drm-$(CONFIG_DRM_PANEL) += drm_panel.o
23drm-$(CONFIG_OF) += drm_of.o
23 24
24drm-usb-y := drm_usb.o 25drm-usb-y := drm_usb.o
25 26
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
new file mode 100644
index 000000000000..16150a00c237
--- /dev/null
+++ b/drivers/gpu/drm/drm_of.c
@@ -0,0 +1,67 @@
1#include <linux/export.h>
2#include <linux/list.h>
3#include <linux/of_graph.h>
4#include <drm/drmP.h>
5#include <drm/drm_crtc.h>
6#include <drm/drm_of.h>
7
8/**
9 * drm_crtc_port_mask - find the mask of a registered CRTC by port OF node
10 * @dev: DRM device
11 * @port: port OF node
12 *
13 * Given a port OF node, return the possible mask of the corresponding
14 * CRTC within a device's list of CRTCs. Returns zero if not found.
15 */
16static uint32_t drm_crtc_port_mask(struct drm_device *dev,
17 struct device_node *port)
18{
19 unsigned int index = 0;
20 struct drm_crtc *tmp;
21
22 list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
23 if (tmp->port == port)
24 return 1 << index;
25
26 index++;
27 }
28
29 return 0;
30}
31
32/**
33 * drm_of_find_possible_crtcs - find the possible CRTCs for an encoder port
34 * @dev: DRM device
35 * @port: encoder port to scan for endpoints
36 *
37 * Scan all endpoints attached to a port, locate their attached CRTCs,
38 * and generate the DRM mask of CRTCs which may be attached to this
39 * encoder.
40 *
41 * See Documentation/devicetree/bindings/graph.txt for the bindings.
42 */
43uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
44 struct device_node *port)
45{
46 struct device_node *remote_port, *ep = NULL;
47 uint32_t possible_crtcs = 0;
48
49 do {
50 ep = of_graph_get_next_endpoint(port, ep);
51 if (!ep)
52 break;
53
54 remote_port = of_graph_get_remote_port(ep);
55 if (!remote_port) {
56 of_node_put(ep);
57 return 0;
58 }
59
60 possible_crtcs |= drm_crtc_port_mask(dev, remote_port);
61
62 of_node_put(remote_port);
63 } while (1);
64
65 return possible_crtcs;
66}
67EXPORT_SYMBOL(drm_of_find_possible_crtcs);