From nobody Tue Dec 2 02:43:29 2025 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 735972BF000 for ; Tue, 18 Nov 2025 04:37:56 +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=1763440678; cv=none; b=o3S525nCy4UVCQ2OZ+rMUrLZ7KdXwELfYkfHOLVZNl6zGt9n6tFndX8n22A+CZkJdne5CIO9Art44buVgIg257bAL3/agrbWwM93bTkuLDmiJMWHgSLoweAw7Vhb8KW9BzIWQm780CB9dyxsrmdsgp9htPsn38ng4zYn1bj65a0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763440678; c=relaxed/simple; bh=qz4Xz5Ldc9/otglui7guw4sFZjWQzTzl5rBch2+0xBw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cFlFX+KX2eE1rQcIPhNJAxURKycpwmzvVUoB16lDCG7EW9IOFcXtHvxRO9Q2mvS6tR3nF8WfBsl7Oi81sJwxLrgnpK1hCIFs90YroOdFn6Jw6sbRm9K7BRZz8GRgg3SFVHIaa54CfCJ7TCXXcsPbGwQ1Fl6TPlz3JY/necsrMuY= 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=YSFMwG4X; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=e+4SKRGb; 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="YSFMwG4X"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="e+4SKRGb" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5AHJK6EC3916357 for ; Tue, 18 Nov 2025 04:37:55 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= 6zDYrYdR+iycJ0sYRVFXMBXVR05ePvLN9oUY6h+GbOs=; b=YSFMwG4XQp7sdhPQ EO90LHMxcIs8FVq4UYUJdX0kDJbJaH+m84VQew4F5LxnBMv7zXzryzNqg1HQKuZE tQDjzHx8lBhDn3Oro81tKyEYn1651kcWf7IcjzYDjY8MoeZWfLl2Y2txMPhKU1pW rU+RS+uttR3YKO7r7oaStLWCqIVjMBVjzJrc8D9pldwG6UAmwtPrlpmXQCRABmFr LT37bOZCNKg5xypTzZILs2IGrX61EC0XZa94XQ2CPdvx6KnPqHw6DZNorfxQpzmY aCfPAwBVNUqyUTQMC0+Jw39VCJf8kV7HPrPtlLTF3N0s3dLuBejk8pva8gRI/saf 6RxGVw== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ag2fxaq11-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 18 Nov 2025 04:37:55 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-29546051945so15706625ad.1 for ; Mon, 17 Nov 2025 20:37:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1763440674; x=1764045474; 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=6zDYrYdR+iycJ0sYRVFXMBXVR05ePvLN9oUY6h+GbOs=; b=e+4SKRGbHVCTUPz1OV+SQr1n9UlAUEcPOHodi/Hvlm3sJBa9M0K6omBsyP4RLDOls2 wW8AGq+fHNnFzLCFCeeEWALaP8OSMlRhN0jN8tGJkIDWD1lUOhMtJa/4UDCOmO/Yi2wW 1r9ZCN6df3j5KySuMVebc9O3KHl0roYTD+J7sKxyHDwrey0kQouD2hnpWogaxP6IF/r0 w3oKKgfqyK9grN725SZXWGISVrZmnTYuNeZUgbc49cn91JibqLorZZg3Tv/Ya8WCOMm0 EUchGynPBzSR9tBZ1NQ6IJOyG7449XIsjpwt69DbiJPvgeqLjwDkWwaTAtWWjhxFK3QD rUCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763440674; x=1764045474; 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=6zDYrYdR+iycJ0sYRVFXMBXVR05ePvLN9oUY6h+GbOs=; b=ldomajzAV9DTr9uy5ioyxPn9+spBq+IQaBLnK59UC/9H8OaNz30eKli2txwCQcpy6K tzNjPXIw8siZbfNezaOKYR7xtSbnGuZS9BSo3tnPcQGxf2wwD8oO9q+M+7uIzhVk8ANY /Q2s9t/xkiKNs6ZY3OYgXWze09bA+EaYgasrXic50AvvZBtTFQ5xe8tbPVEh48khpOVT IGa4oo6fuwLoyTbEAp8GD2m6t/iuZg6QzcoO9O6RXZr+84qk+1xiTGQhT/9WGN0fXvVS X1Za5lSPGbsXMhd7dnp6o4/S4SnMJ5DhVvVqL2XPXQRCHHhMktYVxVZ47nYw3MaVej2b zU4Q== X-Forwarded-Encrypted: i=1; AJvYcCXvuECQ5t/RUclatd3kCAQbYUeWuWI2e6ammri4ncv57DRF/K+YzpsaH06imRfARfw32/fOWbPtVwHOHRo=@vger.kernel.org X-Gm-Message-State: AOJu0YxTdeopNk+AaAEnYf7EgsK/ZGkzYZmCD5hCVTw+UUwKATUVbVbE tWPiNduqa8XMGYwK4bKWaOYfolFrSCCjzQC9MjHX7Lk/indylUDGW6a7MivhLZ1iDzXMs80JHa8 h3+xmAsb7VUQdjzVvllfmB2Z8FT7PmYMxKztSTfLFB4J7ju+msNtOecS/WbMrQFHirFc= X-Gm-Gg: ASbGncuMdg6HsvkrPuCouAKmmLI8w9agI33f6iOg7KuBfXpNJbsoPqbax8Rq2Ue0H4A TqzDnhlAOzVzrc62PhzrAuLbbziNXhzl6bEmapj0I/AEWC8HpGdPG+cG3eM0J9LNkaUm6r1JS/A jgTdgTyAXjV635lDAgC2Luxv9PfW6h2U+WrSpnAYYbv8/wqCA9hHfUFWe17J8ib7J7ZrNcmCtHo GK1fJ9gVrBuGAX2TLn/GNbKu7+NJkuPS5+32ECY7ktcE4O3+o9hgQtLiRivrM7TvEhLW71lzEvB kYakNmc3/gs1MvTaFNGTSNQ1/tVEE3sTc+aA2X3Yl9wuRSve8J8fn9EDBgD8nm+DMD9RNcWj0Rt bCYOg8/365ExdF/jlSGTa6BTbxFCflmeR3EgW9dyV506DF7bJuABeOZ0bV2Qn2ob4ilKhryiRka RrcHlKFoe4BC1VetWM0QE= X-Received: by 2002:a17:903:38c8:b0:299:e041:ecd6 with SMTP id d9443c01a7336-299f65b6d93mr10616175ad.8.1763440674046; Mon, 17 Nov 2025 20:37:54 -0800 (PST) X-Google-Smtp-Source: AGHT+IF0IvWP+z6wJPIorOdhkrTefI+9g5lpBqNUGn5qAJvKMh8WBTovxSfMz+uG47qChzgT+Aj74w== X-Received: by 2002:a17:903:38c8:b0:299:e041:ecd6 with SMTP id d9443c01a7336-299f65b6d93mr10615955ad.8.1763440673537; Mon, 17 Nov 2025 20:37:53 -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 d9443c01a7336-2985c2ccafesm157426315ad.97.2025.11.17.20.37.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 20:37:53 -0800 (PST) From: Vishnu Saini Date: Tue, 18 Nov 2025 10:07:08 +0530 Subject: [PATCH v2 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: <20251118-lt8713sx-bridge-driver-v2-1-25ad49280a11@oss.qualcomm.com> References: <20251118-lt8713sx-bridge-driver-v2-0-25ad49280a11@oss.qualcomm.com> In-Reply-To: <20251118-lt8713sx-bridge-driver-v2-0-25ad49280a11@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 X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1763440662; l=2011; i=vishnu.saini@oss.qualcomm.com; s=20251113; h=from:subject:message-id; bh=qz4Xz5Ldc9/otglui7guw4sFZjWQzTzl5rBch2+0xBw=; b=zqsKdI0DfPPtTVM0wc2TE1ThgxYOwQljX5vANAFuXAW/JUpgZoQvCGXMaguDjdTySskvt1xew xCdlSxzBDaXAPbHqltM6gpMY502FChFM3NpwYj+1SaOtp6XoaVYzI7I X-Developer-Key: i=vishnu.saini@oss.qualcomm.com; a=ed25519; pk=8hlXlF8j/3GeOaDK3w2LYhkv9FanCQru0c7kRH/It7k= X-Proofpoint-ORIG-GUID: fRakcFm01QPGbZv6dSG37OiXCH81bNdd X-Authority-Analysis: v=2.4 cv=EIELElZC c=1 sm=1 tr=0 ts=691bf823 cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=Kz8-B0t5AAAA:8 a=0rundtbkkiGdurUZRnIA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 a=sptkURWiP4Gy88Gu7hUp:22 a=RuZk68QooNbwfxovefhk:22 X-Proofpoint-GUID: fRakcFm01QPGbZv6dSG37OiXCH81bNdd X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTE4MDAzMyBTYWx0ZWRfX4Ny/cfK+es2x GS0u8t1CFuPasJouE6El6Xk6zDEoJMzyQUYEoGvu3Q9TN/kBsElTFXYiX1bVcrIv0KbVCKg1ti1 1PHJssbxHis0jzDSstKAmmALhn1HTsjguZEaRczJwEm1vQKgKXalpq8megZvsLVWX8AZACcLiIg sv7EHTq9eSdKUV2cG50C8gejLIi1xNVv9Q+UMHq9hx/YURAlc5uGx4CJ21SkUvCrRrvHo5Q+0/y y/KtGVIaAi/HF/wVGfbX3PYsjmjzvf73jr2/2k6kQeir8wB7kSUsQ8w6Imn6qG58YSnJzqJVmKj WmQYigWbSXGe6cHlqEJvMqb7JoypWz4t6+KoHX1YpY+xx/xs75U/MfeD1UPCj7Dq/zMuGbybRaS ECcNk58qU2Du0IhFEiggsz08ShsgpA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-17_04,2025-11-13_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 spamscore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511180033 Add bindings for lt8713sx. Co-developed-by: Prahlad Valluru Signed-off-by: Prahlad Valluru Signed-off-by: Vishnu Saini --- Documentation/devicetree/bindings/display/bridge/lontium,lt8713sx.yaml | 5= 2 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 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..3fb7e042c688 --- /dev/null +++ b/Documentation/devicetree/bindings/display/bridge/lontium,lt8713sx.yaml @@ -0,0 +1,52 @@ +# 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 high RESET pin. + +required: + - compatible + - reg + +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_HIGH>; + }; + }; --=20 2.34.1 From nobody Tue Dec 2 02:43:29 2025 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 848D92BE652 for ; Tue, 18 Nov 2025 04:38:02 +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=1763440684; cv=none; b=SEc7B3MLaJC+5mi8RVkOjr+FYlyD0cEVMDAxM73h9JfvXbkjD6PYISK9sQwLysCnrMGnW2kX56hswjw2gv/ICgORMzzEuxggLZqozYWpvbPoOo+hz5NFm87ERh6pj1suC3FoySFjVJPISZyocnZ57VJNKeFiFT4cHn9wVjRnysE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763440684; c=relaxed/simple; bh=GoEr9AlrDIhF4qW9t+Gss/wck6pvIfAaBKEurwqOFDY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AFeCg+fX4TVQkuRn5Ncrx0sxcW9hb77sDhrk7HUCXt12JfJSwzaW34W0yg1J16BB3rGGHX0ckl0CnfEMNH80AiHcO+pMBiG1p53oViJqyhN+jqBSXcd90ujUJraL7Vgqp23unpjLu4+KMLTzUcT66L6I8D84sosoxVW4PqXcgYk= 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=eKsckedD; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=C2adleyT; 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="eKsckedD"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="C2adleyT" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5AHJStlH3917049 for ; Tue, 18 Nov 2025 04:38:01 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= NwaET8dkGG3qetmUuWdn8IRc6ey8Z0jU4ZaVGWUys5w=; b=eKsckedDKUT4OiVD IL8HKCUthHxjtRocZj2L1poG9Rck/K4bZgk1lu32AmChdV+axS8gaVar01jcbaN5 kqKhiQ7yJHneSsSqmq0CxAa5xeJD8ZA2zmu9ntR5Ou1X06ToWQDKcclAjsn1bTRu XFVS0BBRRqCs75+3bqhBOAYN6H1WuAXZbOQG49Hc77d7Czzb7ZNPP25mtd17/wph 414cv+k2vzK1+uAdFzfM1YBjAUn1NXIWsxDOc9oWZGQJr+kHBa7t5QFrtAIJycT+ Rc7nNwSW8lJ1J7kfaQ1Yk4CovT7EqNJh8bdjNV41EdlmNc/g8Rr0CchgELACAWIF 1GiJvQ== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ag2fxaq17-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 18 Nov 2025 04:38:01 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2964d6164bfso15271095ad.0 for ; Mon, 17 Nov 2025 20:38:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1763440680; x=1764045480; 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=NwaET8dkGG3qetmUuWdn8IRc6ey8Z0jU4ZaVGWUys5w=; b=C2adleyTdyXubG3LSfIBjmSrGq+YPaJIRDDJ3G6lqYl/GGiezCP3Iqj9yYjZmRMsIj 0B4LA7dEUTCNudFl44i4qV+9/F5ODtWJorEjSxJCOqXLDxrqKP+lRbQDoBkYPSuufJ+U ZaSNKcFS8B1IbYZQK4PrTuLvoY7H9LP3t68W0b9XFOkcmrKhmZ1vpkf5eoYBtTWCKzom 2HDsxiOhNRrU6rj0hU9EuxBS8mMiggr5l4ZNfF3unEIK+w/AUTGh8b8G3OuY3fXmJPc4 p13ZMw47Z7SWfT0NhtZZJUVFvKlKkNMBtFvX82vRGy3wcICGzGpkkzBuNEBpFcOjBUIo fuqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763440680; x=1764045480; 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=NwaET8dkGG3qetmUuWdn8IRc6ey8Z0jU4ZaVGWUys5w=; b=onVHS/o18ZFjdXgtzF4Y9GmezE9BqK1X09xPfx043NiWuN0MdkOifPL1Er5SY+Ev+I Sc2B4XMrpd1nX4c6y7q1v3ltodBjWY/C2m7OoXtTCitfBQFhCa9Vcl6e2ry8h6s0m30Y CZthkcoNmSZ0+C/lftjStrn3TLaXO3DJeGY9V9Si3vFtmEMhpolE0qmlHlvfGRkuYGRl EIi7zqfzyKW4pxiwNE15HdgR56nladFxggbON+UmNNIrf44f2eFH+WN2ukoxQWS15G+t 6MEgOcdD1ICUyuHC6/cuXaTLiW5WbV5MYX0qrnRilu/vXUnKElxxnkjsaBXRmcZj1mgH 1F6Q== X-Forwarded-Encrypted: i=1; AJvYcCULAqsA2jLrBJO1XYpXQJ5ntckAecam70YUGoZR5o3jE0ftTjn2M5L6Mst1oeBmH45yw40XobRim8wJBBo=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7LKxAbGTXXVwl21Kw7P5q473NTN5b8IWCWRmbpyrvnDXUZJzT bICQYfFwY9xFZrx/LLakFmCc3Hy6VIBFOdWdccish30rQd2EaLi06bUCRZN87ebE2VndOBfHEXQ bSRRzxPw+voBNoBKCNMrdLOjLxy0dYOHERkR9jRfmjeBrTCZ92TdnpRjaR6Yqk+wdXgz4YmQBUV k= X-Gm-Gg: ASbGnctdZDUWhTCM4QNRr6iJ9HDFu0bnm50RTlSxZ4FUaChT3bQtveeWgY6FY6l3uNa m1TbkntLK8wJzu5mObpcnDRrNyaA6/uBH9UghyKL08ff0daMxbvQpSAy8viHes38NRdrdP6mNQ4 n/kaLmC0KA9SuT9z8CKktbggGI/XHBJeuyEwPszBScGy2FSngeQ+BcrNALKLBLs7CQaGvplKg9y TQki6V84sUZxCi4d7aiNSTG1uRS0k/uwUsRhFRuFe4avWtsNcl0Pr5HU5QIfRlsAZ+fi2+BxoEx J3O/Ld0/4JHP4rsJqSdObPROdUNFnIXnZ/OPCUHZVnNqX5HYlxviQRJouio8Lo/qt6IPPxXraRi TYakC8tSBsApSssGTjzOvzjf/cr8luwv4sIukQ57rymmVWVwkUMVxmdqKSDSRa8p+ytp4D2YPLz q39Em4R7gx52w+ZvWzCHY= X-Received: by 2002:a17:902:d508:b0:295:3f35:a31b with SMTP id d9443c01a7336-299f63ec343mr11702725ad.0.1763440679999; Mon, 17 Nov 2025 20:37:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IEG3IqHtPXg/aOZsy4Ay0vgHyo4PBM8J9vmkkYO6f/LJI4+hvo706xkc1A1IrL+tSXib7W5yg== X-Received: by 2002:a17:902:d508:b0:295:3f35:a31b with SMTP id d9443c01a7336-299f63ec343mr11702425ad.0.1763440679322; Mon, 17 Nov 2025 20:37:59 -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 d9443c01a7336-2985c2ccafesm157426315ad.97.2025.11.17.20.37.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 20:37:58 -0800 (PST) From: Vishnu Saini Date: Tue, 18 Nov 2025 10:07:09 +0530 Subject: [PATCH v2 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: <20251118-lt8713sx-bridge-driver-v2-2-25ad49280a11@oss.qualcomm.com> References: <20251118-lt8713sx-bridge-driver-v2-0-25ad49280a11@oss.qualcomm.com> In-Reply-To: <20251118-lt8713sx-bridge-driver-v2-0-25ad49280a11@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 X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1763440662; l=22220; i=vishnu.saini@oss.qualcomm.com; s=20251113; h=from:subject:message-id; bh=GoEr9AlrDIhF4qW9t+Gss/wck6pvIfAaBKEurwqOFDY=; b=T33V6OSZxL2A1tdeFad6RmcnFCiI1nuj4phCIR5iIuLVCvwdFgIcMvul5PoorQM7LwCwYcDo/ RSol4B+uqftD3Ic9fxYZwkdqmeOjjZEUQO49gb7x6iHHhmCy2TXOnbH X-Developer-Key: i=vishnu.saini@oss.qualcomm.com; a=ed25519; pk=8hlXlF8j/3GeOaDK3w2LYhkv9FanCQru0c7kRH/It7k= X-Proofpoint-ORIG-GUID: PBmltVBiqfV03cCDtBpN7XkJpoQx8XXM X-Authority-Analysis: v=2.4 cv=EIELElZC c=1 sm=1 tr=0 ts=691bf829 cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=Kz8-B0t5AAAA:8 a=qUO0xVzsbagvrNELR24A:9 a=QEXdDO2ut3YA:10 a=1OuFwYUASf3TG4hYMiVC:22 a=RuZk68QooNbwfxovefhk:22 X-Proofpoint-GUID: PBmltVBiqfV03cCDtBpN7XkJpoQx8XXM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTE4MDAzMyBTYWx0ZWRfXzXcQxVYawf4e olcP3S+AT9lBAjN+ife2VgYWnp/Xs/vVgUXwl94PSS4+z2WLH8v9erGfi5e2BgZlghDm0filyzT OEfwNF+qFFq5hoXer7tQOZ+hdTO4LOIPU6+Lb96nlRsmGM9dyJR/wYld9UuEnra70CjiXrC6Gh6 q7IkUNzj+rAkBlN+q+8KLMRB1/yL9HoaHoYoD4ndru1e0Y30IbgF3YccO81hel5UDHwsmbPZtXZ QRjZMg9Sy4PxEFc0EOU8yY/lZObsbtVVNoNqsnh604zG6f6SzFoRIqRNCnSKSaDyRBzdc6zVOk1 VQAUzvoBSLE/djkXYoZYlYM8v1OH5FC2hgFbIGmUB/+423KcOx1bKRU0XSeJN71sejv2+5/0hJj UATR1niNfRvOhTrnO5+RjffUasLkdw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-17_04,2025-11-13_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 spamscore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511180033 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 in the bridge chip. Co-developed-by: Prahlad Valluru Signed-off-by: Prahlad Valluru Signed-off-by: Vishnu Saini --- drivers/gpu/drm/bridge/Kconfig | 10 ++ drivers/gpu/drm/bridge/Makefile | 1 + drivers/gpu/drm/bridge/lontium-lt8713sx.c | 713 ++++++++++++++++++++++++++= ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 724 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..a5aed2474a2e --- /dev/null +++ b/drivers/gpu/drm/bridge/lontium-lt8713sx.c @@ -0,0 +1,713 @@ +// 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 + +#define FW_FILE "lt8713sx_fw.bin" + +#define LT8713SX_PAGE_SIZE 256 +#define FW_12K_SIZE (12 * 1024) +#define FW_64K_SIZE (64 * 1024) +#define FW_256K_SIZE (256 * 1024) + +struct crc_config { + u8 width; + u32 poly; + u32 crc_init; + u32 xor_out; + bool ref_in; + bool ref_out; +}; + +struct lt8713sx { + struct device *dev; + + 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 regulator_bulk_data supplies[2]; + + 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 0, + .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_config lt8713sx_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .volatile_table =3D <8713sx_table, + .cache_type =3D REGCACHE_NONE, +}; + +static void lt8713sx_i2c_enable(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_write(lt8713sx->regmap, 0xee, 0x01); +} + +static void lt8713sx_i2c_disable(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_write(lt8713sx->regmap, 0xee, 0x00); +} + +static unsigned int bits_reverse(u32 in_val, u8 bits) +{ + u32 out_val =3D 0; + u8 i; + + for (i =3D 0; i < bits; i++) { + if (in_val & (1 << i)) + out_val |=3D 1 << (bits - 1 - i); + } + + return out_val; +} + +static unsigned int get_crc(struct crc_config crc_cfg, const u8 *buf, u64= buf_len) +{ + u8 width =3D crc_cfg.width; + u32 poly =3D crc_cfg.poly; + u32 crc =3D crc_cfg.crc_init; + u32 xorout =3D crc_cfg.xor_out; + bool refin =3D crc_cfg.ref_in; + bool refout =3D crc_cfg.ref_out; + u8 n; + u32 bits; + u32 data; + u8 i; + + n =3D (width < 8) ? 0 : (width - 8); + crc =3D (width < 8) ? (crc << (8 - width)) : crc; + bits =3D (width < 8) ? 0x80 : (1 << (width - 1)); + poly =3D (width < 8) ? (poly << (8 - width)) : poly; + + while (buf_len--) { + data =3D *(buf++); + if (refin) + data =3D bits_reverse(data, 8); + crc ^=3D (data << n); + for (i =3D 0; i < 8; i++) { + if (crc & bits) + crc =3D (crc << 1) ^ poly; + else + crc =3D crc << 1; + } + } + crc =3D (width < 8) ? (crc >> (8 - width)) : crc; + if (refout) + crc =3D bits_reverse(crc, width); + crc ^=3D xorout; + + return (crc & ((2 << (width - 1)) - 1)); +} + +static u32 calculate_64K_crc(const u8 *upgrade_data, u64 len) +{ + struct crc_config crc_cfg =3D { + .width =3D 8, + .poly =3D 0x31, + .crc_init =3D 0, + .xor_out =3D 0, + .ref_out =3D false, + .ref_in =3D false, + }; + u64 crc_size =3D FW_64K_SIZE - 1; + u8 default_val =3D 0xFF; + + crc_cfg.crc_init =3D get_crc(crc_cfg, upgrade_data, len); + + crc_size -=3D len; + while (crc_size--) + crc_cfg.crc_init =3D get_crc(crc_cfg, &default_val, 1); + + return crc_cfg.crc_init; +} + +static u32 calculate_12K_crc(const u8 *upgrade_data, u64 len) +{ + struct crc_config crc_cfg =3D { + .width =3D 8, + .poly =3D 0x31, + .crc_init =3D 0, + .xor_out =3D 0, + .ref_out =3D false, + .ref_in =3D false, + }; + u64 crc_size =3D FW_12K_SIZE; + u8 default_val =3D 0xFF; + + crc_cfg.crc_init =3D get_crc(crc_cfg, upgrade_data, len); + + crc_size -=3D len; + while (crc_size--) + crc_cfg.crc_init =3D get_crc(crc_cfg, &default_val, 1); + + return crc_cfg.crc_init; +} + +static int lt8713sx_prepare_firmware_data(struct lt8713sx *lt8713sx) +{ + int ret =3D 0; + + ret =3D request_firmware(<8713sx->fw, FW_FILE, lt8713sx->dev); + if (ret < 0) { + pr_err("request firmware failed\n"); + return ret; + } + + pr_debug("Firmware size: %zu bytes\n", lt8713sx->fw->size); + + if (lt8713sx->fw->size > FW_256K_SIZE - 1) { + pr_err("Firmware size exceeds 256KB limit\n"); + release_firmware(lt8713sx->fw); + return -EINVAL; + } + + lt8713sx->fw_buffer =3D kzalloc(FW_256K_SIZE, GFP_KERNEL); + if (!lt8713sx->fw_buffer) { + release_firmware(lt8713sx->fw); + return -ENOMEM; + } + + memset(lt8713sx->fw_buffer, 0xFF, FW_256K_SIZE); + + if (lt8713sx->fw->size < FW_64K_SIZE) { + /*TODO: CRC should be calculated with 0xff also */ + memcpy(lt8713sx->fw_buffer, lt8713sx->fw->data, lt8713sx->fw->size); + lt8713sx->fw_buffer[FW_64K_SIZE - 1] =3D + calculate_64K_crc(lt8713sx->fw->data, lt8713sx->fw->size); + lt8713sx->main_crc_value =3D lt8713sx->fw_buffer[FW_64K_SIZE - 1]; + pr_debug("Main Firmware Data Crc=3D0x%02X\n", lt8713sx->main_crc_value); + + } else { + //main firmware + memcpy(lt8713sx->fw_buffer, lt8713sx->fw->data, FW_64K_SIZE - 1); + lt8713sx->fw_buffer[FW_64K_SIZE - 1] =3D + calculate_64K_crc(lt8713sx->fw_buffer, FW_64K_SIZE - 1); + lt8713sx->main_crc_value =3D lt8713sx->fw_buffer[FW_64K_SIZE - 1]; + pr_debug("Main Firmware Data Crc=3D0x%02X\n", lt8713sx->main_crc_value); + + //bank firmware + memcpy(lt8713sx->fw_buffer + FW_64K_SIZE, + lt8713sx->fw->data + FW_64K_SIZE, + lt8713sx->fw->size - FW_64K_SIZE); + + lt8713sx->bank_num =3D (lt8713sx->fw->size - FW_64K_SIZE + FW_12K_SIZE -= 1) / + FW_12K_SIZE; + pr_debug("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 + calculate_12K_crc(lt8713sx->fw_buffer + FW_64K_SIZE + + i * FW_12K_SIZE, + FW_12K_SIZE); + pr_debug("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, 0xFF, 0xE0); + regmap_write(lt8713sx->regmap, 0xEE, 0x01); + regmap_write(lt8713sx->regmap, 0x5E, 0xC1); + regmap_write(lt8713sx->regmap, 0x58, 0x00); + regmap_write(lt8713sx->regmap, 0x59, 0x50); + regmap_write(lt8713sx->regmap, 0x5A, 0x10); + regmap_write(lt8713sx->regmap, 0x5A, 0x00); + regmap_write(lt8713sx->regmap, 0x58, 0x21); +} + +static void lt8713sx_wren(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe1); + regmap_write(lt8713sx->regmap, 0x03, 0xbf); + regmap_write(lt8713sx->regmap, 0x03, 0xff); + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_write(lt8713sx->regmap, 0x5a, 0x04); + regmap_write(lt8713sx->regmap, 0x5a, 0x00); +} + +static void lt8713sx_wrdi(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0x5A, 0x08); + regmap_write(lt8713sx->regmap, 0x5A, 0x00); +} + +static void lt8713sx_fifo_reset(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe1); + regmap_write(lt8713sx->regmap, 0x03, 0xbf); + regmap_write(lt8713sx->regmap, 0x03, 0xff); +} + +static void lt8713sx_disable_sram_write(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_write(lt8713sx->regmap, 0x55, 0x00); +} + +static void lt8713sx_sram_to_flash(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0x5a, 0x30); + regmap_write(lt8713sx->regmap, 0x5a, 0x00); +} + +static void lt8713sx_i2c_to_sram(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0x55, 0x80); + regmap_write(lt8713sx->regmap, 0x5e, 0xc0); + regmap_write(lt8713sx->regmap, 0x58, 0x21); +} + +static u8 lt8713sx_read_flash_status(struct lt8713sx *lt8713sx) +{ + u32 flash_status =3D 0; + + regmap_write(lt8713sx->regmap, 0xFF, 0xE1);//fifo_rst_n + regmap_write(lt8713sx->regmap, 0x03, 0x3F); + regmap_write(lt8713sx->regmap, 0x03, 0xFF); + + regmap_write(lt8713sx->regmap, 0xFF, 0xE0); + regmap_write(lt8713sx->regmap, 0x5e, 0x40); + regmap_write(lt8713sx->regmap, 0x56, 0x05);//opcode=3Dread status regist= er + regmap_write(lt8713sx->regmap, 0x55, 0x25); + regmap_write(lt8713sx->regmap, 0x55, 0x01); + regmap_write(lt8713sx->regmap, 0x58, 0x21); + + regmap_read(lt8713sx->regmap, 0x5f, &flash_status); + pr_debug("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 * 0x008000; + regmap_write(lt8713sx->regmap, 0xFF, 0xE0); + regmap_write(lt8713sx->regmap, 0xEE, 0x01); + regmap_write(lt8713sx->regmap, 0x5A, 0x04); + regmap_write(lt8713sx->regmap, 0x5A, 0x00); + regmap_write(lt8713sx->regmap, 0x5B, flashaddr >> 16);//set flash addre= ss[23:16] + regmap_write(lt8713sx->regmap, 0x5C, flashaddr >> 8);//set flash addres= s[15:8] + regmap_write(lt8713sx->regmap, 0x5D, flashaddr);//set flash address[7:0] + regmap_write(lt8713sx->regmap, 0x5A, 0x01); + regmap_write(lt8713sx->regmap, 0x5A, 0x00); + msleep(100); //delay 100ms + i =3D 0; + while (1) { + flash_status =3D lt8713sx_read_flash_status(lt8713sx); //wait erase fin= ish + if ((flash_status & 0x01) =3D=3D 0) + break; + + if (i > 50) + break; + + i++; + msleep(50); //delay 50ms + } + } + pr_debug("erase flash done.\n"); +} + +static void lt8713sx_load_main_fw_to_sram(struct lt8713sx *lt8713sx) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_write(lt8713sx->regmap, 0xee, 0x01); + regmap_write(lt8713sx->regmap, 0x68, 0x00); + regmap_write(lt8713sx->regmap, 0x69, 0x00); + regmap_write(lt8713sx->regmap, 0x6a, 0x00); + regmap_write(lt8713sx->regmap, 0x65, 0x00); + regmap_write(lt8713sx->regmap, 0x66, 0xff); + regmap_write(lt8713sx->regmap, 0x67, 0xff); + regmap_write(lt8713sx->regmap, 0x6b, 0x00); + regmap_write(lt8713sx->regmap, 0x6c, 0x00); + regmap_write(lt8713sx->regmap, 0x60, 0x01); + msleep(200); + regmap_write(lt8713sx->regmap, 0x60, 0x00); +} + +static void lt8713sx_load_bank_fw_to_sram(struct lt8713sx *lt8713sx, u64 a= ddr) +{ + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_write(lt8713sx->regmap, 0xee, 0x01); + regmap_write(lt8713sx->regmap, 0x68, ((addr & 0xFF0000) >> 16)); + regmap_write(lt8713sx->regmap, 0x69, ((addr & 0x00FF00) >> 8)); + regmap_write(lt8713sx->regmap, 0x6a, (addr & 0x0000FF)); + regmap_write(lt8713sx->regmap, 0x65, 0x00); + regmap_write(lt8713sx->regmap, 0x66, 0x30); + regmap_write(lt8713sx->regmap, 0x67, 0x00); + regmap_write(lt8713sx->regmap, 0x6b, 0x00); + regmap_write(lt8713sx->regmap, 0x6c, 0x00); + regmap_write(lt8713sx->regmap, 0x60, 0x01); + msleep(50); + regmap_write(lt8713sx->regmap, 0x60, 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); + + pr_debug("Writing to Sram=3D%u pages, total size =3D %llu bytes\n", page,= filesize); + + for (num =3D 0; num < page; num++) { + pr_debug("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, 0x59, 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_write(lt8713sx->regmap, 0xff, 0xe0); + regmap_read(lt8713sx->regmap, 0x23, &main_crc_result); + + pr_debug("Main CRC HW: 0x%02X\n", main_crc_result); + pr_debug("Main CRC FW: 0x%02X\n", lt8713sx->main_crc_value); + + if (main_crc_result =3D=3D lt8713sx->main_crc_value) + pr_debug("Main Firmware Upgrade Success.\n"); + else + pr_err("Main Firmware Upgrade Failed.\n"); +} + +static void lt8713sx_bank_upgrade_result(struct lt8713sx *lt8713sx, u8 ban= knum) +{ + u32 bank_crc_result; + + regmap_write(lt8713sx->regmap, 0xff, 0xe0); + + regmap_read(lt8713sx->regmap, 0x23, &bank_crc_result); + + pr_debug("Bank %d CRC Result: 0x%02X\n", banknum, bank_crc_result); + + if (bank_crc_result =3D=3D lt8713sx->bank_crc_value[banknum]) + pr_debug("Bank %d Firmware Upgrade Success.\n", banknum); + else + pr_err("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 < FW_64K_SIZE) { + ret =3D lt8713sx_write_data(lt8713sx, lt8713sx->fw_buffer, FW_64K_SIZE); + if (ret < 0) { + pr_err("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) { + pr_err("Failed to write firmware data: %d\n", ret); + return ret; + } + } + + pr_debug("Write Data done.\n"); + + return 0; +} + +static int lt8713sx_firmware_update(struct lt8713sx *lt8713sx) +{ + int ret =3D 0; + + mutex_lock(<8713sx->ocm_lock); + lt8713sx_i2c_enable(lt8713sx); + + ret =3D lt8713sx_prepare_firmware_data(lt8713sx); + if (ret < 0) { + pr_err("Failed to prepare firmware data: %d\n", ret); + goto error; + } + + ret =3D lt8713sx_firmware_upgrade(lt8713sx); + if (ret < 0) { + pr_err("Upgrade failure.\n"); + goto error; + } else { + /* 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); + + kfree(lt8713sx->fw_buffer); + lt8713sx->fw_buffer =3D NULL; + + if (lt8713sx->fw) { + release_firmware(lt8713sx->fw); + lt8713sx->fw =3D NULL; + } + mutex_unlock(<8713sx->ocm_lock); + + return ret; +} + +static void lt8713sx_reset(struct lt8713sx *lt8713sx) +{ + pr_debug("reset bridge.\n"); + gpiod_set_value_cansleep(lt8713sx->reset_gpio, 1); + msleep(20); + + gpiod_set_value_cansleep(lt8713sx->reset_gpio, 0); + msleep(20); + + gpiod_set_value_cansleep(lt8713sx->reset_gpio, 1); + msleep(20); + pr_debug("reset done.\n"); +} + +static int lt8713sx_regulator_init(struct lt8713sx *lt8713sx) +{ + int ret; + + lt8713sx->supplies[0].supply =3D "vdd"; + lt8713sx->supplies[1].supply =3D "vcc"; + + ret =3D devm_regulator_bulk_get(lt8713sx->dev, 2, lt8713sx->supplies); + if (ret < 0) + return dev_err_probe(lt8713sx->dev, ret, "failed to get regulators\n"); + + ret =3D regulator_set_load(lt8713sx->supplies[0].consumer, 200000); + if (ret < 0) + return dev_err_probe(lt8713sx->dev, ret, "failed to set regulator load\n= "); + + return 0; +} + +static int lt8713sx_regulator_enable(struct lt8713sx *lt8713sx) +{ + int ret; + + ret =3D regulator_enable(lt8713sx->supplies[0].consumer); + if (ret < 0) + return dev_err_probe(lt8713sx->dev, ret, "failed to enable vdd regulator= \n"); + + usleep_range(1000, 10000); + + ret =3D regulator_enable(lt8713sx->supplies[1].consumer); + if (ret < 0) { + regulator_disable(lt8713sx->supplies[0].consumer); + return dev_err_probe(lt8713sx->dev, ret, "failed to enable vcc regulator= \n"); + } + return 0; +} + +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 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_kzalloc(dev, sizeof(*lt8713sx), GFP_KERNEL); + if (!lt8713sx) + return dev_err_probe(dev, -ENOMEM, "failed to allocate lt8713sx struct\n= "); + + lt8713sx->dev =3D dev; + lt8713sx->client =3D client; + i2c_set_clientdata(client, lt8713sx); + + mutex_init(<8713sx->ocm_lock); + + 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 lt8713sx_gpio_init(lt8713sx); + if (ret < 0) + goto err_of_put; + + ret =3D lt8713sx_regulator_init(lt8713sx); + if (ret < 0) + goto err_of_put; + + ret =3D lt8713sx_regulator_enable(lt8713sx); + if (ret) + goto err_of_put; + + lt8713sx_reset(lt8713sx); + + return 0; + +err_of_put: + return ret; +} + +static void lt8713sx_remove(struct i2c_client *client) +{ + struct lt8713sx *lt8713sx =3D i2c_get_clientdata(client); + + mutex_destroy(<8713sx->ocm_lock); + + regulator_bulk_disable(ARRAY_SIZE(lt8713sx->supplies), lt8713sx->supplies= ); +} + +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