|
16 | 16 | #include <linux/slab.h> |
17 | 17 | #include <linux/soc/apple/rtkit.h> |
18 | 18 |
|
| 19 | +#include <drm/drm_edid.h> |
19 | 20 | #include <drm/drm_fb_dma_helper.h> |
20 | 21 | #include <drm/drm_fourcc.h> |
21 | 22 | #include <drm/drm_framebuffer.h> |
@@ -241,6 +242,11 @@ void dcp_hotplug(struct work_struct *work) |
241 | 242 | dev_info(dcp->dev, "%s() connected:%d valid_mode:%d nr_modes:%u\n", __func__, |
242 | 243 | connector->connected, dcp->valid_mode, dcp->nr_modes); |
243 | 244 |
|
| 245 | + if (!connector->connected) { |
| 246 | + drm_edid_free(connector->drm_edid); |
| 247 | + connector->drm_edid = NULL; |
| 248 | + } |
| 249 | + |
244 | 250 | /* |
245 | 251 | * DCP defers link training until we set a display mode. But we set |
246 | 252 | * display modes from atomic_flush, so userspace needs to trigger a |
@@ -391,6 +397,20 @@ int dcp_get_modes(struct drm_connector *connector) |
391 | 397 | drm_mode_probed_add(connector, mode); |
392 | 398 | } |
393 | 399 |
|
| 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 | + |
394 | 414 | return dcp->nr_modes; |
395 | 415 | } |
396 | 416 | EXPORT_SYMBOL_GPL(dcp_get_modes); |
|
0 commit comments