root/drivers/gpu/drm/drm_bridge.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. drm_bridge_add
  2. drm_bridge_remove
  3. drm_bridge_attach
  4. drm_bridge_detach
  5. drm_bridge_mode_fixup
  6. drm_bridge_mode_valid
  7. drm_bridge_disable
  8. drm_bridge_post_disable
  9. drm_bridge_mode_set
  10. drm_bridge_pre_enable
  11. drm_bridge_enable
  12. drm_atomic_bridge_disable
  13. drm_atomic_bridge_post_disable
  14. drm_atomic_bridge_pre_enable
  15. drm_atomic_bridge_enable
  16. of_drm_find_bridge

   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.next pointer.
  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 (bridge->funcs->attach) {
 132                 ret = bridge->funcs->attach(bridge);
 133                 if (ret < 0) {
 134                         bridge->dev = NULL;
 135                         bridge->encoder = NULL;
 136                         return ret;
 137                 }
 138         }
 139 
 140         if (previous)
 141                 previous->next = bridge;
 142         else
 143                 encoder->bridge = bridge;
 144 
 145         return 0;
 146 }
 147 EXPORT_SYMBOL(drm_bridge_attach);
 148 
 149 void drm_bridge_detach(struct drm_bridge *bridge)
 150 {
 151         if (WARN_ON(!bridge))
 152                 return;
 153 
 154         if (WARN_ON(!bridge->dev))
 155                 return;
 156 
 157         if (bridge->funcs->detach)
 158                 bridge->funcs->detach(bridge);
 159 
 160         bridge->dev = NULL;
 161 }
 162 
 163 /**
 164  * DOC: bridge callbacks
 165  *
 166  * The &drm_bridge_funcs ops are populated by the bridge driver. The DRM
 167  * internals (atomic and CRTC helpers) use the helpers defined in drm_bridge.c
 168  * These helpers call a specific &drm_bridge_funcs op for all the bridges
 169  * during encoder configuration.
 170  *
 171  * For detailed specification of the bridge callbacks see &drm_bridge_funcs.
 172  */
 173 
 174 /**
 175  * drm_bridge_mode_fixup - fixup proposed mode for all bridges in the
 176  *                         encoder chain
 177  * @bridge: bridge control structure
 178  * @mode: desired mode to be set for the bridge
 179  * @adjusted_mode: updated mode that works for this bridge
 180  *
 181  * Calls &drm_bridge_funcs.mode_fixup for all the bridges in the
 182  * encoder chain, starting from the first bridge to the last.
 183  *
 184  * Note: the bridge passed should be the one closest to the encoder
 185  *
 186  * RETURNS:
 187  * true on success, false on failure
 188  */
 189 bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
 190                         const struct drm_display_mode *mode,
 191                         struct drm_display_mode *adjusted_mode)
 192 {
 193         bool ret = true;
 194 
 195         if (!bridge)
 196                 return true;
 197 
 198         if (bridge->funcs->mode_fixup)
 199                 ret = bridge->funcs->mode_fixup(bridge, mode, adjusted_mode);
 200 
 201         ret = ret && drm_bridge_mode_fixup(bridge->next, mode, adjusted_mode);
 202 
 203         return ret;
 204 }
 205 EXPORT_SYMBOL(drm_bridge_mode_fixup);
 206 
 207 /**
 208  * drm_bridge_mode_valid - validate the mode against all bridges in the
 209  *                         encoder chain.
 210  * @bridge: bridge control structure
 211  * @mode: desired mode to be validated
 212  *
 213  * Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder
 214  * chain, starting from the first bridge to the last. If at least one bridge
 215  * does not accept the mode the function returns the error code.
 216  *
 217  * Note: the bridge passed should be the one closest to the encoder.
 218  *
 219  * RETURNS:
 220  * MODE_OK on success, drm_mode_status Enum error code on failure
 221  */
 222 enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge,
 223                                            const struct drm_display_mode *mode)
 224 {
 225         enum drm_mode_status ret = MODE_OK;
 226 
 227         if (!bridge)
 228                 return ret;
 229 
 230         if (bridge->funcs->mode_valid)
 231                 ret = bridge->funcs->mode_valid(bridge, mode);
 232 
 233         if (ret != MODE_OK)
 234                 return ret;
 235 
 236         return drm_bridge_mode_valid(bridge->next, mode);
 237 }
 238 EXPORT_SYMBOL(drm_bridge_mode_valid);
 239 
 240 /**
 241  * drm_bridge_disable - disables all bridges in the encoder chain
 242  * @bridge: bridge control structure
 243  *
 244  * Calls &drm_bridge_funcs.disable op for all the bridges in the encoder
 245  * chain, starting from the last bridge to the first. These are called before
 246  * calling the encoder's prepare op.
 247  *
 248  * Note: the bridge passed should be the one closest to the encoder
 249  */
 250 void drm_bridge_disable(struct drm_bridge *bridge)
 251 {
 252         if (!bridge)
 253                 return;
 254 
 255         drm_bridge_disable(bridge->next);
 256 
 257         if (bridge->funcs->disable)
 258                 bridge->funcs->disable(bridge);
 259 }
 260 EXPORT_SYMBOL(drm_bridge_disable);
 261 
 262 /**
 263  * drm_bridge_post_disable - cleans up after disabling all bridges in the encoder chain
 264  * @bridge: bridge control structure
 265  *
 266  * Calls &drm_bridge_funcs.post_disable op for all the bridges in the
 267  * encoder chain, starting from the first bridge to the last. These are called
 268  * after completing the encoder's prepare op.
 269  *
 270  * Note: the bridge passed should be the one closest to the encoder
 271  */
 272 void drm_bridge_post_disable(struct drm_bridge *bridge)
 273 {
 274         if (!bridge)
 275                 return;
 276 
 277         if (bridge->funcs->post_disable)
 278                 bridge->funcs->post_disable(bridge);
 279 
 280         drm_bridge_post_disable(bridge->next);
 281 }
 282 EXPORT_SYMBOL(drm_bridge_post_disable);
 283 
 284 /**
 285  * drm_bridge_mode_set - set proposed mode for all bridges in the
 286  *                       encoder chain
 287  * @bridge: bridge control structure
 288  * @mode: desired mode to be set for the bridge
 289  * @adjusted_mode: updated mode that works for this bridge
 290  *
 291  * Calls &drm_bridge_funcs.mode_set op for all the bridges in the
 292  * encoder chain, starting from the first bridge to the last.
 293  *
 294  * Note: the bridge passed should be the one closest to the encoder
 295  */
 296 void drm_bridge_mode_set(struct drm_bridge *bridge,
 297                          const struct drm_display_mode *mode,
 298                          const struct drm_display_mode *adjusted_mode)
 299 {
 300         if (!bridge)
 301                 return;
 302 
 303         if (bridge->funcs->mode_set)
 304                 bridge->funcs->mode_set(bridge, mode, adjusted_mode);
 305 
 306         drm_bridge_mode_set(bridge->next, mode, adjusted_mode);
 307 }
 308 EXPORT_SYMBOL(drm_bridge_mode_set);
 309 
 310 /**
 311  * drm_bridge_pre_enable - prepares for enabling all
 312  *                         bridges in the encoder chain
 313  * @bridge: bridge control structure
 314  *
 315  * Calls &drm_bridge_funcs.pre_enable op for all the bridges in the encoder
 316  * chain, starting from the last bridge to the first. These are called
 317  * before calling the encoder's commit op.
 318  *
 319  * Note: the bridge passed should be the one closest to the encoder
 320  */
 321 void drm_bridge_pre_enable(struct drm_bridge *bridge)
 322 {
 323         if (!bridge)
 324                 return;
 325 
 326         drm_bridge_pre_enable(bridge->next);
 327 
 328         if (bridge->funcs->pre_enable)
 329                 bridge->funcs->pre_enable(bridge);
 330 }
 331 EXPORT_SYMBOL(drm_bridge_pre_enable);
 332 
 333 /**
 334  * drm_bridge_enable - enables all bridges in the encoder chain
 335  * @bridge: bridge control structure
 336  *
 337  * Calls &drm_bridge_funcs.enable op for all the bridges in the encoder
 338  * chain, starting from the first bridge to the last. These are called
 339  * after completing the encoder's commit op.
 340  *
 341  * Note that the bridge passed should be the one closest to the encoder
 342  */
 343 void drm_bridge_enable(struct drm_bridge *bridge)
 344 {
 345         if (!bridge)
 346                 return;
 347 
 348         if (bridge->funcs->enable)
 349                 bridge->funcs->enable(bridge);
 350 
 351         drm_bridge_enable(bridge->next);
 352 }
 353 EXPORT_SYMBOL(drm_bridge_enable);
 354 
 355 /**
 356  * drm_atomic_bridge_disable - disables all bridges in the encoder chain
 357  * @bridge: bridge control structure
 358  * @state: atomic state being committed
 359  *
 360  * Calls &drm_bridge_funcs.atomic_disable (falls back on
 361  * &drm_bridge_funcs.disable) op for all the bridges in the encoder chain,
 362  * starting from the last bridge to the first. These are called before calling
 363  * &drm_encoder_helper_funcs.atomic_disable
 364  *
 365  * Note: the bridge passed should be the one closest to the encoder
 366  */
 367 void drm_atomic_bridge_disable(struct drm_bridge *bridge,
 368                                struct drm_atomic_state *state)
 369 {
 370         if (!bridge)
 371                 return;
 372 
 373         drm_atomic_bridge_disable(bridge->next, state);
 374 
 375         if (bridge->funcs->atomic_disable)
 376                 bridge->funcs->atomic_disable(bridge, state);
 377         else if (bridge->funcs->disable)
 378                 bridge->funcs->disable(bridge);
 379 }
 380 EXPORT_SYMBOL(drm_atomic_bridge_disable);
 381 
 382 /**
 383  * drm_atomic_bridge_post_disable - cleans up after disabling all bridges in the
 384  *                                  encoder chain
 385  * @bridge: bridge control structure
 386  * @state: atomic state being committed
 387  *
 388  * Calls &drm_bridge_funcs.atomic_post_disable (falls back on
 389  * &drm_bridge_funcs.post_disable) op for all the bridges in the encoder chain,
 390  * starting from the first bridge to the last. These are called after completing
 391  * &drm_encoder_helper_funcs.atomic_disable
 392  *
 393  * Note: the bridge passed should be the one closest to the encoder
 394  */
 395 void drm_atomic_bridge_post_disable(struct drm_bridge *bridge,
 396                                     struct drm_atomic_state *state)
 397 {
 398         if (!bridge)
 399                 return;
 400 
 401         if (bridge->funcs->atomic_post_disable)
 402                 bridge->funcs->atomic_post_disable(bridge, state);
 403         else if (bridge->funcs->post_disable)
 404                 bridge->funcs->post_disable(bridge);
 405 
 406         drm_atomic_bridge_post_disable(bridge->next, state);
 407 }
 408 EXPORT_SYMBOL(drm_atomic_bridge_post_disable);
 409 
 410 /**
 411  * drm_atomic_bridge_pre_enable - prepares for enabling all bridges in the
 412  *                                encoder chain
 413  * @bridge: bridge control structure
 414  * @state: atomic state being committed
 415  *
 416  * Calls &drm_bridge_funcs.atomic_pre_enable (falls back on
 417  * &drm_bridge_funcs.pre_enable) op for all the bridges in the encoder chain,
 418  * starting from the last bridge to the first. These are called before calling
 419  * &drm_encoder_helper_funcs.atomic_enable
 420  *
 421  * Note: the bridge passed should be the one closest to the encoder
 422  */
 423 void drm_atomic_bridge_pre_enable(struct drm_bridge *bridge,
 424                                   struct drm_atomic_state *state)
 425 {
 426         if (!bridge)
 427                 return;
 428 
 429         drm_atomic_bridge_pre_enable(bridge->next, state);
 430 
 431         if (bridge->funcs->atomic_pre_enable)
 432                 bridge->funcs->atomic_pre_enable(bridge, state);
 433         else if (bridge->funcs->pre_enable)
 434                 bridge->funcs->pre_enable(bridge);
 435 }
 436 EXPORT_SYMBOL(drm_atomic_bridge_pre_enable);
 437 
 438 /**
 439  * drm_atomic_bridge_enable - enables all bridges in the encoder chain
 440  * @bridge: bridge control structure
 441  * @state: atomic state being committed
 442  *
 443  * Calls &drm_bridge_funcs.atomic_enable (falls back on
 444  * &drm_bridge_funcs.enable) op for all the bridges in the encoder chain,
 445  * starting from the first bridge to the last. These are called after completing
 446  * &drm_encoder_helper_funcs.atomic_enable
 447  *
 448  * Note: the bridge passed should be the one closest to the encoder
 449  */
 450 void drm_atomic_bridge_enable(struct drm_bridge *bridge,
 451                               struct drm_atomic_state *state)
 452 {
 453         if (!bridge)
 454                 return;
 455 
 456         if (bridge->funcs->atomic_enable)
 457                 bridge->funcs->atomic_enable(bridge, state);
 458         else if (bridge->funcs->enable)
 459                 bridge->funcs->enable(bridge);
 460 
 461         drm_atomic_bridge_enable(bridge->next, state);
 462 }
 463 EXPORT_SYMBOL(drm_atomic_bridge_enable);
 464 
 465 #ifdef CONFIG_OF
 466 /**
 467  * of_drm_find_bridge - find the bridge corresponding to the device node in
 468  *                      the global bridge list
 469  *
 470  * @np: device node
 471  *
 472  * RETURNS:
 473  * drm_bridge control struct on success, NULL on failure
 474  */
 475 struct drm_bridge *of_drm_find_bridge(struct device_node *np)
 476 {
 477         struct drm_bridge *bridge;
 478 
 479         mutex_lock(&bridge_lock);
 480 
 481         list_for_each_entry(bridge, &bridge_list, list) {
 482                 if (bridge->of_node == np) {
 483                         mutex_unlock(&bridge_lock);
 484                         return bridge;
 485                 }
 486         }
 487 
 488         mutex_unlock(&bridge_lock);
 489         return NULL;
 490 }
 491 EXPORT_SYMBOL(of_drm_find_bridge);
 492 #endif
 493 
 494 MODULE_AUTHOR("Ajay Kumar <ajaykumar.rs@samsung.com>");
 495 MODULE_DESCRIPTION("DRM bridge infrastructure");
 496 MODULE_LICENSE("GPL and additional rights");

/* [<][>][^][v][top][bottom][index][help] */