diff options
Diffstat (limited to 'drivers/gpu/drm/drm_fb_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 11d7a72c22d9..140b9525b48a 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -1516,17 +1516,33 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) | |||
| 1516 | } | 1516 | } |
| 1517 | EXPORT_SYMBOL(drm_fb_helper_initial_config); | 1517 | EXPORT_SYMBOL(drm_fb_helper_initial_config); |
| 1518 | 1518 | ||
| 1519 | bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) | 1519 | /** |
| 1520 | * drm_fb_helper_hotplug_event - respond to a hotplug notification by | ||
| 1521 | * probing all the outputs attached to the fb. | ||
| 1522 | * @fb_helper: the drm_fb_helper | ||
| 1523 | * | ||
| 1524 | * LOCKING: | ||
| 1525 | * Called at runtime, must take mode config lock. | ||
| 1526 | * | ||
| 1527 | * Scan the connectors attached to the fb_helper and try to put together a | ||
| 1528 | * setup after *notification of a change in output configuration. | ||
| 1529 | * | ||
| 1530 | * RETURNS: | ||
| 1531 | * 0 on success and a non-zero error code otherwise. | ||
| 1532 | */ | ||
| 1533 | int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) | ||
| 1520 | { | 1534 | { |
| 1535 | struct drm_device *dev = fb_helper->dev; | ||
| 1521 | int count = 0; | 1536 | int count = 0; |
| 1522 | u32 max_width, max_height, bpp_sel; | 1537 | u32 max_width, max_height, bpp_sel; |
| 1523 | bool bound = false, crtcs_bound = false; | 1538 | bool bound = false, crtcs_bound = false; |
| 1524 | struct drm_crtc *crtc; | 1539 | struct drm_crtc *crtc; |
| 1525 | 1540 | ||
| 1526 | if (!fb_helper->fb) | 1541 | if (!fb_helper->fb) |
| 1527 | return false; | 1542 | return 0; |
| 1528 | 1543 | ||
| 1529 | list_for_each_entry(crtc, &fb_helper->dev->mode_config.crtc_list, head) { | 1544 | mutex_lock(&dev->mode_config.mutex); |
| 1545 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
| 1530 | if (crtc->fb) | 1546 | if (crtc->fb) |
| 1531 | crtcs_bound = true; | 1547 | crtcs_bound = true; |
| 1532 | if (crtc->fb == fb_helper->fb) | 1548 | if (crtc->fb == fb_helper->fb) |
| @@ -1535,7 +1551,8 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) | |||
| 1535 | 1551 | ||
| 1536 | if (!bound && crtcs_bound) { | 1552 | if (!bound && crtcs_bound) { |
| 1537 | fb_helper->delayed_hotplug = true; | 1553 | fb_helper->delayed_hotplug = true; |
| 1538 | return false; | 1554 | mutex_unlock(&dev->mode_config.mutex); |
| 1555 | return 0; | ||
| 1539 | } | 1556 | } |
| 1540 | DRM_DEBUG_KMS("\n"); | 1557 | DRM_DEBUG_KMS("\n"); |
| 1541 | 1558 | ||
| @@ -1546,6 +1563,7 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) | |||
| 1546 | count = drm_fb_helper_probe_connector_modes(fb_helper, max_width, | 1563 | count = drm_fb_helper_probe_connector_modes(fb_helper, max_width, |
| 1547 | max_height); | 1564 | max_height); |
| 1548 | drm_setup_crtcs(fb_helper); | 1565 | drm_setup_crtcs(fb_helper); |
| 1566 | mutex_unlock(&dev->mode_config.mutex); | ||
| 1549 | 1567 | ||
| 1550 | return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); | 1568 | return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); |
| 1551 | } | 1569 | } |
