summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIcenowy Zheng <zhengxingda@iscas.ac.cn>2026-06-09 00:26:22 +0800
committerNeil Armstrong <neil.armstrong@linaro.org>2026-06-18 15:53:23 +0200
commit98b46e693b912eef0e6d497327489113845cbd15 (patch)
treed90a46c3e94cbc6f281ff7b2f74a91531eaedc21
parentae8dbbe8955d7470dd41e101b852fd1a70f62930 (diff)
drm/panel: himax-hx83121a: add backlight regulator supportdrm-misc-next-2026-06-19
The backlight, when managed by the panel controller, could be powered by an external regulator, and shutting down the regulator could power off the backlight. Add support for such a regulator. It's powered off when the backlight is 0 (either by setting brightness to 0 or setting bl_power), and powered on when the backlight should be operating. Signed-off-by: Icenowy Zheng <zhengxingda@iscas.ac.cn> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> Link: https://patch.msgid.link/20260608162622.403713-3-zhengxingda@iscas.ac.cn
-rw-r--r--drivers/gpu/drm/panel/panel-himax-hx83121a.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/gpu/drm/panel/panel-himax-hx83121a.c b/drivers/gpu/drm/panel/panel-himax-hx83121a.c
index 1a7e0125bced..e31e2fba0a78 100644
--- a/drivers/gpu/drm/panel/panel-himax-hx83121a.c
+++ b/drivers/gpu/drm/panel/panel-himax-hx83121a.c
@@ -34,7 +34,9 @@ struct himax {
struct drm_dsc_config dsc;
struct gpio_desc *reset_gpio;
struct regulator_bulk_data *supplies;
+ struct regulator *bl_supply;
struct backlight_device *backlight;
+ bool backlight_enabled;
};
struct panel_desc {
@@ -195,7 +197,27 @@ static int himax_bl_update_status(struct backlight_device *bl)
{
struct himax *ctx = bl_get_data(bl);
u16 brightness = backlight_get_brightness(bl);
+ int ret = 0;
+
+ if (!brightness) {
+ if (ctx->backlight_enabled)
+ ret = regulator_disable(ctx->bl_supply);
+ if (ret)
+ return ret;
+
+ ctx->backlight_enabled = false;
+
+ return 0;
+ }
+
/* TODO: brightness to raw map table */
+ if (!ctx->backlight_enabled)
+ ret = regulator_enable(ctx->bl_supply);
+ if (ret)
+ return ret;
+
+ ctx->backlight_enabled = true;
+
return mipi_dsi_dcs_set_display_brightness_large(to_primary_dsi(ctx),
brightness);
}
@@ -647,6 +669,10 @@ static int himax_probe(struct mipi_dsi_device *dsi)
ctx->panel.prepare_prev_first = true;
if (desc->has_dcs_backlight) {
+ ctx->bl_supply = devm_regulator_get_optional(dev, "bl");
+ if (IS_ERR(ctx->bl_supply))
+ return dev_err_probe(dev, PTR_ERR(ctx->bl_supply),
+ "Failed to get backlight supply\n");
ctx->backlight = himax_create_backlight(ctx);
if (IS_ERR(ctx->backlight))
return dev_err_probe(dev, PTR_ERR(ctx->backlight),