aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0688-drm-panel-Add-and-initialise-an-orientation-field-to.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0688-drm-panel-Add-and-initialise-an-orientation-field-to.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0688-drm-panel-Add-and-initialise-an-orientation-field-to.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0688-drm-panel-Add-and-initialise-an-orientation-field-to.patch b/target/linux/bcm27xx/patches-5.15/950-0688-drm-panel-Add-and-initialise-an-orientation-field-to.patch
new file mode 100644
index 0000000000..f87fc339bd
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0688-drm-panel-Add-and-initialise-an-orientation-field-to.patch
@@ -0,0 +1,89 @@
+From a2ce322776832848b320ece1aa7e3485bfe4b5f3 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Tue, 1 Feb 2022 12:20:20 +0000
+Subject: [PATCH] drm/panel: Add and initialise an orientation field to
+ drm_panel
+
+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 | 4 ++++
+ drivers/gpu/drm/drm_panel.c | 15 ++++++++++-----
+ include/drm/drm_panel.h | 8 ++++++++
+ 3 files changed, 22 insertions(+), 5 deletions(-)
+
+--- a/drivers/gpu/drm/bridge/panel.c
++++ b/drivers/gpu/drm/bridge/panel.c
+@@ -79,6 +79,10 @@ static int panel_bridge_attach(struct dr
+ 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);
+
+--- a/drivers/gpu/drm/drm_panel.c
++++ b/drivers/gpu/drm/drm_panel.c
+@@ -61,6 +61,9 @@ void drm_panel_init(struct drm_panel *pa
+ 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 s
+ 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;
+ }
+--- a/include/drm/drm_panel.h
++++ b/include/drm/drm_panel.h
+@@ -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.