diff options
author | Fabien DESSENNE <fabien.dessenne@st.com> | 2017-01-12 11:27:36 -0500 |
---|---|---|
committer | Vincent Abriou <vincent.abriou@st.com> | 2017-02-10 03:34:39 -0500 |
commit | c62052d1469d283aff31527bfdccd9da08a46005 (patch) | |
tree | e62eaa45890cf8987264aee09f82c6517c3c62a9 | |
parent | 5e60f595d6cad3279f4653ea43843a3db91b59e5 (diff) |
drm/sti: Fix up crtc_state->event handling
Use drm-core to handle event.
This is required to be able to use the nonblocking helpers.
Signed-off-by: Fabien Dessenne <fabien.dessenne@st.com>
Acked-by: Vincent Abriou <vincent.abriou@st.com>
-rw-r--r-- | drivers/gpu/drm/sti/sti_crtc.c | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/sti/sti_mixer.h | 2 |
2 files changed, 14 insertions, 34 deletions
diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crtc.c index e992bed98dcb..d45a4335df5d 100644 --- a/drivers/gpu/drm/sti/sti_crtc.c +++ b/drivers/gpu/drm/sti/sti_crtc.c | |||
@@ -134,21 +134,6 @@ sti_crtc_mode_set_nofb(struct drm_crtc *crtc) | |||
134 | sti_crtc_mode_set(crtc, &crtc->state->adjusted_mode); | 134 | sti_crtc_mode_set(crtc, &crtc->state->adjusted_mode); |
135 | } | 135 | } |
136 | 136 | ||
137 | static void sti_crtc_atomic_begin(struct drm_crtc *crtc, | ||
138 | struct drm_crtc_state *old_crtc_state) | ||
139 | { | ||
140 | struct sti_mixer *mixer = to_sti_mixer(crtc); | ||
141 | |||
142 | if (crtc->state->event) { | ||
143 | crtc->state->event->pipe = drm_crtc_index(crtc); | ||
144 | |||
145 | WARN_ON(drm_crtc_vblank_get(crtc) != 0); | ||
146 | |||
147 | mixer->pending_event = crtc->state->event; | ||
148 | crtc->state->event = NULL; | ||
149 | } | ||
150 | } | ||
151 | |||
152 | static void sti_crtc_atomic_flush(struct drm_crtc *crtc, | 137 | static void sti_crtc_atomic_flush(struct drm_crtc *crtc, |
153 | struct drm_crtc_state *old_crtc_state) | 138 | struct drm_crtc_state *old_crtc_state) |
154 | { | 139 | { |
@@ -156,6 +141,8 @@ static void sti_crtc_atomic_flush(struct drm_crtc *crtc, | |||
156 | struct sti_mixer *mixer = to_sti_mixer(crtc); | 141 | struct sti_mixer *mixer = to_sti_mixer(crtc); |
157 | struct sti_compositor *compo = dev_get_drvdata(mixer->dev); | 142 | struct sti_compositor *compo = dev_get_drvdata(mixer->dev); |
158 | struct drm_plane *p; | 143 | struct drm_plane *p; |
144 | struct drm_pending_vblank_event *event; | ||
145 | unsigned long flags; | ||
159 | 146 | ||
160 | DRM_DEBUG_DRIVER("\n"); | 147 | DRM_DEBUG_DRIVER("\n"); |
161 | 148 | ||
@@ -220,13 +207,24 @@ static void sti_crtc_atomic_flush(struct drm_crtc *crtc, | |||
220 | break; | 207 | break; |
221 | } | 208 | } |
222 | } | 209 | } |
210 | |||
211 | event = crtc->state->event; | ||
212 | if (event) { | ||
213 | crtc->state->event = NULL; | ||
214 | |||
215 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | ||
216 | if (drm_crtc_vblank_get(crtc) == 0) | ||
217 | drm_crtc_arm_vblank_event(crtc, event); | ||
218 | else | ||
219 | drm_crtc_send_vblank_event(crtc, event); | ||
220 | spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | ||
221 | } | ||
223 | } | 222 | } |
224 | 223 | ||
225 | static const struct drm_crtc_helper_funcs sti_crtc_helper_funcs = { | 224 | static const struct drm_crtc_helper_funcs sti_crtc_helper_funcs = { |
226 | .enable = sti_crtc_enable, | 225 | .enable = sti_crtc_enable, |
227 | .disable = sti_crtc_disabling, | 226 | .disable = sti_crtc_disabling, |
228 | .mode_set_nofb = sti_crtc_mode_set_nofb, | 227 | .mode_set_nofb = sti_crtc_mode_set_nofb, |
229 | .atomic_begin = sti_crtc_atomic_begin, | ||
230 | .atomic_flush = sti_crtc_atomic_flush, | 228 | .atomic_flush = sti_crtc_atomic_flush, |
231 | }; | 229 | }; |
232 | 230 | ||
@@ -250,7 +248,6 @@ int sti_crtc_vblank_cb(struct notifier_block *nb, | |||
250 | struct sti_compositor *compo; | 248 | struct sti_compositor *compo; |
251 | struct drm_crtc *crtc = data; | 249 | struct drm_crtc *crtc = data; |
252 | struct sti_mixer *mixer; | 250 | struct sti_mixer *mixer; |
253 | unsigned long flags; | ||
254 | struct sti_private *priv; | 251 | struct sti_private *priv; |
255 | unsigned int pipe; | 252 | unsigned int pipe; |
256 | 253 | ||
@@ -267,14 +264,6 @@ int sti_crtc_vblank_cb(struct notifier_block *nb, | |||
267 | 264 | ||
268 | drm_crtc_handle_vblank(crtc); | 265 | drm_crtc_handle_vblank(crtc); |
269 | 266 | ||
270 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | ||
271 | if (mixer->pending_event) { | ||
272 | drm_crtc_send_vblank_event(crtc, mixer->pending_event); | ||
273 | drm_crtc_vblank_put(crtc); | ||
274 | mixer->pending_event = NULL; | ||
275 | } | ||
276 | spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | ||
277 | |||
278 | if (mixer->status == STI_MIXER_DISABLING) { | 267 | if (mixer->status == STI_MIXER_DISABLING) { |
279 | struct drm_plane *p; | 268 | struct drm_plane *p; |
280 | 269 | ||
@@ -317,19 +306,12 @@ void sti_crtc_disable_vblank(struct drm_device *drm_dev, unsigned int pipe) | |||
317 | struct sti_private *priv = drm_dev->dev_private; | 306 | struct sti_private *priv = drm_dev->dev_private; |
318 | struct sti_compositor *compo = priv->compo; | 307 | struct sti_compositor *compo = priv->compo; |
319 | struct notifier_block *vtg_vblank_nb = &compo->vtg_vblank_nb[pipe]; | 308 | struct notifier_block *vtg_vblank_nb = &compo->vtg_vblank_nb[pipe]; |
320 | struct drm_crtc *crtc = &compo->mixer[pipe]->drm_crtc; | ||
321 | struct sti_vtg *vtg = compo->vtg[pipe]; | 309 | struct sti_vtg *vtg = compo->vtg[pipe]; |
322 | 310 | ||
323 | DRM_DEBUG_DRIVER("\n"); | 311 | DRM_DEBUG_DRIVER("\n"); |
324 | 312 | ||
325 | if (sti_vtg_unregister_client(vtg, vtg_vblank_nb)) | 313 | if (sti_vtg_unregister_client(vtg, vtg_vblank_nb)) |
326 | DRM_DEBUG_DRIVER("Warning: cannot unregister VTG notifier\n"); | 314 | DRM_DEBUG_DRIVER("Warning: cannot unregister VTG notifier\n"); |
327 | |||
328 | /* free the resources of the pending requests */ | ||
329 | if (compo->mixer[pipe]->pending_event) { | ||
330 | drm_crtc_vblank_put(crtc); | ||
331 | compo->mixer[pipe]->pending_event = NULL; | ||
332 | } | ||
333 | } | 315 | } |
334 | 316 | ||
335 | static int sti_crtc_late_register(struct drm_crtc *crtc) | 317 | static int sti_crtc_late_register(struct drm_crtc *crtc) |
diff --git a/drivers/gpu/drm/sti/sti_mixer.h b/drivers/gpu/drm/sti/sti_mixer.h index 830a3c42d886..e64a00e61049 100644 --- a/drivers/gpu/drm/sti/sti_mixer.h +++ b/drivers/gpu/drm/sti/sti_mixer.h | |||
@@ -28,7 +28,6 @@ enum sti_mixer_status { | |||
28 | * @regs: mixer registers | 28 | * @regs: mixer registers |
29 | * @id: id of the mixer | 29 | * @id: id of the mixer |
30 | * @drm_crtc: crtc object link to the mixer | 30 | * @drm_crtc: crtc object link to the mixer |
31 | * @pending_event: set if a flip event is pending on crtc | ||
32 | * @status: to know the status of the mixer | 31 | * @status: to know the status of the mixer |
33 | */ | 32 | */ |
34 | struct sti_mixer { | 33 | struct sti_mixer { |
@@ -36,7 +35,6 @@ struct sti_mixer { | |||
36 | void __iomem *regs; | 35 | void __iomem *regs; |
37 | int id; | 36 | int id; |
38 | struct drm_crtc drm_crtc; | 37 | struct drm_crtc drm_crtc; |
39 | struct drm_pending_vblank_event *pending_event; | ||
40 | enum sti_mixer_status status; | 38 | enum sti_mixer_status status; |
41 | }; | 39 | }; |
42 | 40 | ||