Skip to content

Commit

Permalink
drm/drm_panel: no error when no callback
Browse files Browse the repository at this point in the history
The callbacks in drm_panel_funcs are optional, so do not
return an error just because no callback is assigned.

v2:
- Document what functions in drm_panel_funcs are optional (Laurent)
- Return -EOPNOTSUPP if get_modes() is not assigned (Laurent)
  (Sam: -EOPNOTSUPP seems to best error code in this situation)

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20191207140353.23967-2-sam@ravnborg.org
  • Loading branch information
sravnborg committed Dec 9, 2019
1 parent 4286dc0 commit 5dce87a
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 12 deletions.
35 changes: 25 additions & 10 deletions drivers/gpu/drm/drm_panel.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,13 @@ EXPORT_SYMBOL(drm_panel_detach);
*/
int drm_panel_prepare(struct drm_panel *panel)
{
if (panel && panel->funcs && panel->funcs->prepare)
if (!panel)
return -EINVAL;

if (panel->funcs && panel->funcs->prepare)
return panel->funcs->prepare(panel);

return panel ? -ENOSYS : -EINVAL;
return 0;
}
EXPORT_SYMBOL(drm_panel_prepare);

Expand All @@ -171,10 +174,13 @@ EXPORT_SYMBOL(drm_panel_prepare);
*/
int drm_panel_unprepare(struct drm_panel *panel)
{
if (panel && panel->funcs && panel->funcs->unprepare)
if (!panel)
return -EINVAL;

if (panel->funcs && panel->funcs->unprepare)
return panel->funcs->unprepare(panel);

return panel ? -ENOSYS : -EINVAL;
return 0;
}
EXPORT_SYMBOL(drm_panel_unprepare);

Expand All @@ -190,10 +196,13 @@ EXPORT_SYMBOL(drm_panel_unprepare);
*/
int drm_panel_enable(struct drm_panel *panel)
{
if (panel && panel->funcs && panel->funcs->enable)
if (!panel)
return -EINVAL;

if (panel->funcs && panel->funcs->enable)
return panel->funcs->enable(panel);

return panel ? -ENOSYS : -EINVAL;
return 0;
}
EXPORT_SYMBOL(drm_panel_enable);

Expand All @@ -209,10 +218,13 @@ EXPORT_SYMBOL(drm_panel_enable);
*/
int drm_panel_disable(struct drm_panel *panel)
{
if (panel && panel->funcs && panel->funcs->disable)
if (!panel)
return -EINVAL;

if (panel->funcs && panel->funcs->disable)
return panel->funcs->disable(panel);

return panel ? -ENOSYS : -EINVAL;
return 0;
}
EXPORT_SYMBOL(drm_panel_disable);

Expand All @@ -228,10 +240,13 @@ EXPORT_SYMBOL(drm_panel_disable);
*/
int drm_panel_get_modes(struct drm_panel *panel)
{
if (panel && panel->funcs && panel->funcs->get_modes)
if (!panel)
return -EINVAL;

if (panel->funcs && panel->funcs->get_modes)
return panel->funcs->get_modes(panel);

return panel ? -ENOSYS : -EINVAL;
return -EOPNOTSUPP;
}
EXPORT_SYMBOL(drm_panel_get_modes);

Expand Down
16 changes: 14 additions & 2 deletions include/drm/drm_panel.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,35 +65,45 @@ struct drm_panel_funcs {
* @prepare:
*
* Turn on panel and perform set up.
*
* This function is optional.
*/
int (*prepare)(struct drm_panel *panel);

/**
* @enable:
*
* Enable panel (turn on back light, etc.).
*
* This function is optional.
*/
int (*enable)(struct drm_panel *panel);

/**
* @disable:
*
* Disable panel (turn off back light, etc.).
*
* This function is optional.
*/
int (*disable)(struct drm_panel *panel);

/**
* @unprepare:
*
* Turn off panel.
*
* This function is optional.
*/
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.
* Add modes to the connector that the panel is attached to
* and returns the number of modes added.
*
* This function is mandatory.
*/
int (*get_modes)(struct drm_panel *panel);

Expand All @@ -102,6 +112,8 @@ struct drm_panel_funcs {
*
* Copy display timings into the provided array and return
* the number of display timings available.
*
* This function is optional.
*/
int (*get_timings)(struct drm_panel *panel, unsigned int num_timings,
struct display_timing *timings);
Expand Down

0 comments on commit 5dce87a

Please sign in to comment.