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 #ifndef __DRM_PANEL_H__ 25 #define __DRM_PANEL_H__ 26 27 #include <linux/err.h> 28 #include <linux/errno.h> 29 #include <linux/list.h> 30 #include <linux/mutex.h> 31 #include <linux/kref.h> 32 33 struct backlight_device; 34 struct dentry; 35 struct device_node; 36 struct drm_connector; 37 struct drm_panel_follower; 38 struct drm_panel; 39 struct display_timing; 40 41 enum drm_panel_orientation; 42 43 /** 44 * struct drm_panel_funcs - perform operations on a given panel 45 * 46 * The .prepare() function is typically called before the display controller 47 * starts to transmit video data. Panel drivers can use this to turn the panel 48 * on and wait for it to become ready. If additional configuration is required 49 * (via a control bus such as I2C, SPI or DSI for example) this is a good time 50 * to do that. 51 * 52 * After the display controller has started transmitting video data, it's safe 53 * to call the .enable() function. This will typically enable the backlight to 54 * make the image on screen visible. Some panels require a certain amount of 55 * time or frames before the image is displayed. This function is responsible 56 * for taking this into account before enabling the backlight to avoid visual 57 * glitches. 58 * 59 * Before stopping video transmission from the display controller it can be 60 * necessary to turn off the panel to avoid visual glitches. This is done in 61 * the .disable() function. Analogously to .enable() this typically involves 62 * turning off the backlight and waiting for some time to make sure no image 63 * is visible on the panel. It is then safe for the display controller to 64 * cease transmission of video data. 65 * 66 * To save power when no video data is transmitted, a driver can power down 67 * the panel. This is the job of the .unprepare() function. 68 * 69 * Backlight can be handled automatically if configured using 70 * drm_panel_of_backlight() or drm_panel_dp_aux_backlight(). Then the driver 71 * does not need to implement the functionality to enable/disable backlight. 72 */ 73 struct drm_panel_funcs { 74 /** 75 * @prepare: 76 * 77 * Turn on panel and perform set up. 78 * 79 * This function is optional. 80 */ 81 int (*prepare)(struct drm_panel *panel); 82 83 /** 84 * @enable: 85 * 86 * Enable panel (turn on back light, etc.). 87 * 88 * This function is optional. 89 */ 90 int (*enable)(struct drm_panel *panel); 91 92 /** 93 * @disable: 94 * 95 * Disable panel (turn off back light, etc.). 96 * 97 * This function is optional. 98 */ 99 int (*disable)(struct drm_panel *panel); 100 101 /** 102 * @unprepare: 103 * 104 * Turn off panel. 105 * 106 * This function is optional. 107 */ 108 int (*unprepare)(struct drm_panel *panel); 109 110 /** 111 * @get_modes: 112 * 113 * Add modes to the connector that the panel is attached to 114 * and returns the number of modes added. 115 * 116 * This function is mandatory. 117 */ 118 int (*get_modes)(struct drm_panel *panel, 119 struct drm_connector *connector); 120 121 /** 122 * @get_orientation: 123 * 124 * Return the panel orientation set by device tree or EDID. 125 * 126 * This function is optional. 127 */ 128 enum drm_panel_orientation (*get_orientation)(struct drm_panel *panel); 129 130 /** 131 * @get_timings: 132 * 133 * Copy display timings into the provided array and return 134 * the number of display timings available. 135 * 136 * This function is optional. 137 */ 138 int (*get_timings)(struct drm_panel *panel, unsigned int num_timings, 139 struct display_timing *timings); 140 141 /** 142 * @debugfs_init: 143 * 144 * Allows panels to create panels-specific debugfs files. 145 */ 146 void (*debugfs_init)(struct drm_panel *panel, struct dentry *root); 147 }; 148 149 struct drm_panel_follower_funcs { 150 /** 151 * @panel_prepared: 152 * 153 * Called after the panel has been powered on. 154 */ 155 int (*panel_prepared)(struct drm_panel_follower *follower); 156 157 /** 158 * @panel_unpreparing: 159 * 160 * Called before the panel is powered off. 161 */ 162 int (*panel_unpreparing)(struct drm_panel_follower *follower); 163 164 /** 165 * @panel_enabled: 166 * 167 * Called after the panel and the backlight have been enabled. 168 */ 169 int (*panel_enabled)(struct drm_panel_follower *follower); 170 171 /** 172 * @panel_disabling: 173 * 174 * Called before the panel and the backlight are disabled. 175 */ 176 int (*panel_disabling)(struct drm_panel_follower *follower); 177 }; 178 179 struct drm_panel_follower { 180 /** 181 * @funcs: 182 * 183 * Dependent device callbacks; should be initted by the caller. 184 */ 185 const struct drm_panel_follower_funcs *funcs; 186 187 /** 188 * @list 189 * 190 * Used for linking into panel's list; set by drm_panel_add_follower(). 191 */ 192 struct list_head list; 193 194 /** 195 * @panel 196 * 197 * The panel we're dependent on; set by drm_panel_add_follower(). 198 */ 199 struct drm_panel *panel; 200 }; 201 202 /** 203 * struct drm_panel - DRM panel object 204 */ 205 struct drm_panel { 206 /** 207 * @dev: 208 * 209 * Parent device of the panel. 210 */ 211 struct device *dev; 212 213 /** 214 * @backlight: 215 * 216 * Backlight device, used to turn on backlight after the call 217 * to enable(), and to turn off backlight before the call to 218 * disable(). 219 * backlight is set by drm_panel_of_backlight() or 220 * drm_panel_dp_aux_backlight() and drivers shall not assign it. 221 */ 222 struct backlight_device *backlight; 223 224 /** 225 * @funcs: 226 * 227 * Operations that can be performed on the panel. 228 */ 229 const struct drm_panel_funcs *funcs; 230 231 /** 232 * @connector_type: 233 * 234 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to 235 * initialise the drm_connector corresponding to the panel with the 236 * correct connector type. 237 */ 238 int connector_type; 239 240 /** 241 * @list: 242 * 243 * Panel entry in registry. 244 */ 245 struct list_head list; 246 247 /** 248 * @followers: 249 * 250 * A list of struct drm_panel_follower dependent on this panel. 251 */ 252 struct list_head followers; 253 254 /** 255 * @follower_lock: 256 * 257 * Lock for followers list. 258 */ 259 struct mutex follower_lock; 260 261 /** 262 * @prepare_prev_first: 263 * 264 * The previous controller should be prepared first, before the prepare 265 * for the panel is called. This is largely required for DSI panels 266 * where the DSI host controller should be initialised to LP-11 before 267 * the panel is powered up. 268 */ 269 bool prepare_prev_first; 270 271 /** 272 * @prepared: 273 * 274 * If true then the panel has been prepared. 275 */ 276 bool prepared; 277 278 /** 279 * @enabled: 280 * 281 * If true then the panel has been enabled. 282 */ 283 bool enabled; 284 285 /** 286 * @container: Pointer to the private driver struct embedding this 287 * @struct drm_panel. 288 */ 289 void *container; 290 291 /** 292 * @refcount: reference count of users referencing this panel. 293 */ 294 struct kref refcount; 295 }; 296 297 void *__devm_drm_panel_alloc(struct device *dev, size_t size, size_t offset, 298 const struct drm_panel_funcs *funcs, 299 int connector_type); 300 301 /** 302 * devm_drm_panel_alloc - Allocate and initialize a refcounted panel. 303 * 304 * @dev: struct device of the panel device 305 * @type: the type of the struct which contains struct &drm_panel 306 * @member: the name of the &drm_panel within @type 307 * @funcs: callbacks for this panel 308 * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to 309 * the panel interface 310 * 311 * The reference count of the returned panel is initialized to 1. This 312 * reference will be automatically dropped via devm (by calling 313 * drm_panel_put()) when @dev is removed. 314 * 315 * Returns: 316 * Pointer to container structure embedding the panel, ERR_PTR on failure. 317 */ 318 #define devm_drm_panel_alloc(dev, type, member, funcs, connector_type) \ 319 ((type *)__devm_drm_panel_alloc(dev, sizeof(type), \ 320 offsetof(type, member), funcs, \ 321 connector_type)) 322 323 void drm_panel_init(struct drm_panel *panel, struct device *dev, 324 const struct drm_panel_funcs *funcs, 325 int connector_type); 326 327 struct drm_panel *drm_panel_get(struct drm_panel *panel); 328 void drm_panel_put(struct drm_panel *panel); 329 330 void drm_panel_add(struct drm_panel *panel); 331 void drm_panel_remove(struct drm_panel *panel); 332 333 void drm_panel_prepare(struct drm_panel *panel); 334 void drm_panel_unprepare(struct drm_panel *panel); 335 336 void drm_panel_enable(struct drm_panel *panel); 337 void drm_panel_disable(struct drm_panel *panel); 338 339 int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector); 340 341 #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) 342 struct drm_panel *of_drm_find_panel(const struct device_node *np); 343 int of_drm_get_panel_orientation(const struct device_node *np, 344 enum drm_panel_orientation *orientation); 345 #else 346 static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) 347 { 348 return ERR_PTR(-ENODEV); 349 } 350 351 static inline int of_drm_get_panel_orientation(const struct device_node *np, 352 enum drm_panel_orientation *orientation) 353 { 354 return -ENODEV; 355 } 356 #endif 357 358 #if defined(CONFIG_DRM_PANEL) 359 bool drm_is_panel_follower(struct device *dev); 360 int drm_panel_add_follower(struct device *follower_dev, 361 struct drm_panel_follower *follower); 362 void drm_panel_remove_follower(struct drm_panel_follower *follower); 363 int devm_drm_panel_add_follower(struct device *follower_dev, 364 struct drm_panel_follower *follower); 365 #else 366 static inline bool drm_is_panel_follower(struct device *dev) 367 { 368 return false; 369 } 370 371 static inline int drm_panel_add_follower(struct device *follower_dev, 372 struct drm_panel_follower *follower) 373 { 374 return -ENODEV; 375 } 376 377 static inline void drm_panel_remove_follower(struct drm_panel_follower *follower) { } 378 static inline int devm_drm_panel_add_follower(struct device *follower_dev, 379 struct drm_panel_follower *follower) 380 { 381 return -ENODEV; 382 } 383 #endif 384 385 #if IS_ENABLED(CONFIG_DRM_PANEL) && (IS_BUILTIN(CONFIG_BACKLIGHT_CLASS_DEVICE) || \ 386 (IS_MODULE(CONFIG_DRM) && IS_MODULE(CONFIG_BACKLIGHT_CLASS_DEVICE))) 387 int drm_panel_of_backlight(struct drm_panel *panel); 388 #else 389 static inline int drm_panel_of_backlight(struct drm_panel *panel) 390 { 391 return 0; 392 } 393 #endif 394 395 #endif 396