drm/panel: Add and initialise an orientation field to drm_panel
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Tue, 1 Feb 2022 12:20:20 +0000 (12:20 +0000)
committerPhil Elwell <8911409+pelwell@users.noreply.github.com>
Wed, 2 Feb 2022 13:24:58 +0000 (13:24 +0000)
Current usage of drm_connector_set_panel_orientation is from a panel's
get_modes call. However if the panel orientation property doesn't
exist on the connector at this point, then drm_mode_object triggers
WARNs as the connector is already registered.

Add an orientation variable to struct drm_panel and initialise it from
drm_panel_init.
panel_bridge_attach can then create the property before the connector
is registered.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/bridge/panel.c
drivers/gpu/drm/drm_panel.c
include/drm/drm_panel.h

index c916f4b..a63d6d2 100644 (file)
@@ -79,6 +79,10 @@ static int panel_bridge_attach(struct drm_bridge *bridge,
                return ret;
        }
 
+       /* set up connector's "panel orientation" property */
+       drm_connector_set_panel_orientation(&panel_bridge->connector,
+                                           panel_bridge->panel->orientation);
+
        drm_connector_attach_encoder(&panel_bridge->connector,
                                          bridge->encoder);
 
index f634371..bee5066 100644 (file)
@@ -61,6 +61,9 @@ void drm_panel_init(struct drm_panel *panel, struct device *dev,
        panel->dev = dev;
        panel->funcs = funcs;
        panel->connector_type = connector_type;
+
+       panel->orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
+       of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
 }
 EXPORT_SYMBOL(drm_panel_init);
 
@@ -289,16 +292,18 @@ int of_drm_get_panel_orientation(const struct device_node *np,
        if (ret < 0)
                return ret;
 
-       if (rotation == 0)
+       if (rotation == 0) {
                *orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL;
-       else if (rotation == 90)
+       } else if (rotation == 90) {
                *orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
-       else if (rotation == 180)
+       } else if (rotation == 180) {
                *orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
-       else if (rotation == 270)
+       } else if (rotation == 270) {
                *orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
-       else
+       } else {
+               DRM_ERROR("%pOF: invalid orientation %d\n", np, ret);
                return -EINVAL;
+       }
 
        return 0;
 }
index 33605c3..8782569 100644 (file)
@@ -166,6 +166,14 @@ struct drm_panel {
        int connector_type;
 
        /**
+        * @orientation:
+        *
+        * Panel orientation at initialisation. This is used to initialise the
+        * drm_connector property for panel orientation.
+        */
+       enum drm_panel_orientation orientation;
+
+       /**
         * @list:
         *
         * Panel entry in registry.