* [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel
@ 2026-06-04 6:49 Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 01/11] clk: imx8mp: add 700 MHz rate entry for VIDEO_PLL1 Johannes Schneider
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:49 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle, Johannes Schneider
v1: https://lists.infradead.org/pipermail/barebox/2026-June/056588.html
This is v2 of the i.MX8MP boot-splash series. Review on v1 pointed out
that barebox already has in-tree drivers covering work v1 was
duplicating, plus several detail issues; v2 replaces the two new
drivers with extensions to the existing ones and addresses the
remaining review feedback.
Changes since v1:
* Drop drivers/video/imx-lcdif.c (Michael). drivers/video/lcdif_drv.c
already matches "fsl,imx8mp-lcdif" and "fsl,imx93-lcdif" but had
only been exercised on i.MX93. Three latent issues kept it unusable
on i.MX8MP; v2 extends it instead of duplicating:
- Kconfig depends-on widened to ARCH_IMX8MP. The symbol was
silently forced to n on i.MX8MP defconfigs even though the help
text and the driver's of_match cover i.MX8MP.
- clk_prepare_enable() AXI/disp_axi/pix at atomic_enable. Linux
runtime PM handles that via genpd; barebox has none, so the
controller's MMIO writes silently no-op'd and frames never
ticked.
- VPL_GET_BUS_FORMAT abort no longer kills the enable path when
the downstream panel doesn't carry a "bus-format" property
(typical of panel-lvds DTs). Default to RGB888_1X24 with a
dev_warn instead.
* Drop drivers/video/panel-lvds.c (Ahmad). drivers/video/simple-panel.c
already parses display-timings, enable-gpios and a backlight phandle
from DT -- exactly what a Linux panel-lvds node provides. v2 makes
three small extensions:
- Match "panel-lvds" in the of_id table.
- Read modes from a "panel-timing" subnode as a fallback to the
"display-timings" container (panel-lvds uses the singular form).
- Switch power-supply to regulator_get_optional() so panels
without "power-supply" bind.
* Move the LCDIF write-combine drain from a dsb() to a readback of the
WC region in fb_damage (Lucas). dsb() doesn't actually drain WC;
a load from the WC region does.
* pmdomain: keep the ADB handshake propagation before the upstream
clock enable in imx8mp_blk_ctrl_power_on; v1's refactor accidentally
moved it after. Route the HSIO-specific call through a new
pre_power_on hook in struct imx8mp_blk_ctrl_data so the generic path
remains HSIO-agnostic (Ahmad).
* backlight-pwm: switch the power-supply lookup to
regulator_get_optional() so a missing power-supply property surfaces
as -ENODEV (the IS_ERR check never caught the NULL return),
drop the now-redundant NULL guards around regulator_enable/_disable,
use dev_errp_probe() for the PWM lookup, and add a Fixes: tag for
the bogus "enable-gpios" gpiod descriptor name (gpiod_get_optional()
appends -gpios itself) (Ahmad).
* Pick up Ahmad's Reviewed-by on the 700 MHz VIDEO_PLL1 rate entry.
* New patch: clk: imx8mp: add 1039.5 MHz and 519.75 MHz VIDEO_PLL1
rate entries. arch/arm64/boot/dts/freescale/imx8mp.dtsi pins
VIDEO_PLL1 to 1039.5 MHz via media_blk_ctrl's assigned-clock-rates
(the right value for 1080p60 LVDS), but the rate was missing from
barebox's PLL14xx table. Without it, media_blk_ctrl probe fails
-EINVAL and breaks the clock tree below LCDIF2 before lcdif2's own
assigned-clock-rates can rebind it. Values taken from Linux's
imx_pll1443x_tbl.
* Split out three smaller stand-alone changes v1 had bundled with the
new driver:
- lcdif: 128B AXI bursts (avoids a right-edge gap on panels whose
stride isn't a multiple of 256 bytes -- e.g. 800px at XRGB8888).
- lcdif: register a simplefb fixup and call fb_enable() at probe,
so a splash command can blit straight into a live framebuffer
and Linux's DRM_SIMPLEDRM inherits the boot fb.
- simple-panel: lazily resolve the backlight phandle without
failing the panel-enable chain when the backlight hasn't probed
yet.
Tested on i.MX8MP with a single-link LVDS 800x480@60Hz panel: boot
splash renders, Linux DRM_SIMPLEDRM inherits the framebuffer via the
simplefb DT fixup.
Assisted-by: Claude:claude-opus-4-7
Johannes Schneider (5):
clk: imx8mp: add 1039.5 MHz and 519.75 MHz rate entries for VIDEO_PLL1
video: lcdif: make functional on i.MX8MP
video: lcdif: default to RGB888_1X24 on VPL_GET_BUS_FORMAT failure
video: simple-panel: support panel-lvds DT bindings
video: simple-panel: lazily resolve backlight without failing
Thomas Haemmerle (6):
clk: imx8mp: add 700 MHz rate entry for VIDEO_PLL1
pmdomain: imx8mp-blk-ctrl: add media blk-ctrl power domain support
video: backlight-pwm: make power-supply and enable-gpio optional
video: lcdif: use 128B AXI bursts to avoid right-edge gap
video: lcdif: register simplefb fixup and enable framebuffer at probe
video: lcdif: drain write-combine framebuffer in fb_damage
drivers/clk/imx/clk-pll14xx.c | 3 +
drivers/pmdomain/imx/imx8mp-blk-ctrl.c | 91 ++++++++++++++++++++++++--
drivers/video/Kconfig | 4 +-
drivers/video/backlight-pwm.c | 16 ++---
drivers/video/backlight.c | 2 +-
drivers/video/fsl-ldb.c | 2 +-
drivers/video/lcdif_kms.c | 47 +++++++++----
drivers/video/simple-panel.c | 31 ++++++---
8 files changed, 155 insertions(+), 41 deletions(-)
base-commit: 651343da8af78d134d7ead4d2b36095d7ddc2d8f
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 01/11] clk: imx8mp: add 700 MHz rate entry for VIDEO_PLL1
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
@ 2026-06-04 6:49 ` Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 02/11] clk: imx8mp: add 1039.5 MHz and 519.75 MHz rate entries " Johannes Schneider
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:49 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle
From: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
LVDS link_freq = pixel_clock * 7. For a 25 MHz pixel clock that's
175 MHz, requiring VIDEO_PLL1 at 700 MHz so the /4 divider yields an
exact match. Without the table entry, clk_set_rate() rounds down to
650 MHz (giving 162.5 MHz) and the LVDS transmitter outputs ~743
pixels per 800-pixel line.
PLL parameters: Fin=24 MHz, P=3, S=2, K=0 -> 24 * 350 / (3 * 4) = 700 MHz.
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
---
drivers/clk/imx/clk-pll14xx.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c
index 6716a6f555..db7e744e87 100644
--- a/drivers/clk/imx/clk-pll14xx.c
+++ b/drivers/clk/imx/clk-pll14xx.c
@@ -61,6 +61,7 @@ static const struct imx_pll14xx_rate_table imx_pll1416x_tbl[] = {
};
static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = {
+ PLL_1443X_RATE(700000000U, 350, 3, 2, 0),
PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
PLL_1443X_RATE(594000000U, 198, 2, 2, 0),
PLL_1443X_RATE(393216000U, 262, 2, 3, 9437),
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 02/11] clk: imx8mp: add 1039.5 MHz and 519.75 MHz rate entries for VIDEO_PLL1
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 01/11] clk: imx8mp: add 700 MHz rate entry for VIDEO_PLL1 Johannes Schneider
@ 2026-06-04 6:49 ` Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 03/11] pmdomain: imx8mp-blk-ctrl: add media blk-ctrl power domain support Johannes Schneider
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:49 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle, Johannes Schneider
The upstream arch/arm64/boot/dts/freescale/imx8mp.dtsi pins VIDEO_PLL1
to 1039.5 MHz (1080p60 LVDS link, 148.5 MHz * 7) via media_blk_ctrl's
assigned-clock-rates. Without the table entry, that assignment fails
-EINVAL at media_blk_ctrl probe and the clock tree below LCDIF2 is
broken before lcdif2's own assigned-clock-rates can rebind it.
Add the 1039.5 MHz entry and the 519.75 MHz dual-link half-rate from
Linux's imx_pll1443x_tbl. Parameters:
Fout = 24 MHz * (m + k/65536) / (p * 2^s)
1039.5 MHz: m=173, p=2, s=1, k=16384
519.75 MHz: m=173, p=2, s=2, k=16384
Signed-off-by: Johannes Schneider <johannes.schneider@leica-geosystems.com>
---
drivers/clk/imx/clk-pll14xx.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c
index db7e744e87..8a773f19f8 100644
--- a/drivers/clk/imx/clk-pll14xx.c
+++ b/drivers/clk/imx/clk-pll14xx.c
@@ -61,9 +61,11 @@ static const struct imx_pll14xx_rate_table imx_pll1416x_tbl[] = {
};
static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = {
+ PLL_1443X_RATE(1039500000U, 173, 2, 1, 16384),
PLL_1443X_RATE(700000000U, 350, 3, 2, 0),
PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
PLL_1443X_RATE(594000000U, 198, 2, 2, 0),
+ PLL_1443X_RATE(519750000U, 173, 2, 2, 16384),
PLL_1443X_RATE(393216000U, 262, 2, 3, 9437),
PLL_1443X_RATE(361267200U, 361, 3, 3, 17511),
};
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 03/11] pmdomain: imx8mp-blk-ctrl: add media blk-ctrl power domain support
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 01/11] clk: imx8mp: add 700 MHz rate entry for VIDEO_PLL1 Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 02/11] clk: imx8mp: add 1039.5 MHz and 519.75 MHz rate entries " Johannes Schneider
@ 2026-06-04 6:49 ` Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 04/11] video: backlight-pwm: make power-supply and enable-gpio optional Johannes Schneider
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:49 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle
From: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
The i.MX8MP LCDIF2 sits inside MEDIAMIX, whose blk-ctrl gates clocks
and holds resets. Without enabling the MEDIAMIX bus clock and
de-asserting LCDIF2's block-level resets, the first register access
to LCDIF2 AXI-hangs barebox.
Extend the existing HSIO-only blk-ctrl driver for fsl,imx8mp-media-
blk-ctrl:
- Route the HSIO ADB handshake through a new pre_power_on hook so
the generic power_on path calls it *before* clk_bulk_prepare_enable,
preserving v1's ordering while keeping HSIO specifics off the
generic path.
- NULL-check bc->power_on/off so blk-ctrls without per-domain
callbacks (e.g. media) work.
- Bump DOMAIN_MAX_CLKS from 2 to 3 (LCDIF2 needs disp2, axi, apb).
- Add an imx8mp_media_blk_ctrl_probe that maxes the LCDIF NoC
read-hurry, brings the MEDIAMIX fabric up, and de-asserts LCDIF2
clocks + resets, mirroring imx8mp_media_power_notifier in Linux.
The media_blk_ctrl DTS node keeps its syscon compatible so the LDB
bridge sub-device can still get the regmap via syscon_node_to_regmap().
Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
---
drivers/pmdomain/imx/imx8mp-blk-ctrl.c | 91 ++++++++++++++++++++++++--
1 file changed, 84 insertions(+), 7 deletions(-)
diff --git a/drivers/pmdomain/imx/imx8mp-blk-ctrl.c b/drivers/pmdomain/imx/imx8mp-blk-ctrl.c
index 3d302cbde7..3db26e91b3 100644
--- a/drivers/pmdomain/imx/imx8mp-blk-ctrl.c
+++ b/drivers/pmdomain/imx/imx8mp-blk-ctrl.c
@@ -17,6 +17,7 @@
#include <dt-bindings/power/imx8mp-power.h>
+/* HSIO blk-ctrl registers */
#define GPR_REG0 0x0
#define PCIE_CLOCK_MODULE_EN BIT(0)
#define USB_CLOCK_MODULE_EN BIT(1)
@@ -32,6 +33,11 @@
#define PLL_CKE BIT(17)
#define PLL_RST BIT(31)
+/* Media blk-ctrl registers */
+#define LCDIF_ARCACHE_CTRL 0x40
+#define LCDIF_1_RD_HURRY GENMASK(6, 4)
+#define LCDIF_0_RD_HURRY GENMASK(2, 0)
+
struct imx8mp_blk_ctrl_domain;
struct imx8mp_blk_ctrl {
@@ -40,6 +46,7 @@ struct imx8mp_blk_ctrl {
struct regmap *regmap;
struct imx8mp_blk_ctrl_domain *domains;
struct genpd_onecell_data onecell_data;
+ int (*pre_power_on) (struct imx8mp_blk_ctrl *bc);
void (*power_off) (struct imx8mp_blk_ctrl *bc, struct imx8mp_blk_ctrl_domain *domain);
void (*power_on) (struct imx8mp_blk_ctrl *bc, struct imx8mp_blk_ctrl_domain *domain);
};
@@ -51,7 +58,7 @@ struct imx8mp_blk_ctrl_domain_data {
const char *gpc_name;
};
-#define DOMAIN_MAX_CLKS 2
+#define DOMAIN_MAX_CLKS 3
struct imx8mp_blk_ctrl_domain {
struct generic_pm_domain genpd;
@@ -65,6 +72,7 @@ struct imx8mp_blk_ctrl_domain {
struct imx8mp_blk_ctrl_data {
int max_reg;
int (*probe) (struct imx8mp_blk_ctrl *bc);
+ int (*pre_power_on) (struct imx8mp_blk_ctrl *bc);
void (*power_off) (struct imx8mp_blk_ctrl *bc, struct imx8mp_blk_ctrl_domain *domain);
void (*power_on) (struct imx8mp_blk_ctrl *bc, struct imx8mp_blk_ctrl_domain *domain);
const struct imx8mp_blk_ctrl_domain_data *domains;
@@ -253,12 +261,52 @@ static const struct imx8mp_blk_ctrl_domain_data imx8mp_hsio_domain_data[] = {
static const struct imx8mp_blk_ctrl_data imx8mp_hsio_blk_ctl_dev_data = {
.max_reg = 0x24,
.probe = imx8mp_hsio_blk_ctrl_probe,
+ .pre_power_on = imx8mp_hsio_propagate_adb_handshake,
.power_on = imx8mp_hsio_blk_ctrl_power_on,
.power_off = imx8mp_hsio_blk_ctrl_power_off,
.domains = imx8mp_hsio_domain_data,
.num_domains = ARRAY_SIZE(imx8mp_hsio_domain_data),
};
+/* Media blk-ctrl */
+
+/* MEDIAMIX BLK_CTRL register offsets (i.MX 8M Plus RM section 13) */
+#define BLK_SFT_RSTN 0x00
+#define BLK_CLK_EN 0x04
+
+/* MEDIAMIX bus/APB clock + reset */
+#define MEDIAMIX_BUS_CLK_RST BIT(8)
+
+/* LCDIF2 in BLK_SFT_RSTN/BLK_CLK_EN: axi (11), apb (12), disp2 pixel (24) */
+#define LCDIF2_CLK_RST_MASK (BIT(11) | BIT(12) | BIT(24))
+
+static int imx8mp_media_blk_ctrl_probe(struct imx8mp_blk_ctrl *bc)
+{
+ /* maximize LCDIF NoC AXI read priority to avoid scanout underflow */
+ regmap_update_bits(bc->regmap, LCDIF_ARCACHE_CTRL,
+ FIELD_PREP(LCDIF_1_RD_HURRY, 7) |
+ FIELD_PREP(LCDIF_0_RD_HURRY, 7),
+ FIELD_PREP(LCDIF_1_RD_HURRY, 7) |
+ FIELD_PREP(LCDIF_0_RD_HURRY, 7));
+
+ /* bring MEDIAMIX fabric up before any sub-module access */
+ regmap_set_bits(bc->regmap, BLK_CLK_EN, MEDIAMIX_BUS_CLK_RST);
+ regmap_set_bits(bc->regmap, BLK_SFT_RSTN, MEDIAMIX_BUS_CLK_RST);
+ udelay(5); /* ADB handshake settle */
+
+ /* LCDIF2 registers AXI-hang until its own clocks + reset are de-asserted */
+ regmap_set_bits(bc->regmap, BLK_CLK_EN, LCDIF2_CLK_RST_MASK);
+ regmap_set_bits(bc->regmap, BLK_SFT_RSTN, LCDIF2_CLK_RST_MASK);
+
+ return 0;
+}
+
+static const struct imx8mp_blk_ctrl_data imx8mp_media_blk_ctl_dev_data = {
+ .max_reg = 0x138,
+ .probe = imx8mp_media_blk_ctrl_probe,
+ /* num_domains = 0: skip genpd; MEDIAMIX is already on from SPL */
+};
+
static int imx8mp_blk_ctrl_power_on(struct generic_pm_domain *genpd)
{
struct imx8mp_blk_ctrl_domain *domain = to_imx8mp_blk_ctrl_domain(genpd);
@@ -273,10 +321,12 @@ static int imx8mp_blk_ctrl_power_on(struct generic_pm_domain *genpd)
return ret;
}
- ret = imx8mp_hsio_propagate_adb_handshake(bc);
- if (ret) {
- dev_err(bc->dev, "failed to propagate adb handshake\n");
- goto bus_put;
+ if (bc->pre_power_on) {
+ ret = bc->pre_power_on(bc);
+ if (ret) {
+ dev_err(bc->dev, "pre_power_on failed: %d\n", ret);
+ goto bus_put;
+ }
}
/* enable upstream clocks */
@@ -287,7 +337,8 @@ static int imx8mp_blk_ctrl_power_on(struct generic_pm_domain *genpd)
}
/* domain specific blk-ctrl manipulation */
- bc->power_on(bc, domain);
+ if (bc->power_on)
+ bc->power_on(bc, domain);
/* power up upstream GPC domain */
ret = pm_runtime_resume_and_get_genpd(domain->power_dev);
@@ -322,7 +373,8 @@ static int imx8mp_blk_ctrl_power_off(struct generic_pm_domain *genpd)
}
/* domain specific blk-ctrl manipulation */
- bc->power_off(bc, domain);
+ if (bc->power_off)
+ bc->power_off(bc, domain);
clk_bulk_disable_unprepare(data->num_clks, domain->clks);
@@ -380,6 +432,27 @@ static int imx8mp_blk_ctrl_probe(struct device *dev)
if (!bc->onecell_data.domains)
return -ENOMEM;
+ /*
+ * num_domains == 0: blk-ctrl instances (e.g. media) that only need
+ * the regmap/probe side-effects and no genpd provider. Power on
+ * the bus domain so the blk-ctrl's own registers are accessible,
+ * then run its probe and return.
+ */
+ if (num_domains == 0) {
+ bc->bus_power_dev = dev_pm_domain_attach_by_name(dev, "bus");
+ if (!IS_ERR_OR_NULL(bc->bus_power_dev)) {
+ ret = pm_runtime_resume_and_get_genpd(bc->bus_power_dev);
+ if (ret < 0)
+ dev_warn(dev, "failed to power on MEDIAMIX (ignoring): %d\n", ret);
+ }
+ if (bc_data->probe) {
+ ret = bc_data->probe(bc);
+ if (ret)
+ return ret;
+ }
+ return 0;
+ }
+
bc->bus_power_dev = dev_pm_domain_attach_by_name(dev, "bus");
if (IS_ERR(bc->bus_power_dev))
return dev_err_probe(dev, PTR_ERR(bc->bus_power_dev),
@@ -387,6 +460,7 @@ static int imx8mp_blk_ctrl_probe(struct device *dev)
bc->power_off = bc_data->power_off;
bc->power_on = bc_data->power_on;
+ bc->pre_power_on = bc_data->pre_power_on;
for (i = 0; i < num_domains; i++) {
const struct imx8mp_blk_ctrl_domain_data *data = &bc_data->domains[i];
@@ -461,6 +535,9 @@ static const struct of_device_id imx8mp_blk_ctrl_of_match[] = {
{
.compatible = "fsl,imx8mp-hsio-blk-ctrl",
.data = &imx8mp_hsio_blk_ctl_dev_data,
+ }, {
+ .compatible = "fsl,imx8mp-media-blk-ctrl",
+ .data = &imx8mp_media_blk_ctl_dev_data,
}, {
/* Sentinel */
}
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 04/11] video: backlight-pwm: make power-supply and enable-gpio optional
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (2 preceding siblings ...)
2026-06-04 6:49 ` [PATCH v2 03/11] pmdomain: imx8mp-blk-ctrl: add media blk-ctrl power domain support Johannes Schneider
@ 2026-06-04 6:49 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 05/11] video: lcdif: make functional on i.MX8MP Johannes Schneider
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:49 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle
From: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
Boards often omit power-supply (rail is always-on) or use enable-gpios
without a discrete supply. The driver returned -ENODEV when either was
missing, blocking display init.
Switch to regulator_get_optional() so a missing power-supply property
surfaces as -ENODEV (instead of a silent NULL the IS_ERR check never
catches), and handle that case by leaving ->power = NULL.
regulator_enable() / regulator_disable() are already NULL-safe, no
extra guards needed at the call sites.
While here, fix the GPIO descriptor name: gpiod_get_optional() appends
"-gpios" itself, so the previous "enable-gpios" looked for a non-existent
"enable-gpios-gpios" property and never resolved the enable GPIO. Use
"enable" with GPIOD_ASIS so the boot-time pin state is preserved.
Use dev_errp_probe() for the PWM lookup so the underlying error and
deferred-probe path are propagated correctly; drop an unused 'ret' in
of_backlight_find().
Fixes: 4c7238df6866 ("video: backlight-pwm: switch to gpiod functions")
Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
---
drivers/video/backlight-pwm.c | 16 ++++++++--------
drivers/video/backlight.c | 2 +-
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/video/backlight-pwm.c b/drivers/video/backlight-pwm.c
index d3c81114e0..14fad55637 100644
--- a/drivers/video/backlight-pwm.c
+++ b/drivers/video/backlight-pwm.c
@@ -148,7 +148,7 @@ static int pwm_backlight_parse_dt(struct device *dev,
pwm_backlight->backlight.brightness_max = pwm_backlight->scale;
}
- pwm_backlight->enable_gpio = gpiod_get_optional(dev, "enable-gpios", 0);
+ pwm_backlight->enable_gpio = gpiod_get_optional(dev, "enable", GPIOD_ASIS);
return 0;
}
@@ -160,10 +160,8 @@ static int backlight_pwm_of_probe(struct device *dev)
struct pwm_device *pwm;
pwm = of_pwm_request(dev->of_node, NULL);
- if (IS_ERR(pwm)) {
- dev_err(dev, "Cannot find PWM device\n");
- return PTR_ERR(pwm);
- }
+ if (IS_ERR(pwm))
+ return dev_errp_probe(dev, pwm, "Cannot find PWM device\n");
pwm_backlight = xzalloc(sizeof(*pwm_backlight));
pwm_backlight->pwm = pwm;
@@ -173,10 +171,12 @@ static int backlight_pwm_of_probe(struct device *dev)
if (ret)
return ret;
- pwm_backlight->power = regulator_get(dev, "power");
+ pwm_backlight->power = regulator_get_optional(dev, "power");
if (IS_ERR(pwm_backlight->power)) {
- dev_err(dev, "Cannot find regulator\n");
- return PTR_ERR(pwm_backlight->power);
+ if (PTR_ERR(pwm_backlight->power) != -ENODEV)
+ return dev_errp_probe(dev, pwm_backlight->power,
+ "power supply\n");
+ pwm_backlight->power = NULL;
}
pwm_backlight->backlight.slew_time_ms = 100;
diff --git a/drivers/video/backlight.c b/drivers/video/backlight.c
index 6d8146ee5a..066742fe28 100644
--- a/drivers/video/backlight.c
+++ b/drivers/video/backlight.c
@@ -95,7 +95,7 @@ struct backlight_device *of_backlight_find(struct device_node *node)
{
struct backlight_device *bl;
- of_device_ensure_probed(node);
+ (void)of_device_ensure_probed(node);
class_for_each_container_of_device(&backlight_class, bl, dev)
if (bl->node == node)
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 05/11] video: lcdif: make functional on i.MX8MP
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (3 preceding siblings ...)
2026-06-04 6:49 ` [PATCH v2 04/11] video: backlight-pwm: make power-supply and enable-gpio optional Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 06/11] video: lcdif: use 128B AXI bursts to avoid right-edge gap Johannes Schneider
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle, Johannes Schneider
The driver matches fsl,imx8mp-lcdif and its help text mentions i.MX8MP,
but two oversights left it unusable on that SoC:
- Kconfig depends on ARCH_IMX9 || ARCH_IMX93, so setting
CONFIG_DRIVER_VIDEO_LCDIF=y in an IMX8MP defconfig is silently
forced back to n and the driver is never built.
- lcdif_probe() acquires clk references but never ungates them. In
Linux runtime PM via the LCDIF power-domain genpd handles that;
barebox has no runtime_pm wiring, so the LCDIF clock domain stays
gated and the MMIO setup in atomic_enable silently no-ops --
/dev/fb0 registers correctly but DISP_PARA / CTRLDESCL stay at 0
and the panel is dark.
Add ARCH_IMX8MP to the depends-on clause, update the menu prompt to
match the help text, and clk_prepare_enable() the three clocks at the
start of lcdif_crtc_atomic_enable, after the pixel-clock rate is set.
Signed-off-by: Johannes Schneider <johannes.schneider@leica-geosystems.com>
---
drivers/video/Kconfig | 4 ++--
drivers/video/lcdif_kms.c | 5 +++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index ce10237221..2faad19a99 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -67,8 +67,8 @@ config DRIVER_VIDEO_IMX_IPU_OVERLAY
depends on DRIVER_VIDEO_IMX_IPU && (ARCH_IMX35 || ARCH_IMX31)
config DRIVER_VIDEO_LCDIF
- bool "i.MX9 framebuffer driver"
- depends on ARCH_IMX9 || ARCH_IMX93
+ bool "i.MX8MP/9/93 LCDIFv3 framebuffer driver"
+ depends on ARCH_IMX8MP || ARCH_IMX9 || ARCH_IMX93
help
Add support for the LCDIFv3 LCD controller found on
i.MX8MP and i.MX93 SoCs.
diff --git a/drivers/video/lcdif_kms.c b/drivers/video/lcdif_kms.c
index 033df23186..3a31633818 100644
--- a/drivers/video/lcdif_kms.c
+++ b/drivers/video/lcdif_kms.c
@@ -326,6 +326,11 @@ static void lcdif_crtc_atomic_enable(struct lcdif_drm_private *lcdif,
clk_set_rate(lcdif->clk, mode->clock * 1000);
+ /* no runtime PM; ungate the LCDIF clocks ourselves */
+ clk_prepare_enable(lcdif->clk_axi);
+ clk_prepare_enable(lcdif->clk_disp_axi);
+ clk_prepare_enable(lcdif->clk);
+
lcdif_crtc_mode_set_nofb(lcdif, mode, vcstate);
/* Write cur_buf as well to avoid an initial corrupt frame */
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 06/11] video: lcdif: use 128B AXI bursts to avoid right-edge gap
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (4 preceding siblings ...)
2026-06-04 6:50 ` [PATCH v2 05/11] video: lcdif: make functional on i.MX8MP Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 07/11] video: lcdif: default to RGB888_1X24 on VPL_GET_BUS_FORMAT failure Johannes Schneider
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle
From: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
P_SIZE/T_SIZE are undocumented AXI-burst-size selectors: 1 = 128 byte,
2 = 256 byte. The driver inherited 256B from NXP downstream, which
works for 1080p (stride 7680 B = 30 * 256 B) but breaks on narrower
32 bpp panels whose row byte count isn't a multiple of 256.
On an 800-pixel row at XRGB8888, stride = 3200 B = 12.5 * 256 B. The
trailing partial burst is dropped and the panel shows a ~32-pixel-wide
black strip at the right edge. 128B is a divisor of every common
32 bpp stride (3200, 3840, 5120, ...), so the gap disappears.
Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
---
drivers/video/lcdif_kms.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/drivers/video/lcdif_kms.c b/drivers/video/lcdif_kms.c
index 3a31633818..a113f3e681 100644
--- a/drivers/video/lcdif_kms.c
+++ b/drivers/video/lcdif_kms.c
@@ -216,18 +216,14 @@ static void lcdif_set_mode(struct lcdif_drm_private *lcdif,
lcdif->base + LCDC_V8_CTRLDESCL0_1);
/*
- * Undocumented P_SIZE and T_SIZE register but those written in the
- * downstream kernel those registers control the AXI burst size. As of
- * now there are two known values:
- * 1 - 128Byte
- * 2 - 256Byte
- * Downstream set it to 256B burst size to improve the memory
- * efficiency so set it here too.
+ * P_SIZE/T_SIZE are undocumented AXI-burst-size selectors:
+ * 1 = 128 byte, 2 = 256 byte. Use 128B so any 32 bpp row divides
+ * into whole bursts; 256B on an 800-pixel row produces a partial
+ * trailing burst and a ~32-pixel black strip at the right edge.
+ *
+ * Stride is fixed to hdisplay * 4 (DRM_FORMAT_XRGB8888).
*/
- /* NOTE: Since this driver is currently fixed to DRM_FORMAT_XRGB8888
- * we asume a stride of vdisplay * 4
- */
- ctrl = CTRLDESCL0_3_P_SIZE(2) | CTRLDESCL0_3_T_SIZE(2) |
+ ctrl = CTRLDESCL0_3_P_SIZE(1) | CTRLDESCL0_3_T_SIZE(1) |
CTRLDESCL0_3_PITCH(m->hdisplay * 4);
writel(ctrl, lcdif->base + LCDC_V8_CTRLDESCL0_3);
}
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 07/11] video: lcdif: default to RGB888_1X24 on VPL_GET_BUS_FORMAT failure
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (5 preceding siblings ...)
2026-06-04 6:50 ` [PATCH v2 06/11] video: lcdif: use 128B AXI bursts to avoid right-edge gap Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 08/11] video: lcdif: register simplefb fixup and enable framebuffer at probe Johannes Schneider
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle, Johannes Schneider
VPL_GET_BUS_FORMAT walks downstream through the bridge to the panel.
Today neither fsl-ldb (which forwards the call) nor simple-panel
(which reads a "bus-format" DT property) succeeds for DTs that follow
the Linux panel-lvds binding -- that binding describes the LVDS data
mapping in "data-mapping", not as a discrete bus-format integer.
The driver currently aborts enable on the -EINVAL, leaving /dev/fb0
registered but nothing scanning out. Default to RGB888_1X24 instead
-- the parallel format LCDIFv3 hands to every RGB888 bridge regardless
of what the panel ultimately drives onto the wire.
Signed-off-by: Johannes Schneider <johannes.schneider@leica-geosystems.com>
---
drivers/video/lcdif_kms.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/video/lcdif_kms.c b/drivers/video/lcdif_kms.c
index a113f3e681..5487d1298c 100644
--- a/drivers/video/lcdif_kms.c
+++ b/drivers/video/lcdif_kms.c
@@ -364,8 +364,11 @@ static void lcdif_enable_fb_controller(struct fb_info *info)
ret = vpl_ioctl(&lcdif->vpl, lcdif->id, VPL_GET_BUS_FORMAT, &vcstate.bus_format);
if (ret < 0) {
- dev_err(lcdif->dev, "Cannot determine bus format\n");
- return;
+ /* default for panel-lvds DTs lacking bus-format / bridges not answering */
+ dev_warn(lcdif->dev,
+ "VPL_GET_BUS_FORMAT failed (%pe), defaulting to RGB888_1X24\n",
+ ERR_PTR(ret));
+ vcstate.bus_format = MEDIA_BUS_FMT_RGB888_1X24;
}
ret = vpl_ioctl(&lcdif->vpl, lcdif->id, VPL_GET_DISPLAY_INFO, &display_info);
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 08/11] video: lcdif: register simplefb fixup and enable framebuffer at probe
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (6 preceding siblings ...)
2026-06-04 6:50 ` [PATCH v2 07/11] video: lcdif: default to RGB888_1X24 on VPL_GET_BUS_FORMAT failure Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 09/11] video: lcdif: drain write-combine framebuffer in fb_damage Johannes Schneider
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle
From: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
Two changes are needed to use lcdif_drv as the primary barebox boot
framebuffer:
- register_framebuffer() leaves the cdev disabled; the splash command
opens fb0 via the fb API and never goes through the cdev open path
that triggers fb_enable lazily, so it bails on
"fb_open: No such file or directory". fb_enable() at the end of
register_fb so the controller is up by the time anything blits.
- Set info->register_simplefb and call fb_register_simplefb() so
DRM_SIMPLEDRM in Linux sees the boot framebuffer as a
simple-framebuffer DT node and keeps the splash visible until its
native LCDIF driver binds.
Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
---
drivers/video/lcdif_kms.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/video/lcdif_kms.c b/drivers/video/lcdif_kms.c
index 5487d1298c..e3d1985dc9 100644
--- a/drivers/video/lcdif_kms.c
+++ b/drivers/video/lcdif_kms.c
@@ -459,6 +459,16 @@ static int lcdif_register_fb(struct lcdif_drm_private *lcdif)
if (ret)
return ret;
+ /* expose as simple-framebuffer for Linux DRM_SIMPLEDRM handoff */
+ info->register_simplefb = 1;
+ fb_register_simplefb(info);
+
+ /* enable now so the splash command can blit into a live fb */
+ ret = fb_enable(info);
+ if (ret)
+ dev_warn(lcdif->dev, "failed to enable framebuffer: %pe\n",
+ ERR_PTR(ret));
+
dev_info(lcdif->dev, "Registered %s on LCDIF%d, type primary\n",
info->cdev.name, lcdif->id);
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 09/11] video: lcdif: drain write-combine framebuffer in fb_damage
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (7 preceding siblings ...)
2026-06-04 6:50 ` [PATCH v2 08/11] video: lcdif: register simplefb fixup and enable framebuffer at probe Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 10/11] video: simple-panel: support panel-lvds DT bindings Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 11/11] video: simple-panel: lazily resolve backlight without failing Johannes Schneider
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle
From: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
The framebuffer is allocated Normal Non-Cacheable (write-combine).
After the splash command's memcpy() from a cached shadow buffer into
the hardware framebuffer (see gu_screen_blit()), stores may still
reside in the CPU write-combine buffer when scanout next fetches --
visible as partial / corrupted rendering at the bottom of the image.
dsb() alone is not sufficient: it orders subsequent instructions
against the outstanding writes but doesn't actively drain the WC
buffer to memory. A readback of any byte inside the WC region does,
since the load cannot complete until prior stores to the buffer have
been retired.
Wire lcdif_fb_damage to do that readback after each blit. Keep
fb_flush bound to lcdif_crtc_atomic_flush so the SHADOW_LOAD_EN
re-latch still fires on fb_close / fbtest paths.
Suggested-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
---
drivers/video/lcdif_kms.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/video/lcdif_kms.c b/drivers/video/lcdif_kms.c
index e3d1985dc9..57ca92b4be 100644
--- a/drivers/video/lcdif_kms.c
+++ b/drivers/video/lcdif_kms.c
@@ -396,10 +396,17 @@ static void lcdif_disable_fb_controller(struct fb_info *info)
lcdif_disable_controller(lcdif);
}
+static void lcdif_fb_damage(struct fb_info *info, const struct fb_rect *rect)
+{
+ /* readback drains the write-combine buffer (dsb() doesn't) */
+ (void)*(volatile u8 *)info->screen_base;
+}
+
static struct fb_ops lcdif_fb_ops = {
.fb_enable = lcdif_enable_fb_controller,
.fb_disable = lcdif_disable_fb_controller,
.fb_flush = lcdif_crtc_atomic_flush,
+ .fb_damage = lcdif_fb_damage,
};
/* -----------------------------------------------------------------------------
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 10/11] video: simple-panel: support panel-lvds DT bindings
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (8 preceding siblings ...)
2026-06-04 6:50 ` [PATCH v2 09/11] video: lcdif: drain write-combine framebuffer in fb_damage Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 11/11] video: simple-panel: lazily resolve backlight without failing Johannes Schneider
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle, Johannes Schneider
simple-panel already parses display-timings, enable-gpios and a
backlight phandle from DT, which is exactly what a Linux panel-lvds
node provides. Unlike Linux's drivers/gpu/drm/panel/panel-simple.c
we have no hardcoded panel tables, so there's nothing LVDS-specific
left for a dedicated driver to do. Bring panel-lvds DTs in:
- Match "panel-lvds" in the of_device_id table.
- Read modes from a "panel-timing" subnode as a fallback when
"display-timings" isn't present. Linux's panel-lvds binding uses
the singular form; without this, the panel reports "No modes
found" and the display chain has nothing to allocate a fb for.
- Switch the power-supply lookup to regulator_get_optional() and
treat -ENODEV as "no supply". Many panel-lvds DTs omit
"power-supply" because the rail is hard-wired; the call sites
already pass NULL through safely.
Signed-off-by: Johannes Schneider <johannes.schneider@leica-geosystems.com>
---
drivers/video/simple-panel.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/video/simple-panel.c b/drivers/video/simple-panel.c
index 63a032a9b8..66d519425a 100644
--- a/drivers/video/simple-panel.c
+++ b/drivers/video/simple-panel.c
@@ -112,6 +112,19 @@ static int simple_panel_get_modes(struct simple_panel *panel, struct display_tim
return 0;
}
+ /* panel-lvds DTs put the single mode in "panel-timing", not "display-timings" */
+ if (of_get_child_by_name(panel->dev->of_node, "panel-timing")) {
+ struct fb_videomode *mode = xzalloc(sizeof(*mode));
+
+ ret = of_get_display_timing(panel->dev->of_node, "panel-timing", mode);
+ if (!ret) {
+ timings->modes = mode;
+ timings->num_modes = 1;
+ return 0;
+ }
+ free(mode);
+ }
+
dev_err(panel->dev, "No modes found\n");
return -ENOENT;
@@ -162,9 +175,12 @@ static int simple_panel_probe(struct device *dev)
panel->backlight_node = of_parse_phandle(node, "backlight", 0);
- panel->power = regulator_get(dev, "power");
- if (IS_ERR(panel->power))
- return dev_errp_probe(dev, panel->power, "Cannot find regulator\n");
+ panel->power = regulator_get_optional(dev, "power");
+ if (IS_ERR(panel->power)) {
+ if (PTR_ERR(panel->power) != -ENODEV)
+ return dev_errp_probe(dev, panel->power, "power supply\n");
+ panel->power = NULL;
+ }
ret = vpl_register(&panel->vpl);
if (ret)
@@ -175,6 +191,7 @@ static int simple_panel_probe(struct device *dev)
static struct of_device_id simple_panel_of_ids[] = {
{ .compatible = "simple-panel", },
+ { .compatible = "panel-lvds", },
{ }
};
MODULE_DEVICE_TABLE(of, simple_panel_of_ids);
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 11/11] video: simple-panel: lazily resolve backlight without failing
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
` (9 preceding siblings ...)
2026-06-04 6:50 ` [PATCH v2 10/11] video: simple-panel: support panel-lvds DT bindings Johannes Schneider
@ 2026-06-04 6:50 ` Johannes Schneider
10 siblings, 0 replies; 12+ messages in thread
From: Johannes Schneider @ 2026-06-04 6:50 UTC (permalink / raw)
To: barebox, a.fatoum, mgr, l.stach; +Cc: thomas.haemmerle, Johannes Schneider
simple_panel_enable() returned -ENODEV when of_backlight_find() came
back NULL at the moment of VPL_ENABLE. With deep-probe, or simply
when the panel binds before its pwm-backlight, the first call sees
NULL -- and we'd then skip the regulator and enable-GPIO assertion
entirely, leaving the panel dark even though scanout was already
running into it.
Try the lookup on each enable, but if it isn't there yet just skip
the brightness_default() call and proceed with the rest of the panel
power-up. Board code that drives the backlight separately still
works; the panel re-resolves on the next VPL_ENABLE.
Signed-off-by: Johannes Schneider <johannes.schneider@leica-geosystems.com>
---
drivers/video/simple-panel.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/video/simple-panel.c b/drivers/video/simple-panel.c
index 66d519425a..8ffb6db6f6 100644
--- a/drivers/video/simple-panel.c
+++ b/drivers/video/simple-panel.c
@@ -36,13 +36,9 @@ static int simple_panel_enable(struct simple_panel *panel)
dev_dbg(panel->dev, "enabling\n");
- if (panel->backlight_node && !panel->backlight) {
+ /* resolve lazily; backlight may probe after us */
+ if (panel->backlight_node && !panel->backlight)
panel->backlight = of_backlight_find(panel->backlight_node);
- if (!panel->backlight) {
- dev_err(panel->dev, "Cannot find backlight\n");
- return -ENODEV;
- }
- }
regulator_enable(panel->power);
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-06-04 8:03 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-04 6:49 [PATCH v2 00/11] video: enable boot splash on i.MX8MP with LVDS panel Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 01/11] clk: imx8mp: add 700 MHz rate entry for VIDEO_PLL1 Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 02/11] clk: imx8mp: add 1039.5 MHz and 519.75 MHz rate entries " Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 03/11] pmdomain: imx8mp-blk-ctrl: add media blk-ctrl power domain support Johannes Schneider
2026-06-04 6:49 ` [PATCH v2 04/11] video: backlight-pwm: make power-supply and enable-gpio optional Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 05/11] video: lcdif: make functional on i.MX8MP Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 06/11] video: lcdif: use 128B AXI bursts to avoid right-edge gap Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 07/11] video: lcdif: default to RGB888_1X24 on VPL_GET_BUS_FORMAT failure Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 08/11] video: lcdif: register simplefb fixup and enable framebuffer at probe Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 09/11] video: lcdif: drain write-combine framebuffer in fb_damage Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 10/11] video: simple-panel: support panel-lvds DT bindings Johannes Schneider
2026-06-04 6:50 ` [PATCH v2 11/11] video: simple-panel: lazily resolve backlight without failing Johannes Schneider
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox