diff options
| author | Icenowy Zheng <zhengxingda@iscas.ac.cn> | 2026-06-09 00:26:22 +0800 |
|---|---|---|
| committer | Neil Armstrong <neil.armstrong@linaro.org> | 2026-06-18 15:53:23 +0200 |
| commit | 98b46e693b912eef0e6d497327489113845cbd15 (patch) | |
| tree | d90a46c3e94cbc6f281ff7b2f74a91531eaedc21 | |
| parent | ae8dbbe8955d7470dd41e101b852fd1a70f62930 (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.c | 26 |
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), |
