drm/etnaviv: Replace zero-length array with flexible-array member
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_bridge.c
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sub license,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the
12  * next paragraph) shall be included in all copies or substantial portions
13  * of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23
24 #include <linux/err.h>
25 #include <linux/module.h>
26 #include <linux/mutex.h>
27
28 #include <drm/drm_bridge.h>
29 #include <drm/drm_encoder.h>
30
31 #include "drm_crtc_internal.h"
32
33 /**
34  * DOC: overview
35  *
36  * &struct drm_bridge represents a device that hangs on to an encoder. These are
37  * handy when a regular &drm_encoder entity isn't enough to represent the entire
38  * encoder chain.
39  *
40  * A bridge is always attached to a single &drm_encoder at a time, but can be
41  * either connected to it directly, or through an intermediate bridge::
42  *
43  *     encoder ---> bridge B ---> bridge A
44  *
45  * Here, the output of the encoder feeds to bridge B, and that furthers feeds to
46  * bridge A.
47  *
48  * The driver using the bridge is responsible to make the associations between
49  * the encoder and bridges. Once these links are made, the bridges will
50  * participate along with encoder functions to perform mode_set/enable/disable
51  * through the ops provided in &drm_bridge_funcs.
52  *
53  * drm_bridge, like drm_panel, aren't drm_mode_object entities like planes,
54  * CRTCs, encoders or connectors and hence are not visible to userspace. They
55  * just provide additional hooks to get the desired output at the end of the
56  * encoder chain.
57  *
58  * Bridges can also be chained up using the &drm_bridge.chain_node field.
59  *
60  * Both legacy CRTC helpers and the new atomic modeset helpers support bridges.
61  */
62
63 static DEFINE_MUTEX(bridge_lock);
64 static LIST_HEAD(bridge_list);
65
66 /**
67  * drm_bridge_add - add the given bridge to the global bridge list
68  *
69  * @bridge: bridge control structure
70  */
71 void drm_bridge_add(struct drm_bridge *bridge)
72 {
73         mutex_lock(&bridge_lock);
74         list_add_tail(&bridge->list, &bridge_list);
75         mutex_unlock(&bridge_lock);
76 }
77 EXPORT_SYMBOL(drm_bridge_add);
78
79 /**
80  * drm_bridge_remove - remove the given bridge from the global bridge list
81  *
82  * @bridge: bridge control structure
83  */
84 void drm_bridge_remove(struct drm_bridge *bridge)
85 {
86         mutex_lock(&bridge_lock);
87         list_del_init(&bridge->list);
88         mutex_unlock(&bridge_lock);
89 }
90 EXPORT_SYMBOL(drm_bridge_remove);
91
92 /**
93  * drm_bridge_attach - attach the bridge to an encoder's chain
94  *
95  * @encoder: DRM encoder
96  * @bridge: bridge to attach
97  * @previous: previous bridge in the chain (optional)
98  *
99  * Called by a kms driver to link the bridge to an encoder's chain. The previous
100  * argument specifies the previous bridge in the chain. If NULL, the bridge is
101  * linked directly at the encoder's output. Otherwise it is linked at the
102  * previous bridge's output.
103  *
104  * If non-NULL the previous bridge must be already attached by a call to this
105  * function.
106  *
107  * Note that bridges attached to encoders are auto-detached during encoder
108  * cleanup in drm_encoder_cleanup(), so drm_bridge_attach() should generally
109  * *not* be balanced with a drm_bridge_detach() in driver code.
110  *
111  * RETURNS:
112  * Zero on success, error code on failure
113  */
114 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
115                       struct drm_bridge *previous)
116 {
117         int ret;
118
119         if (!encoder || !bridge)
120                 return -EINVAL;
121
122         if (previous && (!previous->dev || previous->encoder != encoder))
123                 return -EINVAL;
124
125         if (bridge->dev)
126                 return -EBUSY;
127
128         bridge->dev = encoder->dev;
129         bridge->encoder = encoder;
130
131         if (previous)
132                 list_add(&bridge->chain_node, &previous->chain_node);
133         else
134                 list_add(&bridge->chain_node, &encoder->bridge_chain);
135
136         if (bridge->funcs->attach) {
137                 ret = bridge->funcs->attach(bridge);
138                 if (ret < 0) {
139                         list_del(&bridge->chain_node);
140                         bridge->dev = NULL;
141                         bridge->encoder = NULL;
142                         return ret;
143                 }
144         }
145
146         return 0;
147 }
148 EXPORT_SYMBOL(drm_bridge_attach);
149
150 void drm_bridge_detach(struct drm_bridge *bridge)
151 {
152         if (WARN_ON(!bridge))
153                 return;
154
155         if (WARN_ON(!bridge->dev))
156                 return;
157
158         if (bridge->funcs->detach)
159                 bridge->funcs->detach(bridge);
160
161         list_del(&bridge->chain_node);
162         bridge->dev = NULL;
163 }
164
165 /**
166  * DOC: bridge callbacks
167  *
168  * The &drm_bridge_funcs ops are populated by the bridge driver. The DRM
169  * internals (atomic and CRTC helpers) use the helpers defined in drm_bridge.c
170  * These helpers call a specific &drm_bridge_funcs op for all the bridges
171  * during encoder configuration.
172  *
173  * For detailed specification of the bridge callbacks see &drm_bridge_funcs.
174  */
175
176 /**
177  * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the
178  *                               encoder chain
179  * @bridge: bridge control structure
180  * @mode: desired mode to be set for the bridge
181  * @adjusted_mode: updated mode that works for this bridge
182  *
183  * Calls &drm_bridge_funcs.mode_fixup for all the bridges in the
184  * encoder chain, starting from the first bridge to the last.
185  *
186  * Note: the bridge passed should be the one closest to the encoder
187  *
188  * RETURNS:
189  * true on success, false on failure
190  */
191 bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge,
192                                  const struct drm_display_mode *mode,
193                                  struct drm_display_mode *adjusted_mode)
194 {
195         struct drm_encoder *encoder;
196
197         if (!bridge)
198                 return true;
199
200         encoder = bridge->encoder;
201         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
202                 if (!bridge->funcs->mode_fixup)
203                         continue;
204
205                 if (!bridge->funcs->mode_fixup(bridge, mode, adjusted_mode))
206                         return false;
207         }
208
209         return true;
210 }
211 EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
212
213 /**
214  * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
215  *                               encoder chain.
216  * @bridge: bridge control structure
217  * @mode: desired mode to be validated
218  *
219  * Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder
220  * chain, starting from the first bridge to the last. If at least one bridge
221  * does not accept the mode the function returns the error code.
222  *
223  * Note: the bridge passed should be the one closest to the encoder.
224  *
225  * RETURNS:
226  * MODE_OK on success, drm_mode_status Enum error code on failure
227  */
228 enum drm_mode_status
229 drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
230                             const struct drm_display_mode *mode)
231 {
232         struct drm_encoder *encoder;
233
234         if (!bridge)
235                 return MODE_OK;
236
237         encoder = bridge->encoder;
238         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
239                 enum drm_mode_status ret;
240
241                 if (!bridge->funcs->mode_valid)
242                         continue;
243
244                 ret = bridge->funcs->mode_valid(bridge, mode);
245                 if (ret != MODE_OK)
246                         return ret;
247         }
248
249         return MODE_OK;
250 }
251 EXPORT_SYMBOL(drm_bridge_chain_mode_valid);
252
253 /**
254  * drm_bridge_chain_disable - disables all bridges in the encoder chain
255  * @bridge: bridge control structure
256  *
257  * Calls &drm_bridge_funcs.disable op for all the bridges in the encoder
258  * chain, starting from the last bridge to the first. These are called before
259  * calling the encoder's prepare op.
260  *
261  * Note: the bridge passed should be the one closest to the encoder
262  */
263 void drm_bridge_chain_disable(struct drm_bridge *bridge)
264 {
265         struct drm_encoder *encoder;
266         struct drm_bridge *iter;
267
268         if (!bridge)
269                 return;
270
271         encoder = bridge->encoder;
272         list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
273                 if (iter->funcs->disable)
274                         iter->funcs->disable(iter);
275
276                 if (iter == bridge)
277                         break;
278         }
279 }
280 EXPORT_SYMBOL(drm_bridge_chain_disable);
281
282 /**
283  * drm_bridge_chain_post_disable - cleans up after disabling all bridges in the
284  *                                 encoder chain
285  * @bridge: bridge control structure
286  *
287  * Calls &drm_bridge_funcs.post_disable op for all the bridges in the
288  * encoder chain, starting from the first bridge to the last. These are called
289  * after completing the encoder's prepare op.
290  *
291  * Note: the bridge passed should be the one closest to the encoder
292  */
293 void drm_bridge_chain_post_disable(struct drm_bridge *bridge)
294 {
295         struct drm_encoder *encoder;
296
297         if (!bridge)
298                 return;
299
300         encoder = bridge->encoder;
301         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
302                 if (bridge->funcs->post_disable)
303                         bridge->funcs->post_disable(bridge);
304         }
305 }
306 EXPORT_SYMBOL(drm_bridge_chain_post_disable);
307
308 /**
309  * drm_bridge_chain_mode_set - set proposed mode for all bridges in the
310  *                             encoder chain
311  * @bridge: bridge control structure
312  * @mode: desired mode to be set for the encoder chain
313  * @adjusted_mode: updated mode that works for this encoder chain
314  *
315  * Calls &drm_bridge_funcs.mode_set op for all the bridges in the
316  * encoder chain, starting from the first bridge to the last.
317  *
318  * Note: the bridge passed should be the one closest to the encoder
319  */
320 void drm_bridge_chain_mode_set(struct drm_bridge *bridge,
321                                const struct drm_display_mode *mode,
322                                const struct drm_display_mode *adjusted_mode)
323 {
324         struct drm_encoder *encoder;
325
326         if (!bridge)
327                 return;
328
329         encoder = bridge->encoder;
330         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
331                 if (bridge->funcs->mode_set)
332                         bridge->funcs->mode_set(bridge, mode, adjusted_mode);
333         }
334 }
335 EXPORT_SYMBOL(drm_bridge_chain_mode_set);
336
337 /**
338  * drm_bridge_chain_pre_enable - prepares for enabling all bridges in the
339  *                               encoder chain
340  * @bridge: bridge control structure
341  *
342  * Calls &drm_bridge_funcs.pre_enable op for all the bridges in the encoder
343  * chain, starting from the last bridge to the first. These are called
344  * before calling the encoder's commit op.
345  *
346  * Note: the bridge passed should be the one closest to the encoder
347  */
348 void drm_bridge_chain_pre_enable(struct drm_bridge *bridge)
349 {
350         struct drm_encoder *encoder;
351         struct drm_bridge *iter;
352
353         if (!bridge)
354                 return;
355
356         encoder = bridge->encoder;
357         list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
358                 if (iter->funcs->pre_enable)
359                         iter->funcs->pre_enable(iter);
360         }
361 }
362 EXPORT_SYMBOL(drm_bridge_chain_pre_enable);
363
364 /**
365  * drm_bridge_chain_enable - enables all bridges in the encoder chain
366  * @bridge: bridge control structure
367  *
368  * Calls &drm_bridge_funcs.enable op for all the bridges in the encoder
369  * chain, starting from the first bridge to the last. These are called
370  * after completing the encoder's commit op.
371  *
372  * Note that the bridge passed should be the one closest to the encoder
373  */
374 void drm_bridge_chain_enable(struct drm_bridge *bridge)
375 {
376         struct drm_encoder *encoder;
377
378         if (!bridge)
379                 return;
380
381         encoder = bridge->encoder;
382         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
383                 if (bridge->funcs->enable)
384                         bridge->funcs->enable(bridge);
385         }
386 }
387 EXPORT_SYMBOL(drm_bridge_chain_enable);
388
389 /**
390  * drm_atomic_bridge_chain_disable - disables all bridges in the encoder chain
391  * @bridge: bridge control structure
392  * @old_state: old atomic state
393  *
394  * Calls &drm_bridge_funcs.atomic_disable (falls back on
395  * &drm_bridge_funcs.disable) op for all the bridges in the encoder chain,
396  * starting from the last bridge to the first. These are called before calling
397  * &drm_encoder_helper_funcs.atomic_disable
398  *
399  * Note: the bridge passed should be the one closest to the encoder
400  */
401 void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge,
402                                      struct drm_atomic_state *old_state)
403 {
404         struct drm_encoder *encoder;
405         struct drm_bridge *iter;
406
407         if (!bridge)
408                 return;
409
410         encoder = bridge->encoder;
411         list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
412                 if (iter->funcs->atomic_disable)
413                         iter->funcs->atomic_disable(iter, old_state);
414                 else if (iter->funcs->disable)
415                         iter->funcs->disable(iter);
416
417                 if (iter == bridge)
418                         break;
419         }
420 }
421 EXPORT_SYMBOL(drm_atomic_bridge_chain_disable);
422
423 /**
424  * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
425  *                                        in the encoder chain
426  * @bridge: bridge control structure
427  * @old_state: old atomic state
428  *
429  * Calls &drm_bridge_funcs.atomic_post_disable (falls back on
430  * &drm_bridge_funcs.post_disable) op for all the bridges in the encoder chain,
431  * starting from the first bridge to the last. These are called after completing
432  * &drm_encoder_helper_funcs.atomic_disable
433  *
434  * Note: the bridge passed should be the one closest to the encoder
435  */
436 void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge,
437                                           struct drm_atomic_state *old_state)
438 {
439         struct drm_encoder *encoder;
440
441         if (!bridge)
442                 return;
443
444         encoder = bridge->encoder;
445         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
446                 if (bridge->funcs->atomic_post_disable)
447                         bridge->funcs->atomic_post_disable(bridge, old_state);
448                 else if (bridge->funcs->post_disable)
449                         bridge->funcs->post_disable(bridge);
450         }
451 }
452 EXPORT_SYMBOL(drm_atomic_bridge_chain_post_disable);
453
454 /**
455  * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
456  *                                      the encoder chain
457  * @bridge: bridge control structure
458  * @old_state: old atomic state
459  *
460  * Calls &drm_bridge_funcs.atomic_pre_enable (falls back on
461  * &drm_bridge_funcs.pre_enable) op for all the bridges in the encoder chain,
462  * starting from the last bridge to the first. These are called before calling
463  * &drm_encoder_helper_funcs.atomic_enable
464  *
465  * Note: the bridge passed should be the one closest to the encoder
466  */
467 void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge,
468                                         struct drm_atomic_state *old_state)
469 {
470         struct drm_encoder *encoder;
471         struct drm_bridge *iter;
472
473         if (!bridge)
474                 return;
475
476         encoder = bridge->encoder;
477         list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
478                 if (iter->funcs->atomic_pre_enable)
479                         iter->funcs->atomic_pre_enable(iter, old_state);
480                 else if (iter->funcs->pre_enable)
481                         iter->funcs->pre_enable(iter);
482
483                 if (iter == bridge)
484                         break;
485         }
486 }
487 EXPORT_SYMBOL(drm_atomic_bridge_chain_pre_enable);
488
489 /**
490  * drm_atomic_bridge_chain_enable - enables all bridges in the encoder chain
491  * @bridge: bridge control structure
492  * @old_state: old atomic state
493  *
494  * Calls &drm_bridge_funcs.atomic_enable (falls back on
495  * &drm_bridge_funcs.enable) op for all the bridges in the encoder chain,
496  * starting from the first bridge to the last. These are called after completing
497  * &drm_encoder_helper_funcs.atomic_enable
498  *
499  * Note: the bridge passed should be the one closest to the encoder
500  */
501 void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge,
502                                     struct drm_atomic_state *old_state)
503 {
504         struct drm_encoder *encoder;
505
506         if (!bridge)
507                 return;
508
509         encoder = bridge->encoder;
510         list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
511                 if (bridge->funcs->atomic_enable)
512                         bridge->funcs->atomic_enable(bridge, old_state);
513                 else if (bridge->funcs->enable)
514                         bridge->funcs->enable(bridge);
515         }
516 }
517 EXPORT_SYMBOL(drm_atomic_bridge_chain_enable);
518
519 #ifdef CONFIG_OF
520 /**
521  * of_drm_find_bridge - find the bridge corresponding to the device node in
522  *                      the global bridge list
523  *
524  * @np: device node
525  *
526  * RETURNS:
527  * drm_bridge control struct on success, NULL on failure
528  */
529 struct drm_bridge *of_drm_find_bridge(struct device_node *np)
530 {
531         struct drm_bridge *bridge;
532
533         mutex_lock(&bridge_lock);
534
535         list_for_each_entry(bridge, &bridge_list, list) {
536                 if (bridge->of_node == np) {
537                         mutex_unlock(&bridge_lock);
538                         return bridge;
539                 }
540         }
541
542         mutex_unlock(&bridge_lock);
543         return NULL;
544 }
545 EXPORT_SYMBOL(of_drm_find_bridge);
546 #endif
547
548 MODULE_AUTHOR("Ajay Kumar <ajaykumar.rs@samsung.com>");
549 MODULE_DESCRIPTION("DRM bridge infrastructure");
550 MODULE_LICENSE("GPL and additional rights");