@@ -81,20 +81,29 @@ nvkm_uconn_uevent(struct nvkm_object *object, void *argv, u32 argc, struct nvkm_
81
81
return - ENOSYS ;
82
82
83
83
list_for_each_entry (outp , & conn -> disp -> outps , head ) {
84
- if (outp -> info .connector == conn -> index && outp -> dp .aux ) {
85
- if (args -> v0 .types & NVIF_CONN_EVENT_V0_PLUG ) bits |= NVKM_I2C_PLUG ;
86
- if (args -> v0 .types & NVIF_CONN_EVENT_V0_UNPLUG ) bits |= NVKM_I2C_UNPLUG ;
87
- if (args -> v0 .types & NVIF_CONN_EVENT_V0_IRQ ) bits |= NVKM_I2C_IRQ ;
84
+ if (outp -> info .connector == conn -> index )
85
+ break ;
86
+ }
88
87
89
- return nvkm_uevent_add (uevent , & device -> i2c -> event , outp -> dp .aux -> id , bits ,
90
- nvkm_uconn_uevent_aux );
91
- }
88
+ if (& outp -> head == & conn -> disp -> outps )
89
+ return - EINVAL ;
90
+
91
+ if (outp -> dp .aux && !outp -> info .location ) {
92
+ if (args -> v0 .types & NVIF_CONN_EVENT_V0_PLUG ) bits |= NVKM_I2C_PLUG ;
93
+ if (args -> v0 .types & NVIF_CONN_EVENT_V0_UNPLUG ) bits |= NVKM_I2C_UNPLUG ;
94
+ if (args -> v0 .types & NVIF_CONN_EVENT_V0_IRQ ) bits |= NVKM_I2C_IRQ ;
95
+
96
+ return nvkm_uevent_add (uevent , & device -> i2c -> event , outp -> dp .aux -> id , bits ,
97
+ nvkm_uconn_uevent_aux );
92
98
}
93
99
94
100
if (args -> v0 .types & NVIF_CONN_EVENT_V0_PLUG ) bits |= NVKM_GPIO_HI ;
95
101
if (args -> v0 .types & NVIF_CONN_EVENT_V0_UNPLUG ) bits |= NVKM_GPIO_LO ;
96
- if (args -> v0 .types & NVIF_CONN_EVENT_V0_IRQ )
97
- return - EINVAL ;
102
+ if (args -> v0 .types & NVIF_CONN_EVENT_V0_IRQ ) {
103
+ /* TODO: support DP IRQ on ANX9805 and remove this hack. */
104
+ if (!outp -> info .location )
105
+ return - EINVAL ;
106
+ }
98
107
99
108
return nvkm_uevent_add (uevent , & device -> gpio -> event , conn -> info .hpd , bits ,
100
109
nvkm_uconn_uevent_gpio );
0 commit comments