diff options
author | Zhenyu Wang <zhenyuw@linux.intel.com> | 2010-03-30 02:39:31 -0400 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-04-09 17:17:31 -0400 |
commit | 335af9a235a82842854b394507ab5e310d88be42 (patch) | |
tree | e4d05c21023b46e98082558cbb03db4968274348 | |
parent | c1c43977e6fc789cbde094303fa9ace629a35aca (diff) |
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>
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_modes.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 13 |
8 files changed, 26 insertions, 35 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index b96574ea4707..4dd5daa8ebe7 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -433,28 +433,25 @@ static int intel_crt_get_modes(struct drm_connector *connector) | |||
433 | { | 433 | { |
434 | int ret; | 434 | int ret; |
435 | struct intel_encoder *intel_encoder = to_intel_encoder(connector); | 435 | struct intel_encoder *intel_encoder = to_intel_encoder(connector); |
436 | struct i2c_adapter *ddcbus; | 436 | struct i2c_adapter *ddc_bus; |
437 | struct drm_device *dev = connector->dev; | 437 | struct drm_device *dev = connector->dev; |
438 | 438 | ||
439 | 439 | ||
440 | ret = intel_ddc_get_modes(intel_encoder); | 440 | ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
441 | if (ret || !IS_G4X(dev)) | 441 | if (ret || !IS_G4X(dev)) |
442 | goto end; | 442 | goto end; |
443 | 443 | ||
444 | ddcbus = intel_encoder->ddc_bus; | ||
445 | /* Try to probe digital port for output in DVI-I -> VGA mode. */ | 444 | /* Try to probe digital port for output in DVI-I -> VGA mode. */ |
446 | intel_encoder->ddc_bus = | 445 | ddc_bus = intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D"); |
447 | intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D"); | ||
448 | 446 | ||
449 | if (!intel_encoder->ddc_bus) { | 447 | if (!ddc_bus) { |
450 | intel_encoder->ddc_bus = ddcbus; | ||
451 | dev_printk(KERN_ERR, &connector->dev->pdev->dev, | 448 | dev_printk(KERN_ERR, &connector->dev->pdev->dev, |
452 | "DDC bus registration failed for CRTDDC_D.\n"); | 449 | "DDC bus registration failed for CRTDDC_D.\n"); |
453 | goto end; | 450 | goto end; |
454 | } | 451 | } |
455 | /* Try to get modes by GPIOD port */ | 452 | /* Try to get modes by GPIOD port */ |
456 | ret = intel_ddc_get_modes(intel_encoder); | 453 | ret = intel_ddc_get_modes(connector, ddc_bus); |
457 | intel_i2c_destroy(ddcbus); | 454 | intel_i2c_destroy(ddc_bus); |
458 | 455 | ||
459 | end: | 456 | end: |
460 | return ret; | 457 | return ret; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 0a7e3264dac2..6064fd70a424 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1229,7 +1229,7 @@ static int intel_dp_get_modes(struct drm_connector *connector) | |||
1229 | /* We should parse the EDID data and find out if it has an audio sink | 1229 | /* We should parse the EDID data and find out if it has an audio sink |
1230 | */ | 1230 | */ |
1231 | 1231 | ||
1232 | ret = intel_ddc_get_modes(intel_encoder); | 1232 | ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
1233 | if (ret) | 1233 | if (ret) |
1234 | return ret; | 1234 | return ret; |
1235 | 1235 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 4741713df74a..c15ec471c849 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -165,7 +165,7 @@ struct intel_crtc { | |||
165 | struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg, | 165 | struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg, |
166 | const char *name); | 166 | const char *name); |
167 | void intel_i2c_destroy(struct i2c_adapter *adapter); | 167 | void intel_i2c_destroy(struct i2c_adapter *adapter); |
168 | int intel_ddc_get_modes(struct intel_encoder *intel_encoder); | 168 | int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); |
169 | extern bool intel_ddc_probe(struct intel_encoder *intel_encoder); | 169 | extern bool intel_ddc_probe(struct intel_encoder *intel_encoder); |
170 | void intel_i2c_quirk_set(struct drm_device *dev, bool enable); | 170 | void intel_i2c_quirk_set(struct drm_device *dev, bool enable); |
171 | void intel_i2c_reset_gmbus(struct drm_device *dev); | 171 | void intel_i2c_reset_gmbus(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 62282f34eba9..a3e6efa38c75 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
@@ -256,7 +256,7 @@ static int intel_dvo_get_modes(struct drm_connector *connector) | |||
256 | * (TV-out, for example), but for now with just TMDS and LVDS, | 256 | * (TV-out, for example), but for now with just TMDS and LVDS, |
257 | * that's not the case. | 257 | * that's not the case. |
258 | */ | 258 | */ |
259 | intel_ddc_get_modes(intel_encoder); | 259 | intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
260 | if (!list_empty(&connector->probed_modes)) | 260 | if (!list_empty(&connector->probed_modes)) |
261 | return 1; | 261 | return 1; |
262 | 262 | ||
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 9777504afeb2..74823e77b2fe 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -179,7 +179,7 @@ static int intel_hdmi_get_modes(struct drm_connector *connector) | |||
179 | * we can send audio to it. | 179 | * we can send audio to it. |
180 | */ | 180 | */ |
181 | 181 | ||
182 | return intel_ddc_get_modes(intel_encoder); | 182 | return intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
183 | } | 183 | } |
184 | 184 | ||
185 | static void intel_hdmi_destroy(struct drm_connector *connector) | 185 | static void intel_hdmi_destroy(struct drm_connector *connector) |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 527cfa2626bf..a3b82081e1a7 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -639,7 +639,7 @@ static int intel_lvds_get_modes(struct drm_connector *connector) | |||
639 | int ret = 0; | 639 | int ret = 0; |
640 | 640 | ||
641 | if (dev_priv->lvds_edid_good) { | 641 | if (dev_priv->lvds_edid_good) { |
642 | ret = intel_ddc_get_modes(intel_encoder); | 642 | ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
643 | 643 | ||
644 | if (ret) | 644 | if (ret) |
645 | return ret; | 645 | return ret; |
@@ -1066,7 +1066,7 @@ void intel_lvds_init(struct drm_device *dev) | |||
1066 | */ | 1066 | */ |
1067 | dev_priv->lvds_edid_good = true; | 1067 | dev_priv->lvds_edid_good = true; |
1068 | 1068 | ||
1069 | if (!intel_ddc_get_modes(intel_encoder)) | 1069 | if (!intel_ddc_get_modes(connector, intel_encoder->ddc_bus)) |
1070 | dev_priv->lvds_edid_good = false; | 1070 | dev_priv->lvds_edid_good = false; |
1071 | 1071 | ||
1072 | list_for_each_entry(scan, &connector->probed_modes, head) { | 1072 | list_for_each_entry(scan, &connector->probed_modes, head) { |
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c index 3111a1c2731f..9562176defc4 100644 --- a/drivers/gpu/drm/i915/intel_modes.c +++ b/drivers/gpu/drm/i915/intel_modes.c | |||
@@ -53,9 +53,9 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder) | |||
53 | } | 53 | } |
54 | }; | 54 | }; |
55 | 55 | ||
56 | intel_i2c_quirk_set(intel_encoder->base.dev, true); | 56 | intel_i2c_quirk_set(intel_encoder->enc.dev, true); |
57 | ret = i2c_transfer(intel_encoder->ddc_bus, msgs, 2); | 57 | ret = i2c_transfer(intel_encoder->ddc_bus, msgs, 2); |
58 | intel_i2c_quirk_set(intel_encoder->base.dev, false); | 58 | intel_i2c_quirk_set(intel_encoder->enc.dev, false); |
59 | if (ret == 2) | 59 | if (ret == 2) |
60 | return true; | 60 | return true; |
61 | 61 | ||
@@ -65,22 +65,23 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder) | |||
65 | /** | 65 | /** |
66 | * intel_ddc_get_modes - get modelist from monitor | 66 | * intel_ddc_get_modes - get modelist from monitor |
67 | * @connector: DRM connector device to use | 67 | * @connector: DRM connector device to use |
68 | * @adapter: i2c adapter | ||
68 | * | 69 | * |
69 | * Fetch the EDID information from @connector using the DDC bus. | 70 | * Fetch the EDID information from @connector using the DDC bus. |
70 | */ | 71 | */ |
71 | int intel_ddc_get_modes(struct intel_encoder *intel_encoder) | 72 | int intel_ddc_get_modes(struct drm_connector *connector, |
73 | struct i2c_adapter *adapter) | ||
72 | { | 74 | { |
73 | struct edid *edid; | 75 | struct edid *edid; |
74 | int ret = 0; | 76 | int ret = 0; |
75 | 77 | ||
76 | intel_i2c_quirk_set(intel_encoder->base.dev, true); | 78 | intel_i2c_quirk_set(connector->dev, true); |
77 | edid = drm_get_edid(&intel_encoder->base, intel_encoder->ddc_bus); | 79 | edid = drm_get_edid(connector, adapter); |
78 | intel_i2c_quirk_set(intel_encoder->base.dev, false); | 80 | intel_i2c_quirk_set(connector->dev, false); |
79 | if (edid) { | 81 | if (edid) { |
80 | drm_mode_connector_update_edid_property(&intel_encoder->base, | 82 | drm_mode_connector_update_edid_property(connector, edid); |
81 | edid); | 83 | ret = drm_add_edid_modes(connector, edid); |
82 | ret = drm_add_edid_modes(&intel_encoder->base, edid); | 84 | connector->display_info.raw_edid = NULL; |
83 | intel_encoder->base.display_info.raw_edid = NULL; | ||
84 | kfree(edid); | 85 | kfree(edid); |
85 | } | 86 | } |
86 | 87 | ||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index a5b049f94915..097819c51a15 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -1729,7 +1729,7 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) | |||
1729 | int num_modes; | 1729 | int num_modes; |
1730 | 1730 | ||
1731 | /* set the bus switch and get the modes */ | 1731 | /* set the bus switch and get the modes */ |
1732 | num_modes = intel_ddc_get_modes(intel_encoder); | 1732 | num_modes = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
1733 | 1733 | ||
1734 | /* | 1734 | /* |
1735 | * Mac mini hack. On this device, the DVI-I connector shares one DDC | 1735 | * 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) | |||
1740 | if (num_modes == 0 && | 1740 | if (num_modes == 0 && |
1741 | sdvo_priv->analog_ddc_bus && | 1741 | sdvo_priv->analog_ddc_bus && |
1742 | !intel_analog_is_connected(intel_encoder->base.dev)) { | 1742 | !intel_analog_is_connected(intel_encoder->base.dev)) { |
1743 | struct i2c_adapter *digital_ddc_bus; | ||
1744 | |||
1745 | /* Switch to the analog ddc bus and try that | 1743 | /* Switch to the analog ddc bus and try that |
1746 | */ | 1744 | */ |
1747 | digital_ddc_bus = intel_encoder->ddc_bus; | 1745 | (void) intel_ddc_get_modes(connector, sdvo_priv->analog_ddc_bus); |
1748 | intel_encoder->ddc_bus = sdvo_priv->analog_ddc_bus; | ||
1749 | |||
1750 | (void) intel_ddc_get_modes(intel_encoder); | ||
1751 | |||
1752 | intel_encoder->ddc_bus = digital_ddc_bus; | ||
1753 | } | 1746 | } |
1754 | } | 1747 | } |
1755 | 1748 | ||
@@ -1872,7 +1865,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) | |||
1872 | * Assume that the preferred modes are | 1865 | * Assume that the preferred modes are |
1873 | * arranged in priority order. | 1866 | * arranged in priority order. |
1874 | */ | 1867 | */ |
1875 | intel_ddc_get_modes(intel_encoder); | 1868 | intel_ddc_get_modes(connector, intel_encoder->ddc_bus); |
1876 | if (list_empty(&connector->probed_modes) == false) | 1869 | if (list_empty(&connector->probed_modes) == false) |
1877 | goto end; | 1870 | goto end; |
1878 | 1871 | ||