1aead40eaSThierry Reding /* 2aead40eaSThierry Reding * Copyright (C) 2013, NVIDIA Corporation. All rights reserved. 3aead40eaSThierry Reding * 4aead40eaSThierry Reding * Permission is hereby granted, free of charge, to any person obtaining a 5aead40eaSThierry Reding * copy of this software and associated documentation files (the "Software"), 6aead40eaSThierry Reding * to deal in the Software without restriction, including without limitation 7aead40eaSThierry Reding * the rights to use, copy, modify, merge, publish, distribute, sub license, 8aead40eaSThierry Reding * and/or sell copies of the Software, and to permit persons to whom the 9aead40eaSThierry Reding * Software is furnished to do so, subject to the following conditions: 10aead40eaSThierry Reding * 11aead40eaSThierry Reding * The above copyright notice and this permission notice (including the 12aead40eaSThierry Reding * next paragraph) shall be included in all copies or substantial portions 13aead40eaSThierry Reding * of the Software. 14aead40eaSThierry Reding * 15aead40eaSThierry Reding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16aead40eaSThierry Reding * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17aead40eaSThierry Reding * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18aead40eaSThierry Reding * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19aead40eaSThierry Reding * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20aead40eaSThierry Reding * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21aead40eaSThierry Reding * DEALINGS IN THE SOFTWARE. 22aead40eaSThierry Reding */ 23aead40eaSThierry Reding 24aead40eaSThierry Reding #ifndef __DRM_PANEL_H__ 25aead40eaSThierry Reding #define __DRM_PANEL_H__ 26aead40eaSThierry Reding 27bf3f5e98SJani Nikula #include <linux/err.h> 28e4e818ccSMasahiro Yamada #include <linux/errno.h> 29aead40eaSThierry Reding #include <linux/list.h> 30aead40eaSThierry Reding 31152dbdeaSSam Ravnborg struct backlight_device; 32e4e818ccSMasahiro Yamada struct device_node; 33aead40eaSThierry Reding struct drm_connector; 34aead40eaSThierry Reding struct drm_device; 35aead40eaSThierry Reding struct drm_panel; 362938931fSPhilipp Zabel struct display_timing; 37aead40eaSThierry Reding 385f3e7503SDerek Basehore enum drm_panel_orientation; 395f3e7503SDerek Basehore 4045527d43SAjay Kumar /** 4145527d43SAjay Kumar * struct drm_panel_funcs - perform operations on a given panel 4245527d43SAjay Kumar * 4345527d43SAjay Kumar * The .prepare() function is typically called before the display controller 4445527d43SAjay Kumar * starts to transmit video data. Panel drivers can use this to turn the panel 4545527d43SAjay Kumar * on and wait for it to become ready. If additional configuration is required 4645527d43SAjay Kumar * (via a control bus such as I2C, SPI or DSI for example) this is a good time 4745527d43SAjay Kumar * to do that. 4845527d43SAjay Kumar * 4945527d43SAjay Kumar * After the display controller has started transmitting video data, it's safe 5045527d43SAjay Kumar * to call the .enable() function. This will typically enable the backlight to 5145527d43SAjay Kumar * make the image on screen visible. Some panels require a certain amount of 5245527d43SAjay Kumar * time or frames before the image is displayed. This function is responsible 5345527d43SAjay Kumar * for taking this into account before enabling the backlight to avoid visual 5445527d43SAjay Kumar * glitches. 5545527d43SAjay Kumar * 5645527d43SAjay Kumar * Before stopping video transmission from the display controller it can be 5745527d43SAjay Kumar * necessary to turn off the panel to avoid visual glitches. This is done in 5845527d43SAjay Kumar * the .disable() function. Analogously to .enable() this typically involves 5945527d43SAjay Kumar * turning off the backlight and waiting for some time to make sure no image 6045527d43SAjay Kumar * is visible on the panel. It is then safe for the display controller to 6145527d43SAjay Kumar * cease transmission of video data. 6245527d43SAjay Kumar * 6345527d43SAjay Kumar * To save power when no video data is transmitted, a driver can power down 6445527d43SAjay Kumar * the panel. This is the job of the .unprepare() function. 65152dbdeaSSam Ravnborg * 66152dbdeaSSam Ravnborg * Backlight can be handled automatically if configured using 67152dbdeaSSam Ravnborg * drm_panel_of_backlight(). Then the driver does not need to implement the 68152dbdeaSSam Ravnborg * functionality to enable/disable backlight. 6945527d43SAjay Kumar */ 70aead40eaSThierry Reding struct drm_panel_funcs { 718b0c6e2fSSam Ravnborg /** 728b0c6e2fSSam Ravnborg * @prepare: 738b0c6e2fSSam Ravnborg * 748b0c6e2fSSam Ravnborg * Turn on panel and perform set up. 755dce87a9SSam Ravnborg * 765dce87a9SSam Ravnborg * This function is optional. 778b0c6e2fSSam Ravnborg */ 7845527d43SAjay Kumar int (*prepare)(struct drm_panel *panel); 798b0c6e2fSSam Ravnborg 808b0c6e2fSSam Ravnborg /** 818b0c6e2fSSam Ravnborg * @enable: 828b0c6e2fSSam Ravnborg * 838b0c6e2fSSam Ravnborg * Enable panel (turn on back light, etc.). 845dce87a9SSam Ravnborg * 855dce87a9SSam Ravnborg * This function is optional. 868b0c6e2fSSam Ravnborg */ 87aead40eaSThierry Reding int (*enable)(struct drm_panel *panel); 888b0c6e2fSSam Ravnborg 898b0c6e2fSSam Ravnborg /** 908b0c6e2fSSam Ravnborg * @disable: 918b0c6e2fSSam Ravnborg * 928b0c6e2fSSam Ravnborg * Disable panel (turn off back light, etc.). 935dce87a9SSam Ravnborg * 945dce87a9SSam Ravnborg * This function is optional. 958b0c6e2fSSam Ravnborg */ 968b0c6e2fSSam Ravnborg int (*disable)(struct drm_panel *panel); 978b0c6e2fSSam Ravnborg 988b0c6e2fSSam Ravnborg /** 998b0c6e2fSSam Ravnborg * @unprepare: 1008b0c6e2fSSam Ravnborg * 1018b0c6e2fSSam Ravnborg * Turn off panel. 1025dce87a9SSam Ravnborg * 1035dce87a9SSam Ravnborg * This function is optional. 1048b0c6e2fSSam Ravnborg */ 1058b0c6e2fSSam Ravnborg int (*unprepare)(struct drm_panel *panel); 1068b0c6e2fSSam Ravnborg 1078b0c6e2fSSam Ravnborg /** 1088b0c6e2fSSam Ravnborg * @get_modes: 1098b0c6e2fSSam Ravnborg * 1105dce87a9SSam Ravnborg * Add modes to the connector that the panel is attached to 1115dce87a9SSam Ravnborg * and returns the number of modes added. 1125dce87a9SSam Ravnborg * 1135dce87a9SSam Ravnborg * This function is mandatory. 1148b0c6e2fSSam Ravnborg */ 1150ce8ddd8SSam Ravnborg int (*get_modes)(struct drm_panel *panel, 1160ce8ddd8SSam Ravnborg struct drm_connector *connector); 1178b0c6e2fSSam Ravnborg 1188b0c6e2fSSam Ravnborg /** 1198b0c6e2fSSam Ravnborg * @get_timings: 1208b0c6e2fSSam Ravnborg * 1218b0c6e2fSSam Ravnborg * Copy display timings into the provided array and return 1228b0c6e2fSSam Ravnborg * the number of display timings available. 1235dce87a9SSam Ravnborg * 1245dce87a9SSam Ravnborg * This function is optional. 1258b0c6e2fSSam Ravnborg */ 1262938931fSPhilipp Zabel int (*get_timings)(struct drm_panel *panel, unsigned int num_timings, 1272938931fSPhilipp Zabel struct display_timing *timings); 128aead40eaSThierry Reding }; 129aead40eaSThierry Reding 13083127f67SThierry Reding /** 13183127f67SThierry Reding * struct drm_panel - DRM panel object 13283127f67SThierry Reding */ 133aead40eaSThierry Reding struct drm_panel { 1348b0c6e2fSSam Ravnborg /** 1358b0c6e2fSSam Ravnborg * @dev: 1368b0c6e2fSSam Ravnborg * 1378b0c6e2fSSam Ravnborg * Parent device of the panel. 1388b0c6e2fSSam Ravnborg */ 139aead40eaSThierry Reding struct device *dev; 140aead40eaSThierry Reding 1418b0c6e2fSSam Ravnborg /** 142152dbdeaSSam Ravnborg * @backlight: 143152dbdeaSSam Ravnborg * 144152dbdeaSSam Ravnborg * Backlight device, used to turn on backlight after the call 145152dbdeaSSam Ravnborg * to enable(), and to turn off backlight before the call to 146152dbdeaSSam Ravnborg * disable(). 147152dbdeaSSam Ravnborg * backlight is set by drm_panel_of_backlight() and drivers 148152dbdeaSSam Ravnborg * shall not assign it. 149152dbdeaSSam Ravnborg */ 150152dbdeaSSam Ravnborg struct backlight_device *backlight; 151152dbdeaSSam Ravnborg 152152dbdeaSSam Ravnborg /** 1538b0c6e2fSSam Ravnborg * @funcs: 1548b0c6e2fSSam Ravnborg * 1558b0c6e2fSSam Ravnborg * Operations that can be performed on the panel. 1568b0c6e2fSSam Ravnborg */ 157aead40eaSThierry Reding const struct drm_panel_funcs *funcs; 158aead40eaSThierry Reding 1598b0c6e2fSSam Ravnborg /** 1609a2654c0SLaurent Pinchart * @connector_type: 1619a2654c0SLaurent Pinchart * 1629a2654c0SLaurent Pinchart * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to 1639a2654c0SLaurent Pinchart * initialise the drm_connector corresponding to the panel with the 1649a2654c0SLaurent Pinchart * correct connector type. 1659a2654c0SLaurent Pinchart */ 1669a2654c0SLaurent Pinchart int connector_type; 1679a2654c0SLaurent Pinchart 1689a2654c0SLaurent Pinchart /** 1698b0c6e2fSSam Ravnborg * @list: 1708b0c6e2fSSam Ravnborg * 1718b0c6e2fSSam Ravnborg * Panel entry in registry. 1728b0c6e2fSSam Ravnborg */ 173aead40eaSThierry Reding struct list_head list; 174aead40eaSThierry Reding }; 175aead40eaSThierry Reding 1766dbe0c4bSLaurent Pinchart void drm_panel_init(struct drm_panel *panel, struct device *dev, 1779a2654c0SLaurent Pinchart const struct drm_panel_funcs *funcs, 1789a2654c0SLaurent Pinchart int connector_type); 179aead40eaSThierry Reding 180c3ee8c65SBernard Zhao void drm_panel_add(struct drm_panel *panel); 181aead40eaSThierry Reding void drm_panel_remove(struct drm_panel *panel); 182aead40eaSThierry Reding 1837a833d30SSam Ravnborg int drm_panel_prepare(struct drm_panel *panel); 1847a833d30SSam Ravnborg int drm_panel_unprepare(struct drm_panel *panel); 1857a833d30SSam Ravnborg 1867a833d30SSam Ravnborg int drm_panel_enable(struct drm_panel *panel); 1877a833d30SSam Ravnborg int drm_panel_disable(struct drm_panel *panel); 1887a833d30SSam Ravnborg 18906c4a9c2SSam Ravnborg int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector); 1907a833d30SSam Ravnborg 191b61c8d5dSRob Herring #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) 192327bc443SLaurent Pinchart struct drm_panel *of_drm_find_panel(const struct device_node *np); 1935f3e7503SDerek Basehore int of_drm_get_panel_orientation(const struct device_node *np, 1945f3e7503SDerek Basehore enum drm_panel_orientation *orientation); 195aead40eaSThierry Reding #else 196327bc443SLaurent Pinchart static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) 197aead40eaSThierry Reding { 1985fa8e4a2SBoris Brezillon return ERR_PTR(-ENODEV); 199aead40eaSThierry Reding } 2005f3e7503SDerek Basehore 2015f3e7503SDerek Basehore static inline int of_drm_get_panel_orientation(const struct device_node *np, 2025f3e7503SDerek Basehore enum drm_panel_orientation *orientation) 2035f3e7503SDerek Basehore { 2045f3e7503SDerek Basehore return -ENODEV; 2055f3e7503SDerek Basehore } 206aead40eaSThierry Reding #endif 207aead40eaSThierry Reding 2088d6cb2f7SArnd Bergmann #if IS_ENABLED(CONFIG_DRM_PANEL) && (IS_BUILTIN(CONFIG_BACKLIGHT_CLASS_DEVICE) || \ 2098d6cb2f7SArnd Bergmann (IS_MODULE(CONFIG_DRM) && IS_MODULE(CONFIG_BACKLIGHT_CLASS_DEVICE))) 210152dbdeaSSam Ravnborg int drm_panel_of_backlight(struct drm_panel *panel); 211152dbdeaSSam Ravnborg #else 212152dbdeaSSam Ravnborg static inline int drm_panel_of_backlight(struct drm_panel *panel) 213152dbdeaSSam Ravnborg { 214152dbdeaSSam Ravnborg return 0; 215152dbdeaSSam Ravnborg } 216152dbdeaSSam Ravnborg #endif 217152dbdeaSSam Ravnborg 218aead40eaSThierry Reding #endif 219