diff options
author | ling.ma@intel.com <ling.ma@intel.com> | 2009-06-30 11:35:34 +0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-07-07 11:04:22 -0700 |
commit | 8e4d36b993898b344f9176147f1dfeca583f81fd (patch) | |
tree | 358f1e1f7fbbfb635be763119457fed547887db3 /drivers | |
parent | 22bd50c5b9aaf46476cade52c4ae9afa21c44e15 (diff) | |
download | kernel-crypto-8e4d36b993898b344f9176147f1dfeca583f81fd.tar.gz kernel-crypto-8e4d36b993898b344f9176147f1dfeca583f81fd.tar.xz kernel-crypto-8e4d36b993898b344f9176147f1dfeca583f81fd.zip |
drm/i915: crt fetch EDID by DVI-I converter on G4x platform
Usually crt mainly get modes via GPIOA ports.
However on G4X platform we need to probe possible
ports for DVI-I, which could be wired to GPIOD,
then fetch our desired EDID, i.e on DG45ID platform
we successfully fetch EDID by GPIOD port.
It fixed freedesktop.org bug #21084
Signed-off-by: Ma Ling <ling.ma@intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 6de97fc6602..af26028c251 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -428,8 +428,34 @@ static void intel_crt_destroy(struct drm_connector *connector) static int intel_crt_get_modes(struct drm_connector *connector) { + int ret; struct intel_output *intel_output = to_intel_output(connector); - return intel_ddc_get_modes(intel_output); + struct intel_i2c_chan *ddcbus; + struct drm_device *dev = connector->dev; + + + ret = intel_ddc_get_modes(intel_output); + if (ret || !IS_G4X(dev)) + goto end; + + ddcbus = intel_output->ddc_bus; + /* Try to probe digital port for output in DVI-I -> VGA mode. */ + intel_output->ddc_bus = + intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D"); + + if (!intel_output->ddc_bus) { + intel_output->ddc_bus = ddcbus; + dev_printk(KERN_ERR, &connector->dev->pdev->dev, + "DDC bus registration failed for CRTDDC_D.\n"); + goto end; + } + /* Try to get modes by GPIOD port */ + ret = intel_ddc_get_modes(intel_output); + intel_i2c_destroy(ddcbus); + +end: + return ret; + } static int intel_crt_set_property(struct drm_connector *connector, |