Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1293577
| From | Mark Yao <mark.yao@rock-chips.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v3 4/8] drm/rockchip: Optimization vop mode set |
| Date | 2015-12-17 04:10 +0100 |
| Message-ID | <qGx74-25W-11@gated-at.bofh.it> (permalink) |
| References | <qGx73-25W-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Rk3288 vop timing registers is immediately register, when configure
timing on display active time, will cause tearing. use dclk reset is
not a good idea to avoid this tearing. we can avoid tearing by using
standby register.
Vop standby register will take effect at end of current frame, and
go back to work immediately when exit standby.
So we can use standby register to protect this context.
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
---
Changes in v3: None
Changes in v2: None
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 51 ++++++++++++++++++---------
1 file changed, 35 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 44f6154..9ace3ae 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1097,10 +1097,40 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
vop_enable(crtc);
/*
- * disable dclk to stop frame scan, so that we can safe config mode and
- * enable iommu.
+ * If dclk rate is zero, mean that scanout is stop,
+ * we don't need wait any more.
*/
- clk_disable(vop->dclk);
+ if (clk_get_rate(vop->dclk)) {
+ /*
+ * Rk3288 vop timing register is immediately, when configure
+ * display timing on display time, may cause tearing.
+ *
+ * Vop standby will take effect at end of current frame,
+ * if dsp hold valid irq happen, it means standby complete.
+ *
+ * mode set:
+ * standby and wait complete --> |----
+ * | display time
+ * |----
+ * |---> dsp hold irq
+ * configure display timing --> |
+ * standby exit |
+ * | new frame start.
+ */
+
+ reinit_completion(&vop->dsp_hold_completion);
+ vop_dsp_hold_valid_irq_enable(vop);
+
+ spin_lock(&vop->reg_lock);
+
+ VOP_CTRL_SET(vop, standby, 1);
+
+ spin_unlock(&vop->reg_lock);
+
+ wait_for_completion(&vop->dsp_hold_completion);
+
+ vop_dsp_hold_valid_irq_disable(vop);
+ }
switch (vop->connector_type) {
case DRM_MODE_CONNECTOR_LVDS:
@@ -1115,7 +1145,6 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
default:
DRM_ERROR("unsupport connector_type[%d]\n",
vop->connector_type);
- goto out;
};
VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode);
@@ -1136,19 +1165,9 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
VOP_CTRL_SET(vop, vact_st_end, val);
VOP_CTRL_SET(vop, vpost_st_end, val);
-
- /*
- * reset dclk, take all mode config affect, so the clk would run in
- * correct frame.
- */
- reset_control_assert(vop->dclk_rst);
- usleep_range(10, 20);
- reset_control_deassert(vop->dclk_rst);
-
clk_set_rate(vop->dclk, adjusted_mode->clock * 1000);
-out:
- if (clk_enable(vop->dclk) < 0)
- dev_err(vop->dev, "failed to enable dclk\n");
+
+ VOP_CTRL_SET(vop, standby, 0);
}
static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v3 0/8] drm/rockchip: covert to support atomic API Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
[PATCH 8/8] drm/rockchip: dw_hdmi: use encoder enable function Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
Re: [PATCH 8/8] drm/rockchip: dw_hdmi: use encoder enable function Mark yao <mark.yao@rock-chips.com> - 2015-12-17 04:20 +0100
[PATCH v3 2/8] drm/rockchip: vop: replace dpms with enable/disable Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
[PATCH v3 1/8] drm/rockchip: Use new vblank api drm_crtc_vblank_* Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
[PATCH v3 4/8] drm/rockchip: Optimization vop mode set Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
[PATCH v3 5/8] drm/rockchip: support atomic asynchronous commit Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
[PATCH v3 3/8] drm/rockchip: Convert to support atomic API Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:10 +0100
[PATCH v3 7/8] drm: bridge/dw_hdmi: add atomic API support Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:20 +0100
[PATCH v3 6/8] drm/rockchip: direct config connecter gate and out_mode Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:20 +0100
[PATCH v3 8/8] drm/rockchip: dw_hdmi: use encoder enable function Mark Yao <mark.yao@rock-chips.com> - 2015-12-17 04:20 +0100
Re: [PATCH v3 0/8] drm/rockchip: covert to support atomic API Heiko Stübner <heiko@sntech.de> - 2015-12-17 11:10 +0100
Re: [PATCH v3 0/8] drm/rockchip: covert to support atomic API Mark yao <mark.yao@rock-chips.com> - 2015-12-17 11:40 +0100
Re: [PATCH v3 0/8] drm/rockchip: covert to support atomic API Heiko Stübner <heiko@sntech.de> - 2015-12-17 13:10 +0100
Re: [PATCH v3 0/8] drm/rockchip: covert to support atomic API Daniel Vetter <daniel@ffwll.ch> - 2015-12-17 15:30 +0100
csiph-web