This is a skeleton driver for the DRM/SoC framework.

Signed-off-by: Thierry Reding <thierry.reding at avionic-design.de>
---
 drivers/gpu/drm/Kconfig       |   2 +
 drivers/gpu/drm/Makefile      |   1 +
 drivers/gpu/drm/soc/Kconfig   |  13 ++++
 drivers/gpu/drm/soc/Makefile  |   6 ++
 drivers/gpu/drm/soc/soc-drv.c | 166 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 188 insertions(+)
 create mode 100644 drivers/gpu/drm/soc/Kconfig
 create mode 100644 drivers/gpu/drm/soc/Makefile
 create mode 100644 drivers/gpu/drm/soc/soc-drv.c

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 529dede..a23b436 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -196,3 +196,5 @@ source "drivers/gpu/drm/ast/Kconfig"
 source "drivers/gpu/drm/mgag200/Kconfig"

 source "drivers/gpu/drm/cirrus/Kconfig"
+
+source "drivers/gpu/drm/soc/Kconfig"
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 4731cbc..b7dde4e 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -47,4 +47,5 @@ obj-$(CONFIG_DRM_EXYNOS) +=exynos/
 obj-$(CONFIG_DRM_GMA500) += gma500/
 obj-$(CONFIG_DRM_UDL) += udl/
 obj-$(CONFIG_DRM_AST) += ast/
+obj-$(CONFIG_DRM_SOC_TEST) += soc/
 obj-y                  += i2c/
diff --git a/drivers/gpu/drm/soc/Kconfig b/drivers/gpu/drm/soc/Kconfig
new file mode 100644
index 0000000..c983bfe
--- /dev/null
+++ b/drivers/gpu/drm/soc/Kconfig
@@ -0,0 +1,13 @@
+config DRM_SOC_TEST
+       tristate "SoC DRM"
+       depends on DRM
+       select DRM_SOC
+
+if DRM_SOC_TEST
+
+config DRM_SOC_TEST_DEBUG
+       bool "SoC DRM debug support"
+       help
+         Say Y here to enable debugging support.
+
+endif
diff --git a/drivers/gpu/drm/soc/Makefile b/drivers/gpu/drm/soc/Makefile
new file mode 100644
index 0000000..c42f540
--- /dev/null
+++ b/drivers/gpu/drm/soc/Makefile
@@ -0,0 +1,6 @@
+ccflags-y := -Iinclude/drm
+ccflags-$(CONFIG_DRM_SOC_TEST_DEBUG) += -DDEBUG
+
+soc-drm-y := soc-drv.o
+
+obj-$(CONFIG_DRM_SOC_TEST) += soc-drm.o
diff --git a/drivers/gpu/drm/soc/soc-drv.c b/drivers/gpu/drm/soc/soc-drv.c
new file mode 100644
index 0000000..90b1705
--- /dev/null
+++ b/drivers/gpu/drm/soc/soc-drv.c
@@ -0,0 +1,166 @@
+#include <linux/module.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_sysfs.h>
+
+static int soc_drm_load(struct drm_device *dev, unsigned long flags)
+{
+       int ret = 0;
+
+       pr_debug("> %s(dev=%p, flags=%#lx)\n", __func__, dev, flags);
+
+       drm_mode_config_init(dev);
+
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+
+static int soc_drm_unload(struct drm_device *dev)
+{
+       int ret = 0;
+
+       pr_debug("> %s(dev=%p)\n", __func__, dev);
+
+       drm_mode_config_cleanup(dev);
+
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+
+static int soc_drm_open(struct drm_device *dev, struct drm_file *file)
+{
+       int ret = 0;
+       pr_debug("> %s(dev=%p, file=%p)\n", __func__, dev, file);
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+
+static void soc_drm_preclose(struct drm_device *dev, struct drm_file *file)
+{
+       pr_debug("> %s(dev=%p, file=%p)\n", __func__, dev, file);
+       pr_debug("< %s()\n", __func__);
+}
+
+static void soc_drm_postclose(struct drm_device *dev, struct drm_file *file)
+{
+       pr_debug("> %s(dev=%p, file=%p)\n", __func__, dev, file);
+       pr_debug("< %s()\n", __func__);
+}
+
+static void soc_drm_lastclose(struct drm_device *dev)
+{
+       pr_debug("> %s(dev=%p)\n", __func__, dev);
+       pr_debug("< %s()\n", __func__);
+}
+
+static int drm_soc_open(struct inode *inode, struct file *filp)
+{
+       int ret = 0;
+       pr_debug("> %s(inode=%p, filp=%p)\n", __func__, inode, filp);
+       ret = drm_open(inode, filp);
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+
+static int drm_soc_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+       int ret = 0;
+       pr_debug("> %s(filp=%p, vma=%p)\n", __func__, filp, vma);
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+
+static unsigned int drm_soc_poll(struct file *filp,
+                                struct poll_table_struct *wait)
+{
+       unsigned int ret = 0;
+       pr_debug("> %s(filp=%p, wait=%p)\n", __func__, filp, wait);
+       ret = drm_poll(filp, wait);
+       pr_debug("< %s() = %u\n", __func__, ret);
+       return ret;
+}
+
+static ssize_t drm_soc_read(struct file *filp, char __user *buffer,
+                           size_t count, loff_t *offset)
+{
+       ssize_t ret = 0;
+       pr_debug("> %s(filp=%p, buffer=%p, count=%zu, offset=%p)\n", __func__,
+                filp, buffer, count, offset);
+       ret = drm_read(filp, buffer, count, offset);
+       pr_debug("< %s() = %zd\n", __func__, ret);
+       return ret;
+}
+
+static long drm_soc_ioctl(struct file *filp, unsigned int cmd,
+                         unsigned long arg)
+{
+       long ret = 0;
+       pr_debug("> %s(filp=%p, cmd=%#x, arg=%#lx)\n", __func__, filp, cmd,
+                arg);
+       ret = drm_ioctl(filp, cmd, arg);
+       pr_debug("< %s() = %ld\n", __func__, ret);
+       return ret;
+}
+
+static int drm_soc_release(struct inode *inode, struct file *filp)
+{
+       int ret = 0;
+       pr_debug("> %s(inode=%p, file=%p)\n", __func__, inode, filp);
+       ret = drm_release(inode, filp);
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+
+static const struct file_operations soc_drm_fops = {
+       .owner = THIS_MODULE,
+       .open = drm_soc_open,
+       .mmap = drm_soc_mmap,
+       .poll = drm_soc_poll,
+       .read = drm_soc_read,
+       .unlocked_ioctl = drm_soc_ioctl,
+       .release = drm_soc_release,
+};
+
+static struct drm_driver soc_drm = {
+       .driver_features = DRIVER_MODESET | DRIVER_GEM,
+       .load = soc_drm_load,
+       .unload = soc_drm_unload,
+       .open = soc_drm_open,
+       .preclose = soc_drm_preclose,
+       .lastclose = soc_drm_lastclose,
+       .postclose = soc_drm_postclose,
+       .fops = &soc_drm_fops,
+       .name = "soc-drm",
+       .desc = "SoC DRM driver",
+       .date = "20120706",
+       .major = 0,
+       .minor = 0,
+       .patchlevel = 0,
+};
+
+static int __init soc_drm_init(void)
+{
+       int ret = 0;
+
+       pr_debug("> %s()\n", __func__);
+
+       ret = drm_soc_init(&soc_drm, "soc");
+
+       pr_debug("< %s() = %d\n", __func__, ret);
+       return ret;
+}
+module_init(soc_drm_init);
+
+static void __exit soc_drm_exit(void)
+{
+       pr_debug("> %s()\n", __func__);
+
+       drm_soc_exit(&soc_drm);
+
+       pr_debug("< %s()\n", __func__);
+}
+module_exit(soc_drm_exit);
+
+MODULE_AUTHOR("Thierry Reding <thierry.reding at avionic-design.de>");
+MODULE_DESCRIPTION("SoC DRM driver");
+MODULE_LICENSE("GPL");
-- 
1.7.11.1

Reply via email to