summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRob Herring <r.herring@freescale.com>2009-11-13 14:04:25 -0600
committerJustin Waters <justin.waters@timesys.com>2010-12-17 12:10:45 -0500
commite74d9c1e9a50989ae3afb9b8dcd7a47f8933454d (patch)
tree9c669271175a2c44ab0d5d05648093f157a94669 /arch
parentf3b067cd7e738f555093a0391ba1470741bcefc3 (diff)
ENGR00124986 mx5: add gpu refcounting and increase command buffer
Add reference counting of driver opens for multi-context support. Increase command buffer to 64KB. Signed-off-by: Rob Herring <r.herring@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-mx5/devices.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c
index 300f7a153315..9daec1540add 100644
--- a/arch/arm/mach-mx5/devices.c
+++ b/arch/arm/mach-mx5/devices.c
@@ -1130,23 +1130,31 @@ static struct resource mxc_gpu2d_resources[] = {
#if defined(CONFIG_UIO_PDRV_GENIRQ) || defined(CONFIG_UIO_PDRV_GENIRQ_MODULE)
static struct clk *gpu_clk;
+static atomic_t *gpu_use_count;
int gpu2d_open(struct uio_info *info, struct inode *inode)
{
- gpu_clk = clk_get(NULL, "gpu2d_clk");
- if (IS_ERR(gpu_clk))
- return PTR_ERR(gpu_clk);
+ int err = 0;
- return clk_enable(gpu_clk);
+ if (atomic_inc_return(gpu_use_count) == 1) {
+ gpu_clk = clk_get(NULL, "gpu2d_clk");
+ if (IS_ERR(gpu_clk))
+ err = PTR_ERR(gpu_clk);
+
+ err = clk_enable(gpu_clk);
+ }
+ return err;
}
int gpu2d_release(struct uio_info *info, struct inode *inode)
{
- if (IS_ERR(gpu_clk))
- return PTR_ERR(gpu_clk);
+ if (atomic_dec_and_test(gpu_use_count)) {
+ if (IS_ERR(gpu_clk))
+ return PTR_ERR(gpu_clk);
- clk_disable(gpu_clk);
- clk_put(gpu_clk);
+ clk_disable(gpu_clk);
+ clk_put(gpu_clk);
+ }
return 0;
}
@@ -1187,8 +1195,11 @@ static struct platform_device mxc_gpu2d_device = {
static inline void mxc_init_gpu2d(void)
{
- dma_alloc_coherent(&mxc_gpu2d_device.dev, SZ_8K, &mxc_gpu2d_resources[1].start, GFP_DMA);
- mxc_gpu2d_resources[1].end = mxc_gpu2d_resources[1].start + SZ_8K - 1;
+ void *gpu_mem;
+ gpu_mem = dma_alloc_coherent(&mxc_gpu2d_device.dev, SZ_64K, &mxc_gpu2d_resources[1].start, GFP_DMA);
+ mxc_gpu2d_resources[1].end = mxc_gpu2d_resources[1].start + SZ_64K - 1;
+ memset(gpu_mem, 0, SZ_64K);
+ gpu_use_count = gpu_mem + SZ_64K - 4;
dma_alloc_coherent(&mxc_gpu2d_device.dev, 88 * SZ_1K, &mxc_gpu2d_resources[2].start, GFP_DMA);
mxc_gpu2d_resources[2].end = mxc_gpu2d_resources[2].start + (88 * SZ_1K) - 1;