[PATCH RFC] drm: add of_graph endpoint helper to find possible CRTCs
Rob Clark
robdclark at gmail.com
Thu Jul 3 15:17:24 PDT 2014
On Thu, Jul 3, 2014 at 12:49 PM, Russell King
<rmk+kernel at arm.linux.org.uk> wrote:
> 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.
>
> Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
> ---
> This helper will be shared between imx-drm and Armada DRM, and should
> be useful for other OF-based drivers. At the moment, this is being
> sent for comments and acks; I need to build upon this patch in order
> to convert Armada DRM to DT.
ok, possibly a dumb question, but in my defense I don't claim to be a
DT expert ;-)
Do you have somewhere handy a example dts which this would be parsing?
I think that would help me understand this patch a bit better.
BR,
-R
> drivers/gpu/drm/Makefile | 1 +
> drivers/gpu/drm/drm_of.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++
> include/drm/drm_crtc.h | 2 ++
> include/drm/drm_of.h | 18 ++++++++++++++
> 4 files changed, 86 insertions(+)
> create mode 100644 drivers/gpu/drm/drm_of.c
> create mode 100644 include/drm/drm_of.h
>
> 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
> drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
> drm-$(CONFIG_PCI) += ati_pcigart.o
> drm-$(CONFIG_DRM_PANEL) += drm_panel.o
> +drm-$(CONFIG_OF) += drm_of.o
>
> drm-usb-y := drm_usb.o
>
> diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
> new file mode 100644
> index 000000000000..46d967881689
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_of.c
> @@ -0,0 +1,65 @@
> +#include <linux/export.h>
> +#include <linux/list.h>
> +#include <linux/of_graph.h>
> +#include <drm/drmP.h>
> +#include <drm/drm_crtc.h>
> +#include <drm/drm_of.h>
> +
> +/**
> + * drm_crtc_port_mask - find the mask of a registered CRTC by port OF node
> + * @dev: DRM device
> + * @port: port OF node
> + *
> + * Given a port OF node, return the possible mask of the corresponding
> + * CRTC within a device's list of CRTCs. Returns zero if not found.
> + */
> +static uint32_t drm_crtc_port_mask(struct drm_device *dev,
> + struct device_node *port)
> +{
> + unsigned int index = 0;
> + struct drm_crtc *tmp;
> +
> + list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
> + if (tmp->port == port)
> + return 1 << index;
> +
> + index++;
> + }
> +
> + return 0;
> +}
> +
> +/**
> + * drm_of_find_possible_crtcs - find the possible CRTCs for an encoder port
> + * @dev: DRM device
> + * @port: encoder port to scan for endpoints
> + *
> + * Scan all endpoints attached to a port, locate their attached CRTCs,
> + * and generate the DRM mask of CRTCs which may be attached to this
> + * encoder.
> + */
> +uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
> + struct device_node *port)
> +{
> + struct device_node *remote_port, *ep = NULL;
> + uint32_t possible_crtcs = 0;
> +
> + do {
> + ep = of_graph_get_next_endpoint(port, ep);
> + if (!ep)
> + break;
> +
> + remote_port = of_graph_get_remote_port(ep);
> + if (!remote_port) {
> + of_node_put(ep);
> + return 0;
> + }
> +
> + possible_crtcs |= drm_crtc_port_mask(dev, remote_port);
> +
> + of_node_put(remote_port);
> + } while (1);
> +
> + return possible_crtcs;
> +}
> +EXPORT_SYMBOL(drm_of_find_possible_crtcs);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 251b75e6bf7a..6a94909f1ca9 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -41,6 +41,7 @@ struct drm_framebuffer;
> struct drm_object_properties;
> struct drm_file;
> struct drm_clip_rect;
> +struct device_node;
>
> #define DRM_MODE_OBJECT_CRTC 0xcccccccc
> #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
> @@ -314,6 +315,7 @@ struct drm_crtc_funcs {
> */
> struct drm_crtc {
> struct drm_device *dev;
> + struct device_node *port;
> struct list_head head;
>
> /**
> diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
> new file mode 100644
> index 000000000000..2441f7112074
> --- /dev/null
> +++ b/include/drm/drm_of.h
> @@ -0,0 +1,18 @@
> +#ifndef __DRM_OF_H__
> +#define __DRM_OF_H__
> +
> +struct drm_device;
> +struct device_node;
> +
> +#ifdef CONFIG_OF
> +extern uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
> + struct device_node *port);
> +#else
> +static inline uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
> + struct device_node *port)
> +{
> + return 0;
> +}
> +#endif
> +
> +#endif /* __DRM_OF_H__ */
> --
> 1.8.3.1
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
More information about the linux-arm-kernel
mailing list