Blame view

include/drm/drm_panel.h 6.2 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
  /*
   * 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__
bf3f5e985   Jani Nikula   drm/panel: make d...
26
  #include <linux/err.h>
e4e818cc2   Masahiro Yamada   drm: make drm_pan...
27
  #include <linux/errno.h>
aead40ea0   Thierry Reding   drm: Add panel su...
28
  #include <linux/list.h>
152dbdeab   Sam Ravnborg   drm/panel: add ba...
29
  struct backlight_device;
e4e818cc2   Masahiro Yamada   drm: make drm_pan...
30
  struct device_node;
aead40ea0   Thierry Reding   drm: Add panel su...
31
32
33
  struct drm_connector;
  struct drm_device;
  struct drm_panel;
2938931f3   Philipp Zabel   drm/panel: Add di...
34
  struct display_timing;
aead40ea0   Thierry Reding   drm: Add panel su...
35

5f3e7503b   Derek Basehore   drm/panel: Add he...
36
  enum drm_panel_orientation;
45527d435   Ajay Kumar   drm/panel: add .p...
37
38
  /**
   * struct drm_panel_funcs - perform operations on a given panel
45527d435   Ajay Kumar   drm/panel: add .p...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
   *
   * 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.
152dbdeab   Sam Ravnborg   drm/panel: add ba...
62
63
64
65
   *
   * Backlight can be handled automatically if configured using
   * drm_panel_of_backlight(). Then the driver does not need to implement the
   * functionality to enable/disable backlight.
45527d435   Ajay Kumar   drm/panel: add .p...
66
   */
aead40ea0   Thierry Reding   drm: Add panel su...
67
  struct drm_panel_funcs {
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
68
69
70
71
  	/**
  	 * @prepare:
  	 *
  	 * Turn on panel and perform set up.
5dce87a91   Sam Ravnborg   drm/drm_panel: no...
72
73
  	 *
  	 * This function is optional.
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
74
  	 */
45527d435   Ajay Kumar   drm/panel: add .p...
75
  	int (*prepare)(struct drm_panel *panel);
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
76
77
78
79
80
  
  	/**
  	 * @enable:
  	 *
  	 * Enable panel (turn on back light, etc.).
5dce87a91   Sam Ravnborg   drm/drm_panel: no...
81
82
  	 *
  	 * This function is optional.
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
83
  	 */
aead40ea0   Thierry Reding   drm: Add panel su...
84
  	int (*enable)(struct drm_panel *panel);
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
85
86
87
88
89
  
  	/**
  	 * @disable:
  	 *
  	 * Disable panel (turn off back light, etc.).
5dce87a91   Sam Ravnborg   drm/drm_panel: no...
90
91
  	 *
  	 * This function is optional.
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
92
93
94
95
96
97
98
  	 */
  	int (*disable)(struct drm_panel *panel);
  
  	/**
  	 * @unprepare:
  	 *
  	 * Turn off panel.
5dce87a91   Sam Ravnborg   drm/drm_panel: no...
99
100
  	 *
  	 * This function is optional.
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
101
102
103
104
105
106
  	 */
  	int (*unprepare)(struct drm_panel *panel);
  
  	/**
  	 * @get_modes:
  	 *
5dce87a91   Sam Ravnborg   drm/drm_panel: no...
107
108
109
110
  	 * Add modes to the connector that the panel is attached to
  	 * and returns the number of modes added.
  	 *
  	 * This function is mandatory.
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
111
  	 */
0ce8ddd8e   Sam Ravnborg   drm/panel: add dr...
112
113
  	int (*get_modes)(struct drm_panel *panel,
  			 struct drm_connector *connector);
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
114
115
116
117
118
119
  
  	/**
  	 * @get_timings:
  	 *
  	 * Copy display timings into the provided array and return
  	 * the number of display timings available.
5dce87a91   Sam Ravnborg   drm/drm_panel: no...
120
121
  	 *
  	 * This function is optional.
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
122
  	 */
2938931f3   Philipp Zabel   drm/panel: Add di...
123
124
  	int (*get_timings)(struct drm_panel *panel, unsigned int num_timings,
  			   struct display_timing *timings);
aead40ea0   Thierry Reding   drm: Add panel su...
125
  };
83127f67e   Thierry Reding   drm/panel: Flesh ...
126
127
  /**
   * struct drm_panel - DRM panel object
83127f67e   Thierry Reding   drm/panel: Flesh ...
128
   */
aead40ea0   Thierry Reding   drm: Add panel su...
129
  struct drm_panel {
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
130
  	/**
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
131
132
133
134
  	 * @dev:
  	 *
  	 * Parent device of the panel.
  	 */
aead40ea0   Thierry Reding   drm: Add panel su...
135
  	struct device *dev;
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
136
  	/**
152dbdeab   Sam Ravnborg   drm/panel: add ba...
137
138
139
140
141
142
143
144
145
146
147
  	 * @backlight:
  	 *
  	 * Backlight device, used to turn on backlight after the call
  	 * to enable(), and to turn off backlight before the call to
  	 * disable().
  	 * backlight is set by drm_panel_of_backlight() and drivers
  	 * shall not assign it.
  	 */
  	struct backlight_device *backlight;
  
  	/**
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
148
149
150
151
  	 * @funcs:
  	 *
  	 * Operations that can be performed on the panel.
  	 */
aead40ea0   Thierry Reding   drm: Add panel su...
152
  	const struct drm_panel_funcs *funcs;
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
153
  	/**
9a2654c0f   Laurent Pinchart   drm/panel: Add an...
154
155
156
157
158
159
160
161
162
  	 * @connector_type:
  	 *
  	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
  	 * initialise the drm_connector corresponding to the panel with the
  	 * correct connector type.
  	 */
  	int connector_type;
  
  	/**
8b0c6e2fa   Sam Ravnborg   drm/panel: use in...
163
164
165
166
  	 * @list:
  	 *
  	 * Panel entry in registry.
  	 */
aead40ea0   Thierry Reding   drm: Add panel su...
167
168
  	struct list_head list;
  };
6dbe0c4b0   Laurent Pinchart   drm/panel: Initia...
169
  void drm_panel_init(struct drm_panel *panel, struct device *dev,
9a2654c0f   Laurent Pinchart   drm/panel: Add an...
170
171
  		    const struct drm_panel_funcs *funcs,
  		    int connector_type);
aead40ea0   Thierry Reding   drm: Add panel su...
172

c3ee8c65f   Bernard Zhao   drm/panel: remove...
173
  void drm_panel_add(struct drm_panel *panel);
aead40ea0   Thierry Reding   drm: Add panel su...
174
  void drm_panel_remove(struct drm_panel *panel);
7a833d307   Sam Ravnborg   drm/panel: move d...
175
176
177
178
179
  int drm_panel_prepare(struct drm_panel *panel);
  int drm_panel_unprepare(struct drm_panel *panel);
  
  int drm_panel_enable(struct drm_panel *panel);
  int drm_panel_disable(struct drm_panel *panel);
06c4a9c2a   Sam Ravnborg   drm/panel: decoup...
180
  int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector);
7a833d307   Sam Ravnborg   drm/panel: move d...
181

b61c8d5d9   Rob Herring   drm: make of_drm_...
182
  #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL)
327bc4434   Laurent Pinchart   drm/panel: Consti...
183
  struct drm_panel *of_drm_find_panel(const struct device_node *np);
5f3e7503b   Derek Basehore   drm/panel: Add he...
184
185
  int of_drm_get_panel_orientation(const struct device_node *np,
  				 enum drm_panel_orientation *orientation);
aead40ea0   Thierry Reding   drm: Add panel su...
186
  #else
327bc4434   Laurent Pinchart   drm/panel: Consti...
187
  static inline struct drm_panel *of_drm_find_panel(const struct device_node *np)
aead40ea0   Thierry Reding   drm: Add panel su...
188
  {
5fa8e4a22   Boris Brezillon   drm/panel: Make o...
189
  	return ERR_PTR(-ENODEV);
aead40ea0   Thierry Reding   drm: Add panel su...
190
  }
5f3e7503b   Derek Basehore   drm/panel: Add he...
191
192
193
194
195
196
  
  static inline int of_drm_get_panel_orientation(const struct device_node *np,
  					       enum drm_panel_orientation *orientation)
  {
  	return -ENODEV;
  }
aead40ea0   Thierry Reding   drm: Add panel su...
197
  #endif
8d6cb2f7f   Arnd Bergmann   drm/drm_panel: fi...
198
199
  #if IS_ENABLED(CONFIG_DRM_PANEL) && (IS_BUILTIN(CONFIG_BACKLIGHT_CLASS_DEVICE) || \
  	(IS_MODULE(CONFIG_DRM) && IS_MODULE(CONFIG_BACKLIGHT_CLASS_DEVICE)))
152dbdeab   Sam Ravnborg   drm/panel: add ba...
200
201
202
203
204
205
206
  int drm_panel_of_backlight(struct drm_panel *panel);
  #else
  static inline int drm_panel_of_backlight(struct drm_panel *panel)
  {
  	return 0;
  }
  #endif
aead40ea0   Thierry Reding   drm: Add panel su...
207
  #endif