Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved.
  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. #include <drm/drm_panel.h>
  29.  
  30. static DEFINE_MUTEX(panel_lock);
  31. static LIST_HEAD(panel_list);
  32.  
  33. void drm_panel_init(struct drm_panel *panel)
  34. {
  35.         INIT_LIST_HEAD(&panel->list);
  36. }
  37. EXPORT_SYMBOL(drm_panel_init);
  38.  
  39. int drm_panel_add(struct drm_panel *panel)
  40. {
  41.         mutex_lock(&panel_lock);
  42.         list_add_tail(&panel->list, &panel_list);
  43.         mutex_unlock(&panel_lock);
  44.  
  45.         return 0;
  46. }
  47. EXPORT_SYMBOL(drm_panel_add);
  48.  
  49. void drm_panel_remove(struct drm_panel *panel)
  50. {
  51.         mutex_lock(&panel_lock);
  52.         list_del_init(&panel->list);
  53.         mutex_unlock(&panel_lock);
  54. }
  55. EXPORT_SYMBOL(drm_panel_remove);
  56.  
  57. int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector)
  58. {
  59.         if (panel->connector)
  60.                 return -EBUSY;
  61.  
  62.         panel->connector = connector;
  63.         panel->drm = connector->dev;
  64.  
  65.         return 0;
  66. }
  67. EXPORT_SYMBOL(drm_panel_attach);
  68.  
  69. int drm_panel_detach(struct drm_panel *panel)
  70. {
  71.         panel->connector = NULL;
  72.         panel->drm = NULL;
  73.  
  74.         return 0;
  75. }
  76. EXPORT_SYMBOL(drm_panel_detach);
  77.  
  78. #ifdef CONFIG_OF
  79. struct drm_panel *of_drm_find_panel(struct device_node *np)
  80. {
  81.         struct drm_panel *panel;
  82.  
  83.         mutex_lock(&panel_lock);
  84.  
  85.         list_for_each_entry(panel, &panel_list, list) {
  86.                 if (panel->dev->of_node == np) {
  87.                         mutex_unlock(&panel_lock);
  88.                         return panel;
  89.                 }
  90.         }
  91.  
  92.         mutex_unlock(&panel_lock);
  93.         return NULL;
  94. }
  95. EXPORT_SYMBOL(of_drm_find_panel);
  96. #endif
  97.  
  98. MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
  99. MODULE_DESCRIPTION("DRM panel infrastructure");
  100. MODULE_LICENSE("GPL and additional rights");
  101.