2022-05-16 21:40:32 +00:00
|
|
|
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
|
2022-08-22 12:02:36 +00:00
|
|
|
@@ -80,6 +80,10 @@ static int panel_bridge_attach(struct dr
|
2022-05-16 21:40:32 +00:00
|
|
|
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.
|