Lines Matching refs:fb_helper

103 int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)  in drm_fb_helper_single_add_all_connectors()  argument
105 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_single_add_all_connectors()
121 fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; in drm_fb_helper_single_add_all_connectors()
126 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_single_add_all_connectors()
127 kfree(fb_helper->connector_info[i]); in drm_fb_helper_single_add_all_connectors()
128 fb_helper->connector_info[i] = NULL; in drm_fb_helper_single_add_all_connectors()
130 fb_helper->connector_count = 0; in drm_fb_helper_single_add_all_connectors()
137 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
145 WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex)); in drm_fb_helper_add_one_connector()
146 if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) { in drm_fb_helper_add_one_connector()
147 …temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector *) * (fb_helper->… in drm_fb_helper_add_one_connector()
151 fb_helper->connector_info_alloc_count = fb_helper->connector_count + 1; in drm_fb_helper_add_one_connector()
152 fb_helper->connector_info = temp; in drm_fb_helper_add_one_connector()
161 fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; in drm_fb_helper_add_one_connector()
194 int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, in drm_fb_helper_remove_one_connector() argument
203 WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex)); in drm_fb_helper_remove_one_connector()
205 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_remove_one_connector()
206 if (fb_helper->connector_info[i]->connector == connector) in drm_fb_helper_remove_one_connector()
210 if (i == fb_helper->connector_count) in drm_fb_helper_remove_one_connector()
212 fb_helper_connector = fb_helper->connector_info[i]; in drm_fb_helper_remove_one_connector()
214 for (j = i + 1; j < fb_helper->connector_count; j++) { in drm_fb_helper_remove_one_connector()
215 fb_helper->connector_info[j - 1] = fb_helper->connector_info[j]; in drm_fb_helper_remove_one_connector()
217 fb_helper->connector_count--; in drm_fb_helper_remove_one_connector()
221 for (i = 0; i < fb_helper->crtc_count; i++) in drm_fb_helper_remove_one_connector()
222 remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector); in drm_fb_helper_remove_one_connector()
339 static int restore_fbdev_mode_atomic(struct drm_fb_helper *fb_helper) in restore_fbdev_mode_atomic() argument
341 struct drm_device *dev = fb_helper->dev; in restore_fbdev_mode_atomic()
377 for(i = 0; i < fb_helper->crtc_count; i++) { in restore_fbdev_mode_atomic()
378 struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; in restore_fbdev_mode_atomic()
405 static int restore_fbdev_mode(struct drm_fb_helper *fb_helper) in restore_fbdev_mode() argument
407 struct drm_device *dev = fb_helper->dev; in restore_fbdev_mode()
413 if (fb_helper->atomic) in restore_fbdev_mode()
414 return restore_fbdev_mode_atomic(fb_helper); in restore_fbdev_mode()
427 for (i = 0; i < fb_helper->crtc_count; i++) { in restore_fbdev_mode()
428 struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; in restore_fbdev_mode()
461 int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) in drm_fb_helper_restore_fbdev_mode_unlocked() argument
463 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_restore_fbdev_mode_unlocked()
471 ret = restore_fbdev_mode(fb_helper); in drm_fb_helper_restore_fbdev_mode_unlocked()
473 do_delayed = fb_helper->delayed_hotplug; in drm_fb_helper_restore_fbdev_mode_unlocked()
475 fb_helper->delayed_hotplug = false; in drm_fb_helper_restore_fbdev_mode_unlocked()
479 drm_fb_helper_hotplug_event(fb_helper); in drm_fb_helper_restore_fbdev_mode_unlocked()
484 static bool drm_fb_helper_is_bound(struct drm_fb_helper *fb_helper) in drm_fb_helper_is_bound() argument
486 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_is_bound()
498 if (crtc->primary->fb == fb_helper->fb) in drm_fb_helper_is_bound()
561 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_dpms() local
562 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_dpms()
571 if (!drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_dpms()
576 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_dpms()
577 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_dpms()
583 for (j = 0; j < fb_helper->connector_count; j++) { in drm_fb_helper_dpms()
584 connector = fb_helper->connector_info[j]->connector; in drm_fb_helper_dpms()
680 struct drm_fb_helper *fb_helper, in drm_fb_helper_init() argument
692 fb_helper->crtc_info = kcalloc(crtc_count, sizeof(struct drm_fb_helper_crtc), GFP_KERNEL); in drm_fb_helper_init()
693 if (!fb_helper->crtc_info) in drm_fb_helper_init()
696 fb_helper->crtc_count = crtc_count; in drm_fb_helper_init()
697fb_helper->connector_info = kcalloc(dev->mode_config.num_connector, sizeof(struct drm_fb_helper_co… in drm_fb_helper_init()
698 if (!fb_helper->connector_info) { in drm_fb_helper_init()
699 kfree(fb_helper->crtc_info); in drm_fb_helper_init()
702 fb_helper->connector_info_alloc_count = dev->mode_config.num_connector; in drm_fb_helper_init()
703 fb_helper->connector_count = 0; in drm_fb_helper_init()
706 fb_helper->crtc_info[i].mode_set.connectors = in drm_fb_helper_init()
711 if (!fb_helper->crtc_info[i].mode_set.connectors) in drm_fb_helper_init()
713 fb_helper->crtc_info[i].mode_set.num_connectors = 0; in drm_fb_helper_init()
718 fb_helper->crtc_info[i].mode_set.crtc = crtc; in drm_fb_helper_init()
722 fb_helper->atomic = !!drm_core_check_feature(dev, DRIVER_ATOMIC); in drm_fb_helper_init()
726 drm_fb_helper_crtc_free(fb_helper); in drm_fb_helper_init()
742 struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_alloc_fbi() argument
744 struct device *dev = fb_helper->dev->dev; in drm_fb_helper_alloc_fbi()
762 fb_helper->fbdev = info; in drm_fb_helper_alloc_fbi()
781 void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_unregister_fbi() argument
783 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_unregister_fbi()
784 unregister_framebuffer(fb_helper->fbdev); in drm_fb_helper_unregister_fbi()
795 void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_release_fbi() argument
797 if (fb_helper) { in drm_fb_helper_release_fbi()
798 struct fb_info *info = fb_helper->fbdev; in drm_fb_helper_release_fbi()
806 fb_helper->fbdev = NULL; in drm_fb_helper_release_fbi()
811 void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) in drm_fb_helper_fini() argument
816 if (!list_empty(&fb_helper->kernel_fb_list)) { in drm_fb_helper_fini()
817 list_del(&fb_helper->kernel_fb_list); in drm_fb_helper_fini()
823 drm_fb_helper_crtc_free(fb_helper); in drm_fb_helper_fini()
834 void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_unlink_fbi() argument
836 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_unlink_fbi()
837 unlink_framebuffer(fb_helper->fbdev); in drm_fb_helper_unlink_fbi()
964 void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, int state) in drm_fb_helper_set_suspend() argument
966 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_set_suspend()
967 fb_set_suspend(fb_helper->fbdev, state); in drm_fb_helper_set_suspend()
974 struct drm_fb_helper *fb_helper = info->par; in setcolreg() local
975 struct drm_framebuffer *fb = fb_helper->fb; in setcolreg()
1004 if (WARN_ON(!fb_helper->funcs->gamma_set || in setcolreg()
1005 !fb_helper->funcs->gamma_get)) in setcolreg()
1023 fb_helper->funcs->gamma_set(crtc, red, in setcolreg()
1027 fb_helper->funcs->gamma_get(crtc, &r, in setcolreg()
1032 fb_helper->funcs->gamma_set(crtc, r, in setcolreg()
1039 fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); in setcolreg()
1050 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_setcmap() local
1051 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_setcmap()
1062 if (!drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_setcmap()
1067 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_setcmap()
1068 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_setcmap()
1108 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_check_var() local
1109 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_check_var()
1207 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_set_par() local
1218 drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); in drm_fb_helper_set_par()
1227 struct drm_fb_helper *fb_helper = info->par; in pan_display_atomic() local
1228 struct drm_device *dev = fb_helper->dev; in pan_display_atomic()
1241 for(i = 0; i < fb_helper->crtc_count; i++) { in pan_display_atomic()
1244 mode_set = &fb_helper->crtc_info[i].mode_set; in pan_display_atomic()
1292 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_pan_display() local
1293 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_pan_display()
1302 if (!drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_pan_display()
1307 if (fb_helper->atomic) { in drm_fb_helper_pan_display()
1312 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_pan_display()
1313 modeset = &fb_helper->crtc_info[i].mode_set; in drm_fb_helper_pan_display()
1337 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_single_fb_probe() argument
1359 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_single_fb_probe()
1360 struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; in drm_fb_helper_single_fb_probe()
1390 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_single_fb_probe()
1400 desired_mode = fb_helper->crtc_info[i].desired_mode; in drm_fb_helper_single_fb_probe()
1401 mode_set = &fb_helper->crtc_info[i].mode_set; in drm_fb_helper_single_fb_probe()
1408 x = fb_helper->crtc_info[i].x; in drm_fb_helper_single_fb_probe()
1409 y = fb_helper->crtc_info[i].y; in drm_fb_helper_single_fb_probe()
1412 gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size; in drm_fb_helper_single_fb_probe()
1442 ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); in drm_fb_helper_single_fb_probe()
1446 info = fb_helper->fbdev; in drm_fb_helper_single_fb_probe()
1455 for (i = 0; i < fb_helper->crtc_count; i++) in drm_fb_helper_single_fb_probe()
1456 if (fb_helper->crtc_info[i].mode_set.num_connectors) in drm_fb_helper_single_fb_probe()
1457 fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; in drm_fb_helper_single_fb_probe()
1464 dev_info(fb_helper->dev->dev, "fb%d: %s frame buffer device\n", in drm_fb_helper_single_fb_probe()
1471 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in drm_fb_helper_single_fb_probe()
1522 void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_var() argument
1525 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_var()
1526 info->pseudo_palette = fb_helper->pseudo_palette; in drm_fb_helper_fill_var()
1596 static int drm_fb_helper_probe_connector_modes(struct drm_fb_helper *fb_helper, in drm_fb_helper_probe_connector_modes() argument
1604 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_probe_connector_modes()
1605 connector = fb_helper->connector_info[i]->connector; in drm_fb_helper_probe_connector_modes()
1697 static void drm_enable_connectors(struct drm_fb_helper *fb_helper, in drm_enable_connectors() argument
1704 for (i = 0; i < fb_helper->connector_count; i++) { in drm_enable_connectors()
1705 connector = fb_helper->connector_info[i]->connector; in drm_enable_connectors()
1715 for (i = 0; i < fb_helper->connector_count; i++) { in drm_enable_connectors()
1716 connector = fb_helper->connector_info[i]->connector; in drm_enable_connectors()
1721 static bool drm_target_cloned(struct drm_fb_helper *fb_helper, in drm_target_cloned() argument
1732 if (fb_helper->crtc_count > 1) in drm_target_cloned()
1736 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1747 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1750 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_cloned()
1771 dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60, false); in drm_target_cloned()
1773 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1778 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_cloned()
1795 static int drm_get_tile_offsets(struct drm_fb_helper *fb_helper, in drm_get_tile_offsets() argument
1805 for (i = 0; i < fb_helper->connector_count; i++) { in drm_get_tile_offsets()
1806 fb_helper_conn = fb_helper->connector_info[i]; in drm_get_tile_offsets()
1827 static bool drm_target_preferred(struct drm_fb_helper *fb_helper, in drm_target_preferred() argument
1836 mask = (1 << fb_helper->connector_count) - 1; in drm_target_preferred()
1838 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_preferred()
1839 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_preferred()
1866 drm_get_tile_offsets(fb_helper, modes, offsets, in drm_target_preferred()
1896 static int drm_pick_crtcs(struct drm_fb_helper *fb_helper, in drm_pick_crtcs() argument
1909 if (n == fb_helper->connector_count) in drm_pick_crtcs()
1912 fb_helper_conn = fb_helper->connector_info[n]; in drm_pick_crtcs()
1916 best_score = drm_pick_crtcs(fb_helper, best_crtcs, modes, n+1, width, height); in drm_pick_crtcs()
1920 crtcs = kzalloc(fb_helper->connector_count * in drm_pick_crtcs()
1940 for (c = 0; c < fb_helper->crtc_count; c++) { in drm_pick_crtcs()
1941 crtc = &fb_helper->crtc_info[c]; in drm_pick_crtcs()
1952 if (fb_helper->crtc_count > 1) in drm_pick_crtcs()
1961 score = my_score + drm_pick_crtcs(fb_helper, crtcs, modes, n + 1, in drm_pick_crtcs()
1966 fb_helper->connector_count * in drm_pick_crtcs()
1975 static void drm_setup_crtcs(struct drm_fb_helper *fb_helper) in drm_setup_crtcs() argument
1977 struct drm_device *dev = fb_helper->dev; in drm_setup_crtcs()
2005 drm_enable_connectors(fb_helper, enabled); in drm_setup_crtcs()
2007 if (!(fb_helper->funcs->initial_config && in drm_setup_crtcs()
2008 fb_helper->funcs->initial_config(fb_helper, crtcs, modes, in drm_setup_crtcs()
2015 if (!drm_target_cloned(fb_helper, modes, offsets, in drm_setup_crtcs()
2017 !drm_target_preferred(fb_helper, modes, offsets, in drm_setup_crtcs()
2024 drm_pick_crtcs(fb_helper, crtcs, modes, 0, width, height); in drm_setup_crtcs()
2029 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_setup_crtcs()
2030 modeset = &fb_helper->crtc_info[i].mode_set; in drm_setup_crtcs()
2035 for (i = 0; i < fb_helper->connector_count; i++) { in drm_setup_crtcs()
2051 modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector; in drm_setup_crtcs()
2052 modeset->fb = fb_helper->fb; in drm_setup_crtcs()
2059 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_setup_crtcs()
2060 modeset = &fb_helper->crtc_info[i].mode_set; in drm_setup_crtcs()
2096 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) in drm_fb_helper_initial_config() argument
2098 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_initial_config()
2105 count = drm_fb_helper_probe_connector_modes(fb_helper, in drm_fb_helper_initial_config()
2113 dev_info(fb_helper->dev->dev, "No connectors reported connected with modes\n"); in drm_fb_helper_initial_config()
2115 drm_setup_crtcs(fb_helper); in drm_fb_helper_initial_config()
2117 return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); in drm_fb_helper_initial_config()
2142 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) in drm_fb_helper_hotplug_event() argument
2144 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_hotplug_event()
2150 mutex_lock(&fb_helper->dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
2151 if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) { in drm_fb_helper_hotplug_event()
2152 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
2153 mutex_unlock(&fb_helper->dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
2158 max_width = fb_helper->fb->width; in drm_fb_helper_hotplug_event()
2159 max_height = fb_helper->fb->height; in drm_fb_helper_hotplug_event()
2161 drm_fb_helper_probe_connector_modes(fb_helper, max_width, max_height); in drm_fb_helper_hotplug_event()
2162 mutex_unlock(&fb_helper->dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
2165 drm_setup_crtcs(fb_helper); in drm_fb_helper_hotplug_event()
2167 drm_fb_helper_set_par(fb_helper->fbdev); in drm_fb_helper_hotplug_event()