Skip to content

Commit 093e72b

Browse files
Mark Yaock_zhang
authored andcommitted
drm/rockchip: dw_hdmi: check display mode with crtc mode valid
Change-Id: I23470e46b97169da0b59153dfc0835833f1aa549 Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
1 parent 261a45f commit 093e72b

1 file changed

Lines changed: 41 additions & 2 deletions

File tree

drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,11 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
268268
{
269269
int pclk = mode->clock * 1000;
270270
int num_rates = ARRAY_SIZE(dw_hdmi_rates);
271+
struct drm_encoder *encoder = connector->encoder;
272+
enum drm_mode_status status = MODE_OK;
273+
struct drm_device *dev = connector->dev;
274+
struct rockchip_drm_private *priv = dev->dev_private;
275+
struct drm_crtc *crtc;
271276
int i;
272277

273278
/*
@@ -283,10 +288,44 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
283288

284289
if ((pclk >= dw_hdmi_rates[i] - slop) &&
285290
(pclk <= dw_hdmi_rates[i] + slop))
286-
return MODE_OK;
291+
return MODE_BAD;
287292
}
288293

289-
return MODE_BAD;
294+
if (!encoder) {
295+
const struct drm_connector_helper_funcs *funcs;
296+
297+
funcs = connector->helper_private;
298+
if (funcs->atomic_best_encoder)
299+
encoder = funcs->atomic_best_encoder(connector,
300+
connector->state);
301+
else
302+
encoder = funcs->best_encoder(connector);
303+
}
304+
305+
if (!encoder || !encoder->possible_crtcs)
306+
return MODE_BAD;
307+
/*
308+
* ensure all drm display mode can work, if someone want support more
309+
* resolutions, please limit the possible_crtc, only connect to
310+
* needed crtc.
311+
*/
312+
drm_for_each_crtc(crtc, connector->dev) {
313+
int pipe = drm_crtc_index(crtc);
314+
const struct rockchip_crtc_funcs *funcs =
315+
priv->crtc_funcs[pipe];
316+
317+
if (!(encoder->possible_crtcs & drm_crtc_mask(crtc)))
318+
continue;
319+
if (!funcs || !funcs->mode_valid)
320+
continue;
321+
322+
status = funcs->mode_valid(crtc, mode,
323+
DRM_MODE_CONNECTOR_HDMIA);
324+
if (status != MODE_OK)
325+
return status;
326+
}
327+
328+
return status;
290329
}
291330

292331
static const struct drm_encoder_funcs dw_hdmi_rockchip_encoder_funcs = {

0 commit comments

Comments
 (0)