diff options
| author | Maarten Maathuis <madman2003@gmail.com> | 2008-07-21 14:29:13 +0200 | 
|---|---|---|
| committer | Maarten Maathuis <madman2003@gmail.com> | 2008-07-21 14:29:13 +0200 | 
| commit | d00644c27ddc7023ea0e442c7be6b67d9d0da047 (patch) | |
| tree | 2070bd02da5ac008bc8f9c70790722109f3ad94c /linux-core/nv50_connector.c | |
| parent | 685bca02fe6b7406bb157a1a4e0f147b47ba28f8 (diff) | |
NV50: Do detect with hpd and load detect if possible.
- Appropriate error messages when an unknown situation is encountered are included.
- Fallback to i2c will occur when needed.
Diffstat (limited to 'linux-core/nv50_connector.c')
| -rw-r--r-- | linux-core/nv50_connector.c | 49 | 
1 files changed, 43 insertions, 6 deletions
| diff --git a/linux-core/nv50_connector.c b/linux-core/nv50_connector.c index 309f450c..6e5fb912 100644 --- a/linux-core/nv50_connector.c +++ b/linux-core/nv50_connector.c @@ -76,7 +76,45 @@ static struct nv50_output *nv50_connector_to_output(struct nv50_connector *conne  	return NULL;  } -static bool nv50_connector_detect(struct nv50_connector *connector) +static int nv50_connector_hpd_detect(struct nv50_connector *connector) +{ +	struct drm_nouveau_private *dev_priv = connector->dev->dev_private; +	struct nv50_output *output = NULL; +	bool present = 0; +	uint32_t reg = 0; + +	/* Assume connected for the moment. */ +	if (connector->type == CONNECTOR_LVDS) { +		NV50_DEBUG("LVDS is defaulting to connected for the moment.\n"); +		return 1; +	} + +	/* No i2c port, no idea what to do for hotplug. */ +	if (connector->i2c_chan->index == 15) { +		DRM_ERROR("You have a non-LVDS SOR with no i2c port, please report\n"); +		return -EINVAL; +	} + +	if (connector->i2c_chan->index > 3) { +		DRM_ERROR("You have an unusual configuration, index is %d\n", connector->i2c_chan->index); +		DRM_ERROR("Please report.\n"); +		return -EINVAL; +	} + +	/* Check hotplug pins. */ +	reg = NV_READ(NV50_PCONNECTOR_HOTPLUG_STATE); +	if (reg & (NV50_PCONNECTOR_HOTPLUG_STATE_PIN_CONNECTED_I2C0 << (4 * connector->i2c_chan->index))) +		present = 1; + +	if (present) +		NV50_DEBUG("Hotplug detect returned positive for bus %d\n", connector->bus); +	else +		NV50_DEBUG("Hotplug detect returned negative for bus %d\n", connector->bus); + +	return present; +} + +static int nv50_connector_i2c_detect(struct nv50_connector *connector)  {  	/* kindly borrrowed from the intel driver, hope it works. */  	uint8_t out_buf[] = { 0x0, 0x0}; @@ -97,13 +135,11 @@ static bool nv50_connector_detect(struct nv50_connector *connector)  		}  	}; -	NV50_DEBUG("\n"); -  	if (!connector->i2c_chan) -		return false; +		return -EINVAL;  	ret = i2c_transfer(&connector->i2c_chan->adapter, msgs, 2); -	DRM_INFO("I2C detect returned %d\n", ret); +	NV50_DEBUG("I2C detect returned %d\n", ret);  	if (ret == 2)  		return true; @@ -195,7 +231,8 @@ int nv50_connector_create(struct drm_device *dev, int bus, int i2c_index, int ty  		connector->i2c_chan = nv50_i2c_channel_create(dev, i2c_index);  	/* set function pointers */ -	connector->detect = nv50_connector_detect; +	connector->hpd_detect = nv50_connector_hpd_detect; +	connector->i2c_detect = nv50_connector_i2c_detect;  	connector->destroy = nv50_connector_destroy;  	connector->to_output = nv50_connector_to_output; | 
