@@ -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
292331static const struct drm_encoder_funcs dw_hdmi_rockchip_encoder_funcs = {
0 commit comments