Subversion Repositories Kolibri OS

Rev

Rev 6084 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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.  
  27. #include <drm/drm_crtc.h>
  28.  
  29. #include "drm/drmP.h"
  30.  
  31. /**
  32.  * DOC: overview
  33.  *
  34.  * struct &drm_bridge represents a device that hangs on to an encoder. These are
  35.  * handy when a regular &drm_encoder entity isn't enough to represent the entire
  36.  * encoder chain.
  37.  *
  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:
  40.  *
  41.  * encoder ---> bridge B ---> bridge A
  42.  *
  43.  * Here, the output of the encoder feeds to bridge B, and that furthers feeds to
  44.  * bridge A.
  45.  *
  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
  48.  * participate along with encoder functions to perform mode_set/enable/disable
  49.  * through the ops provided in &drm_bridge_funcs.
  50.  *
  51.  * drm_bridge, like drm_panel, aren't drm_mode_object entities like planes,
  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.  *
  58.  * Both legacy CRTC helpers and the new atomic modeset helpers support bridges.
  59.  */
  60.  
  61. static DEFINE_MUTEX(bridge_lock);
  62. static LIST_HEAD(bridge_list);
  63.  
  64. /**
  65.  * drm_bridge_add - add the given bridge to the global bridge list
  66.  *
  67.  * @bridge: bridge control structure
  68.  *
  69.  * RETURNS:
  70.  * Unconditionally returns Zero.
  71.  */
  72. int drm_bridge_add(struct drm_bridge *bridge)
  73. {
  74.         mutex_lock(&bridge_lock);
  75.         list_add_tail(&bridge->list, &bridge_list);
  76.         mutex_unlock(&bridge_lock);
  77.  
  78.         return 0;
  79. }
  80. EXPORT_SYMBOL(drm_bridge_add);
  81.  
  82. /**
  83.  * drm_bridge_remove - remove the given bridge from the global bridge list
  84.  *
  85.  * @bridge: bridge control structure
  86.  */
  87. void drm_bridge_remove(struct drm_bridge *bridge)
  88. {
  89.         mutex_lock(&bridge_lock);
  90.         list_del_init(&bridge->list);
  91.         mutex_unlock(&bridge_lock);
  92. }
  93. EXPORT_SYMBOL(drm_bridge_remove);
  94.  
  95. /**
  96.  * drm_bridge_attach - associate given bridge to our DRM device
  97.  *
  98.  * @dev: DRM device
  99.  * @bridge: bridge control structure
  100.  *
  101.  * called by a kms driver to link one of our encoder/bridge to the given
  102.  * bridge.
  103.  *
  104.  * Note that setting up links between the bridge and our encoder/bridge
  105.  * objects needs to be handled by the kms driver itself
  106.  *
  107.  * RETURNS:
  108.  * Zero on success, error code on failure
  109.  */
  110. int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge)
  111. {
  112.         if (!dev || !bridge)
  113.                 return -EINVAL;
  114.  
  115.         if (bridge->dev)
  116.                 return -EBUSY;
  117.  
  118.         bridge->dev = dev;
  119.  
  120.         if (bridge->funcs->attach)
  121.                 return bridge->funcs->attach(bridge);
  122.  
  123.         return 0;
  124. }
  125. EXPORT_SYMBOL(drm_bridge_attach);
  126.  
  127. /**
  128.  * DOC: bridge callbacks
  129.  *
  130.  * The &drm_bridge_funcs ops are populated by the bridge driver. The DRM
  131.  * internals (atomic and CRTC helpers) use the helpers defined in drm_bridge.c
  132.  * These helpers call a specific &drm_bridge_funcs op for all the bridges
  133.  * during encoder configuration.
  134.  *
  135.  * For detailed specification of the bridge callbacks see &drm_bridge_funcs.
  136.  */
  137.  
  138. /**
  139.  * drm_bridge_mode_fixup - fixup proposed mode for all bridges in the
  140.  *                         encoder chain
  141.  * @bridge: bridge control structure
  142.  * @mode: desired mode to be set for the bridge
  143.  * @adjusted_mode: updated mode that works for this bridge
  144.  *
  145.  * Calls ->mode_fixup() &drm_bridge_funcs op for all the bridges in the
  146.  * encoder chain, starting from the first bridge to the last.
  147.  *
  148.  * Note: the bridge passed should be the one closest to the encoder
  149.  *
  150.  * RETURNS:
  151.  * true on success, false on failure
  152.  */
  153. bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
  154.                         const struct drm_display_mode *mode,
  155.                         struct drm_display_mode *adjusted_mode)
  156. {
  157.         bool ret = true;
  158.  
  159.         if (!bridge)
  160.                 return true;
  161.  
  162.         if (bridge->funcs->mode_fixup)
  163.                 ret = bridge->funcs->mode_fixup(bridge, mode, adjusted_mode);
  164.  
  165.         ret = ret && drm_bridge_mode_fixup(bridge->next, mode, adjusted_mode);
  166.  
  167.         return ret;
  168. }
  169. EXPORT_SYMBOL(drm_bridge_mode_fixup);
  170.  
  171. /**
  172.  * drm_bridge_disable - calls ->disable() &drm_bridge_funcs op for all
  173.  *                      bridges in the encoder chain.
  174.  * @bridge: bridge control structure
  175.  *
  176.  * Calls ->disable() &drm_bridge_funcs op for all the bridges in the encoder
  177.  * chain, starting from the last bridge to the first. These are called before
  178.  * calling the encoder's prepare op.
  179.  *
  180.  * Note: the bridge passed should be the one closest to the encoder
  181.  */
  182. void drm_bridge_disable(struct drm_bridge *bridge)
  183. {
  184.         if (!bridge)
  185.                 return;
  186.  
  187.         drm_bridge_disable(bridge->next);
  188.  
  189.         bridge->funcs->disable(bridge);
  190. }
  191. EXPORT_SYMBOL(drm_bridge_disable);
  192.  
  193. /**
  194.  * drm_bridge_post_disable - calls ->post_disable() &drm_bridge_funcs op for
  195.  *                           all bridges in the encoder chain.
  196.  * @bridge: bridge control structure
  197.  *
  198.  * Calls ->post_disable() &drm_bridge_funcs op for all the bridges in the
  199.  * encoder chain, starting from the first bridge to the last. These are called
  200.  * after completing the encoder's prepare op.
  201.  *
  202.  * Note: the bridge passed should be the one closest to the encoder
  203.  */
  204. void drm_bridge_post_disable(struct drm_bridge *bridge)
  205. {
  206.         if (!bridge)
  207.                 return;
  208.  
  209.         bridge->funcs->post_disable(bridge);
  210.  
  211.         drm_bridge_post_disable(bridge->next);
  212. }
  213. EXPORT_SYMBOL(drm_bridge_post_disable);
  214.  
  215. /**
  216.  * drm_bridge_mode_set - set proposed mode for all bridges in the
  217.  *                       encoder chain
  218.  * @bridge: bridge control structure
  219.  * @mode: desired mode to be set for the bridge
  220.  * @adjusted_mode: updated mode that works for this bridge
  221.  *
  222.  * Calls ->mode_set() &drm_bridge_funcs op for all the bridges in the
  223.  * encoder chain, starting from the first bridge to the last.
  224.  *
  225.  * Note: the bridge passed should be the one closest to the encoder
  226.  */
  227. void drm_bridge_mode_set(struct drm_bridge *bridge,
  228.                         struct drm_display_mode *mode,
  229.                         struct drm_display_mode *adjusted_mode)
  230. {
  231.         if (!bridge)
  232.                 return;
  233.  
  234.         if (bridge->funcs->mode_set)
  235.                 bridge->funcs->mode_set(bridge, mode, adjusted_mode);
  236.  
  237.         drm_bridge_mode_set(bridge->next, mode, adjusted_mode);
  238. }
  239. EXPORT_SYMBOL(drm_bridge_mode_set);
  240.  
  241. /**
  242.  * drm_bridge_pre_enable - calls ->pre_enable() &drm_bridge_funcs op for all
  243.  *                         bridges in the encoder chain.
  244.  * @bridge: bridge control structure
  245.  *
  246.  * Calls ->pre_enable() &drm_bridge_funcs op for all the bridges in the encoder
  247.  * chain, starting from the last bridge to the first. These are called
  248.  * before calling the encoder's commit op.
  249.  *
  250.  * Note: the bridge passed should be the one closest to the encoder
  251.  */
  252. void drm_bridge_pre_enable(struct drm_bridge *bridge)
  253. {
  254.         if (!bridge)
  255.                 return;
  256.  
  257.         drm_bridge_pre_enable(bridge->next);
  258.  
  259.         bridge->funcs->pre_enable(bridge);
  260. }
  261. EXPORT_SYMBOL(drm_bridge_pre_enable);
  262.  
  263. /**
  264.  * drm_bridge_enable - calls ->enable() &drm_bridge_funcs op for all bridges
  265.  *                     in the encoder chain.
  266.  * @bridge: bridge control structure
  267.  *
  268.  * Calls ->enable() &drm_bridge_funcs op for all the bridges in the encoder
  269.  * chain, starting from the first bridge to the last. These are called
  270.  * after completing the encoder's commit op.
  271.  *
  272.  * Note that the bridge passed should be the one closest to the encoder
  273.  */
  274. void drm_bridge_enable(struct drm_bridge *bridge)
  275. {
  276.         if (!bridge)
  277.                 return;
  278.  
  279.         bridge->funcs->enable(bridge);
  280.  
  281.         drm_bridge_enable(bridge->next);
  282. }
  283. EXPORT_SYMBOL(drm_bridge_enable);
  284.  
  285. #ifdef CONFIG_OF
  286. /**
  287.  * of_drm_find_bridge - find the bridge corresponding to the device node in
  288.  *                      the global bridge list
  289.  *
  290.  * @np: device node
  291.  *
  292.  * RETURNS:
  293.  * drm_bridge control struct on success, NULL on failure
  294.  */
  295. struct drm_bridge *of_drm_find_bridge(struct device_node *np)
  296. {
  297.         struct drm_bridge *bridge;
  298.  
  299.         mutex_lock(&bridge_lock);
  300.  
  301.         list_for_each_entry(bridge, &bridge_list, list) {
  302.                 if (bridge->of_node == np) {
  303.                         mutex_unlock(&bridge_lock);
  304.                         return bridge;
  305.                 }
  306.         }
  307.  
  308.         mutex_unlock(&bridge_lock);
  309.         return NULL;
  310. }
  311. EXPORT_SYMBOL(of_drm_find_bridge);
  312. #endif
  313.  
  314. MODULE_AUTHOR("Ajay Kumar <ajaykumar.rs@samsung.com>");
  315. MODULE_DESCRIPTION("DRM bridge infrastructure");
  316. MODULE_LICENSE("GPL and additional rights");
  317.