diff options
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_display.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv04_display.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 17 |
3 files changed, 18 insertions, 27 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index b186174fa72..3cb52bc52b2 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include "nouveau_crtc.h" | 33 | #include "nouveau_crtc.h" |
34 | #include "nouveau_dma.h" | 34 | #include "nouveau_dma.h" |
35 | #include "nouveau_connector.h" | 35 | #include "nouveau_connector.h" |
36 | #include "nouveau_gpio.h" | ||
36 | #include "nv50_display.h" | 37 | #include "nv50_display.h" |
37 | 38 | ||
38 | static void | 39 | static void |
@@ -211,11 +212,19 @@ nouveau_display_init(struct drm_device *dev) | |||
211 | { | 212 | { |
212 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 213 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
213 | struct nouveau_display_engine *disp = &dev_priv->engine.display; | 214 | struct nouveau_display_engine *disp = &dev_priv->engine.display; |
215 | struct drm_connector *connector; | ||
214 | int ret; | 216 | int ret; |
215 | 217 | ||
216 | ret = disp->init(dev); | 218 | ret = disp->init(dev); |
217 | if (ret == 0) { | 219 | if (ret) |
218 | drm_kms_helper_poll_enable(dev); | 220 | return ret; |
221 | |||
222 | drm_kms_helper_poll_enable(dev); | ||
223 | |||
224 | /* enable hotplug interrupts */ | ||
225 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
226 | struct nouveau_connector *conn = nouveau_connector(connector); | ||
227 | nouveau_gpio_irq(dev, 0, conn->hpd, 0xff, true); | ||
219 | } | 228 | } |
220 | 229 | ||
221 | return ret; | 230 | return ret; |
@@ -226,6 +235,13 @@ nouveau_display_fini(struct drm_device *dev) | |||
226 | { | 235 | { |
227 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 236 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
228 | struct nouveau_display_engine *disp = &dev_priv->engine.display; | 237 | struct nouveau_display_engine *disp = &dev_priv->engine.display; |
238 | struct drm_connector *connector; | ||
239 | |||
240 | /* disable hotplug interrupts */ | ||
241 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
242 | struct nouveau_connector *conn = nouveau_connector(connector); | ||
243 | nouveau_gpio_irq(dev, 0, conn->hpd, 0xff, false); | ||
244 | } | ||
229 | 245 | ||
230 | drm_kms_helper_poll_disable(dev); | 246 | drm_kms_helper_poll_disable(dev); |
231 | disp->fini(dev); | 247 | disp->fini(dev); |
diff --git a/drivers/gpu/drm/nouveau/nv04_display.c b/drivers/gpu/drm/nouveau/nv04_display.c index 15b748f0ea4..7047d37e8da 100644 --- a/drivers/gpu/drm/nouveau/nv04_display.c +++ b/drivers/gpu/drm/nouveau/nv04_display.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include "nouveau_hw.h" | 31 | #include "nouveau_hw.h" |
32 | #include "nouveau_encoder.h" | 32 | #include "nouveau_encoder.h" |
33 | #include "nouveau_connector.h" | 33 | #include "nouveau_connector.h" |
34 | #include "nouveau_gpio.h" | ||
35 | 34 | ||
36 | static void nv04_vblank_crtc0_isr(struct drm_device *); | 35 | static void nv04_vblank_crtc0_isr(struct drm_device *); |
37 | static void nv04_vblank_crtc1_isr(struct drm_device *); | 36 | static void nv04_vblank_crtc1_isr(struct drm_device *); |
@@ -221,7 +220,6 @@ nv04_display_destroy(struct drm_device *dev) | |||
221 | int | 220 | int |
222 | nv04_display_init(struct drm_device *dev) | 221 | nv04_display_init(struct drm_device *dev) |
223 | { | 222 | { |
224 | struct drm_connector *connector; | ||
225 | struct drm_encoder *encoder; | 223 | struct drm_encoder *encoder; |
226 | struct drm_crtc *crtc; | 224 | struct drm_crtc *crtc; |
227 | 225 | ||
@@ -242,12 +240,6 @@ nv04_display_init(struct drm_device *dev) | |||
242 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | 240 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) |
243 | crtc->funcs->restore(crtc); | 241 | crtc->funcs->restore(crtc); |
244 | 242 | ||
245 | /* enable hotplug interrupts */ | ||
246 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
247 | struct nouveau_connector *conn = nouveau_connector(connector); | ||
248 | nouveau_gpio_irq(dev, 0, conn->hpd, 0xff, true); | ||
249 | } | ||
250 | |||
251 | return 0; | 243 | return 0; |
252 | } | 244 | } |
253 | 245 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index f408e105a0c..7ba28e08ee3 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include "nouveau_fb.h" | 32 | #include "nouveau_fb.h" |
33 | #include "nouveau_fbcon.h" | 33 | #include "nouveau_fbcon.h" |
34 | #include "nouveau_ramht.h" | 34 | #include "nouveau_ramht.h" |
35 | #include "nouveau_gpio.h" | ||
36 | #include "drm_crtc_helper.h" | 35 | #include "drm_crtc_helper.h" |
37 | 36 | ||
38 | static void nv50_display_isr(struct drm_device *); | 37 | static void nv50_display_isr(struct drm_device *); |
@@ -141,7 +140,6 @@ nv50_display_sync(struct drm_device *dev) | |||
141 | int | 140 | int |
142 | nv50_display_init(struct drm_device *dev) | 141 | nv50_display_init(struct drm_device *dev) |
143 | { | 142 | { |
144 | struct drm_connector *connector; | ||
145 | struct nouveau_channel *evo; | 143 | struct nouveau_channel *evo; |
146 | int ret, i; | 144 | int ret, i; |
147 | u32 val; | 145 | u32 val; |
@@ -236,12 +234,6 @@ nv50_display_init(struct drm_device *dev) | |||
236 | NV50_PDISPLAY_INTR_EN_1_CLK_UNK20 | | 234 | NV50_PDISPLAY_INTR_EN_1_CLK_UNK20 | |
237 | NV50_PDISPLAY_INTR_EN_1_CLK_UNK40); | 235 | NV50_PDISPLAY_INTR_EN_1_CLK_UNK40); |
238 | 236 | ||
239 | /* enable hotplug interrupts */ | ||
240 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
241 | struct nouveau_connector *conn = nouveau_connector(connector); | ||
242 | nouveau_gpio_irq(dev, 0, conn->hpd, 0xff, true); | ||
243 | } | ||
244 | |||
245 | ret = nv50_evo_init(dev); | 237 | ret = nv50_evo_init(dev); |
246 | if (ret) | 238 | if (ret) |
247 | return ret; | 239 | return ret; |
@@ -262,7 +254,6 @@ nv50_display_init(struct drm_device *dev) | |||
262 | void | 254 | void |
263 | nv50_display_fini(struct drm_device *dev) | 255 | nv50_display_fini(struct drm_device *dev) |
264 | { | 256 | { |
265 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
266 | struct nv50_display *disp = nv50_display(dev); | 257 | struct nv50_display *disp = nv50_display(dev); |
267 | struct nouveau_channel *evo = disp->master; | 258 | struct nouveau_channel *evo = disp->master; |
268 | struct drm_crtc *drm_crtc; | 259 | struct drm_crtc *drm_crtc; |
@@ -325,14 +316,6 @@ nv50_display_fini(struct drm_device *dev) | |||
325 | 316 | ||
326 | /* disable interrupts. */ | 317 | /* disable interrupts. */ |
327 | nv_wr32(dev, NV50_PDISPLAY_INTR_EN_1, 0x00000000); | 318 | nv_wr32(dev, NV50_PDISPLAY_INTR_EN_1, 0x00000000); |
328 | |||
329 | /* disable hotplug interrupts */ | ||
330 | nv_wr32(dev, 0xe054, 0xffffffff); | ||
331 | nv_wr32(dev, 0xe050, 0x00000000); | ||
332 | if (dev_priv->chipset >= 0x90) { | ||
333 | nv_wr32(dev, 0xe074, 0xffffffff); | ||
334 | nv_wr32(dev, 0xe070, 0x00000000); | ||
335 | } | ||
336 | } | 319 | } |
337 | 320 | ||
338 | int | 321 | int |