diff options
author | Liu Ying <gnuiyl@gmail.com> | 2016-07-08 05:41:01 -0400 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2016-07-12 12:24:12 -0400 |
commit | f6e396e5096dec2523fade421bc27f3fae38e31d (patch) | |
tree | 34c6a4cb3fc8d716679bd7316ff9bf63552eacad /drivers/gpu/drm/imx/imx-tve.c | |
parent | 6b7279e13e3ac15b9f4fbcc3a7c93caa94a5ea04 (diff) |
drm/imx: atomic phase 3 step 2: Legacy callback fixups
Now that we can use atomic configurations, all the legacy callbacks
of CRTCs, encoders and connectors can be switched to the atomic version.
For the imx-ldb driver, there is a clock parent setting mismatch bewteen
->enable and ->disable after the switch, so a fixup is added. For the
imx-tve driver, since the encoder's callback ->dpms is replaced by
->disable, we need to move the setting for the IPU_CLK_EN bit(in register
TVE_COM_CONF_REG) from ->enable/->disable to ->mode_set, otherwise, the
relevant CRTC cannot be disabled correctly with a warning on DC stop timeout.
Signed-off-by: Liu Ying <gnuiyl@gmail.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers/gpu/drm/imx/imx-tve.c')
-rw-r--r-- | drivers/gpu/drm/imx/imx-tve.c | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/drivers/gpu/drm/imx/imx-tve.c b/drivers/gpu/drm/imx/imx-tve.c index 82a1edd74f20..cd92aac5c3bc 100644 --- a/drivers/gpu/drm/imx/imx-tve.c +++ b/drivers/gpu/drm/imx/imx-tve.c | |||
@@ -147,8 +147,7 @@ static void tve_enable(struct imx_tve *tve) | |||
147 | tve->enabled = true; | 147 | tve->enabled = true; |
148 | clk_prepare_enable(tve->clk); | 148 | clk_prepare_enable(tve->clk); |
149 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, | 149 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, |
150 | TVE_IPU_CLK_EN | TVE_EN, | 150 | TVE_EN, TVE_EN); |
151 | TVE_IPU_CLK_EN | TVE_EN); | ||
152 | } | 151 | } |
153 | 152 | ||
154 | /* clear interrupt status register */ | 153 | /* clear interrupt status register */ |
@@ -171,7 +170,7 @@ static void tve_disable(struct imx_tve *tve) | |||
171 | if (tve->enabled) { | 170 | if (tve->enabled) { |
172 | tve->enabled = false; | 171 | tve->enabled = false; |
173 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, | 172 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, |
174 | TVE_IPU_CLK_EN | TVE_EN, 0); | 173 | TVE_EN, 0); |
175 | clk_disable_unprepare(tve->clk); | 174 | clk_disable_unprepare(tve->clk); |
176 | } | 175 | } |
177 | } | 176 | } |
@@ -274,18 +273,6 @@ static struct drm_encoder *imx_tve_connector_best_encoder( | |||
274 | return &tve->imx_encoder.encoder; | 273 | return &tve->imx_encoder.encoder; |
275 | } | 274 | } |
276 | 275 | ||
277 | static void imx_tve_encoder_dpms(struct drm_encoder *encoder, int mode) | ||
278 | { | ||
279 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); | ||
280 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); | ||
281 | int ret; | ||
282 | |||
283 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, | ||
284 | TVE_TV_OUT_MODE_MASK, TVE_TV_OUT_DISABLE); | ||
285 | if (ret < 0) | ||
286 | dev_err(tve->dev, "failed to disable TVOUT: %d\n", ret); | ||
287 | } | ||
288 | |||
289 | static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, | 276 | static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, |
290 | struct drm_display_mode *orig_mode, | 277 | struct drm_display_mode *orig_mode, |
291 | struct drm_display_mode *mode) | 278 | struct drm_display_mode *mode) |
@@ -315,6 +302,9 @@ static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, | |||
315 | ret); | 302 | ret); |
316 | } | 303 | } |
317 | 304 | ||
305 | regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, | ||
306 | TVE_IPU_CLK_EN, TVE_IPU_CLK_EN); | ||
307 | |||
318 | if (tve->mode == TVE_MODE_VGA) | 308 | if (tve->mode == TVE_MODE_VGA) |
319 | ret = tve_setup_vga(tve); | 309 | ret = tve_setup_vga(tve); |
320 | else | 310 | else |
@@ -323,7 +313,7 @@ static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, | |||
323 | dev_err(tve->dev, "failed to set configuration: %d\n", ret); | 313 | dev_err(tve->dev, "failed to set configuration: %d\n", ret); |
324 | } | 314 | } |
325 | 315 | ||
326 | static void imx_tve_encoder_commit(struct drm_encoder *encoder) | 316 | static void imx_tve_encoder_enable(struct drm_encoder *encoder) |
327 | { | 317 | { |
328 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); | 318 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
329 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); | 319 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); |
@@ -340,7 +330,7 @@ static void imx_tve_encoder_disable(struct drm_encoder *encoder) | |||
340 | } | 330 | } |
341 | 331 | ||
342 | static const struct drm_connector_funcs imx_tve_connector_funcs = { | 332 | static const struct drm_connector_funcs imx_tve_connector_funcs = { |
343 | .dpms = drm_helper_connector_dpms, | 333 | .dpms = drm_atomic_helper_connector_dpms, |
344 | .fill_modes = drm_helper_probe_single_connector_modes, | 334 | .fill_modes = drm_helper_probe_single_connector_modes, |
345 | .detect = imx_tve_connector_detect, | 335 | .detect = imx_tve_connector_detect, |
346 | .destroy = imx_drm_connector_destroy, | 336 | .destroy = imx_drm_connector_destroy, |
@@ -360,9 +350,8 @@ static const struct drm_encoder_funcs imx_tve_encoder_funcs = { | |||
360 | }; | 350 | }; |
361 | 351 | ||
362 | static const struct drm_encoder_helper_funcs imx_tve_encoder_helper_funcs = { | 352 | static const struct drm_encoder_helper_funcs imx_tve_encoder_helper_funcs = { |
363 | .dpms = imx_tve_encoder_dpms, | ||
364 | .mode_set = imx_tve_encoder_mode_set, | 353 | .mode_set = imx_tve_encoder_mode_set, |
365 | .commit = imx_tve_encoder_commit, | 354 | .enable = imx_tve_encoder_enable, |
366 | .disable = imx_tve_encoder_disable, | 355 | .disable = imx_tve_encoder_disable, |
367 | }; | 356 | }; |
368 | 357 | ||