[Intel-gfx] [PATCH V5] drm/i915: sdvo read edid-extensions by i2c bus

Ma, Ling ling.ma at intel.com
Fri May 22 03:31:50 CEST 2009


Hi Eric,
Any coments ?

Thanks
Ma LIng 

>-----Original Message-----
>From: intel-gfx-bounces at lists.freedesktop.org 
>[mailto:intel-gfx-bounces at lists.freedesktop.org] On Behalf Of Ma Ling
>Sent: Monday, May 18, 2009 4:13 PM
>To: intel-gfx at lists.freedesktop.org
>Subject: [Intel-gfx] [PATCH V5] drm/i915: sdvo read 
>edid-extensions by i2c bus
>
>Currently drm_get_edid function will fetch basic edid, then
>determine to continue edid extensions by edid->extensions field.
>However for sdvo output, after first i2c_stop of drm_get_edid function
>we have to do switch ddc bus for following edid extensions, or i2c will
>fail to work. The patch intends to wrap master_xfer function, 
>and switch bus dynamically to get edid extension.
>    
>   It fixed freedesktop.org bug #21042
>
>Signed-off-by: Ma Ling <ling.ma at intel.com>
>---
>in this version do some clean up for commit comments
>
> drivers/gpu/drm/i915/intel_sdvo.c |   65 
>++++++++++++++++++++++++++++++++++--
> 1 files changed, 61 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/intel_sdvo.c 
>b/drivers/gpu/drm/i915/intel_sdvo.c
>index 9913651..01dd9d2 100644
>--- a/drivers/gpu/drm/i915/intel_sdvo.c
>+++ b/drivers/gpu/drm/i915/intel_sdvo.c
>@@ -1398,10 +1398,8 @@ static enum drm_connector_status 
>intel_sdvo_detect(struct drm_connector *connect
> static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
> {
> 	struct intel_output *intel_output = to_intel_output(connector);
>-	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
> 
> 	/* set the bus switch and get the modes */
>-	intel_sdvo_set_control_bus_switch(intel_output, 
>sdvo_priv->ddc_bus);
> 	intel_ddc_get_modes(intel_output);
> 
> #if 0
>@@ -1564,6 +1562,9 @@ static void intel_sdvo_destroy(struct 
>drm_connector *connector)
> 
> 	if (intel_output->i2c_bus)
> 		intel_i2c_destroy(intel_output->i2c_bus);
>+	if (intel_output->ddc_bus)
>+		intel_i2c_destroy(intel_output->ddc_bus);
>+
> 	drm_sysfs_connector_remove(connector);
> 	drm_connector_cleanup(connector);
> 	kfree(intel_output);
>@@ -1660,12 +1661,56 @@ 
>intel_sdvo_get_digital_encoding_mode(struct intel_output *output)
> 	return true;
> }
> 
>+static struct intel_output *
>+intel_sdvo_chan_to_intel_output(struct intel_i2c_chan *chan)
>+{
>+	struct drm_device *dev = chan->drm_dev;
>+	struct drm_connector *connector;
>+	struct intel_output *intel_output = NULL;
>+
>+	list_for_each_entry(connector,
>+			&dev->mode_config.connector_list, head) {
>+		if (to_intel_output(connector)->ddc_bus == chan) {
>+			intel_output = to_intel_output(connector);
>+			break;
>+		}
>+	}
>+	return intel_output;
>+}
>+
>+static int intel_sdvo_master_xfer(struct i2c_adapter *i2c_adap,
>+				  struct i2c_msg msgs[], int num)
>+{
>+	struct intel_output *intel_output;
>+	struct intel_sdvo_priv *sdvo_priv;
>+	struct i2c_algo_bit_data *algo_data;
>+	struct i2c_algorithm *algo;
>+
>+	algo_data = (struct i2c_algo_bit_data *)i2c_adap->algo_data;
>+	intel_output =
>+		intel_sdvo_chan_to_intel_output(
>+				(struct intel_i2c_chan 
>*)(algo_data->data));
>+	if (intel_output == NULL)
>+		return -EINVAL;
>+
>+	sdvo_priv = intel_output->dev_priv;
>+	algo = (struct i2c_algorithm 
>*)intel_output->i2c_bus->adapter.algo;
>+
>+	intel_sdvo_set_control_bus_switch(intel_output, 
>sdvo_priv->ddc_bus);
>+	return algo->master_xfer(i2c_adap, msgs, num);
>+}
>+
>+static struct i2c_algorithm intel_sdvo_i2c_bit_algo = {
>+	.master_xfer	= intel_sdvo_master_xfer,
>+};
>+
> bool intel_sdvo_init(struct drm_device *dev, int output_device)
> {
> 	struct drm_connector *connector;
> 	struct intel_output *intel_output;
> 	struct intel_sdvo_priv *sdvo_priv;
> 	struct intel_i2c_chan *i2cbus = NULL;
>+	struct intel_i2c_chan *ddcbus = NULL;
> 	int connector_type;
> 	u8 ch[0x40];
> 	int i;
>@@ -1720,6 +1765,20 @@ bool intel_sdvo_init(struct drm_device 
>*dev, int output_device)
> 		}
> 	}
> 
>+	/* setup the DDC bus. */
>+	if (output_device == SDVOB)
>+		ddcbus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS");
>+	else
>+		ddcbus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS");
>+
>+	if (ddcbus == NULL)
>+		goto err_i2c;
>+
>+	intel_sdvo_i2c_bit_algo.functionality =
>+		intel_output->i2c_bus->adapter.algo->functionality;
>+	ddcbus->adapter.algo = &intel_sdvo_i2c_bit_algo;
>+	intel_output->ddc_bus = ddcbus;
>+
> 	intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps);
> 
> 	if (sdvo_priv->caps.output_flags &
>@@ -1829,8 +1888,6 @@ bool intel_sdvo_init(struct drm_device 
>*dev, int output_device)
> 		  sdvo_priv->caps.output_flags &
> 			(SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) 
>? 'Y' : 'N');
> 
>-	intel_output->ddc_bus = i2cbus;
>-
> 	return true;
> 
> err_i2c:
>-- 
>1.5.4.4
>
>
>
>_______________________________________________
>Intel-gfx mailing list
>Intel-gfx at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>


More information about the Intel-gfx mailing list