xref: /linux/drivers/gpu/drm/bridge/panel.c (revision 25489a4f556414445d342951615178368ee45cde)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2016 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
4  * Copyright (C) 2017 Broadcom
5  */
6 
7 #include <linux/debugfs.h>
8 
9 #include <drm/drm_atomic_helper.h>
10 #include <drm/drm_bridge.h>
11 #include <drm/drm_connector.h>
12 #include <drm/drm_encoder.h>
13 #include <drm/drm_managed.h>
14 #include <drm/drm_modeset_helper_vtables.h>
15 #include <drm/drm_of.h>
16 #include <drm/drm_panel.h>
17 #include <drm/drm_print.h>
18 #include <drm/drm_probe_helper.h>
19 
20 struct panel_bridge {
21 	struct drm_bridge bridge;
22 	struct drm_connector connector;
23 	struct drm_panel *panel;
24 	u32 connector_type;
25 };
26 
27 static inline struct panel_bridge *
28 drm_bridge_to_panel_bridge(struct drm_bridge *bridge)
29 {
30 	return container_of(bridge, struct panel_bridge, bridge);
31 }
32 
33 static inline struct panel_bridge *
34 drm_connector_to_panel_bridge(struct drm_connector *connector)
35 {
36 	return container_of(connector, struct panel_bridge, connector);
37 }
38 
39 static int panel_bridge_connector_get_modes(struct drm_connector *connector)
40 {
41 	struct panel_bridge *panel_bridge =
42 		drm_connector_to_panel_bridge(connector);
43 
44 	return drm_panel_get_modes(panel_bridge->panel, connector);
45 }
46 
47 static const struct drm_connector_helper_funcs
48 panel_bridge_connector_helper_funcs = {
49 	.get_modes = panel_bridge_connector_get_modes,
50 };
51 
52 static const struct drm_connector_funcs panel_bridge_connector_funcs = {
53 	.reset = drm_atomic_helper_connector_reset,
54 	.fill_modes = drm_helper_probe_single_connector_modes,
55 	.destroy = drm_connector_cleanup,
56 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
57 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
58 };
59 
60 static int panel_bridge_attach(struct drm_bridge *bridge,
61 			       struct drm_encoder *encoder,
62 			       enum drm_bridge_attach_flags flags)
63 {
64 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
65 	struct drm_connector *connector = &panel_bridge->connector;
66 	int ret;
67 
68 	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
69 		return 0;
70 
71 	drm_connector_helper_add(connector,
72 				 &panel_bridge_connector_helper_funcs);
73 
74 	ret = drm_connector_init(bridge->dev, connector,
75 				 &panel_bridge_connector_funcs,
76 				 panel_bridge->connector_type);
77 	if (ret) {
78 		DRM_ERROR("Failed to initialize connector\n");
79 		return ret;
80 	}
81 
82 	drm_panel_bridge_set_orientation(connector, bridge);
83 
84 	drm_connector_attach_encoder(&panel_bridge->connector,
85 					  encoder);
86 
87 	if (bridge->dev->registered) {
88 		if (connector->funcs->reset)
89 			connector->funcs->reset(connector);
90 		drm_connector_register(connector);
91 	}
92 
93 	return 0;
94 }
95 
96 static void panel_bridge_detach(struct drm_bridge *bridge)
97 {
98 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
99 	struct drm_connector *connector = &panel_bridge->connector;
100 
101 	/*
102 	 * Cleanup the connector if we know it was initialized.
103 	 *
104 	 * FIXME: This wouldn't be needed if the panel_bridge structure was
105 	 * allocated with drmm_kzalloc(). This might be tricky since the
106 	 * drm_device pointer can only be retrieved when the bridge is attached.
107 	 */
108 	if (connector->dev)
109 		drm_connector_cleanup(connector);
110 }
111 
112 static void panel_bridge_atomic_pre_enable(struct drm_bridge *bridge,
113 					   struct drm_atomic_state *atomic_state)
114 {
115 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
116 	struct drm_encoder *encoder = bridge->encoder;
117 	struct drm_crtc *crtc;
118 	struct drm_crtc_state *old_crtc_state;
119 
120 	crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder);
121 	if (!crtc)
122 		return;
123 
124 	old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc);
125 	if (old_crtc_state && old_crtc_state->self_refresh_active)
126 		return;
127 
128 	drm_panel_prepare(panel_bridge->panel);
129 }
130 
131 static void panel_bridge_atomic_enable(struct drm_bridge *bridge,
132 				       struct drm_atomic_state *atomic_state)
133 {
134 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
135 	struct drm_encoder *encoder = bridge->encoder;
136 	struct drm_crtc *crtc;
137 	struct drm_crtc_state *old_crtc_state;
138 
139 	crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder);
140 	if (!crtc)
141 		return;
142 
143 	old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc);
144 	if (old_crtc_state && old_crtc_state->self_refresh_active)
145 		return;
146 
147 	drm_panel_enable(panel_bridge->panel);
148 }
149 
150 static void panel_bridge_atomic_disable(struct drm_bridge *bridge,
151 					struct drm_atomic_state *atomic_state)
152 {
153 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
154 	struct drm_encoder *encoder = bridge->encoder;
155 	struct drm_crtc *crtc;
156 	struct drm_crtc_state *new_crtc_state;
157 
158 	crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder);
159 	if (!crtc)
160 		return;
161 
162 	new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc);
163 	if (new_crtc_state && new_crtc_state->self_refresh_active)
164 		return;
165 
166 	drm_panel_disable(panel_bridge->panel);
167 }
168 
169 static void panel_bridge_atomic_post_disable(struct drm_bridge *bridge,
170 					     struct drm_atomic_state *atomic_state)
171 {
172 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
173 	struct drm_encoder *encoder = bridge->encoder;
174 	struct drm_crtc *crtc;
175 	struct drm_crtc_state *new_crtc_state;
176 
177 	crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder);
178 	if (!crtc)
179 		return;
180 
181 	new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc);
182 	if (new_crtc_state && new_crtc_state->self_refresh_active)
183 		return;
184 
185 	drm_panel_unprepare(panel_bridge->panel);
186 }
187 
188 static int panel_bridge_get_modes(struct drm_bridge *bridge,
189 				  struct drm_connector *connector)
190 {
191 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
192 
193 	return drm_panel_get_modes(panel_bridge->panel, connector);
194 }
195 
196 static void panel_bridge_debugfs_init(struct drm_bridge *bridge,
197 				      struct dentry *root)
198 {
199 	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
200 	struct drm_panel *panel = panel_bridge->panel;
201 
202 	root = debugfs_create_dir("panel", root);
203 	if (panel->funcs->debugfs_init)
204 		panel->funcs->debugfs_init(panel, root);
205 }
206 
207 static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
208 	.attach = panel_bridge_attach,
209 	.detach = panel_bridge_detach,
210 	.atomic_pre_enable = panel_bridge_atomic_pre_enable,
211 	.atomic_enable = panel_bridge_atomic_enable,
212 	.atomic_disable = panel_bridge_atomic_disable,
213 	.atomic_post_disable = panel_bridge_atomic_post_disable,
214 	.get_modes = panel_bridge_get_modes,
215 	.atomic_reset = drm_atomic_helper_bridge_reset,
216 	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
217 	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
218 	.atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
219 	.debugfs_init = panel_bridge_debugfs_init,
220 };
221 
222 /**
223  * drm_bridge_is_panel - Checks if a drm_bridge is a panel_bridge.
224  *
225  * @bridge: The drm_bridge to be checked.
226  *
227  * Returns true if the bridge is a panel bridge, or false otherwise.
228  */
229 bool drm_bridge_is_panel(const struct drm_bridge *bridge)
230 {
231 	return bridge->funcs == &panel_bridge_bridge_funcs;
232 }
233 EXPORT_SYMBOL(drm_bridge_is_panel);
234 
235 /**
236  * drm_panel_bridge_add - Creates a &drm_bridge and &drm_connector that
237  * just calls the appropriate functions from &drm_panel.
238  *
239  * @panel: The drm_panel being wrapped.  Must be non-NULL.
240  *
241  * For drivers converting from directly using drm_panel: The expected
242  * usage pattern is that during either encoder module probe or DSI
243  * host attach, a drm_panel will be looked up through
244  * drm_of_find_panel_or_bridge().  drm_panel_bridge_add() is used to
245  * wrap that panel in the new bridge, and the result can then be
246  * passed to drm_bridge_attach().  The drm_panel_prepare() and related
247  * functions can be dropped from the encoder driver (they're now
248  * called by the KMS helpers before calling into the encoder), along
249  * with connector creation.  When done with the bridge (after
250  * drm_mode_config_cleanup() if the bridge has already been attached), then
251  * drm_panel_bridge_remove() to free it.
252  *
253  * The connector type is set to @panel->connector_type, which must be set to a
254  * known type. Calling this function with a panel whose connector type is
255  * DRM_MODE_CONNECTOR_Unknown will return ERR_PTR(-EINVAL).
256  *
257  * See devm_drm_panel_bridge_add() for an automatically managed version of this
258  * function.
259  */
260 struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel)
261 {
262 	if (WARN_ON(panel->connector_type == DRM_MODE_CONNECTOR_Unknown))
263 		return ERR_PTR(-EINVAL);
264 
265 	return drm_panel_bridge_add_typed(panel, panel->connector_type);
266 }
267 EXPORT_SYMBOL(drm_panel_bridge_add);
268 
269 /**
270  * drm_panel_bridge_add_typed - Creates a &drm_bridge and &drm_connector with
271  * an explicit connector type.
272  * @panel: The drm_panel being wrapped.  Must be non-NULL.
273  * @connector_type: The connector type (DRM_MODE_CONNECTOR_*)
274  *
275  * This is just like drm_panel_bridge_add(), but forces the connector type to
276  * @connector_type instead of infering it from the panel.
277  *
278  * This function is deprecated and should not be used in new drivers. Use
279  * drm_panel_bridge_add() instead, and fix panel drivers as necessary if they
280  * don't report a connector type.
281  */
282 struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
283 					      u32 connector_type)
284 {
285 	struct panel_bridge *panel_bridge;
286 
287 	if (!panel)
288 		return ERR_PTR(-EINVAL);
289 
290 	panel_bridge = devm_kzalloc(panel->dev, sizeof(*panel_bridge),
291 				    GFP_KERNEL);
292 	if (!panel_bridge)
293 		return ERR_PTR(-ENOMEM);
294 
295 	panel_bridge->connector_type = connector_type;
296 	panel_bridge->panel = panel;
297 
298 	panel_bridge->bridge.funcs = &panel_bridge_bridge_funcs;
299 	panel_bridge->bridge.of_node = panel->dev->of_node;
300 	panel_bridge->bridge.ops = DRM_BRIDGE_OP_MODES;
301 	panel_bridge->bridge.type = connector_type;
302 
303 	drm_bridge_add(&panel_bridge->bridge);
304 
305 	return &panel_bridge->bridge;
306 }
307 EXPORT_SYMBOL(drm_panel_bridge_add_typed);
308 
309 /**
310  * drm_panel_bridge_remove - Unregisters and frees a drm_bridge
311  * created by drm_panel_bridge_add().
312  *
313  * @bridge: The drm_bridge being freed.
314  */
315 void drm_panel_bridge_remove(struct drm_bridge *bridge)
316 {
317 	struct panel_bridge *panel_bridge;
318 
319 	if (!bridge)
320 		return;
321 
322 	if (!drm_bridge_is_panel(bridge)) {
323 		drm_warn(bridge->dev, "%s: called on non-panel bridge!\n", __func__);
324 		return;
325 	}
326 
327 	panel_bridge = drm_bridge_to_panel_bridge(bridge);
328 
329 	drm_bridge_remove(bridge);
330 	devm_kfree(panel_bridge->panel->dev, bridge);
331 }
332 EXPORT_SYMBOL(drm_panel_bridge_remove);
333 
334 /**
335  * drm_panel_bridge_set_orientation - Set the connector's panel orientation
336  * from the bridge that can be transformed to panel bridge.
337  *
338  * @connector: The connector to be set panel orientation.
339  * @bridge: The drm_bridge to be transformed to panel bridge.
340  *
341  * Returns 0 on success, negative errno on failure.
342  */
343 int drm_panel_bridge_set_orientation(struct drm_connector *connector,
344 				     struct drm_bridge *bridge)
345 {
346 	struct panel_bridge *panel_bridge;
347 
348 	panel_bridge = drm_bridge_to_panel_bridge(bridge);
349 
350 	return drm_connector_set_orientation_from_panel(connector,
351 							panel_bridge->panel);
352 }
353 EXPORT_SYMBOL(drm_panel_bridge_set_orientation);
354 
355 static void devm_drm_panel_bridge_release(struct device *dev, void *res)
356 {
357 	struct drm_bridge *bridge = *(struct drm_bridge **)res;
358 
359 	if (!bridge)
360 		return;
361 
362 	drm_bridge_remove(bridge);
363 }
364 
365 /**
366  * devm_drm_panel_bridge_add - Creates a managed &drm_bridge and &drm_connector
367  * that just calls the appropriate functions from &drm_panel.
368  * @dev: device to tie the bridge lifetime to
369  * @panel: The drm_panel being wrapped.  Must be non-NULL.
370  *
371  * This is the managed version of drm_panel_bridge_add() which automatically
372  * calls drm_panel_bridge_remove() when @dev is unbound.
373  */
374 struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
375 					     struct drm_panel *panel)
376 {
377 	if (WARN_ON(panel->connector_type == DRM_MODE_CONNECTOR_Unknown))
378 		return ERR_PTR(-EINVAL);
379 
380 	return devm_drm_panel_bridge_add_typed(dev, panel,
381 					       panel->connector_type);
382 }
383 EXPORT_SYMBOL(devm_drm_panel_bridge_add);
384 
385 /**
386  * devm_drm_panel_bridge_add_typed - Creates a managed &drm_bridge and
387  * &drm_connector with an explicit connector type.
388  * @dev: device to tie the bridge lifetime to
389  * @panel: The drm_panel being wrapped.  Must be non-NULL.
390  * @connector_type: The connector type (DRM_MODE_CONNECTOR_*)
391  *
392  * This is just like devm_drm_panel_bridge_add(), but forces the connector type
393  * to @connector_type instead of infering it from the panel.
394  *
395  * This function is deprecated and should not be used in new drivers. Use
396  * devm_drm_panel_bridge_add() instead, and fix panel drivers as necessary if
397  * they don't report a connector type.
398  */
399 struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
400 						   struct drm_panel *panel,
401 						   u32 connector_type)
402 {
403 	struct drm_bridge **ptr, *bridge;
404 
405 	ptr = devres_alloc(devm_drm_panel_bridge_release, sizeof(*ptr),
406 			   GFP_KERNEL);
407 	if (!ptr)
408 		return ERR_PTR(-ENOMEM);
409 
410 	bridge = drm_panel_bridge_add_typed(panel, connector_type);
411 	if (IS_ERR(bridge)) {
412 		devres_free(ptr);
413 		return bridge;
414 	}
415 
416 	bridge->pre_enable_prev_first = panel->prepare_prev_first;
417 
418 	*ptr = bridge;
419 	devres_add(dev, ptr);
420 
421 	return bridge;
422 }
423 EXPORT_SYMBOL(devm_drm_panel_bridge_add_typed);
424 
425 static void drmm_drm_panel_bridge_release(struct drm_device *drm, void *ptr)
426 {
427 	struct drm_bridge *bridge = ptr;
428 
429 	drm_panel_bridge_remove(bridge);
430 }
431 
432 /**
433  * drmm_panel_bridge_add - Creates a DRM-managed &drm_bridge and
434  *                         &drm_connector that just calls the
435  *                         appropriate functions from &drm_panel.
436  *
437  * @drm: DRM device to tie the bridge lifetime to
438  * @panel: The drm_panel being wrapped.  Must be non-NULL.
439  *
440  * This is the DRM-managed version of drm_panel_bridge_add() which
441  * automatically calls drm_panel_bridge_remove() when @dev is cleaned
442  * up.
443  */
444 struct drm_bridge *drmm_panel_bridge_add(struct drm_device *drm,
445 					 struct drm_panel *panel)
446 {
447 	struct drm_bridge *bridge;
448 	int ret;
449 
450 	bridge = drm_panel_bridge_add_typed(panel, panel->connector_type);
451 	if (IS_ERR(bridge))
452 		return bridge;
453 
454 	ret = drmm_add_action_or_reset(drm, drmm_drm_panel_bridge_release,
455 				       bridge);
456 	if (ret)
457 		return ERR_PTR(ret);
458 
459 	bridge->pre_enable_prev_first = panel->prepare_prev_first;
460 
461 	return bridge;
462 }
463 EXPORT_SYMBOL(drmm_panel_bridge_add);
464 
465 /**
466  * drm_panel_bridge_connector - return the connector for the panel bridge
467  * @bridge: The drm_bridge.
468  *
469  * drm_panel_bridge creates the connector.
470  * This function gives external access to the connector.
471  *
472  * Returns: Pointer to drm_connector
473  */
474 struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge)
475 {
476 	struct panel_bridge *panel_bridge;
477 
478 	panel_bridge = drm_bridge_to_panel_bridge(bridge);
479 
480 	return &panel_bridge->connector;
481 }
482 EXPORT_SYMBOL(drm_panel_bridge_connector);
483 
484 #ifdef CONFIG_OF
485 /**
486  * devm_drm_of_get_bridge - Return next bridge in the chain
487  * @dev: device to tie the bridge lifetime to
488  * @np: device tree node containing encoder output ports
489  * @port: port in the device tree node
490  * @endpoint: endpoint in the device tree node
491  *
492  * Given a DT node's port and endpoint number, finds the connected node
493  * and returns the associated bridge if any, or creates and returns a
494  * drm panel bridge instance if a panel is connected.
495  *
496  * Returns a pointer to the bridge if successful, or an error pointer
497  * otherwise.
498  */
499 struct drm_bridge *devm_drm_of_get_bridge(struct device *dev,
500 					  struct device_node *np,
501 					  u32 port, u32 endpoint)
502 {
503 	struct drm_bridge *bridge;
504 	struct drm_panel *panel;
505 	int ret;
506 
507 	ret = drm_of_find_panel_or_bridge(np, port, endpoint,
508 					  &panel, &bridge);
509 	if (ret)
510 		return ERR_PTR(ret);
511 
512 	if (panel)
513 		bridge = devm_drm_panel_bridge_add(dev, panel);
514 
515 	return bridge;
516 }
517 EXPORT_SYMBOL(devm_drm_of_get_bridge);
518 
519 /**
520  * drmm_of_get_bridge - Return next bridge in the chain
521  * @drm: device to tie the bridge lifetime to
522  * @np: device tree node containing encoder output ports
523  * @port: port in the device tree node
524  * @endpoint: endpoint in the device tree node
525  *
526  * Given a DT node's port and endpoint number, finds the connected node
527  * and returns the associated bridge if any, or creates and returns a
528  * drm panel bridge instance if a panel is connected.
529  *
530  * Returns a drmm managed pointer to the bridge if successful, or an error
531  * pointer otherwise.
532  */
533 struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm,
534 				      struct device_node *np,
535 				      u32 port, u32 endpoint)
536 {
537 	struct drm_bridge *bridge;
538 	struct drm_panel *panel;
539 	int ret;
540 
541 	ret = drm_of_find_panel_or_bridge(np, port, endpoint,
542 					  &panel, &bridge);
543 	if (ret)
544 		return ERR_PTR(ret);
545 
546 	if (panel)
547 		bridge = drmm_panel_bridge_add(drm, panel);
548 
549 	return bridge;
550 }
551 EXPORT_SYMBOL(drmm_of_get_bridge);
552 
553 #endif
554