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

Merge branch 'mediatek-drm-fixes-5.2' of https://github.com/ckhu-mediatek/linux.git-tags into drm-fixes

CK writes:

This include unbind error fix, clock control flow refinement, and PRIME
mmap with page offset.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: CK Hu <ck.hu@mediatek.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1560325868.3259.6.camel@mtksdaap41

+26 -31
+6 -24
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
··· 90 90 static void mtk_drm_crtc_destroy(struct drm_crtc *crtc) 91 91 { 92 92 struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); 93 - int i; 94 - 95 - for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) 96 - clk_unprepare(mtk_crtc->ddp_comp[i]->clk); 97 93 98 94 mtk_disp_mutex_put(mtk_crtc->mutex); 99 95 ··· 182 186 183 187 DRM_DEBUG_DRIVER("%s\n", __func__); 184 188 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { 185 - ret = clk_enable(mtk_crtc->ddp_comp[i]->clk); 189 + ret = clk_prepare_enable(mtk_crtc->ddp_comp[i]->clk); 186 190 if (ret) { 187 191 DRM_ERROR("Failed to enable clock %d: %d\n", i, ret); 188 192 goto err; ··· 192 196 return 0; 193 197 err: 194 198 while (--i >= 0) 195 - clk_disable(mtk_crtc->ddp_comp[i]->clk); 199 + clk_disable_unprepare(mtk_crtc->ddp_comp[i]->clk); 196 200 return ret; 197 201 } 198 202 ··· 202 206 203 207 DRM_DEBUG_DRIVER("%s\n", __func__); 204 208 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) 205 - clk_disable(mtk_crtc->ddp_comp[i]->clk); 209 + clk_disable_unprepare(mtk_crtc->ddp_comp[i]->clk); 206 210 } 207 211 208 212 static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) ··· 573 577 if (!comp) { 574 578 dev_err(dev, "Component %pOF not initialized\n", node); 575 579 ret = -ENODEV; 576 - goto unprepare; 577 - } 578 - 579 - ret = clk_prepare(comp->clk); 580 - if (ret) { 581 - dev_err(dev, 582 - "Failed to prepare clock for component %pOF: %d\n", 583 - node, ret); 584 - goto unprepare; 580 + return ret; 585 581 } 586 582 587 583 mtk_crtc->ddp_comp[i] = comp; ··· 591 603 ret = mtk_plane_init(drm_dev, &mtk_crtc->planes[zpos], 592 604 BIT(pipe), type); 593 605 if (ret) 594 - goto unprepare; 606 + return ret; 595 607 } 596 608 597 609 ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0], 598 610 mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] : 599 611 NULL, pipe); 600 612 if (ret < 0) 601 - goto unprepare; 613 + return ret; 602 614 drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE); 603 615 drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, false, MTK_LUT_SIZE); 604 616 priv->num_pipes++; 605 617 606 618 return 0; 607 - 608 - unprepare: 609 - while (--i >= 0) 610 - clk_unprepare(mtk_crtc->ddp_comp[i]->clk); 611 - 612 - return ret; 613 619 }
+3 -5
drivers/gpu/drm/mediatek/mtk_drm_drv.c
··· 303 303 static void mtk_drm_kms_deinit(struct drm_device *drm) 304 304 { 305 305 drm_kms_helper_poll_fini(drm); 306 + drm_atomic_helper_shutdown(drm); 306 307 307 308 component_unbind_all(drm->dev, drm); 308 309 drm_mode_config_cleanup(drm); ··· 390 389 struct mtk_drm_private *private = dev_get_drvdata(dev); 391 390 392 391 drm_dev_unregister(private->drm); 392 + mtk_drm_kms_deinit(private->drm); 393 393 drm_dev_put(private->drm); 394 + private->num_pipes = 0; 394 395 private->drm = NULL; 395 396 } 396 397 ··· 563 560 static int mtk_drm_remove(struct platform_device *pdev) 564 561 { 565 562 struct mtk_drm_private *private = platform_get_drvdata(pdev); 566 - struct drm_device *drm = private->drm; 567 563 int i; 568 - 569 - drm_dev_unregister(drm); 570 - mtk_drm_kms_deinit(drm); 571 - drm_dev_put(drm); 572 564 573 565 component_master_del(&pdev->dev, &mtk_drm_ops); 574 566 pm_runtime_disable(&pdev->dev);
+6 -1
drivers/gpu/drm/mediatek/mtk_drm_gem.c
··· 136 136 * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). 137 137 */ 138 138 vma->vm_flags &= ~VM_PFNMAP; 139 - vma->vm_pgoff = 0; 140 139 141 140 ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie, 142 141 mtk_gem->dma_addr, obj->size, mtk_gem->dma_attrs); ··· 166 167 return ret; 167 168 168 169 obj = vma->vm_private_data; 170 + 171 + /* 172 + * Set vm_pgoff (used as a fake buffer offset by DRM) to 0 and map the 173 + * whole buffer from the start. 174 + */ 175 + vma->vm_pgoff = 0; 169 176 170 177 return mtk_drm_gem_object_mmap(obj, vma); 171 178 }
+11 -1
drivers/gpu/drm/mediatek/mtk_dsi.c
··· 622 622 if (--dsi->refcount != 0) 623 623 return; 624 624 625 + /* 626 + * mtk_dsi_stop() and mtk_dsi_start() is asymmetric, since 627 + * mtk_dsi_stop() should be called after mtk_drm_crtc_atomic_disable(), 628 + * which needs irq for vblank, and mtk_dsi_stop() will disable irq. 629 + * mtk_dsi_start() needs to be called in mtk_output_dsi_enable(), 630 + * after dsi is fully set. 631 + */ 632 + mtk_dsi_stop(dsi); 633 + 625 634 if (!mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500)) { 626 635 if (dsi->panel) { 627 636 if (drm_panel_unprepare(dsi->panel)) { ··· 697 688 } 698 689 } 699 690 700 - mtk_dsi_stop(dsi); 701 691 mtk_dsi_poweroff(dsi); 702 692 703 693 dsi->enabled = false; ··· 844 836 /* Skip connector cleanup if creation was delegated to the bridge */ 845 837 if (dsi->conn.dev) 846 838 drm_connector_cleanup(&dsi->conn); 839 + if (dsi->panel) 840 + drm_panel_detach(dsi->panel); 847 841 } 848 842 849 843 static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp)