lede/target/linux/silicon/patches-5.19/0058-drm-simpledrm-Add-backlight-support.patch

84 lines
2.6 KiB
Diff

From 33d1d04ba47ab79e38400038347b1ef04aca10fc Mon Sep 17 00:00:00 2001
From: Hector Martin <marcan@marcan.st>
Date: Fri, 4 Mar 2022 19:19:38 +0900
Subject: [PATCH 058/171] drm/simpledrm: Add backlight support
Allows devicetrees to link the simplefb node to a backlight device,
and toggles power to the backlight when the display pipe is
enabled/disabled. This is sufficient for basic DPMS style functionality
in trivial devices.
Signed-off-by: Hector Martin <marcan@marcan.st>
---
drivers/gpu/drm/tiny/Kconfig | 1 +
drivers/gpu/drm/tiny/simpledrm.c | 14 ++++++++++++++
2 files changed, 15 insertions(+)
diff --git a/drivers/gpu/drm/tiny/Kconfig b/drivers/gpu/drm/tiny/Kconfig
index 627d637a1e7e..20c78bb1365d 100644
--- a/drivers/gpu/drm/tiny/Kconfig
+++ b/drivers/gpu/drm/tiny/Kconfig
@@ -71,6 +71,7 @@ config DRM_SIMPLEDRM
depends on DRM && MMU
select DRM_GEM_SHMEM_HELPER
select DRM_KMS_HELPER
+ select BACKLIGHT_CLASS_DEVICE
help
DRM driver for simple platform-provided framebuffers.
diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
index 5422363690e7..40de01efbbd9 100644
--- a/drivers/gpu/drm/tiny/simpledrm.c
+++ b/drivers/gpu/drm/tiny/simpledrm.c
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
+#include <linux/backlight.h>
#include <linux/clk.h>
#include <linux/of_clk.h>
#include <linux/minmax.h>
@@ -225,6 +226,9 @@ struct simpledrm_device {
size_t nformats;
struct drm_connector connector;
struct drm_simple_display_pipe pipe;
+
+ /* backlight */
+ struct backlight_device *backlight;
};
static struct simpledrm_device *simpledrm_device_of_dev(struct drm_device *dev)
@@ -673,6 +677,9 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
+ if (sdev->backlight)
+ backlight_enable(sdev->backlight);
+
drm_dev_exit(idx);
}
@@ -686,6 +693,9 @@ simpledrm_simple_display_pipe_disable(struct drm_simple_display_pipe *pipe)
if (!drm_dev_enter(dev, &idx))
return;
+ if (sdev->backlight)
+ backlight_disable(sdev->backlight);
+
/* Clear screen to black if disabled */
memset_io(sdev->screen_base, 0, sdev->pitch * sdev->mode.vdisplay);
@@ -845,6 +855,10 @@ simpledrm_device_create(struct drm_driver *drv, struct platform_device *pdev)
sdev->pdev = pdev;
platform_set_drvdata(pdev, sdev);
+ sdev->backlight = devm_of_find_backlight(&pdev->dev);
+ if (IS_ERR(sdev->backlight))
+ sdev->backlight = NULL;
+
ret = simpledrm_device_init_clocks(sdev);
if (ret)
return ERR_PTR(ret);
--
2.34.1