Skip to content

Commit 1ba0496

Browse files
committed
drm: apple: iomfb: Provide the EDID as connector property
External display only since the EDID provided by integrated panels holds no useful / correct information. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent de0cab6 commit 1ba0496

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

drivers/gpu/drm/apple/connector.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <drm/drm_atomic.h>
1010
#include "drm/drm_connector.h"
11+
#include "drm/drm_edid.h"
1112

1213
struct apple_connector;
1314

@@ -21,6 +22,8 @@ struct apple_connector {
2122

2223
struct platform_device *dcp;
2324

25+
const struct drm_edid *drm_edid;
26+
2427
/* Workqueue for sending hotplug events to the associated device */
2528
struct work_struct hotplug_wq;
2629

drivers/gpu/drm/apple/dcp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ static void dcp_rtk_crashed(void *cookie)
242242
dev_err(dcp->dev, "DCP has crashed\n");
243243
if (dcp->connector) {
244244
dcp->connector->connected = 0;
245+
drm_edid_free(dcp->connector->drm_edid);
246+
dcp->connector->drm_edid = NULL;
245247
schedule_work(&dcp->connector->hotplug_wq);
246248
}
247249
complete(&dcp->start_done);

drivers/gpu/drm/apple/iomfb.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/slab.h>
1717
#include <linux/soc/apple/rtkit.h>
1818

19+
#include <drm/drm_edid.h>
1920
#include <drm/drm_fb_dma_helper.h>
2021
#include <drm/drm_fourcc.h>
2122
#include <drm/drm_framebuffer.h>
@@ -241,6 +242,11 @@ void dcp_hotplug(struct work_struct *work)
241242
dev_info(dcp->dev, "%s() connected:%d valid_mode:%d nr_modes:%u\n", __func__,
242243
connector->connected, dcp->valid_mode, dcp->nr_modes);
243244

245+
if (!connector->connected) {
246+
drm_edid_free(connector->drm_edid);
247+
connector->drm_edid = NULL;
248+
}
249+
244250
/*
245251
* DCP defers link training until we set a display mode. But we set
246252
* display modes from atomic_flush, so userspace needs to trigger a
@@ -391,6 +397,20 @@ int dcp_get_modes(struct drm_connector *connector)
391397
drm_mode_probed_add(connector, mode);
392398
}
393399

400+
if (dcp->nr_modes && dcp->dcpavserv.enabled &&
401+
!apple_connector->drm_edid) {
402+
const struct drm_edid *edid;
403+
edid = dcpavserv_copy_edid(dcp->dcpavserv.service);
404+
if (IS_ERR_OR_NULL(edid)) {
405+
dev_info(dcp->dev, "copy_edid failed: %pe\n", edid);
406+
} else {
407+
drm_edid_free(apple_connector->drm_edid);
408+
apple_connector->drm_edid = edid;
409+
}
410+
}
411+
if (dcp->nr_modes && apple_connector->drm_edid)
412+
drm_edid_connector_update(connector, apple_connector->drm_edid);
413+
394414
return dcp->nr_modes;
395415
}
396416
EXPORT_SYMBOL_GPL(dcp_get_modes);

0 commit comments

Comments
 (0)