diff options
| author | Dave Airlie <airlied@redhat.com> | 2015-06-11 20:11:50 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2015-06-11 20:11:50 -0400 |
| commit | 6e2eb00fc5f05c1c6d70e8ccbd9f04c75ea52fbc (patch) | |
| tree | 29d6190ff653f99a414bba573abe07218cd540cd /drivers/gpu/drm | |
| parent | 950c37073aae9c2edbd0ba742fd668b4a355eea3 (diff) | |
| parent | 3f5f1554ee715639e78d9be87623ee82772537e0 (diff) | |
Merge tag 'drm-intel-fixes-2015-06-11' of git://anongit.freedesktop.org/drm-intel into drm-fixes
Fix for the regression Linus called out, and another for probing
dongles.
* tag 'drm-intel-fixes-2015-06-11' of git://anongit.freedesktop.org/drm-intel:
drm/i915: Fix DDC probe for passive adapters
drm/i915: Properly initialize SDVO analog connectors
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 2 |
2 files changed, 18 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 56e437e31580..ae628001fd97 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
| @@ -435,7 +435,7 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
| 435 | struct intel_gmbus, | 435 | struct intel_gmbus, |
| 436 | adapter); | 436 | adapter); |
| 437 | struct drm_i915_private *dev_priv = bus->dev_priv; | 437 | struct drm_i915_private *dev_priv = bus->dev_priv; |
| 438 | int i, reg_offset; | 438 | int i = 0, inc, try = 0, reg_offset; |
| 439 | int ret = 0; | 439 | int ret = 0; |
| 440 | 440 | ||
| 441 | intel_aux_display_runtime_get(dev_priv); | 441 | intel_aux_display_runtime_get(dev_priv); |
| @@ -448,12 +448,14 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
| 448 | 448 | ||
| 449 | reg_offset = dev_priv->gpio_mmio_base; | 449 | reg_offset = dev_priv->gpio_mmio_base; |
| 450 | 450 | ||
| 451 | retry: | ||
| 451 | I915_WRITE(GMBUS0 + reg_offset, bus->reg0); | 452 | I915_WRITE(GMBUS0 + reg_offset, bus->reg0); |
| 452 | 453 | ||
| 453 | for (i = 0; i < num; i++) { | 454 | for (; i < num; i += inc) { |
| 455 | inc = 1; | ||
| 454 | if (gmbus_is_index_read(msgs, i, num)) { | 456 | if (gmbus_is_index_read(msgs, i, num)) { |
| 455 | ret = gmbus_xfer_index_read(dev_priv, &msgs[i]); | 457 | ret = gmbus_xfer_index_read(dev_priv, &msgs[i]); |
| 456 | i += 1; /* set i to the index of the read xfer */ | 458 | inc = 2; /* an index read is two msgs */ |
| 457 | } else if (msgs[i].flags & I2C_M_RD) { | 459 | } else if (msgs[i].flags & I2C_M_RD) { |
| 458 | ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); | 460 | ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); |
| 459 | } else { | 461 | } else { |
| @@ -525,6 +527,18 @@ clear_err: | |||
| 525 | adapter->name, msgs[i].addr, | 527 | adapter->name, msgs[i].addr, |
| 526 | (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len); | 528 | (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len); |
| 527 | 529 | ||
| 530 | /* | ||
| 531 | * Passive adapters sometimes NAK the first probe. Retry the first | ||
| 532 | * message once on -ENXIO for GMBUS transfers; the bit banging algorithm | ||
| 533 | * has retries internally. See also the retry loop in | ||
| 534 | * drm_do_probe_ddc_edid, which bails out on the first -ENXIO. | ||
| 535 | */ | ||
| 536 | if (ret == -ENXIO && i == 0 && try++ == 0) { | ||
| 537 | DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n", | ||
| 538 | adapter->name); | ||
| 539 | goto retry; | ||
| 540 | } | ||
| 541 | |||
| 528 | goto out; | 542 | goto out; |
| 529 | 543 | ||
| 530 | timeout: | 544 | timeout: |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index e87d2f418de4..987b81f31b0e 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2550,7 +2550,7 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device) | |||
| 2550 | 2550 | ||
| 2551 | DRM_DEBUG_KMS("initialising analog device %d\n", device); | 2551 | DRM_DEBUG_KMS("initialising analog device %d\n", device); |
| 2552 | 2552 | ||
| 2553 | intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL); | 2553 | intel_sdvo_connector = intel_sdvo_connector_alloc(); |
| 2554 | if (!intel_sdvo_connector) | 2554 | if (!intel_sdvo_connector) |
| 2555 | return false; | 2555 | return false; |
| 2556 | 2556 | ||
