aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyuw@linux.intel.com>2010-03-30 02:39:31 -0400
committerEric Anholt <eric@anholt.net>2010-04-09 17:17:31 -0400
commit335af9a235a82842854b394507ab5e310d88be42 (patch)
treee4d05c21023b46e98082558cbb03db4968274348
parentc1c43977e6fc789cbde094303fa9ace629a35aca (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.c15
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c2
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c2
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c4
-rw-r--r--drivers/gpu/drm/i915/intel_modes.c21
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c13
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
459end: 456end:
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 {
165struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg, 165struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg,
166 const char *name); 166 const char *name);
167void intel_i2c_destroy(struct i2c_adapter *adapter); 167void intel_i2c_destroy(struct i2c_adapter *adapter);
168int intel_ddc_get_modes(struct intel_encoder *intel_encoder); 168int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
169extern bool intel_ddc_probe(struct intel_encoder *intel_encoder); 169extern bool intel_ddc_probe(struct intel_encoder *intel_encoder);
170void intel_i2c_quirk_set(struct drm_device *dev, bool enable); 170void intel_i2c_quirk_set(struct drm_device *dev, bool enable);
171void intel_i2c_reset_gmbus(struct drm_device *dev); 171void 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
185static void intel_hdmi_destroy(struct drm_connector *connector) 185static 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 */
71int intel_ddc_get_modes(struct intel_encoder *intel_encoder) 72int 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