diff options
author | Eric Anholt <eric@anholt.net> | 2009-12-01 14:56:30 -0500 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-12-01 14:56:30 -0500 |
commit | f0217c42c9ab3d772e543f635ce628b9478f70b6 (patch) | |
tree | 01dfcd607f90f250fb27cb303747b3d770879742 /drivers/gpu/drm/i915/intel_i2c.c | |
parent | d09c23de9f967a7b7dcee0ffc57222ddbd821aba (diff) |
drm/i915: Fix DDC on some systems by clearing BIOS GMBUS setup.
This is a sync of a fix I made in the old UMS code. If the BIOS uses
the GMBUS and doesn't clear that setup, then our bit-banging I2C can
fail, leading to monitors not being detected.
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_i2c.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index c7eab724c418..b94acc4cc05f 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
@@ -118,6 +118,23 @@ static void set_data(void *data, int state_high) | |||
118 | udelay(I2C_RISEFALL_TIME); /* wait for the line to change state */ | 118 | udelay(I2C_RISEFALL_TIME); /* wait for the line to change state */ |
119 | } | 119 | } |
120 | 120 | ||
121 | /* Clears the GMBUS setup. Our driver doesn't make use of the GMBUS I2C | ||
122 | * engine, but if the BIOS leaves it enabled, then that can break our use | ||
123 | * of the bit-banging I2C interfaces. This is notably the case with the | ||
124 | * Mac Mini in EFI mode. | ||
125 | */ | ||
126 | void | ||
127 | intel_i2c_reset_gmbus(struct drm_device *dev) | ||
128 | { | ||
129 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
130 | |||
131 | if (IS_IGDNG(dev)) { | ||
132 | I915_WRITE(PCH_GMBUS0, 0); | ||
133 | } else { | ||
134 | I915_WRITE(GMBUS0, 0); | ||
135 | } | ||
136 | } | ||
137 | |||
121 | /** | 138 | /** |
122 | * intel_i2c_create - instantiate an Intel i2c bus using the specified GPIO reg | 139 | * intel_i2c_create - instantiate an Intel i2c bus using the specified GPIO reg |
123 | * @dev: DRM device | 140 | * @dev: DRM device |
@@ -168,6 +185,8 @@ struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg, | |||
168 | if(i2c_bit_add_bus(&chan->adapter)) | 185 | if(i2c_bit_add_bus(&chan->adapter)) |
169 | goto out_free; | 186 | goto out_free; |
170 | 187 | ||
188 | intel_i2c_reset_gmbus(dev); | ||
189 | |||
171 | /* JJJ: raise SCL and SDA? */ | 190 | /* JJJ: raise SCL and SDA? */ |
172 | intel_i2c_quirk_set(dev, true); | 191 | intel_i2c_quirk_set(dev, true); |
173 | set_data(chan, 1); | 192 | set_data(chan, 1); |