diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_connector.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 87 | 
1 files changed, 11 insertions, 76 deletions
| diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c index 137fe690a0da..2580e8673908 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c @@ -42,73 +42,6 @@ bool omap_connector_get_hdmi_mode(struct drm_connector *connector)  	return omap_connector->hdmi_mode;  } -void copy_timings_omap_to_drm(struct drm_display_mode *mode, -		struct omap_video_timings *timings) -{ -	mode->clock = timings->pixelclock / 1000; - -	mode->hdisplay = timings->x_res; -	mode->hsync_start = mode->hdisplay + timings->hfp; -	mode->hsync_end = mode->hsync_start + timings->hsw; -	mode->htotal = mode->hsync_end + timings->hbp; - -	mode->vdisplay = timings->y_res; -	mode->vsync_start = mode->vdisplay + timings->vfp; -	mode->vsync_end = mode->vsync_start + timings->vsw; -	mode->vtotal = mode->vsync_end + timings->vbp; - -	mode->flags = 0; - -	if (timings->interlace) -		mode->flags |= DRM_MODE_FLAG_INTERLACE; - -	if (timings->double_pixel) -		mode->flags |= DRM_MODE_FLAG_DBLCLK; - -	if (timings->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH) -		mode->flags |= DRM_MODE_FLAG_PHSYNC; -	else -		mode->flags |= DRM_MODE_FLAG_NHSYNC; - -	if (timings->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH) -		mode->flags |= DRM_MODE_FLAG_PVSYNC; -	else -		mode->flags |= DRM_MODE_FLAG_NVSYNC; -} - -void copy_timings_drm_to_omap(struct omap_video_timings *timings, -		struct drm_display_mode *mode) -{ -	timings->pixelclock = mode->clock * 1000; - -	timings->x_res = mode->hdisplay; -	timings->hfp = mode->hsync_start - mode->hdisplay; -	timings->hsw = mode->hsync_end - mode->hsync_start; -	timings->hbp = mode->htotal - mode->hsync_end; - -	timings->y_res = mode->vdisplay; -	timings->vfp = mode->vsync_start - mode->vdisplay; -	timings->vsw = mode->vsync_end - mode->vsync_start; -	timings->vbp = mode->vtotal - mode->vsync_end; - -	timings->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); -	timings->double_pixel = !!(mode->flags & DRM_MODE_FLAG_DBLCLK); - -	if (mode->flags & DRM_MODE_FLAG_PHSYNC) -		timings->hsync_level = OMAPDSS_SIG_ACTIVE_HIGH; -	else -		timings->hsync_level = OMAPDSS_SIG_ACTIVE_LOW; - -	if (mode->flags & DRM_MODE_FLAG_PVSYNC) -		timings->vsync_level = OMAPDSS_SIG_ACTIVE_HIGH; -	else -		timings->vsync_level = OMAPDSS_SIG_ACTIVE_LOW; - -	timings->data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; -	timings->de_level = OMAPDSS_SIG_ACTIVE_HIGH; -	timings->sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE; -} -  static enum drm_connector_status omap_connector_detect(  		struct drm_connector *connector, bool force)  { @@ -185,11 +118,11 @@ static int omap_connector_get_modes(struct drm_connector *connector)  		kfree(edid);  	} else {  		struct drm_display_mode *mode = drm_mode_create(dev); -		struct omap_video_timings timings = {0}; +		struct videomode vm = {0}; -		dssdrv->get_timings(dssdev, &timings); +		dssdrv->get_timings(dssdev, &vm); -		copy_timings_omap_to_drm(mode, &timings); +		drm_display_mode_from_videomode(&vm, mode);  		mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;  		drm_mode_set_name(mode); @@ -207,12 +140,14 @@ static int omap_connector_mode_valid(struct drm_connector *connector,  	struct omap_connector *omap_connector = to_omap_connector(connector);  	struct omap_dss_device *dssdev = omap_connector->dssdev;  	struct omap_dss_driver *dssdrv = dssdev->driver; -	struct omap_video_timings timings = {0}; +	struct videomode vm = {0};  	struct drm_device *dev = connector->dev;  	struct drm_display_mode *new_mode;  	int r, ret = MODE_BAD; -	copy_timings_drm_to_omap(&timings, mode); +	drm_display_mode_to_videomode(mode, &vm); +	vm.flags |= DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE | +		    DISPLAY_FLAGS_SYNC_NEGEDGE;  	mode->vrefresh = drm_mode_vrefresh(mode);  	/* @@ -221,13 +156,13 @@ static int omap_connector_mode_valid(struct drm_connector *connector,  	 * panel's timings  	 */  	if (dssdrv->check_timings) { -		r = dssdrv->check_timings(dssdev, &timings); +		r = dssdrv->check_timings(dssdev, &vm);  	} else { -		struct omap_video_timings t = {0}; +		struct videomode t = {0};  		dssdrv->get_timings(dssdev, &t); -		if (memcmp(&timings, &t, sizeof(struct omap_video_timings))) +		if (memcmp(&vm, &t, sizeof(struct videomode)))  			r = -EINVAL;  		else  			r = 0; @@ -236,7 +171,7 @@ static int omap_connector_mode_valid(struct drm_connector *connector,  	if (!r) {  		/* check if vrefresh is still valid */  		new_mode = drm_mode_duplicate(dev, mode); -		new_mode->clock = timings.pixelclock / 1000; +		new_mode->clock = vm.pixelclock / 1000;  		new_mode->vrefresh = 0;  		if (mode->vrefresh == drm_mode_vrefresh(new_mode))  			ret = MODE_OK; |