Blame view

include/drm/drm_panel.h 6.91 KB
aead40ea0   Thierry Reding   drm: Add panel su...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  /*
   * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
   * to deal in the Software without restriction, including without limitation
   * the rights to use, copy, modify, merge, publish, distribute, sub license,
   * and/or sell copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice (including the
   * next paragraph) shall be included in all copies or substantial portions
   * of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   * DEALINGS IN THE SOFTWARE.
   */
  
  #ifndef __DRM_PANEL_H__
  #define __DRM_PANEL_H__
  
  #include <linux/list.h>
  
  struct drm_connector;
  struct drm_device;
  struct drm_panel;
2938931f3   Philipp Zabel   drm/panel: Add di...
32
  struct display_timing;
aead40ea0   Thierry Reding   drm: Add panel su...
33

45527d435   Ajay Kumar   drm/panel: add .p...
34
35
36
37
38
39
40
41
  /**
   * struct drm_panel_funcs - perform operations on a given panel
   * @disable: disable panel (turn off back light, etc.)
   * @unprepare: turn off panel
   * @prepare: turn on panel and perform set up
   * @enable: enable panel (turn on back light, etc.)
   * @get_modes: add modes to the connector that the panel is attached to and
   * return the number of modes added
2938931f3   Philipp Zabel   drm/panel: Add di...
42
43
   * @get_timings: copy display timings into the provided array and return
   * the number of display timings available
45527d435   Ajay Kumar   drm/panel: add .p...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
   *
   * The .prepare() function is typically called before the display controller
   * starts to transmit video data. Panel drivers can use this to turn the panel
   * on and wait for it to become ready. If additional configuration is required
   * (via a control bus such as I2C, SPI or DSI for example) this is a good time
   * to do that.
   *
   * After the display controller has started transmitting video data, it's safe
   * to call the .enable() function. This will typically enable the backlight to
   * make the image on screen visible. Some panels require a certain amount of
   * time or frames before the image is displayed. This function is responsible
   * for taking this into account before enabling the backlight to avoid visual
   * glitches.
   *
   * Before stopping video transmission from the display controller it can be
   * necessary to turn off the panel to avoid visual glitches. This is done in
   * the .disable() function. Analogously to .enable() this typically involves
   * turning off the backlight and waiting for some time to make sure no image
   * is visible on the panel. It is then safe for the display controller to
   * cease transmission of video data.
   *
   * To save power when no video data is transmitted, a driver can power down
   * the panel. This is the job of the .unprepare() function.
   */
aead40ea0   Thierry Reding   drm: Add panel su...
68
69
  struct drm_panel_funcs {
  	int (*disable)(struct drm_panel *panel);
45527d435   Ajay Kumar   drm/panel: add .p...
70
71
  	int (*unprepare)(struct drm_panel *panel);
  	int (*prepare)(struct drm_panel *panel);
aead40ea0   Thierry Reding   drm: Add panel su...
72
73
  	int (*enable)(struct drm_panel *panel);
  	int (*get_modes)(struct drm_panel *panel);
2938931f3   Philipp Zabel   drm/panel: Add di...
74
75
  	int (*get_timings)(struct drm_panel *panel, unsigned int num_timings,
  			   struct display_timing *timings);
aead40ea0   Thierry Reding   drm: Add panel su...
76
  };
83127f67e   Thierry Reding   drm/panel: Flesh ...
77
78
79
80
81
82
83
84
  /**
   * struct drm_panel - DRM panel object
   * @drm: DRM device owning the panel
   * @connector: DRM connector that the panel is attached to
   * @dev: parent device of the panel
   * @funcs: operations that can be performed on the panel
   * @list: panel entry in registry
   */
aead40ea0   Thierry Reding   drm: Add panel su...
85
86
87
88
89
90
91
92
93
  struct drm_panel {
  	struct drm_device *drm;
  	struct drm_connector *connector;
  	struct device *dev;
  
  	const struct drm_panel_funcs *funcs;
  
  	struct list_head list;
  };
83127f67e   Thierry Reding   drm/panel: Flesh ...
94
95
96
97
98
99
100
101
102
103
104
  /**
   * drm_disable_unprepare - power off a panel
   * @panel: DRM panel
   *
   * Calling this function will completely power off a panel (assert the panel's
   * reset, turn off power supplies, ...). After this function has completed, it
   * is usually no longer possible to communicate with the panel until another
   * call to drm_panel_prepare().
   *
   * Return: 0 on success or a negative error code on failure.
   */
45527d435   Ajay Kumar   drm/panel: add .p...
105
106
107
108
109
110
111
  static inline int drm_panel_unprepare(struct drm_panel *panel)
  {
  	if (panel && panel->funcs && panel->funcs->unprepare)
  		return panel->funcs->unprepare(panel);
  
  	return panel ? -ENOSYS : -EINVAL;
  }
83127f67e   Thierry Reding   drm/panel: Flesh ...
112
113
114
115
116
117
118
119
120
121
  /**
   * drm_panel_disable - disable a panel
   * @panel: DRM panel
   *
   * This will typically turn off the panel's backlight or disable the display
   * drivers. For smart panels it should still be possible to communicate with
   * the integrated circuitry via any command bus after this call.
   *
   * Return: 0 on success or a negative error code on failure.
   */
aead40ea0   Thierry Reding   drm: Add panel su...
122
123
124
125
126
127
128
  static inline int drm_panel_disable(struct drm_panel *panel)
  {
  	if (panel && panel->funcs && panel->funcs->disable)
  		return panel->funcs->disable(panel);
  
  	return panel ? -ENOSYS : -EINVAL;
  }
83127f67e   Thierry Reding   drm/panel: Flesh ...
129
130
131
132
133
134
135
136
137
138
  /**
   * drm_panel_prepare - power on a panel
   * @panel: DRM panel
   *
   * Calling this function will enable power and deassert any reset signals to
   * the panel. After this has completed it is possible to communicate with any
   * integrated circuitry via a command bus.
   *
   * Return: 0 on success or a negative error code on failure.
   */
45527d435   Ajay Kumar   drm/panel: add .p...
139
140
141
142
143
144
145
  static inline int drm_panel_prepare(struct drm_panel *panel)
  {
  	if (panel && panel->funcs && panel->funcs->prepare)
  		return panel->funcs->prepare(panel);
  
  	return panel ? -ENOSYS : -EINVAL;
  }
83127f67e   Thierry Reding   drm/panel: Flesh ...
146
147
148
149
150
151
152
153
154
155
  /**
   * drm_panel_enable - enable a panel
   * @panel: DRM panel
   *
   * Calling this function will cause the panel display drivers to be turned on
   * and the backlight to be enabled. Content will be visible on screen after
   * this call completes.
   *
   * Return: 0 on success or a negative error code on failure.
   */
aead40ea0   Thierry Reding   drm: Add panel su...
156
157
158
159
160
161
162
  static inline int drm_panel_enable(struct drm_panel *panel)
  {
  	if (panel && panel->funcs && panel->funcs->enable)
  		return panel->funcs->enable(panel);
  
  	return panel ? -ENOSYS : -EINVAL;
  }
83127f67e   Thierry Reding   drm/panel: Flesh ...
163
164
165
166
167
168
169
170
171
172
  /**
   * drm_panel_get_modes - probe the available display modes of a panel
   * @panel: DRM panel
   *
   * The modes probed from the panel are automatically added to the connector
   * that the panel is attached to.
   *
   * Return: The number of modes available from the panel on success or a
   * negative error code on failure.
   */
7bf93c73a   Ajay Kumar   drm/panel: Provid...
173
174
175
176
177
178
179
  static inline int drm_panel_get_modes(struct drm_panel *panel)
  {
  	if (panel && panel->funcs && panel->funcs->get_modes)
  		return panel->funcs->get_modes(panel);
  
  	return panel ? -ENOSYS : -EINVAL;
  }
aead40ea0   Thierry Reding   drm: Add panel su...
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  void drm_panel_init(struct drm_panel *panel);
  
  int drm_panel_add(struct drm_panel *panel);
  void drm_panel_remove(struct drm_panel *panel);
  
  int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector);
  int drm_panel_detach(struct drm_panel *panel);
  
  #ifdef CONFIG_OF
  struct drm_panel *of_drm_find_panel(struct device_node *np);
  #else
  static inline struct drm_panel *of_drm_find_panel(struct device_node *np)
  {
  	return NULL;
  }
  #endif
  
  #endif