From 740d8196e83bd7eaccf2f3575019a7bd96444c1d Mon Sep 17 00:00:00 2001 From: Thomas White Date: Wed, 27 May 2009 22:14:11 +0100 Subject: Initial KMS stuff --- drivers/mfd/glamo/Makefile | 2 +- drivers/mfd/glamo/glamo-display.c | 144 ++++++++++++++++++++++++++++++++++ drivers/mfd/glamo/glamo-display.h | 30 +++++++ drivers/mfd/glamo/glamo-drm-drv.c | 41 +++++++--- drivers/mfd/glamo/glamo-drm-private.h | 11 +++ 5 files changed, 218 insertions(+), 10 deletions(-) create mode 100644 drivers/mfd/glamo/glamo-display.c create mode 100644 drivers/mfd/glamo/glamo-display.h (limited to 'drivers/mfd') diff --git a/drivers/mfd/glamo/Makefile b/drivers/mfd/glamo/Makefile index 75476de5ad7..7d3f7d6bc69 100644 --- a/drivers/mfd/glamo/Makefile +++ b/drivers/mfd/glamo/Makefile @@ -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 index 00000000000..b129b8da455 --- /dev/null +++ b/drivers/mfd/glamo/glamo-display.c @@ -0,0 +1,144 @@ +/* + * SMedia Glamo 336x/337x display + * + * Copyright (C) 2008-2009 Thomas White + * + * 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 +#include +#include +#include + +#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 index 00000000000..6d8d43cbcfb --- /dev/null +++ b/drivers/mfd/glamo/glamo-display.h @@ -0,0 +1,30 @@ +/* Smedia Glamo 336x/337x display + * + * Copyright (c) 2008-2009 Thomas White + * + * 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 + +extern int glamo_display_init(struct drm_device *dev); + +#endif /* __GLAMO_DISPLAY_H */ diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c index 2208a8ef5f7..5136263375b 100644 --- a/drivers/mfd/glamo/glamo-drm-drv.c +++ b/drivers/mfd/glamo/glamo-drm-drv.c @@ -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); diff --git a/drivers/mfd/glamo/glamo-drm-private.h b/drivers/mfd/glamo/glamo-drm-private.h index 59fbc2488c5..d1c76c23115 100644 --- a/drivers/mfd/glamo/glamo-drm-private.h +++ b/drivers/mfd/glamo/glamo-drm-private.h @@ -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 */ -- cgit v1.2.3