From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6920747CC9E; Mon, 28 Sep 2026 09:56:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.203.200.13 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790589389; cv=pass; b=GMN/JUb4a1maJtYxvJnxc85a6bQVpUT/fdNS6A9Co1jGAxQqKvxhnhfxaxv64TsXjkHd+lc54d1VGp1pX6sLfvVXyOtN1XUaUZ8gUSK64SRj/L2EbXkGZTDg0/mPPn/ijnuVtoO9VuFX6mOW5HSmeJWqCB5s3nBrJEUdmQs4nno= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790589389; c=relaxed/simple; bh=jlY/G8SBXi3MacKSinkAbyqBt0gkHz9gB/Hix+r3HXk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oke1rectkrWM3svbLa3B08MfejbGu8oap8CDbe3nsv+dmyMvYHdlXmhpozvBFaACwz/Xg9aMp756WbvRsKx28+vmSytddoqGUCBz1R4g4eVLYFnpE3ut1SPTq/VsgKvIyF0iJS386PNHtf/DPG+obfBq1ZoVBHHe6U2mQ6CDtgo= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; dkim=pass (2048-bit key) header.d=pengutronix.de header.i=@pengutronix.de header.b=GWCN68O8; arc=pass smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pengutronix.de header.i=@pengutronix.de header.b="GWCN68O8" Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 0112F2001F2; Mon, 28 Sep 2026 11:56:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pengutronix.de; s=20260414; t=1790589384; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6LuymVPYOeFAgj5ouYzllJ1mO8H9HkFW/AWhP83jbnI=; b=GWCN68O8Zb6p/9/DXqR3kOKZWFjSnABczRl9jhLdMrKz7uAWw4+4bnRmVrRds3d4eT+0Wo CPkrBdO0S30RcX7/grHcCchBUKq9AcxSjUr2bZp79PdGJFned7UAIDwI8bpbMyimmSB5PK 4PqSjlqpe3ssoUHCn5UjJRCLEfuF+ymk5gJ2a2eTXSIa6Pl244+6vQtDQhJPpBTfTkCE0b emQC6b5GWQOnY2I7hMUXPNvj8aqzBAiLlm2dWW2ogIA95GfBugpYr+1Pm1vZhWqMTW3GMU KeUGJKRb9k0qxShEUJeBIXDPQRTOhDsonVMkKYjPWRgVNjjNF+GEktu2QDkY6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=pengutronix.de; s=20260414; t=1790589384; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6LuymVPYOeFAgj5ouYzllJ1mO8H9HkFW/AWhP83jbnI=; b=cwifMkiBvbVBYCKb0nVPnTur6/uQz+5veMWsqrcuqAcqVyQj1hKonxiz+TtMRHrT/j36MF O098vXUDHj2lYgO+4XRwniAngMhFIpGkvE2BUGAih5ZNhf3+e0vK6wAr2cNcZFg1WAWFrS 8hgLZWkYVaDhbR5sRo9qV7uszD4AI80zJkDck7a11cSxT5Z5i3S4M8QHecEYwtobU2glW6 j54u88detZPjXcKau9N9aC5hz/16+mr/N5yYULKzfE1H6ySN2proHCr3zEF2IvxJKgZEyZ x80vDGbTdKt4eCFyJczDOgGPuCeeqX09c7DyyFj06X/2IHrwYfpvIK/EfBRBEg== ARC-Seal: i=1; s=20260414; d=pengutronix.de; t=1790589384; a=rsa-sha256; cv=none; b=dEkMY0j2VqybOpRFC0MZQnXvjh6ZmIVQ/dP5vmSLXT+wxkazFCpa/UKHmoQVnt/s1zt/r5 VngR+zBn1TZaEVGeeikmwWpRDvEN5xwNO9mcSuIYfBpwUcUUT/VeX4sf10gLQ3JSwR7rHf CpXyyrT9FtKcz2+ruFQnExliEhzOZfTaOFJkKaJ7RkuMA/9udYJZZSi8rEuLsxPn6S2XBV Gz4ZmpRpttpVMLCsU9Wa3LCXaTLRxwnSP2HojO9fU6dxmguiBmgh03VeyLfJ4R0l690um4 +AxOn85Gum2wKAq5PV4mZm+WONHPbe94JvPfMuLEsMCZ22KHfftzPDC0ZXwZYw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=relay-from-drehscheibe.grey.stw.pengutronix.de smtp.mailfrom=p.zabel@pengutronix.de Received: from lupine.office.stw.pengutronix.de ([2a0a:edc0:0:900:1d::4e]) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.96) (envelope-from ) id 1xB85v-003Cfy-2m; Mon, 28 Sep 2026 11:56:23 +0200 From: Philipp Zabel To: Vishnu Saini , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Marek Vasut Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Yi Zhang , Nilesh Laad , Gopi Botlagunta , venkata.valluru@oss.qualcomm.com, Jessica Zhang , Philipp Zabel Subject: [PATCH] drm/bridge: lt9211: drop delayed work Date: Mon, 28 Sep 2026 11:56:22 +0200 Message-ID: <20260928095622.38130-1-p.zabel@pengutronix.de> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260924-add-lt9211c-bridge-v9-2-d78b39677a61@oss.qualcomm.com> References: <20260924-add-lt9211c-bridge-v9-2-d78b39677a61@oss.qualcomm.com> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 --- 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 #include #include -#include #include #include @@ -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