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 31e4e818ccSMasahiro Yamada struct device_node; 32aead40eaSThierry Reding struct drm_connector; 33aead40eaSThierry Reding struct drm_device; 34aead40eaSThierry Reding struct drm_panel; 352938931fSPhilipp Zabel struct display_timing; 36aead40eaSThierry Reding 3745527d43SAjay Kumar /** 3845527d43SAjay Kumar * struct drm_panel_funcs - perform operations on a given panel 3945527d43SAjay Kumar * 4045527d43SAjay Kumar * The .prepare() function is typically called before the display controller 4145527d43SAjay Kumar * starts to transmit video data. Panel drivers can use this to turn the panel 4245527d43SAjay Kumar * on and wait for it to become ready. If additional configuration is required 4345527d43SAjay Kumar * (via a control bus such as I2C, SPI or DSI for example) this is a good time 4445527d43SAjay Kumar * to do that. 4545527d43SAjay Kumar * 4645527d43SAjay Kumar * After the display controller has started transmitting video data, it's safe 4745527d43SAjay Kumar * to call the .enable() function. This will typically enable the backlight to 4845527d43SAjay Kumar * make the image on screen visible. Some panels require a certain amount of 4945527d43SAjay Kumar * time or frames before the image is displayed. This function is responsible 5045527d43SAjay Kumar * for taking this into account before enabling the backlight to avoid visual 5145527d43SAjay Kumar * glitches. 5245527d43SAjay Kumar * 5345527d43SAjay Kumar * Before stopping video transmission from the display controller it can be 5445527d43SAjay Kumar * necessary to turn off the panel to avoid visual glitches. This is done in 5545527d43SAjay Kumar * the .disable() function. Analogously to .enable() this typically involves 5645527d43SAjay Kumar * turning off the backlight and waiting for some time to make sure no image 5745527d43SAjay Kumar * is visible on the panel. It is then safe for the display controller to 5845527d43SAjay Kumar * cease transmission of video data. 5945527d43SAjay Kumar * 6045527d43SAjay Kumar * To save power when no video data is transmitted, a driver can power down 6145527d43SAjay Kumar * the panel. This is the job of the .unprepare() function. 6245527d43SAjay Kumar */ 63aead40eaSThierry Reding struct drm_panel_funcs { 648b0c6e2fSSam Ravnborg /** 658b0c6e2fSSam Ravnborg * @prepare: 668b0c6e2fSSam Ravnborg * 678b0c6e2fSSam Ravnborg * Turn on panel and perform set up. 688b0c6e2fSSam Ravnborg */ 6945527d43SAjay Kumar int (*prepare)(struct drm_panel *panel); 708b0c6e2fSSam Ravnborg 718b0c6e2fSSam Ravnborg /** 728b0c6e2fSSam Ravnborg * @enable: 738b0c6e2fSSam Ravnborg * 748b0c6e2fSSam Ravnborg * Enable panel (turn on back light, etc.). 758b0c6e2fSSam Ravnborg */ 76aead40eaSThierry Reding int (*enable)(struct drm_panel *panel); 778b0c6e2fSSam Ravnborg 788b0c6e2fSSam Ravnborg /** 798b0c6e2fSSam Ravnborg * @disable: 808b0c6e2fSSam Ravnborg * 818b0c6e2fSSam Ravnborg * Disable panel (turn off back light, etc.). 828b0c6e2fSSam Ravnborg */ 838b0c6e2fSSam Ravnborg int (*disable)(struct drm_panel *panel); 848b0c6e2fSSam Ravnborg 858b0c6e2fSSam Ravnborg /** 868b0c6e2fSSam Ravnborg * @unprepare: 878b0c6e2fSSam Ravnborg * 888b0c6e2fSSam Ravnborg * Turn off panel. 898b0c6e2fSSam Ravnborg */ 908b0c6e2fSSam Ravnborg int (*unprepare)(struct drm_panel *panel); 918b0c6e2fSSam Ravnborg 928b0c6e2fSSam Ravnborg /** 938b0c6e2fSSam Ravnborg * @get_modes: 948b0c6e2fSSam Ravnborg * 958b0c6e2fSSam Ravnborg * Add modes to the connector that the panel is attached to and 968b0c6e2fSSam Ravnborg * return the number of modes added. 978b0c6e2fSSam Ravnborg */ 98aead40eaSThierry Reding int (*get_modes)(struct drm_panel *panel); 998b0c6e2fSSam Ravnborg 1008b0c6e2fSSam Ravnborg /** 1018b0c6e2fSSam Ravnborg * @get_timings: 1028b0c6e2fSSam Ravnborg * 1038b0c6e2fSSam Ravnborg * Copy display timings into the provided array and return 1048b0c6e2fSSam Ravnborg * the number of display timings available. 1058b0c6e2fSSam Ravnborg */ 1062938931fSPhilipp Zabel int (*get_timings)(struct drm_panel *panel, unsigned int num_timings, 1072938931fSPhilipp Zabel struct display_timing *timings); 108aead40eaSThierry Reding }; 109aead40eaSThierry Reding 11083127f67SThierry Reding /** 11183127f67SThierry Reding * struct drm_panel - DRM panel object 11283127f67SThierry Reding */ 113aead40eaSThierry Reding struct drm_panel { 1148b0c6e2fSSam Ravnborg /** 1158b0c6e2fSSam Ravnborg * @drm: 1168b0c6e2fSSam Ravnborg * 1178b0c6e2fSSam Ravnborg * DRM device owning the panel. 1188b0c6e2fSSam Ravnborg */ 119aead40eaSThierry Reding struct drm_device *drm; 1208b0c6e2fSSam Ravnborg 1218b0c6e2fSSam Ravnborg /** 1228b0c6e2fSSam Ravnborg * @connector: 1238b0c6e2fSSam Ravnborg * 1248b0c6e2fSSam Ravnborg * DRM connector that the panel is attached to. 1258b0c6e2fSSam Ravnborg */ 126aead40eaSThierry Reding struct drm_connector *connector; 1278b0c6e2fSSam Ravnborg 1288b0c6e2fSSam Ravnborg /** 1298b0c6e2fSSam Ravnborg * @dev: 1308b0c6e2fSSam Ravnborg * 1318b0c6e2fSSam Ravnborg * Parent device of the panel. 1328b0c6e2fSSam Ravnborg */ 133aead40eaSThierry Reding struct device *dev; 134aead40eaSThierry Reding 1358b0c6e2fSSam Ravnborg /** 1368b0c6e2fSSam Ravnborg * @funcs: 1378b0c6e2fSSam Ravnborg * 1388b0c6e2fSSam Ravnborg * Operations that can be performed on the panel. 1398b0c6e2fSSam Ravnborg */ 140aead40eaSThierry Reding const struct drm_panel_funcs *funcs; 141aead40eaSThierry Reding 1428b0c6e2fSSam Ravnborg /** 1439a2654c0SLaurent Pinchart * @connector_type: 1449a2654c0SLaurent Pinchart * 1459a2654c0SLaurent Pinchart * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to 1469a2654c0SLaurent Pinchart * initialise the drm_connector corresponding to the panel with the 1479a2654c0SLaurent Pinchart * correct connector type. 1489a2654c0SLaurent Pinchart */ 1499a2654c0SLaurent Pinchart int connector_type; 1509a2654c0SLaurent Pinchart 1519a2654c0SLaurent Pinchart /** 1528b0c6e2fSSam Ravnborg * @list: 1538b0c6e2fSSam Ravnborg * 1548b0c6e2fSSam Ravnborg * Panel entry in registry. 1558b0c6e2fSSam Ravnborg */ 156aead40eaSThierry Reding struct list_head list; 157aead40eaSThierry Reding }; 158aead40eaSThierry Reding 1596dbe0c4bSLaurent Pinchart void drm_panel_init(struct drm_panel *panel, struct device *dev, 1609a2654c0SLaurent Pinchart const struct drm_panel_funcs *funcs, 1619a2654c0SLaurent Pinchart int connector_type); 162aead40eaSThierry Reding 163aead40eaSThierry Reding int drm_panel_add(struct drm_panel *panel); 164aead40eaSThierry Reding void drm_panel_remove(struct drm_panel *panel); 165aead40eaSThierry Reding 166aead40eaSThierry Reding int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector); 167e0d409ffSSam Ravnborg void drm_panel_detach(struct drm_panel *panel); 168aead40eaSThierry Reding 1697a833d30SSam Ravnborg int drm_panel_prepare(struct drm_panel *panel); 1707a833d30SSam Ravnborg int drm_panel_unprepare(struct drm_panel *panel); 1717a833d30SSam Ravnborg 1727a833d30SSam Ravnborg int drm_panel_enable(struct drm_panel *panel); 1737a833d30SSam Ravnborg int drm_panel_disable(struct drm_panel *panel); 1747a833d30SSam Ravnborg 1757a833d30SSam Ravnborg int drm_panel_get_modes(struct drm_panel *panel); 1767a833d30SSam Ravnborg 177b61c8d5dSRob Herring #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) 178327bc443SLaurent Pinchart struct drm_panel *of_drm_find_panel(const struct device_node *np); 179aead40eaSThierry Reding #else 180327bc443SLaurent Pinchart static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) 181aead40eaSThierry Reding { 1825fa8e4a2SBoris Brezillon return ERR_PTR(-ENODEV); 183aead40eaSThierry Reding } 184aead40eaSThierry Reding #endif 185aead40eaSThierry Reding 186aead40eaSThierry Reding #endif 187