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
Unified · Split
| @@ -435,7 +435,7 @@ gmbus_xfer(struct i2c_adapter *adapter, · 434 unmodified lines | ||
| 435 | 435 | struct intel_gmbus, |
| 436 | 436 | adapter); |
| 437 | 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 | 439 | int ret = 0; |
| 440 | 440 | |
| 441 | 441 | intel_aux_display_runtime_get(dev_priv); |
| @@ -448,12 +448,14 @@ gmbus_xfer(struct i2c_adapter *adapter, · 6 unmodified lines | ||
| 448 | 448 | |
| 449 | 449 | reg_offset = dev_priv->gpio_mmio_base; |
| 450 | 450 | |
| 451 | +retry: | |
| 451 | 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 | 456 | if (gmbus_is_index_read(msgs, i, num)) { |
| 455 | 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 | 459 | } else if (msgs[i].flags & I2C_M_RD) { |
| 458 | 460 | ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); |
| 459 | 461 | } else { |
| @@ -525,6 +527,18 @@ clear_err: · 65 unmodified lines | ||
| 525 | 527 | adapter->name, msgs[i].addr, |
| 526 | 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 | 542 | goto out; |
| 529 | 543 | |
| 530 | 544 | timeout: |
| @@ -2550,7 +2550,7 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device) · 2549 unmodified lines | ||
| 2550 | 2550 | |
| 2551 | 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 | 2554 | if (!intel_sdvo_connector) |
| 2555 | 2555 | return false; |
| 2556 | 2556 | |