diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2019-06-12 12:22:28 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2019-06-12 12:22:28 -0400 |
commit | 76509d6b103b8cbbbb4021be3a024efa23e01cf2 (patch) | |
tree | 7141a114498ebeddbb726c4a957064e372dafd3e | |
parent | d1fdb6d8f6a4109a4263176c84b899076a5f8008 (diff) | |
parent | 2458d9d6d94be982b917e93c61a89b4426f32e31 (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.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/mediatek/mtk_drm_drv.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/mediatek/mtk_drm_gem.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/mediatek/mtk_dsi.c | 12 |
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) | |||
90 | static void mtk_drm_crtc_destroy(struct drm_crtc *crtc) | 90 | static 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; |
197 | err: | 193 | err: |
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 | ||
212 | static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) | 208 | static 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 | |||
620 | unprepare: | ||
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: | |||
303 | static void mtk_drm_kms_deinit(struct drm_device *drm) | 303 | static 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: | |||
560 | static int mtk_drm_remove(struct platform_device *pdev) | 563 | static 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 | ||
841 | static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp) | 851 | static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp) |