drm/i915: change intel_ddc_get_modes() function parameters
This one replaces original param for intel_ddc_get_modes() with DRM connector and i2c bus adapter instead. With explicit params, we won't require that a single driver structure must hold connector and DDC bus reference, which ease the conversion to splitted encoder/ connector model. It also clears up for some cases that we would steal other DDC bus for mode probe, like VGA analog DDC probe for DVI-I. Also it fixed a bug in old DVI-I probe handling, that failed to restore origin analog GPIO port. Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com> Signed-off-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
c1c43977e6
commit
335af9a235
|
@ -433,28 +433,25 @@ static int intel_crt_get_modes(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||||
struct i2c_adapter *ddcbus;
|
struct i2c_adapter *ddc_bus;
|
||||||
struct drm_device *dev = connector->dev;
|
struct drm_device *dev = connector->dev;
|
||||||
|
|
||||||
|
|
||||||
ret = intel_ddc_get_modes(intel_encoder);
|
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
if (ret || !IS_G4X(dev))
|
if (ret || !IS_G4X(dev))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
ddcbus = intel_encoder->ddc_bus;
|
|
||||||
/* Try to probe digital port for output in DVI-I -> VGA mode. */
|
/* Try to probe digital port for output in DVI-I -> VGA mode. */
|
||||||
intel_encoder->ddc_bus =
|
ddc_bus = intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D");
|
||||||
intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D");
|
|
||||||
|
|
||||||
if (!intel_encoder->ddc_bus) {
|
if (!ddc_bus) {
|
||||||
intel_encoder->ddc_bus = ddcbus;
|
|
||||||
dev_printk(KERN_ERR, &connector->dev->pdev->dev,
|
dev_printk(KERN_ERR, &connector->dev->pdev->dev,
|
||||||
"DDC bus registration failed for CRTDDC_D.\n");
|
"DDC bus registration failed for CRTDDC_D.\n");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
/* Try to get modes by GPIOD port */
|
/* Try to get modes by GPIOD port */
|
||||||
ret = intel_ddc_get_modes(intel_encoder);
|
ret = intel_ddc_get_modes(connector, ddc_bus);
|
||||||
intel_i2c_destroy(ddcbus);
|
intel_i2c_destroy(ddc_bus);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1229,7 +1229,7 @@ static int intel_dp_get_modes(struct drm_connector *connector)
|
||||||
/* We should parse the EDID data and find out if it has an audio sink
|
/* We should parse the EDID data and find out if it has an audio sink
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = intel_ddc_get_modes(intel_encoder);
|
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ struct intel_crtc {
|
||||||
struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg,
|
struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg,
|
||||||
const char *name);
|
const char *name);
|
||||||
void intel_i2c_destroy(struct i2c_adapter *adapter);
|
void intel_i2c_destroy(struct i2c_adapter *adapter);
|
||||||
int intel_ddc_get_modes(struct intel_encoder *intel_encoder);
|
int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
|
||||||
extern bool intel_ddc_probe(struct intel_encoder *intel_encoder);
|
extern bool intel_ddc_probe(struct intel_encoder *intel_encoder);
|
||||||
void intel_i2c_quirk_set(struct drm_device *dev, bool enable);
|
void intel_i2c_quirk_set(struct drm_device *dev, bool enable);
|
||||||
void intel_i2c_reset_gmbus(struct drm_device *dev);
|
void intel_i2c_reset_gmbus(struct drm_device *dev);
|
||||||
|
|
|
@ -256,7 +256,7 @@ static int intel_dvo_get_modes(struct drm_connector *connector)
|
||||||
* (TV-out, for example), but for now with just TMDS and LVDS,
|
* (TV-out, for example), but for now with just TMDS and LVDS,
|
||||||
* that's not the case.
|
* that's not the case.
|
||||||
*/
|
*/
|
||||||
intel_ddc_get_modes(intel_encoder);
|
intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
if (!list_empty(&connector->probed_modes))
|
if (!list_empty(&connector->probed_modes))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,7 @@ static int intel_hdmi_get_modes(struct drm_connector *connector)
|
||||||
* we can send audio to it.
|
* we can send audio to it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return intel_ddc_get_modes(intel_encoder);
|
return intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_hdmi_destroy(struct drm_connector *connector)
|
static void intel_hdmi_destroy(struct drm_connector *connector)
|
||||||
|
|
|
@ -639,7 +639,7 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (dev_priv->lvds_edid_good) {
|
if (dev_priv->lvds_edid_good) {
|
||||||
ret = intel_ddc_get_modes(intel_encoder);
|
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1066,7 +1066,7 @@ void intel_lvds_init(struct drm_device *dev)
|
||||||
*/
|
*/
|
||||||
dev_priv->lvds_edid_good = true;
|
dev_priv->lvds_edid_good = true;
|
||||||
|
|
||||||
if (!intel_ddc_get_modes(intel_encoder))
|
if (!intel_ddc_get_modes(connector, intel_encoder->ddc_bus))
|
||||||
dev_priv->lvds_edid_good = false;
|
dev_priv->lvds_edid_good = false;
|
||||||
|
|
||||||
list_for_each_entry(scan, &connector->probed_modes, head) {
|
list_for_each_entry(scan, &connector->probed_modes, head) {
|
||||||
|
|
|
@ -53,9 +53,9 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
intel_i2c_quirk_set(intel_encoder->base.dev, true);
|
intel_i2c_quirk_set(intel_encoder->enc.dev, true);
|
||||||
ret = i2c_transfer(intel_encoder->ddc_bus, msgs, 2);
|
ret = i2c_transfer(intel_encoder->ddc_bus, msgs, 2);
|
||||||
intel_i2c_quirk_set(intel_encoder->base.dev, false);
|
intel_i2c_quirk_set(intel_encoder->enc.dev, false);
|
||||||
if (ret == 2)
|
if (ret == 2)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -65,22 +65,23 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder)
|
||||||
/**
|
/**
|
||||||
* intel_ddc_get_modes - get modelist from monitor
|
* intel_ddc_get_modes - get modelist from monitor
|
||||||
* @connector: DRM connector device to use
|
* @connector: DRM connector device to use
|
||||||
|
* @adapter: i2c adapter
|
||||||
*
|
*
|
||||||
* Fetch the EDID information from @connector using the DDC bus.
|
* Fetch the EDID information from @connector using the DDC bus.
|
||||||
*/
|
*/
|
||||||
int intel_ddc_get_modes(struct intel_encoder *intel_encoder)
|
int intel_ddc_get_modes(struct drm_connector *connector,
|
||||||
|
struct i2c_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct edid *edid;
|
struct edid *edid;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
intel_i2c_quirk_set(intel_encoder->base.dev, true);
|
intel_i2c_quirk_set(connector->dev, true);
|
||||||
edid = drm_get_edid(&intel_encoder->base, intel_encoder->ddc_bus);
|
edid = drm_get_edid(connector, adapter);
|
||||||
intel_i2c_quirk_set(intel_encoder->base.dev, false);
|
intel_i2c_quirk_set(connector->dev, false);
|
||||||
if (edid) {
|
if (edid) {
|
||||||
drm_mode_connector_update_edid_property(&intel_encoder->base,
|
drm_mode_connector_update_edid_property(connector, edid);
|
||||||
edid);
|
ret = drm_add_edid_modes(connector, edid);
|
||||||
ret = drm_add_edid_modes(&intel_encoder->base, edid);
|
connector->display_info.raw_edid = NULL;
|
||||||
intel_encoder->base.display_info.raw_edid = NULL;
|
|
||||||
kfree(edid);
|
kfree(edid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1729,7 +1729,7 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
||||||
int num_modes;
|
int num_modes;
|
||||||
|
|
||||||
/* set the bus switch and get the modes */
|
/* set the bus switch and get the modes */
|
||||||
num_modes = intel_ddc_get_modes(intel_encoder);
|
num_modes = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mac mini hack. On this device, the DVI-I connector shares one DDC
|
* Mac mini hack. On this device, the DVI-I connector shares one DDC
|
||||||
|
@ -1740,16 +1740,9 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
||||||
if (num_modes == 0 &&
|
if (num_modes == 0 &&
|
||||||
sdvo_priv->analog_ddc_bus &&
|
sdvo_priv->analog_ddc_bus &&
|
||||||
!intel_analog_is_connected(intel_encoder->base.dev)) {
|
!intel_analog_is_connected(intel_encoder->base.dev)) {
|
||||||
struct i2c_adapter *digital_ddc_bus;
|
|
||||||
|
|
||||||
/* Switch to the analog ddc bus and try that
|
/* Switch to the analog ddc bus and try that
|
||||||
*/
|
*/
|
||||||
digital_ddc_bus = intel_encoder->ddc_bus;
|
(void) intel_ddc_get_modes(connector, sdvo_priv->analog_ddc_bus);
|
||||||
intel_encoder->ddc_bus = sdvo_priv->analog_ddc_bus;
|
|
||||||
|
|
||||||
(void) intel_ddc_get_modes(intel_encoder);
|
|
||||||
|
|
||||||
intel_encoder->ddc_bus = digital_ddc_bus;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1872,7 +1865,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
||||||
* Assume that the preferred modes are
|
* Assume that the preferred modes are
|
||||||
* arranged in priority order.
|
* arranged in priority order.
|
||||||
*/
|
*/
|
||||||
intel_ddc_get_modes(intel_encoder);
|
intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||||
if (list_empty(&connector->probed_modes) == false)
|
if (list_empty(&connector->probed_modes) == false)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue