From nobody Thu Sep 24 14:26:45 2026 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 0CF802FE074; Wed, 23 Sep 2026 00:33:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790123625; cv=none; b=fmu3rodo5nOvDptlMSiTmlV6q/EuaRsI36sgq/syuAMvIYMDKpQ1PIehlMAWEAEe9KGFoSOm1xrZpNjN3QX8uRIq5LUufQORBtXJGm30YumVPzfnELowNAyxByfy2Zc1SZ5BYuKpnnqO64djRFj1W/U+Xz8FDQ2DTbm1+/+drNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790123625; c=relaxed/simple; bh=WH7oTmo+5ksUveMWJmf1Tv/aM6R0vqFcUgldBl6Zi+Q=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NoV1/iiqXVEyrHrjSaNgR3PFEkCvB+TZeF2X/etdvNALzsVEeu5nZdPk8Nh08r45njp5urWWQYagYQn+UlrPZkE6NNuOwDofif6lvxCFsD5+n7GUq6ZcPJbZLlyw2QMoqVNZyJ4j5hDeqpSt/OzdJF9Wh8un50GDF8GpV9HGMXI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=adSQ5bMx; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="adSQ5bMx" Received: from pps.filterd (m0516787.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68MN27Bt096249; Tue, 22 Sep 2026 20:33:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=PqM4A iF0m4iH1DzAsl1GonawnC2BI7oInWi3lBlKap0=; b=adSQ5bMxRv3WQq9lKhJ7a Rce9u5vyNc4InchYZd2My9hMmEmrdc+4V8eoGBopCc0iatE7N6vTVc6SNt931PxJ rk28n2/AIMPiu6+Qm1xksJKtV464B/P3DWWmZ2caof2BeivcH5323Wxq8CRD1wgr cp0Gaew3cw3w9lDgNLSGYnZDy9sHuBuYTIoh3/lMyy/0T1ndzEbAfefKi5b6CxqH fSsAspDehJFCEXMT5xaOavX8XIlEanhkd3OH9i92b05QoabLt0dUh/RZWfDmdBgI KDMfoz7IrnVoN+dFFH0H/ctHg1fAG4LmTjrjUXfeEjwVO+CIgZAhccisWf//Uu5r Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gtbqhxr9p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 20:33:41 -0400 (EDT) Received: from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 68N0XeLT046018 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 22 Sep 2026 20:33:40 -0400 Received: from ASHBCASHYB5.ad.analog.com (10.64.17.133) by ASHBMBX8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Tue, 22 Sep 2026 20:33:39 -0400 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBCASHYB5.ad.analog.com (10.64.17.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Tue, 22 Sep 2026 20:33:39 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Tue, 22 Sep 2026 20:33:39 -0400 Received: from HYB-VFz9h4bIQxi.ad.analog.com (HYB-VFz9h4bIQxi.ad.analog.com [10.118.4.49]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68N0XQkP005006; Tue, 22 Sep 2026 20:33:34 -0400 From: Jan Carlo Roleda To: Lee Jones , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , , , CC: Krzysztof Kozlowski Subject: [PATCH RESEND v13 1/2] dt-bindings: leds: Document LTC3208 Multidisplay LED Driver Date: Wed, 23 Sep 2026 08:33:23 +0800 Message-ID: <20260923003325.61722-2-jancarlo.roleda@analog.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260923003325.61722-1-jancarlo.roleda@analog.com> References: <20260911-upstream-ltc3208-v12-0-9107f5f0a7b0@analog.com> <20260923003325.61722-1-jancarlo.roleda@analog.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-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIzMDAwMSBTYWx0ZWRfX31TNhpJ44Hft nRJXebWDvRSSEGB4O3L+Zu9shWA9njmDTmltBvliL01YqP5YnGaJPPQpMpe7KOtLWUAQGcaaz5P U0bnPx8ueTx1XVlOdJ3AOquIy1ppgaOdN+ZaqFdE3iGXZ4Hy+gGUWXM3HpjKDGnqIN0SOersMre u93H/V6ALE38gytECHCexbiCKXBNchbOGmXFn9JpY3LlCKyZtSU5j//VUCPboQ73LI6C0fGLgfz o/qF3lQud3IzUz4CKiUD1YeuEYATAulaqMTN0NPtkXr76n1SgEpr4hm6f6kzu9SXGdus9U2dKdA neI/BAA2vFLTw16XqL77Yp07YIKFhIRey4mjL1L1YE8Ce2YZqq4DeJq+nRVQ+jM67pL4UTVvo90 TE631WXISCgbn/t5EmJGycUuWqcjOeBeGleKWkJvwTogojsYLZJ0Ryvx+Kx1vsSOJoqkwB+lhVf xRU/ZONSHJaB4dNBuAw== X-Proofpoint-ORIG-GUID: GbbJtc3SZF63WqV2i2q9l_2HC01DbQBP X-Proofpoint-GUID: GbbJtc3SZF63WqV2i2q9l_2HC01DbQBP X-Authority-Analysis: v=2.4 cv=G5OJgNk5 c=1 sm=1 tr=0 ts=6ab31e65 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gEfo2CItAAAA:8 a=gAnH3GRIAAAA:8 a=EUspDBNiAAAA:8 a=VwQbUJbxAAAA:8 a=v2smZY1xhbZLdnYpqY8A:9 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIzMDAwMSBTYWx0ZWRfX9RYtUmehdsuE kCv4mlSxdmetO0cQo0aXVipExTA22w+YS0bjH3vfZtZLwJkanfdXdc/e++GumUb+v6v8M9TemFz i73ucGSSk1vKherv9vXoG1Pn808uTLShQMOFbvXBSnwp+xfY1CyP 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-09-22_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 suspectscore=0 phishscore=0 clxscore=1015 lowpriorityscore=0 priorityscore=1501 malwarescore=0 bulkscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609230001 Content-Type: text/plain; charset="utf-8" Add Devicetree Documentation for LTC3208 Multidisplay LED Driver. Signed-off-by: Jan Carlo Roleda Reviewed-by: Krzysztof Kozlowski --- .../devicetree/bindings/leds/adi,ltc3208.yaml | 183 ++++++++++++++++++ MAINTAINERS | 7 + 2 files changed, 190 insertions(+) create mode 100644 Documentation/devicetree/bindings/leds/adi,ltc3208.yaml diff --git a/Documentation/devicetree/bindings/leds/adi,ltc3208.yaml b/Docu= mentation/devicetree/bindings/leds/adi,ltc3208.yaml new file mode 100644 index 0000000000000..c6697816b7d98 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/adi,ltc3208.yaml @@ -0,0 +1,183 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright (c) 2026 Analog Devices, Inc. +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/adi,ltc3208.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: LTC3208 Multidisplay LED Controller from Linear Technologies (Now A= nalog Devices) + +maintainers: + - Jan Carlo Roleda + +description: + The LTC3208 is a multidisplay LED controller that can support up to 1A t= o all + connected LEDs. + + The datasheet for this device can be found in + https://www.analog.com/en/products/ltc3208.html + +properties: + compatible: + const: adi,ltc3208 + + reg: + maxItems: 1 + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + adi,disable-camhl-pin: + type: boolean + description: + Configures whether the external CAMHL pin is disabled. + If disabled then the output pins associated with CAM will always sel= ect + the CAM register's high half-byte brightness. + + adi,cfg-enrgbs-pin: + type: boolean + description: + Configures which channel the ENRGBS pin toggles when it receives a s= ignal. + ENRGBS pin controls the SUB channel's output pins if this is set, + or RGB channel's output pins if this is unset. + + adi,disable-rgb-aux4-dropout: + type: boolean + description: + Configures the RGB and AUX4 dropout signals to be disabled. + + adi,aux1-channel: + $ref: /schemas/types.yaml#/definitions/string + description: + LED Channel that the AUX1 output pin mirrors its brightness level fr= om. + enum: [aux, main, sub, cam] + default: aux + + adi,aux2-channel: + $ref: /schemas/types.yaml#/definitions/string + description: + LED Channel that the AUX2 output pin mirrors its brightness level fr= om. + enum: [aux, main, sub, cam] + default: aux + + adi,aux3-channel: + $ref: /schemas/types.yaml#/definitions/string + description: + LED Channel that the AUX3 output pin mirrors its brightness level fr= om. + enum: [aux, main, sub, cam] + default: aux + + adi,aux4-channel: + $ref: /schemas/types.yaml#/definitions/string + description: + LED Channel that the AUX4 output pin mirrors its brightness level fr= om. + enum: [aux, main, sub, cam] + default: aux + +patternProperties: + "^led@[0-7]$": + type: object + $ref: /schemas/leds/common.yaml# + unevaluatedProperties: false + properties: + reg: + description: + LED Channel Number. each channel maps to a specific channel grou= p used + to configure the brightness level of the output pins correspondi= ng to + the channel. + enum: + - 0 # Main Channel (8-bit brightness) + - 1 # Sub Channel (8-bit brightness) + - 2 # AUX Channel (4-bit brightness) + - 3 # Camera Channel, Low-side byte (4-bit brightness) + - 4 # Camera Channel, High-side byte (4-bit brightness) + - 5 # Red Channel (4-bit brightness) + - 6 # Blue Channel (4-bit brightness) + - 7 # Green Channel (4-bit brightness) + required: + - reg + +required: + - compatible + - reg + - "#address-cells" + - "#size-cells" + +additionalProperties: false + +examples: + - | + #include + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + led-controller@1b { + compatible =3D "adi,ltc3208"; + reg =3D <0x1b>; + #address-cells =3D <1>; + #size-cells =3D <0>; + adi,disable-camhl-pin; + adi,cfg-enrgbs-pin; + adi,disable-rgb-aux4-dropout; + + /* MAIN */ + led@0 { + reg =3D <0>; + function =3D LED_FUNCTION_ACTIVITY; + color =3D ; + }; + + /* SUB */ + led@1 { + reg =3D <1>; + function =3D LED_FUNCTION_ACTIVITY; + color =3D ; + }; + + /* AUX */ + led@2 { + reg =3D <2>; + function =3D LED_FUNCTION_ACTIVITY; + color =3D ; + }; + + /* CAMLO */ + led@3 { + reg =3D <3>; + function =3D LED_FUNCTION_FLASH; + color =3D ; + }; + + /* CAMHI */ + led@4 { + reg =3D <4>; + function =3D LED_FUNCTION_FLASH; + color =3D ; + }; + + /* RED */ + led@5 { + reg =3D <5>; + function =3D LED_FUNCTION_INDICATOR; + color =3D ; + }; + + /* BLUE */ + led@6 { + reg =3D <6>; + function =3D LED_FUNCTION_INDICATOR; + color =3D ; + }; + + /* GREEN */ + led@7 { + reg =3D <7>; + function =3D LED_FUNCTION_INDICATOR; + color =3D ; + }; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 3a19da74d00c9..c422939a82694 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15527,6 +15527,13 @@ W: https://ez.analog.com/linux-software-drivers F: Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml F: drivers/iio/temperature/ltc2983.c =20 +LTC3208 LED DRIVER +M: Jan Carlo Roleda +L: linux-leds@vger.kernel.org +S: Maintained +W: https://ez.analog.com/linux-software-drivers +F: Documentation/devicetree/bindings/leds/adi,ltc3208.yaml + LTC3220 LED DRIVER M: Edelweise Escala L: linux-leds@vger.kernel.org --=20 2.43.0 From nobody Thu Sep 24 14:26:45 2026 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 1FC612F7F12; Wed, 23 Sep 2026 00:33:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790123629; cv=none; b=tVzi8LOb0UdlmGD575h6zLNCbw+IKnllMoD2zQWII0+DHGV4MvF81dIi6fnW8SUU9cIdAqGYnLOCT6DwtEHvaC/WMZfu7TFj0dF0vYjyizlrWmzSXQsFePQAkHALHy6PomUeJ9kzArl2Y7QmU4fqDo+dfS2hJqPufZOtLXhSEBA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790123629; c=relaxed/simple; bh=WJo5OceymeMG3XzGl5poxlWUKEjvp+mM9wiArHO8rvY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=eHNlNqUAi27yamsBnJOWE3eapRxckSer3Pc260+1xUP5zBMpVT5nU8rplyWTcqtiOh4htHSg4IzMILOE1xgKr2Ptj33AB/nfPWrz8rkVYd64IcHx1BbSywumqI5MSpWlbJsdF35f3sF4GbIU6Gf1ILKW+fV3F29SDNprh6gd6oo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=eSa2qvb+; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="eSa2qvb+" Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68MMhXr33809321; Tue, 22 Sep 2026 20:33:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=U67Fw rHReWpM7O7wCvzEHcB2Z03ZNxJYwOnPIUCwOac=; b=eSa2qvb+E5RbIxQDTxcBp aEj79GpoABDne2GmvW9idaxU1YQoklPZvUM9dPiFVn/XsbGVoIh3bQIos6YSNjBo +6fLfL28JB9Ikbge9ksNTYi8JVTMk1MqTiXQj38q/tXdlGCoak/bfODNygsrxwgm uhVkfTIHGN+4CqO9CIMJr6SwfR265+BeW0Se40/dNUWtW1lVTCxHzz95TzAKZGPc LyEYFtpheShD7Iw9xCfmVM6zGroRfZI+qRr+0xIdosnNIxWoiw8XL1eK8JtrDz0E 78NUxxfipYTS+czt16CwCkKZ9MNMYvqhue7Rndxx/OEIStf/s2Z/8xClx4rjYPOS Q== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gusd2ujya-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 20:33:44 -0400 (EDT) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 68N0XhUa057297 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 22 Sep 2026 20:33:43 -0400 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Tue, 22 Sep 2026 20:33:43 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Tue, 22 Sep 2026 20:33:43 -0400 Received: from HYB-VFz9h4bIQxi.ad.analog.com (HYB-VFz9h4bIQxi.ad.analog.com [10.118.4.49]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68N0XQkQ005006; Tue, 22 Sep 2026 20:33:38 -0400 From: Jan Carlo Roleda To: Lee Jones , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , , CC: Subject: [PATCH RESEND v13 2/2] leds: ltc3208: Add driver for LTC3208 Multidisplay LED Driver Date: Wed, 23 Sep 2026 08:33:24 +0800 Message-ID: <20260923003325.61722-3-jancarlo.roleda@analog.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260923003325.61722-1-jancarlo.roleda@analog.com> References: <20260911-upstream-ltc3208-v12-0-9107f5f0a7b0@analog.com> <20260923003325.61722-1-jancarlo.roleda@analog.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-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIzMDAwMSBTYWx0ZWRfX2nucBN8L9kl6 +ZkcC9+YhoR3Zbk3EPE69Pz5Xtq0z7aLxYKy7CdpxbTanjgg75BcXX+NVS2bAs2TrHX1YKtvh6V TbZF/fMEwHu6DOUm+SMgXES4JDPT8NFqsPzTQdeE7KBLfaulkZhKcXZkaF22L+fOzoQDIiG4RCc /qoLIe7lOKviMwUBK0cG72grd/Jxacwm+pr/360tl4pv091viW/JdNgif8cGejChS8zGfE2H7as yg3WLAsVgiMzQ90dqa9G512Llk2+8MNM3/4oD1bqE+5zWqKh+5e6zjSrWiE4WUro1K9UtUEXUS9 yXTM7CNt0p7vj88mIR9p+EagBDCEkt83/Jbiy/cOoqkjFVHEmCpRs/lb9lu47FKdouheclRkNSV 1ApnXULcfBmTZyIECBwn1Ot2QcthfUKG/oDoZxp27c0X35/mX5wTqv+zU5e5Lg61Ph3tyZtWoar 6yPkxqUPs1nXsgeW7KQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIzMDAwMSBTYWx0ZWRfX+F11rYBRN548 ZbfzlDXr8y6crUjFUUnqQdgBueBS72aykHyAjTyOFL0MbEKQGRkow9Dpo1g7DfECoH3a8mGZ9sq EVKBZIuHVa5AA4ZfKFKSfaKv6oCxgAHiYEnrrmpQyBnr/23kcX0g X-Proofpoint-ORIG-GUID: krxDhDEKldfaCCFA7nAmWFwgT64VceKU X-Proofpoint-GUID: krxDhDEKldfaCCFA7nAmWFwgT64VceKU X-Authority-Analysis: v=2.4 cv=adH0Dhot c=1 sm=1 tr=0 ts=6ab31e68 cx=c_pps a=PpDZqlmH/M8setHirZLBMw==:117 a=PpDZqlmH/M8setHirZLBMw==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=MiSfXwtfHNbOvtnt5w8A:9 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-09-22_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 suspectscore=0 phishscore=0 bulkscore=0 clxscore=1015 spamscore=0 malwarescore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609230001 Content-Type: text/plain; charset="utf-8" Kernel driver implementation for LTC3208 Multidisplay LED Driver. The LTC3208 is a Multi-display LED driver, designed to control up to 7 distinct LED channels (MAIN, SUB, AUX, CAMHI, CAMLO, RED, GREEN, BLUE), each configurable with its own current level that is equally set to its respective output current source pins for external LEDs. It is programmed via the I2C serial interface. MAIN and SUB support 8-bit current level resolution, while AUX, CAMHI/LO, RED, GREEN, and BLUE support 4-bit levels. The AUX LED channel can be configured to mirror the CAM, SUB, and MAIN channel current levels, or as its own independent AUX channel. The CAM LED channel is configured as 2 separate CAMHI and CAMLO register sub-channels, which current is selected via the CAMHL pin, or set to CAMHI register only via setting the S_CAMHILO bit high in register G (0x7). Signed-off-by: Jan Carlo Roleda --- MAINTAINERS | 1 + drivers/leds/Kconfig | 12 ++ drivers/leds/Makefile | 1 + drivers/leds/leds-ltc3208.c | 234 ++++++++++++++++++++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 drivers/leds/leds-ltc3208.c diff --git a/MAINTAINERS b/MAINTAINERS index c422939a82694..a1eb0937238dc 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15533,6 +15533,7 @@ L: linux-leds@vger.kernel.org S: Maintained W: https://ez.analog.com/linux-software-drivers F: Documentation/devicetree/bindings/leds/adi,ltc3208.yaml +F: drivers/leds/leds-ltc3208.c =20 LTC3220 LED DRIVER M: Edelweise Escala diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index d0d3182236be4..7ec2c8d785426 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -1042,6 +1042,18 @@ config LEDS_ACER_A500 This option enables support for the Power Button LED of Acer Iconia Tab A500. =20 +config LEDS_LTC3208 + tristate "LED Driver for Analog Devices LTC3208" + depends on LEDS_CLASS && I2C + select REGMAP_I2C + help + Say Y to enable the LTC3208 LED driver. + This enables the LED device LTC3208, a 7-channel, 17-current source + multidisplay high-current LED driver, configured via I2C. + + To compile this driver as a module, choose M here: the module will + be called ltc3208. + source "drivers/leds/blink/Kconfig" =20 comment "Flash and Torch LED drivers" diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index a68244bd50fb1..4d4b089156e24 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_LEDS_LP8788) +=3D leds-lp8788.o obj-$(CONFIG_LEDS_LP8860) +=3D leds-lp8860.o obj-$(CONFIG_LEDS_LP8864) +=3D leds-lp8864.o obj-$(CONFIG_LEDS_LT3593) +=3D leds-lt3593.o +obj-$(CONFIG_LEDS_LTC3208) +=3D leds-ltc3208.o obj-$(CONFIG_LEDS_LTC3220) +=3D leds-ltc3220.o obj-$(CONFIG_LEDS_MAX5970) +=3D leds-max5970.o obj-$(CONFIG_LEDS_MAX77650) +=3D leds-max77650.o diff --git a/drivers/leds/leds-ltc3208.c b/drivers/leds/leds-ltc3208.c new file mode 100644 index 0000000000000..64091f29f18a0 --- /dev/null +++ b/drivers/leds/leds-ltc3208.c @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * LED driver for Analog Devices LTC3208 Multi-Display Driver + * + * Copyright 2026 Analog Devices Inc. + * + * Author: Jan Carlo Roleda + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Registers */ +#define LTC3208_REG_A_GRNRED_CURRENT 0x1 /* Green and Red current DAC */ +#define LTC3208_REG_B_AUXBLU_CURRENT 0x2 /* AUX and Blue current DAC */ +#define LTC3208_REG_C_MAIN_CURRENT 0x3 /* Main current DAC */ +#define LTC3208_REG_D_SUB_CURRENT 0x4 /* Sub current DAC */ +#define LTC3208_REG_E_AUX_SELECT 0x5 /* AUX DAC Select */ +#define LTC3208_AUX1_MASK GENMASK(1, 0) +#define LTC3208_AUX2_MASK GENMASK(3, 2) +#define LTC3208_AUX3_MASK GENMASK(5, 4) +#define LTC3208_AUX4_MASK GENMASK(7, 6) +#define LTC3208_REG_F_CAM_CURRENT 0x6 /* CAM (High and Low) current DAC */ +#define LTC3208_REG_G_OPT 0x7 /* Device Options */ +#define LTC3208_OPT_CPO_MASK GENMASK(7, 6) +#define LTC3208_OPT_DIS_RGBDROP BIT(3) +#define LTC3208_OPT_DIS_CAMHILO BIT(2) +#define LTC3208_OPT_EN_RGBS BIT(1) + +#define LTC3208_MAX_BRIGHTNESS_4BIT 0xF +#define LTC3208_MAX_BRIGHTNESS_8BIT 0xFF + +#define LTC3208_NUM_AUX_LEDS 4 /* Number of configurable aux channels */ +#define LTC3208_NUM_REGS 7 /* Number of available registers to access */ + +enum ltc3208_aux_channel { + LTC3208_AUX_CHAN_AUX =3D 0, + LTC3208_AUX_CHAN_MAIN, + LTC3208_AUX_CHAN_SUB, + LTC3208_AUX_CHAN_CAM +}; + +enum ltc3208_channel { + LTC3208_CHAN_MAIN =3D 0, + LTC3208_CHAN_SUB, + LTC3208_CHAN_AUX, + LTC3208_CHAN_CAML, + LTC3208_CHAN_CAMH, + LTC3208_CHAN_RED, + LTC3208_CHAN_BLUE, + LTC3208_CHAN_GREEN, + LTC3208_CHAN_N_COUNT, +}; + +static const char *const ltc3208_dt_aux_channels[] =3D { + "adi,aux1-channel", + "adi,aux2-channel", + "adi,aux3-channel", + "adi,aux4-channel" +}; + +static const char *const ltc3208_aux_opt[] =3D { "aux", "main", "sub", "ca= m" }; + +struct ltc3208_led { + struct led_classdev cdev; + struct regmap_field *rfield; +}; + +static const struct reg_default ltc3208_reg_defaults[] =3D { + { LTC3208_REG_A_GRNRED_CURRENT, 0 }, + { LTC3208_REG_B_AUXBLU_CURRENT, 0 }, + { LTC3208_REG_C_MAIN_CURRENT, 0 }, + { LTC3208_REG_D_SUB_CURRENT, 0 }, + { LTC3208_REG_E_AUX_SELECT, 0 }, + { LTC3208_REG_F_CAM_CURRENT, 0 }, + { LTC3208_REG_G_OPT, 0 } +}; + +static const struct regmap_config ltc3208_regmap_cfg =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D LTC3208_REG_G_OPT, + .cache_type =3D REGCACHE_FLAT_S, + .reg_defaults =3D ltc3208_reg_defaults, + .num_reg_defaults =3D LTC3208_NUM_REGS, +}; + +static const struct reg_field ltc3208_led_reg_field[LTC3208_CHAN_N_COUNT] = =3D { + [LTC3208_CHAN_MAIN] =3D REG_FIELD(LTC3208_REG_C_MAIN_CURRENT, 0, 7), + [LTC3208_CHAN_SUB] =3D REG_FIELD(LTC3208_REG_D_SUB_CURRENT, 0, 7), + [LTC3208_CHAN_BLUE] =3D REG_FIELD(LTC3208_REG_B_AUXBLU_CURRENT, 0, 3), + [LTC3208_CHAN_AUX] =3D REG_FIELD(LTC3208_REG_B_AUXBLU_CURRENT, 4, 7), + [LTC3208_CHAN_CAML] =3D REG_FIELD(LTC3208_REG_F_CAM_CURRENT, 0, 3), + [LTC3208_CHAN_CAMH] =3D REG_FIELD(LTC3208_REG_F_CAM_CURRENT, 4, 7), + [LTC3208_CHAN_RED] =3D REG_FIELD(LTC3208_REG_A_GRNRED_CURRENT, 0, 3), + [LTC3208_CHAN_GREEN] =3D REG_FIELD(LTC3208_REG_A_GRNRED_CURRENT, 4, 7), +}; + +static int ltc3208_led_set_brightness(struct led_classdev *led_cdev, enum = led_brightness brightness) +{ + struct ltc3208_led *led =3D container_of(led_cdev, struct ltc3208_led, cd= ev); + u8 current_level =3D brightness; + + return regmap_field_write(led->rfield, current_level); +} + +static int ltc3208_probe(struct i2c_client *client) +{ + enum ltc3208_aux_channel aux_channels[LTC3208_NUM_AUX_LEDS]; + DECLARE_BITMAP(registered_chans, LTC3208_CHAN_N_COUNT) =3D { }; + struct regmap *regmap; + bool disable_rgb_aux4_dropout_signal; + bool disable_camhl_pin; + bool set_sub_control_pin; + int ret; + u8 dev_options; + + regmap =3D devm_regmap_init_i2c(client, <c3208_regmap_cfg); + if (IS_ERR(regmap)) + return dev_err_probe(&client->dev, PTR_ERR(regmap), "Failed to initializ= e regmap"); + + regcache_mark_dirty(regmap); + ret =3D regcache_sync(regmap); + if (ret) + return dev_err_probe(&client->dev, ret, "Failed to sync register cache"); + + disable_camhl_pin =3D device_property_read_bool(&client->dev, "adi,disabl= e-camhl-pin"); + + set_sub_control_pin =3D device_property_read_bool(&client->dev, "adi,cfg-= enrgbs-pin"); + + disable_rgb_aux4_dropout_signal =3D + device_property_read_bool(&client->dev, "adi,disable-rgb-aux4-dropout"); + + dev_options =3D FIELD_PREP(LTC3208_OPT_EN_RGBS, set_sub_control_pin) | + FIELD_PREP(LTC3208_OPT_DIS_CAMHILO, disable_camhl_pin) | + FIELD_PREP(LTC3208_OPT_CPO_MASK, 0) | + FIELD_PREP(LTC3208_OPT_DIS_RGBDROP, disable_rgb_aux4_dropout_signa= l); + + ret =3D regmap_write(regmap, LTC3208_REG_G_OPT, dev_options); + if (ret) + return dev_err_probe(&client->dev, ret, "Failed to set device options re= gister"); + + /* Initialize AUX channel configurations */ + for (int i =3D 0; i < LTC3208_NUM_AUX_LEDS; i++) { + /* Default value (AUX) if property is not present in DT */ + if (!device_property_present(&client->dev, ltc3208_dt_aux_channels[i])) { + aux_channels[i] =3D LTC3208_AUX_CHAN_AUX; + continue; + } + + ret =3D device_property_match_property_string(&client->dev, + ltc3208_dt_aux_channels[i], + ltc3208_aux_opt, LTC3208_NUM_AUX_LEDS); + if (ret < 0) + return dev_err_probe(&client->dev, ret, "Error reading AUX Channel %d",= i); + + aux_channels[i] =3D ret; + } + + dev_options =3D FIELD_PREP(LTC3208_AUX1_MASK, aux_channels[0]) | + FIELD_PREP(LTC3208_AUX2_MASK, aux_channels[1]) | + FIELD_PREP(LTC3208_AUX3_MASK, aux_channels[2]) | + FIELD_PREP(LTC3208_AUX4_MASK, aux_channels[3]); + + ret =3D regmap_write(regmap, LTC3208_REG_E_AUX_SELECT, dev_options); + if (ret) + return dev_err_probe(&client->dev, ret, "Error writing to aux channel re= gister"); + + device_for_each_child_node_scoped(&client->dev, child) { + struct ltc3208_led *led; + struct led_init_data init_data =3D { }; + u32 chan; + + ret =3D fwnode_property_read_u32(child, "reg", &chan); + if (ret) + return dev_err_probe(&client->dev, ret, + "Failed to get register value of LED"); + if (chan >=3D LTC3208_CHAN_N_COUNT) + return dev_err_probe(&client->dev, -EINVAL, "%u is an invalid LED ID", + chan); + if (test_and_set_bit(chan, registered_chans)) + return dev_err_probe(&client->dev, -EINVAL, "%u is already registered", + chan); + + led =3D devm_kzalloc(&client->dev, sizeof(*led), GFP_KERNEL); + if (!led) + return -ENOMEM; + + led->rfield =3D devm_regmap_field_alloc(&client->dev, regmap, + ltc3208_led_reg_field[chan]); + if (IS_ERR(led->rfield)) + return dev_err_probe(&client->dev, PTR_ERR(led->rfield), + "Cannot allocate regmap field"); + led->cdev.brightness_set_blocking =3D ltc3208_led_set_brightness; + led->cdev.max_brightness =3D LTC3208_MAX_BRIGHTNESS_4BIT; + + if (chan =3D=3D LTC3208_CHAN_MAIN || chan =3D=3D LTC3208_CHAN_SUB) + led->cdev.max_brightness =3D LTC3208_MAX_BRIGHTNESS_8BIT; + + init_data.fwnode =3D child; + + ret =3D devm_led_classdev_register_ext(&client->dev, &led->cdev, &init_d= ata); + if (ret) + return dev_err_probe(&client->dev, ret, "Failed to register LED %u", ch= an); + } + + return 0; +} + +static const struct of_device_id ltc3208_match_table[] =3D { + { .compatible =3D "adi,ltc3208" }, + { } +}; +MODULE_DEVICE_TABLE(of, ltc3208_match_table); + +static struct i2c_driver ltc3208_driver =3D { + .driver =3D { + .name =3D "ltc3208", + .of_match_table =3D ltc3208_match_table, + }, + .probe =3D ltc3208_probe, +}; +module_i2c_driver(ltc3208_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jan Carlo Roleda "); +MODULE_DESCRIPTION("LTC3208 LED Driver"); --=20 2.43.0