171 lines
7.3 KiB
Diff
171 lines
7.3 KiB
Diff
From b76306d4adb2e169f8425fb417de565d555fcf22 Mon Sep 17 00:00:00 2001
|
|
From: Derek Basehore <dbasehore@chromium.org>
|
|
Date: Sun, 5 Jan 2020 16:51:19 +0100
|
|
Subject: [PATCH 2/4] drm/connector: Split out orientation quirk detection (v2)
|
|
|
|
Not every platform needs quirk detection for panel orientation, so
|
|
split the drm_connector_init_panel_orientation_property into two
|
|
functions. One for platforms without the need for quirks, and the
|
|
other for platforms that need quirks.
|
|
|
|
Hans de Goede (changes in v2):
|
|
|
|
Rename the function from drm_connector_init_panel_orientation_property
|
|
to drm_connector_set_panel_orientation[_with_quirk] and pass in the
|
|
panel-orientation to set.
|
|
|
|
Beside the rename, also make the function set the passed in value
|
|
only once, if the value was set before (to a value other then
|
|
DRM_MODE_PANEL_ORIENTATION_UNKNOWN) make any further set calls a no-op.
|
|
|
|
This change is preparation for allowing the user to override the
|
|
panel-orientation for any connector from the kernel commandline.
|
|
When the panel-orientation is overridden this way, then we must ignore
|
|
the panel-orientation detection done by the driver.
|
|
|
|
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
|
|
Signed-off-by: Derek Basehore <dbasehore@chromium.org>
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
Acked-by: Jani Nikula <jani.nikula@intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200105155120.96466-1-hdegoede@redhat.com
|
|
---
|
|
drivers/gpu/drm/drm_connector.c | 74 ++++++++++++++++++++++++---------
|
|
include/drm/drm_connector.h | 9 +++-
|
|
2 files changed, 61 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
|
|
index 8a2a1965e..77a2087bf 100644
|
|
--- a/drivers/gpu/drm/drm_connector.c
|
|
+++ b/drivers/gpu/drm/drm_connector.c
|
|
@@ -996,7 +996,8 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
|
|
* coordinates, so if userspace rotates the picture to adjust for
|
|
* the orientation it must also apply the same transformation to the
|
|
* touchscreen input coordinates. This property is initialized by calling
|
|
- * drm_connector_init_panel_orientation_property().
|
|
+ * drm_connector_set_panel_orientation() or
|
|
+ * drm_connector_set_panel_orientation_with_quirk()
|
|
*
|
|
* scaling mode:
|
|
* This property defines how a non-native mode is upscaled to the native
|
|
@@ -1713,38 +1714,41 @@ void drm_connector_set_link_status_property(struct drm_connector *connector,
|
|
EXPORT_SYMBOL(drm_connector_set_link_status_property);
|
|
|
|
/**
|
|
- * drm_connector_init_panel_orientation_property -
|
|
- * initialize the connecters panel_orientation property
|
|
- * @connector: connector for which to init the panel-orientation property.
|
|
- * @width: width in pixels of the panel, used for panel quirk detection
|
|
- * @height: height in pixels of the panel, used for panel quirk detection
|
|
+ * drm_connector_set_panel_orientation - sets the connecter's panel_orientation
|
|
+ * @connector: connector for which to set the panel-orientation property.
|
|
+ * @panel_orientation: drm_panel_orientation value to set
|
|
+ *
|
|
+ * This function sets the connector's panel_orientation and attaches
|
|
+ * a "panel orientation" property to the connector.
|
|
*
|
|
- * This function should only be called for built-in panels, after setting
|
|
- * connector->display_info.panel_orientation first (if known).
|
|
+ * Calling this function on a connector where the panel_orientation has
|
|
+ * already been set is a no-op (e.g. the orientation has been overridden with
|
|
+ * a kernel commandline option).
|
|
*
|
|
- * This function will check for platform specific (e.g. DMI based) quirks
|
|
- * overriding display_info.panel_orientation first, then if panel_orientation
|
|
- * is not DRM_MODE_PANEL_ORIENTATION_UNKNOWN it will attach the
|
|
- * "panel orientation" property to the connector.
|
|
+ * It is allowed to call this function with a panel_orientation of
|
|
+ * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op.
|
|
*
|
|
* Returns:
|
|
* Zero on success, negative errno on failure.
|
|
*/
|
|
-int drm_connector_init_panel_orientation_property(
|
|
- struct drm_connector *connector, int width, int height)
|
|
+int drm_connector_set_panel_orientation(
|
|
+ struct drm_connector *connector,
|
|
+ enum drm_panel_orientation panel_orientation)
|
|
{
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_display_info *info = &connector->display_info;
|
|
struct drm_property *prop;
|
|
- int orientation_quirk;
|
|
|
|
- orientation_quirk = drm_get_panel_orientation_quirk(width, height);
|
|
- if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
- info->panel_orientation = orientation_quirk;
|
|
+ /* Already set? */
|
|
+ if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
+ return 0;
|
|
|
|
- if (info->panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
+ /* Don't attach the property if the orientation is unknown */
|
|
+ if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
return 0;
|
|
|
|
+ info->panel_orientation = panel_orientation;
|
|
+
|
|
prop = dev->mode_config.panel_orientation_property;
|
|
if (!prop) {
|
|
prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
|
|
@@ -1761,7 +1765,37 @@ int drm_connector_init_panel_orientation_property(
|
|
info->panel_orientation);
|
|
return 0;
|
|
}
|
|
-EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
|
|
+EXPORT_SYMBOL(drm_connector_set_panel_orientation);
|
|
+
|
|
+/**
|
|
+ * drm_connector_set_panel_orientation_with_quirk -
|
|
+ * set the connecter's panel_orientation after checking for quirks
|
|
+ * @connector: connector for which to init the panel-orientation property.
|
|
+ * @panel_orientation: drm_panel_orientation value to set
|
|
+ * @width: width in pixels of the panel, used for panel quirk detection
|
|
+ * @height: height in pixels of the panel, used for panel quirk detection
|
|
+ *
|
|
+ * Like drm_connector_set_panel_orientation(), but with a check for platform
|
|
+ * specific (e.g. DMI based) quirks overriding the passed in panel_orientation.
|
|
+ *
|
|
+ * Returns:
|
|
+ * Zero on success, negative errno on failure.
|
|
+ */
|
|
+int drm_connector_set_panel_orientation_with_quirk(
|
|
+ struct drm_connector *connector,
|
|
+ enum drm_panel_orientation panel_orientation,
|
|
+ int width, int height)
|
|
+{
|
|
+ int orientation_quirk;
|
|
+
|
|
+ orientation_quirk = drm_get_panel_orientation_quirk(width, height);
|
|
+ if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
+ panel_orientation = orientation_quirk;
|
|
+
|
|
+ return drm_connector_set_panel_orientation(connector,
|
|
+ panel_orientation);
|
|
+}
|
|
+EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
|
|
|
|
int drm_connector_set_obj_prop(struct drm_mode_object *obj,
|
|
struct drm_property *property,
|
|
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
|
|
index 1d81bb31f..44b6c7f85 100644
|
|
--- a/include/drm/drm_connector.h
|
|
+++ b/include/drm/drm_connector.h
|
|
@@ -1473,8 +1473,13 @@ int drm_connector_update_edid_property(struct drm_connector *connector,
|
|
const struct edid *edid);
|
|
void drm_connector_set_link_status_property(struct drm_connector *connector,
|
|
uint64_t link_status);
|
|
-int drm_connector_init_panel_orientation_property(
|
|
- struct drm_connector *connector, int width, int height);
|
|
+int drm_connector_set_panel_orientation(
|
|
+ struct drm_connector *connector,
|
|
+ enum drm_panel_orientation panel_orientation);
|
|
+int drm_connector_set_panel_orientation_with_quirk(
|
|
+ struct drm_connector *connector,
|
|
+ enum drm_panel_orientation panel_orientation,
|
|
+ int width, int height);
|
|
|
|
/**
|
|
* struct drm_tile_group - Tile group metadata
|
|
--
|
|
2.34.1
|
|
|