xref: /openbmc/linux/include/drm/drm_bridge.h (revision 4ec5c905)
1199e4e96SDaniel Vetter /*
2199e4e96SDaniel Vetter  * Copyright (c) 2016 Intel Corporation
3199e4e96SDaniel Vetter  *
4199e4e96SDaniel Vetter  * Permission to use, copy, modify, distribute, and sell this software and its
5199e4e96SDaniel Vetter  * documentation for any purpose is hereby granted without fee, provided that
6199e4e96SDaniel Vetter  * the above copyright notice appear in all copies and that both that copyright
7199e4e96SDaniel Vetter  * notice and this permission notice appear in supporting documentation, and
8199e4e96SDaniel Vetter  * that the name of the copyright holders not be used in advertising or
9199e4e96SDaniel Vetter  * publicity pertaining to distribution of the software without specific,
10199e4e96SDaniel Vetter  * written prior permission.  The copyright holders make no representations
11199e4e96SDaniel Vetter  * about the suitability of this software for any purpose.  It is provided "as
12199e4e96SDaniel Vetter  * is" without express or implied warranty.
13199e4e96SDaniel Vetter  *
14199e4e96SDaniel Vetter  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15199e4e96SDaniel Vetter  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16199e4e96SDaniel Vetter  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17199e4e96SDaniel Vetter  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18199e4e96SDaniel Vetter  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19199e4e96SDaniel Vetter  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20199e4e96SDaniel Vetter  * OF THIS SOFTWARE.
21199e4e96SDaniel Vetter  */
22199e4e96SDaniel Vetter 
23199e4e96SDaniel Vetter #ifndef __DRM_BRIDGE_H__
24199e4e96SDaniel Vetter #define __DRM_BRIDGE_H__
25199e4e96SDaniel Vetter 
26199e4e96SDaniel Vetter #include <linux/list.h>
27199e4e96SDaniel Vetter #include <linux/ctype.h>
2835a61fe9SBoris Brezillon #include <drm/drm_encoder.h>
29199e4e96SDaniel Vetter #include <drm/drm_mode_object.h>
30199e4e96SDaniel Vetter #include <drm/drm_modes.h>
31199e4e96SDaniel Vetter 
32199e4e96SDaniel Vetter struct drm_bridge;
3336a776dfSLinus Walleij struct drm_bridge_timings;
3413dfc054SEric Anholt struct drm_panel;
35199e4e96SDaniel Vetter 
36199e4e96SDaniel Vetter /**
37199e4e96SDaniel Vetter  * struct drm_bridge_funcs - drm_bridge control functions
38199e4e96SDaniel Vetter  */
39199e4e96SDaniel Vetter struct drm_bridge_funcs {
40199e4e96SDaniel Vetter 	/**
41199e4e96SDaniel Vetter 	 * @attach:
42199e4e96SDaniel Vetter 	 *
43199e4e96SDaniel Vetter 	 * This callback is invoked whenever our bridge is being attached to a
44199e4e96SDaniel Vetter 	 * &drm_encoder.
45199e4e96SDaniel Vetter 	 *
46fe9e557dSLaurent Pinchart 	 * The @attach callback is optional.
47199e4e96SDaniel Vetter 	 *
48199e4e96SDaniel Vetter 	 * RETURNS:
49199e4e96SDaniel Vetter 	 *
50199e4e96SDaniel Vetter 	 * Zero on success, error code on failure.
51199e4e96SDaniel Vetter 	 */
52199e4e96SDaniel Vetter 	int (*attach)(struct drm_bridge *bridge);
53199e4e96SDaniel Vetter 
54199e4e96SDaniel Vetter 	/**
55199e4e96SDaniel Vetter 	 * @detach:
56199e4e96SDaniel Vetter 	 *
57199e4e96SDaniel Vetter 	 * This callback is invoked whenever our bridge is being detached from a
58199e4e96SDaniel Vetter 	 * &drm_encoder.
59199e4e96SDaniel Vetter 	 *
60fe9e557dSLaurent Pinchart 	 * The @detach callback is optional.
61199e4e96SDaniel Vetter 	 */
62199e4e96SDaniel Vetter 	void (*detach)(struct drm_bridge *bridge);
63199e4e96SDaniel Vetter 
64199e4e96SDaniel Vetter 	/**
653eb220a5SJose Abreu 	 * @mode_valid:
663eb220a5SJose Abreu 	 *
673eb220a5SJose Abreu 	 * This callback is used to check if a specific mode is valid in this
683eb220a5SJose Abreu 	 * bridge. This should be implemented if the bridge has some sort of
693eb220a5SJose Abreu 	 * restriction in the modes it can display. For example, a given bridge
703eb220a5SJose Abreu 	 * may be responsible to set a clock value. If the clock can not
713eb220a5SJose Abreu 	 * produce all the values for the available modes then this callback
723eb220a5SJose Abreu 	 * can be used to restrict the number of modes to only the ones that
733eb220a5SJose Abreu 	 * can be displayed.
743eb220a5SJose Abreu 	 *
753eb220a5SJose Abreu 	 * This hook is used by the probe helpers to filter the mode list in
763eb220a5SJose Abreu 	 * drm_helper_probe_single_connector_modes(), and it is used by the
773eb220a5SJose Abreu 	 * atomic helpers to validate modes supplied by userspace in
783eb220a5SJose Abreu 	 * drm_atomic_helper_check_modeset().
793eb220a5SJose Abreu 	 *
80fe9e557dSLaurent Pinchart 	 * The @mode_valid callback is optional.
813eb220a5SJose Abreu 	 *
823eb220a5SJose Abreu 	 * NOTE:
833eb220a5SJose Abreu 	 *
843eb220a5SJose Abreu 	 * Since this function is both called from the check phase of an atomic
853eb220a5SJose Abreu 	 * commit, and the mode validation in the probe paths it is not allowed
863eb220a5SJose Abreu 	 * to look at anything else but the passed-in mode, and validate it
873eb220a5SJose Abreu 	 * against configuration-invariant hardward constraints. Any further
883eb220a5SJose Abreu 	 * limits which depend upon the configuration can only be checked in
893eb220a5SJose Abreu 	 * @mode_fixup.
903eb220a5SJose Abreu 	 *
913eb220a5SJose Abreu 	 * RETURNS:
923eb220a5SJose Abreu 	 *
933eb220a5SJose Abreu 	 * drm_mode_status Enum
943eb220a5SJose Abreu 	 */
95312924d3SLinus Walleij 	enum drm_mode_status (*mode_valid)(struct drm_bridge *bridge,
963eb220a5SJose Abreu 					   const struct drm_display_mode *mode);
973eb220a5SJose Abreu 
983eb220a5SJose Abreu 	/**
99199e4e96SDaniel Vetter 	 * @mode_fixup:
100199e4e96SDaniel Vetter 	 *
1015d435b46SPhilippe Cornu 	 * This callback is used to validate and adjust a mode. The parameter
102199e4e96SDaniel Vetter 	 * mode is the display mode that should be fed to the next element in
103199e4e96SDaniel Vetter 	 * the display chain, either the final &drm_connector or the next
104199e4e96SDaniel Vetter 	 * &drm_bridge. The parameter adjusted_mode is the input mode the bridge
105199e4e96SDaniel Vetter 	 * requires. It can be modified by this callback and does not need to
1069de5d4a6SDaniel Vetter 	 * match mode. See also &drm_crtc_state.adjusted_mode for more details.
107199e4e96SDaniel Vetter 	 *
108199e4e96SDaniel Vetter 	 * This is the only hook that allows a bridge to reject a modeset. If
109199e4e96SDaniel Vetter 	 * this function passes all other callbacks must succeed for this
110199e4e96SDaniel Vetter 	 * configuration.
111199e4e96SDaniel Vetter 	 *
112fe9e557dSLaurent Pinchart 	 * The @mode_fixup callback is optional.
113199e4e96SDaniel Vetter 	 *
114199e4e96SDaniel Vetter 	 * NOTE:
115199e4e96SDaniel Vetter 	 *
116199e4e96SDaniel Vetter 	 * This function is called in the check phase of atomic modesets, which
117199e4e96SDaniel Vetter 	 * can be aborted for any reason (including on userspace's request to
118199e4e96SDaniel Vetter 	 * just check whether a configuration would be possible). Drivers MUST
119199e4e96SDaniel Vetter 	 * NOT touch any persistent state (hardware or software) or data
120199e4e96SDaniel Vetter 	 * structures except the passed in @state parameter.
121199e4e96SDaniel Vetter 	 *
1223eb220a5SJose Abreu 	 * Also beware that userspace can request its own custom modes, neither
1233eb220a5SJose Abreu 	 * core nor helpers filter modes to the list of probe modes reported by
1243eb220a5SJose Abreu 	 * the GETCONNECTOR IOCTL and stored in &drm_connector.modes. To ensure
1253eb220a5SJose Abreu 	 * that modes are filtered consistently put any bridge constraints and
1263eb220a5SJose Abreu 	 * limits checks into @mode_valid.
1273eb220a5SJose Abreu 	 *
128199e4e96SDaniel Vetter 	 * RETURNS:
129199e4e96SDaniel Vetter 	 *
130199e4e96SDaniel Vetter 	 * True if an acceptable configuration is possible, false if the modeset
131199e4e96SDaniel Vetter 	 * operation should be rejected.
132199e4e96SDaniel Vetter 	 */
133199e4e96SDaniel Vetter 	bool (*mode_fixup)(struct drm_bridge *bridge,
134199e4e96SDaniel Vetter 			   const struct drm_display_mode *mode,
135199e4e96SDaniel Vetter 			   struct drm_display_mode *adjusted_mode);
136199e4e96SDaniel Vetter 	/**
137199e4e96SDaniel Vetter 	 * @disable:
138199e4e96SDaniel Vetter 	 *
139199e4e96SDaniel Vetter 	 * This callback should disable the bridge. It is called right before
140199e4e96SDaniel Vetter 	 * the preceding element in the display pipe is disabled. If the
141199e4e96SDaniel Vetter 	 * preceding element is a bridge this means it's called before that
1424541d31eSDaniel Vetter 	 * bridge's @disable vfunc. If the preceding element is a &drm_encoder
1434541d31eSDaniel Vetter 	 * it's called right before the &drm_encoder_helper_funcs.disable,
1444541d31eSDaniel Vetter 	 * &drm_encoder_helper_funcs.prepare or &drm_encoder_helper_funcs.dpms
1454541d31eSDaniel Vetter 	 * hook.
146199e4e96SDaniel Vetter 	 *
147199e4e96SDaniel Vetter 	 * The bridge can assume that the display pipe (i.e. clocks and timing
148199e4e96SDaniel Vetter 	 * signals) feeding it is still running when this callback is called.
149199e4e96SDaniel Vetter 	 *
150fe9e557dSLaurent Pinchart 	 * The @disable callback is optional.
151199e4e96SDaniel Vetter 	 */
152199e4e96SDaniel Vetter 	void (*disable)(struct drm_bridge *bridge);
153199e4e96SDaniel Vetter 
154199e4e96SDaniel Vetter 	/**
155199e4e96SDaniel Vetter 	 * @post_disable:
156199e4e96SDaniel Vetter 	 *
1574541d31eSDaniel Vetter 	 * This callback should disable the bridge. It is called right after the
1584541d31eSDaniel Vetter 	 * preceding element in the display pipe is disabled. If the preceding
1594541d31eSDaniel Vetter 	 * element is a bridge this means it's called after that bridge's
1604541d31eSDaniel Vetter 	 * @post_disable function. If the preceding element is a &drm_encoder
1614541d31eSDaniel Vetter 	 * it's called right after the encoder's
1624541d31eSDaniel Vetter 	 * &drm_encoder_helper_funcs.disable, &drm_encoder_helper_funcs.prepare
1634541d31eSDaniel Vetter 	 * or &drm_encoder_helper_funcs.dpms hook.
164199e4e96SDaniel Vetter 	 *
165199e4e96SDaniel Vetter 	 * The bridge must assume that the display pipe (i.e. clocks and timing
166199e4e96SDaniel Vetter 	 * singals) feeding it is no longer running when this callback is
167199e4e96SDaniel Vetter 	 * called.
168199e4e96SDaniel Vetter 	 *
169fe9e557dSLaurent Pinchart 	 * The @post_disable callback is optional.
170199e4e96SDaniel Vetter 	 */
171199e4e96SDaniel Vetter 	void (*post_disable)(struct drm_bridge *bridge);
172199e4e96SDaniel Vetter 
173199e4e96SDaniel Vetter 	/**
174199e4e96SDaniel Vetter 	 * @mode_set:
175199e4e96SDaniel Vetter 	 *
176199e4e96SDaniel Vetter 	 * This callback should set the given mode on the bridge. It is called
1774541d31eSDaniel Vetter 	 * after the @mode_set callback for the preceding element in the display
1784541d31eSDaniel Vetter 	 * pipeline has been called already. If the bridge is the first element
1794541d31eSDaniel Vetter 	 * then this would be &drm_encoder_helper_funcs.mode_set. The display
1804541d31eSDaniel Vetter 	 * pipe (i.e.  clocks and timing signals) is off when this function is
1814541d31eSDaniel Vetter 	 * called.
182584a0146SPhilippe Cornu 	 *
183584a0146SPhilippe Cornu 	 * The adjusted_mode parameter is the mode output by the CRTC for the
184584a0146SPhilippe Cornu 	 * first bridge in the chain. It can be different from the mode
185584a0146SPhilippe Cornu 	 * parameter that contains the desired mode for the connector at the end
186584a0146SPhilippe Cornu 	 * of the bridges chain, for instance when the first bridge in the chain
187584a0146SPhilippe Cornu 	 * performs scaling. The adjusted mode is mostly useful for the first
188584a0146SPhilippe Cornu 	 * bridge in the chain and is likely irrelevant for the other bridges.
189584a0146SPhilippe Cornu 	 *
190584a0146SPhilippe Cornu 	 * For atomic drivers the adjusted_mode is the mode stored in
191584a0146SPhilippe Cornu 	 * &drm_crtc_state.adjusted_mode.
192584a0146SPhilippe Cornu 	 *
193584a0146SPhilippe Cornu 	 * NOTE:
194584a0146SPhilippe Cornu 	 *
195584a0146SPhilippe Cornu 	 * If a need arises to store and access modes adjusted for other
196584a0146SPhilippe Cornu 	 * locations than the connection between the CRTC and the first bridge,
197584a0146SPhilippe Cornu 	 * the DRM framework will have to be extended with DRM bridge states.
198199e4e96SDaniel Vetter 	 */
199199e4e96SDaniel Vetter 	void (*mode_set)(struct drm_bridge *bridge,
20063f8f3baSLaurent Pinchart 			 const struct drm_display_mode *mode,
20163f8f3baSLaurent Pinchart 			 const struct drm_display_mode *adjusted_mode);
202199e4e96SDaniel Vetter 	/**
203199e4e96SDaniel Vetter 	 * @pre_enable:
204199e4e96SDaniel Vetter 	 *
205199e4e96SDaniel Vetter 	 * This callback should enable the bridge. It is called right before
206199e4e96SDaniel Vetter 	 * the preceding element in the display pipe is enabled. If the
207199e4e96SDaniel Vetter 	 * preceding element is a bridge this means it's called before that
2084541d31eSDaniel Vetter 	 * bridge's @pre_enable function. If the preceding element is a
2094541d31eSDaniel Vetter 	 * &drm_encoder it's called right before the encoder's
2104541d31eSDaniel Vetter 	 * &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
2114541d31eSDaniel Vetter 	 * &drm_encoder_helper_funcs.dpms hook.
212199e4e96SDaniel Vetter 	 *
213199e4e96SDaniel Vetter 	 * The display pipe (i.e. clocks and timing signals) feeding this bridge
214199e4e96SDaniel Vetter 	 * will not yet be running when this callback is called. The bridge must
215199e4e96SDaniel Vetter 	 * not enable the display link feeding the next bridge in the chain (if
216199e4e96SDaniel Vetter 	 * there is one) when this callback is called.
217199e4e96SDaniel Vetter 	 *
218fe9e557dSLaurent Pinchart 	 * The @pre_enable callback is optional.
219199e4e96SDaniel Vetter 	 */
220199e4e96SDaniel Vetter 	void (*pre_enable)(struct drm_bridge *bridge);
221199e4e96SDaniel Vetter 
222199e4e96SDaniel Vetter 	/**
223199e4e96SDaniel Vetter 	 * @enable:
224199e4e96SDaniel Vetter 	 *
225199e4e96SDaniel Vetter 	 * This callback should enable the bridge. It is called right after
226199e4e96SDaniel Vetter 	 * the preceding element in the display pipe is enabled. If the
227199e4e96SDaniel Vetter 	 * preceding element is a bridge this means it's called after that
2284541d31eSDaniel Vetter 	 * bridge's @enable function. If the preceding element is a
2294541d31eSDaniel Vetter 	 * &drm_encoder it's called right after the encoder's
2304541d31eSDaniel Vetter 	 * &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
2314541d31eSDaniel Vetter 	 * &drm_encoder_helper_funcs.dpms hook.
232199e4e96SDaniel Vetter 	 *
233199e4e96SDaniel Vetter 	 * The bridge can assume that the display pipe (i.e. clocks and timing
234199e4e96SDaniel Vetter 	 * signals) feeding it is running when this callback is called. This
235199e4e96SDaniel Vetter 	 * callback must enable the display link feeding the next bridge in the
236199e4e96SDaniel Vetter 	 * chain if there is one.
237199e4e96SDaniel Vetter 	 *
238fe9e557dSLaurent Pinchart 	 * The @enable callback is optional.
239199e4e96SDaniel Vetter 	 */
240199e4e96SDaniel Vetter 	void (*enable)(struct drm_bridge *bridge);
2415ade071bSSean Paul 
2425ade071bSSean Paul 	/**
2435ade071bSSean Paul 	 * @atomic_pre_enable:
2445ade071bSSean Paul 	 *
2455ade071bSSean Paul 	 * This callback should enable the bridge. It is called right before
2465ade071bSSean Paul 	 * the preceding element in the display pipe is enabled. If the
2475ade071bSSean Paul 	 * preceding element is a bridge this means it's called before that
2485ade071bSSean Paul 	 * bridge's @atomic_pre_enable or @pre_enable function. If the preceding
2495ade071bSSean Paul 	 * element is a &drm_encoder it's called right before the encoder's
2505ade071bSSean Paul 	 * &drm_encoder_helper_funcs.atomic_enable hook.
2515ade071bSSean Paul 	 *
2525ade071bSSean Paul 	 * The display pipe (i.e. clocks and timing signals) feeding this bridge
2535ade071bSSean Paul 	 * will not yet be running when this callback is called. The bridge must
2545ade071bSSean Paul 	 * not enable the display link feeding the next bridge in the chain (if
2555ade071bSSean Paul 	 * there is one) when this callback is called.
2565ade071bSSean Paul 	 *
2575ade071bSSean Paul 	 * Note that this function will only be invoked in the context of an
258ea099adfSBoris Brezillon 	 * atomic commit. It will not be invoked from
259ea099adfSBoris Brezillon 	 * &drm_bridge_chain_pre_enable. It would be prudent to also provide an
260ea099adfSBoris Brezillon 	 * implementation of @pre_enable if you are expecting driver calls into
261ea099adfSBoris Brezillon 	 * &drm_bridge_chain_pre_enable.
2625ade071bSSean Paul 	 *
2635ade071bSSean Paul 	 * The @atomic_pre_enable callback is optional.
2645ade071bSSean Paul 	 */
2655ade071bSSean Paul 	void (*atomic_pre_enable)(struct drm_bridge *bridge,
2665ade071bSSean Paul 				  struct drm_atomic_state *state);
2675ade071bSSean Paul 
2685ade071bSSean Paul 	/**
2695ade071bSSean Paul 	 * @atomic_enable:
2705ade071bSSean Paul 	 *
2715ade071bSSean Paul 	 * This callback should enable the bridge. It is called right after
2725ade071bSSean Paul 	 * the preceding element in the display pipe is enabled. If the
2735ade071bSSean Paul 	 * preceding element is a bridge this means it's called after that
2745ade071bSSean Paul 	 * bridge's @atomic_enable or @enable function. If the preceding element
2755ade071bSSean Paul 	 * is a &drm_encoder it's called right after the encoder's
2765ade071bSSean Paul 	 * &drm_encoder_helper_funcs.atomic_enable hook.
2775ade071bSSean Paul 	 *
2785ade071bSSean Paul 	 * The bridge can assume that the display pipe (i.e. clocks and timing
2795ade071bSSean Paul 	 * signals) feeding it is running when this callback is called. This
2805ade071bSSean Paul 	 * callback must enable the display link feeding the next bridge in the
2815ade071bSSean Paul 	 * chain if there is one.
2825ade071bSSean Paul 	 *
2835ade071bSSean Paul 	 * Note that this function will only be invoked in the context of an
284ea099adfSBoris Brezillon 	 * atomic commit. It will not be invoked from &drm_bridge_chain_enable.
285ea099adfSBoris Brezillon 	 * It would be prudent to also provide an implementation of @enable if
286ea099adfSBoris Brezillon 	 * you are expecting driver calls into &drm_bridge_chain_enable.
2875ade071bSSean Paul 	 *
288fe9e557dSLaurent Pinchart 	 * The @atomic_enable callback is optional.
2895ade071bSSean Paul 	 */
2905ade071bSSean Paul 	void (*atomic_enable)(struct drm_bridge *bridge,
2915ade071bSSean Paul 			      struct drm_atomic_state *state);
2925ade071bSSean Paul 	/**
2935ade071bSSean Paul 	 * @atomic_disable:
2945ade071bSSean Paul 	 *
2955ade071bSSean Paul 	 * This callback should disable the bridge. It is called right before
2965ade071bSSean Paul 	 * the preceding element in the display pipe is disabled. If the
2975ade071bSSean Paul 	 * preceding element is a bridge this means it's called before that
2985ade071bSSean Paul 	 * bridge's @atomic_disable or @disable vfunc. If the preceding element
2995ade071bSSean Paul 	 * is a &drm_encoder it's called right before the
3005ade071bSSean Paul 	 * &drm_encoder_helper_funcs.atomic_disable hook.
3015ade071bSSean Paul 	 *
3025ade071bSSean Paul 	 * The bridge can assume that the display pipe (i.e. clocks and timing
3035ade071bSSean Paul 	 * signals) feeding it is still running when this callback is called.
3045ade071bSSean Paul 	 *
3055ade071bSSean Paul 	 * Note that this function will only be invoked in the context of an
306ea099adfSBoris Brezillon 	 * atomic commit. It will not be invoked from
307ea099adfSBoris Brezillon 	 * &drm_bridge_chain_disable. It would be prudent to also provide an
308ea099adfSBoris Brezillon 	 * implementation of @disable if you are expecting driver calls into
309ea099adfSBoris Brezillon 	 * &drm_bridge_chain_disable.
3105ade071bSSean Paul 	 *
311fe9e557dSLaurent Pinchart 	 * The @atomic_disable callback is optional.
3125ade071bSSean Paul 	 */
3135ade071bSSean Paul 	void (*atomic_disable)(struct drm_bridge *bridge,
3145ade071bSSean Paul 			       struct drm_atomic_state *state);
3155ade071bSSean Paul 
3165ade071bSSean Paul 	/**
3175ade071bSSean Paul 	 * @atomic_post_disable:
3185ade071bSSean Paul 	 *
3195ade071bSSean Paul 	 * This callback should disable the bridge. It is called right after the
3205ade071bSSean Paul 	 * preceding element in the display pipe is disabled. If the preceding
3215ade071bSSean Paul 	 * element is a bridge this means it's called after that bridge's
3225ade071bSSean Paul 	 * @atomic_post_disable or @post_disable function. If the preceding
3235ade071bSSean Paul 	 * element is a &drm_encoder it's called right after the encoder's
3245ade071bSSean Paul 	 * &drm_encoder_helper_funcs.atomic_disable hook.
3255ade071bSSean Paul 	 *
3265ade071bSSean Paul 	 * The bridge must assume that the display pipe (i.e. clocks and timing
3275ade071bSSean Paul 	 * signals) feeding it is no longer running when this callback is
3285ade071bSSean Paul 	 * called.
3295ade071bSSean Paul 	 *
3305ade071bSSean Paul 	 * Note that this function will only be invoked in the context of an
331ea099adfSBoris Brezillon 	 * atomic commit. It will not be invoked from
332ea099adfSBoris Brezillon 	 * &drm_bridge_chain_post_disable.
3335ade071bSSean Paul 	 * It would be prudent to also provide an implementation of
3345ade071bSSean Paul 	 * @post_disable if you are expecting driver calls into
335ea099adfSBoris Brezillon 	 * &drm_bridge_chain_post_disable.
3365ade071bSSean Paul 	 *
337fe9e557dSLaurent Pinchart 	 * The @atomic_post_disable callback is optional.
3385ade071bSSean Paul 	 */
3395ade071bSSean Paul 	void (*atomic_post_disable)(struct drm_bridge *bridge,
3405ade071bSSean Paul 				    struct drm_atomic_state *state);
341199e4e96SDaniel Vetter };
342199e4e96SDaniel Vetter 
343199e4e96SDaniel Vetter /**
34436a776dfSLinus Walleij  * struct drm_bridge_timings - timing information for the bridge
34536a776dfSLinus Walleij  */
34636a776dfSLinus Walleij struct drm_bridge_timings {
34736a776dfSLinus Walleij 	/**
348d23286ffSStefan Agner 	 * @input_bus_flags:
34936a776dfSLinus Walleij 	 *
350d23286ffSStefan Agner 	 * Tells what additional settings for the pixel data on the bus
351d23286ffSStefan Agner 	 * this bridge requires (like pixel signal polarity). See also
352d23286ffSStefan Agner 	 * &drm_display_info->bus_flags.
35336a776dfSLinus Walleij 	 */
354d23286ffSStefan Agner 	u32 input_bus_flags;
35536a776dfSLinus Walleij 	/**
35636a776dfSLinus Walleij 	 * @setup_time_ps:
35736a776dfSLinus Walleij 	 *
35836a776dfSLinus Walleij 	 * Defines the time in picoseconds the input data lines must be
35936a776dfSLinus Walleij 	 * stable before the clock edge.
36036a776dfSLinus Walleij 	 */
36136a776dfSLinus Walleij 	u32 setup_time_ps;
36236a776dfSLinus Walleij 	/**
36336a776dfSLinus Walleij 	 * @hold_time_ps:
36436a776dfSLinus Walleij 	 *
36536a776dfSLinus Walleij 	 * Defines the time in picoseconds taken for the bridge to sample the
36636a776dfSLinus Walleij 	 * input signal after the clock edge.
36736a776dfSLinus Walleij 	 */
36836a776dfSLinus Walleij 	u32 hold_time_ps;
369b0a6b940SLaurent Pinchart 	/**
370b0a6b940SLaurent Pinchart 	 * @dual_link:
371b0a6b940SLaurent Pinchart 	 *
372b0a6b940SLaurent Pinchart 	 * True if the bus operates in dual-link mode. The exact meaning is
373b0a6b940SLaurent Pinchart 	 * dependent on the bus type. For LVDS buses, this indicates that even-
374b0a6b940SLaurent Pinchart 	 * and odd-numbered pixels are received on separate links.
375b0a6b940SLaurent Pinchart 	 */
376b0a6b940SLaurent Pinchart 	bool dual_link;
37736a776dfSLinus Walleij };
37836a776dfSLinus Walleij 
37936a776dfSLinus Walleij /**
380199e4e96SDaniel Vetter  * struct drm_bridge - central DRM bridge control structure
381199e4e96SDaniel Vetter  */
382199e4e96SDaniel Vetter struct drm_bridge {
3836aa13402SEric Anholt 	/** @dev: DRM device this bridge belongs to */
384199e4e96SDaniel Vetter 	struct drm_device *dev;
3856aa13402SEric Anholt 	/** @encoder: encoder to which this bridge is connected */
386199e4e96SDaniel Vetter 	struct drm_encoder *encoder;
38705193dc3SBoris Brezillon 	/** @chain_node: used to form a bridge chain */
38805193dc3SBoris Brezillon 	struct list_head chain_node;
389199e4e96SDaniel Vetter #ifdef CONFIG_OF
3906aa13402SEric Anholt 	/** @of_node: device node pointer to the bridge */
391199e4e96SDaniel Vetter 	struct device_node *of_node;
392199e4e96SDaniel Vetter #endif
3936aa13402SEric Anholt 	/** @list: to keep track of all added bridges */
394199e4e96SDaniel Vetter 	struct list_head list;
3956aa13402SEric Anholt 	/**
3966aa13402SEric Anholt 	 * @timings:
3976aa13402SEric Anholt 	 *
3986aa13402SEric Anholt 	 * the timing specification for the bridge, if any (may be NULL)
3996aa13402SEric Anholt 	 */
40036a776dfSLinus Walleij 	const struct drm_bridge_timings *timings;
4016aa13402SEric Anholt 	/** @funcs: control functions */
402199e4e96SDaniel Vetter 	const struct drm_bridge_funcs *funcs;
4036aa13402SEric Anholt 	/** @driver_private: pointer to the bridge driver's internal context */
404199e4e96SDaniel Vetter 	void *driver_private;
405199e4e96SDaniel Vetter };
406199e4e96SDaniel Vetter 
40799286884SInki Dae void drm_bridge_add(struct drm_bridge *bridge);
408199e4e96SDaniel Vetter void drm_bridge_remove(struct drm_bridge *bridge);
409199e4e96SDaniel Vetter struct drm_bridge *of_drm_find_bridge(struct device_node *np);
4103bb80f24SLaurent Pinchart int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
4113bb80f24SLaurent Pinchart 		      struct drm_bridge *previous);
412199e4e96SDaniel Vetter 
413fadf872dSBoris Brezillon /**
414fadf872dSBoris Brezillon  * drm_bridge_get_next_bridge() - Get the next bridge in the chain
415fadf872dSBoris Brezillon  * @bridge: bridge object
416fadf872dSBoris Brezillon  *
417fadf872dSBoris Brezillon  * RETURNS:
418fadf872dSBoris Brezillon  * the next bridge in the chain after @bridge, or NULL if @bridge is the last.
419fadf872dSBoris Brezillon  */
420fadf872dSBoris Brezillon static inline struct drm_bridge *
421fadf872dSBoris Brezillon drm_bridge_get_next_bridge(struct drm_bridge *bridge)
422fadf872dSBoris Brezillon {
42305193dc3SBoris Brezillon 	if (list_is_last(&bridge->chain_node, &bridge->encoder->bridge_chain))
42405193dc3SBoris Brezillon 		return NULL;
42505193dc3SBoris Brezillon 
42605193dc3SBoris Brezillon 	return list_next_entry(bridge, chain_node);
427fadf872dSBoris Brezillon }
428fadf872dSBoris Brezillon 
42935a61fe9SBoris Brezillon /**
43035a61fe9SBoris Brezillon  * drm_bridge_chain_get_first_bridge() - Get the first bridge in the chain
43135a61fe9SBoris Brezillon  * @encoder: encoder object
43235a61fe9SBoris Brezillon  *
43335a61fe9SBoris Brezillon  * RETURNS:
43435a61fe9SBoris Brezillon  * the first bridge in the chain, or NULL if @encoder has no bridge attached
43535a61fe9SBoris Brezillon  * to it.
43635a61fe9SBoris Brezillon  */
43735a61fe9SBoris Brezillon static inline struct drm_bridge *
43835a61fe9SBoris Brezillon drm_bridge_chain_get_first_bridge(struct drm_encoder *encoder)
43935a61fe9SBoris Brezillon {
44005193dc3SBoris Brezillon 	return list_first_entry_or_null(&encoder->bridge_chain,
44105193dc3SBoris Brezillon 					struct drm_bridge, chain_node);
44235a61fe9SBoris Brezillon }
44335a61fe9SBoris Brezillon 
4444ec5c905SBoris Brezillon /**
4454ec5c905SBoris Brezillon  * drm_for_each_bridge_in_chain() - Iterate over all bridges present in a chain
4464ec5c905SBoris Brezillon  * @encoder: the encoder to iterate bridges on
4474ec5c905SBoris Brezillon  * @bridge: a bridge pointer updated to point to the current bridge at each
4484ec5c905SBoris Brezillon  *	    iteration
4494ec5c905SBoris Brezillon  *
4504ec5c905SBoris Brezillon  * Iterate over all bridges present in the bridge chain attached to @encoder.
4514ec5c905SBoris Brezillon  */
4524ec5c905SBoris Brezillon #define drm_for_each_bridge_in_chain(encoder, bridge)			\
4534ec5c905SBoris Brezillon 	list_for_each_entry(bridge, &(encoder)->bridge_chain, chain_node)
4544ec5c905SBoris Brezillon 
455ea099adfSBoris Brezillon bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge,
456199e4e96SDaniel Vetter 				 const struct drm_display_mode *mode,
457199e4e96SDaniel Vetter 				 struct drm_display_mode *adjusted_mode);
458ea099adfSBoris Brezillon enum drm_mode_status
459ea099adfSBoris Brezillon drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
460b1240f81SJose Abreu 			    const struct drm_display_mode *mode);
461ea099adfSBoris Brezillon void drm_bridge_chain_disable(struct drm_bridge *bridge);
462ea099adfSBoris Brezillon void drm_bridge_chain_post_disable(struct drm_bridge *bridge);
463ea099adfSBoris Brezillon void drm_bridge_chain_mode_set(struct drm_bridge *bridge,
46463f8f3baSLaurent Pinchart 			       const struct drm_display_mode *mode,
46563f8f3baSLaurent Pinchart 			       const struct drm_display_mode *adjusted_mode);
466ea099adfSBoris Brezillon void drm_bridge_chain_pre_enable(struct drm_bridge *bridge);
467ea099adfSBoris Brezillon void drm_bridge_chain_enable(struct drm_bridge *bridge);
468199e4e96SDaniel Vetter 
469ea099adfSBoris Brezillon void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge,
4705ade071bSSean Paul 				     struct drm_atomic_state *state);
471ea099adfSBoris Brezillon void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge,
4725ade071bSSean Paul 					  struct drm_atomic_state *state);
473ea099adfSBoris Brezillon void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge,
4745ade071bSSean Paul 					struct drm_atomic_state *state);
475ea099adfSBoris Brezillon void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge,
4765ade071bSSean Paul 				    struct drm_atomic_state *state);
4775ade071bSSean Paul 
47813dfc054SEric Anholt #ifdef CONFIG_DRM_PANEL_BRIDGE
47989958b7cSLaurent Pinchart struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel);
48089958b7cSLaurent Pinchart struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
48113dfc054SEric Anholt 					      u32 connector_type);
48213dfc054SEric Anholt void drm_panel_bridge_remove(struct drm_bridge *bridge);
48367022227SEric Anholt struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
48489958b7cSLaurent Pinchart 					     struct drm_panel *panel);
48589958b7cSLaurent Pinchart struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
48667022227SEric Anholt 						   struct drm_panel *panel,
48767022227SEric Anholt 						   u32 connector_type);
48813dfc054SEric Anholt #endif
48913dfc054SEric Anholt 
490199e4e96SDaniel Vetter #endif
491