Blame view
include/drm/drm_panel.h
6.2 KB
aead40ea0
|
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
|
26 |
#include <linux/err.h> |
e4e818cc2
|
27 |
#include <linux/errno.h> |
aead40ea0
|
28 |
#include <linux/list.h> |
152dbdeab
|
29 |
struct backlight_device; |
e4e818cc2
|
30 |
struct device_node; |
aead40ea0
|
31 32 33 |
struct drm_connector; struct drm_device; struct drm_panel; |
2938931f3
|
34 |
struct display_timing; |
aead40ea0
|
35 |
|
5f3e7503b
|
36 |
enum drm_panel_orientation; |
45527d435
|
37 38 |
/** * struct drm_panel_funcs - perform operations on a given panel |
45527d435
|
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
|
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
|
66 |
*/ |
aead40ea0
|
67 |
struct drm_panel_funcs { |
8b0c6e2fa
|
68 69 70 71 |
/** * @prepare: * * Turn on panel and perform set up. |
5dce87a91
|
72 73 |
* * This function is optional. |
8b0c6e2fa
|
74 |
*/ |
45527d435
|
75 |
int (*prepare)(struct drm_panel *panel); |
8b0c6e2fa
|
76 77 78 79 80 |
/** * @enable: * * Enable panel (turn on back light, etc.). |
5dce87a91
|
81 82 |
* * This function is optional. |
8b0c6e2fa
|
83 |
*/ |
aead40ea0
|
84 |
int (*enable)(struct drm_panel *panel); |
8b0c6e2fa
|
85 86 87 88 89 |
/** * @disable: * * Disable panel (turn off back light, etc.). |
5dce87a91
|
90 91 |
* * This function is optional. |
8b0c6e2fa
|
92 93 94 95 96 97 98 |
*/ int (*disable)(struct drm_panel *panel); /** * @unprepare: * * Turn off panel. |
5dce87a91
|
99 100 |
* * This function is optional. |
8b0c6e2fa
|
101 102 103 104 105 106 |
*/ int (*unprepare)(struct drm_panel *panel); /** * @get_modes: * |
5dce87a91
|
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
|
111 |
*/ |
0ce8ddd8e
|
112 113 |
int (*get_modes)(struct drm_panel *panel, struct drm_connector *connector); |
8b0c6e2fa
|
114 115 116 117 118 119 |
/** * @get_timings: * * Copy display timings into the provided array and return * the number of display timings available. |
5dce87a91
|
120 121 |
* * This function is optional. |
8b0c6e2fa
|
122 |
*/ |
2938931f3
|
123 124 |
int (*get_timings)(struct drm_panel *panel, unsigned int num_timings, struct display_timing *timings); |
aead40ea0
|
125 |
}; |
83127f67e
|
126 127 |
/** * struct drm_panel - DRM panel object |
83127f67e
|
128 |
*/ |
aead40ea0
|
129 |
struct drm_panel { |
8b0c6e2fa
|
130 |
/** |
8b0c6e2fa
|
131 132 133 134 |
* @dev: * * Parent device of the panel. */ |
aead40ea0
|
135 |
struct device *dev; |
8b0c6e2fa
|
136 |
/** |
152dbdeab
|
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
|
148 149 150 151 |
* @funcs: * * Operations that can be performed on the panel. */ |
aead40ea0
|
152 |
const struct drm_panel_funcs *funcs; |
8b0c6e2fa
|
153 |
/** |
9a2654c0f
|
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
|
163 164 165 166 |
* @list: * * Panel entry in registry. */ |
aead40ea0
|
167 168 |
struct list_head list; }; |
6dbe0c4b0
|
169 |
void drm_panel_init(struct drm_panel *panel, struct device *dev, |
9a2654c0f
|
170 171 |
const struct drm_panel_funcs *funcs, int connector_type); |
aead40ea0
|
172 |
|
c3ee8c65f
|
173 |
void drm_panel_add(struct drm_panel *panel); |
aead40ea0
|
174 |
void drm_panel_remove(struct drm_panel *panel); |
7a833d307
|
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
|
180 |
int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector); |
7a833d307
|
181 |
|
b61c8d5d9
|
182 |
#if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) |
327bc4434
|
183 |
struct drm_panel *of_drm_find_panel(const struct device_node *np); |
5f3e7503b
|
184 185 |
int of_drm_get_panel_orientation(const struct device_node *np, enum drm_panel_orientation *orientation); |
aead40ea0
|
186 |
#else |
327bc4434
|
187 |
static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) |
aead40ea0
|
188 |
{ |
5fa8e4a22
|
189 |
return ERR_PTR(-ENODEV); |
aead40ea0
|
190 |
} |
5f3e7503b
|
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
|
197 |
#endif |
8d6cb2f7f
|
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
|
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
|
207 |
#endif |