Lines Matching full:panel
37 * DOC: drm panel
39 * The DRM panel helpers allow drivers to register panel objects with a
48 * drm_panel_init - initialize a panel
49 * @panel: DRM panel
50 * @dev: parent device of the panel
51 * @funcs: panel operations
53 * the panel interface (must NOT be DRM_MODE_CONNECTOR_Unknown)
55 * Initialize the panel structure for subsequent registration with
58 void drm_panel_init(struct drm_panel *panel, struct device *dev, in drm_panel_init() argument
64 INIT_LIST_HEAD(&panel->list); in drm_panel_init()
65 INIT_LIST_HEAD(&panel->followers); in drm_panel_init()
66 mutex_init(&panel->follower_lock); in drm_panel_init()
67 panel->dev = dev; in drm_panel_init()
68 panel->funcs = funcs; in drm_panel_init()
69 panel->connector_type = connector_type; in drm_panel_init()
74 * drm_panel_add - add a panel to the global registry
75 * @panel: panel to add
77 * Add a panel to the global registry so that it can be looked up by display
80 void drm_panel_add(struct drm_panel *panel) in drm_panel_add() argument
83 list_add_tail(&panel->list, &panel_list); in drm_panel_add()
89 * drm_panel_remove - remove a panel from the global registry
90 * @panel: DRM panel
92 * Removes a panel from the global registry.
94 void drm_panel_remove(struct drm_panel *panel) in drm_panel_remove() argument
97 list_del_init(&panel->list); in drm_panel_remove()
103 * drm_panel_prepare - power on a panel
104 * @panel: DRM panel
107 * the panel. After this has completed it is possible to communicate with any
112 int drm_panel_prepare(struct drm_panel *panel) in drm_panel_prepare() argument
117 if (!panel) in drm_panel_prepare()
120 if (panel->prepared) { in drm_panel_prepare()
121 dev_warn(panel->dev, "Skipping prepare of already prepared panel\n"); in drm_panel_prepare()
125 mutex_lock(&panel->follower_lock); in drm_panel_prepare()
127 if (panel->funcs && panel->funcs->prepare) { in drm_panel_prepare()
128 ret = panel->funcs->prepare(panel); in drm_panel_prepare()
132 panel->prepared = true; in drm_panel_prepare()
134 list_for_each_entry(follower, &panel->followers, list) { in drm_panel_prepare()
137 dev_info(panel->dev, "%ps failed: %d\n", in drm_panel_prepare()
143 mutex_unlock(&panel->follower_lock); in drm_panel_prepare()
150 * drm_panel_unprepare - power off a panel
151 * @panel: DRM panel
153 * Calling this function will completely power off a panel (assert the panel's
155 * is usually no longer possible to communicate with the panel until another
160 int drm_panel_unprepare(struct drm_panel *panel) in drm_panel_unprepare() argument
165 if (!panel) in drm_panel_unprepare()
170 * - Your panel driver incorrectly calls drm_panel_unprepare() in its in drm_panel_unprepare()
172 * - You are using panel-edp or panel-simple and your DRM modeset in drm_panel_unprepare()
173 * driver's shutdown() callback happened after the panel's shutdown(). in drm_panel_unprepare()
177 if (!panel->prepared) { in drm_panel_unprepare()
178 dev_warn(panel->dev, "Skipping unprepare of already unprepared panel\n"); in drm_panel_unprepare()
182 mutex_lock(&panel->follower_lock); in drm_panel_unprepare()
184 list_for_each_entry(follower, &panel->followers, list) { in drm_panel_unprepare()
187 dev_info(panel->dev, "%ps failed: %d\n", in drm_panel_unprepare()
191 if (panel->funcs && panel->funcs->unprepare) { in drm_panel_unprepare()
192 ret = panel->funcs->unprepare(panel); in drm_panel_unprepare()
196 panel->prepared = false; in drm_panel_unprepare()
200 mutex_unlock(&panel->follower_lock); in drm_panel_unprepare()
207 * drm_panel_enable - enable a panel
208 * @panel: DRM panel
210 * Calling this function will cause the panel display drivers to be turned on
216 int drm_panel_enable(struct drm_panel *panel) in drm_panel_enable() argument
220 if (!panel) in drm_panel_enable()
223 if (panel->enabled) { in drm_panel_enable()
224 dev_warn(panel->dev, "Skipping enable of already enabled panel\n"); in drm_panel_enable()
228 if (panel->funcs && panel->funcs->enable) { in drm_panel_enable()
229 ret = panel->funcs->enable(panel); in drm_panel_enable()
233 panel->enabled = true; in drm_panel_enable()
235 ret = backlight_enable(panel->backlight); in drm_panel_enable()
237 DRM_DEV_INFO(panel->dev, "failed to enable backlight: %d\n", in drm_panel_enable()
245 * drm_panel_disable - disable a panel
246 * @panel: DRM panel
248 * This will typically turn off the panel's backlight or disable the display
254 int drm_panel_disable(struct drm_panel *panel) in drm_panel_disable() argument
258 if (!panel) in drm_panel_disable()
263 * - Your panel driver incorrectly calls drm_panel_disable() in its in drm_panel_disable()
265 * - You are using panel-edp or panel-simple and your DRM modeset in drm_panel_disable()
266 * driver's shutdown() callback happened after the panel's shutdown(). in drm_panel_disable()
270 if (!panel->enabled) { in drm_panel_disable()
271 dev_warn(panel->dev, "Skipping disable of already disabled panel\n"); in drm_panel_disable()
275 ret = backlight_disable(panel->backlight); in drm_panel_disable()
277 DRM_DEV_INFO(panel->dev, "failed to disable backlight: %d\n", in drm_panel_disable()
280 if (panel->funcs && panel->funcs->disable) { in drm_panel_disable()
281 ret = panel->funcs->disable(panel); in drm_panel_disable()
285 panel->enabled = false; in drm_panel_disable()
292 * drm_panel_get_modes - probe the available display modes of a panel
293 * @panel: DRM panel
296 * The modes probed from the panel are automatically added to the connector
297 * that the panel is attached to.
299 * Return: The number of modes available from the panel on success, or 0 on
302 int drm_panel_get_modes(struct drm_panel *panel, in drm_panel_get_modes() argument
305 if (!panel) in drm_panel_get_modes()
308 if (panel->funcs && panel->funcs->get_modes) { in drm_panel_get_modes()
311 num = panel->funcs->get_modes(panel, connector); in drm_panel_get_modes()
322 * of_drm_find_panel - look up a panel using a device tree node
323 * @np: device tree node of the panel
326 * tree node. If a matching panel is found, return a pointer to it.
328 * Return: A pointer to the panel registered for the specified device tree
329 * node or an ERR_PTR() if no panel matching the device tree node can be found.
333 * - EPROBE_DEFER: the panel device has not been probed yet, and the caller
339 struct drm_panel *panel; in of_drm_find_panel() local
346 list_for_each_entry(panel, &panel_list, list) { in of_drm_find_panel()
347 if (panel->dev->of_node == np) { in of_drm_find_panel()
349 return panel; in of_drm_find_panel()
359 * of_drm_get_panel_orientation - look up the orientation of the panel through
361 * @np: device tree node of the panel
364 * Looks up the rotation of a panel in the device tree. The orientation of the
365 * panel is expressed as a property name "rotation" in the device tree. The
403 * drm_is_panel_follower() - Check if the device is a panel follower
407 * a panel using the panel follower API.
409 * The "panel" property of the follower points to the panel to be followed.
411 * Return: true if we should be power sequenced with a panel; false otherwise.
416 * The "panel" property is actually a phandle, but for simplicity we in drm_is_panel_follower()
420 return of_property_present(dev->of_node, "panel"); in drm_is_panel_follower()
425 * drm_panel_add_follower() - Register something to follow panel state.
427 * @follower: The panel follower descriptor for the follower.
429 * A panel follower is called right after preparing the panel and right before
430 * unpreparing the panel. It's primary intention is to power on an associated
432 * devices are allowed the follow the same panel.
434 * If a follower is added to a panel that's already been turned on, the
438 * The "panel" property of the follower points to the panel to be followed.
441 * follower_dev is not actually following a panel. The caller may
442 * choose to ignore this return value if following a panel is optional.
448 struct drm_panel *panel; in drm_panel_add_follower() local
451 panel_np = of_parse_phandle(follower_dev->of_node, "panel", 0); in drm_panel_add_follower()
455 panel = of_drm_find_panel(panel_np); in drm_panel_add_follower()
457 if (IS_ERR(panel)) in drm_panel_add_follower()
458 return PTR_ERR(panel); in drm_panel_add_follower()
460 get_device(panel->dev); in drm_panel_add_follower()
461 follower->panel = panel; in drm_panel_add_follower()
463 mutex_lock(&panel->follower_lock); in drm_panel_add_follower()
465 list_add_tail(&follower->list, &panel->followers); in drm_panel_add_follower()
466 if (panel->prepared) { in drm_panel_add_follower()
469 dev_info(panel->dev, "%ps failed: %d\n", in drm_panel_add_follower()
473 mutex_unlock(&panel->follower_lock); in drm_panel_add_follower()
481 * @follower: The panel follower descriptor for the follower.
484 * unprepare function if we're removed from a panel that's currently prepared.
490 struct drm_panel *panel = follower->panel; in drm_panel_remove_follower() local
493 mutex_lock(&panel->follower_lock); in drm_panel_remove_follower()
495 if (panel->prepared) { in drm_panel_remove_follower()
498 dev_info(panel->dev, "%ps failed: %d\n", in drm_panel_remove_follower()
503 mutex_unlock(&panel->follower_lock); in drm_panel_remove_follower()
505 put_device(panel->dev); in drm_panel_remove_follower()
517 * @follower: The panel follower descriptor for the follower.
540 * @panel: DRM panel
542 * Use this function to enable backlight handling if your panel
545 * When the panel is enabled backlight will be enabled after a
548 * When the panel is disabled backlight will be disabled before the
551 * A typical implementation for a panel driver supporting device tree
558 int drm_panel_of_backlight(struct drm_panel *panel) in drm_panel_of_backlight() argument
562 if (!panel || !panel->dev) in drm_panel_of_backlight()
565 backlight = devm_of_find_backlight(panel->dev); in drm_panel_of_backlight()
570 panel->backlight = backlight; in drm_panel_of_backlight()
577 MODULE_DESCRIPTION("DRM panel infrastructure");