![Álvaro Fernández Rojas](/assets/img/avatar_default.png)
Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
113 lines
3.4 KiB
Diff
113 lines
3.4 KiB
Diff
From ab0dac9b018f82dfb5696e9671734178d226872f Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
|
Date: Sun, 27 Feb 2022 13:47:11 +0100
|
|
Subject: [PATCH] drm/modes: Add of_get_drm_panel_display_mode()
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
commit 95ae342 upstream.
|
|
|
|
Add a function to get a drm_display_mode from a panel-timing
|
|
device tree subnode.
|
|
|
|
Suggested-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20220227124713.39766-4-noralf@tronnes.org
|
|
---
|
|
drivers/gpu/drm/drm_modes.c | 49 +++++++++++++++++++++++++++++++++++++
|
|
include/drm/drm_modes.h | 8 ++++++
|
|
2 files changed, 57 insertions(+)
|
|
|
|
--- a/drivers/gpu/drm/drm_modes.c
|
|
+++ b/drivers/gpu/drm/drm_modes.c
|
|
@@ -35,6 +35,7 @@
|
|
#include <linux/list_sort.h>
|
|
#include <linux/export.h>
|
|
|
|
+#include <video/of_display_timing.h>
|
|
#include <video/of_videomode.h>
|
|
#include <video/videomode.h>
|
|
|
|
@@ -727,6 +728,54 @@ int of_get_drm_display_mode(struct devic
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(of_get_drm_display_mode);
|
|
+
|
|
+/**
|
|
+ * of_get_drm_panel_display_mode - get a panel-timing drm_display_mode from devicetree
|
|
+ * @np: device_node with the panel-timing specification
|
|
+ * @dmode: will be set to the return value
|
|
+ * @bus_flags: information about pixelclk, sync and DE polarity
|
|
+ *
|
|
+ * The Device Tree properties width-mm and height-mm will be read and set on
|
|
+ * the display mode if they are present.
|
|
+ *
|
|
+ * Returns:
|
|
+ * Zero on success, negative error code on failure.
|
|
+ */
|
|
+int of_get_drm_panel_display_mode(struct device_node *np,
|
|
+ struct drm_display_mode *dmode, u32 *bus_flags)
|
|
+{
|
|
+ u32 width_mm = 0, height_mm = 0;
|
|
+ struct display_timing timing;
|
|
+ struct videomode vm;
|
|
+ int ret;
|
|
+
|
|
+ ret = of_get_display_timing(np, "panel-timing", &timing);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ videomode_from_timing(&timing, &vm);
|
|
+
|
|
+ memset(dmode, 0, sizeof(*dmode));
|
|
+ drm_display_mode_from_videomode(&vm, dmode);
|
|
+ if (bus_flags)
|
|
+ drm_bus_flags_from_videomode(&vm, bus_flags);
|
|
+
|
|
+ ret = of_property_read_u32(np, "width-mm", &width_mm);
|
|
+ if (ret && ret != -EINVAL)
|
|
+ return ret;
|
|
+
|
|
+ ret = of_property_read_u32(np, "height-mm", &height_mm);
|
|
+ if (ret && ret != -EINVAL)
|
|
+ return ret;
|
|
+
|
|
+ dmode->width_mm = width_mm;
|
|
+ dmode->height_mm = height_mm;
|
|
+
|
|
+ drm_mode_debug_printmodeline(dmode);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(of_get_drm_panel_display_mode);
|
|
#endif /* CONFIG_OF */
|
|
#endif /* CONFIG_VIDEOMODE_HELPERS */
|
|
|
|
--- a/include/drm/drm_modes.h
|
|
+++ b/include/drm/drm_modes.h
|
|
@@ -466,6 +466,8 @@ void drm_bus_flags_from_videomode(const
|
|
int of_get_drm_display_mode(struct device_node *np,
|
|
struct drm_display_mode *dmode, u32 *bus_flags,
|
|
int index);
|
|
+int of_get_drm_panel_display_mode(struct device_node *np,
|
|
+ struct drm_display_mode *dmode, u32 *bus_flags);
|
|
#else
|
|
static inline int of_get_drm_display_mode(struct device_node *np,
|
|
struct drm_display_mode *dmode,
|
|
@@ -473,6 +475,12 @@ static inline int of_get_drm_display_mod
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
+
|
|
+static inline int of_get_drm_panel_display_mode(struct device_node *np,
|
|
+ struct drm_display_mode *dmode, u32 *bus_flags)
|
|
+{
|
|
+ return -EINVAL;
|
|
+}
|
|
#endif
|
|
|
|
void drm_mode_set_name(struct drm_display_mode *mode);
|