Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dt-bindings: drm/panel-simple-edp: Introduce generic eDP panels

eDP panels generally contain almost everything needed to control them
in their EDID. This comes from their DP heritage were a computer needs
to be able to properly control pretty much any DP display that's
plugged into it.

The one big issue with eDP panels and the reason that we need a panel
driver for them is that the power sequencing can be different per
panel.

While it is true that eDP panel sequencing can be arbitrarily complex,
in practice it turns out that many eDP panels are compatible with just
some slightly different delays. See the contents of the bindings file
introduced in this patch for some details.

The fact that eDP panels are 99% probable and that the power
sequencing (especially power up) can be compatible between many panels
means that there's a constant desire to plug multiple different panels
into the same board. This could be for second sourcing purposes or to
support multiple SKUs (maybe a 11" and a 13", for instance).

As discussed [1], it should be OK to support this by adding two
properties to the device tree to specify the delays needed for
powering up the panel the first time. We'll create a new "edp-panel"
bindings file and define the two delays that might need to be
specified. NOTE: in the vast majority of the cases (HPD is hooked up
and isn't glitchy or is debounced) even these delays aren't needed.

[1] https://lore.kernel.org/r/CAD=FV=VZYOMPwQZzWdhJGh5cjJWw_EcM-wQVEivZ-bdGXjPrEQ@mail.gmail.com

Signed-off-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Rob Herring <robh@kernel.org>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210914132020.v5.1.I1116e79d34035338a45c1fc7cdd14a097909c8e0@changeid

+188
+188
Documentation/devicetree/bindings/display/panel/panel-edp.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/panel/panel-edp.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Probeable (via DP AUX / EDID) eDP Panels with simple poweron sequences 8 + 9 + maintainers: 10 + - Douglas Anderson <dianders@chromium.org> 11 + 12 + description: | 13 + This binding file can be used to indicate that an eDP panel is connected 14 + to a Embedded DisplayPort AUX bus (see display/dp-aux-bus.yaml) without 15 + actually specifying exactly what panel is connected. This is useful for 16 + the case that more than one different panel could be connected to the 17 + board, either for second-sourcing purposes or to support multiple SKUs 18 + with different LCDs that hook up to a common board. 19 + 20 + As per above, a requirement for using this binding is that the panel is 21 + represented under the DP AUX bus. This means that we can use any 22 + information provided by the DP AUX bus (including the EDID) to identify 23 + the panel. We can use this to identify display size, resolution, and 24 + timings among other things. 25 + 26 + One piece of information about eDP panels that is typically _not_ 27 + provided anywhere on the DP AUX bus is the power sequencing timings. 28 + This is the reason why, historically, we've always had to explicitly 29 + list eDP panels. We solve that here with two tricks. The "worst case" 30 + power on timings for any panels expected to be connected to a board are 31 + specified in these bindings. Once we've powered on, it's expected that 32 + the operating system will lookup the panel in a table (based on EDID 33 + information) to figure out other power sequencing timings. 34 + 35 + eDP panels in general can have somewhat arbitrary power sequencing 36 + requirements. However, even though it's arbitrary in general, the 37 + vast majority of panel datasheets have a power sequence diagram that 38 + looks the exactly the same as every other panel. Each panel datasheet 39 + cares about different timings in this diagram but the fact that the 40 + diagram is so similar means we can come up with a single driver to 41 + handle it. 42 + 43 + These diagrams all look roughly like this, sometimes labeled with 44 + slightly different numbers / lines but all pretty much the same 45 + sequence. This is because much of this diagram comes straight from 46 + the eDP Standard. 47 + 48 + __________________________________________________ 49 + Vdd ___/: :\____ / 50 + _/ : : \_____/ 51 + :<T1>:<T2>: :<--T10-->:<T11>:<T12>: 52 + : +-----------------------+---------+---------+ 53 + eDP -----------+ Black video | Src vid | Blk vid + 54 + Display : +-----------------------+---------+---------+ 55 + : _______________________:_________:_________: 56 + HPD :<T3>| : : | 57 + ___________| : : |_____________ 58 + : : : : 59 + Sink +-----------------------:---------:---------+ 60 + AUX CH -----------+ AUX Ch operational : : +------------- 61 + +-----------------------:---------:---------+ 62 + : : : : 63 + :<T4>: :<T7>: : : 64 + Src main +------+------+--------------+---------+ 65 + lnk data----------------+LnkTrn| Idle |Valid vid data| Idle/off+------------- 66 + +------+------+--------------+---------+ 67 + : <T5> :<-T6->:<-T8->: : 68 + :__:<T9>: 69 + LED_EN | | 70 + _____________________________________| |____________________________ 71 + : : 72 + __________:__:_ 73 + PWM | : : | 74 + __________________________| : : |__________________________ 75 + : : : : 76 + _____________:__________:__:_:______ 77 + Bklight ____/: : : : : :\____ 78 + power _______/ :<---T13---->: : : :<T16>: \______________ 79 + (Vbl) :<T17>:<---------T14--------->: :<-T15->:<T18>: 80 + 81 + The above looks fairly complex but, as per above, each panel only cares 82 + about a subset of those timings. 83 + 84 + allOf: 85 + - $ref: panel-common.yaml# 86 + 87 + properties: 88 + compatible: 89 + const: edp-panel 90 + 91 + hpd-reliable-delay-ms: 92 + description: 93 + A fixed amount of time that must be waited after powering on the 94 + panel's power-supply before the HPD signal is a reliable way to know 95 + when the AUX channel is ready. This is useful for panels that glitch 96 + the HPD at the start of power-on. This value is not needed if HPD is 97 + always reliable for all panels that might be connected. 98 + 99 + hpd-absent-delay-ms: 100 + description: 101 + The panel specifies that HPD will be asserted this many milliseconds 102 + from power on (timing T3 in the diagram above). If we have no way to 103 + measure HPD then a fixed delay of this many milliseconds can be used. 104 + This can also be used as a timeout when waiting for HPD. Does not 105 + include the hpd-reliable-delay, so if hpd-reliable-delay was 80 ms 106 + and hpd-absent-delay was 200 ms then we'd do a fixed 80 ms delay and 107 + then we know HPD would assert in the next 120 ms. This value is not 108 + needed if HPD hooked up, either through a GPIO in the panel node or 109 + hooked up directly to the eDP controller. 110 + 111 + backlight: true 112 + enable-gpios: true 113 + port: true 114 + power-supply: true 115 + no-hpd: true 116 + hpd-gpios: true 117 + 118 + additionalProperties: false 119 + 120 + required: 121 + - compatible 122 + - power-supply 123 + 124 + examples: 125 + - | 126 + #include <dt-bindings/clock/qcom,rpmh.h> 127 + #include <dt-bindings/gpio/gpio.h> 128 + #include <dt-bindings/interrupt-controller/irq.h> 129 + 130 + i2c { 131 + #address-cells = <1>; 132 + #size-cells = <0>; 133 + 134 + bridge@2d { 135 + compatible = "ti,sn65dsi86"; 136 + reg = <0x2d>; 137 + 138 + interrupt-parent = <&tlmm>; 139 + interrupts = <10 IRQ_TYPE_LEVEL_HIGH>; 140 + 141 + enable-gpios = <&tlmm 102 GPIO_ACTIVE_HIGH>; 142 + 143 + vpll-supply = <&src_pp1800_s4a>; 144 + vccio-supply = <&src_pp1800_s4a>; 145 + vcca-supply = <&src_pp1200_l2a>; 146 + vcc-supply = <&src_pp1200_l2a>; 147 + 148 + clocks = <&rpmhcc RPMH_LN_BB_CLK2>; 149 + clock-names = "refclk"; 150 + 151 + no-hpd; 152 + 153 + ports { 154 + #address-cells = <1>; 155 + #size-cells = <0>; 156 + 157 + port@0 { 158 + reg = <0>; 159 + endpoint { 160 + remote-endpoint = <&dsi0_out>; 161 + }; 162 + }; 163 + 164 + port@1 { 165 + reg = <1>; 166 + sn65dsi86_out: endpoint { 167 + remote-endpoint = <&panel_in_edp>; 168 + }; 169 + }; 170 + }; 171 + 172 + aux-bus { 173 + panel { 174 + compatible = "edp-panel"; 175 + power-supply = <&pp3300_dx_edp>; 176 + backlight = <&backlight>; 177 + hpd-gpios = <&sn65dsi86_bridge 2 GPIO_ACTIVE_HIGH>; 178 + hpd-reliable-delay-ms = <15>; 179 + 180 + port { 181 + panel_in_edp: endpoint { 182 + remote-endpoint = <&sn65dsi86_out>; 183 + }; 184 + }; 185 + }; 186 + }; 187 + }; 188 + };