diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_connector.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 27 | 
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c index c451c41a7a7..912759daf56 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c @@ -110,6 +110,11 @@ static enum drm_connector_status omap_connector_detect(  			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;  	} @@ -189,12 +194,30 @@ static int omap_connector_mode_valid(struct drm_connector *connector,  	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;  |