From nobody Mon May 25 06:43:33 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 C1FBF3CCA1E for ; Sun, 17 May 2026 18:15:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779041728; cv=none; b=GfjuJhw+TB/b5JObWAzzNPHNybcYRK30oNZBlK+NzsyrxdWnGRyM2dMkajjtsfDKvVEKeklekIuOaLPIsGY95nBAc529gPJTBW8/3UQHTEy4kBAI2zQSgn3F+pYpOS2IsTP5jJxhzwhoNDidr9hoASZ2Krhh5pumGjNTZLI5dbs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779041728; c=relaxed/simple; bh=AlfiRnUTYlnLh6bBfEE3exDDg/60WkYe3iXs5p+uUsw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=h0BjsYZQmpCja4OO58f78vhAeo/mJQRxe7magB4D76alh3G8lDzgA7/n/cXORCKm9Bvjxe4UmRpIUBx68to1rut8PcARPtRy3A0FhSPy0jNDvhiqeTRp3OmmAiGakEdvanPpu1Ry261bb3pnTUsQGJyvScy9IReuKZYPhNEQqmY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=TuxZwDbN; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=cJlIgvJu; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="TuxZwDbN"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="cJlIgvJu" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64GKUVP91912590 for ; Sun, 17 May 2026 18:15:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=qcppdkim1; bh=VkAux7c99nCmiCstfqghQP 2WfhLSd2R/WBDymk4hXZY=; b=TuxZwDbNIggtPHJPn6YN53KGVKM44J77MGRI9A N7ZOONWOuX+thiIhSM52Ie+o93HxTUJQ0QBN1NzG/kd9N2Tm2kWOJi0834nh1A3f gj+Xfjgv1sbvQOh5w3mtbbOvxWkVfJxqbkCktW8lg4d/r60ta/9w7Zjm0BboZGrp tU9ULCNV8iVNY29Vuomp82x6uDASbNELEKb6ko8qpEI8acRjC/6JZne3b9CY8obP zbxtaWDtn6qiUx1c+E32qu4UUYMlSBPkg1PEKotI4RGNtv5MgJv7EMW01nUJQWeU Rn8zWqiaoMtyMI0jKyx674BDQk9QS81Mjlu6+N+KnIj8qW5Q== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e6tvcj7r2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 17 May 2026 18:15:25 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-365d8e0efaeso520417a91.1 for ; Sun, 17 May 2026 11:15:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779041725; x=1779646525; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=VkAux7c99nCmiCstfqghQP2WfhLSd2R/WBDymk4hXZY=; b=cJlIgvJu7m53LuhgGoHid5QbPytt4VrQGO5j8X+hLUeSRwg1tWtR9QV0q+o8IXOiXt +OS3ZA298H4TaQqFv0FzaNF953BuJKfRC1JX+AeRgUGMUKIx+qVHVuhoAtypy8z5hRTP uT1loBV2NS1S3z0Z2Jiw//nBGVolhn2LWmNKRqKCPkO32UoUA3v9ADSDjLX0eDgP/iKs AUlN9nj4wS9OgPjRg/iVh97ML2QpMzXQJX8fEKaDUepnB7hNDwvg64ec1ltmS00miEKs xSgJRWUbYm0PfgvGeVhwtYN0QYyAhweIwdeB6iJEmLdczirNYaHRwFUDtZ/NIqd+mvQf /JKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779041725; x=1779646525; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=VkAux7c99nCmiCstfqghQP2WfhLSd2R/WBDymk4hXZY=; b=O2flLCBi7GBRiM4V7qR7XL4QuBENtXVeJH3ezhd+y/q+CGHZxgURKBqw1bpqv3wpFU 7VsIcHvFO2laPS3NjGHdCg/gpIYEnIfPkXZPSJOZdtzTMInQQrwBFjVmbWnizP7e+V7e Zgf6MB2johRI2KpfL0CT4OwxoiWzrFiDuQyAej6lhFhexMeGhHPJYSKCN69QlY6U78mB 0QM7bnYI1+3MdwZAomt3ApMVovYfQObjS4iJIp0y/E1TMYJ+vX3/7FQDTHewF8i8Je01 vpkyXt1+s9Syysrgu1u89T7rmx1VZ/1AI0KUNl3LL/dkM5ZVCUHz6fsXgHHL4kRqtk3g 4L4g== X-Forwarded-Encrypted: i=1; AFNElJ/ouE16welc3xabWQBNY9xsa7LgVXdeetr1Yalo00ULOZI4+PP+9hJIkVQwkILjWsDxprPVJqK/yFKUqpU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/C28X8IYW9HjqcAsvdptzJkVUYQuLoicWl/xyA/d6YIHh3PRu xFGZeul6do4N9I04HThlPEW4o7YGGfiwnkKn/VKjw+S6RWGRSDow7xCgEZ3xmmTOZ2CrTbuNELk ySu5BTpTCroQAQ3StBGkcevdkHOR+jUOBZ9eM22MdQfOjPBvSTJoWAtvjeqUMnN7uPiE= X-Gm-Gg: Acq92OEumEj5UpCGdgJQSQQrtYsKXlyDZGjxpB25JtM+kCS/Gj7hZhrdeXmAgBwzk7f +vZNsfp6g+PB54g7UnP+5F0MVieEw3J+Tnreo667z7S9wALmd7rwEePe/c58buLNub4iIvak6Eh QmGBPAsCmrYtoPOeSElwX9qWX3/16iylTl41zMv0qyqFK0Z6eA4sH6/uvwvEdgVD8lvW7vnk2Pz CePTnvdLYPJwd+hM1Ni2DI6Zwf8YyGlUjfE5pBU0tkyUgsHhEuFbWuYfuxKL/G79UBvK5ojKZ8R yArpdRStIvr2+eZK84HA/t6JJT2dV1gdwsMWPTU1zzfVZgpGY6wqELa4nxhue98eC5vYX73T8k7 w4WPd6cZoIToxyyIKgdCcldBwaF3bVWzS/NIxA9f5P3h30kt5yFkJhitKBFC1WpPj0F9e2P++3t slO8b7dZ4uj/J44yvCHJfK9ejxdzUEJXoZYBZw4a2Szw== X-Received: by 2002:a17:90b:2743:b0:368:65d4:486b with SMTP id 98e67ed59e1d1-36951b8707cmr6990120a91.3.1779041725232; Sun, 17 May 2026 11:15:25 -0700 (PDT) X-Received: by 2002:a17:90b:2743:b0:368:65d4:486b with SMTP id 98e67ed59e1d1-36951b8707cmr6990105a91.3.1779041724767; Sun, 17 May 2026 11:15:24 -0700 (PDT) Received: from hu-vishsain-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3695a09e95esm3311021a91.9.2026.05.17.11.15.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 May 2026 11:15:23 -0700 (PDT) From: vishnu.saini@oss.qualcomm.com Date: Sun, 17 May 2026 23:44:49 +0530 Subject: [PATCH] drm/bridge: lt9611uxc: support displays with up to 4 EDID blocks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260517-lt9611usc_edid34_misc_next-v1-1-5e2fd8c6399b@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAJgFCmoC/x3M0QpAMBSA4VfRubbaDiNeRRJ2cIrRNlLy7pa7/ 7v5H/DkmDzUyQOOLva82wiVJjAuvZ1JsIkGlFhIrUqxhqpQ6vRjR4ZNlncbx7Z0BzFI1BUakgN qiIPD0cT3P2/a9/0ABHFuomwAAAA= X-Change-ID: 20260517-lt9611usc_edid34_misc_next-b02592de0b25 To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, prahlad.valluru@oss.qualcomm.com, Ravi Agola , Vishnu Saini X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779041718; l=5489; i=vishnu.saini@oss.qualcomm.com; s=20251113; h=from:subject:message-id; bh=PVnlx+qXF4KKGq77JzeXOV4FGhSmay/AfUHJ3roX32g=; b=b9eoNwVV6IR/WBsw+qw4BWlxlqf1byjwchgMv0zFVrMpo73ITCL9TbMNpwTVpzV5u+6VdCosT ckMSGmAu27vAevU+6WCbh/gLyEeMIZJdGmlSOU5YPlzAKnbitSsvjcs X-Developer-Key: i=vishnu.saini@oss.qualcomm.com; a=ed25519; pk=8hlXlF8j/3GeOaDK3w2LYhkv9FanCQru0c7kRH/It7k= X-Proofpoint-ORIG-GUID: Xu2TiUwRPxhJdt_iUwp_IJ1BlDI8xHMG X-Authority-Analysis: v=2.4 cv=UIDt2ify c=1 sm=1 tr=0 ts=6a0a05bd cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=ptdtENT6H51gLo5mYI8A:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 X-Proofpoint-GUID: Xu2TiUwRPxhJdt_iUwp_IJ1BlDI8xHMG X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE3MDE5NyBTYWx0ZWRfXzpSnkugR4tMw XU4Nv5upM6aHjDJzqCJzpOpNUahPRBFRErG6u23DcFqHKIh8W8uAn5YOaTduRwsuXvRiP65hlLC WT8CT4Uy/6sY8yb9/7O+9GAtU9GKDN1jY6eU6GymCCKcRfscSOXd97KBtKZkMnhKbXvuZMjh/rd W1gdUNaeVWgra49h3v/ON3hDA2JaDaPYDPRPEeRnI1K4RqsbKLzCWYn8yJgB9q0s9SNKrCATzTn BIJNiCd5NHZEMBSsaGgrclnZX1W/yJstJo0cqOErw+O5GP5/5Ri7oNTeqnAMdIL2R2KsT96eWnX Kh98TvuAkFRKuXaGgipX654sXHaTkQwqFQb+0cguUw9BXk+bQv5ItkA/R6UsyREum8VejtZXaT6 lYCIl9JG76gLwhVcZdpB3MBpTXrmBVkVZ3mPxPSZu7XzQ62B/XT68UGrN0mDfql1uTjJbqMuG6P Z7gwtSq7R0oSWNtq/oQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-17_04,2026-05-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 impostorscore=0 phishscore=0 priorityscore=1501 bulkscore=0 suspectscore=0 malwarescore=0 spamscore=0 clxscore=1015 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605170197 From: Ravi Agola The LT9611UXC bridge can fetch only 2 EDID blocks at a time, which previously limited EDID reading to 2 blocks and prevented support for displays exposing more than 2 EDID blocks. Extend the driver to support up to 4 EDID blocks by re-triggering EDID access after the first 2 blocks are read. For block 2, clear the EDID ready flag in 0xb02a so the bridge can expose the remaining blocks, then retry the read until the expected EDID is returned. Also cache the full EDID blob in the driver and reuse it until the next HPD disconnect event, so repeated EDID reads do not re-query the bridge. Signed-off-by: Ravi Agola Signed-off-by: Vishnu Saini --- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 84 ++++++++++++++++++++++++++= ---- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/b= ridge/lontium-lt9611uxc.c index 11aab07d88df..b5a9f62b9fe3 100644 --- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c +++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c @@ -28,7 +28,7 @@ #include =20 #define EDID_BLOCK_SIZE 128 -#define EDID_NUM_BLOCKS 2 +#define EDID_NUM_BLOCKS 4 =20 #define FW_FILE "lt9611uxc_fw.bin" =20 @@ -61,6 +61,8 @@ struct lt9611uxc { /* can be accessed from different threads, so protect this with ocm_lock = */ bool hdmi_connected; uint8_t fw_version; + + const struct drm_edid *edid_data; }; =20 #define LT9611_PAGE_CONTROL 0xff @@ -170,6 +172,12 @@ static void lt9611uxc_hpd_work(struct work_struct *wor= k) connected =3D lt9611uxc->hdmi_connected; mutex_unlock(<9611uxc->ocm_lock); =20 + if (!connected) { + lt9611uxc->edid_read =3D false; + drm_edid_free(lt9611uxc->edid_data); + lt9611uxc->edid_data =3D NULL; + } + drm_bridge_hpd_notify(<9611uxc->bridge, connected ? connector_status_connected : @@ -384,10 +392,34 @@ static int lt9611uxc_wait_for_edid(struct lt9611uxc *= lt9611uxc) msecs_to_jiffies(500)); } =20 +static int lt9611uxc_read_edid_block(struct lt9611uxc *lt9611uxc, unsigned= int block, + u8 *buf, size_t len) +{ + int ret; + + lt9611uxc_lock(lt9611uxc); + + regmap_write(lt9611uxc->regmap, 0xb00a, (block%2) * EDID_BLOCK_SIZE); + + ret =3D regmap_noinc_read(lt9611uxc->regmap, 0xb0b0, buf, len); + if (ret) { + dev_err(lt9611uxc->dev, "edid block %d read failed: %d\n", block, ret); + lt9611uxc_unlock(lt9611uxc); + return -EINVAL; + } + lt9611uxc_unlock(lt9611uxc); + + return ret; +} + static int lt9611uxc_get_edid_block(void *data, u8 *buf, unsigned int bloc= k, size_t len) { struct lt9611uxc *lt9611uxc =3D data; - int ret; + int ret =3D 0; + int retry_cnt =3D 10; + int edid_ext_block; + const u8 edid_header[8] =3D { 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00 }; =20 if (len > EDID_BLOCK_SIZE) return -EINVAL; @@ -395,19 +427,39 @@ static int lt9611uxc_get_edid_block(void *data, u8 *b= uf, unsigned int block, siz if (block >=3D EDID_NUM_BLOCKS) return -EINVAL; =20 - lt9611uxc_lock(lt9611uxc); + if (block =3D=3D 2) { + lt9611uxc_lock(lt9611uxc); =20 - regmap_write(lt9611uxc->regmap, 0xb00b, 0x10); + /* Read number of block available in EDID data */ + ret =3D regmap_read(lt9611uxc->regmap, 0xb02a, &edid_ext_block); + if (ret) { + dev_err(lt9611uxc->dev, "edid block read failed: %d\n", ret); + lt9611uxc_unlock(lt9611uxc); + return ret; + } =20 - regmap_write(lt9611uxc->regmap, 0xb00a, block * EDID_BLOCK_SIZE); + /* Reset EDID ready flag so that lt9611uxc can read 2nd and 3rd block */ + regmap_write(lt9611uxc->regmap, 0xb02a, (edid_ext_block & (~BIT(3)))); =20 - ret =3D regmap_noinc_read(lt9611uxc->regmap, 0xb0b0, buf, len); - if (ret) - dev_err(lt9611uxc->dev, "edid read failed: %d\n", ret); + lt9611uxc_unlock(lt9611uxc); =20 - lt9611uxc_unlock(lt9611uxc); + msleep(100); =20 - return 0; + ret =3D lt9611uxc_read_edid_block(lt9611uxc, block, buf, len); + + /* + * Compare first 8 bytes of EDID header (0th block) and 2nd block to con= firm + * that 2nd EDID block data is read successfully by lt9611uxc + */ + while (!ret && 0 =3D=3D memcmp(&edid_header, &buf, 8) && retry_cnt-- > 0= ) { + msleep(100); + ret =3D lt9611uxc_read_edid_block(lt9611uxc, block, buf, len); + } + } else { + ret =3D lt9611uxc_read_edid_block(lt9611uxc, block, buf, len); + } + + return ret; }; =20 static const struct drm_edid *lt9611uxc_bridge_edid_read(struct drm_bridge= *bridge, @@ -425,7 +477,17 @@ static const struct drm_edid *lt9611uxc_bridge_edid_re= ad(struct drm_bridge *brid return NULL; } =20 - return drm_edid_read_custom(connector, lt9611uxc_get_edid_block, lt9611ux= c); + /* If EDID is read once, provide same EDID data till next HPD event */ + if (lt9611uxc->edid_data =3D=3D NULL) { + lt9611uxc->edid_data =3D drm_edid_read_custom(connector, lt9611uxc_get_e= did_block, + lt9611uxc); + } + + /* + * Copy the EDID data and return the copied value which will be freed by = DRM. + * The original EDID data is cached in the driver until the next HPD even= t. + */ + return drm_edid_dup(lt9611uxc->edid_data); } =20 static void lt9611uxc_bridge_hpd_notify(struct drm_bridge *bridge, --- base-commit: 4c26e162947f91aa78ba57dd4fddd38fc80e7d60 change-id: 20260517-lt9611usc_edid34_misc_next-b02592de0b25 Best regards, --=20 Vishnu Saini