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 /** 1438b0c6e2fSSam Ravnborg * @list: 1448b0c6e2fSSam Ravnborg * 1458b0c6e2fSSam Ravnborg * Panel entry in registry. 1468b0c6e2fSSam Ravnborg */ 147aead40eaSThierry Reding struct list_head list; 148aead40eaSThierry Reding }; 149aead40eaSThierry Reding 150aead40eaSThierry Reding void drm_panel_init(struct drm_panel *panel); 151aead40eaSThierry Reding 152aead40eaSThierry Reding int drm_panel_add(struct drm_panel *panel); 153aead40eaSThierry Reding void drm_panel_remove(struct drm_panel *panel); 154aead40eaSThierry Reding 155aead40eaSThierry Reding int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector); 156e0d409ffSSam Ravnborg void drm_panel_detach(struct drm_panel *panel); 157aead40eaSThierry Reding 1587a833d30SSam Ravnborg int drm_panel_prepare(struct drm_panel *panel); 1597a833d30SSam Ravnborg int drm_panel_unprepare(struct drm_panel *panel); 1607a833d30SSam Ravnborg 1617a833d30SSam Ravnborg int drm_panel_enable(struct drm_panel *panel); 1627a833d30SSam Ravnborg int drm_panel_disable(struct drm_panel *panel); 1637a833d30SSam Ravnborg 1647a833d30SSam Ravnborg int drm_panel_get_modes(struct drm_panel *panel); 1657a833d30SSam Ravnborg 166b61c8d5dSRob Herring #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) 167327bc443SLaurent Pinchart struct drm_panel *of_drm_find_panel(const struct device_node *np); 168aead40eaSThierry Reding #else 169327bc443SLaurent Pinchart static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) 170aead40eaSThierry Reding { 1715fa8e4a2SBoris Brezillon return ERR_PTR(-ENODEV); 172aead40eaSThierry Reding } 173aead40eaSThierry Reding #endif 174aead40eaSThierry Reding 175aead40eaSThierry Reding #endif 176