Rev 6084 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6084 | Rev 6937 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #include "drm/drmP.h" |
29 | #include "drm/drmP.h" |
Line 30... | Line 30... | ||
30 | 30 | ||
31 | /** |
31 | /** |
32 | * DOC: overview |
32 | * DOC: overview |
33 | * |
33 | * |
34 | * drm_bridge represents a device that hangs on to an encoder. These are handy |
34 | * struct &drm_bridge represents a device that hangs on to an encoder. These are |
35 | * when a regular drm_encoder entity isn't enough to represent the entire |
35 | * handy when a regular &drm_encoder entity isn't enough to represent the entire |
36 | * encoder chain. |
36 | * encoder chain. |
37 | * |
37 | * |
38 | * A bridge is always associated to a single drm_encoder at a time, but can be |
38 | * A bridge is always attached to a single &drm_encoder at a time, but can be |
39 | * either connected to it directly, or through an intermediate bridge: |
39 | * either connected to it directly, or through an intermediate bridge: |
40 | * |
40 | * |
41 | * encoder ---> bridge B ---> bridge A |
41 | * encoder ---> bridge B ---> bridge A |
42 | * |
42 | * |
43 | * Here, the output of the encoder feeds to bridge B, and that furthers feeds to |
43 | * Here, the output of the encoder feeds to bridge B, and that furthers feeds to |
44 | * bridge A. |
44 | * bridge A. |
45 | * |
45 | * |
46 | * The driver using the bridge is responsible to make the associations between |
46 | * The driver using the bridge is responsible to make the associations between |
47 | * the encoder and bridges. Once these links are made, the bridges will |
47 | * the encoder and bridges. Once these links are made, the bridges will |
48 | * participate along with encoder functions to perform mode_set/enable/disable |
48 | * participate along with encoder functions to perform mode_set/enable/disable |
49 | * through the ops provided in drm_bridge_funcs. |
49 | * through the ops provided in &drm_bridge_funcs. |
50 | * |
50 | * |
51 | * drm_bridge, like drm_panel, aren't drm_mode_object entities like planes, |
51 | * drm_bridge, like drm_panel, aren't drm_mode_object entities like planes, |
52 | * crtcs, encoders or connectors. They just provide additional hooks to get the |
52 | * CRTCs, encoders or connectors and hence are not visible to userspace. They |
- | 53 | * just provide additional hooks to get the desired output at the end of the |
|
- | 54 | * encoder chain. |
|
- | 55 | * |
|
- | 56 | * Bridges can also be chained up using the next pointer in struct &drm_bridge. |
|
- | 57 | * |
|
53 | * desired output at the end of the encoder chain. |
58 | * Both legacy CRTC helpers and the new atomic modeset helpers support bridges. |
Line 54... | Line 59... | ||
54 | */ |
59 | */ |
55 | 60 | ||
Line 120... | Line 125... | ||
120 | EXPORT_SYMBOL(drm_bridge_attach); |
125 | EXPORT_SYMBOL(drm_bridge_attach); |
Line 121... | Line 126... | ||
121 | 126 | ||
122 | /** |
127 | /** |
123 | * DOC: bridge callbacks |
128 | * DOC: bridge callbacks |
124 | * |
129 | * |
125 | * The drm_bridge_funcs ops are populated by the bridge driver. The drm |
130 | * The &drm_bridge_funcs ops are populated by the bridge driver. The DRM |
126 | * internals(atomic and crtc helpers) use the helpers defined in drm_bridge.c |
131 | * internals (atomic and CRTC helpers) use the helpers defined in drm_bridge.c |
127 | * These helpers call a specific drm_bridge_funcs op for all the bridges |
132 | * These helpers call a specific &drm_bridge_funcs op for all the bridges |
128 | * during encoder configuration. |
133 | * during encoder configuration. |
129 | * |
- | |
130 | * When creating a bridge driver, one can implement drm_bridge_funcs op with |
- | |
131 | * the help of these rough rules: |
- | |
132 | * |
- | |
133 | * pre_enable: this contains things needed to be done for the bridge before |
- | |
134 | * its clock and timings are enabled by its source. For a bridge, its source |
- | |
135 | * is generally the encoder or bridge just before it in the encoder chain. |
- | |
136 | * |
- | |
137 | * enable: this contains things needed to be done for the bridge once its |
- | |
138 | * source is enabled. In other words, enable is called once the source is |
- | |
139 | * ready with clock and timing needed by the bridge. |
- | |
140 | * |
- | |
141 | * disable: this contains things needed to be done for the bridge assuming |
- | |
142 | * that its source is still enabled, i.e. clock and timings are still on. |
- | |
143 | * |
- | |
144 | * post_disable: this contains things needed to be done for the bridge once |
- | |
145 | * its source is disabled, i.e. once clocks and timings are off. |
- | |
146 | * |
- | |
147 | * mode_fixup: this should fixup the given mode for the bridge. It is called |
- | |
148 | * after the encoder's mode fixup. mode_fixup can also reject a mode completely |
- | |
149 | * if it's unsuitable for the hardware. |
- | |
150 | * |
134 | * |
151 | * mode_set: this sets up the mode for the bridge. It assumes that its source |
- | |
152 | * (an encoder or a bridge) has set the mode too. |
135 | * For detailed specification of the bridge callbacks see &drm_bridge_funcs. |
Line 153... | Line 136... | ||
153 | */ |
136 | */ |
154 | 137 | ||
155 | /** |
138 | /** |
156 | * drm_bridge_mode_fixup - fixup proposed mode for all bridges in the |
139 | * drm_bridge_mode_fixup - fixup proposed mode for all bridges in the |
157 | * encoder chain |
140 | * encoder chain |
158 | * @bridge: bridge control structure |
141 | * @bridge: bridge control structure |
159 | * @mode: desired mode to be set for the bridge |
142 | * @mode: desired mode to be set for the bridge |
160 | * @adjusted_mode: updated mode that works for this bridge |
143 | * @adjusted_mode: updated mode that works for this bridge |
161 | * |
144 | * |
162 | * Calls 'mode_fixup' drm_bridge_funcs op for all the bridges in the |
145 | * Calls ->mode_fixup() &drm_bridge_funcs op for all the bridges in the |
163 | * encoder chain, starting from the first bridge to the last. |
146 | * encoder chain, starting from the first bridge to the last. |
164 | * |
147 | * |
165 | * Note: the bridge passed should be the one closest to the encoder |
148 | * Note: the bridge passed should be the one closest to the encoder |
Line 184... | Line 167... | ||
184 | return ret; |
167 | return ret; |
185 | } |
168 | } |
186 | EXPORT_SYMBOL(drm_bridge_mode_fixup); |
169 | EXPORT_SYMBOL(drm_bridge_mode_fixup); |
Line 187... | Line 170... | ||
187 | 170 | ||
188 | /** |
171 | /** |
189 | * drm_bridge_disable - calls 'disable' drm_bridge_funcs op for all |
172 | * drm_bridge_disable - calls ->disable() &drm_bridge_funcs op for all |
190 | * bridges in the encoder chain. |
173 | * bridges in the encoder chain. |
191 | * @bridge: bridge control structure |
174 | * @bridge: bridge control structure |
192 | * |
175 | * |
193 | * Calls 'disable' drm_bridge_funcs op for all the bridges in the encoder |
176 | * Calls ->disable() &drm_bridge_funcs op for all the bridges in the encoder |
194 | * chain, starting from the last bridge to the first. These are called before |
177 | * chain, starting from the last bridge to the first. These are called before |
195 | * calling the encoder's prepare op. |
178 | * calling the encoder's prepare op. |
196 | * |
179 | * |
197 | * Note: the bridge passed should be the one closest to the encoder |
180 | * Note: the bridge passed should be the one closest to the encoder |
Line 206... | Line 189... | ||
206 | bridge->funcs->disable(bridge); |
189 | bridge->funcs->disable(bridge); |
207 | } |
190 | } |
208 | EXPORT_SYMBOL(drm_bridge_disable); |
191 | EXPORT_SYMBOL(drm_bridge_disable); |
Line 209... | Line 192... | ||
209 | 192 | ||
210 | /** |
193 | /** |
211 | * drm_bridge_post_disable - calls 'post_disable' drm_bridge_funcs op for |
194 | * drm_bridge_post_disable - calls ->post_disable() &drm_bridge_funcs op for |
212 | * all bridges in the encoder chain. |
195 | * all bridges in the encoder chain. |
213 | * @bridge: bridge control structure |
196 | * @bridge: bridge control structure |
214 | * |
197 | * |
215 | * Calls 'post_disable' drm_bridge_funcs op for all the bridges in the |
198 | * Calls ->post_disable() &drm_bridge_funcs op for all the bridges in the |
216 | * encoder chain, starting from the first bridge to the last. These are called |
199 | * encoder chain, starting from the first bridge to the last. These are called |
217 | * after completing the encoder's prepare op. |
200 | * after completing the encoder's prepare op. |
218 | * |
201 | * |
219 | * Note: the bridge passed should be the one closest to the encoder |
202 | * Note: the bridge passed should be the one closest to the encoder |
Line 234... | Line 217... | ||
234 | * encoder chain |
217 | * encoder chain |
235 | * @bridge: bridge control structure |
218 | * @bridge: bridge control structure |
236 | * @mode: desired mode to be set for the bridge |
219 | * @mode: desired mode to be set for the bridge |
237 | * @adjusted_mode: updated mode that works for this bridge |
220 | * @adjusted_mode: updated mode that works for this bridge |
238 | * |
221 | * |
239 | * Calls 'mode_set' drm_bridge_funcs op for all the bridges in the |
222 | * Calls ->mode_set() &drm_bridge_funcs op for all the bridges in the |
240 | * encoder chain, starting from the first bridge to the last. |
223 | * encoder chain, starting from the first bridge to the last. |
241 | * |
224 | * |
242 | * Note: the bridge passed should be the one closest to the encoder |
225 | * Note: the bridge passed should be the one closest to the encoder |
243 | */ |
226 | */ |
244 | void drm_bridge_mode_set(struct drm_bridge *bridge, |
227 | void drm_bridge_mode_set(struct drm_bridge *bridge, |
Line 254... | Line 237... | ||
254 | drm_bridge_mode_set(bridge->next, mode, adjusted_mode); |
237 | drm_bridge_mode_set(bridge->next, mode, adjusted_mode); |
255 | } |
238 | } |
256 | EXPORT_SYMBOL(drm_bridge_mode_set); |
239 | EXPORT_SYMBOL(drm_bridge_mode_set); |
Line 257... | Line 240... | ||
257 | 240 | ||
258 | /** |
241 | /** |
259 | * drm_bridge_pre_enable - calls 'pre_enable' drm_bridge_funcs op for all |
242 | * drm_bridge_pre_enable - calls ->pre_enable() &drm_bridge_funcs op for all |
260 | * bridges in the encoder chain. |
243 | * bridges in the encoder chain. |
261 | * @bridge: bridge control structure |
244 | * @bridge: bridge control structure |
262 | * |
245 | * |
263 | * Calls 'pre_enable' drm_bridge_funcs op for all the bridges in the encoder |
246 | * Calls ->pre_enable() &drm_bridge_funcs op for all the bridges in the encoder |
264 | * chain, starting from the last bridge to the first. These are called |
247 | * chain, starting from the last bridge to the first. These are called |
265 | * before calling the encoder's commit op. |
248 | * before calling the encoder's commit op. |
266 | * |
249 | * |
267 | * Note: the bridge passed should be the one closest to the encoder |
250 | * Note: the bridge passed should be the one closest to the encoder |
Line 276... | Line 259... | ||
276 | bridge->funcs->pre_enable(bridge); |
259 | bridge->funcs->pre_enable(bridge); |
277 | } |
260 | } |
278 | EXPORT_SYMBOL(drm_bridge_pre_enable); |
261 | EXPORT_SYMBOL(drm_bridge_pre_enable); |
Line 279... | Line 262... | ||
279 | 262 | ||
280 | /** |
263 | /** |
281 | * drm_bridge_enable - calls 'enable' drm_bridge_funcs op for all bridges |
264 | * drm_bridge_enable - calls ->enable() &drm_bridge_funcs op for all bridges |
282 | * in the encoder chain. |
265 | * in the encoder chain. |
283 | * @bridge: bridge control structure |
266 | * @bridge: bridge control structure |
284 | * |
267 | * |
285 | * Calls 'enable' drm_bridge_funcs op for all the bridges in the encoder |
268 | * Calls ->enable() &drm_bridge_funcs op for all the bridges in the encoder |
286 | * chain, starting from the first bridge to the last. These are called |
269 | * chain, starting from the first bridge to the last. These are called |
287 | * after completing the encoder's commit op. |
270 | * after completing the encoder's commit op. |
288 | * |
271 | * |
289 | * Note that the bridge passed should be the one closest to the encoder |
272 | * Note that the bridge passed should be the one closest to the encoder |