Skip to content

Commit 2e43333

Browse files
committed
drm: apple: dptx: Issue HPD event early on gpio/type-c disconnect
Atomic modesets during a display disconnect may result in unrecoverable state if the set_digital_out_mode() DCP firmware call fails. Mark the connector as early as possible as disconnected to make this more unlikely. TODO: investigate set_digital_out_mode() failure handling Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 44d22d2 commit 2e43333

1 file changed

Lines changed: 15 additions & 1 deletion

File tree

  • drivers/gpu/drm/apple

drivers/gpu/drm/apple/dcp.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,14 @@ static int dcp_dptx_connect(struct apple_dcp *dcp, u32 port)
424424
return ret;
425425
}
426426

427+
static void disconnected_hpd_event(struct apple_connector *con)
428+
{
429+
if (con) {
430+
con->connected = 0;
431+
drm_kms_helper_connector_hotplug_event(&con->base);
432+
}
433+
}
434+
427435
static int dcp_dptx_disconnect(struct apple_dcp *dcp, u32 port)
428436
{
429437
dev_info(dcp->dev, "%s(port=%d)\n", __func__, port);
@@ -448,6 +456,9 @@ EXPORT_SYMBOL_GPL(dcp_dptx_connect_oob);
448456
int dcp_dptx_disconnect_oob(struct platform_device *pdev, u32 port)
449457
{
450458
struct apple_dcp *dcp = platform_get_drvdata(pdev);
459+
460+
disconnected_hpd_event(dcp->connector);
461+
451462
if (dcp->avep)
452463
av_service_disconnect(dcp);
453464
dptxport_set_hpd(dcp->dptxport[port].service, false);
@@ -671,8 +682,10 @@ void dcp_poweroff(struct platform_device *pdev)
671682

672683
if (dcp->hdmi_hpd) {
673684
bool connected = gpiod_get_value_cansleep(dcp->hdmi_hpd);
674-
if (!connected)
685+
if (!connected) {
686+
disconnected_hpd_event(dcp->connector);
675687
dcp_dptx_disconnect(dcp, 0);
688+
}
676689
}
677690
}
678691
EXPORT_SYMBOL(dcp_poweroff);
@@ -1257,6 +1270,7 @@ static int dcp_platform_suspend(struct device *dev)
12571270

12581271
if (dcp->hdmi_hpd_irq) {
12591272
disable_irq(dcp->hdmi_hpd_irq);
1273+
disconnected_hpd_event(dcp->connector);
12601274
dcp_dptx_disconnect(dcp, 0);
12611275
}
12621276
/*

0 commit comments

Comments
 (0)