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
This commit is contained in:
Коммит
6e2eb00fc5
|
@ -435,7 +435,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||||
struct intel_gmbus,
|
struct intel_gmbus,
|
||||||
adapter);
|
adapter);
|
||||||
struct drm_i915_private *dev_priv = bus->dev_priv;
|
struct drm_i915_private *dev_priv = bus->dev_priv;
|
||||||
int i, reg_offset;
|
int i = 0, inc, try = 0, reg_offset;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
intel_aux_display_runtime_get(dev_priv);
|
intel_aux_display_runtime_get(dev_priv);
|
||||||
|
@ -448,12 +448,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||||
|
|
||||||
reg_offset = dev_priv->gpio_mmio_base;
|
reg_offset = dev_priv->gpio_mmio_base;
|
||||||
|
|
||||||
|
retry:
|
||||||
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (; i < num; i += inc) {
|
||||||
|
inc = 1;
|
||||||
if (gmbus_is_index_read(msgs, i, num)) {
|
if (gmbus_is_index_read(msgs, i, num)) {
|
||||||
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
||||||
i += 1; /* set i to the index of the read xfer */
|
inc = 2; /* an index read is two msgs */
|
||||||
} else if (msgs[i].flags & I2C_M_RD) {
|
} else if (msgs[i].flags & I2C_M_RD) {
|
||||||
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -525,6 +527,18 @@ clear_err:
|
||||||
adapter->name, msgs[i].addr,
|
adapter->name, msgs[i].addr,
|
||||||
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Passive adapters sometimes NAK the first probe. Retry the first
|
||||||
|
* message once on -ENXIO for GMBUS transfers; the bit banging algorithm
|
||||||
|
* has retries internally. See also the retry loop in
|
||||||
|
* drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
|
||||||
|
*/
|
||||||
|
if (ret == -ENXIO && i == 0 && try++ == 0) {
|
||||||
|
DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n",
|
||||||
|
adapter->name);
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
timeout:
|
timeout:
|
||||||
|
|
|
@ -2550,7 +2550,7 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
|
||||||
|
|
||||||
DRM_DEBUG_KMS("initialising analog device %d\n", device);
|
DRM_DEBUG_KMS("initialising analog device %d\n", device);
|
||||||
|
|
||||||
intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL);
|
intel_sdvo_connector = intel_sdvo_connector_alloc();
|
||||||
if (!intel_sdvo_connector)
|
if (!intel_sdvo_connector)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче