@@ -465,7 +465,8 @@ nouveau_display_hpd_work(struct work_struct *work)
465
465
struct drm_connector * connector ;
466
466
struct drm_connector_list_iter conn_iter ;
467
467
u32 pending ;
468
- bool changed = false;
468
+ int changed = 0 ;
469
+ struct drm_connector * first_changed_connector = NULL ;
469
470
470
471
pm_runtime_get_sync (dev -> dev );
471
472
@@ -509,7 +510,12 @@ nouveau_display_hpd_work(struct work_struct *work)
509
510
if (old_epoch_counter == connector -> epoch_counter )
510
511
continue ;
511
512
512
- changed = true;
513
+ changed ++ ;
514
+ if (!first_changed_connector ) {
515
+ drm_connector_get (connector );
516
+ first_changed_connector = connector ;
517
+ }
518
+
513
519
drm_dbg_kms (dev , "[CONNECTOR:%d:%s] status updated from %s to %s (epoch counter %llu->%llu)\n" ,
514
520
connector -> base .id , connector -> name ,
515
521
drm_get_connector_status_name (old_status ),
@@ -520,9 +526,14 @@ nouveau_display_hpd_work(struct work_struct *work)
520
526
drm_connector_list_iter_end (& conn_iter );
521
527
mutex_unlock (& dev -> mode_config .mutex );
522
528
523
- if (changed )
529
+ if (changed == 1 )
530
+ drm_kms_helper_connector_hotplug_event (first_changed_connector );
531
+ else if (changed > 0 )
524
532
drm_kms_helper_hotplug_event (dev );
525
533
534
+ if (first_changed_connector )
535
+ drm_connector_put (first_changed_connector );
536
+
526
537
pm_runtime_mark_last_busy (drm -> dev -> dev );
527
538
noop :
528
539
pm_runtime_put_autosuspend (dev -> dev );
0 commit comments