aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-07-05 01:35:38 -0400
committerDave Airlie <airlied@redhat.com>2013-07-05 01:35:38 -0400
commit63eef6002bd2c719bf10dc436fc0dd8c6baef69a (patch)
tree843518b246f1c9b39c60111f2a84dc056a274281
parent59e32642d2e8fb170a1e777906dcb13359ea230f (diff)
parent4bb615c5fbb4f3ea0f197dfe4fb07a9e4ec2a755 (diff)
Merge branch 'exynos-drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next
This is final pull request for 3.11. This resolves some memory leak issues, and includes some code and dt document file cleanups; just removed unnecessary descriptions. And the patch work for enhancing hdmiphy driver isn't in progress so this patch may go to 3.12. * 'exynos-drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos: drm/exynos: remove duplicated error routine and unnecessary assign drm/exynos: fix pages allocation size in lowlevel_buffer_allocate drm/exynos: use drm_calloc_large when allocates pointer array drm/exynos: add error check routine in exynos_drm_open drm/exynos: initialize the buf_num in vp_video_buffer drm/exynos: remove dead code in vidi_power_on drm/exynos: fix not to remain exynos_gem_obj as a leak of/documentation: Update hpd gpio property for exynos_hdmi
-rw-r--r--Documentation/devicetree/bindings/video/exynos_hdmi.txt6
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_buf.c13
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.c9
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_g2d.c18
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.c9
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_vidi.c3
-rw-r--r--drivers/gpu/drm/exynos/exynos_mixer.c2
7 files changed, 29 insertions, 31 deletions
diff --git a/Documentation/devicetree/bindings/video/exynos_hdmi.txt b/Documentation/devicetree/bindings/video/exynos_hdmi.txt
index c71d0f0b750a..323983be3c30 100644
--- a/Documentation/devicetree/bindings/video/exynos_hdmi.txt
+++ b/Documentation/devicetree/bindings/video/exynos_hdmi.txt
@@ -11,9 +11,7 @@ Required properties:
11- hpd-gpio: following information about the hotplug gpio pin. 11- hpd-gpio: following information about the hotplug gpio pin.
12 a) phandle of the gpio controller node. 12 a) phandle of the gpio controller node.
13 b) pin number within the gpio controller. 13 b) pin number within the gpio controller.
14 c) pin function mode. 14 c) optional flags and pull up/down.
15 d) optional flags and pull up/down.
16 e) drive strength.
17 15
18Example: 16Example:
19 17
@@ -21,5 +19,5 @@ Example:
21 compatible = "samsung,exynos4212-hdmi"; 19 compatible = "samsung,exynos4212-hdmi";
22 reg = <0x14530000 0x100000>; 20 reg = <0x14530000 0x100000>;
23 interrupts = <0 95 0>; 21 interrupts = <0 95 0>;
24 hpd-gpio = <&gpx3 7 0xf 1 3>; 22 hpd-gpio = <&gpx3 7 1>;
25 }; 23 };
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c
index 22865baa03b1..b8ac06d92fbf 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_buf.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c
@@ -57,8 +57,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
57 dma_addr_t start_addr; 57 dma_addr_t start_addr;
58 unsigned int i = 0; 58 unsigned int i = 0;
59 59
60 buf->pages = kzalloc(sizeof(struct page) * nr_pages, 60 buf->pages = drm_calloc_large(nr_pages, sizeof(struct page *));
61 GFP_KERNEL);
62 if (!buf->pages) { 61 if (!buf->pages) {
63 DRM_ERROR("failed to allocate pages.\n"); 62 DRM_ERROR("failed to allocate pages.\n");
64 return -ENOMEM; 63 return -ENOMEM;
@@ -69,8 +68,8 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
69 &buf->dma_attrs); 68 &buf->dma_attrs);
70 if (!buf->kvaddr) { 69 if (!buf->kvaddr) {
71 DRM_ERROR("failed to allocate buffer.\n"); 70 DRM_ERROR("failed to allocate buffer.\n");
72 kfree(buf->pages); 71 ret = -ENOMEM;
73 return -ENOMEM; 72 goto err_free;
74 } 73 }
75 74
76 start_addr = buf->dma_addr; 75 start_addr = buf->dma_addr;
@@ -107,9 +106,9 @@ err_free_attrs:
107 dma_free_attrs(dev->dev, buf->size, buf->pages, 106 dma_free_attrs(dev->dev, buf->size, buf->pages,
108 (dma_addr_t)buf->dma_addr, &buf->dma_attrs); 107 (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
109 buf->dma_addr = (dma_addr_t)NULL; 108 buf->dma_addr = (dma_addr_t)NULL;
110 109err_free:
111 if (!is_drm_iommu_supported(dev)) 110 if (!is_drm_iommu_supported(dev))
112 kfree(buf->pages); 111 drm_free_large(buf->pages);
113 112
114 return ret; 113 return ret;
115} 114}
@@ -134,7 +133,7 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev,
134 if (!is_drm_iommu_supported(dev)) { 133 if (!is_drm_iommu_supported(dev)) {
135 dma_free_attrs(dev->dev, buf->size, buf->kvaddr, 134 dma_free_attrs(dev->dev, buf->size, buf->kvaddr,
136 (dma_addr_t)buf->dma_addr, &buf->dma_attrs); 135 (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
137 kfree(buf->pages); 136 drm_free_large(buf->pages);
138 } else 137 } else
139 dma_free_attrs(dev->dev, buf->size, buf->pages, 138 dma_free_attrs(dev->dev, buf->size, buf->pages,
140 (dma_addr_t)buf->dma_addr, &buf->dma_attrs); 139 (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 276237348d1e..ca2729a85129 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -155,6 +155,7 @@ static int exynos_drm_unload(struct drm_device *dev)
155static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) 155static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
156{ 156{
157 struct drm_exynos_file_private *file_priv; 157 struct drm_exynos_file_private *file_priv;
158 int ret;
158 159
159 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL); 160 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
160 if (!file_priv) 161 if (!file_priv)
@@ -162,7 +163,13 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
162 163
163 file->driver_priv = file_priv; 164 file->driver_priv = file_priv;
164 165
165 return exynos_drm_subdrv_open(dev, file); 166 ret = exynos_drm_subdrv_open(dev, file);
167 if (ret) {
168 kfree(file_priv);
169 file->driver_priv = NULL;
170 }
171
172 return ret;
166} 173}
167 174
168static void exynos_drm_preclose(struct drm_device *dev, 175static void exynos_drm_preclose(struct drm_device *dev,
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
index af75434ee4d7..42a5a5466075 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
@@ -388,12 +388,9 @@ out:
388 388
389 sg_free_table(g2d_userptr->sgt); 389 sg_free_table(g2d_userptr->sgt);
390 kfree(g2d_userptr->sgt); 390 kfree(g2d_userptr->sgt);
391 g2d_userptr->sgt = NULL;
392 391
393 kfree(g2d_userptr->pages); 392 drm_free_large(g2d_userptr->pages);
394 g2d_userptr->pages = NULL;
395 kfree(g2d_userptr); 393 kfree(g2d_userptr);
396 g2d_userptr = NULL;
397} 394}
398 395
399static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev, 396static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
@@ -463,11 +460,11 @@ static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
463 npages = (end - start) >> PAGE_SHIFT; 460 npages = (end - start) >> PAGE_SHIFT;
464 g2d_userptr->npages = npages; 461 g2d_userptr->npages = npages;
465 462
466 pages = kzalloc(npages * sizeof(struct page *), GFP_KERNEL); 463 pages = drm_calloc_large(npages, sizeof(struct page *));
467 if (!pages) { 464 if (!pages) {
468 DRM_ERROR("failed to allocate pages.\n"); 465 DRM_ERROR("failed to allocate pages.\n");
469 kfree(g2d_userptr); 466 ret = -ENOMEM;
470 return ERR_PTR(-ENOMEM); 467 goto err_free;
471 } 468 }
472 469
473 vma = find_vma(current->mm, userptr); 470 vma = find_vma(current->mm, userptr);
@@ -543,7 +540,6 @@ err_sg_free_table:
543 540
544err_free_sgt: 541err_free_sgt:
545 kfree(sgt); 542 kfree(sgt);
546 sgt = NULL;
547 543
548err_free_userptr: 544err_free_userptr:
549 exynos_gem_put_pages_to_userptr(g2d_userptr->pages, 545 exynos_gem_put_pages_to_userptr(g2d_userptr->pages,
@@ -554,10 +550,10 @@ err_put_vma:
554 exynos_gem_put_vma(g2d_userptr->vma); 550 exynos_gem_put_vma(g2d_userptr->vma);
555 551
556err_free_pages: 552err_free_pages:
557 kfree(pages); 553 drm_free_large(pages);
554
555err_free:
558 kfree(g2d_userptr); 556 kfree(g2d_userptr);
559 pages = NULL;
560 g2d_userptr = NULL;
561 557
562 return ERR_PTR(ret); 558 return ERR_PTR(ret);
563} 559}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index c3f15e7646d5..24c22a8c3364 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -246,13 +246,14 @@ struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
246 exynos_gem_obj->flags = flags; 246 exynos_gem_obj->flags = flags;
247 247
248 ret = exynos_drm_alloc_buf(dev, buf, flags); 248 ret = exynos_drm_alloc_buf(dev, buf, flags);
249 if (ret < 0) { 249 if (ret < 0)
250 drm_gem_object_release(&exynos_gem_obj->base); 250 goto err_gem_fini;
251 goto err_fini_buf;
252 }
253 251
254 return exynos_gem_obj; 252 return exynos_gem_obj;
255 253
254err_gem_fini:
255 drm_gem_object_release(&exynos_gem_obj->base);
256 kfree(exynos_gem_obj);
256err_fini_buf: 257err_fini_buf:
257 exynos_drm_fini_buf(dev, buf); 258 exynos_drm_fini_buf(dev, buf);
258 return ERR_PTR(ret); 259 return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index 784bbce0741a..41cc74d83e4e 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -413,9 +413,6 @@ static int vidi_power_on(struct vidi_context *ctx, bool enable)
413 struct exynos_drm_subdrv *subdrv = &ctx->subdrv; 413 struct exynos_drm_subdrv *subdrv = &ctx->subdrv;
414 struct device *dev = subdrv->dev; 414 struct device *dev = subdrv->dev;
415 415
416 if (enable != false && enable != true)
417 return -EINVAL;
418
419 if (enable) { 416 if (enable) {
420 ctx->suspended = false; 417 ctx->suspended = false;
421 418
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index b1280b43931c..42ffb71c63bc 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -379,7 +379,7 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
379 unsigned long flags; 379 unsigned long flags;
380 struct hdmi_win_data *win_data; 380 struct hdmi_win_data *win_data;
381 unsigned int x_ratio, y_ratio; 381 unsigned int x_ratio, y_ratio;
382 unsigned int buf_num; 382 unsigned int buf_num = 1;
383 dma_addr_t luma_addr[2], chroma_addr[2]; 383 dma_addr_t luma_addr[2], chroma_addr[2];
384 bool tiled_mode = false; 384 bool tiled_mode = false;
385 bool crcb_mode = false; 385 bool crcb_mode = false;