drm/drm_panel: no error when no callback
authorSam Ravnborg <sam@ravnborg.org>
Sat, 7 Dec 2019 14:03:29 +0000 (15:03 +0100)
committerSam Ravnborg <sam@ravnborg.org>
Mon, 9 Dec 2019 21:57:26 +0000 (22:57 +0100)
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
drivers/gpu/drm/drm_panel.c
include/drm/drm_panel.h

index ed7985c..4ab7229 100644 (file)
@@ -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);
 
@@ -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);
 
@@ -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);
 
@@ -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);
 
@@ -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);
 
index ce8da64..2bd1d80 100644 (file)
@@ -65,6 +65,8 @@ struct drm_panel_funcs {
         * @prepare:
         *
         * Turn on panel and perform set up.
+        *
+        * This function is optional.
         */
        int (*prepare)(struct drm_panel *panel);
 
@@ -72,6 +74,8 @@ struct drm_panel_funcs {
         * @enable:
         *
         * Enable panel (turn on back light, etc.).
+        *
+        * This function is optional.
         */
        int (*enable)(struct drm_panel *panel);
 
@@ -79,6 +83,8 @@ struct drm_panel_funcs {
         * @disable:
         *
         * Disable panel (turn off back light, etc.).
+        *
+        * This function is optional.
         */
        int (*disable)(struct drm_panel *panel);
 
@@ -86,14 +92,18 @@ struct drm_panel_funcs {
         * @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);
 
@@ -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);