Lines Matching refs:fb_helper
95 int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) in drm_fb_helper_single_add_all_connectors() argument
97 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_single_add_all_connectors()
109 fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; in drm_fb_helper_single_add_all_connectors()
113 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_single_add_all_connectors()
114 kfree(fb_helper->connector_info[i]); in drm_fb_helper_single_add_all_connectors()
115 fb_helper->connector_info[i] = NULL; in drm_fb_helper_single_add_all_connectors()
117 fb_helper->connector_count = 0; in drm_fb_helper_single_add_all_connectors()
122 int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connecto… in drm_fb_helper_add_one_connector() argument
127 WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex)); in drm_fb_helper_add_one_connector()
128 if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) { in drm_fb_helper_add_one_connector()
129 …temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector *) * (fb_helper->… in drm_fb_helper_add_one_connector()
133 fb_helper->connector_info_alloc_count = fb_helper->connector_count + 1; in drm_fb_helper_add_one_connector()
134 fb_helper->connector_info = temp; in drm_fb_helper_add_one_connector()
143 fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; in drm_fb_helper_add_one_connector()
173 int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, in drm_fb_helper_remove_one_connector() argument
179 WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex)); in drm_fb_helper_remove_one_connector()
181 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_remove_one_connector()
182 if (fb_helper->connector_info[i]->connector == connector) in drm_fb_helper_remove_one_connector()
186 if (i == fb_helper->connector_count) in drm_fb_helper_remove_one_connector()
188 fb_helper_connector = fb_helper->connector_info[i]; in drm_fb_helper_remove_one_connector()
190 for (j = i + 1; j < fb_helper->connector_count; j++) { in drm_fb_helper_remove_one_connector()
191 fb_helper->connector_info[j - 1] = fb_helper->connector_info[j]; in drm_fb_helper_remove_one_connector()
193 fb_helper->connector_count--; in drm_fb_helper_remove_one_connector()
197 for (i = 0; i < fb_helper->crtc_count; i++) in drm_fb_helper_remove_one_connector()
198 remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector); in drm_fb_helper_remove_one_connector()
315 static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper) in restore_fbdev_mode() argument
317 struct drm_device *dev = fb_helper->dev; in restore_fbdev_mode()
335 for (i = 0; i < fb_helper->crtc_count; i++) { in restore_fbdev_mode()
336 struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; in restore_fbdev_mode()
363 static bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) in drm_fb_helper_restore_fbdev_mode() argument
365 return restore_fbdev_mode(fb_helper); in drm_fb_helper_restore_fbdev_mode()
376 bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) in drm_fb_helper_restore_fbdev_mode_unlocked() argument
378 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_restore_fbdev_mode_unlocked()
383 ret = restore_fbdev_mode(fb_helper); in drm_fb_helper_restore_fbdev_mode_unlocked()
385 do_delayed = fb_helper->delayed_hotplug; in drm_fb_helper_restore_fbdev_mode_unlocked()
387 fb_helper->delayed_hotplug = false; in drm_fb_helper_restore_fbdev_mode_unlocked()
391 drm_fb_helper_hotplug_event(fb_helper); in drm_fb_helper_restore_fbdev_mode_unlocked()
450 static bool drm_fb_helper_is_bound(struct drm_fb_helper *fb_helper) in drm_fb_helper_is_bound() argument
452 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_is_bound()
464 if (crtc->primary->fb == fb_helper->fb) in drm_fb_helper_is_bound()
500 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_dpms() local
501 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_dpms()
518 if (!drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_dpms()
523 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_dpms()
524 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_dpms()
530 for (j = 0; j < fb_helper->connector_count; j++) { in drm_fb_helper_dpms()
531 connector = fb_helper->connector_info[j]->connector; in drm_fb_helper_dpms()
624 struct drm_fb_helper *fb_helper, in drm_fb_helper_init() argument
633 fb_helper->crtc_info = kcalloc(crtc_count, sizeof(struct drm_fb_helper_crtc), GFP_KERNEL); in drm_fb_helper_init()
634 if (!fb_helper->crtc_info) in drm_fb_helper_init()
637 fb_helper->crtc_count = crtc_count; in drm_fb_helper_init()
638 …fb_helper->connector_info = kcalloc(dev->mode_config.num_connector, sizeof(struct drm_fb_helper_co… in drm_fb_helper_init()
639 if (!fb_helper->connector_info) { in drm_fb_helper_init()
640 kfree(fb_helper->crtc_info); in drm_fb_helper_init()
643 fb_helper->connector_info_alloc_count = dev->mode_config.num_connector; in drm_fb_helper_init()
644 fb_helper->connector_count = 0; in drm_fb_helper_init()
647 fb_helper->crtc_info[i].mode_set.connectors = in drm_fb_helper_init()
652 if (!fb_helper->crtc_info[i].mode_set.connectors) in drm_fb_helper_init()
654 fb_helper->crtc_info[i].mode_set.num_connectors = 0; in drm_fb_helper_init()
659 fb_helper->crtc_info[i].mode_set.crtc = crtc; in drm_fb_helper_init()
665 drm_fb_helper_crtc_free(fb_helper); in drm_fb_helper_init()
670 void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) in drm_fb_helper_fini() argument
672 if (!list_empty(&fb_helper->kernel_fb_list)) { in drm_fb_helper_fini()
673 list_del(&fb_helper->kernel_fb_list); in drm_fb_helper_fini()
682 drm_fb_helper_crtc_free(fb_helper); in drm_fb_helper_fini()
690 struct drm_fb_helper *fb_helper = info->par; in setcolreg() local
691 struct drm_framebuffer *fb = fb_helper->fb; in setcolreg()
720 if (WARN_ON(!fb_helper->funcs->gamma_set || in setcolreg()
721 !fb_helper->funcs->gamma_get)) in setcolreg()
739 fb_helper->funcs->gamma_set(crtc, red, in setcolreg()
743 fb_helper->funcs->gamma_get(crtc, &r, in setcolreg()
748 fb_helper->funcs->gamma_set(crtc, r, in setcolreg()
755 fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); in setcolreg()
766 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_setcmap() local
767 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_setcmap()
777 if (!drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_setcmap()
782 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_setcmap()
783 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_setcmap()
823 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_check_var() local
824 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_check_var()
922 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_set_par() local
930 drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); in drm_fb_helper_set_par()
944 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_pan_display() local
945 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_pan_display()
953 if (!drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_pan_display()
958 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_pan_display()
959 modeset = &fb_helper->crtc_info[i].mode_set; in drm_fb_helper_pan_display()
982 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_single_fb_probe() argument
1004 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_single_fb_probe()
1005 struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; in drm_fb_helper_single_fb_probe()
1035 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_single_fb_probe()
1045 desired_mode = fb_helper->crtc_info[i].desired_mode; in drm_fb_helper_single_fb_probe()
1046 mode_set = &fb_helper->crtc_info[i].mode_set; in drm_fb_helper_single_fb_probe()
1053 x = fb_helper->crtc_info[i].x; in drm_fb_helper_single_fb_probe()
1054 y = fb_helper->crtc_info[i].y; in drm_fb_helper_single_fb_probe()
1057 gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size; in drm_fb_helper_single_fb_probe()
1087 ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); in drm_fb_helper_single_fb_probe()
1091 info = fb_helper->fbdev; in drm_fb_helper_single_fb_probe()
1100 for (i = 0; i < fb_helper->crtc_count; i++) in drm_fb_helper_single_fb_probe()
1101 if (fb_helper->crtc_info[i].mode_set.num_connectors) in drm_fb_helper_single_fb_probe()
1102 fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; in drm_fb_helper_single_fb_probe()
1109 dev_info(fb_helper->dev->dev, "fb%d: %s frame buffer device\n", in drm_fb_helper_single_fb_probe()
1115 dev_info(fb_helper->dev->dev, "registered panic notifier\n"); in drm_fb_helper_single_fb_probe()
1121 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in drm_fb_helper_single_fb_probe()
1172 void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_var() argument
1175 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_var()
1176 info->pseudo_palette = fb_helper->pseudo_palette; in drm_fb_helper_fill_var()
1246 static int drm_fb_helper_probe_connector_modes(struct drm_fb_helper *fb_helper, in drm_fb_helper_probe_connector_modes() argument
1254 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_probe_connector_modes()
1255 connector = fb_helper->connector_info[i]->connector; in drm_fb_helper_probe_connector_modes()
1347 static void drm_enable_connectors(struct drm_fb_helper *fb_helper, in drm_enable_connectors() argument
1354 for (i = 0; i < fb_helper->connector_count; i++) { in drm_enable_connectors()
1355 connector = fb_helper->connector_info[i]->connector; in drm_enable_connectors()
1365 for (i = 0; i < fb_helper->connector_count; i++) { in drm_enable_connectors()
1366 connector = fb_helper->connector_info[i]->connector; in drm_enable_connectors()
1371 static bool drm_target_cloned(struct drm_fb_helper *fb_helper, in drm_target_cloned() argument
1382 if (fb_helper->crtc_count > 1) in drm_target_cloned()
1386 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1397 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1400 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_cloned()
1421 dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60, false); in drm_target_cloned()
1423 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1428 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_cloned()
1445 static int drm_get_tile_offsets(struct drm_fb_helper *fb_helper, in drm_get_tile_offsets() argument
1455 for (i = 0; i < fb_helper->connector_count; i++) { in drm_get_tile_offsets()
1456 fb_helper_conn = fb_helper->connector_info[i]; in drm_get_tile_offsets()
1477 static bool drm_target_preferred(struct drm_fb_helper *fb_helper, in drm_target_preferred() argument
1486 mask = (1 << fb_helper->connector_count) - 1; in drm_target_preferred()
1488 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_preferred()
1489 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_preferred()
1516 drm_get_tile_offsets(fb_helper, modes, offsets, in drm_target_preferred()
1546 static int drm_pick_crtcs(struct drm_fb_helper *fb_helper, in drm_pick_crtcs() argument
1559 if (n == fb_helper->connector_count) in drm_pick_crtcs()
1562 fb_helper_conn = fb_helper->connector_info[n]; in drm_pick_crtcs()
1566 best_score = drm_pick_crtcs(fb_helper, best_crtcs, modes, n+1, width, height); in drm_pick_crtcs()
1570 crtcs = kzalloc(fb_helper->connector_count * in drm_pick_crtcs()
1590 for (c = 0; c < fb_helper->crtc_count; c++) { in drm_pick_crtcs()
1591 crtc = &fb_helper->crtc_info[c]; in drm_pick_crtcs()
1602 if (fb_helper->crtc_count > 1) in drm_pick_crtcs()
1611 score = my_score + drm_pick_crtcs(fb_helper, crtcs, modes, n + 1, in drm_pick_crtcs()
1616 fb_helper->connector_count * in drm_pick_crtcs()
1625 static void drm_setup_crtcs(struct drm_fb_helper *fb_helper) in drm_setup_crtcs() argument
1627 struct drm_device *dev = fb_helper->dev; in drm_setup_crtcs()
1655 drm_enable_connectors(fb_helper, enabled); in drm_setup_crtcs()
1657 if (!(fb_helper->funcs->initial_config && in drm_setup_crtcs()
1658 fb_helper->funcs->initial_config(fb_helper, crtcs, modes, in drm_setup_crtcs()
1665 if (!drm_target_cloned(fb_helper, modes, offsets, in drm_setup_crtcs()
1667 !drm_target_preferred(fb_helper, modes, offsets, in drm_setup_crtcs()
1674 drm_pick_crtcs(fb_helper, crtcs, modes, 0, width, height); in drm_setup_crtcs()
1679 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_setup_crtcs()
1680 modeset = &fb_helper->crtc_info[i].mode_set; in drm_setup_crtcs()
1685 for (i = 0; i < fb_helper->connector_count; i++) { in drm_setup_crtcs()
1701 modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector; in drm_setup_crtcs()
1702 modeset->fb = fb_helper->fb; in drm_setup_crtcs()
1709 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_setup_crtcs()
1710 modeset = &fb_helper->crtc_info[i].mode_set; in drm_setup_crtcs()
1746 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) in drm_fb_helper_initial_config() argument
1748 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_initial_config()
1752 count = drm_fb_helper_probe_connector_modes(fb_helper, in drm_fb_helper_initial_config()
1760 dev_info(fb_helper->dev->dev, "No connectors reported connected with modes\n"); in drm_fb_helper_initial_config()
1762 drm_setup_crtcs(fb_helper); in drm_fb_helper_initial_config()
1764 return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); in drm_fb_helper_initial_config()
1789 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) in drm_fb_helper_hotplug_event() argument
1791 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_hotplug_event()
1794 mutex_lock(&fb_helper->dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
1795 if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_hotplug_event()
1796 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
1797 mutex_unlock(&fb_helper->dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
1802 max_width = fb_helper->fb->width; in drm_fb_helper_hotplug_event()
1803 max_height = fb_helper->fb->height; in drm_fb_helper_hotplug_event()
1805 drm_fb_helper_probe_connector_modes(fb_helper, max_width, max_height); in drm_fb_helper_hotplug_event()
1806 mutex_unlock(&fb_helper->dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
1809 drm_setup_crtcs(fb_helper); in drm_fb_helper_hotplug_event()
1811 drm_fb_helper_set_par(fb_helper->fbdev); in drm_fb_helper_hotplug_event()