From 3b328bfd4aef3ffc9b0192ca512fbc899148e8f5 Mon Sep 17 00:00:00 2001
From: Thomas White <taw@bitwiz.org.uk>
Date: Thu, 6 May 2010 05:40:15 -0700
Subject: [PATCH 12/14] Fix dynamic command queue allocation

(Not tested...)

Signed-off-by: Thomas White <taw@bitwiz.org.uk>
---
 drivers/mfd/glamo/glamo-cmdq.c    |   10 +++++++---
 drivers/mfd/glamo/glamo-cmdq.h    |    2 +-
 drivers/mfd/glamo/glamo-drm-drv.c |   17 +++++++----------
 3 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/mfd/glamo/glamo-cmdq.c b/drivers/mfd/glamo/glamo-cmdq.c
index 442963c..28c5268 100644
--- a/drivers/mfd/glamo/glamo-cmdq.c
+++ b/drivers/mfd/glamo/glamo-cmdq.c
@@ -57,6 +57,7 @@
 #include "glamo-core.h"
 #include "glamo-drm-private.h"
 #include "glamo-regs.h"
+#include "glamo-buffer.h"
 
 
 #define GLAMO_CMDQ_SIZE (128 * 1024)    /* 128k ring buffer */
@@ -495,10 +496,11 @@ int glamo_cmdq_setup(struct glamodrm_handle *gdrm)
 }
 
 
-int glamo_cmdq_init(struct glamodrm_handle *gdrm)
+int glamo_cmdq_init(struct drm_device *dev)
 {
 	struct drm_gem_object *obj;
 	struct drm_glamo_gem_object *gobj;
+	struct glamodrm_handle *gdrm = dev->dev_private;
 	int ret = 0;
 
 	obj = glamo_gem_object_alloc(dev, GLAMO_CMDQ_SIZE, 4);
@@ -507,9 +509,10 @@ int glamo_cmdq_init(struct glamodrm_handle *gdrm)
 		ret = -ENOMEM;
 		goto out;
 	}
-	gobj = fbo->driver_private;
+	gobj = obj->driver_private;
 	gdrm->cmdq_offs = GLAMO_OFFSET_FB + gobj->block->start;
-	gdrm->cmdq_base = ioremap(gdrm->vram->start + offs, GLAMO_CMDQ_SIZE);
+	gdrm->cmdq_base = ioremap(gdrm->vram->start + gdrm->cmdq_offs,
+	                          GLAMO_CMDQ_SIZE);
 
 	/* Set up registers */
 	glamo_cmdq_setup(gdrm);
@@ -521,6 +524,7 @@ out:
 
 int glamo_cmdq_shutdown(struct glamodrm_handle *gdrm)
 {
+	iounmap(gdrm->cmdq_base);
 	return 0;
 }
 
diff --git a/drivers/mfd/glamo/glamo-cmdq.h b/drivers/mfd/glamo/glamo-cmdq.h
index 510d195..6d7f184 100644
--- a/drivers/mfd/glamo/glamo-cmdq.h
+++ b/drivers/mfd/glamo/glamo-cmdq.h
@@ -38,7 +38,7 @@ extern int glamo_ioctl_cmdburst(struct drm_device *dev, void *data,
 extern void glamo_cmdq_blank(struct glamodrm_handle *gdrm,
                              struct drm_gem_object *obj);
 
-extern int glamo_cmdq_init(struct glamodrm_handle *gdrm);
+extern int glamo_cmdq_init(struct drm_device *de);
 extern int glamo_cmdq_shutdown(struct glamodrm_handle *gdrm);
 extern void glamo_cmdq_suspend(struct glamodrm_handle *gdrm);
 extern void glamo_cmdq_resume(struct glamodrm_handle *gdrm);
diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c
index 774eaff..ee648c1 100644
--- a/drivers/mfd/glamo/glamo-drm-drv.c
+++ b/drivers/mfd/glamo/glamo-drm-drv.c
@@ -128,7 +128,7 @@ static int glamodrm_load(struct drm_device *dev, unsigned long flags)
 	gdrm = dev->dev_private;
 
 	glamo_buffer_init(gdrm);
-	glamo_cmdq_init(gdrm);
+	glamo_cmdq_init(dev);
 	glamo_fence_init(gdrm);
 	glamo_display_init(dev);
 
@@ -237,14 +237,14 @@ static int glamodrm_probe(struct platform_device *pdev)
 	if ( !gdrm->vram ) {
 		dev_err(&pdev->dev, "Unable to find VRAM.\n");
 		rc = -ENOENT;
-		goto out_unmap_cmdq;
+		goto out_unmap_regs;
 	}
 	gdrm->vram = request_mem_region(gdrm->vram->start,
 	                                resource_size(gdrm->vram), pdev->name);
 	if ( !gdrm->vram ) {
 		dev_err(&pdev->dev, "failed to request VRAM region\n");
 		rc = -ENOENT;
-		goto out_unmap_cmdq;
+		goto out_unmap_regs;
 	}
 
 	/* Find the LCD controller */
@@ -316,10 +316,6 @@ out_release_lcd:
 	                   resource_size(gdrm->lcd_regs));
 out_release_vram:
 	release_mem_region(gdrm->vram->start, resource_size(gdrm->vram));
-out_unmap_cmdq:
-	iounmap(gdrm->cmdq_base);
-out_release_cmdq:
-	release_mem_region(gdrm->cmdq->start, resource_size(gdrm->cmdq));
 out_unmap_regs:
 	iounmap(gdrm->reg_base);
 out_release_regs:
@@ -349,9 +345,10 @@ static int glamodrm_remove(struct platform_device *pdev)
 	/* Release VRAM */
 	release_mem_region(gdrm->vram->start, resource_size(gdrm->vram));
 
-	/* Release command queue */
-	iounmap(gdrm->cmdq_base);
-	release_mem_region(gdrm->cmdq->start, resource_size(gdrm->cmdq));
+	/* Release LCD registers */
+	iounmap(gdrm->lcd_base);
+	release_mem_region(gdrm->lcd_regs->start,
+	                   resource_size(gdrm->lcd_regs));
 
 	/* Release 2D engine  */
 	iounmap(gdrm->twod_base);
-- 
1.7.1