Initial KMS stuff
authorThomas White <taw@bitwiz.org.uk>
Wed, 27 May 2009 21:14:11 +0000 (22:14 +0100)
committerThomas White <taw@bitwiz.org.uk>
Wed, 27 May 2009 21:14:11 +0000 (22:14 +0100)
drivers/mfd/glamo/Makefile
drivers/mfd/glamo/glamo-display.c [new file with mode: 0644]
drivers/mfd/glamo/glamo-display.h [new file with mode: 0644]
drivers/mfd/glamo/glamo-drm-drv.c
drivers/mfd/glamo/glamo-drm-private.h

index 75476de..7d3f7d6 100644 (file)
@@ -12,4 +12,4 @@ obj-$(CONFIG_MFD_GLAMO_SPI_FB)                += glamo-lcm-spi.o
 obj-$(CONFIG_MFD_GLAMO_MCI)            += glamo-mci.o
 obj-$(CONFIG_MFD_GLAMO_DRM)            += glamo-drm.o
 
-glamo-drm-objs :=  glamo-drm-drv.o glamo-cmdq.o glamo-buffer.o
+glamo-drm-objs :=  glamo-drm-drv.o glamo-cmdq.o glamo-buffer.o glamo-display.o
diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
new file mode 100644 (file)
index 0000000..b129b8d
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * SMedia Glamo 336x/337x display
+ *
+ * Copyright (C) 2008-2009 Thomas White <taw@bitwiz.org.uk>
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+
+#include <drm/drmP.h>
+#include <drm/glamo_drm.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_crtc.h>
+
+#include "glamo-core.h"
+#include "glamo-drm-private.h"
+#include "glamo-regs.h"
+
+
+static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
+{
+}
+
+
+static bool glamo_crtc_mode_fixup(struct drm_crtc *crtc,
+                                  struct drm_display_mode *mode,
+                                  struct drm_display_mode *adjusted_mode)
+{
+       return true;
+}
+
+
+static void glamo_crtc_mode_set(struct drm_crtc *crtc,
+                                struct drm_display_mode *mode,
+                                struct drm_display_mode *adjusted_mode,
+                                int x, int y,
+                                struct drm_framebuffer *old_fb)
+{
+}
+
+
+
+static void glamo_pipe_set_base(struct drm_crtc *crtc, int x, int y,
+                                struct drm_framebuffer *old_fb)
+{
+}
+
+
+static void glamo_crtc_prepare(struct drm_crtc *crtc)
+{
+       struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
+       crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
+}
+
+
+static void glamo_crtc_commit(struct drm_crtc *crtc)
+{
+       struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
+       crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
+}
+
+
+static int glamo_crtc_cursor_set(struct drm_crtc *crtc,
+                                 struct drm_file *file_priv,
+                                 uint32_t handle,
+                                 uint32_t width, uint32_t height)
+{
+       return 0;
+}
+
+
+static int glamo_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
+{
+       return 0;
+}
+
+
+static void glamo_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
+                                 u16 *blue, uint32_t size)
+{
+}
+
+
+static void glamo_crtc_destroy(struct drm_crtc *crtc)
+{
+       struct glamo_crtc *glamo_crtc = to_glamo_crtc(crtc);
+
+       drm_crtc_cleanup(crtc);
+       kfree(glamo_crtc);
+}
+
+
+static const struct drm_crtc_helper_funcs glamo_helper_funcs = {
+       .dpms = glamo_crtc_dpms,
+       .mode_fixup = glamo_crtc_mode_fixup,
+       .mode_set = glamo_crtc_mode_set,
+       .mode_set_base = glamo_pipe_set_base,
+       .prepare = glamo_crtc_prepare,
+       .commit = glamo_crtc_commit,
+};
+
+
+static const struct drm_crtc_funcs glamo_crtc_funcs = {
+       .cursor_set = glamo_crtc_cursor_set,
+       .cursor_move = glamo_crtc_cursor_move,
+       .gamma_set = glamo_crtc_gamma_set,
+       .set_config = drm_crtc_helper_set_config,
+       .destroy = glamo_crtc_destroy,
+};
+
+
+int glamo_display_init(struct drm_device *dev)
+{
+       struct glamodrm_handle *gdrm;
+       struct glamo_crtc *glamo_crtc;
+
+       glamo_crtc = kzalloc(sizeof(struct glamo_crtc)
+                          + sizeof(struct drm_connector *), GFP_KERNEL);
+       if (glamo_crtc == NULL)
+               return 1;
+
+       gdrm = dev->dev_private;
+
+       drm_crtc_init(dev, &glamo_crtc->base, &glamo_crtc_funcs);
+       drm_crtc_helper_add(&glamo_crtc->base, &glamo_helper_funcs);
+
+       return 0;
+}
diff --git a/drivers/mfd/glamo/glamo-display.h b/drivers/mfd/glamo/glamo-display.h
new file mode 100644 (file)
index 0000000..6d8d43c
--- /dev/null
@@ -0,0 +1,30 @@
+/* Smedia Glamo 336x/337x display
+ *
+ * Copyright (c) 2008-2009 Thomas White <taw@bitwiz.org.uk>
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __GLAMO_DISPLAY_H
+#define __GLAMO_DISPLAY_H
+
+#include <drm/drmP.h>
+
+extern int glamo_display_init(struct drm_device *dev);
+
+#endif /* __GLAMO_DISPLAY_H */
index 2208a8e..5136263 100644 (file)
@@ -31,6 +31,7 @@
 #include "glamo-cmdq.h"
 #include "glamo-buffer.h"
 #include "glamo-drm-private.h"
+#include "glamo-display.h"
 
 #define DRIVER_AUTHOR           "Openmoko, Inc."
 #define DRIVER_NAME             "glamo-drm"
@@ -126,13 +127,43 @@ static void glamodrm_master_destroy(struct drm_device *dev,
 }
 
 
+static int glamodrm_load(struct drm_device *dev, unsigned long flags)
+{
+       struct glamodrm_handle *gdrm;
+
+       gdrm = dev->dev_private;
+
+       glamo_buffer_init(gdrm);
+       glamo_cmdq_init(gdrm);
+       glamo_display_init(dev);
+
+       return 0;
+}
+
+
+static int glamodrm_unload(struct drm_device *dev)
+{
+       struct glamodrm_handle *gdrm;
+
+       gdrm = dev->dev_private;
+
+       glamo_engine_disable(gdrm->glamo_core, GLAMO_ENGINE_2D);
+       glamo_engine_disable(gdrm->glamo_core, GLAMO_ENGINE_3D);
+       glamo_buffer_final(gdrm);
+
+       return 0;
+}
+
+
 static struct vm_operations_struct glamodrm_gem_vm_ops = {
        .fault = glamodrm_gem_fault,
 };
 
 static struct drm_driver glamodrm_drm_driver = {
-       .driver_features = DRIVER_IS_PLATFORM | DRIVER_GEM,
+       .driver_features = DRIVER_IS_PLATFORM | DRIVER_GEM | DRIVER_MODESET,
        .firstopen = glamodrm_firstopen,
+       .load = glamodrm_load,
+       .unload = glamodrm_unload,
        .open = glamodrm_open,
        .preclose = glamodrm_preclose,
        .postclose = glamodrm_postclose,
@@ -247,9 +278,6 @@ static int glamodrm_probe(struct platform_device *pdev)
        /* Initialise DRM */
        drm_platform_init(&glamodrm_drm_driver, pdev, (void *)gdrm);
 
-       glamo_buffer_init(gdrm);
-       glamo_cmdq_init(gdrm);
-
        return 0;
 
 out_release_cmdq:
@@ -272,12 +300,7 @@ out_free:
 static int glamodrm_remove(struct platform_device *pdev)
 {
        struct glamodrm_handle *gdrm = platform_get_drvdata(pdev);
-       struct glamo_core *glamocore = pdev->dev.platform_data;
-
-       glamo_engine_disable(glamocore, GLAMO_ENGINE_2D);
-       glamo_engine_disable(glamocore, GLAMO_ENGINE_3D);
 
-       glamo_buffer_final(gdrm);
        drm_exit(&glamodrm_drm_driver);
 
        platform_set_drvdata(pdev, NULL);
index 59fbc24..d1c76c2 100644 (file)
@@ -58,6 +58,7 @@ struct glamodrm_handle {
        struct drm_mm *mmgr;
 };
 
+
 /* Private data.  This is where we keep our memory management bits */
 struct drm_glamo_gem_object {
        struct drm_gem_object *obj;     /* The GEM object this refers to */
@@ -65,5 +66,15 @@ struct drm_glamo_gem_object {
 };
 
 
+struct glamo_crtc {
+       struct drm_crtc base;
+};
+
+
+#define to_glamo_crtc(x) container_of(x, struct glamo_crtc, base)
+#define to_glamo_output(x) container_of(x, struct glamo_output, base)
+#define enc_to_glamo_output(x) container_of(x, struct glamo_output, enc)
+#define to_glamo_framebuffer(x) container_of(x, struct glamo_framebuffer, base)
+
 
 #endif /* __GLAMO_DRMPRIV_H */