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 c916f4b8907ef306fbaf801e92a0f3d851ec6c23..a63d6d238e3c85aed67b0daf472b5efd6e4761c8 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 f634371c717a856b2e66961a58df77a7bf5012ed..bee5066e9227171775273c2eb5e9ef7d9786432c 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 33605c3f0ebaa5c7934ec9a2c5bc79a1d99c5889..87825690579182a69878ff679acea16ffd9f0ebe 100644 (file)
@@ -165,6 +165,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:
         *