diff options
| -rw-r--r-- | linux-core/drm_sysfs.c | 1 | ||||
| -rw-r--r-- | linux-core/nv50_display.c | 6 | ||||
| -rw-r--r-- | linux-core/nv50_kms_wrapper.c | 3 | ||||
| -rw-r--r-- | shared-core/nouveau_irq.c | 11 | ||||
| -rw-r--r-- | shared-core/nouveau_reg.h | 2 | 
5 files changed, 18 insertions, 5 deletions
| diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c index 5c384a60..3b217342 100644 --- a/linux-core/drm_sysfs.c +++ b/linux-core/drm_sysfs.c @@ -450,6 +450,7 @@ void drm_sysfs_hotplug_event(struct drm_device *dev)  	kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, envp);  } +EXPORT_SYMBOL(drm_sysfs_hotplug_event);  static struct device_attribute dri_attrs[] = {  	__ATTR(dri_library_name, S_IRUGO, show_dri, NULL), diff --git a/linux-core/nv50_display.c b/linux-core/nv50_display.c index eeaa0e68..6665a32f 100644 --- a/linux-core/nv50_display.c +++ b/linux-core/nv50_display.c @@ -125,6 +125,9 @@ static int nv50_display_init(struct nv50_display *display)  	/* enable clock change interrupts. */  	NV_WRITE(NV50_PDISPLAY_SUPERVISOR_INTR, NV_READ(NV50_PDISPLAY_SUPERVISOR_INTR) | 0x70); +	/* enable hotplug interrupts */ +	NV_WRITE(NV50_PCONNECTOR_HOTPLUG_INTR, 0x7FFF7FFF); +  	display->init_done = true;  	return 0; @@ -171,6 +174,9 @@ static int nv50_display_disable(struct nv50_display *display)  	/* disable clock change interrupts. */  	NV_WRITE(NV50_PDISPLAY_SUPERVISOR_INTR, NV_READ(NV50_PDISPLAY_SUPERVISOR_INTR) & ~0x70); +	/* disable hotplug interrupts */ +	NV_WRITE(NV50_PCONNECTOR_HOTPLUG_INTR, 0); +  	display->init_done = false;  	return 0; diff --git a/linux-core/nv50_kms_wrapper.c b/linux-core/nv50_kms_wrapper.c index 8ae72f48..1320e5ed 100644 --- a/linux-core/nv50_kms_wrapper.c +++ b/linux-core/nv50_kms_wrapper.c @@ -970,6 +970,9 @@ static enum drm_connector_status nv50_kms_connector_detect(struct drm_connector  		/* notify fb of changes */  		dev->mode_config.funcs->fb_changed(dev); + +		/* sent a hotplug event when appropriate. */ +		drm_sysfs_hotplug_event(dev);  	}  	return drm_connector->status; diff --git a/shared-core/nouveau_irq.c b/shared-core/nouveau_irq.c index 4c46da8d..48872622 100644 --- a/shared-core/nouveau_irq.c +++ b/shared-core/nouveau_irq.c @@ -41,6 +41,8 @@  #include "nv50_display.h"  #include "nv50_crtc.h"  #include "nv50_output.h" +/* needed for hotplug irq */ +#include "nv50_kms_wrapper.h"  void  nouveau_irq_preinstall(struct drm_device *dev) @@ -510,7 +512,7 @@ nouveau_nv50_display_irq_handler(struct drm_device *dev)  	struct drm_nouveau_private *dev_priv = dev->dev_private;  	uint32_t val = NV_READ(NV50_PDISPLAY_SUPERVISOR); -	DRM_INFO("NV50_DISPLAY_INTR - 0x%08X\n", val); +	DRM_INFO("NV50_PDISPLAY_SUPERVISOR - 0x%08X\n", val);  	/* vblank interrupts */  	if (val & NV50_PDISPLAY_SUPERVISOR_CRTCn) { @@ -591,10 +593,13 @@ nouveau_nv50_i2c_irq_handler(struct drm_device *dev)  {  	struct drm_nouveau_private *dev_priv = dev->dev_private; -	DRM_INFO("NV50_I2C_INTR - 0x%08X\n", NV_READ(NV50_I2C_CONTROLLER)); +	DRM_INFO("NV50_PCONNECTOR_HOTPLUG_CTRL - 0x%08X\n", NV_READ(NV50_PCONNECTOR_HOTPLUG_CTRL));  	/* This seems to be the way to acknowledge an interrupt. */ -	NV_WRITE(NV50_I2C_CONTROLLER, 0x7FFF7FFF); +	NV_WRITE(NV50_PCONNECTOR_HOTPLUG_CTRL, 0x7FFF7FFF); + +	/* Do a "dumb" detect all */ +	nv50_kms_connector_detect_all(dev);  }  irqreturn_t diff --git a/shared-core/nouveau_reg.h b/shared-core/nouveau_reg.h index 6ed23e26..091c22c4 100644 --- a/shared-core/nouveau_reg.h +++ b/shared-core/nouveau_reg.h @@ -128,8 +128,6 @@  #define NV04_PTIMER_TIME_1                                 0x00009410  #define NV04_PTIMER_ALARM_0                                0x00009420 -#define NV50_I2C_CONTROLLER                           0x0000E054 -  #define NV04_PFB_CFG0                                      0x00100200  #define NV04_PFB_CFG1                                      0x00100204  #define NV40_PFB_020C                                      0x0010020C | 
