diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dvo.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 27 | 
1 files changed, 22 insertions, 5 deletions
| diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 770040ff486e..ece5bd754f85 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c @@ -80,7 +80,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {  		.name = "ch7017",  		.dvo_reg = DVOC,  		.slave_addr = 0x75, -		.gpio = GMBUS_PORT_DPB, +		.gpio = GMBUS_PIN_DPB,  		.dev_ops = &ch7017_ops,  	},  	{ @@ -364,7 +364,7 @@ static int intel_dvo_get_modes(struct drm_connector *connector)  	 * that's not the case.  	 */  	intel_ddc_get_modes(connector, -			    intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPC)); +			    intel_gmbus_get_adapter(dev_priv, GMBUS_PIN_DPC));  	if (!list_empty(&connector->probed_modes))  		return 1; @@ -495,17 +495,19 @@ void intel_dvo_init(struct drm_device *dev)  		struct i2c_adapter *i2c;  		int gpio;  		bool dvoinit; +		enum pipe pipe; +		uint32_t dpll[I915_MAX_PIPES];  		/* Allow the I2C driver info to specify the GPIO to be used in  		 * special cases, but otherwise default to what's defined  		 * in the spec.  		 */ -		if (intel_gmbus_is_port_valid(dvo->gpio)) +		if (intel_gmbus_is_valid_pin(dev_priv, dvo->gpio))  			gpio = dvo->gpio;  		else if (dvo->type == INTEL_DVO_CHIP_LVDS) -			gpio = GMBUS_PORT_SSC; +			gpio = GMBUS_PIN_SSC;  		else -			gpio = GMBUS_PORT_DPB; +			gpio = GMBUS_PIN_DPB;  		/* Set up the I2C bus necessary for the chip we're probing.  		 * It appears that everything is on GPIOE except for panels @@ -520,8 +522,23 @@ void intel_dvo_init(struct drm_device *dev)  		 */  		intel_gmbus_force_bit(i2c, true); +		/* ns2501 requires the DVO 2x clock before it will +		 * respond to i2c accesses, so make sure we have +		 * have the clock enabled before we attempt to +		 * initialize the device. +		 */ +		for_each_pipe(dev_priv, pipe) { +			dpll[pipe] = I915_READ(DPLL(pipe)); +			I915_WRITE(DPLL(pipe), dpll[pipe] | DPLL_DVO_2X_MODE); +		} +  		dvoinit = dvo->dev_ops->init(&intel_dvo->dev, i2c); +		/* restore the DVO 2x clock state to original */ +		for_each_pipe(dev_priv, pipe) { +			I915_WRITE(DPLL(pipe), dpll[pipe]); +		} +  		intel_gmbus_force_bit(i2c, false);  		if (!dvoinit) | 
