diff options
author | Thomas White <taw@bitwiz.org.uk> | 2009-07-15 12:02:49 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2009-07-15 12:02:49 +0100 |
commit | 7903aad4738b38f48fb8800782b186be8dfaa024 (patch) | |
tree | a8b20157c57c9dc35f049725d38fb2ca645c816a /drivers/mfd/glamo/glamo-drm-drv.c | |
parent | d1bb1b43b8db0926715d4bb1bbd9abcb88a4c5ee (diff) | |
parent | 5b85050a8f1e7db530f803627ba6371ca9c0ba9b (diff) |
Merge branch 'drm-kms' into drm-tracking
Conflicts:
drivers/mfd/glamo/glamo-cmdq.c
drivers/mfd/glamo/glamo-cmdq.h
drivers/mfd/glamo/glamo-drm-drv.c
drivers/mfd/glamo/glamo-drm-private.h
Signed-off-by: Thomas White <taw@bitwiz.org.uk>
Diffstat (limited to 'drivers/mfd/glamo/glamo-drm-drv.c')
-rw-r--r-- | drivers/mfd/glamo/glamo-drm-drv.c | 150 |
1 files changed, 108 insertions, 42 deletions
diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c index 856622d9e76..9725968a196 100644 --- a/drivers/mfd/glamo/glamo-drm-drv.c +++ b/drivers/mfd/glamo/glamo-drm-drv.c @@ -1,4 +1,4 @@ -/* Smedia Glamo 336x/337x driver +/* Smedia Glamo 336x/337x Graphics Driver * * Copyright (C) 2009 Openmoko, Inc. Jorge Luis Zapata <turran@openmoko.com> * Copyright (C) 2008-2009 Thomas White <taw@bitwiz.org.uk> @@ -27,16 +27,19 @@ #include <linux/platform_device.h> #include <drm/drmP.h> #include <drm/glamo_drm.h> +#include <linux/glamofb.h> #include "glamo-core.h" #include "glamo-cmdq.h" #include "glamo-buffer.h" #include "glamo-drm-private.h" +#include "glamo-display.h" +#include "glamo-kms-fb.h" #define DRIVER_AUTHOR "Openmoko, Inc." #define DRIVER_NAME "glamo-drm" #define DRIVER_DESC "SMedia Glamo 3362" -#define DRIVER_DATE "20090426" +#define DRIVER_DATE "20090614" #define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1) @@ -127,13 +130,42 @@ 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, @@ -169,14 +201,17 @@ static int glamodrm_probe(struct platform_device *pdev) { int rc; struct glamodrm_handle *gdrm; + struct glamofb_platform_data *mach_info; - printk(KERN_INFO "[glamo-drm] SMedia Glamo Direct Rendering Support\n"); + printk(KERN_CRIT "[glamo-drm] SMedia Glamo Direct Rendering Support\n"); gdrm = kmalloc(sizeof(*gdrm), GFP_KERNEL); if ( !gdrm ) return -ENOMEM; platform_set_drvdata(pdev, gdrm); - gdrm->glamo_core = pdev->dev.platform_data; + mach_info = pdev->dev.platform_data; + gdrm->glamo_core = mach_info->glamo; + gdrm->dev = &pdev->dev; /* Find the command queue registers */ gdrm->reg = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -199,33 +234,8 @@ static int glamodrm_probe(struct platform_device *pdev) goto out_release_regs; } - /* Find the working VRAM */ - gdrm->vram = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if ( !gdrm->vram ) { - dev_err(&pdev->dev, "Unable to find work VRAM.\n"); - rc = -ENOENT; - goto out_unmap_regs; - } - gdrm->vram = request_mem_region(gdrm->vram->start, - RESSIZE(gdrm->vram), pdev->name); - if ( !gdrm->vram ) { - dev_err(&pdev->dev, "failed to request VRAM region\n"); - rc = -ENOENT; - goto out_unmap_regs; - } - gdrm->vram_base = ioremap(gdrm->vram->start, RESSIZE(gdrm->vram)); - if ( !gdrm->vram_base ) { - dev_err(&pdev->dev, "failed to ioremap() VRAM\n"); - rc = -ENOENT; - goto out_release_vram; - } - - gdrm->vram_size = GLAMO_WORK_SIZE; - printk(KERN_INFO "[glamo-drm] %lli bytes of Glamo RAM to work with\n", - (long long int)gdrm->vram_size); - /* Find the command queue itself */ - gdrm->cmdq = platform_get_resource(pdev, IORESOURCE_MEM, 2); + gdrm->cmdq = platform_get_resource(pdev, IORESOURCE_MEM, 1); if ( !gdrm->cmdq ) { dev_err(&pdev->dev, "Unable to find command queue.\n"); rc = -ENOENT; @@ -245,18 +255,66 @@ static int glamodrm_probe(struct platform_device *pdev) goto out_release_cmdq; } + /* Find the VRAM */ + gdrm->vram = platform_get_resource(pdev, IORESOURCE_MEM, 2); + if ( !gdrm->vram ) { + dev_err(&pdev->dev, "Unable to find VRAM.\n"); + rc = -ENOENT; + goto out_unmap_regs; + } + gdrm->vram = request_mem_region(gdrm->vram->start, + RESSIZE(gdrm->vram), pdev->name); + if ( !gdrm->vram ) { + dev_err(&pdev->dev, "failed to request VRAM region\n"); + rc = -ENOENT; + goto out_unmap_regs; + } +// gdrm->vram_base = ioremap(gdrm->vram->start, RESSIZE(gdrm->vram)); +// if ( !gdrm->vram_base ) { +// dev_err(&pdev->dev, "failed to ioremap() VRAM\n"); +// rc = -ENOENT; +// goto out_release_vram; +// } + + /* Find the LCD controller */ + gdrm->lcd_regs = platform_get_resource(pdev, IORESOURCE_MEM, 3); + if ( !gdrm->lcd_regs ) { + dev_err(&pdev->dev, "Unable to find LCD registers.\n"); + rc = -ENOENT; + goto out_unmap_cmdq; + } + gdrm->lcd_regs = request_mem_region(gdrm->lcd_regs->start, + RESSIZE(gdrm->lcd_regs), + pdev->name); + if ( !gdrm->lcd_regs ) { + dev_err(&pdev->dev, "failed to request VRAM region\n"); + rc = -ENOENT; + goto out_release_lcd; + } + gdrm->lcd_base = ioremap(gdrm->lcd_regs->start, RESSIZE(gdrm->lcd_regs)); + if ( !gdrm->lcd_base ) { + dev_err(&pdev->dev, "failed to ioremap() VRAM\n"); + rc = -ENOENT; + goto out_release_lcd; + } + + gdrm->vram_size = GLAMO_FB_SIZE; + printk(KERN_INFO "[glamo-drm] %lli bytes of VRAM\n", + (long long int)gdrm->vram_size); + /* Initialise DRM */ drm_platform_init(&glamodrm_drm_driver, pdev, (void *)gdrm); - glamo_buffer_init(gdrm); - glamo_cmdq_init(gdrm); - return 0; +out_release_lcd: + release_mem_region(gdrm->lcd_regs->start, RESSIZE(gdrm->lcd_regs)); +out_unmap_cmdq: + iounmap(gdrm->cmdq_base); out_release_cmdq: release_mem_region(gdrm->cmdq->start, RESSIZE(gdrm->cmdq)); out_unmap_vram: - iounmap(gdrm->vram_base); +// iounmap(gdrm->vram_base); out_release_vram: release_mem_region(gdrm->vram->start, RESSIZE(gdrm->vram)); out_unmap_regs: @@ -273,13 +331,10 @@ 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); glamo_cmdq_shutdown(gdrm); + drm_exit(&glamodrm_drm_driver); platform_set_drvdata(pdev, NULL); @@ -289,7 +344,7 @@ static int glamodrm_remove(struct platform_device *pdev) release_mem_region(gdrm->reg->start, RESSIZE(gdrm->reg)); /* Release VRAM */ - iounmap(gdrm->vram_base); +// iounmap(gdrm->vram_base); release_mem_region(gdrm->vram->start, RESSIZE(gdrm->vram)); /* Release command queue */ @@ -304,7 +359,14 @@ static int glamodrm_remove(struct platform_device *pdev) static int glamodrm_suspend(struct platform_device *pdev, pm_message_t state) { + struct glamodrm_handle *gdrm = platform_get_drvdata(pdev); + + glamo_kmsfb_suspend(gdrm); + glamo_display_suspend(gdrm); + glamo_cmdq_suspend(gdrm); + /* glamo_core.c will suspend the engines for us */ + return 0; } @@ -312,7 +374,11 @@ static int glamodrm_suspend(struct platform_device *pdev, pm_message_t state) static int glamodrm_resume(struct platform_device *pdev) { struct glamodrm_handle *gdrm = platform_get_drvdata(pdev); - glamo_cmdq_init(gdrm); + + glamo_cmdq_resume(gdrm); + glamo_display_resume(gdrm); + glamo_kmsfb_resume(gdrm); + return 0; } @@ -323,7 +389,7 @@ static struct platform_driver glamodrm_driver = { .suspend = glamodrm_suspend, .resume = glamodrm_resume, .driver = { - .name = "glamo-cmdq", + .name = "glamo-fb", .owner = THIS_MODULE, }, }; |