Skip to content

Commit a9a37de

Browse files
jannaumarcan
authored andcommitted
drm: apple: Disconnect dptx When the CRTC is powered down
Seems to make disconnect / reconnect more reliable and almost fixes suspend/resume. The drm device tries to modeset too early on resume which leaves the screen blank. This should reduce power consumption after disconnecting the HDMI port. Signed-off-by: Janne Grunau <[email protected]>
1 parent 86f1bfc commit a9a37de

2 files changed

Lines changed: 65 additions & 51 deletions

File tree

drivers/gpu/drm/apple/dcp.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ static int dcp_dptx_disconnect(struct apple_dcp *dcp, u32 port)
288288
struct apple_connector *connector = dcp->connector;
289289

290290
mutex_lock(&dcp->hpd_mutex);
291+
291292
if (connector && connector->connected) {
292293
dcp->valid_mode = false;
293294
schedule_work(&connector->hotplug_wq);
@@ -408,6 +409,70 @@ int dcp_wait_ready(struct platform_device *pdev, u64 timeout)
408409
}
409410
EXPORT_SYMBOL(dcp_wait_ready);
410411

412+
413+
void dcp_sleep(struct apple_dcp *dcp)
414+
{
415+
switch (dcp->fw_compat) {
416+
case DCP_FIRMWARE_V_12_3:
417+
iomfb_sleep_v12_3(dcp);
418+
break;
419+
case DCP_FIRMWARE_V_13_5:
420+
iomfb_sleep_v13_3(dcp);
421+
break;
422+
default:
423+
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
424+
break;
425+
}
426+
}
427+
428+
void dcp_poweron(struct platform_device *pdev)
429+
{
430+
struct apple_dcp *dcp = platform_get_drvdata(pdev);
431+
432+
if (dcp->hdmi_hpd) {
433+
bool connected = gpiod_get_value_cansleep(dcp->hdmi_hpd);
434+
dev_info(dcp->dev, "%s: DP2HDMI HPD connected:%d\n", __func__, connected);
435+
436+
if (connected)
437+
dcp_dptx_connect(dcp, 0);
438+
}
439+
440+
switch (dcp->fw_compat) {
441+
case DCP_FIRMWARE_V_12_3:
442+
iomfb_poweron_v12_3(dcp);
443+
break;
444+
case DCP_FIRMWARE_V_13_5:
445+
iomfb_poweron_v13_3(dcp);
446+
break;
447+
default:
448+
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
449+
break;
450+
}
451+
}
452+
EXPORT_SYMBOL(dcp_poweron);
453+
454+
void dcp_poweroff(struct platform_device *pdev)
455+
{
456+
struct apple_dcp *dcp = platform_get_drvdata(pdev);
457+
458+
switch (dcp->fw_compat) {
459+
case DCP_FIRMWARE_V_12_3:
460+
iomfb_poweroff_v12_3(dcp);
461+
break;
462+
case DCP_FIRMWARE_V_13_5:
463+
iomfb_poweroff_v13_3(dcp);
464+
break;
465+
default:
466+
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
467+
break;
468+
}
469+
470+
if (dcp->phy)
471+
dcp_dptx_disconnect(dcp, 0);
472+
473+
}
474+
EXPORT_SYMBOL(dcp_poweroff);
475+
411476
static void dcp_work_register_backlight(struct work_struct *work)
412477
{
413478
int ret;

drivers/gpu/drm/apple/iomfb.c

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -218,57 +218,6 @@ void dcp_ack(struct apple_dcp *dcp, enum dcp_context_id context)
218218
dcpep_ack(context));
219219
}
220220

221-
void dcp_sleep(struct apple_dcp *dcp)
222-
{
223-
switch (dcp->fw_compat) {
224-
case DCP_FIRMWARE_V_12_3:
225-
iomfb_sleep_v12_3(dcp);
226-
break;
227-
case DCP_FIRMWARE_V_13_5:
228-
iomfb_sleep_v13_3(dcp);
229-
break;
230-
default:
231-
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
232-
break;
233-
}
234-
}
235-
236-
void dcp_poweron(struct platform_device *pdev)
237-
{
238-
struct apple_dcp *dcp = platform_get_drvdata(pdev);
239-
240-
switch (dcp->fw_compat) {
241-
case DCP_FIRMWARE_V_12_3:
242-
iomfb_poweron_v12_3(dcp);
243-
break;
244-
case DCP_FIRMWARE_V_13_5:
245-
iomfb_poweron_v13_3(dcp);
246-
break;
247-
default:
248-
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
249-
break;
250-
}
251-
}
252-
EXPORT_SYMBOL(dcp_poweron);
253-
254-
void dcp_poweroff(struct platform_device *pdev)
255-
{
256-
struct apple_dcp *dcp = platform_get_drvdata(pdev);
257-
258-
switch (dcp->fw_compat) {
259-
case DCP_FIRMWARE_V_12_3:
260-
iomfb_poweroff_v12_3(dcp);
261-
break;
262-
case DCP_FIRMWARE_V_13_5:
263-
iomfb_poweroff_v13_3(dcp);
264-
break;
265-
default:
266-
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
267-
break;
268-
}
269-
}
270-
EXPORT_SYMBOL(dcp_poweroff);
271-
272221
/*
273222
* Helper to send a DRM hotplug event. The DCP is accessed from a single
274223
* (RTKit) thread. To handle hotplug callbacks, we need to call

0 commit comments

Comments
 (0)