45
45
ST_CONNECT_PENDING ,
46
46
ST_CONNECTED ,
47
47
ST_DISCONNECT_PENDING ,
48
- ST_SUSPEND_PENDING ,
48
+ ST_DISPLAY_OFF ,
49
49
ST_SUSPENDED ,
50
50
};
51
51
@@ -504,7 +504,7 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
504
504
mutex_lock (& dp -> event_mutex );
505
505
506
506
state = dp -> hpd_state ;
507
- if (state == ST_SUSPEND_PENDING ) {
507
+ if (state == ST_DISPLAY_OFF || state == ST_SUSPENDED ) {
508
508
mutex_unlock (& dp -> event_mutex );
509
509
return 0 ;
510
510
}
@@ -526,14 +526,14 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
526
526
hpd -> hpd_high = 1 ;
527
527
528
528
ret = dp_display_usbpd_configure_cb (& dp -> pdev -> dev );
529
- if (ret ) { /* failed */
529
+ if (ret ) { /* link train failed */
530
530
hpd -> hpd_high = 0 ;
531
531
dp -> hpd_state = ST_DISCONNECTED ;
532
+ } else {
533
+ /* start sentinel checking in case of missing uevent */
534
+ dp_add_event (dp , EV_CONNECT_PENDING_TIMEOUT , 0 , tout );
532
535
}
533
536
534
- /* start sanity checking */
535
- dp_add_event (dp , EV_CONNECT_PENDING_TIMEOUT , 0 , tout );
536
-
537
537
mutex_unlock (& dp -> event_mutex );
538
538
539
539
/* uevent will complete connection part */
@@ -578,11 +578,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
578
578
mutex_lock (& dp -> event_mutex );
579
579
580
580
state = dp -> hpd_state ;
581
- if (state == ST_SUSPEND_PENDING ) {
582
- mutex_unlock (& dp -> event_mutex );
583
- return 0 ;
584
- }
585
-
586
581
if (state == ST_DISCONNECT_PENDING || state == ST_DISCONNECTED ) {
587
582
mutex_unlock (& dp -> event_mutex );
588
583
return 0 ;
@@ -609,7 +604,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
609
604
*/
610
605
dp_display_usbpd_disconnect_cb (& dp -> pdev -> dev );
611
606
612
- /* start sanity checking */
607
+ /* start sentinel checking in case of missing uevent */
613
608
dp_add_event (dp , EV_DISCONNECT_PENDING_TIMEOUT , 0 , DP_TIMEOUT_5_SECOND );
614
609
615
610
/* signal the disconnect event early to ensure proper teardown */
@@ -649,7 +644,7 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
649
644
650
645
/* irq_hpd can happen at either connected or disconnected state */
651
646
state = dp -> hpd_state ;
652
- if (state == ST_SUSPEND_PENDING ) {
647
+ if (state == ST_DISPLAY_OFF ) {
653
648
mutex_unlock (& dp -> event_mutex );
654
649
return 0 ;
655
650
}
@@ -1074,7 +1069,7 @@ static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)
1074
1069
}
1075
1070
1076
1071
if (hpd_isr_status & DP_DP_IRQ_HPD_INT_MASK ) {
1077
- /* delete connect pending event first */
1072
+ /* stop sentinel connect pending checking */
1078
1073
dp_del_event (dp , EV_CONNECT_PENDING_TIMEOUT );
1079
1074
dp_add_event (dp , EV_IRQ_HPD_INT , 0 , 0 );
1080
1075
}
@@ -1205,13 +1200,10 @@ static int dp_pm_resume(struct device *dev)
1205
1200
1206
1201
status = dp_catalog_hpd_get_state_status (dp -> catalog );
1207
1202
1208
- if (status ) {
1203
+ if (status )
1209
1204
dp -> dp_display .is_connected = true;
1210
- } else {
1205
+ else
1211
1206
dp -> dp_display .is_connected = false;
1212
- /* make sure next resume host_init be called */
1213
- dp -> core_initialized = false;
1214
- }
1215
1207
1216
1208
mutex_unlock (& dp -> event_mutex );
1217
1209
@@ -1233,6 +1225,9 @@ static int dp_pm_suspend(struct device *dev)
1233
1225
1234
1226
dp -> hpd_state = ST_SUSPENDED ;
1235
1227
1228
+ /* host_init will be called at pm_resume */
1229
+ dp -> core_initialized = false;
1230
+
1236
1231
mutex_unlock (& dp -> event_mutex );
1237
1232
1238
1233
return 0 ;
@@ -1362,6 +1357,7 @@ int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder)
1362
1357
1363
1358
mutex_lock (& dp_display -> event_mutex );
1364
1359
1360
+ /* stop sentinel checking */
1365
1361
dp_del_event (dp_display , EV_CONNECT_PENDING_TIMEOUT );
1366
1362
1367
1363
rc = dp_display_set_mode (dp , & dp_display -> dp_mode );
@@ -1380,7 +1376,7 @@ int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder)
1380
1376
1381
1377
state = dp_display -> hpd_state ;
1382
1378
1383
- if (state == ST_SUSPEND_PENDING )
1379
+ if (state == ST_DISPLAY_OFF )
1384
1380
dp_display_host_init (dp_display );
1385
1381
1386
1382
dp_display_enable (dp_display , 0 );
@@ -1392,7 +1388,8 @@ int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder)
1392
1388
dp_display_unprepare (dp );
1393
1389
}
1394
1390
1395
- if (state == ST_SUSPEND_PENDING )
1391
+ /* manual kick off plug event to train link */
1392
+ if (state == ST_DISPLAY_OFF )
1396
1393
dp_add_event (dp_display , EV_IRQ_HPD_INT , 0 , 0 );
1397
1394
1398
1395
/* completed connection */
@@ -1424,6 +1421,7 @@ int msm_dp_display_disable(struct msm_dp *dp, struct drm_encoder *encoder)
1424
1421
1425
1422
mutex_lock (& dp_display -> event_mutex );
1426
1423
1424
+ /* stop sentinel checking */
1427
1425
dp_del_event (dp_display , EV_DISCONNECT_PENDING_TIMEOUT );
1428
1426
1429
1427
dp_display_disable (dp_display , 0 );
@@ -1437,7 +1435,7 @@ int msm_dp_display_disable(struct msm_dp *dp, struct drm_encoder *encoder)
1437
1435
/* completed disconnection */
1438
1436
dp_display -> hpd_state = ST_DISCONNECTED ;
1439
1437
} else {
1440
- dp_display -> hpd_state = ST_SUSPEND_PENDING ;
1438
+ dp_display -> hpd_state = ST_DISPLAY_OFF ;
1441
1439
}
1442
1440
1443
1441
mutex_unlock (& dp_display -> event_mutex );
0 commit comments