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