aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2019-06-12 12:22:28 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2019-06-12 12:22:28 -0400
commit76509d6b103b8cbbbb4021be3a024efa23e01cf2 (patch)
tree7141a114498ebeddbb726c4a957064e372dafd3e
parentd1fdb6d8f6a4109a4263176c84b899076a5f8008 (diff)
parent2458d9d6d94be982b917e93c61a89b4426f32e31 (diff)
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
-rw-r--r--drivers/gpu/drm/mediatek/mtk_drm_crtc.c30
-rw-r--r--drivers/gpu/drm/mediatek/mtk_drm_drv.c8
-rw-r--r--drivers/gpu/drm/mediatek/mtk_drm_gem.c7
-rw-r--r--drivers/gpu/drm/mediatek/mtk_dsi.c12
4 files changed, 26 insertions, 31 deletions
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
index f426dfdfb418..a9007210dda1 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
@@ -90,10 +90,6 @@ static void mtk_drm_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
90static void mtk_drm_crtc_destroy(struct drm_crtc *crtc) 90static void mtk_drm_crtc_destroy(struct drm_crtc *crtc)
91{ 91{
92 struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); 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 mtk_disp_mutex_put(mtk_crtc->mutex); 94 mtk_disp_mutex_put(mtk_crtc->mutex);
99 95
@@ -186,7 +182,7 @@ static int mtk_crtc_ddp_clk_enable(struct mtk_drm_crtc *mtk_crtc)
186 182
187 DRM_DEBUG_DRIVER("%s\n", __func__); 183 DRM_DEBUG_DRIVER("%s\n", __func__);
188 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { 184 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
189 ret = clk_enable(mtk_crtc->ddp_comp[i]->clk); 185 ret = clk_prepare_enable(mtk_crtc->ddp_comp[i]->clk);
190 if (ret) { 186 if (ret) {
191 DRM_ERROR("Failed to enable clock %d: %d\n", i, ret); 187 DRM_ERROR("Failed to enable clock %d: %d\n", i, ret);
192 goto err; 188 goto err;
@@ -196,7 +192,7 @@ static int mtk_crtc_ddp_clk_enable(struct mtk_drm_crtc *mtk_crtc)
196 return 0; 192 return 0;
197err: 193err:
198 while (--i >= 0) 194 while (--i >= 0)
199 clk_disable(mtk_crtc->ddp_comp[i]->clk); 195 clk_disable_unprepare(mtk_crtc->ddp_comp[i]->clk);
200 return ret; 196 return ret;
201} 197}
202 198
@@ -206,7 +202,7 @@ static void mtk_crtc_ddp_clk_disable(struct mtk_drm_crtc *mtk_crtc)
206 202
207 DRM_DEBUG_DRIVER("%s\n", __func__); 203 DRM_DEBUG_DRIVER("%s\n", __func__);
208 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) 204 for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
209 clk_disable(mtk_crtc->ddp_comp[i]->clk); 205 clk_disable_unprepare(mtk_crtc->ddp_comp[i]->clk);
210} 206}
211 207
212static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) 208static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
@@ -577,15 +573,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
577 if (!comp) { 573 if (!comp) {
578 dev_err(dev, "Component %pOF not initialized\n", node); 574 dev_err(dev, "Component %pOF not initialized\n", node);
579 ret = -ENODEV; 575 ret = -ENODEV;
580 goto unprepare; 576 return ret;
581 }
582
583 ret = clk_prepare(comp->clk);
584 if (ret) {
585 dev_err(dev,
586 "Failed to prepare clock for component %pOF: %d\n",
587 node, ret);
588 goto unprepare;
589 } 577 }
590 578
591 mtk_crtc->ddp_comp[i] = comp; 579 mtk_crtc->ddp_comp[i] = comp;
@@ -603,23 +591,17 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
603 ret = mtk_plane_init(drm_dev, &mtk_crtc->planes[zpos], 591 ret = mtk_plane_init(drm_dev, &mtk_crtc->planes[zpos],
604 BIT(pipe), type); 592 BIT(pipe), type);
605 if (ret) 593 if (ret)
606 goto unprepare; 594 return ret;
607 } 595 }
608 596
609 ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0], 597 ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0],
610 mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] : 598 mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] :
611 NULL, pipe); 599 NULL, pipe);
612 if (ret < 0) 600 if (ret < 0)
613 goto unprepare; 601 return ret;
614 drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE); 602 drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE);
615 drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, false, MTK_LUT_SIZE); 603 drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, false, MTK_LUT_SIZE);
616 priv->num_pipes++; 604 priv->num_pipes++;
617 605
618 return 0; 606 return 0;
619
620unprepare:
621 while (--i >= 0)
622 clk_unprepare(mtk_crtc->ddp_comp[i]->clk);
623
624 return ret;
625} 607}
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 7fcb7407096f..95fdbd0fbcac 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -303,6 +303,7 @@ err_config_cleanup:
303static void mtk_drm_kms_deinit(struct drm_device *drm) 303static void mtk_drm_kms_deinit(struct drm_device *drm)
304{ 304{
305 drm_kms_helper_poll_fini(drm); 305 drm_kms_helper_poll_fini(drm);
306 drm_atomic_helper_shutdown(drm);
306 307
307 component_unbind_all(drm->dev, drm); 308 component_unbind_all(drm->dev, drm);
308 drm_mode_config_cleanup(drm); 309 drm_mode_config_cleanup(drm);
@@ -389,7 +390,9 @@ static void mtk_drm_unbind(struct device *dev)
389 struct mtk_drm_private *private = dev_get_drvdata(dev); 390 struct mtk_drm_private *private = dev_get_drvdata(dev);
390 391
391 drm_dev_unregister(private->drm); 392 drm_dev_unregister(private->drm);
393 mtk_drm_kms_deinit(private->drm);
392 drm_dev_put(private->drm); 394 drm_dev_put(private->drm);
395 private->num_pipes = 0;
393 private->drm = NULL; 396 private->drm = NULL;
394} 397}
395 398
@@ -560,13 +563,8 @@ err_node:
560static int mtk_drm_remove(struct platform_device *pdev) 563static int mtk_drm_remove(struct platform_device *pdev)
561{ 564{
562 struct mtk_drm_private *private = platform_get_drvdata(pdev); 565 struct mtk_drm_private *private = platform_get_drvdata(pdev);
563 struct drm_device *drm = private->drm;
564 int i; 566 int i;
565 567
566 drm_dev_unregister(drm);
567 mtk_drm_kms_deinit(drm);
568 drm_dev_put(drm);
569
570 component_master_del(&pdev->dev, &mtk_drm_ops); 568 component_master_del(&pdev->dev, &mtk_drm_ops);
571 pm_runtime_disable(&pdev->dev); 569 pm_runtime_disable(&pdev->dev);
572 of_node_put(private->mutex_node); 570 of_node_put(private->mutex_node);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.c b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
index 3eefb22206c7..0d69698f8173 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_gem.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
@@ -136,7 +136,6 @@ static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj,
136 * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). 136 * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap().
137 */ 137 */
138 vma->vm_flags &= ~VM_PFNMAP; 138 vma->vm_flags &= ~VM_PFNMAP;
139 vma->vm_pgoff = 0;
140 139
141 ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie, 140 ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie,
142 mtk_gem->dma_addr, obj->size, mtk_gem->dma_attrs); 141 mtk_gem->dma_addr, obj->size, mtk_gem->dma_attrs);
@@ -168,6 +167,12 @@ int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
168 167
169 obj = vma->vm_private_data; 168 obj = vma->vm_private_data;
170 169
170 /*
171 * Set vm_pgoff (used as a fake buffer offset by DRM) to 0 and map the
172 * whole buffer from the start.
173 */
174 vma->vm_pgoff = 0;
175
171 return mtk_drm_gem_object_mmap(obj, vma); 176 return mtk_drm_gem_object_mmap(obj, vma);
172} 177}
173 178
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index 4a0b9150a7bb..b91c4616644a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -622,6 +622,15 @@ static void mtk_dsi_poweroff(struct mtk_dsi *dsi)
622 if (--dsi->refcount != 0) 622 if (--dsi->refcount != 0)
623 return; 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 if (!mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500)) { 634 if (!mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500)) {
626 if (dsi->panel) { 635 if (dsi->panel) {
627 if (drm_panel_unprepare(dsi->panel)) { 636 if (drm_panel_unprepare(dsi->panel)) {
@@ -688,7 +697,6 @@ static void mtk_output_dsi_disable(struct mtk_dsi *dsi)
688 } 697 }
689 } 698 }
690 699
691 mtk_dsi_stop(dsi);
692 mtk_dsi_poweroff(dsi); 700 mtk_dsi_poweroff(dsi);
693 701
694 dsi->enabled = false; 702 dsi->enabled = false;
@@ -836,6 +844,8 @@ static void mtk_dsi_destroy_conn_enc(struct mtk_dsi *dsi)
836 /* Skip connector cleanup if creation was delegated to the bridge */ 844 /* Skip connector cleanup if creation was delegated to the bridge */
837 if (dsi->conn.dev) 845 if (dsi->conn.dev)
838 drm_connector_cleanup(&dsi->conn); 846 drm_connector_cleanup(&dsi->conn);
847 if (dsi->panel)
848 drm_panel_detach(dsi->panel);
839} 849}
840 850
841static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp) 851static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp)