diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2010-11-11 01:14:56 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2010-12-03 00:11:45 -0500 |
commit | fce2bad0ee2666d6a10bfeb634b1021469cc3d79 (patch) | |
tree | bc66c771c5c27dcd3b59135fb25c39c342ffed71 /drivers/gpu/drm/nouveau/nouveau_dp.c | |
parent | e4cbadcaaa4678020e37ca93502942ffdf9aef80 (diff) |
drm/nv50: rework PGPIO IRQ handling and hotplug detection
Allows callers to install their own handlers for when a GPIO line
changes state (such as for hotplug detect).
This also fixes a bug where we weren't acknowledging the GPIO IRQ
until after the bottom half had run, causing a severe IRQ storm
in some cases.
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_dp.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_dp.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c index 4562f309ae3d..38d599554bce 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dp.c +++ b/drivers/gpu/drm/nouveau/nouveau_dp.c | |||
@@ -279,7 +279,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder) | |||
279 | struct bit_displayport_encoder_table *dpe; | 279 | struct bit_displayport_encoder_table *dpe; |
280 | int dpe_headerlen; | 280 | int dpe_headerlen; |
281 | uint8_t config[4], status[3]; | 281 | uint8_t config[4], status[3]; |
282 | bool cr_done, cr_max_vs, eq_done; | 282 | bool cr_done, cr_max_vs, eq_done, hpd_state; |
283 | int ret = 0, i, tries, voltage; | 283 | int ret = 0, i, tries, voltage; |
284 | 284 | ||
285 | NV_DEBUG_KMS(dev, "link training!!\n"); | 285 | NV_DEBUG_KMS(dev, "link training!!\n"); |
@@ -297,7 +297,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder) | |||
297 | /* disable hotplug detect, this flips around on some panels during | 297 | /* disable hotplug detect, this flips around on some panels during |
298 | * link training. | 298 | * link training. |
299 | */ | 299 | */ |
300 | pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, false); | 300 | hpd_state = pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, false); |
301 | 301 | ||
302 | if (dpe->script0) { | 302 | if (dpe->script0) { |
303 | NV_DEBUG_KMS(dev, "SOR-%d: running DP script 0\n", nv_encoder->or); | 303 | NV_DEBUG_KMS(dev, "SOR-%d: running DP script 0\n", nv_encoder->or); |
@@ -439,7 +439,7 @@ stop: | |||
439 | } | 439 | } |
440 | 440 | ||
441 | /* re-enable hotplug detect */ | 441 | /* re-enable hotplug detect */ |
442 | pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, true); | 442 | pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, hpd_state); |
443 | 443 | ||
444 | return eq_done; | 444 | return eq_done; |
445 | } | 445 | } |