From nobody Tue Sep 29 00:32:57 2026 Received: from mx0a-0002e601.pphosted.com (mx0a-0002e601.pphosted.com [148.163.150.75]) (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 ABE78274B46 for ; Fri, 14 Aug 2026 12:04:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.150.75 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786709057; cv=fail; b=bAVU121e06AkX0MVfMI5dDubICc3ZBr3YbSzLmEEwYkEOzpe9pe6vje4ZhMmC4j91bZQ1k2dIWn7NZzxzKFHs17KFqW4oPxHvcgvw1QfRTJjub1RwMnRwQHdvIVZ+zJnXflu5TBmvucMXxkN5a/XVn4IBPbbuipZ+4WVjkudKSM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786709057; c=relaxed/simple; bh=WrTXv+BzsgB04HN0J+6PagDoHW2sijydMgi9pZ8hnsY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=h1NuEJaHYRLuBZ2Wy6PrS6/c9tzuccTkSOQp3OiKjXAOhTUvaWrv7vXKhPF3mDJ8vmaWZqXoc8wLtB7ePsyyEsmI6WzB1TcxL2SSE5mc7oxVfpzJRpms9jsCpZbNSRU6cijFwIrUXjICW3i2YEM4BzWQWlk1jWTRxBF4VDWArQ8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (2048-bit key) header.d=ti.com header.i=@ti.com header.b=op0UovrQ; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=IVvxXlmE; arc=fail smtp.client-ip=148.163.150.75 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ti.com header.i=@ti.com header.b="op0UovrQ"; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="IVvxXlmE" Received: from pps.filterd (m0384305.ppops.net [127.0.0.1]) by m0384305.ppops.net (8.18.1.11/8.18.1.11) with ESMTP id 67EAe9Qd1504062; Fri, 14 Aug 2026 07:03:50 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= proofpoint-05-2026; bh=PDKol98qsP1d2nOpzi7pz1ogPnsB8mOIRsTlUQaJW ws=; b=op0UovrQhMTlTOdfBdH3NYmvzDaOYp8P98c4ldSYA6oUe8LTlOjOdJwU4 Gpe+iE7oWarMrUtTBuQ8vceTMu7d6E67s6vWmUZS/eWhWGRiRjVw1UR3GO1Y3r7a XGf3SzWDA5RDtBAvMAOzy6LwGe9ZipIrUvxpHSi513DAF5uvhuz1Q/sxQjMQ+SWq Wml56vJ9NVyz5I24ZQoKqbDtFEJosZlDZbP3cfXWXVsMRoTGwAfTmtcHa62LjV3I 1UDGc3QNcDbgB+UBOMhs7/Lip71H4j5tTiAxARfoGH8vfXU4pWIyLdVriW7XmeGN ZjEL5N8JI7SXvOuu+ziwF6qj+RI5Q== Received: from ch4pr04cu002.outbound.protection.outlook.com (mail-northcentralusazon11013066.outbound.protection.outlook.com [40.107.201.66]) by m0384305.ppops.net (PPS) with ESMTPS id 4g1tryj7g8-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 07:03:49 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BhyMOkJYSwot0IJ8KtzMVTanKgu8bGRq5+403V7DRMRdgF0y/rkaIUncmExd4vEQBgZ3HpBZPndUxRYmN7Q/r3PVm42JeXKJvSRDB3wZGMifDgRXzzN56/GaMNYexX/EPfeDNbZJksEHuf5/I3f2qDDmPBoBF2/NoFA+1+J6nD053/YMBmNX1AJPCdhvlEAMMPSmkDOE6k7dDRqaBjEd6vypJ2r443mp6mGFie2FZZ5sUGGLlzhncMp3nRKRbNMzDKACVUt4BuhVlolcIVt4GQrcO1WsVx/AgN1uF2D/3JF6BWqOKsE3o4RjMaA37SnLYkXSHXPPive3YgJRZqn/+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PDKol98qsP1d2nOpzi7pz1ogPnsB8mOIRsTlUQaJWws=; b=wdSfGFKMhC8+AbDFizfdc0e1yJSRsusoEYs3nY+uonRDnCfZ8zS0hMobb4vG0JP9ebhw0NLVWAjs/RfLqAAyT4RGlNMzXljpuKuZlGdyLyDyrteotEpqRzbSFQ7o6fSL5NmFjzgB3l3LQwluaDBjZ/NQkuqN/LhG9Q6I8sOXzBI9ZnLPmFlUU+a1Rl7QvuwV30asyL19qWgzNpSQbhadKmyoCzmpHRPr3ArHLcWooMo9jOkAaBgi/EQTTYzLEyPbVGNptJqCo4T850OAZtDUUCx6tJ/gooukhN5wBffbyiRmgl8K0aqCsQy2Cl9/ktkv5pnrbcw/oIEU27ddLCwIqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.194) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PDKol98qsP1d2nOpzi7pz1ogPnsB8mOIRsTlUQaJWws=; b=IVvxXlmE1AYU8rNRhrRmthYLQGHhgDo6fHcAhyIwEyxzdAFu9A8mBgSm5+yfO6U4NuCQFL+g+rf0lVSEUvRMT9S2isn+sON+OjSPoooDif20OFPFEHmfOXAGOHkC/bQ2Prl6oNuWy0SrHuwS96Ln64yMsJnwrG8McyNBP5/R+WI= Received: from LV3P220CA0006.NAMP220.PROD.OUTLOOK.COM (2603:10b6:408:234::9) by DS0PR10MB6896.namprd10.prod.outlook.com (2603:10b6:8:134::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.315.15; Fri, 14 Aug 2026 12:03:42 +0000 Received: from BL02EPF0001A103.namprd05.prod.outlook.com (2603:10b6:408:234:cafe::6f) by LV3P220CA0006.outlook.office365.com (2603:10b6:408:234::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.315.16 via Frontend Transport; Fri, 14 Aug 2026 12:03:42 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.194; helo=lewvzet200.ext.ti.com; pr=C Received: from lewvzet200.ext.ti.com (198.47.23.194) by BL02EPF0001A103.mail.protection.outlook.com (10.167.241.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.3 via Frontend Transport; Fri, 14 Aug 2026 12:03:40 +0000 Received: from DLEE209.ent.ti.com (157.170.170.98) by lewvzet200.ext.ti.com (10.4.14.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45; Fri, 14 Aug 2026 07:03:40 -0500 Received: from DLEE200.ent.ti.com (157.170.170.75) by DLEE209.ent.ti.com (157.170.170.98) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45; Fri, 14 Aug 2026 07:03:39 -0500 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DLEE200.ent.ti.com (157.170.170.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45 via Frontend Transport; Fri, 14 Aug 2026 07:03:39 -0500 Received: from yashas.dhcp.ti.com (yashas.dhcp.ti.com [10.24.53.80]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 67EC3Oba1679011; Fri, 14 Aug 2026 07:03:34 -0500 From: Yashas D To: Douglas Anderson CC: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , "Jernej Skrabec" , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , , , , , , , Subject: [PATCH 1/2] drm/bridge: ti-sn65dsi86: improve HPD interrupt handling Date: Fri, 14 Aug 2026 17:33:03 +0530 Message-ID: <20260814120304.887993-2-y-d@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260814120304.887993-1-y-d@ti.com> References: <20260814120304.887993-1-y-d@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL02EPF0001A103:EE_|DS0PR10MB6896:EE_ X-MS-Office365-Filtering-Correlation-Id: d62d66f3-6e79-45d7-bb7d-08def9fc1494 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|36860700016|82310400026|23010399003|376014|1800799024|56012099006|10067099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: qBLIl2RW8DJGbrwMwHp9plqBwQOt/4oaAU0npGLobC53/kfkpJOhfaFzKkej3mac3gLL4etagJExNFDK+2medelgiX5+pq0ruwxdu0i1JoOx5ieyQ+PfQ/myu0lUbmJ+gfqBLc6foEQlIW0Dw//K1OmkKaNxc3QtHC+nLdX9bUWXM9TJplCRrHUWhUJQWkK7k4ndk7cvXiuntORSHBf5zBdyyQ2YNv/XILZLSy1/MmSatfWw7JdqxDP34aYXoZFPyEJ6NlUIluhKDwAj7d3E8bSR3hfMWsgebkM8S12+5DB8Gj1yI7H2eIsFy/NvHvMdXnS+kFh/y3l27fIRTiK1C4i5qbm3qbuKCOsv18RYdJNmkHLa0eZ9MCQ9NpK7rUndjc/qM2Jxfx99N5Dqmf8TGShzdmd3wX+Jespb0YOjGwlJFJnihrEK0CAMqicjzmY9c1u0rBCu9R/f5SWUTZlmI5I147N8P6/8jY4gCvZe7RAxWreuh1YZCHB1+ww6zMh95henzVUJQ3NphdjZmh11e0oGN6fJALToNq+NdftAuaaRj7deWqCm0dkWlA01h+X9aACbnCxoAlVMHTOWY6LCpRnJKU7A06QRPxRRuevrDyIFYuiMqqzEiubECXAWUs7SV5otaCvWysfWGanHSqfHs8oag4KTjINQVCcnHsu53rwxW4oto04kIKuA5y+/OVlnE9DsyIXk82mNlGOjIfWsFQ== X-Forefront-Antispam-Report: CIP:198.47.23.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet200.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(7416014)(36860700016)(82310400026)(23010399003)(376014)(1800799024)(56012099006)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pjCgUejpWWM0rcORQjlXyIwA/AZAQ1DEy3flspVUER2YBcTznWPrv9ODucPW4Lop0akbGgCWYYGXWGnTCFOHCP7jJvUCTBxUCL9DJwsiQNSzTUUSEzpUZsghfEkxLQ2AbrTuikSX7S0gIPUf6RGiWTxl37MdU9z8G2WhMLVLIiEHJwO/KvqzJ0CfXa3wHQmk1cnMxL3F7tU+RTI52tVNGMwDIsY/OUhYw2ew46tEL8PLm51xzw3IE5UPhQgayPkzp+ioRk9Y1c2tYiKh6AOv3ZtycFuJdbOIyi7RdkIKSzKMQQm4YkX2w6AhSSDB6J3mjl9qeNNNdsB23QnSz/SLyRdXcbHlQzQLY0Yh8b+ZPEMhIa/9VCc/0dp0puPRJ0nPd0Q1PaUwFRoIl5ewJSiDcsGOM1a/JMGlodLEGrufILNYKf7e6q6OnKkrcvls6C2w X-Exchange-RoutingPolicyChecked: lZmyDJcmFzEhmZKVk/WUNls/vqAUnehNXNM4rlafeC6ED+HqRiAaME1id3EEl/bVWEvESzOJVuunseTlQN0bqOHPsT0IbQjgRRez8OROS+IjpVuEaWZzaAHJ2740GmFpo1WeNNKQpHodbJlmaNgQrPhjXc2WVjlol5//WLPe24baXrKsNXrrylfooAmvhkZQdHjbNzRC95SBKz2by/2VldykLhlADoe57csjFugYW3lh0Ii8AmpuKdeV7D5doVacXPjIqTvIoWjl8099MYhhHrmBw6fncW0W74Xdh2HU+6+Tus4kUjpKOCHUuHyCGXxLIW+GmgN7I7HiPISQLcoUWQ== X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Aug 2026 12:03:40.4294 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d62d66f3-6e79-45d7-bb7d-08def9fc1494 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.194];Helo=[lewvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: BL02EPF0001A103.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB6896 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDA5MSBTYWx0ZWRfX1XeFhYmoe/J1 NtZHjaCPeMnUFtH3YPoucrbIbhudhwWSHjFskNxcRNnK74CZT0ZjCRjj9xZJGiAPZYTVYevqxIj M+02Wwy61GQvqiflouGgIKhS91oAe+ajAXQCg5R0UmF5y31C+8bI+ENB5bCSS89tHDi7//YX6zB 2nadOC3GHJCpRDX/FnAN1ZBMsLObTW0Z/2ipuVM85OrXGL67JazTe93h3VUNG8tItdBg1yAAxZV ZNwor6L3veEUMignodsPX65QoCVM6amkFfRe47RyU8SG/vdItRbu5xNwqnmjxOarlm6KpiaAWdz 3prT7+1YngxJu4dR00CzJEXJMvnNBjrfj5AKzqnXpKcSN+wsYNejPMzj8/EFTTvq658ly/cK5LY zZqxjReJuN8lgena8oXsQtXrrstqH2BO39ON9r7ply+bnLbi5zRfoDggXCtDPwewS14dZsllwGj 2bPDPozunHr+e39eH6A== X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDA5MSBTYWx0ZWRfX0MCfwid12qjc Kb+JkibEI4BCwVETNi7jfCamHvArxG9CjVR+ZcCiy1Y5deqSk4Pjqh3nNxQOeEqi565lsvGdKY7 4PP8XTxMORmeECQkB7i1J39LRkIqhwo= X-Proofpoint-GUID: sqWLaU5ohI_OL9NBf7yrgxohVcxDjY09 X-Authority-Analysis: v=2.4 cv=H87rBeYi c=1 sm=1 tr=0 ts=6a7f0425 cx=c_pps a=2KosHvP3s5kmPOqSYQ0Nog==:117 a=WotqVVQAdb04rnGuttW3Kw==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=Sv0fKeRqtYgA:10 a=s63m1ICgrNkA:10 a=V5UXEbMT0ywA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Z8NIEmU8O1QQgoT56wFK:22 a=taLDd7a_hP9WKsMzeGRc:22 a=sozttTNsAAAA:8 a=s8YmhFUlCT5EURy-xugA:9 X-Proofpoint-ORIG-GUID: sqWLaU5ohI_OL9NBf7yrgxohVcxDjY09 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_04,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 clxscore=1011 priorityscore=1501 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140091 Content-Type: text/plain; charset="utf-8" Fix the interrupt handler to clear all three IRQ status registers to fully de-assert the IRQ pin, enable replug event detection, and use per-connector hotplug notification instead of polling all connectors on every DP HPD event. Signed-off-by: Yashas D --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 34 ++++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge= /ti-sn65dsi86.c index 48b83df9aed6..d9bd4ef8f0e2 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -113,14 +113,19 @@ #define SN_IRQ_EVENTS_EN_REG 0xE6 #define HPD_INSERTION_EN BIT(1) #define HPD_REMOVAL_EN BIT(2) +#define HPD_REPLUG_EN BIT(3) =20 #define SN_AUX_CMD_STATUS_REG 0xF4 #define AUX_IRQ_STATUS_AUX_RPLY_TOUT BIT(3) #define AUX_IRQ_STATUS_AUX_SHORT BIT(5) #define AUX_IRQ_STATUS_NAT_I2C_FAIL BIT(6) #define SN_IRQ_STATUS_REG 0xF5 +#define HPD_REPLUG_STATUS BIT(3) #define HPD_REMOVAL_STATUS BIT(2) #define HPD_INSERTION_STATUS BIT(1) +/* General IRQ status registers, write-1-to-clear */ +#define SN_IRQ_STATUS2_REG 0xF0 +#define SN_IRQ_STATUS3_REG 0xF2 =20 #define MIN_DSI_CLK_FREQ_MHZ 40 =20 @@ -1266,7 +1271,7 @@ static void ti_sn_bridge_hpd_enable(struct drm_bridge= *bridge) =20 if (client->irq) { ret =3D regmap_set_bits(pdata->regmap, SN_IRQ_EVENTS_EN_REG, - HPD_REMOVAL_EN | HPD_INSERTION_EN); + HPD_REMOVAL_EN | HPD_INSERTION_EN | HPD_REPLUG_EN); if (ret) dev_err(pdata->dev, "Failed to enable HPD events: %d\n", ret); } @@ -1280,7 +1285,7 @@ static void ti_sn_bridge_hpd_disable(struct drm_bridg= e *bridge) =20 if (client->irq) { ret =3D regmap_clear_bits(pdata->regmap, SN_IRQ_EVENTS_EN_REG, - HPD_REMOVAL_EN | HPD_INSERTION_EN); + HPD_REMOVAL_EN | HPD_INSERTION_EN | HPD_REPLUG_EN); if (ret) dev_err(pdata->dev, "Failed to disable HPD events: %d\n", ret); } @@ -1376,7 +1381,6 @@ static int ti_sn_bridge_parse_dsi_host(struct ti_sn65= dsi86 *pdata) static irqreturn_t ti_sn_bridge_interrupt(int irq, void *private) { struct ti_sn65dsi86 *pdata =3D private; - struct drm_device *dev =3D pdata->bridge.dev; u8 status; int ret; bool hpd_event; @@ -1387,23 +1391,35 @@ static irqreturn_t ti_sn_bridge_interrupt(int irq, = void *private) return IRQ_NONE; } =20 - hpd_event =3D status & (HPD_REMOVAL_STATUS | HPD_INSERTION_STATUS); + hpd_event =3D status & (HPD_REMOVAL_STATUS | HPD_INSERTION_STATUS | + HPD_REPLUG_STATUS); =20 dev_dbg(pdata->dev, "(SN_IRQ_STATUS_REG =3D %#x)\n", status); if (!status) return IRQ_NONE; =20 - ret =3D regmap_write(pdata->regmap, SN_IRQ_STATUS_REG, status); + /* + * Clear all three IRQ status registers to fully de-assert + * the IRQ pin + */ + ret =3D regmap_write(pdata->regmap, SN_IRQ_STATUS2_REG, 0xFF); + ret |=3D regmap_write(pdata->regmap, SN_IRQ_STATUS3_REG, 0xFF); + ret |=3D regmap_write(pdata->regmap, SN_IRQ_STATUS_REG, status); if (ret) { dev_err(pdata->dev, "Failed to clear IRQ status: %d\n", ret); return IRQ_NONE; } =20 - /* Only send the HPD event if we are bound with a device. */ + /* Notify only the DP connector, not all connectors on the device. */ mutex_lock(&pdata->hpd_mutex); - if (pdata->hpd_enabled && hpd_event) - drm_kms_helper_hotplug_event(dev); - mutex_unlock(&pdata->hpd_mutex); + if (pdata->hpd_enabled && hpd_event && pdata->bridge.hpd_data) { + struct drm_connector *connector =3D + (struct drm_connector *)pdata->bridge.hpd_data; + mutex_unlock(&pdata->hpd_mutex); + drm_connector_helper_hpd_irq_event(connector); + } else { + mutex_unlock(&pdata->hpd_mutex); + } =20 return IRQ_HANDLED; } --=20 2.34.1 From nobody Tue Sep 29 00:32:57 2026 Received: from mx0a-0002e601.pphosted.com (mx0a-0002e601.pphosted.com [148.163.150.75]) (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 5E16633FE09 for ; Fri, 14 Aug 2026 12:04:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.150.75 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786709100; cv=fail; b=MVqoEOF909YRxXU49pJFJTYDE9BM1rPM7ILcOIeZC55j2HwckRBXXt55SvpOkdAe0WUGgOVJtk8kbfFygZDEsNEEDYodYmhLuyUv6UGaoAemM3c2JJ1J42el2qZNkgoPZvpGdtnHmno0lX5KdAOHGkNVfWTUTyObLAHhbMXQSnw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786709100; c=relaxed/simple; bh=MZrJuuCxkhOotfBpOBZMna138NFcZ9Tod/NZ6map9AY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Lh5jpdh+X7CZrxVofJyz+X+NMBhuT/+fl28cjZkptfI8FoO3/Vo0JCQSg6FALeMXLUZ78tX1LXmpStD34hw+mCm1ga0AMI+jv6By8df8/0jEX+HZJQpHsf11pZlwFW9EcSEdCd7WebR3FtYp9u71EE24Br4L4WZ7250f4Iyq/Sw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (2048-bit key) header.d=ti.com header.i=@ti.com header.b=fwSGJl/H; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=K7TNAee5; arc=fail smtp.client-ip=148.163.150.75 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ti.com header.i=@ti.com header.b="fwSGJl/H"; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="K7TNAee5" Received: from pps.filterd (m0384305.ppops.net [127.0.0.1]) by m0384305.ppops.net (8.18.1.11/8.18.1.11) with ESMTP id 67EAe9431504056; Fri, 14 Aug 2026 07:04:32 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= proofpoint-05-2026; bh=3XYmJSmTj7xU9cL6Ff+0DcWWy/tEIvxQ5HU3cqY3Z 3E=; b=fwSGJl/HlsqKc8TVtnorgQq0XvstBUUVP5lAlun7YgvVnQy19Pp+lm3+c oKBsxIVW8q3FtRGlwT4EQSuEUEjgMqi9X+T/FzhtPpJfKS8cwbdLIqvASyFDx0Ar +LuP1e57CutnnDKMTeJDCpLCbLRyflUrWwJjzF6VCKp4/kgCXuqXf61UjlEbci2R xTH0tH4Z6ObQuvYKjaw3NykwJUv59RcOeUGg9ZDDcSpO2q0mCh832EbWLQobZvJa KS+dYtZ7PppP6MQZ/BgVlcJtn5m0OESgZJIaxxVhWbucK9CXKA0FNZtjPnPt7CV8 i1XHhiNTkNCK6eRL0N9mJYdJgngFg== Received: from sn4pr2101cu001.outbound.protection.outlook.com (mail-southcentralusazon11012003.outbound.protection.outlook.com [40.93.195.3]) by m0384305.ppops.net (PPS) with ESMTPS id 4g1tryj7p8-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 07:04:32 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gbh2akfTSNy4erl8WhGnHAAx4poE64DBnn8wXiI1ejTStXvV8JISULiKU6tiPcC4+U4MkZfjCPRGwPZXFULW0Rtnvf2SUVNRNuMt2rRA4jLj3il5yC7jUQAA0IH9B6+Rs5f5qpd/3KI7TU/nOy4tWuOdguNCCfCkGhNJmBK5Zf1H68DSVzIHOfV9LPU+GF/3CBXNZ70gkfws3eVW4ZAfTFvMPoxojyuhWqNEZSo1oz+dsTiIRbSyh8ejTCL+3uD5f+UuGthX20C0BLIteARxVsqcZvVOR0juAWF7G9mcTS71dPQu+VcmaHH4FS6Dl5HfR+47sgz55sPzItZ1y0NP9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3XYmJSmTj7xU9cL6Ff+0DcWWy/tEIvxQ5HU3cqY3Z3E=; b=MdXClDvAUVcy3uNAUYbc3cF+6qvTm2XxsNwQGwZB+w7DfETGb3Q3x0OFaE3lPcDM3tPnsH3oc/0SLdfwGcgUL7mU9WzenglsmMxKlP8b3XCxJvoE9TNluMuErSGnj0L6STHwmJFBOclXUDPzEnEDoMafi5lSx7ktbgphFnW7uOwTfFz+ghChBeeTcYTFdgqMT2g7stsyHit3kfJAvZt9ocKP8XI9dfqYkwOiiV5qc85niRbLl3Q7P5wiJEnqM1i0Vuv+WN/KVZEUrBR4l6TRGT9HYGLdszgPzld2ty+2Yq7vIysvM6+BzBJsrGbpSRvTaMqLG6DYHbRL/gA4awK88A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.21.195) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3XYmJSmTj7xU9cL6Ff+0DcWWy/tEIvxQ5HU3cqY3Z3E=; b=K7TNAee5v9GCtjg0Fl17Tl9zhI792uZSRpofKTqylAF1l0VY8y68Q/KKmGA8qQYrUpFBkVlaK+Powx/L/d6JcWEb4SHeZLL3YSWatJ2DCSmQLUeurtCn8YbanOKrgqld18KO9tOOJX0K8kw8YyVLSEJty+tfEWZD/Vv1p6bOTh4= Received: from CY5PR15CA0044.namprd15.prod.outlook.com (2603:10b6:930:1b::27) by SA1PR10MB6496.namprd10.prod.outlook.com (2603:10b6:806:2b2::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.315.15; Fri, 14 Aug 2026 12:04:28 +0000 Received: from CY4PEPF0000EE36.namprd05.prod.outlook.com (2603:10b6:930:1b:cafe::4e) by CY5PR15CA0044.outlook.office365.com (2603:10b6:930:1b::27) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.315.16 via Frontend Transport; Fri, 14 Aug 2026 12:04:28 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.21.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.21.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.21.195; helo=flwvzet201.ext.ti.com; pr=C Received: from flwvzet201.ext.ti.com (198.47.21.195) by CY4PEPF0000EE36.mail.protection.outlook.com (10.167.242.42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.3 via Frontend Transport; Fri, 14 Aug 2026 12:04:26 +0000 Received: from DFLE214.ent.ti.com (10.64.6.72) by flwvzet201.ext.ti.com (10.248.192.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45; Fri, 14 Aug 2026 07:03:46 -0500 Received: from DFLE210.ent.ti.com (10.64.6.68) by DFLE214.ent.ti.com (10.64.6.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45; Fri, 14 Aug 2026 07:03:46 -0500 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DFLE210.ent.ti.com (10.64.6.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45 via Frontend Transport; Fri, 14 Aug 2026 07:03:46 -0500 Received: from yashas.dhcp.ti.com (yashas.dhcp.ti.com [10.24.53.80]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 67EC3Obb1679011; Fri, 14 Aug 2026 07:03:41 -0500 From: Yashas D To: Douglas Anderson CC: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , "Jernej Skrabec" , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , , , , , , , Subject: [PATCH 2/2] drm/bridge: ti-sn65dsi86: retrain DP link directly on cable replug Date: Fri, 14 Aug 2026 17:33:04 +0530 Message-ID: <20260814120304.887993-3-y-d@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260814120304.887993-1-y-d@ti.com> References: <20260814120304.887993-1-y-d@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000EE36:EE_|SA1PR10MB6496:EE_ X-MS-Office365-Filtering-Correlation-Id: 72c3f9e5-b42d-48ba-c579-08def9fc300b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|7416014|376014|1800799024|23010399003|6133799003|3023799007|56012099006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: WVSZ9q6+XpuAGXvQHTSZ0XbvZFWRDtQ406mbXKO0w+b9fU0u+WLn/4qfjQ8mTW8N37GeEm62cZonwzzXAzRioQQnaJ0D6LfDG6WsfNAJ4bPUlCyMRDYSIg2adcsjBXV6y4qhuT3sAcR33vEF0Wuy2uhLDyqCHunr2hCqH53QJyrvIip+FBmDjI+NfE+12djVz6PzKP0h14M5MAHfkgn0P9JY2Y90Tf9jMoD0sAangGq5ZOeMxcUwdtOUPE58H1e7rMTspp3u+NiMOi7J7fjA9XWgwpu0nlMfh3ExEKrui387DEPt2IEGO0pUFMIw831Tinblxy2QmpKyv/XECpfoj2UE3+Um0C/sXVFqYJp7Pd+yFAfie4LPJt9WWewtGp1TS70gwkYuLn9KbWFt8mgCUapxKPIsjcqjNkXUw613ysZsneANV93QyY0bgYqKCfXmamxvHTzkFXegopIRYBDrfnsGEuvJtk7/XW2JK1hliOQKE4rmOryNB4fZuBp0KnW2pf6kLYn1V8Z1b2ltm5k5x1NDhJKUnox55HD0Uzepm2MnQzMNT8Ks9INRbNzJebP5g9Rj3iJ6cJIBfSrr63pV2OJRfTdCn1UdkoAjLYWFn67mS/vq7KbXXU/X+pyEgZHx+BJ3KBSkt5rJhIUAjIVVoRTCXb63b5tQaewg3IIKkdv9ZNg4YYSFkrZduDsHiW0yXRNSb9jEc2nTI4CaENb95A== X-Forefront-Antispam-Report: CIP:198.47.21.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:flwvzet201.ext.ti.com;PTR:ErrorRetry;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(7416014)(376014)(1800799024)(23010399003)(6133799003)(3023799007)(56012099006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: CvuZQ8HtRbfSsi42O5+DQarH91hY2dkJgd8yvU41IWSCGuNu4lh0sJ7zu99juT38a/IuDZwceDMiT3fjlJaqXLSP1J9WtIlqoOtXU9U8CyAe5vKRefy/H37ztXpqBZOFVW8Wy95vQYxTuuxsmu9fJOu45HDhocAsgCAKmjuHfkrdm8r+f0vBzTinX4YvbkY9WFJu2MP7vhOanB0iGJE4QLktOwEiVdhZK7gHnkR5W0RWkkhb5nz0Xk+z48LWty5C+BfTENdByCMKsMT/XN+3sr51aj1PWoN5KEfhlGmrQZyl1RqXuOIEE3MYe9/r2UAnaOPG4ha2SZRjqNyXjLg5H/PPXevYeVi3Qehrh/g//LO2d642+MZYjc/qWKBLahZZq3e4SJoc742YttTOAXNN7S1c8kqLLPv+8jO7a4AGjoC0eqwHL2EA4jdkPuy13rWL X-Exchange-RoutingPolicyChecked: AS+mJfSSi0UcjDXrBUHoJzIR7jbd8dStWLyfRboB2v7SXabKWJ4yROw8ek26MhGReUEADj4UgpZR4IBSA1l+GeBxfH6TsYqf3+t2QVVuwDrxz6E2jYwANUX2Y5FizkcZJBj9nJENx7gKPg55wZIi4DVi6z5BaPVALe78J0bedGt0Av4HwTtLE+KaUryfmZG7OBCn1cfd6B35FOaKl2tsf2ToRAud2e7MO7DWbSKpswGJzi0gvealQpP7o9HTekFdes1LOsKWfavHYQWeuRJmNTABYEv8xg+JR3ID0jG4WvDhan+/S+2qoGcPGKAg5cbcZ696p+wq1/wxYbtpDwfAWw== X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Aug 2026 12:04:26.5412 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 72c3f9e5-b42d-48ba-c579-08def9fc300b X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.21.195];Helo=[flwvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EE36.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR10MB6496 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDA5MSBTYWx0ZWRfXy41zvcCLmcbu LdBI8cPLtfJrV8ZEUyBL0WC7V1OozY6XRUf5xxZOg24B9n4bo+kjmj8ffWRjub+21sZPuVXGwUL jkEU0Tq4Ifh4i5/3kGwyCDM403JEhAbvzx0DMXO8OieiB+k/EMC3rpB9B5SV4FMTDuAyNisDF51 T6xMR/+7xQq0axCr3BkMnl2yFA4RyPMLJ107QKUqzyiKZjYSDg89/rgOcq+pABdwBkJpmcjET+P s/3d4d93K4bj8NDlfa6rd2FZEwc4CUSKy7p3PEgmwaM5QVxhc4aDy5cL2MaYMqGiPR7NNuOMlih Ewf6Rt8b39LcUmv8VFOu4X0bhzkjaaIS+uMB4GPQ6taAE63QcthmAI0/vgf7kidpkLZv5BGKG84 BLOdae2XSd62N6sNTaVrzjkWqBjaQmNFo9cuaeJtszfcC8KFR48ABGGw44t0cK6jXgJxGwHGuow MVR4O6XLZSM6QQZlXbA== X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDA5MSBTYWx0ZWRfX9Wb+Hae8KwPU sXVZ2U4H03y1QGGlsObMCIyKEm4sVojQjv5lWaT6Vp8LhjTL0owjPmjWCtWu0TLxT2Lkbnj5fYy ejYqgf8uFjTMd3DphpfWSFwCeyN+Rt8= X-Proofpoint-GUID: pmWd7r-a6y5h6ZjgvL0vod7c4PA5Xjq4 X-Authority-Analysis: v=2.4 cv=H87rBeYi c=1 sm=1 tr=0 ts=6a7f0450 cx=c_pps a=4HEXQ/P5pkaUFkQJdDnQHg==:117 a=tJyPKKxUohctrY4NYmUjkA==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=Sv0fKeRqtYgA:10 a=V5UXEbMT0ywA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Z8NIEmU8O1QQgoT56wFK:22 a=taLDd7a_hP9WKsMzeGRc:22 a=sozttTNsAAAA:8 a=YjtN_N7XWMqpCh5YRzkA:9 X-Proofpoint-ORIG-GUID: pmWd7r-a6y5h6ZjgvL0vod7c4PA5Xjq4 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_04,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 clxscore=1011 priorityscore=1501 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140091 Content-Type: text/plain; charset="utf-8" When a cable is replugged while the upstream display pipeline is still active (e.g. a compositor holds the CRTC), the bridge can retrain the DP link and re-enable the video stream directly from the HPD interrupt work handler without requiring a full DRM atomic commit. This allows applications to recover display output after a cable replug. Signed-off-by: Yashas D --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 215 +++++++++++++++++++++----- 1 file changed, 179 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge= /ti-sn65dsi86.c index d9bd4ef8f0e2..f6f930ca1519 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -212,6 +212,24 @@ struct ti_sn65dsi86 { struct mutex comms_mutex; struct mutex hpd_mutex; =20 + /* + * bridge_enabled, cached_bpp and cached_mode are written by + * atomic_enable()/atomic_disable() and read by hpd_work(); all + * three are only ever accessed while holding hpd_mutex. + * + * Set true by atomic_enable(), false by atomic_disable(). When the + * cable is replugged while true, hpd_work can retrain the link + * directly without a DRM atomic commit. + */ + bool bridge_enabled; + unsigned int cached_bpp; + /* + * Copy of the last adjusted mode programmed by atomic_enable(). + */ + struct drm_display_mode cached_mode; + struct drm_display_mode hpd_mode; + struct work_struct hpd_work; + #if defined(CONFIG_OF_GPIO) struct gpio_chip gchip; DECLARE_BITMAP(gchip_output, SN_NUM_GPIOS); @@ -285,13 +303,32 @@ static struct drm_display_mode * get_new_adjusted_display_mode(struct drm_bridge *bridge, struct drm_atomic_commit *state) { - struct drm_connector *connector =3D + struct ti_sn65dsi86 *pdata =3D container_of(bridge, struct ti_sn65dsi86, + bridge); + struct drm_connector *connector; + struct drm_connector_state *conn_state; + struct drm_crtc_state *crtc_state; + + /* + * hpd_work calls this with state =3D=3D NULL since it runs outside any + * DRM commit and holds no modeset lock. It has already taken its + * own private snapshot (hpd_mode) under hpd_mutex at the start of + * its run, so just return that instead of touching live CRTC state + */ + if (!state) + return &pdata->hpd_mode; + + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); - struct drm_connector_state *conn_state =3D + conn_state =3D drm_atomic_get_new_connector_state(state, connector); - struct drm_crtc_state *crtc_state =3D + crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->crtc); =20 + mutex_lock(&pdata->hpd_mutex); + drm_mode_copy(&pdata->cached_mode, &crtc_state->adjusted_mode); + mutex_unlock(&pdata->hpd_mutex); + return &crtc_state->adjusted_mode; } =20 @@ -833,8 +870,16 @@ static void ti_sn_bridge_atomic_disable(struct drm_bri= dge *bridge, { struct ti_sn65dsi86 *pdata =3D bridge_to_ti_sn65dsi86(bridge); =20 - /* disable video stream */ + /* + * Clear bridge_enabled and disable the video stream under hpd_mutex. + * hpd_work takes the same lock before its own VSTREAM_ENABLE write + * and rechecks bridge_enabled at that point, so whichever of the two + * runs last under the lock decides the final hardware state. + */ + mutex_lock(&pdata->hpd_mutex); + pdata->bridge_enabled =3D false; regmap_update_bits(pdata->regmap, SN_ENH_FRAME_REG, VSTREAM_ENABLE, 0); + mutex_unlock(&pdata->hpd_mutex); } =20 static void ti_sn_bridge_set_dsi_rate(struct ti_sn65dsi86 *pdata, @@ -1092,34 +1137,27 @@ static int ti_sn_link_training(struct ti_sn65dsi86 = *pdata, int dp_rate_idx, return ret; } =20 -static void ti_sn_bridge_atomic_enable(struct drm_bridge *bridge, - struct drm_atomic_commit *state) +/* + * ti_sn_bridge_link_train - configure lanes, scrambler, data format and + * run DP link training. + * + * Shared by atomic_enable() (state from DRM commit) and hpd_work() + * (state =3D=3D NULL, falls back to current CRTC state). + */ +static int ti_sn_bridge_link_train(struct ti_sn65dsi86 *pdata, + unsigned int bpp, + struct drm_atomic_commit *state) { - struct ti_sn65dsi86 *pdata =3D bridge_to_ti_sn65dsi86(bridge); - struct drm_connector *connector; const char *last_err_str =3D "No supported DP rate"; unsigned int valid_rates; int dp_rate_idx; unsigned int val; int ret =3D -EINVAL; - int max_dp_lanes; - unsigned int bpp; - - connector =3D drm_atomic_get_new_connector_for_encoder(state, - bridge->encoder); - if (!connector) { - dev_err_ratelimited(pdata->dev, "Could not get the connector\n"); - return; - } - - max_dp_lanes =3D ti_sn_get_max_lanes(pdata); - pdata->dp_lanes =3D min(pdata->dp_lanes, max_dp_lanes); =20 /* DSI_A lane config */ val =3D CHA_DSI_LANES(SN_MAX_DP_LANES - pdata->dsi->lanes); regmap_update_bits(pdata->regmap, SN_DSI_LANES_REG, CHA_DSI_LANES_MASK, val); - regmap_write(pdata->regmap, SN_LN_ASSIGN_REG, pdata->ln_assign); regmap_update_bits(pdata->regmap, SN_ENH_FRAME_REG, LN_POLRS_MASK, pdata->ln_polrs << LN_POLRS_OFFSET); @@ -1139,7 +1177,6 @@ static void ti_sn_bridge_atomic_enable(struct drm_bri= dge *bridge, if (pdata->bridge.type =3D=3D DRM_MODE_CONNECTOR_eDP) { drm_dp_dpcd_writeb(&pdata->aux, DP_EDP_CONFIGURATION_SET, DP_ALTERNATE_SCRAMBLER_RESET_ENABLE); - regmap_update_bits(pdata->regmap, SN_TRAINING_SETTING_REG, SCRAMBLE_DISABLE, 0); } else { @@ -1147,7 +1184,6 @@ static void ti_sn_bridge_atomic_enable(struct drm_bri= dge *bridge, SCRAMBLE_DISABLE, SCRAMBLE_DISABLE); } =20 - bpp =3D ti_sn_bridge_get_bpp(connector); /* Set the DP output format (18 bpp or 24 bpp) */ val =3D bpp =3D=3D 18 ? BPP_18_RGB : 0; regmap_update_bits(pdata->regmap, SN_DATA_FORMAT_REG, BPP_18_RGB, val); @@ -1159,28 +1195,130 @@ static void ti_sn_bridge_atomic_enable(struct drm_= bridge *bridge, =20 valid_rates =3D ti_sn_bridge_read_valid_rates(pdata); =20 - /* Train until we run out of rates */ for (dp_rate_idx =3D ti_sn_bridge_calc_min_dp_rate_idx(pdata, state, bpp); dp_rate_idx < ARRAY_SIZE(ti_sn_bridge_dp_rate_lut); dp_rate_idx++) { if (!(valid_rates & BIT(dp_rate_idx))) continue; - ret =3D ti_sn_link_training(pdata, dp_rate_idx, &last_err_str); if (!ret) break; } - if (ret) { - DRM_DEV_ERROR(pdata->dev, "%s (%d)\n", last_err_str, ret); + + if (ret) + DRM_DEV_ERROR(pdata->dev, "link training failed: %s\n", + last_err_str); + + return ret; +} + +/* + * ti_sn_bridge_hpd_work - retrain the DP link on cable replug + * + * If bridge_enabled is true the upstream pipeline is still active so + * the link can be retrained directly without a DRM atomic commit, + * allowing applications to recover after a cable replug. + */ +static void ti_sn_bridge_hpd_work(struct work_struct *work) +{ + struct ti_sn65dsi86 *pdata =3D + container_of(work, struct ti_sn65dsi86, hpd_work); + struct drm_connector *connector; + unsigned int hpd_status; + int max_dp_lanes; + unsigned int bpp; + bool enabled; + int ret; + + pm_runtime_get_sync(pdata->dev); + + ret =3D regmap_read(pdata->regmap, SN_HPD_DISABLE_REG, &hpd_status); + if (ret || !(hpd_status & HPD_DEBOUNCED_STATE)) + goto notify; + + /* + * Snapshot what atomic_enable() published under hpd_mutex. + * hpd_mode is only ever written/read by hpd_work, which never runs + * concurrently with itself, so it is safe to use lock-free for the + * rest of this function. + */ + mutex_lock(&pdata->hpd_mutex); + enabled =3D pdata->bridge_enabled; + bpp =3D pdata->cached_bpp; + drm_mode_copy(&pdata->hpd_mode, &pdata->cached_mode); + mutex_unlock(&pdata->hpd_mutex); + + if (!enabled) + goto notify; + + max_dp_lanes =3D ti_sn_get_max_lanes(pdata); + mutex_lock(&pdata->hpd_mutex); + pdata->dp_lanes =3D min(pdata->dp_lanes, max_dp_lanes); + mutex_unlock(&pdata->hpd_mutex); + + ret =3D ti_sn_bridge_link_train(pdata, bpp, NULL); + if (ret) + goto notify; + + ti_sn_bridge_set_video_timings(pdata, NULL); + mutex_lock(&pdata->hpd_mutex); + if (pdata->bridge_enabled) + regmap_update_bits(pdata->regmap, SN_ENH_FRAME_REG, + VSTREAM_ENABLE, VSTREAM_ENABLE); + mutex_unlock(&pdata->hpd_mutex); + +notify: + pm_runtime_put_autosuspend(pdata->dev); + + if (pdata->bridge.hpd_data) { + connector =3D (struct drm_connector *)pdata->bridge.hpd_data; + drm_connector_helper_hpd_irq_event(connector); + } +} + +static void ti_sn_bridge_atomic_enable(struct drm_bridge *bridge, + struct drm_atomic_commit *state) +{ + struct ti_sn65dsi86 *pdata =3D bridge_to_ti_sn65dsi86(bridge); + struct drm_connector *connector; + int max_dp_lanes; + unsigned int bpp; + int ret; + + connector =3D drm_atomic_get_new_connector_for_encoder(state, + bridge->encoder); + if (!connector) { + dev_err_ratelimited(pdata->dev, "Could not get the connector\n"); return; } =20 + max_dp_lanes =3D ti_sn_get_max_lanes(pdata); + mutex_lock(&pdata->hpd_mutex); + pdata->dp_lanes =3D min(pdata->dp_lanes, max_dp_lanes); + mutex_unlock(&pdata->hpd_mutex); + bpp =3D ti_sn_bridge_get_bpp(connector); + + ret =3D ti_sn_bridge_link_train(pdata, bpp, state); + if (ret) + return; + /* config video parameters */ ti_sn_bridge_set_video_timings(pdata, state); =20 /* enable video stream */ regmap_update_bits(pdata->regmap, SN_ENH_FRAME_REG, VSTREAM_ENABLE, VSTREAM_ENABLE); + + /* + * Publish cached_bpp and bridge_enabled under hpd_mutex. hpd_work + * reads both under the same lock, which also makes every write this + * function made above (dp_lanes, cached_mode via + * get_new_adjusted_display_mode()) visible to it. + */ + mutex_lock(&pdata->hpd_mutex); + pdata->cached_bpp =3D bpp; + pdata->bridge_enabled =3D true; + mutex_unlock(&pdata->hpd_mutex); } =20 static void ti_sn_bridge_atomic_pre_enable(struct drm_bridge *bridge, @@ -1270,6 +1408,14 @@ static void ti_sn_bridge_hpd_enable(struct drm_bridg= e *bridge) mutex_unlock(&pdata->hpd_mutex); =20 if (client->irq) { + /* + * Clear stale status on all three IRQ registers before + * enabling, to avoid a spurious event. + */ + regmap_write(pdata->regmap, SN_IRQ_STATUS_REG, 0xFF); + regmap_write(pdata->regmap, SN_IRQ_STATUS2_REG, 0xFF); + regmap_write(pdata->regmap, SN_IRQ_STATUS3_REG, 0xFF); + ret =3D regmap_set_bits(pdata->regmap, SN_IRQ_EVENTS_EN_REG, HPD_REMOVAL_EN | HPD_INSERTION_EN | HPD_REPLUG_EN); if (ret) @@ -1294,6 +1440,8 @@ static void ti_sn_bridge_hpd_disable(struct drm_bridg= e *bridge) pdata->hpd_enabled =3D false; mutex_unlock(&pdata->hpd_mutex); =20 + cancel_work_sync(&pdata->hpd_work); + pm_runtime_put_autosuspend(pdata->dev); } =20 @@ -1410,16 +1558,10 @@ static irqreturn_t ti_sn_bridge_interrupt(int irq, = void *private) return IRQ_NONE; } =20 - /* Notify only the DP connector, not all connectors on the device. */ mutex_lock(&pdata->hpd_mutex); - if (pdata->hpd_enabled && hpd_event && pdata->bridge.hpd_data) { - struct drm_connector *connector =3D - (struct drm_connector *)pdata->bridge.hpd_data; - mutex_unlock(&pdata->hpd_mutex); - drm_connector_helper_hpd_irq_event(connector); - } else { - mutex_unlock(&pdata->hpd_mutex); - } + if (pdata->hpd_enabled && hpd_event) + schedule_work(&pdata->hpd_work); + mutex_unlock(&pdata->hpd_mutex); =20 return IRQ_HANDLED; } @@ -2050,6 +2192,7 @@ static int ti_sn65dsi86_probe(struct i2c_client *clie= nt) =20 mutex_init(&pdata->hpd_mutex); mutex_init(&pdata->comms_mutex); + INIT_WORK(&pdata->hpd_work, ti_sn_bridge_hpd_work); =20 pdata->regmap =3D devm_regmap_init_i2c(client, &ti_sn65dsi86_regmap_config); --=20 2.34.1