[RFC 3/4] DRM: add OF support for Dove DRM driver

Sebastian Hesselbarth sebastian.hesselbarth at gmail.com
Sat May 18 10:12:18 PDT 2013


This adds OF support for the Dove DRM driver recently posted as RFC by
Russell King.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
---
Cc: Russell King <linux at arm.linux.org.uk>
Cc: linux-arm-kernel at lists.infradead.org
Cc: dri-devel at lists.freedesktop.org
Cc: Jason Cooper <jason at lakedaemon.net>
Cc: Jean-Francois Moine <moinejf at free.fr>
---
 drivers/gpu/drm/dove/Kconfig     |    4 ++
 drivers/gpu/drm/dove/Makefile    |    1 +
 drivers/gpu/drm/dove/dove_card.c |  110 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 115 insertions(+)
 create mode 100644 drivers/gpu/drm/dove/dove_card.c

diff --git a/drivers/gpu/drm/dove/Kconfig b/drivers/gpu/drm/dove/Kconfig
index 718d3c5..a943ea5 100644
--- a/drivers/gpu/drm/dove/Kconfig
+++ b/drivers/gpu/drm/dove/Kconfig
@@ -28,4 +28,8 @@ config DRM_DOVE_TDA1998X
 config DRM_DOVE_CURSOR
 	bool "Enable Dove DRM hardware cursor support"
 
+config DRM_DOVE_OF
+	bool "Enable Dove DRM OF video card"
+	depends on OF
+
 endif
diff --git a/drivers/gpu/drm/dove/Makefile b/drivers/gpu/drm/dove/Makefile
index 65c701e..f0b6eed 100644
--- a/drivers/gpu/drm/dove/Makefile
+++ b/drivers/gpu/drm/dove/Makefile
@@ -5,5 +5,6 @@ dove-y			:= dove_crtc.o dove_drv.o dove_fb.o dove_fbdev.o \
 dove-$(CONFIG_DEBUG_FS) += dove_debugfs.o
 
 dove-$(CONFIG_DRM_DOVE_TDA1998X) += dove_tda19988.o
+dove-$(CONFIG_DRM_DOVE_OF) += dove_card.o
 
 obj-$(CONFIG_DRM_DOVE) := dove.o
diff --git a/drivers/gpu/drm/dove/dove_card.c b/drivers/gpu/drm/dove/dove_card.c
new file mode 100644
index 0000000..e4bcb5b
--- /dev/null
+++ b/drivers/gpu/drm/dove/dove_card.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2013
+ *   Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+
+#define DOVE_LCD0_BASE	0x20000
+#define DOVE_LCD1_BASE	0x10000
+
+static struct resource dove_drm_resources[5];
+static struct platform_device dove_drm_platform_device = {
+	.name = "dove-drm",
+	.id = 0,
+	.dev = { .coherent_dma_mask = ~0, },
+	.resource = dove_drm_resources,
+};
+
+static int dove_card_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *lcdnp;
+	struct resource *res = dove_drm_resources;
+	int ret, n = 0, crtcs = 0;
+
+	/* get video memory resource */
+	if (of_address_to_resource(np, 0, &res[n++])) {
+		dev_err(&pdev->dev, "invalid or missing video memory\n");
+		return -EINVAL;
+	}
+
+	/* get reg and irq resource from each enabled lcdc */
+	for_each_compatible_node(lcdnp, NULL, "marvell,dove-lcd") {
+		struct clk_lookup *cl;
+		struct clk *clk;
+		int lcd;
+
+		if (!of_device_is_available(lcdnp))
+			continue;
+
+		ret = of_address_to_resource(lcdnp, 0, &res[n]);
+		if (ret)
+			return ret;
+		lcd = ((res[n].start & 0xfffff) == DOVE_LCD1_BASE);
+		n++;
+
+		ret = of_irq_to_resource(lcdnp, 0, &res[n]);
+		if (ret < 0)
+			return ret;
+		n++;
+
+		crtcs++;
+
+		clk = clk_get(&pdev->dev, NULL);
+		if (IS_ERR(clk)) {
+			ret = PTR_ERR(clk);
+			if (ret == -ENOENT)
+				return -EPROBE_DEFER;
+			return ret;
+		}
+
+		/* add clock alias for dovefb.0 */
+		cl = clkdev_alloc(clk, "extclk", "dovefb.0");
+		if (cl)
+			clkdev_add(cl);
+		clk_put(clk);
+	}
+
+	if (!crtcs)
+		return -ENODEV;
+
+	dove_drm_platform_device.num_resources = n;
+	ret = platform_device_register(&dove_drm_platform_device);
+	if (ret) {
+		dev_err(&pdev->dev, "unable to register drm device\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static const struct of_device_id dove_card_of_ids[] = {
+	{ .compatible = "marvell,dove-video-card", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, dove_card_of_ids);
+
+static struct platform_driver dove_card_driver = {
+	.probe	= dove_card_probe,
+	.driver	= {
+		.owner	= THIS_MODULE,
+		.name	= "dove-drm-card",
+		.of_match_table = of_match_ptr(dove_card_of_ids),
+	},
+};
+module_platform_driver(dove_card_driver);
+
+MODULE_AUTHOR("Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>");
+MODULE_DESCRIPTION("Dove DRM Graphics Card");
+MODULE_LICENSE("GPL");
-- 
1.7.10.4



More information about the dri-devel mailing list