2013-08-30 15:36:43 +04:00
/*
* 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__
2019-07-18 19:14:57 +03:00
# include <linux/err.h>
2017-04-24 07:50:19 +03:00
# include <linux/errno.h>
2013-08-30 15:36:43 +04:00
# include <linux/list.h>
2017-04-24 07:50:19 +03:00
struct device_node ;
2013-08-30 15:36:43 +04:00
struct drm_connector ;
struct drm_device ;
struct drm_panel ;
2014-12-11 20:32:44 +03:00
struct display_timing ;
2013-08-30 15:36:43 +04:00
2014-07-18 00:43:48 +04:00
/**
* struct drm_panel_funcs - perform operations on a given panel
*
* 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 .
*/
2013-08-30 15:36:43 +04:00
struct drm_panel_funcs {
2019-08-04 23:16:33 +03:00
/**
* @ prepare :
*
* Turn on panel and perform set up .
*/
2014-07-18 00:43:48 +04:00
int ( * prepare ) ( struct drm_panel * panel ) ;
2019-08-04 23:16:33 +03:00
/**
* @ enable :
*
* Enable panel ( turn on back light , etc . ) .
*/
2013-08-30 15:36:43 +04:00
int ( * enable ) ( struct drm_panel * panel ) ;
2019-08-04 23:16:33 +03:00
/**
* @ disable :
*
* Disable panel ( turn off back light , etc . ) .
*/
int ( * disable ) ( struct drm_panel * panel ) ;
/**
* @ unprepare :
*
* Turn off panel .
*/
int ( * unprepare ) ( struct drm_panel * panel ) ;
/**
* @ get_modes :
*
* Add modes to the connector that the panel is attached to and
* return the number of modes added .
*/
2013-08-30 15:36:43 +04:00
int ( * get_modes ) ( struct drm_panel * panel ) ;
2019-08-04 23:16:33 +03:00
/**
* @ get_timings :
*
* Copy display timings into the provided array and return
* the number of display timings available .
*/
2014-12-11 20:32:44 +03:00
int ( * get_timings ) ( struct drm_panel * panel , unsigned int num_timings ,
struct display_timing * timings ) ;
2013-08-30 15:36:43 +04:00
} ;
2016-05-06 17:01:37 +03:00
/**
* struct drm_panel - DRM panel object
*/
2013-08-30 15:36:43 +04:00
struct drm_panel {
2019-08-04 23:16:33 +03:00
/**
* @ drm :
*
* DRM device owning the panel .
*/
2013-08-30 15:36:43 +04:00
struct drm_device * drm ;
2019-08-04 23:16:33 +03:00
/**
* @ connector :
*
* DRM connector that the panel is attached to .
*/
2013-08-30 15:36:43 +04:00
struct drm_connector * connector ;
2019-08-04 23:16:33 +03:00
/**
* @ dev :
*
* Parent device of the panel .
*/
2013-08-30 15:36:43 +04:00
struct device * dev ;
2019-08-04 23:16:33 +03:00
/**
* @ funcs :
*
* Operations that can be performed on the panel .
*/
2013-08-30 15:36:43 +04:00
const struct drm_panel_funcs * funcs ;
2019-09-04 16:28:03 +03:00
/**
* @ 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 ;
2019-08-04 23:16:33 +03:00
/**
* @ list :
*
* Panel entry in registry .
*/
2013-08-30 15:36:43 +04:00
struct list_head list ;
} ;
2019-08-23 22:32:43 +03:00
void drm_panel_init ( struct drm_panel * panel , struct device * dev ,
2019-09-04 16:28:03 +03:00
const struct drm_panel_funcs * funcs ,
int connector_type ) ;
2013-08-30 15:36:43 +04:00
int drm_panel_add ( struct drm_panel * panel ) ;
void drm_panel_remove ( struct drm_panel * panel ) ;
int drm_panel_attach ( struct drm_panel * panel , struct drm_connector * connector ) ;
2019-08-04 23:16:34 +03:00
void drm_panel_detach ( struct drm_panel * panel ) ;
2013-08-30 15:36:43 +04:00
2019-08-04 23:16:32 +03:00
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 ) ;
int drm_panel_get_modes ( struct drm_panel * panel ) ;
2017-03-22 16:26:04 +03:00
# if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL)
2016-11-19 06:28:05 +03:00
struct drm_panel * of_drm_find_panel ( const struct device_node * np ) ;
2013-08-30 15:36:43 +04:00
# else
2016-11-19 06:28:05 +03:00
static inline struct drm_panel * of_drm_find_panel ( const struct device_node * np )
2013-08-30 15:36:43 +04:00
{
2018-05-09 16:00:39 +03:00
return ERR_PTR ( - ENODEV ) ;
2013-08-30 15:36:43 +04:00
}
# endif
# endif