diff options
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 79 | 
1 files changed, 6 insertions, 73 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index ca9c6165671..801a0d0e081 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -289,6 +289,11 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,  	struct drm_display_mode *mode;  	struct detailed_pixel_timing *pt = &timing->data.pixel_data; +	/* ignore tiny modes */ +	if (((pt->hactive_hi << 8) | pt->hactive_lo) < 64 || +	    ((pt->vactive_hi << 8) | pt->hactive_lo) < 64) +		return NULL; +  	if (pt->stereo) {  		printk(KERN_WARNING "stereo mode not supported\n");  		return NULL; @@ -584,85 +589,13 @@ int drm_do_probe_ddc_edid(struct i2c_adapter *adapter,  }  EXPORT_SYMBOL(drm_do_probe_ddc_edid); -/** - * Get EDID information. - * - * \param adapter : i2c device adaptor. - * \param buf     : EDID data buffer to be filled - * \param len     : EDID data buffer length - * \return 0 on success or -1 on failure. - * - * Initialize DDC, then fetch EDID information - * by calling drm_do_probe_ddc_edid function. - */ -static int drm_ddc_read(struct i2c_adapter *adapter, -			unsigned char *buf, int len) -{ -	struct i2c_algo_bit_data *algo_data = adapter->algo_data; -	int i, j; -	int ret = -1; - -	algo_data->setscl(algo_data->data, 1); - -	for (i = 0; i < 1; i++) { -		/* For some old monitors we need the -		 * following process to initialize/stop DDC -		 */ -		algo_data->setsda(algo_data->data, 1); -		msleep(13); - -		algo_data->setscl(algo_data->data, 1); -		for (j = 0; j < 5; j++) { -			msleep(10); -			if (algo_data->getscl(algo_data->data)) -				break; -		} -		if (j == 5) -			continue; - -		algo_data->setsda(algo_data->data, 0); -		msleep(15); -		algo_data->setscl(algo_data->data, 0); -		msleep(15); -		algo_data->setsda(algo_data->data, 1); -		msleep(15); - -		/* Do the real work */ -		ret = drm_do_probe_ddc_edid(adapter, buf, len); -		algo_data->setsda(algo_data->data, 0); -		algo_data->setscl(algo_data->data, 0); -		msleep(15); - -		algo_data->setscl(algo_data->data, 1); -		for (j = 0; j < 10; j++) { -			msleep(10); -			if (algo_data->getscl(algo_data->data)) -				break; -		} - -		algo_data->setsda(algo_data->data, 1); -		msleep(15); -		algo_data->setscl(algo_data->data, 0); -		algo_data->setsda(algo_data->data, 0); -		if (ret == 0) -			break; -	} -	/* Release the DDC lines when done or the Apple Cinema HD display -	 * will switch off -	 */ -	algo_data->setsda(algo_data->data, 1); -	algo_data->setscl(algo_data->data, 1); - -	return ret; -} -  static int drm_ddc_read_edid(struct drm_connector *connector,  			     struct i2c_adapter *adapter,  			     char *buf, int len)  {  	int ret; -	ret = drm_ddc_read(adapter, buf, len); +	ret = drm_do_probe_ddc_edid(adapter, buf, len);  	if (ret != 0) {  		dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n",  			 drm_get_connector_name(connector));  |