From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D66B73CE481 for ; Wed, 18 Mar 2026 16:14:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773850464; cv=none; b=YpFllCRjhL3cczmvUOwNyY80nFaVdmnnUZe29vmULjcBRlUIFIGzjEu5N0DhcG8DNQgO3i3wTC3kfojfCcFbp8zpankZHTubq3QO/9OZ+EOvsf8M5u6Mp12nlGvivlJCBqZdiWedO6mcKiujwvIchauqJiIZNLdMK6qkU/RRZK0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773850464; c=relaxed/simple; bh=u+EyvjIpI0D5DKmwpz3z0Ilndn4iMMGs+ZLsdznq/i0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lZTg0aHJbGGQom2MgXjSHaG+pyggs1w7e45+llqPuXhMVZeRF7Y7fiZiV3z6q+5gQImA7fuJXzUzIGJAL7S3JYA7TlL608/6wo9gUeYucc/EviDZMzQ3+oJP1k2ilkg1DMxPgQMZXXcNVcnzwEH/peFfVmTB5LN2pl/i3V0ZhRI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MxO72YfJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MxO72YfJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0B5E3C2BC87; Wed, 18 Mar 2026 16:14:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773850464; bh=u+EyvjIpI0D5DKmwpz3z0Ilndn4iMMGs+ZLsdznq/i0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MxO72YfJHxq9MsoxKhH0yji9H0pyaAch/f/xSWSXu95rrenah8sGYhlX13LHj/Ueh WFw8s9t5eRCtQ/XeCbMZXfldlgR1UGdAJrngQ3XuB4GNhvlnhhqsOO6prLG7LSkRLS 3DANqxnIUDbJy2cGCzH6WuLHrPkXXAdaIJLGT4KYJgpPjvpAfQLh4ZlOCDEdlI5h3t AYZe33P/y8rlgcRHfB/+CeUWC4ieng0DYX+bb3QQ7JRN0iYhX8RSManyf8N963V0Kx katnIgtUl1JmjyTkEIWIw2aP4sU93OGd8IuinEAXowG7DlY+nxVamgMRNiU+4fF2U6 SMRyNzzk/jS2g== From: Sasha Levin To: stable@vger.kernel.org Cc: Luca Ceresoli , Marek Vasut , Sasha Levin Subject: [PATCH 6.1.y] drm/bridge: ti-sn65dsi83: halve horizontal syncs for dual LVDS output Date: Wed, 18 Mar 2026 12:14:22 -0400 Message-ID: <20260318161422.911810-1-sashal@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <2026031723-concierge-satisfied-da22@gregkh> References: <2026031723-concierge-satisfied-da22@gregkh> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Luca Ceresoli [ Upstream commit d0d727746944096a6681dc6adb5f123fc5aa018d ] Dual LVDS output (available on the SN65DSI84) requires HSYNC_PULSE_WIDTH and HORIZONTAL_BACK_PORCH to be divided by two with respect to the values used for single LVDS output. While not clearly stated in the datasheet, this is needed according to the DSI Tuner [0] output. It also makes sense intuitively because in dual LVDS output two pixels at a time are output and so the output clock is half of the pixel clock. Some dual-LVDS panels refuse to show any picture without this fix. Divide by two HORIZONTAL_FRONT_PORCH too, even though this register is used only for test pattern generation which is not currently implemented by this driver. [0] https://www.ti.com/tool/DSI-TUNER Fixes: ceb515ba29ba ("drm/bridge: ti-sn65dsi83: Add TI SN65DSI83 and SN65DSI84 driver") Cc: stable@vger.kernel.org Reviewed-by: Marek Vasut Link: https://patch.msgid.link/20260226-ti-sn65dsi83-dual-lvds-fixes-and-test-pattern-v1-2-2e15f5a9a6a0@bootlin.com Signed-off-by: Luca Ceresoli [ adapted variable declaration placement ] Signed-off-by: Sasha Levin --- drivers/gpu/drm/bridge/ti-sn65dsi83.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi83.c b/drivers/gpu/drm/bridge/ti-sn65dsi83.c index 52008a72bd49a..9bf0a6d252e5b 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi83.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi83.c @@ -325,6 +325,7 @@ static void sn65dsi83_atomic_pre_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) { struct sn65dsi83 *ctx = bridge_to_sn65dsi83(bridge); + const unsigned int dual_factor = ctx->lvds_dual_link ? 2 : 1; struct drm_atomic_state *state = old_bridge_state->base.state; const struct drm_bridge_state *bridge_state; const struct drm_crtc_state *crtc_state; @@ -452,18 +453,18 @@ static void sn65dsi83_atomic_pre_enable(struct drm_bridge *bridge, /* 32 + 1 pixel clock to ensure proper operation */ le16val = cpu_to_le16(32 + 1); regmap_bulk_write(ctx->regmap, REG_VID_CHA_SYNC_DELAY_LOW, &le16val, 2); - le16val = cpu_to_le16(mode->hsync_end - mode->hsync_start); + le16val = cpu_to_le16((mode->hsync_end - mode->hsync_start) / dual_factor); regmap_bulk_write(ctx->regmap, REG_VID_CHA_HSYNC_PULSE_WIDTH_LOW, &le16val, 2); le16val = cpu_to_le16(mode->vsync_end - mode->vsync_start); regmap_bulk_write(ctx->regmap, REG_VID_CHA_VSYNC_PULSE_WIDTH_LOW, &le16val, 2); regmap_write(ctx->regmap, REG_VID_CHA_HORIZONTAL_BACK_PORCH, - mode->htotal - mode->hsync_end); + (mode->htotal - mode->hsync_end) / dual_factor); regmap_write(ctx->regmap, REG_VID_CHA_VERTICAL_BACK_PORCH, mode->vtotal - mode->vsync_end); regmap_write(ctx->regmap, REG_VID_CHA_HORIZONTAL_FRONT_PORCH, - mode->hsync_start - mode->hdisplay); + (mode->hsync_start - mode->hdisplay) / dual_factor); regmap_write(ctx->regmap, REG_VID_CHA_VERTICAL_FRONT_PORCH, mode->vsync_start - mode->vdisplay); regmap_write(ctx->regmap, REG_VID_CHA_TEST_PATTERN, 0x00); -- 2.51.0