dssdev->type = OMAP_DISPLAY_TYPE_DPI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
        drm_bus_flags_from_videomode(&ddata->vm, &dssdev->bus_flags);
 
        omapdss_display_init(dssdev);
 
        dssdev->type = OMAP_DISPLAY_TYPE_DSI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
        dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
                OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
 
        dssdev->type = OMAP_DISPLAY_TYPE_DPI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
        /*
         * Note: According to the panel documentation:
 
        dssdev->type = OMAP_DISPLAY_TYPE_DPI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
        dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_POSEDGE
                          | DRM_BUS_FLAG_PIXDATA_POSEDGE;
 
 
        dssdev->type = OMAP_DISPLAY_TYPE_DPI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
        /*
         * Note: According to the panel documentation:
 
        dssdev->type = OMAP_DISPLAY_TYPE_SDI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
        dssdev->bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_SYNC_NEGEDGE
                          | DRM_BUS_FLAG_PIXDATA_POSEDGE;
 
 
        dssdev->type = OMAP_DISPLAY_TYPE_DPI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
        /*
         * Note: According to the panel documentation:
 
        dssdev->type = OMAP_DISPLAY_TYPE_DPI;
        dssdev->owner = THIS_MODULE;
        dssdev->of_ports = BIT(0);
+       dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
        /*
         * Note: According to the panel documentation:
 
  * enum omap_dss_device_ops_flag - Indicates which device ops are supported
  * @OMAP_DSS_DEVICE_OP_DETECT: The device supports output connection detection
  * @OMAP_DSS_DEVICE_OP_HPD: The device supports all hot-plug-related operations
- * @OMAP_DSS_DEVICE_OP_EDID: The device supports readind EDID
+ * @OMAP_DSS_DEVICE_OP_EDID: The device supports reading EDID
+ * @OMAP_DSS_DEVICE_OP_MODES: The device supports reading modes
  */
 enum omap_dss_device_ops_flag {
        OMAP_DSS_DEVICE_OP_DETECT = BIT(0),
        OMAP_DSS_DEVICE_OP_HPD = BIT(1),
        OMAP_DSS_DEVICE_OP_EDID = BIT(2),
+       OMAP_DSS_DEVICE_OP_MODES = BIT(3),
 };
 
 struct omap_dss_device {
 
        out->ops = &venc_ops;
        out->owner = THIS_MODULE;
        out->of_ports = BIT(0);
+       out->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
 
        r = omapdss_device_init_output(out);
        if (r < 0)
 
         * Otherwise if the display pipeline reports modes (e.g. with a fixed
         * resolution panel or an analog TV output), query it.
         */
-       for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
-               if (dssdev->ops->get_modes)
-                       return dssdev->ops->get_modes(dssdev, connector);
-       }
+       dssdev = omap_connector_find_device(connector,
+                                           OMAP_DSS_DEVICE_OP_MODES);
+       if (dssdev)
+               return dssdev->ops->get_modes(dssdev, connector);
 
        /*
         * We can't retrieve modes, which can happen for instance for a DVI or