diff options
author | Dave Airlie <airlied@redhat.com> | 2013-07-05 01:35:38 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-07-05 01:35:38 -0400 |
commit | 63eef6002bd2c719bf10dc436fc0dd8c6baef69a (patch) | |
tree | 843518b246f1c9b39c60111f2a84dc056a274281 | |
parent | 59e32642d2e8fb170a1e777906dcb13359ea230f (diff) | |
parent | 4bb615c5fbb4f3ea0f197dfe4fb07a9e4ec2a755 (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.txt | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_buf.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_g2d.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_vidi.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 2 |
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 | ||
18 | Example: | 16 | Example: |
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 | 109 | err_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) | |||
155 | static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | 155 | static 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 | ||
168 | static void exynos_drm_preclose(struct drm_device *dev, | 175 | static 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 | ||
399 | static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev, | 396 | static 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 | ||
544 | err_free_sgt: | 541 | err_free_sgt: |
545 | kfree(sgt); | 542 | kfree(sgt); |
546 | sgt = NULL; | ||
547 | 543 | ||
548 | err_free_userptr: | 544 | err_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 | ||
556 | err_free_pages: | 552 | err_free_pages: |
557 | kfree(pages); | 553 | drm_free_large(pages); |
554 | |||
555 | err_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 | ||
254 | err_gem_fini: | ||
255 | drm_gem_object_release(&exynos_gem_obj->base); | ||
256 | kfree(exynos_gem_obj); | ||
256 | err_fini_buf: | 257 | err_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; |