From nobody Fri Apr 17 00:28:44 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 706B628F50F for ; Tue, 24 Feb 2026 17:55:59 +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=1771955760; cv=none; b=SiNvwBSuRxi01R6sC+zREwV9EecQ411LJOWqxU6BrU6CFjba0c18YwjoXou25zqMOz308uR8nzm+HCCGm006pQ1b0iVmKaTP80Zv3XmG1LCAS95LcEtlju16A4Xvou0SahL2eNGwAUSM4HmtoGAO4Cyu5XIhFcwsH+CwOXBFYXU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771955760; c=relaxed/simple; bh=9oh1sckkh2C1ohYEAQGEpWZlxZnkblry8brMY0fXOXo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FdgbGlIvEdcu6NEcI1Z3H7TSx3au2RUJUu0bwiGhDPBfahO/LYMWhOTpCzhHcch6VlUwqzEOAB7nHSfXhDPkwhs2eWEEzNveUFAEDjq2Hi3WKYIi1NQN5PoSt7lIkRz1muqokoLX5kn5mNCT1OJG3sWtTTuROPgNd4arCjOavew= 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=eUcEFd9j; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=I0bgiQoZ; 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="eUcEFd9j"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="I0bgiQoZ" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61OH5dgO2334688 for ; Tue, 24 Feb 2026 17:55:58 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= hYJgXTA2R7z4h4lRZ8hroPs3UT7gAkIOfXYTE+ORk8E=; b=eUcEFd9jxoz/TL2M NJhrXnhp/E3jah66QBRaNNqPT4/HLIoMedFteCVUOfcSAbOiY0GfX/KLfVhSmjob RtFycf0Nsvc2gTOPgYDUsiqm2CV8nXQEUbWY1JBk80L3dGlhrMBa3F+1VcGPkQw5 HS8wBX/sBuUlwEPK+teg7EmiCzCnNBePPmZSBXck5i43KZ3QQnL87Pp6Xdl1WckG 4YohnsdFzHtT9Hv2izNLuMBah8laihPcG6nfJcSmROIZv6KQcgdaImMJCpZ5Y5sF vNShouOy5BI5sNpuhR1JqsHCitVHURc9pZIhIGgl5sA8joiEBA/+MM5dGj79Wsdg gSF49g== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4chg37r6je-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 24 Feb 2026 17:55:58 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8231c4af106so3213367b3a.3 for ; Tue, 24 Feb 2026 09:55:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1771955758; x=1772560558; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=hYJgXTA2R7z4h4lRZ8hroPs3UT7gAkIOfXYTE+ORk8E=; b=I0bgiQoZPVqM+zTmGj6fNBBS2A3tq50nMBhTo7j0Ti91e3Kciz0FaPMR/1GHy8sDHm S3VJCTGAuHgZet6p9CVBDvgv1eRPT3LYRzjSptm2ggBV80hJyx9hIuS/p1F74gvR8EWc +KYIB3kee9HfbDxuOw1jwqMbcgndrOx/KmlqYzxErevfwrtOGos33llChcOQU/ISC7IC fO3+H7bhlnUVJcHt5QV4rwSN2Z/PX6tIt17FSqXi1tJZHneBm6xKOgcs0f+M8H7jkPSI M4fSMJ7ZWkgEKbK/6dFrlgPb/37kGE49POoolzL4PbQGlExaamiVZOdIaTidLlr+M/y8 GIcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771955758; x=1772560558; h=cc:to:in-reply-to:references: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=hYJgXTA2R7z4h4lRZ8hroPs3UT7gAkIOfXYTE+ORk8E=; b=wiI+TBKwaXiGNEF6xCv+/qdzyuEmpe2JQP8psjXilcVOX38D1qGsZUKS50ElY9ZYoy iL+Ckr7t9YuqnUR/U7ke6XkQS+EDkYR4vzuLf/xbxLgrkjJMNUHpHuXz0827zswgnQax 9Z03u4x9VlBDGNpFnk539NU2wdhML0A1wYbXx3Rjs+GOhkz6F0XciFn4RYCow6gjZ7EJ DrXC0VPT40n4ybQ7QkJ4gzcAVGgx+2Ph555TQ53ID0y0+LuglhDWygvchluMeVlgeC+0 4n44lodcecIHUAipBa/Lpq3ITgE0gMlYSWMx6jwm1tjQE6Y5/ZoZlRAFux0apL26RjI3 fIdg== X-Forwarded-Encrypted: i=1; AJvYcCUN5i3dwx2zMGNHZVDLm1NHc/e3cE+hK+HEJAWSajCSkfBGND211Kej5F9Y/u3vQv4dLKcXypWVRNrxzgc=@vger.kernel.org X-Gm-Message-State: AOJu0YxsWDm6SbNSC1/5x2YCs0LN2WRL33BnTOAFqGD9PsUxA+8vo/En zVdLjXJH4ysFvWDMmAoDHpPppsuhq2pJvm4vRXyr3W+1SQOwLV9hS0/NbYzjAiqf5nu652iJ+kR vo2E1lz7T07cVMmY/5vgXZWC+79Q1x+zLbDO8oX/OnRdmRWnFkb1EmUPxap3UdVSZC60= X-Gm-Gg: ATEYQzwyevxTOSMxLS5ALuNsgYXFQ1BjN8q6mHeovGnw1I6Q/kru42FchR3D4eUcHYu aeklyv86oZ+isBOqVS9emQuJ/IZ+qS78aw3RntN1z7MrzLA+qJ3sRGU+rVC8jkFyaNdYm03DuEh p1oLKle9r1GAIySpHSIKWg6YoXf9Zp6P8xGRszQO6vZhHpgO+luSrUplafczdoqP7+1fvk2b1LO dQrsSjJUNBuKwtmy/3cNq9NJnztsHW+BZJPY+mV3wQ2SKC/fQ/IYkOTgcPnWn3uN8P27Oir8rTi mJZKjw5rZ3/KcE0vq/itY1+I+DJpJXePRgqBbdcQZPACfYR4toph/JgfAXX5LXLfibQ9h0QZrQ6 fn7T+6MtBlKtrnbSTJBxK7863hQl/LkbGbZkYI5vgwGqrwKdt9NrrzMq9cw6UA5NZ+kZf92B34p 4Kxu+etTlxbkZWh8X2uSzL3aDkD+9r+hxI4yxmw840Jg== X-Received: by 2002:aa7:88cb:0:b0:81f:3920:77ed with SMTP id d2e1a72fcca58-826da8d7a31mr8271225b3a.2.1771955758003; Tue, 24 Feb 2026 09:55:58 -0800 (PST) X-Received: by 2002:aa7:88cb:0:b0:81f:3920:77ed with SMTP id d2e1a72fcca58-826da8d7a31mr8271199b3a.2.1771955757519; Tue, 24 Feb 2026 09:55:57 -0800 (PST) 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 d2e1a72fcca58-826dd68e147sm10338005b3a.19.2026.02.24.09.55.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Feb 2026 09:55:56 -0800 (PST) From: Vishnu Saini Date: Tue, 24 Feb 2026 23:25:35 +0530 Subject: [PATCH v4 1/2] dt-bindings: bridge: lt8713sx: Add bindings 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: <20260224-lt8713sx-bridge-driver-v4-1-b5603f5458d8@oss.qualcomm.com> References: <20260224-lt8713sx-bridge-driver-v4-0-b5603f5458d8@oss.qualcomm.com> In-Reply-To: <20260224-lt8713sx-bridge-driver-v4-0-b5603f5458d8@oss.qualcomm.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Tony Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vishnu Saini , prahlad.valluru@oss.qualcomm.com, Prahlad Valluru , =?utf-8?q?=E6=9C=B1=E6=99=93=E6=98=8E?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1771955743; l=3760; i=vishnu.saini@oss.qualcomm.com; s=20251113; h=from:subject:message-id; bh=9oh1sckkh2C1ohYEAQGEpWZlxZnkblry8brMY0fXOXo=; b=pvOYgVgi/C91rA+xLa6Ak2CMkfXozjKKLF7VPMMdziKUACA3JQG6ASNvS1SurtKWaxBaG5aJf DCQhBVPOOHADSo6ngmrWWkWW2fuFWOoVBAi9ByIoFU+vgGXnYW8zVJn X-Developer-Key: i=vishnu.saini@oss.qualcomm.com; a=ed25519; pk=8hlXlF8j/3GeOaDK3w2LYhkv9FanCQru0c7kRH/It7k= X-Authority-Analysis: v=2.4 cv=br1BxUai c=1 sm=1 tr=0 ts=699de62e cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=1XWaLZrsAAAA:8 a=Kz8-B0t5AAAA:8 a=u03R5FaqcccxyDpVlScA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=zc0IvFSfCIW2DFIPzwfm:22 a=sptkURWiP4Gy88Gu7hUp:22 a=RuZk68QooNbwfxovefhk:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI0MDE1MSBTYWx0ZWRfX/XG7zYd5Elgt aM7G5+h1bcRxAIqkPP8EmP3uTzeUBMzTFghUFOZhWy8QvkJ2T2kmyCK3hMknddE+KwjMp8NcIc4 AsgB8GkeLIUafB/xooFlhEdT9YK0Zc6Tpif6+tcTqNge8XF2G078IvuoJ1JcVv597n5wTx1QNQF CRPMjP+uip6CRHt7e/l9B6jZO4EC6NgHFgL370MRmn1PHZXKSR+C5oDLPO3sDIx6hJP149R1LTr P5mZ/42ynoxeomJEQ+RqGyBj9F0v/bI2qnc14cTVlBt3loKw29Hoia+dFyXP1GKDacJF6MW3I8A z1oYckEIxM9VIOyk/EttzW+eAHEv7FSbZ1cz3SYYXqJMvcWMNOKPw00jstEI6+DbTy5zjrNqu8j I7FlocJzcLRBTlVEn5P9Do3E66shUHevEw3JGmQDqgIrvT5nbjE6WIAo6psLUMVF6Eb5Yom9eHS FyZz9sKuwaGJNRh1kgA== X-Proofpoint-ORIG-GUID: a2ykoHWuc7knIPj11Ue_3xDKlpMRW52g X-Proofpoint-GUID: a2ykoHWuc7knIPj11Ue_3xDKlpMRW52g X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-24_02,2026-02-23_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 clxscore=1015 impostorscore=0 adultscore=0 bulkscore=0 phishscore=0 malwarescore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602240151 Add bindings for lt8713sx. Co-developed-by: Prahlad Valluru Signed-off-by: Prahlad Valluru Signed-off-by: Vishnu Saini Cc: =E6=9C=B1=E6=99=93=E6=98=8E --- .../bindings/display/bridge/lontium,lt8713sx.yaml | 113 +++++++++++++++++= ++++ 1 file changed, 113 insertions(+) diff --git a/Documentation/devicetree/bindings/display/bridge/lontium,lt871= 3sx.yaml b/Documentation/devicetree/bindings/display/bridge/lontium,lt8713s= x.yaml new file mode 100644 index 000000000000..29a773154b39 --- /dev/null +++ b/Documentation/devicetree/bindings/display/bridge/lontium,lt8713sx.yaml @@ -0,0 +1,113 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/bridge/lontium,lt8713sx.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Lontium LT8713SX Type-C/DP1.4 to Type-C/DP1.4/HDMI2.0/DP++ bridge-h= ub + +maintainers: + - Tony + +description: + The Lontium LT8713SX is a Type-C/DP1.4 to Type-C/DP1.4/HDMI2.0 converter + that integrates one DP input and up to three configurable output interfa= ces + (DP1.4 / HDMI2.0 / DP++), with SST/MST functionality and audio support. + +properties: + compatible: + enum: + - lontium,lt8713sx + + reg: + maxItems: 1 + + vcc-supply: + description: Regulator for 3.3V vcc. + + vdd-supply: + description: Regulator for 1.1V vdd. + + reset-gpios: + description: GPIO connected to active low RESET pin. + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/properties/port + description: + DP port for DP input from soc to bridge chip + + port@1: + $ref: /schemas/graph.yaml#/properties/port + description: + DP port for DP output from bridge + + port@2: + $ref: /schemas/graph.yaml#/properties/port + description: + Additional DP port for DP output from bridge + + port@3: + $ref: /schemas/graph.yaml#/properties/port + description: + Additional DP port for DP output from bridge + + required: + - port@0 + +required: + - compatible + - reg + - ports + +additionalProperties: false + +examples: + - | + #include + + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + bridge@4f { + compatible =3D "lontium,lt8713sx"; + reg =3D <0x4f>; + reset-gpios =3D <&tlmm 6 GPIO_ACTIVE_LOW>; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + port@0 { + reg =3D <0>; + lt8713sx_dp_in: endpoint { + remote-endpoint =3D <&mdss_dp0_out>; + }; + }; + + port@1 { + reg =3D <1>; + lt8713sx_dp0_out: endpoint { + remote-endpoint =3D <&dp0_connector_in>; + }; + }; + + port@2 { + reg =3D <2>; + lt8713sx_dp1_out: endpoint { + remote-endpoint =3D <&dp1_connector_in>; + }; + }; + + port@3 { + reg =3D <3>; + lt8713sx_dp2_out: endpoint { + remote-endpoint =3D <&dp2_connector_in>; + }; + }; + }; + }; + }; --=20 2.34.1 From nobody Fri Apr 17 00:28:44 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 CC1853A961A for ; Tue, 24 Feb 2026 17:56:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771955770; cv=none; b=hSY1KwxVZ3H2YNzt+Eh7a09449ODPjCokBaTKVfz4Un6IxR5/ygkhoBm7ijS3TLhoKM3nxFASlwqmcRZLVc194UsFVzeokkfDzO+C6QSqGyutTLsiGFzhBj+KqnO6r/KQrbS1qAKQFnPTYHaT2wkBjtq+9dtgujNZO+/cf9josQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771955770; c=relaxed/simple; bh=0c7I6lCfGoQlt7xddA/LipC/G/oRreJ6Rcby/wv/eQQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GzUzu1oDRwZ3LM7dwIUwyHBcI3Y/cyP67fvIS0VaEAKTwWgs69RVt6qW2YYWD6dLLttelhJ5CU8VOi1tIo05d8mTCd+ZJYxtpoK54atvoJq31R5tL0Q4vGPq5paZ59EVD672WeYcAD4uFeX9faavfzyw1IB5Z96I+NlyexpohKE= 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=UpzkfFqk; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=BdFART2I; arc=none smtp.client-ip=205.220.180.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="UpzkfFqk"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="BdFART2I" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61OH4711583290 for ; Tue, 24 Feb 2026 17:56:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= jUronYKsSW9F5uXX2CjyB1l7gYUW9EJCBP2yU9CIbrY=; b=UpzkfFqkI5JefO/Y xK2DPikaFaT6XgUhrDEbS+32xhjHKk8rr0ts6Bcd6UrMPiZgONtUGAdXk7Pqn763 3jJEQSPpoAqP2r/oBnyYU3weWclCu4SVzP6HvgZI4s8/Y3glx20bGwiznV6tZFBj bTJWcjJMs5ZiV/W4fpDnpSMtajXL1BnxiP0WYYvzfEcQl9EIpgPDZ8lhoSYkhTXL VCmir/8kumyBT5rVMRa1mH84HozYAJ+7MLoH056+SyaiaAp0SQ31hn9+5jl62YvR YL4/g0Jvtvx1sY4uIJ6YBJG7hvFcAsWIvHo42aQZ3kfHcPz0EqZbDvejHH5mSMUs oUiO7g== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4chg2gr6wp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 24 Feb 2026 17:56:06 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-82717caafccso227956b3a.2 for ; Tue, 24 Feb 2026 09:56:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1771955766; x=1772560566; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=jUronYKsSW9F5uXX2CjyB1l7gYUW9EJCBP2yU9CIbrY=; b=BdFART2IaiGlqYS2EJKnFKpf+wOJzqDre4hxfv9gMI25/RKt/tAOd/B362y1SIUxcn 59OVI4n1khaSQT+a2YFRemG+KJO9cQhFjT8764BR1f6qNVWQ24iZuvGYJe8EtT+4682F P8yfI8Hz34ecYurg7+6zfnFdwqU/UUQI/TC8TED0SBYfKV2Tkg8m48/yNGuQ8Fci0JpJ 5KXqkfAnwBEkNI18RKhbUGhvsCw9W0M3SQ0F+A91mfBCE1jAuiTvIlchYYDKcLQs+7KX cPLc5Fiu5B+jqcPVZpIhrpHe4WajF1KxqefdAiBC69xqeVZTMSrTMDk7zeW/nnqm06ad Frdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771955766; x=1772560566; h=cc:to:in-reply-to:references: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=jUronYKsSW9F5uXX2CjyB1l7gYUW9EJCBP2yU9CIbrY=; b=rbaVkJpt6xxfDJa0jD0SUznQz/K4PIOcXAmIxlr9iI9p6bz++kzMFEF6lXfSXg/y49 ASV39ABUq1P/AJpKX9rdiKTz2EJGQNVaqI+3RA0Eibuux3lf2tXYLibHoB6WcyYetd6q koFRMX531QMgypVtP1ERrWJEzOScxW4HuCn1PrnWB4uaSko06wAE93dFbTdDl5fDNP3y MvJx5JLjbn0zFF3SseSQ370daWGlgoc8WkJAPpCoIZWLQAc5vU3HGMyBlXVM1kXxCMrH vv0nGRLuZimXOfDz1URJuaPftIfznMyrWkZlKGQF0iFGJ2y4Z9yqjWVdI2iHeLaN847I zEpA== X-Forwarded-Encrypted: i=1; AJvYcCWPIjdYvvJ1QcO9FBF6pceM41TFUmoDv8yFmuRvIL6caDHOh8AtOYnQwh1XpES+v65ziddVwVSoVO7X7eU=@vger.kernel.org X-Gm-Message-State: AOJu0YzVXrR1m1iOa1m8AQNupUPteqGkt7cRJ63efcliOTdvBZ5NWOBO ZUnxiLIWdRZGUC3hRjD0+XawJ1nCuwU1wq8XUllsWlZzqH8MUMdgGZ5H0jAqg8DiOR0ktLHPLOU VHDG3rLpIKWwBxSK8n70Us6N/Zfdlw9yiCkxoFbM1el/Ez4F7ixO1vPXYXIy2ciECTaY= X-Gm-Gg: ATEYQzwtKehN+j6YM9HFx0l6YMScH/w+kYpVYa9bokSTll5ePI/6nYZldf6JobIGUEv FEb5d4jb4mZaMCYMoxFx5guRlbNpDtJSRlxrNUZckT8T/piDeQ9WI1gf4tUgNWhRiKyOhWZYn+2 Idb82CRYacyMyij9LwxNSnD4JNa1cYvhDUbCH8d/ftxtCTuyv6QMb7xJ2/verezl9LGHSWYrxit Kh0iH/uKpVR2b0C+SQSl8OFeMp7fJSTqpnasZi9SbXL5yXj9jKxfrUvEPFx09IsxV1voQYih1Oh vxgnxzL1MxV4zBZyen8qD+CDzx/421qgWGSdckRULz14pbpICWR0SJFYGoQdCNUHDp/9X818JbD scOnVZ/bZxpyKTfvjz723Bdmp1fd5i2ewdnrGLH+M47oIBuTfiZURyl8kY/a6pavnu0Kw1rEIBE tjtMgZ+X1sbs0KE+rLDuTS7lfXe/zj3I6hpRyF24PqaQ== X-Received: by 2002:a05:6a00:4d10:b0:81f:475a:d242 with SMTP id d2e1a72fcca58-826daa0c788mr5486069b3a.4.1771955765100; Tue, 24 Feb 2026 09:56:05 -0800 (PST) X-Received: by 2002:a05:6a00:4d10:b0:81f:475a:d242 with SMTP id d2e1a72fcca58-826daa0c788mr5486041b3a.4.1771955764378; Tue, 24 Feb 2026 09:56:04 -0800 (PST) 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 d2e1a72fcca58-826dd68e147sm10338005b3a.19.2026.02.24.09.55.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Feb 2026 09:56:03 -0800 (PST) From: Vishnu Saini Date: Tue, 24 Feb 2026 23:25:36 +0530 Subject: [PATCH v4 2/2] drm/bridge: add support for lontium lt8713sx bridge driver 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: <20260224-lt8713sx-bridge-driver-v4-2-b5603f5458d8@oss.qualcomm.com> References: <20260224-lt8713sx-bridge-driver-v4-0-b5603f5458d8@oss.qualcomm.com> In-Reply-To: <20260224-lt8713sx-bridge-driver-v4-0-b5603f5458d8@oss.qualcomm.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Tony Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vishnu Saini , prahlad.valluru@oss.qualcomm.com, Prahlad Valluru , =?utf-8?q?=E6=9C=B1=E6=99=93=E6=98=8E?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1771955743; l=19343; i=vishnu.saini@oss.qualcomm.com; s=20251113; h=from:subject:message-id; bh=0c7I6lCfGoQlt7xddA/LipC/G/oRreJ6Rcby/wv/eQQ=; b=8LoN06xi/SiFB4URDz8kc7N2LHcgDycSf00eOGNVifrEd3/oXDyDFx9KabQQN9DGueIo9a1Yp AwBIJ37IoqADV//y3mGd7Y0FVnqwFJV5eZBkkl/Jsj8InzP9Pgvroum X-Developer-Key: i=vishnu.saini@oss.qualcomm.com; a=ed25519; pk=8hlXlF8j/3GeOaDK3w2LYhkv9FanCQru0c7kRH/It7k= X-Proofpoint-ORIG-GUID: r12AXsxXsnajh0G16VbtiScu2HimR9O0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI0MDE1MSBTYWx0ZWRfX0bSdl92LjYgp zDRbhUwrAjANYirdSJES6Y2e1hxODGJ9E+Rin6M8p/e9plG/ztG4uzCMTySGsdjZadjMtB4NJG7 ru809F7OkXr0Y2PpGtB+4ZCfa9d2zKAUtHxu64XWl1gYPTuo2uxPXnAbeouesZPfPD35yhky3w2 Flne5JkS8SVFBZGXZPNgICpnmjbbN/jyR7D8zgWIOtbIETfOO2X8zFr63L0vqNvPVygxuBWHYaX 6U1h2a8jwQ9HQfHyz4nAPXLjepvFblZZsFVlbq16M+tBCjcRvrLpYPWh6vAFaKII0/MNo7oAl6z rNpsN5t8S8QRbvtRY/lixB80YUGxOdxddDACN2eyGoho/7wfThdQyjBnQcGbeKhqcANbBTrqj3g Hb4Bk0tK1l7uv5UzOouNPMpEshDDjQ3wf68jIk3ILz+HWdfiMNfSUQjsW9bvibWx+Vq8h+pK6DV S9DhRIOOxAvQsgGsnwQ== X-Authority-Analysis: v=2.4 cv=ftHRpV4f c=1 sm=1 tr=0 ts=699de636 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=1XWaLZrsAAAA:8 a=Kz8-B0t5AAAA:8 a=QrKC4IKgJVbfS20aV78A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 a=RuZk68QooNbwfxovefhk:22 X-Proofpoint-GUID: r12AXsxXsnajh0G16VbtiScu2HimR9O0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-24_02,2026-02-23_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 clxscore=1015 spamscore=0 impostorscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602240151 The lt8713sx is a Type-C/DP1.4 to Type-C/DP1.4/HDMI2.0 converter, with three configurable DP1.4/HDMI2.0/DP++ output interfaces and audio output interface. Driver is required for firmware upgrade and enabling the bridge chip. Co-developed-by: Prahlad Valluru Signed-off-by: Prahlad Valluru Signed-off-by: Vishnu Saini Cc: =E6=9C=B1=E6=99=93=E6=98=8E Reviewed-by: Dmitry Baryshkov --- drivers/gpu/drm/bridge/Kconfig | 10 + drivers/gpu/drm/bridge/Makefile | 1 + drivers/gpu/drm/bridge/lontium-lt8713sx.c | 598 ++++++++++++++++++++++++++= ++++ 3 files changed, 609 insertions(+) diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index a250afd8d662..7fef383ed7cb 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -184,6 +184,16 @@ config DRM_LONTIUM_LT9611UXC HDMI signals Please say Y if you have such hardware. =20 +config DRM_LONTIUM_LT8713SX + tristate "Lontium LT8713SX DP MST bridge" + depends on OF + select REGMAP_I2C + help + Driver for Lontium LT8713SX DP MST bridge + chip firmware upgrade, which converts Type-C/DP1.4 + to 3 configurable Type-C/DP1.4/HDMI2.0 outputs + Please say Y if you have such hardware. + config DRM_ITE_IT66121 tristate "ITE IT66121 HDMI bridge" depends on OF diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makef= ile index c7dc03182e59..07eeb13fa497 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -16,6 +16,7 @@ obj-$(CONFIG_DRM_LONTIUM_LT8912B) +=3D lontium-lt8912b.o obj-$(CONFIG_DRM_LONTIUM_LT9211) +=3D lontium-lt9211.o obj-$(CONFIG_DRM_LONTIUM_LT9611) +=3D lontium-lt9611.o obj-$(CONFIG_DRM_LONTIUM_LT9611UXC) +=3D lontium-lt9611uxc.o +obj-$(CONFIG_DRM_LONTIUM_LT8713SX) +=3D lontium-lt8713sx.o obj-$(CONFIG_DRM_LVDS_CODEC) +=3D lvds-codec.o obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) +=3D megachips-stdpxxxx-= ge-b850v3-fw.o obj-$(CONFIG_DRM_MICROCHIP_LVDS_SERIALIZER) +=3D microchip-lvds.o diff --git a/drivers/gpu/drm/bridge/lontium-lt8713sx.c b/drivers/gpu/drm/br= idge/lontium-lt8713sx.c new file mode 100644 index 000000000000..3d99f7b94c7e --- /dev/null +++ b/drivers/gpu/drm/bridge/lontium-lt8713sx.c @@ -0,0 +1,598 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define FW_FILE "lt8713sx_fw.bin" + +#define REG_PAGE_CONTROL 0xff + +#define LT8713SX_PAGE_SIZE 256 + +DECLARE_CRC8_TABLE(lt8713sx_crc_table); + +struct lt8713sx { + struct device *dev; + struct drm_bridge bridge; + struct drm_bridge *next_bridge; + + struct regmap *regmap; + /* Protects all accesses to registers by stopping the on-chip MCU */ + struct mutex ocm_lock; + + struct gpio_desc *reset_gpio; + struct gpio_desc *enable_gpio; + + struct i2c_client *client; + const struct firmware *fw; + + u8 *fw_buffer; + + u32 main_crc_value; + u32 bank_crc_value[17]; + + int bank_num; +}; + +static void lt8713sx_reset(struct lt8713sx *lt8713sx); + +static const struct regmap_range lt8713sx_ranges[] =3D { + { + .range_min =3D 0x0000, + .range_max =3D 0xffff + }, +}; + +static const struct regmap_access_table lt8713sx_table =3D { + .yes_ranges =3D lt8713sx_ranges, + .n_yes_ranges =3D ARRAY_SIZE(lt8713sx_ranges), +}; + +static const struct regmap_range_cfg lt8713sx_range_cfg =3D { + .name =3D "lt8713sx", + .range_min =3D 0x0000, + .range_max =3D 0xffff, + .selector_reg =3D REG_PAGE_CONTROL, + .selector_mask =3D 0xff, + .selector_shift =3D 0, + .window_start =3D 0, + .window_len =3D 0x100, +}; + +static const struct regmap_config lt8713sx_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .volatile_table =3D <8713sx_table, + .ranges =3D <8713sx_range_cfg, + .num_ranges =3D 1, + .cache_type =3D REGCACHE_NONE, + .max_register =3D 0xffff, +}; + +static void lt8713sx_i2c_enable(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe0ee, 0x01); +} + +static void lt8713sx_i2c_disable(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe0ee, 0x00); +} + +static int lt8713sx_prepare_firmware_data(struct lt8713sx *lt8713sx) +{ + int ret =3D 0; + u64 sz_12k =3D 12 * SZ_1K; + + ret =3D request_firmware(<8713sx->fw, FW_FILE, lt8713sx->dev); + if (ret < 0) { + dev_err(lt8713sx->dev, "request firmware failed\n"); + return ret; + } + + dev_dbg(lt8713sx->dev, "Firmware size: %zu bytes\n", lt8713sx->fw->size); + + if (lt8713sx->fw->size > SZ_256K - 1) { + dev_err(lt8713sx->dev, "Firmware size exceeds 256KB limit\n"); + release_firmware(lt8713sx->fw); + return -EINVAL; + } + + lt8713sx->fw_buffer =3D kvmalloc(SZ_256K, GFP_KERNEL); + if (!lt8713sx->fw_buffer) { + release_firmware(lt8713sx->fw); + return -ENOMEM; + } + + memset(lt8713sx->fw_buffer, 0xff, SZ_256K); + + /* main firmware */ + memcpy(lt8713sx->fw_buffer, lt8713sx->fw->data, SZ_64K - 1); + + lt8713sx->fw_buffer[SZ_64K - 1] =3D + crc8(lt8713sx_crc_table, lt8713sx->fw_buffer, SZ_64K - 1, 0); + lt8713sx->main_crc_value =3D lt8713sx->fw_buffer[SZ_64K - 1]; + dev_dbg(lt8713sx->dev, + "Main Firmware Data Crc =3D 0x%02X\n", lt8713sx->main_crc_value); + + /* bank firmware */ + memcpy(lt8713sx->fw_buffer + SZ_64K, + lt8713sx->fw->data + SZ_64K, + lt8713sx->fw->size - SZ_64K); + + lt8713sx->bank_num =3D (lt8713sx->fw->size - SZ_64K + sz_12k - 1) / sz_12= k; + dev_dbg(lt8713sx->dev, "Bank Number Total is %d.\n", lt8713sx->bank_num); + + for (int i =3D 0; i < lt8713sx->bank_num; i++) { + lt8713sx->bank_crc_value[i] =3D + crc8(lt8713sx_crc_table, lt8713sx->fw_buffer + SZ_64K + i * sz_12k, + sz_12k, 0); + dev_dbg(lt8713sx->dev, "Bank number:%d; Firmware Data Crc:0x%02X\n", + i, lt8713sx->bank_crc_value[i]); + } + return 0; +} + +static void lt8713sx_config_parameters(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe05e, 0xc1); + regmap_write(lt8713sx->regmap, 0xe058, 0x00); + regmap_write(lt8713sx->regmap, 0xe059, 0x50); + regmap_write(lt8713sx->regmap, 0xe05a, 0x10); + regmap_write(lt8713sx->regmap, 0xe05a, 0x00); + regmap_write(lt8713sx->regmap, 0xe058, 0x21); +} + +static void lt8713sx_wren(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe103, 0xbf); + regmap_write(lt8713sx->regmap, 0xe103, 0xff); + regmap_write(lt8713sx->regmap, 0xe05a, 0x04); + regmap_write(lt8713sx->regmap, 0xe05a, 0x00); +} + +static void lt8713sx_wrdi(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe05a, 0x08); + regmap_write(lt8713sx->regmap, 0xe05a, 0x00); +} + +static void lt8713sx_fifo_reset(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe103, 0xbf); + regmap_write(lt8713sx->regmap, 0xe103, 0xff); +} + +static void lt8713sx_disable_sram_write(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe055, 0x00); +} + +static void lt8713sx_sram_to_flash(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe05a, 0x30); + regmap_write(lt8713sx->regmap, 0xe05a, 0x00); +} + +static void lt8713sx_i2c_to_sram(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe055, 0x80); + regmap_write(lt8713sx->regmap, 0xe05e, 0xc0); + regmap_write(lt8713sx->regmap, 0xe058, 0x21); +} + +static u8 lt8713sx_read_flash_status(struct lt8713sx *lt8713sx) +{ + u32 flash_status =3D 0; + + regmap_write(lt8713sx->regmap, 0xe103, 0x3f); + regmap_write(lt8713sx->regmap, 0xe103, 0xff); + + regmap_write(lt8713sx->regmap, 0xe05e, 0x40); + regmap_write(lt8713sx->regmap, 0xe056, 0x05); /* opcode=3Dread status re= gister */ + regmap_write(lt8713sx->regmap, 0xe055, 0x25); + regmap_write(lt8713sx->regmap, 0xe055, 0x01); + regmap_write(lt8713sx->regmap, 0xe058, 0x21); + + regmap_read(lt8713sx->regmap, 0xe05f, &flash_status); + dev_dbg(lt8713sx->dev, "flash_status:%x\n", flash_status); + + return flash_status; +} + +static void lt8713sx_block_erase(struct lt8713sx *lt8713sx) +{ + u32 i =3D 0; + u8 flash_status =3D 0; + u8 blocknum =3D 0x00; + u32 flashaddr =3D 0x00; + + for (blocknum =3D 0; blocknum < 8; blocknum++) { + flashaddr =3D blocknum * SZ_32K; + regmap_write(lt8713sx->regmap, 0xe05a, 0x04); + regmap_write(lt8713sx->regmap, 0xe05a, 0x00); + regmap_write(lt8713sx->regmap, 0xe05b, flashaddr >> 16); + regmap_write(lt8713sx->regmap, 0xe05c, flashaddr >> 8); + regmap_write(lt8713sx->regmap, 0xe05d, flashaddr); + regmap_write(lt8713sx->regmap, 0xe05a, 0x01); + regmap_write(lt8713sx->regmap, 0xe05a, 0x00); + msleep(100); + i =3D 0; + while (1) { + flash_status =3D lt8713sx_read_flash_status(lt8713sx); + if ((flash_status & 0x01) =3D=3D 0) + break; + + if (i > 50) + break; + + i++; + msleep(50); + } + } + dev_dbg(lt8713sx->dev, "erase flash done.\n"); +} + +static void lt8713sx_load_main_fw_to_sram(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xe068, 0x00); + regmap_write(lt8713sx->regmap, 0xe069, 0x00); + regmap_write(lt8713sx->regmap, 0xe06a, 0x00); + regmap_write(lt8713sx->regmap, 0xe065, 0x00); + regmap_write(lt8713sx->regmap, 0xe066, 0xff); + regmap_write(lt8713sx->regmap, 0xe067, 0xff); + regmap_write(lt8713sx->regmap, 0xe06b, 0x00); + regmap_write(lt8713sx->regmap, 0xe06c, 0x00); + regmap_write(lt8713sx->regmap, 0xe060, 0x01); + msleep(200); + regmap_write(lt8713sx->regmap, 0xe060, 0x00); +} + +static void lt8713sx_load_bank_fw_to_sram(struct lt8713sx *lt8713sx, u64 a= ddr) +{ + regmap_write(lt8713sx->regmap, 0xe068, ((addr & 0xff0000) >> 16)); + regmap_write(lt8713sx->regmap, 0xe069, ((addr & 0x00ff00) >> 8)); + regmap_write(lt8713sx->regmap, 0xe06a, (addr & 0x0000ff)); + regmap_write(lt8713sx->regmap, 0xe065, 0x00); + regmap_write(lt8713sx->regmap, 0xe066, 0x30); + regmap_write(lt8713sx->regmap, 0xe067, 0x00); + regmap_write(lt8713sx->regmap, 0xe06b, 0x00); + regmap_write(lt8713sx->regmap, 0xe06c, 0x00); + regmap_write(lt8713sx->regmap, 0xe060, 0x01); + msleep(50); + regmap_write(lt8713sx->regmap, 0xe060, 0x00); +} + +static int lt8713sx_write_data(struct lt8713sx *lt8713sx, const u8 *data, = u64 filesize) +{ + int page =3D 0, num =3D 0, i =3D 0, val; + + page =3D (filesize % LT8713SX_PAGE_SIZE) ? + ((filesize / LT8713SX_PAGE_SIZE) + 1) : (filesize / LT8713SX_PAGE_SIZE); + + dev_dbg(lt8713sx->dev, + "Writing to Sram=3D%u pages, total size =3D %llu bytes\n", page, filesiz= e); + + for (num =3D 0; num < page; num++) { + dev_dbg(lt8713sx->dev, "page[%d]\n", num); + lt8713sx_i2c_to_sram(lt8713sx); + + for (i =3D 0; i < LT8713SX_PAGE_SIZE; i++) { + if ((num * LT8713SX_PAGE_SIZE + i) < filesize) + val =3D *(data + (num * LT8713SX_PAGE_SIZE + i)); + else + val =3D 0xff; + regmap_write(lt8713sx->regmap, 0xe059, val); + } + + lt8713sx_wren(lt8713sx); + lt8713sx_sram_to_flash(lt8713sx); + } + + lt8713sx_wrdi(lt8713sx); + lt8713sx_disable_sram_write(lt8713sx); + + return 0; +} + +static void lt8713sx_main_upgrade_result(struct lt8713sx *lt8713sx) +{ + u32 main_crc_result; + + regmap_read(lt8713sx->regmap, 0xe023, &main_crc_result); + + dev_dbg(lt8713sx->dev, "Main CRC HW: 0x%02X\n", main_crc_result); + dev_dbg(lt8713sx->dev, "Main CRC FW: 0x%02X\n", lt8713sx->main_crc_value); + + if (main_crc_result =3D=3D lt8713sx->main_crc_value) + dev_info(lt8713sx->dev, "Main Firmware Upgrade Success.\n"); + else + dev_err(lt8713sx->dev, "Main Firmware Upgrade Failed.\n"); +} + +static void lt8713sx_bank_upgrade_result(struct lt8713sx *lt8713sx, u8 ban= knum) +{ + u32 bank_crc_result; + + regmap_read(lt8713sx->regmap, 0xe023, &bank_crc_result); + + dev_dbg(lt8713sx->dev, "Bank %d CRC Result: 0x%02X\n", banknum, bank_crc_= result); + + if (bank_crc_result =3D=3D lt8713sx->bank_crc_value[banknum]) + dev_info(lt8713sx->dev, "Bank %d Firmware Upgrade Success.\n", banknum); + else + dev_err(lt8713sx->dev, "Bank %d Firmware Upgrade Failed.\n", banknum); +} + +static void lt8713sx_bank_result_check(struct lt8713sx *lt8713sx) +{ + int i; + u64 addr =3D 0x010000; + + for (i =3D 0; i < lt8713sx->bank_num; i++) { + lt8713sx_load_bank_fw_to_sram(lt8713sx, addr); + lt8713sx_bank_upgrade_result(lt8713sx, i); + addr +=3D 0x3000; + } +} + +static int lt8713sx_firmware_upgrade(struct lt8713sx *lt8713sx) +{ + int ret; + + lt8713sx_config_parameters(lt8713sx); + + lt8713sx_block_erase(lt8713sx); + + if (lt8713sx->fw->size < SZ_64K) { + ret =3D lt8713sx_write_data(lt8713sx, lt8713sx->fw_buffer, SZ_64K); + if (ret < 0) { + dev_err(lt8713sx->dev, "Failed to write firmware data: %d\n", ret); + return ret; + } + } else { + ret =3D lt8713sx_write_data(lt8713sx, lt8713sx->fw_buffer, lt8713sx->fw-= >size); + if (ret < 0) { + dev_err(lt8713sx->dev, "Failed to write firmware data: %d\n", ret); + return ret; + } + } + dev_dbg(lt8713sx->dev, "Write Data done.\n"); + + return 0; +} + +static int lt8713sx_firmware_update(struct lt8713sx *lt8713sx) +{ + int ret =3D 0; + + guard(mutex)(<8713sx->ocm_lock); + lt8713sx_i2c_enable(lt8713sx); + + ret =3D lt8713sx_prepare_firmware_data(lt8713sx); + if (ret < 0) { + dev_err(lt8713sx->dev, "Failed to prepare firmware data: %d\n", ret); + goto error; + } + + ret =3D lt8713sx_firmware_upgrade(lt8713sx); + if (ret < 0) { + dev_err(lt8713sx->dev, "Upgrade failure.\n"); + goto error; + } + + /* Validate CRC */ + lt8713sx_load_main_fw_to_sram(lt8713sx); + lt8713sx_main_upgrade_result(lt8713sx); + lt8713sx_wrdi(lt8713sx); + lt8713sx_fifo_reset(lt8713sx); + lt8713sx_bank_result_check(lt8713sx); + lt8713sx_wrdi(lt8713sx); + +error: + lt8713sx_i2c_disable(lt8713sx); + if (!ret) + lt8713sx_reset(lt8713sx); + + kvfree(lt8713sx->fw_buffer); + lt8713sx->fw_buffer =3D NULL; + + if (lt8713sx->fw) { + release_firmware(lt8713sx->fw); + lt8713sx->fw =3D NULL; + } + + return ret; +} + +static void lt8713sx_reset(struct lt8713sx *lt8713sx) +{ + dev_dbg(lt8713sx->dev, "reset bridge.\n"); + gpiod_set_value_cansleep(lt8713sx->reset_gpio, 1); + msleep(20); + + gpiod_set_value_cansleep(lt8713sx->reset_gpio, 0); + msleep(20); + + dev_dbg(lt8713sx->dev, "reset done.\n"); +} + +static int lt8713sx_regulator_enable(struct lt8713sx *lt8713sx) +{ + int ret; + + ret =3D devm_regulator_get_enable(lt8713sx->dev, "vdd"); + if (ret < 0) + return dev_err_probe(lt8713sx->dev, ret, "failed to enable vdd regulator= \n"); + + usleep_range(1000, 10000); + + ret =3D devm_regulator_get_enable(lt8713sx->dev, "vcc"); + if (ret < 0) + return dev_err_probe(lt8713sx->dev, ret, "failed to enable vcc regulator= \n"); + return 0; +} + +static int lt8713sx_bridge_attach(struct drm_bridge *bridge, + struct drm_encoder *encoder, + enum drm_bridge_attach_flags flags) +{ + struct lt8713sx *lt8713sx =3D container_of(bridge, struct lt8713sx, bridg= e); + + return drm_bridge_attach(encoder, + lt8713sx->next_bridge, + bridge, flags); +} + +static int lt8713sx_gpio_init(struct lt8713sx *lt8713sx) +{ + struct device *dev =3D lt8713sx->dev; + + lt8713sx->reset_gpio =3D devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(lt8713sx->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(lt8713sx->reset_gpio), + "failed to acquire reset gpio\n"); + + /* power enable gpio */ + lt8713sx->enable_gpio =3D devm_gpiod_get_optional(dev, "enable", GPIOD_OU= T_HIGH); + if (IS_ERR(lt8713sx->enable_gpio)) + return dev_err_probe(dev, PTR_ERR(lt8713sx->enable_gpio), + "failed to acquire enable gpio\n"); + return 0; +} + +static ssize_t lt8713sx_firmware_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct lt8713sx *lt8713sx =3D dev_get_drvdata(dev); + int ret; + + ret =3D lt8713sx_firmware_update(lt8713sx); + if (ret < 0) + return ret; + return len; +} + +static DEVICE_ATTR_WO(lt8713sx_firmware); + +static struct attribute *lt8713sx_attrs[] =3D { + &dev_attr_lt8713sx_firmware.attr, + NULL, +}; + +static const struct attribute_group lt8713sx_attr_group =3D { + .attrs =3D lt8713sx_attrs, +}; + +static const struct attribute_group *lt8713sx_attr_groups[] =3D { + <8713sx_attr_group, + NULL, +}; + +static const struct drm_bridge_funcs lt8713sx_bridge_funcs =3D { + .attach =3D lt8713sx_bridge_attach, +}; + +static int lt8713sx_probe(struct i2c_client *client) +{ + struct lt8713sx *lt8713sx; + struct device *dev =3D &client->dev; + int ret; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + return dev_err_probe(dev, -ENODEV, "device doesn't support I2C\n"); + + lt8713sx =3D devm_drm_bridge_alloc(dev, struct lt8713sx, bridge, <8713s= x_bridge_funcs); + if (IS_ERR(lt8713sx)) + return PTR_ERR(lt8713sx); + + lt8713sx->dev =3D dev; + lt8713sx->client =3D client; + i2c_set_clientdata(client, lt8713sx); + + ret =3D devm_mutex_init(lt8713sx->dev, <8713sx->ocm_lock); + if (ret) + return ret; + + lt8713sx->regmap =3D devm_regmap_init_i2c(client, <8713sx_regmap_config= ); + if (IS_ERR(lt8713sx->regmap)) + return dev_err_probe(dev, PTR_ERR(lt8713sx->regmap), "regmap i2c init fa= iled\n"); + + ret =3D drm_of_find_panel_or_bridge(lt8713sx->dev->of_node, 1, -1, NULL, + <8713sx->next_bridge); + if (ret < 0) + return ret; + + ret =3D lt8713sx_gpio_init(lt8713sx); + if (ret < 0) + return ret; + + ret =3D lt8713sx_regulator_enable(lt8713sx); + if (ret) + return ret; + + lt8713sx_reset(lt8713sx); + + lt8713sx->bridge.funcs =3D <8713sx_bridge_funcs; + lt8713sx->bridge.of_node =3D dev->of_node; + lt8713sx->bridge.type =3D DRM_MODE_CONNECTOR_DisplayPort; + drm_bridge_add(<8713sx->bridge); + + crc8_populate_msb(lt8713sx_crc_table, 0x31); + + return 0; +} + +static void lt8713sx_remove(struct i2c_client *client) +{ + struct lt8713sx *lt8713sx =3D i2c_get_clientdata(client); + + drm_bridge_remove(<8713sx->bridge); +} + +static struct i2c_device_id lt8713sx_id[] =3D { + { "lontium,lt8713sx", 0 }, + { /* sentinel */ } +}; + +static const struct of_device_id lt8713sx_match_table[] =3D { + { .compatible =3D "lontium,lt8713sx" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, lt8713sx_match_table); + +static struct i2c_driver lt8713sx_driver =3D { + .driver =3D { + .name =3D "lt8713sx", + .of_match_table =3D lt8713sx_match_table, + .dev_groups =3D lt8713sx_attr_groups, + }, + .probe =3D lt8713sx_probe, + .remove =3D lt8713sx_remove, + .id_table =3D lt8713sx_id, +}; + +module_i2c_driver(lt8713sx_driver); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("lt8713sx drm bridge driver"); +MODULE_AUTHOR("Tony "); +MODULE_FIRMWARE(FW_FILE); --=20 2.34.1