From: Philipp Zabel <p.zabel@pengutronix.de>
To: Vishnu Saini <vishnu.saini@oss.qualcomm.com>,
Andrzej Hajda <andrzej.hajda@intel.com>,
Neil Armstrong <neil.armstrong@linaro.org>,
Robert Foss <rfoss@kernel.org>,
Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
Jonas Karlman <jonas@kwiboo.se>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
Luca Ceresoli <luca.ceresoli@bootlin.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>, Marek Vasut <marex@denx.de>
Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, Yi Zhang <zhanyi@qti.qualcomm.com>,
Nilesh Laad <nilesh.laad@oss.qualcomm.com>,
Gopi Botlagunta <venkata.botlagunta@oss.qualcomm.com>,
venkata.valluru@oss.qualcomm.com,
Jessica Zhang <jesszhan0024@gmail.com>,
Philipp Zabel <p.zabel@pengutronix.de>
Subject: [PATCH] drm/bridge: lt9211: drop delayed work
Date: Mon, 28 Sep 2026 11:56:22 +0200 [thread overview]
Message-ID: <20260928095622.38130-1-p.zabel@pengutronix.de> (raw)
In-Reply-To: <20260924-add-lt9211c-bridge-v9-2-d78b39677a61@oss.qualcomm.com>
Replace the asynchronous work item with synchronous initialization in
lt9211_atomic_enable. This should fix 3 issues flagged by sashiko [1].
The next bridge or panel in the chain may depend on the LVDS signal
being active after atomic_enable, so arbitrarily deferring bridge
initialization is not an option.
If deferring initialization into an asynchronous work item fixes DSI
stream detection, there might be a bug in the upstream display
controller or MIPI DSI host controller bridge drivers, as the DSI
signal should already be streaming when lt9211_atomic_enable is called.
[1] https://lore.kernel.org/all/20260924160816.ED8F31F0089E@smtp.kernel.org/
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
drivers/gpu/drm/bridge/lontium-lt9211.c | 121 ++++++++----------------
1 file changed, 38 insertions(+), 83 deletions(-)
diff --git a/drivers/gpu/drm/bridge/lontium-lt9211.c b/drivers/gpu/drm/bridge/lontium-lt9211.c
index 9226d967b271..244979fb9ae6 100644
--- a/drivers/gpu/drm/bridge/lontium-lt9211.c
+++ b/drivers/gpu/drm/bridge/lontium-lt9211.c
@@ -20,7 +20,6 @@
#include <linux/of_graph.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
-#include <linux/workqueue.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
@@ -72,14 +71,6 @@ struct lt9211 {
bool lvds_dual_link;
bool lvds_dual_link_even_odd_swap;
const struct lt9211_chip_data *chip_data;
- /* LT9211C specific fields */
- struct workqueue_struct *wq;
- struct work_struct lt9211_work;
- struct drm_crtc *lt9211c_crtc;
- struct drm_display_mode lt9211c_mode;
- bool lt9211c_bpp24;
- bool lt9211c_jeida;
- bool lt9211c_de_high;
};
static const struct regmap_range lt9211_rw_ranges[] = {
@@ -1157,51 +1148,6 @@ static int lt9211c_configure_tx(struct lt9211 *ctx, bool jeida, bool bpp24,
return 0;
}
-static void lt9211_work_func(struct work_struct *work)
-{
- struct lt9211 *ctx = container_of(work, struct lt9211, lt9211_work);
- const struct drm_display_mode *mode = &ctx->lt9211c_mode;
- int ret;
-
- /* wait for vblank irq to correctly configure bridge and autodetect stream */
- ret = drm_crtc_wait_one_vblank(ctx->lt9211c_crtc);
- if (ret) {
- dev_err(ctx->dev, "LT9211C: wait for vblank failed: %d\n", ret);
- return;
- }
-
- ret = lt9211c_configure_rx(ctx);
- if (ret) {
- dev_err(ctx->dev, "LT9211C: configure_rx failed: %d\n", ret);
- return;
- }
-
- ret = lt9211c_autodetect_rx(ctx, mode);
- if (ret) {
- dev_err(ctx->dev, "LT9211C: autodetect_rx failed: %d\n", ret);
- return;
- }
-
- ret = lt9211c_configure_timing(ctx, mode);
- if (ret) {
- dev_err(ctx->dev, "LT9211C: configure_timing failed: %d\n", ret);
- return;
- }
-
- ret = lt9211c_configure_plls(ctx, mode);
- if (ret) {
- dev_err(ctx->dev, "LT9211C: configure_plls failed: %d\n", ret);
- return;
- }
-
- ret = lt9211c_configure_tx(ctx, ctx->lt9211c_jeida, ctx->lt9211c_bpp24,
- ctx->lt9211c_de_high, mode);
- if (ret) {
- dev_err(ctx->dev, "LT9211C: configure_tx failed: %d\n", ret);
- return;
- }
-}
-
static void lt9211_atomic_enable(struct drm_bridge *bridge,
struct drm_atomic_state *state)
{
@@ -1272,17 +1218,45 @@ static void lt9211_atomic_enable(struct drm_bridge *bridge,
return;
if (ctx->chip_data->chip_type == LT9211C) {
- drm_mode_copy(&ctx->lt9211c_mode, mode);
- ctx->lt9211c_bpp24 = lvds_format_24bpp;
- ctx->lt9211c_jeida = lvds_format_jeida;
- ctx->lt9211c_de_high = !!(bus_flags & DRM_BUS_FLAG_DE_HIGH);
- ctx->lt9211c_crtc = crtc;
+ /* wait for vblank irq to correctly configure bridge and autodetect stream */
+ ret = drm_crtc_wait_one_vblank(crtc);
+ if (ret) {
+ dev_err(ctx->dev, "LT9211C: wait for vblank failed: %d\n", ret);
+ return;
+ }
- /*
- * Needs a live DSI stream to auto-detect RX resolution/format;
- * defer bridge configuration until vblank inside the work item.
- */
- queue_work(ctx->wq, &ctx->lt9211_work);
+ ret = lt9211c_configure_rx(ctx);
+ if (ret) {
+ dev_err(ctx->dev, "LT9211C: configure_rx failed: %d\n", ret);
+ return;
+ }
+
+ ret = lt9211c_autodetect_rx(ctx, mode);
+ if (ret) {
+ dev_err(ctx->dev, "LT9211C: autodetect_rx failed: %d\n", ret);
+ return;
+ }
+
+ ret = lt9211c_configure_timing(ctx, mode);
+ if (ret) {
+ dev_err(ctx->dev, "LT9211C: configure_timing failed: %d\n", ret);
+ return;
+ }
+
+ ret = lt9211c_configure_plls(ctx, mode);
+ if (ret) {
+ dev_err(ctx->dev, "LT9211C: configure_plls failed: %d\n", ret);
+ return;
+ }
+
+ ret = lt9211c_configure_tx(ctx, lvds_format_jeida, lvds_format_24bpp,
+ bus_flags & DRM_BUS_FLAG_DE_HIGH, mode);
+ if (ret) {
+ dev_err(ctx->dev, "LT9211C: configure_tx failed: %d\n", ret);
+ return;
+ }
+
+ dev_dbg(ctx->dev, "LT9211C enabled.\n");
return;
}
@@ -1320,9 +1294,6 @@ static void lt9211_atomic_disable(struct drm_bridge *bridge,
struct lt9211 *ctx = bridge_to_lt9211(bridge);
int ret;
- if (ctx->chip_data->chip_type == LT9211C)
- cancel_work_sync(&ctx->lt9211_work);
-
/*
* Put the chip in reset, pull nRST line low,
* and assure lengthy 10ms reset low timing.
@@ -1483,11 +1454,6 @@ static int lt9211_host_attach(struct lt9211 *ctx)
return 0;
}
-static void lt9211_destroy_wq(void *data)
-{
- destroy_workqueue(data);
-}
-
static int lt9211_probe(struct i2c_client *client)
{
struct device *dev = &client->dev;
@@ -1532,17 +1498,6 @@ static int lt9211_probe(struct i2c_client *client)
if (ret)
return ret;
- if (ctx->chip_data->chip_type == LT9211C) {
- ctx->wq = create_workqueue("lt9211_work");
- if (!ctx->wq)
- return -ENOMEM;
- /* Register after DSI attach so devres flushes work before freeing ctx->dsi. */
- ret = devm_add_action_or_reset(dev, lt9211_destroy_wq, ctx->wq);
- if (ret)
- return ret;
- INIT_WORK(&ctx->lt9211_work, lt9211_work_func);
- }
-
return 0;
}
--
2.47.3
prev parent reply other threads:[~2026-09-28 9:56 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-24 15:59 [PATCH v9 0/2] This series adds LT9211C bridge driver by extending LT9211 vishnu.saini
2026-09-24 15:59 ` [PATCH v9 1/2] dt-bindings: display: bridge: lontium,lt9211: Add lt9211c support vishnu.saini
2026-09-24 15:59 ` [PATCH v9 2/2] drm/bridge: add support for lontium lt9211c bridge vishnu.saini
2026-09-24 16:08 ` sashiko-bot
2026-09-25 13:23 ` Philipp Zabel
2026-09-28 10:13 ` Philipp Zabel
2026-10-01 2:34 ` Vishnu Saini
2026-10-01 2:45 ` Vishnu Saini
2026-09-28 9:56 ` Philipp Zabel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260928095622.38130-1-p.zabel@pengutronix.de \
--to=p.zabel@pengutronix.de \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=andrzej.hajda@intel.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jernej.skrabec@gmail.com \
--cc=jesszhan0024@gmail.com \
--cc=jonas@kwiboo.se \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luca.ceresoli@bootlin.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=marex@denx.de \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=nilesh.laad@oss.qualcomm.com \
--cc=rfoss@kernel.org \
--cc=robh@kernel.org \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
--cc=venkata.botlagunta@oss.qualcomm.com \
--cc=venkata.valluru@oss.qualcomm.com \
--cc=vishnu.saini@oss.qualcomm.com \
--cc=zhanyi@qti.qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox