diff options
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 43 |
2 files changed, 19 insertions, 25 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 8caea0a33dd8..d908321b94ce 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c | |||
| @@ -67,6 +67,7 @@ static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, | |||
| 67 | * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). | 67 | * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). |
| 68 | */ | 68 | */ |
| 69 | vma->vm_flags &= ~VM_PFNMAP; | 69 | vma->vm_flags &= ~VM_PFNMAP; |
| 70 | vma->vm_pgoff = 0; | ||
| 70 | 71 | ||
| 71 | ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, | 72 | ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, |
| 72 | obj->size, &rk_obj->dma_attrs); | 73 | obj->size, &rk_obj->dma_attrs); |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 5d8ae5e49c44..03c47eeadc81 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | |||
| @@ -374,6 +374,7 @@ static const struct of_device_id vop_driver_dt_match[] = { | |||
| 374 | .data = &rk3288_vop }, | 374 | .data = &rk3288_vop }, |
| 375 | {}, | 375 | {}, |
| 376 | }; | 376 | }; |
| 377 | MODULE_DEVICE_TABLE(of, vop_driver_dt_match); | ||
| 377 | 378 | ||
| 378 | static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v) | 379 | static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v) |
| 379 | { | 380 | { |
| @@ -959,8 +960,8 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
| 959 | val = (dest.y2 - dest.y1 - 1) << 16; | 960 | val = (dest.y2 - dest.y1 - 1) << 16; |
| 960 | val |= (dest.x2 - dest.x1 - 1) & 0xffff; | 961 | val |= (dest.x2 - dest.x1 - 1) & 0xffff; |
| 961 | VOP_WIN_SET(vop, win, dsp_info, val); | 962 | VOP_WIN_SET(vop, win, dsp_info, val); |
| 962 | val = (dsp_sty - 1) << 16; | 963 | val = dsp_sty << 16; |
| 963 | val |= (dsp_stx - 1) & 0xffff; | 964 | val |= dsp_stx & 0xffff; |
| 964 | VOP_WIN_SET(vop, win, dsp_st, val); | 965 | VOP_WIN_SET(vop, win, dsp_st, val); |
| 965 | VOP_WIN_SET(vop, win, rb_swap, rb_swap); | 966 | VOP_WIN_SET(vop, win, rb_swap, rb_swap); |
| 966 | 967 | ||
| @@ -1289,7 +1290,7 @@ static void vop_win_state_complete(struct vop_win *vop_win, | |||
| 1289 | 1290 | ||
| 1290 | if (state->event) { | 1291 | if (state->event) { |
| 1291 | spin_lock_irqsave(&drm->event_lock, flags); | 1292 | spin_lock_irqsave(&drm->event_lock, flags); |
| 1292 | drm_send_vblank_event(drm, -1, state->event); | 1293 | drm_crtc_send_vblank_event(crtc, state->event); |
| 1293 | spin_unlock_irqrestore(&drm->event_lock, flags); | 1294 | spin_unlock_irqrestore(&drm->event_lock, flags); |
| 1294 | } | 1295 | } |
| 1295 | 1296 | ||
| @@ -1575,32 +1576,25 @@ static int vop_initial(struct vop *vop) | |||
| 1575 | return PTR_ERR(vop->dclk); | 1576 | return PTR_ERR(vop->dclk); |
| 1576 | } | 1577 | } |
| 1577 | 1578 | ||
| 1578 | ret = clk_prepare(vop->hclk); | ||
| 1579 | if (ret < 0) { | ||
| 1580 | dev_err(vop->dev, "failed to prepare hclk\n"); | ||
| 1581 | return ret; | ||
| 1582 | } | ||
| 1583 | |||
| 1584 | ret = clk_prepare(vop->dclk); | 1579 | ret = clk_prepare(vop->dclk); |
| 1585 | if (ret < 0) { | 1580 | if (ret < 0) { |
| 1586 | dev_err(vop->dev, "failed to prepare dclk\n"); | 1581 | dev_err(vop->dev, "failed to prepare dclk\n"); |
| 1587 | goto err_unprepare_hclk; | 1582 | return ret; |
| 1588 | } | 1583 | } |
| 1589 | 1584 | ||
| 1590 | ret = clk_prepare(vop->aclk); | 1585 | /* Enable both the hclk and aclk to setup the vop */ |
| 1586 | ret = clk_prepare_enable(vop->hclk); | ||
| 1591 | if (ret < 0) { | 1587 | if (ret < 0) { |
| 1592 | dev_err(vop->dev, "failed to prepare aclk\n"); | 1588 | dev_err(vop->dev, "failed to prepare/enable hclk\n"); |
| 1593 | goto err_unprepare_dclk; | 1589 | goto err_unprepare_dclk; |
| 1594 | } | 1590 | } |
| 1595 | 1591 | ||
| 1596 | /* | 1592 | ret = clk_prepare_enable(vop->aclk); |
| 1597 | * enable hclk, so that we can config vop register. | ||
| 1598 | */ | ||
| 1599 | ret = clk_enable(vop->hclk); | ||
| 1600 | if (ret < 0) { | 1593 | if (ret < 0) { |
| 1601 | dev_err(vop->dev, "failed to prepare aclk\n"); | 1594 | dev_err(vop->dev, "failed to prepare/enable aclk\n"); |
| 1602 | goto err_unprepare_aclk; | 1595 | goto err_disable_hclk; |
| 1603 | } | 1596 | } |
| 1597 | |||
| 1604 | /* | 1598 | /* |
| 1605 | * do hclk_reset, reset all vop registers. | 1599 | * do hclk_reset, reset all vop registers. |
| 1606 | */ | 1600 | */ |
| @@ -1608,7 +1602,7 @@ static int vop_initial(struct vop *vop) | |||
| 1608 | if (IS_ERR(ahb_rst)) { | 1602 | if (IS_ERR(ahb_rst)) { |
| 1609 | dev_err(vop->dev, "failed to get ahb reset\n"); | 1603 | dev_err(vop->dev, "failed to get ahb reset\n"); |
| 1610 | ret = PTR_ERR(ahb_rst); | 1604 | ret = PTR_ERR(ahb_rst); |
| 1611 | goto err_disable_hclk; | 1605 | goto err_disable_aclk; |
| 1612 | } | 1606 | } |
| 1613 | reset_control_assert(ahb_rst); | 1607 | reset_control_assert(ahb_rst); |
| 1614 | usleep_range(10, 20); | 1608 | usleep_range(10, 20); |
| @@ -1634,26 +1628,25 @@ static int vop_initial(struct vop *vop) | |||
| 1634 | if (IS_ERR(vop->dclk_rst)) { | 1628 | if (IS_ERR(vop->dclk_rst)) { |
| 1635 | dev_err(vop->dev, "failed to get dclk reset\n"); | 1629 | dev_err(vop->dev, "failed to get dclk reset\n"); |
| 1636 | ret = PTR_ERR(vop->dclk_rst); | 1630 | ret = PTR_ERR(vop->dclk_rst); |
| 1637 | goto err_unprepare_aclk; | 1631 | goto err_disable_aclk; |
| 1638 | } | 1632 | } |
| 1639 | reset_control_assert(vop->dclk_rst); | 1633 | reset_control_assert(vop->dclk_rst); |
| 1640 | usleep_range(10, 20); | 1634 | usleep_range(10, 20); |
| 1641 | reset_control_deassert(vop->dclk_rst); | 1635 | reset_control_deassert(vop->dclk_rst); |
| 1642 | 1636 | ||
| 1643 | clk_disable(vop->hclk); | 1637 | clk_disable(vop->hclk); |
| 1638 | clk_disable(vop->aclk); | ||
| 1644 | 1639 | ||
| 1645 | vop->is_enabled = false; | 1640 | vop->is_enabled = false; |
| 1646 | 1641 | ||
| 1647 | return 0; | 1642 | return 0; |
| 1648 | 1643 | ||
| 1644 | err_disable_aclk: | ||
| 1645 | clk_disable_unprepare(vop->aclk); | ||
| 1649 | err_disable_hclk: | 1646 | err_disable_hclk: |
| 1650 | clk_disable(vop->hclk); | 1647 | clk_disable_unprepare(vop->hclk); |
| 1651 | err_unprepare_aclk: | ||
| 1652 | clk_unprepare(vop->aclk); | ||
| 1653 | err_unprepare_dclk: | 1648 | err_unprepare_dclk: |
| 1654 | clk_unprepare(vop->dclk); | 1649 | clk_unprepare(vop->dclk); |
| 1655 | err_unprepare_hclk: | ||
| 1656 | clk_unprepare(vop->hclk); | ||
| 1657 | return ret; | 1650 | return ret; |
| 1658 | } | 1651 | } |
| 1659 | 1652 | ||
