[RFC 2/2] drm: Add SoC skeleton driver
Thierry Reding
thierry.reding at avionic-design.de
Fri Jul 6 07:01:00 PDT 2012
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
More information about the dri-devel
mailing list