ret = connector_status_connected;
                else
                        ret = connector_status_disconnected;
+       } else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
+                       dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
+                       dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
+                       dssdev->type == OMAP_DISPLAY_TYPE_DSI) {
+               ret = connector_status_connected;
        } else {
                ret = connector_status_unknown;
        }
        struct omap_video_timings timings = {0};
        struct drm_device *dev = connector->dev;
        struct drm_display_mode *new_mode;
-       int ret = MODE_BAD;
+       int r, ret = MODE_BAD;
 
        copy_timings_drm_to_omap(&timings, mode);
        mode->vrefresh = drm_mode_vrefresh(mode);
 
-       if (!dssdrv->check_timings(dssdev, &timings)) {
+       /*
+        * if the panel driver doesn't have a check_timings, it's most likely
+        * a fixed resolution panel, check if the timings match with the
+        * panel's timings
+        */
+       if (dssdrv->check_timings) {
+               r = dssdrv->check_timings(dssdev, &timings);
+       } else {
+               struct omap_video_timings t = {0};
+
+               dssdrv->get_timings(dssdev, &t);
+
+               if (memcmp(&timings, &t, sizeof(struct omap_video_timings)))
+                       r = -EINVAL;
+               else
+                       r = 0;
+       }
+
+       if (!r) {
                /* check if vrefresh is still valid */
                new_mode = drm_mode_duplicate(dev, mode);
                new_mode->clock = timings.pixel_clock;
 
 
        dssdev->output->manager = mgr;
 
-       ret = dssdrv->check_timings(dssdev, timings);
+       if (dssdrv->check_timings) {
+               ret = dssdrv->check_timings(dssdev, timings);
+       } else {
+               struct omap_video_timings t = {0};
+
+               dssdrv->get_timings(dssdev, &t);
+
+               if (memcmp(timings, &t, sizeof(struct omap_video_timings)))
+                       ret = -EINVAL;
+               else
+                       ret = 0;
+       }
+
        if (ret) {
                dev_err(dev->dev, "could not set timings: %d\n", ret);
                return ret;
        }
 
-       dssdrv->set_timings(dssdev, timings);
+       if (dssdrv->set_timings)
+               dssdrv->set_timings(dssdev, timings);
 
        return 0;
 }