diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dvo.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 47 | 
1 files changed, 28 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 406303b509c..a3631c0a5c2 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c @@ -153,6 +153,8 @@ static void intel_dvo_get_config(struct intel_encoder *encoder,  		flags |= DRM_MODE_FLAG_NVSYNC;  	pipe_config->adjusted_mode.flags |= flags; + +	pipe_config->adjusted_mode.crtc_clock = pipe_config->port_clock;  }  static void intel_disable_dvo(struct intel_encoder *encoder) @@ -171,11 +173,16 @@ static void intel_enable_dvo(struct intel_encoder *encoder)  {  	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;  	struct intel_dvo *intel_dvo = enc_to_dvo(encoder); +	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);  	u32 dvo_reg = intel_dvo->dev.dvo_reg;  	u32 temp = I915_READ(dvo_reg);  	I915_WRITE(dvo_reg, temp | DVO_ENABLE);  	I915_READ(dvo_reg); +	intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev, +					 &crtc->config.requested_mode, +					 &crtc->config.adjusted_mode); +  	intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, true);  } @@ -184,6 +191,7 @@ static void intel_dvo_dpms(struct drm_connector *connector, int mode)  {  	struct intel_dvo *intel_dvo = intel_attached_dvo(connector);  	struct drm_crtc *crtc; +	struct intel_crtc_config *config;  	/* dvo supports only 2 dpms states. */  	if (mode != DRM_MODE_DPMS_ON) @@ -204,10 +212,16 @@ static void intel_dvo_dpms(struct drm_connector *connector, int mode)  	/* We call connector dpms manually below in case pipe dpms doesn't  	 * change due to cloning. */  	if (mode == DRM_MODE_DPMS_ON) { +		config = &to_intel_crtc(crtc)->config; +  		intel_dvo->base.connectors_active = true;  		intel_crtc_update_dpms(crtc); +		intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev, +						 &config->requested_mode, +						 &config->adjusted_mode); +  		intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, true);  	} else {  		intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, false); @@ -220,8 +234,9 @@ static void intel_dvo_dpms(struct drm_connector *connector, int mode)  	intel_modeset_check_state(connector->dev);  } -static int intel_dvo_mode_valid(struct drm_connector *connector, -				struct drm_display_mode *mode) +static enum drm_mode_status +intel_dvo_mode_valid(struct drm_connector *connector, +		     struct drm_display_mode *mode)  {  	struct intel_dvo *intel_dvo = intel_attached_dvo(connector); @@ -263,17 +278,14 @@ static bool intel_dvo_compute_config(struct intel_encoder *encoder,  		C(vtotal);  		C(clock);  #undef C -	} -	if (intel_dvo->dev.dev_ops->mode_fixup) -		return intel_dvo->dev.dev_ops->mode_fixup(&intel_dvo->dev, -							  &pipe_config->requested_mode, -							  adjusted_mode); +		drm_mode_set_crtcinfo(adjusted_mode, 0); +	}  	return true;  } -static void intel_dvo_mode_set(struct intel_encoder *encoder) +static void intel_dvo_pre_enable(struct intel_encoder *encoder)  {  	struct drm_device *dev = encoder->base.dev;  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -297,10 +309,6 @@ static void intel_dvo_mode_set(struct intel_encoder *encoder)  		break;  	} -	intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev, -					 &crtc->config.requested_mode, -					 adjusted_mode); -  	/* Save the data order, since I don't know what it should be set to. */  	dvo_val = I915_READ(dvo_reg) &  		  (DVO_PRESERVE_MASK | DVO_DATA_ORDER_GBRG); @@ -335,7 +343,7 @@ intel_dvo_detect(struct drm_connector *connector, bool force)  {  	struct intel_dvo *intel_dvo = intel_attached_dvo(connector);  	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", -		      connector->base.id, drm_get_connector_name(connector)); +		      connector->base.id, connector->name);  	return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev);  } @@ -368,7 +376,6 @@ static int intel_dvo_get_modes(struct drm_connector *connector)  static void intel_dvo_destroy(struct drm_connector *connector)  { -	drm_sysfs_connector_remove(connector);  	drm_connector_cleanup(connector);  	kfree(connector);  } @@ -449,11 +456,11 @@ void intel_dvo_init(struct drm_device *dev)  	int i;  	int encoder_type = DRM_MODE_ENCODER_NONE; -	intel_dvo = kzalloc(sizeof(struct intel_dvo), GFP_KERNEL); +	intel_dvo = kzalloc(sizeof(*intel_dvo), GFP_KERNEL);  	if (!intel_dvo)  		return; -	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); +	intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);  	if (!intel_connector) {  		kfree(intel_dvo);  		return; @@ -468,8 +475,9 @@ void intel_dvo_init(struct drm_device *dev)  	intel_encoder->get_hw_state = intel_dvo_get_hw_state;  	intel_encoder->get_config = intel_dvo_get_config;  	intel_encoder->compute_config = intel_dvo_compute_config; -	intel_encoder->mode_set = intel_dvo_mode_set; +	intel_encoder->pre_enable = intel_dvo_pre_enable;  	intel_connector->get_hw_state = intel_dvo_connector_get_hw_state; +	intel_connector->unregister = intel_connector_unregister;  	/* Now, try to find a controller */  	for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) { @@ -514,14 +522,15 @@ void intel_dvo_init(struct drm_device *dev)  		intel_encoder->crtc_mask = (1 << 0) | (1 << 1);  		switch (dvo->type) {  		case INTEL_DVO_CHIP_TMDS: -			intel_encoder->cloneable = true; +			intel_encoder->cloneable = (1 << INTEL_OUTPUT_ANALOG) | +				(1 << INTEL_OUTPUT_DVO);  			drm_connector_init(dev, connector,  					   &intel_dvo_connector_funcs,  					   DRM_MODE_CONNECTOR_DVII);  			encoder_type = DRM_MODE_ENCODER_TMDS;  			break;  		case INTEL_DVO_CHIP_LVDS: -			intel_encoder->cloneable = false; +			intel_encoder->cloneable = 0;  			drm_connector_init(dev, connector,  					   &intel_dvo_connector_funcs,  					   DRM_MODE_CONNECTOR_LVDS);  | 
