diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_modes.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_modes.c | 106 | 
1 files changed, 76 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c index f70b7cf32bf..0e860f39933 100644 --- a/drivers/gpu/drm/i915/intel_modes.c +++ b/drivers/gpu/drm/i915/intel_modes.c @@ -26,35 +26,26 @@  #include <linux/slab.h>  #include <linux/i2c.h>  #include <linux/fb.h> -#include "drmP.h" +#include <drm/drm_edid.h> +#include <drm/drmP.h>  #include "intel_drv.h"  #include "i915_drv.h"  /** - * intel_ddc_probe - * + * intel_connector_update_modes - update connector from edid + * @connector: DRM connector device to use + * @edid: previously read EDID information   */ -bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus) +int intel_connector_update_modes(struct drm_connector *connector, +				struct edid *edid)  { -	struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private; -	u8 out_buf[] = { 0x0, 0x0}; -	u8 buf[2]; -	struct i2c_msg msgs[] = { -		{ -			.addr = 0x50, -			.flags = 0, -			.len = 1, -			.buf = out_buf, -		}, -		{ -			.addr = 0x50, -			.flags = I2C_M_RD, -			.len = 1, -			.buf = buf, -		} -	}; - -	return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 2) == 2; +	int ret; + +	drm_mode_connector_update_edid_property(connector, edid); +	ret = drm_add_edid_modes(connector, edid); +	drm_edid_to_eld(connector, edid); + +	return ret;  }  /** @@ -68,15 +59,70 @@ int intel_ddc_get_modes(struct drm_connector *connector,  			struct i2c_adapter *adapter)  {  	struct edid *edid; -	int ret = 0; +	int ret;  	edid = drm_get_edid(connector, adapter); -	if (edid) { -		drm_mode_connector_update_edid_property(connector, edid); -		ret = drm_add_edid_modes(connector, edid); -		connector->display_info.raw_edid = NULL; -		kfree(edid); -	} +	if (!edid) +		return 0; + +	ret = intel_connector_update_modes(connector, edid); +	kfree(edid);  	return ret;  } + +static const struct drm_prop_enum_list force_audio_names[] = { +	{ HDMI_AUDIO_OFF_DVI, "force-dvi" }, +	{ HDMI_AUDIO_OFF, "off" }, +	{ HDMI_AUDIO_AUTO, "auto" }, +	{ HDMI_AUDIO_ON, "on" }, +}; + +void +intel_attach_force_audio_property(struct drm_connector *connector) +{ +	struct drm_device *dev = connector->dev; +	struct drm_i915_private *dev_priv = dev->dev_private; +	struct drm_property *prop; + +	prop = dev_priv->force_audio_property; +	if (prop == NULL) { +		prop = drm_property_create_enum(dev, 0, +					   "audio", +					   force_audio_names, +					   ARRAY_SIZE(force_audio_names)); +		if (prop == NULL) +			return; + +		dev_priv->force_audio_property = prop; +	} +	drm_object_attach_property(&connector->base, prop, 0); +} + +static const struct drm_prop_enum_list broadcast_rgb_names[] = { +	{ INTEL_BROADCAST_RGB_AUTO, "Automatic" }, +	{ INTEL_BROADCAST_RGB_FULL, "Full" }, +	{ INTEL_BROADCAST_RGB_LIMITED, "Limited 16:235" }, +}; + +void +intel_attach_broadcast_rgb_property(struct drm_connector *connector) +{ +	struct drm_device *dev = connector->dev; +	struct drm_i915_private *dev_priv = dev->dev_private; +	struct drm_property *prop; + +	prop = dev_priv->broadcast_rgb_property; +	if (prop == NULL) { +		prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, +					   "Broadcast RGB", +					   broadcast_rgb_names, +					   ARRAY_SIZE(broadcast_rgb_names)); +		if (prop == NULL) +			return; + +		dev_priv->broadcast_rgb_property = prop; +	} + +	drm_object_attach_property(&connector->base, prop, 0); +}  | 
