aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/meson/meson_crtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/meson/meson_crtc.c')
-rw-r--r--drivers/gpu/drm/meson/meson_crtc.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/gpu/drm/meson/meson_crtc.c b/drivers/gpu/drm/meson/meson_crtc.c
index 05520202c967..191b314f9e9e 100644
--- a/drivers/gpu/drm/meson/meson_crtc.c
+++ b/drivers/gpu/drm/meson/meson_crtc.c
@@ -45,6 +45,7 @@ struct meson_crtc {
45 struct drm_crtc base; 45 struct drm_crtc base;
46 struct drm_pending_vblank_event *event; 46 struct drm_pending_vblank_event *event;
47 struct meson_drm *priv; 47 struct meson_drm *priv;
48 bool enabled;
48}; 49};
49#define to_meson_crtc(x) container_of(x, struct meson_crtc, base) 50#define to_meson_crtc(x) container_of(x, struct meson_crtc, base)
50 51
@@ -80,8 +81,7 @@ static const struct drm_crtc_funcs meson_crtc_funcs = {
80 81
81}; 82};
82 83
83static void meson_crtc_atomic_enable(struct drm_crtc *crtc, 84static void meson_crtc_enable(struct drm_crtc *crtc)
84 struct drm_crtc_state *old_state)
85{ 85{
86 struct meson_crtc *meson_crtc = to_meson_crtc(crtc); 86 struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
87 struct drm_crtc_state *crtc_state = crtc->state; 87 struct drm_crtc_state *crtc_state = crtc->state;
@@ -101,6 +101,22 @@ static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
101 writel_bits_relaxed(VPP_POSTBLEND_ENABLE, VPP_POSTBLEND_ENABLE, 101 writel_bits_relaxed(VPP_POSTBLEND_ENABLE, VPP_POSTBLEND_ENABLE,
102 priv->io_base + _REG(VPP_MISC)); 102 priv->io_base + _REG(VPP_MISC));
103 103
104 drm_crtc_vblank_on(crtc);
105
106 meson_crtc->enabled = true;
107}
108
109static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
110 struct drm_crtc_state *old_state)
111{
112 struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
113 struct meson_drm *priv = meson_crtc->priv;
114
115 DRM_DEBUG_DRIVER("\n");
116
117 if (!meson_crtc->enabled)
118 meson_crtc_enable(crtc);
119
104 priv->viu.osd1_enabled = true; 120 priv->viu.osd1_enabled = true;
105} 121}
106 122
@@ -110,6 +126,8 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
110 struct meson_crtc *meson_crtc = to_meson_crtc(crtc); 126 struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
111 struct meson_drm *priv = meson_crtc->priv; 127 struct meson_drm *priv = meson_crtc->priv;
112 128
129 drm_crtc_vblank_off(crtc);
130
113 priv->viu.osd1_enabled = false; 131 priv->viu.osd1_enabled = false;
114 priv->viu.osd1_commit = false; 132 priv->viu.osd1_commit = false;
115 133
@@ -124,6 +142,8 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
124 142
125 crtc->state->event = NULL; 143 crtc->state->event = NULL;
126 } 144 }
145
146 meson_crtc->enabled = false;
127} 147}
128 148
129static void meson_crtc_atomic_begin(struct drm_crtc *crtc, 149static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
@@ -132,6 +152,9 @@ static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
132 struct meson_crtc *meson_crtc = to_meson_crtc(crtc); 152 struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
133 unsigned long flags; 153 unsigned long flags;
134 154
155 if (crtc->state->enable && !meson_crtc->enabled)
156 meson_crtc_enable(crtc);
157
135 if (crtc->state->event) { 158 if (crtc->state->event) {
136 WARN_ON(drm_crtc_vblank_get(crtc) != 0); 159 WARN_ON(drm_crtc_vblank_get(crtc) != 0);
137 160