diff options
Diffstat (limited to 'drivers/gpu/drm/meson/meson_crtc.c')
-rw-r--r-- | drivers/gpu/drm/meson/meson_crtc.c | 27 |
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 | ||
83 | static void meson_crtc_atomic_enable(struct drm_crtc *crtc, | 84 | static 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 | |||
109 | static 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 | ||
129 | static void meson_crtc_atomic_begin(struct drm_crtc *crtc, | 149 | static 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 | ||