Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+29 -31
+2 -4
Documentation/devicetree/bindings/video/exynos_hdmi.txt
··· 11 11 - hpd-gpio: following information about the hotplug gpio pin. 12 12 a) phandle of the gpio controller node. 13 13 b) pin number within the gpio controller. 14 - c) pin function mode. 15 - d) optional flags and pull up/down. 16 - e) drive strength. 14 + c) optional flags and pull up/down. 17 15 18 16 Example: 19 17 ··· 19 21 compatible = "samsung,exynos4212-hdmi"; 20 22 reg = <0x14530000 0x100000>; 21 23 interrupts = <0 95 0>; 22 - hpd-gpio = <&gpx3 7 0xf 1 3>; 24 + hpd-gpio = <&gpx3 7 1>; 23 25 };
+6 -7
drivers/gpu/drm/exynos/exynos_drm_buf.c
··· 57 57 dma_addr_t start_addr; 58 58 unsigned int i = 0; 59 59 60 - buf->pages = kzalloc(sizeof(struct page) * nr_pages, 61 - GFP_KERNEL); 60 + buf->pages = drm_calloc_large(nr_pages, sizeof(struct page *)); 62 61 if (!buf->pages) { 63 62 DRM_ERROR("failed to allocate pages.\n"); 64 63 return -ENOMEM; ··· 68 69 &buf->dma_attrs); 69 70 if (!buf->kvaddr) { 70 71 DRM_ERROR("failed to allocate buffer.\n"); 71 - kfree(buf->pages); 72 - return -ENOMEM; 72 + ret = -ENOMEM; 73 + goto err_free; 73 74 } 74 75 75 76 start_addr = buf->dma_addr; ··· 106 107 dma_free_attrs(dev->dev, buf->size, buf->pages, 107 108 (dma_addr_t)buf->dma_addr, &buf->dma_attrs); 108 109 buf->dma_addr = (dma_addr_t)NULL; 109 - 110 + err_free: 110 111 if (!is_drm_iommu_supported(dev)) 111 - kfree(buf->pages); 112 + drm_free_large(buf->pages); 112 113 113 114 return ret; 114 115 } ··· 133 134 if (!is_drm_iommu_supported(dev)) { 134 135 dma_free_attrs(dev->dev, buf->size, buf->kvaddr, 135 136 (dma_addr_t)buf->dma_addr, &buf->dma_attrs); 136 - kfree(buf->pages); 137 + drm_free_large(buf->pages); 137 138 } else 138 139 dma_free_attrs(dev->dev, buf->size, buf->pages, 139 140 (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
+8 -1
drivers/gpu/drm/exynos/exynos_drm_drv.c
··· 155 155 static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) 156 156 { 157 157 struct drm_exynos_file_private *file_priv; 158 + int ret; 158 159 159 160 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL); 160 161 if (!file_priv) ··· 163 162 164 163 file->driver_priv = file_priv; 165 164 166 - return exynos_drm_subdrv_open(dev, file); 165 + ret = exynos_drm_subdrv_open(dev, file); 166 + if (ret) { 167 + kfree(file_priv); 168 + file->driver_priv = NULL; 169 + } 170 + 171 + return ret; 167 172 } 168 173 169 174 static void exynos_drm_preclose(struct drm_device *dev,
+7 -11
drivers/gpu/drm/exynos/exynos_drm_g2d.c
··· 388 388 389 389 sg_free_table(g2d_userptr->sgt); 390 390 kfree(g2d_userptr->sgt); 391 - g2d_userptr->sgt = NULL; 392 391 393 - kfree(g2d_userptr->pages); 394 - g2d_userptr->pages = NULL; 392 + drm_free_large(g2d_userptr->pages); 395 393 kfree(g2d_userptr); 396 - g2d_userptr = NULL; 397 394 } 398 395 399 396 static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev, ··· 460 463 npages = (end - start) >> PAGE_SHIFT; 461 464 g2d_userptr->npages = npages; 462 465 463 - pages = kzalloc(npages * sizeof(struct page *), GFP_KERNEL); 466 + pages = drm_calloc_large(npages, sizeof(struct page *)); 464 467 if (!pages) { 465 468 DRM_ERROR("failed to allocate pages.\n"); 466 - kfree(g2d_userptr); 467 - return ERR_PTR(-ENOMEM); 469 + ret = -ENOMEM; 470 + goto err_free; 468 471 } 469 472 470 473 vma = find_vma(current->mm, userptr); ··· 540 543 541 544 err_free_sgt: 542 545 kfree(sgt); 543 - sgt = NULL; 544 546 545 547 err_free_userptr: 546 548 exynos_gem_put_pages_to_userptr(g2d_userptr->pages, ··· 550 554 exynos_gem_put_vma(g2d_userptr->vma); 551 555 552 556 err_free_pages: 553 - kfree(pages); 557 + drm_free_large(pages); 558 + 559 + err_free: 554 560 kfree(g2d_userptr); 555 - pages = NULL; 556 - g2d_userptr = NULL; 557 561 558 562 return ERR_PTR(ret); 559 563 }
+5 -4
drivers/gpu/drm/exynos/exynos_drm_gem.c
··· 246 246 exynos_gem_obj->flags = flags; 247 247 248 248 ret = exynos_drm_alloc_buf(dev, buf, flags); 249 - if (ret < 0) { 250 - drm_gem_object_release(&exynos_gem_obj->base); 251 - goto err_fini_buf; 252 - } 249 + if (ret < 0) 250 + goto err_gem_fini; 253 251 254 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 257 err_fini_buf: 257 258 exynos_drm_fini_buf(dev, buf); 258 259 return ERR_PTR(ret);
-3
drivers/gpu/drm/exynos/exynos_drm_vidi.c
··· 413 413 struct exynos_drm_subdrv *subdrv = &ctx->subdrv; 414 414 struct device *dev = subdrv->dev; 415 415 416 - if (enable != false && enable != true) 417 - return -EINVAL; 418 - 419 416 if (enable) { 420 417 ctx->suspended = false; 421 418
+1 -1
drivers/gpu/drm/exynos/exynos_mixer.c
··· 379 379 unsigned long flags; 380 380 struct hdmi_win_data *win_data; 381 381 unsigned int x_ratio, y_ratio; 382 - unsigned int buf_num; 382 + unsigned int buf_num = 1; 383 383 dma_addr_t luma_addr[2], chroma_addr[2]; 384 384 bool tiled_mode = false; 385 385 bool crcb_mode = false;