diff options
| -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) |
