aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Müller (ELSOFT AG) <d.mueller@elsoft.ch>2013-04-19 04:41:50 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-04-19 10:31:41 -0400
commite4bfff54ed3f5de88f5358504c78c2cb037813aa (patch)
tree6bf2a5a4ff56b5c3b693b649659a110b86c431bc
parentbd080ee57c2173cefdcadc39c7863a76c249d049 (diff)
drm/i915: Fall back to bit banging mode for DVO transmitter detection
As discussed in this thread http://lists.freedesktop.org/archives/dri-devel/2013-April/037411.html GMBUS based DVO transmitter detection seems to be unreliable which could result in an unusable DVO port. The attached patch fixes this by falling back to bit banging mode for the time DVO transmitter detection is in progress. Signed-off-by: David Müller <d.mueller@elsoft.ch> Tested-by: David Müller <d.mueller@elsoft.ch> Cc: stable@vger.kernel.org Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 00e70dbe82da..cc70b16d5d42 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -448,6 +448,7 @@ void intel_dvo_init(struct drm_device *dev)
448 const struct intel_dvo_device *dvo = &intel_dvo_devices[i]; 448 const struct intel_dvo_device *dvo = &intel_dvo_devices[i];
449 struct i2c_adapter *i2c; 449 struct i2c_adapter *i2c;
450 int gpio; 450 int gpio;
451 bool dvoinit;
451 452
452 /* Allow the I2C driver info to specify the GPIO to be used in 453 /* Allow the I2C driver info to specify the GPIO to be used in
453 * special cases, but otherwise default to what's defined 454 * special cases, but otherwise default to what's defined
@@ -467,7 +468,17 @@ void intel_dvo_init(struct drm_device *dev)
467 i2c = intel_gmbus_get_adapter(dev_priv, gpio); 468 i2c = intel_gmbus_get_adapter(dev_priv, gpio);
468 469
469 intel_dvo->dev = *dvo; 470 intel_dvo->dev = *dvo;
470 if (!dvo->dev_ops->init(&intel_dvo->dev, i2c)) 471
472 /* GMBUS NAK handling seems to be unstable, hence let the
473 * transmitter detection run in bit banging mode for now.
474 */
475 intel_gmbus_force_bit(i2c, true);
476
477 dvoinit = dvo->dev_ops->init(&intel_dvo->dev, i2c);
478
479 intel_gmbus_force_bit(i2c, false);
480
481 if (!dvoinit)
471 continue; 482 continue;
472 483
473 intel_encoder->type = INTEL_OUTPUT_DVO; 484 intel_encoder->type = INTEL_OUTPUT_DVO;