diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.c | 27 | 
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 826586ffbe8..a3004f12b9a 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -65,10 +65,8 @@ static int get_connector_type(struct omap_dss_device *dssdev)  	switch (dssdev->type) {  	case OMAP_DISPLAY_TYPE_HDMI:  		return DRM_MODE_CONNECTOR_HDMIA; -	case OMAP_DISPLAY_TYPE_DPI: -		if (!strcmp(dssdev->name, "dvi")) -			return DRM_MODE_CONNECTOR_DVID; -		/* fallthrough */ +	case OMAP_DISPLAY_TYPE_DVI: +		return DRM_MODE_CONNECTOR_DVID;  	default:  		return DRM_MODE_CONNECTOR_Unknown;  	} @@ -97,6 +95,9 @@ static int omap_modeset_init(struct drm_device *dev)  	int num_mgrs = dss_feat_get_num_mgrs();  	int num_crtcs;  	int i, id = 0; +	int r; + +	omap_crtc_pre_init();  	drm_mode_config_init(dev); @@ -116,6 +117,7 @@ static int omap_modeset_init(struct drm_device *dev)  		struct drm_connector *connector;  		struct drm_encoder *encoder;  		enum omap_channel channel; +		struct omap_overlay_manager *mgr;  		if (!dssdev->driver) {  			dev_warn(dev->dev, "%s has no driver.. skipping it\n", @@ -131,6 +133,13 @@ static int omap_modeset_init(struct drm_device *dev)  			continue;  		} +		r = dssdev->driver->connect(dssdev); +		if (r) { +			dev_err(dev->dev, "could not connect display: %s\n", +					dssdev->name); +			continue; +		} +  		encoder = omap_encoder_init(dev, dssdev);  		if (!encoder) { @@ -172,8 +181,9 @@ static int omap_modeset_init(struct drm_device *dev)  		 * other possible channels to which the encoder can connect are  		 * not considered.  		 */ -		channel = dssdev->output->dispc_channel; +		mgr = omapdss_find_mgr_from_display(dssdev); +		channel = mgr->id;  		/*  		 * if this channel hasn't already been taken by a previously  		 * allocated crtc, we create a new crtc for it @@ -247,6 +257,9 @@ static int omap_modeset_init(struct drm_device *dev)  		struct drm_encoder *encoder = priv->encoders[i];  		struct omap_dss_device *dssdev =  					omap_encoder_get_dssdev(encoder); +		struct omap_dss_device *output; + +		output = omapdss_find_output_from_display(dssdev);  		/* figure out which crtc's we can connect the encoder to: */  		encoder->possible_crtcs = 0; @@ -259,9 +272,11 @@ static int omap_modeset_init(struct drm_device *dev)  			supported_outputs =  				dss_feat_get_supported_outputs(crtc_channel); -			if (supported_outputs & dssdev->output->id) +			if (supported_outputs & output->id)  				encoder->possible_crtcs |= (1 << id);  		} + +		omap_dss_put_device(output);  	}  	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",  | 
