This adds OF support for the Dove DRM driver recently posted as RFC by Russell King. Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@xxxxxxxxx> --- Cc: Russell King <linux@xxxxxxxxxxxxxxxx> Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx Cc: Jason Cooper <jason@xxxxxxxxxxxxxx> Cc: Jean-Francois Moine <moinejf@xxxxxxx> --- 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@xxxxxxxxx> + * + * 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@xxxxxxxxx>"); +MODULE_DESCRIPTION("Dove DRM Graphics Card"); +MODULE_LICENSE("GPL"); -- 1.7.10.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel