From nobody Tue Oct 7 03:50:36 2025 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6BC5258CEC; Mon, 14 Jul 2025 17:24:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513861; cv=none; b=F7ebt0vDejjBMxDjgA0r7MGovDUT+vBFX6eK99tk69hWZKSnLEfFcdFlyDjnhhTG96Z9NX3wPKicU0U0bf8hZIKhhJ7WZ7rcDalPQI96NjGTeOfQGlby5x6x6eB0LPmC9p9Q7lIawIKnJN6C8ZTjAPn2Pjp7ke5XIgA5yUEKkII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513861; c=relaxed/simple; bh=3aAUHT/QDMvttFMV/vGtaDB1Wn/oaRH08OeB1OMHdB4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OGyhyqAUBmHk2PT6zszL8nEMU36PrXqVwqyZf6GfiQNLfBahaVxa2PSRWlLTfVnhvFPTiunmRLQw4QYP8jJgh8bxzfLLS2pQ95X+9UGHkE3JAnj8TOhaFl+GyAHEHVAowoiC1Ec3Z9y+kw/JbT+Yk5nVQc7oucWoqn9vKw2ARvQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=I/IQi8Gu; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="I/IQi8Gu" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-747fba9f962so3756639b3a.0; Mon, 14 Jul 2025 10:24:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752513859; x=1753118659; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RoPbcmEYRh3xsdFjHY6C+5hbY4N/8mXNBbENBnq7Tm4=; b=I/IQi8GutCGAROa1DzWAgN30HFpPgyrr3tdTKZT1dZvQ5sl2mz+O5fFIKcmv9+/jSX eiNcVQOE3WUPxoUnswtVLAG448AtjTFn6WRTGXP/lH+GOo491eUAmhQ5UR5xLcFxcUfm 5UqqC9/kw9uD1+ThbEnG1f65Nl5biQJpSwHQrHqseKs9ZYJtLVcm0IRuTk1+Exy7aB6I WfYKslTwsENlIbeVudJykTxzFaT8TDfkkNAesDwDl22kS1RUC9FYupQexFNxi3PDfC3H Xb2JkKgVPLrxmwczWcyTimHX9e10HQ97Dcm2/3Keix2jvCxjEa98lCaWAUO6D77TC+0k +YFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752513859; x=1753118659; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RoPbcmEYRh3xsdFjHY6C+5hbY4N/8mXNBbENBnq7Tm4=; b=DlRfmR2pklggfr8IaV6uLYatPYxgjuE7cR/heodObwct0ak0nrC+n3k5Y2/AbHXZop Nn1kbWeIsOORTvpUrz/ANdQFJ+uTCu0Jg7fr9MseZEOVROjaEyVM94tXV319UjGtWbFF lWZWv/y0I0zRzp0JYHNFjgHH46HTR7Mo6I5QS1InVnT2q4jOI8KmPjPAsPy6KwrtOZzu siiCoGiYxHDbNeEScOBiiDtU4MrtaS/gjQ9uSeyUWEjB72Jwq0vsAjjQ0K3o4ZNvw0Bq KpFjLhaJMrmdUFcCB2tjXa5GhNkjPUyNS5hWNOrPFewCTiRpOGlR95KKYJbvx26miC9x bqng== X-Forwarded-Encrypted: i=1; AJvYcCUeAbf2K68TyThvgdK5Ob1hd1tzKT/0aI+7qOrt9EOn67cMbkaUrqfpVuB+ZpbXKVejwLW4uL6bXMYx9Q==@vger.kernel.org, AJvYcCVPd662v+9CC5TtaZ7E/VtGEE9gjfeFtHxHXoNAK+3fKmMEK19KI7+uV0dXVVCYKr8KvPi9HvDnPAid@vger.kernel.org, AJvYcCWbJdXB05IK60r5EU5IgEB4umue6TSTyHzteojnnHmutnccXXQwNVtrFlr5x/PeJhndIhRezGWjCTUp@vger.kernel.org, AJvYcCXjG23wiC0j0VZHvVmXmzuVSlHDt6jtvsLy+f4HS/Ysv+/aW5+yf0MXjiQn3BsKPbQwigWJ153aVov9nO3G@vger.kernel.org X-Gm-Message-State: AOJu0YwhvmUKqLM7l/tZ92evGv7q1lw3Mh4fCOZaoyKjrgXXesLFyaup uFqTh7Y5E7Xiu4fAVNWCC5hWNN+iJ9I1uy64Tg3cMHCKYWSJSPt8zpwD X-Gm-Gg: ASbGncuwrOnhN+ULpSdJSyPNODVb23uBHahCDVuy98o2g8SsA3yN9VkZx6bpr2GE8VX Ew7KYI8f057UPZtwoNtLczwkM2NtfAYY9VUC6J+4uldHy8XmwL3MmXf2mFhbfeCx7xlp3m1e/Bo 0qwlE2DdjrwQ/AYFv9wXZ0g6N/HgmGt5MVQ9UdeWd5cOvnArNMZU10jLGhvNz9GJHO0hbEgbf+x /EBGbvZkPWGW0AIKC28ph3eM8T2LIxmep0LPpTcE+ZMFsM4WCgsPDeWLm5KC9ikKF3j88D6Im7W /bSUPQAvLFbpKq/Z6uu5KZazswONW4DxYA0TouYoIaS4mU5plfmA9hfPPB0lFNFsDlEDWNm8wR+ YhI5MesSkMaY/rPKYSmk6bzTrvB/kOVBAvg== X-Google-Smtp-Source: AGHT+IEbrUQ9n5pK27xJK2F8mso64QY/ht2C3xxmyB8S0clyKnfowTmzAXOCRbgO7H4pAyhk4aWZtQ== X-Received: by 2002:a05:6a20:9150:b0:220:1843:3b7b with SMTP id adf61e73a8af0-2366f68a3e5mr699429637.4.1752513858572; Mon, 14 Jul 2025 10:24:18 -0700 (PDT) Received: from DESKTOP-P76LG1N.lan ([42.114.162.205]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74eb9e06537sm10495468b3a.43.2025.07.14.10.24.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Jul 2025 10:24:18 -0700 (PDT) From: Nam Tran To: lee@kernel.org Cc: pavel@kernel.org, rdunlap@infradead.org, christophe.jaillet@wanadoo.fr, krzk+dt@kernel.org, robh@kernel.org, conor+dt@kernel.org, corbet@lwn.net, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, Nam Tran , Krzysztof Kozlowski Subject: [PATCH v11 1/4] dt-bindings: leds: add TI/National Semiconductor LP5812 LED Driver Date: Tue, 15 Jul 2025 00:23:52 +0700 Message-Id: <20250714172355.84609-2-trannamatk@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250714172355.84609-1-trannamatk@gmail.com> References: <20250714172355.84609-1-trannamatk@gmail.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 Content-Type: text/plain; charset="utf-8" The LP5812 is a 4x3 RGB LED driver with an autonomous animation engine and time-cross-multiplexing (TCM) support for up to 12 LEDs or 4 RGB LEDs. It supports both analog (256 levels) and PWM (8-bit) dimming, including exponential PWM for smooth brightness control. Signed-off-by: Nam Tran Reviewed-by: Krzysztof Kozlowski --- .../devicetree/bindings/leds/ti,lp5812.yaml | 229 ++++++++++++++++++ MAINTAINERS | 6 + 2 files changed, 235 insertions(+) create mode 100644 Documentation/devicetree/bindings/leds/ti,lp5812.yaml diff --git a/Documentation/devicetree/bindings/leds/ti,lp5812.yaml b/Docume= ntation/devicetree/bindings/leds/ti,lp5812.yaml new file mode 100644 index 000000000000..848cd4f51901 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/ti,lp5812.yaml @@ -0,0 +1,229 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/ti,lp5812.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: TI LP5812 4x3 Matrix RGB LED Driver with Autonomous Control + +maintainers: + - Nam Tran + +description: | + The LP5812 is a 4x3 matrix RGB LED driver with I2C interface + and autonomous animation engine control. + For more product information please see the link below: + https://www.ti.com/product/LP5812#tech-docs + +properties: + compatible: + const: ti,lp5812 + + reg: + maxItems: 1 + + vcc-supply: + description: Regulator providing power to the 'VCC' pin. + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + +patternProperties: + "^led@[0-3]$": + type: object + $ref: common.yaml# + unevaluatedProperties: false + + properties: + reg: + minimum: 0 + maximum: 3 + + required: + - reg + + "^multi-led@[4-7]$": + type: object + $ref: leds-class-multicolor.yaml# + unevaluatedProperties: false + + properties: + reg: + minimum: 4 + maximum: 7 + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + patternProperties: + "^led@[4-9a-f]$": + type: object + $ref: common.yaml# + unevaluatedProperties: false + + properties: + reg: + minimum: 4 + maximum: 15 + + required: + - reg + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + #include + + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + led-controller@1b { + #address-cells =3D <1>; + #size-cells =3D <0>; + compatible =3D "ti,lp5812"; + reg =3D <0x1b>; + vcc-supply =3D <&vdd_3v3_reg>; + + led@0 { + reg =3D <0x0>; + label =3D "LED0"; + led-max-microamp =3D <25500>; + }; + + led@1 { + reg =3D <0x1>; + label =3D "LED1"; + led-max-microamp =3D <25500>; + }; + + led@2 { + reg =3D <0x2>; + label =3D "LED2"; + led-max-microamp =3D <25500>; + }; + + led@3 { + reg =3D <0x3>; + label =3D "LED3"; + led-max-microamp =3D <25500>; + }; + + multi-led@4 { + #address-cells =3D <1>; + #size-cells =3D <0>; + reg =3D <0x4>; + color =3D ; + label =3D "LED_A"; + + led@4 { + reg =3D <0x4>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@5 { + reg =3D <0x5>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@6 { + reg =3D <0x6>; + color =3D ; + led-max-microamp =3D <25500>; + }; + }; + + multi-led@5 { + #address-cells =3D <1>; + #size-cells =3D <0>; + reg =3D <0x5>; + color =3D ; + label =3D "LED_B"; + + led@7 { + reg =3D <0x7>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@8 { + reg =3D <0x8>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@9 { + reg =3D <0x9>; + color =3D ; + led-max-microamp =3D <25500>; + }; + }; + + multi-led@6 { + #address-cells =3D <1>; + #size-cells =3D <0>; + reg =3D <0x6>; + color =3D ; + label =3D "LED_C"; + + led@a { + reg =3D <0xa>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@b { + reg =3D <0xb>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@c { + reg =3D <0xc>; + color =3D ; + led-max-microamp =3D <25500>; + }; + }; + + multi-led@7 { + #address-cells =3D <1>; + #size-cells =3D <0>; + reg =3D <0x7>; + color =3D ; + label =3D "LED_D"; + + led@d { + reg =3D <0xd>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@e { + reg =3D <0xe>; + color =3D ; + led-max-microamp =3D <25500>; + }; + + led@f { + reg =3D <0xf>; + color =3D ; + led-max-microamp =3D <25500>; + }; + }; + }; + }; + +... diff --git a/MAINTAINERS b/MAINTAINERS index a92290fffa16..83a779dc9bcd 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24561,6 +24561,12 @@ S: Supported F: Documentation/devicetree/bindings/iio/dac/ti,dac7612.yaml F: drivers/iio/dac/ti-dac7612.c =20 +TEXAS INSTRUMENTS' LP5812 RGB LED DRIVER +M: Nam Tran +L: linux-leds@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/leds/ti,lp5812.yaml + TEXAS INSTRUMENTS' LB8864 LED BACKLIGHT DRIVER M: Alexander Sverdlin L: linux-leds@vger.kernel.org --=20 2.25.1 From nobody Tue Oct 7 03:50:36 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15C4F1DDC2B; Mon, 14 Jul 2025 17:24:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513868; cv=none; b=LapUJHH5REqW2ktFRnrY5ikEpZy0h94YPAxhVfiEOkp9FHvKclUIT8rXGev8HNQYWrpxx1FNkN8gUmJXox2GJPobLHIb7CNuYZL8Pt0zNGOxZsJQOmPLDWXBSeoi7tAWCZeV+8vst5CUvmcn+cMNjjBpghG/VKr1o4joftrJS5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513868; c=relaxed/simple; bh=EAsia60doYGd6pUHYPfsRSls6lWsXe2vv01T+sLet14=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GAHMZygdQ3o56RuPu5bz8X6QyQn38Zuh7R5KNFGctyVR73Ct6UdRdRHSR6kq2+ro64TVjB2NmYg1WQY4Dg3oCGoRZdtmlTMC5aGuQW5FVI00J/fKpsYpCilDqhBq9snnEqHDuJRR/HpaHejFpKJLlB5oWx85xuBfhEjYCxxSjQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iBrmteC9; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iBrmteC9" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-742c3d06de3so4984438b3a.0; Mon, 14 Jul 2025 10:24:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752513865; x=1753118665; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ITOc/vzbdxcYHfA7O2lNOHZFNQIUdnZgxToDafgif/4=; b=iBrmteC9WXuTL7QSAbxzX3C0BAOvCVZPKsl7jVa0EtTE8A0mzPA95CH2HEj3h8SQnP q47hruRnwqxlfs9HrFYiic0ei7Nup2nZvV9hwJBH4sfjrwOaNhXPMNRfgk6kWrqkiXUg L01kyVhGDbq463fuTYQcTpvvOxOp+hsCqCy87UcHL193oeYXFg2k/pvNdCddzbVFz2SH DkD+O6lkiW0yJxTieHfYr2emEOoWRtoE7Ejwd6ZoQFVHrWQGTTVR1XRK1P6W6KuR5v0c zRn4+IZM6iprICdMlXS/hhZ02XpZkks6micOiN4hGd5LJU5BQpKAFWnLDHNie+ilgmjX ADnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752513865; x=1753118665; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ITOc/vzbdxcYHfA7O2lNOHZFNQIUdnZgxToDafgif/4=; b=ENr9dQkxe55awEZe0Ic95k+ifuAl3RXAeeuYolqvpsuS2UKBuvXF0uXu+dsZFzanDn 1OdshEoesZGDKefG4uVj7UsR/9JIhCyqWuOGLZNM43G3foWgOgQ6Ueusp8YoqVJM/RRz FkzpSAilFsieMZUXwV+v44ZD7+7Wtek+UNOzpFGjCFBzIlK/tjsYmLaVUXVqwXcQSDtT xRhmRcVzSHv2TR0JHbGRy9PEDeG4qV9wlv2hqOEr1+TW5aJARrxxVdKNSB+S0hgfB3ls m+188OCpZBUqHiTvHVMblmmhBzbNwMWgDjr+qW3Btd6jQ8wFxNLietcGRA0Fk8Ns1jwX WnMw== X-Forwarded-Encrypted: i=1; AJvYcCUX/PiIjZy33QS+oOQqVvHWucOf/dMzAyVYy7hyQDl6ca+ENz+CpjtS1BILq0xvngB3JzYWi3WlTrFi@vger.kernel.org, AJvYcCUkHIlOujFbWszKJVDNvKr8CKjTJthdGoLJnxxKK0ygRbjbP4GlHQSxBt/1L0jb4Mzn/xOridIe+91v@vger.kernel.org, AJvYcCWiDID7pJwrjdcS0dt6+XtPP7M5gZ2E2fmOi9a5znWy9i2yk2auJcE/ovuusQJQe2u/GEZ9ddkFqgJemfcB@vger.kernel.org, AJvYcCXak3HZ88nJAAJs+B3l6XycJCaL1qHoXzpgCpM/3/KOOLItHbT0sqfiV3ur4WfpMCbZnzcGX0M1j/qA7g==@vger.kernel.org X-Gm-Message-State: AOJu0YyN+o1VxtigcjN1+r8quzM4djtdIpcf9Iym5U6t9HTNa/PDk2iY R28lUBNlEylEE8M8WBvTuW2yCbZbdgTdheT0diRDBWqPfDbSMP2IFlOh X-Gm-Gg: ASbGncszZiUMRxtyPOa8CWpy08nopgiNBbkYt7a6lAh6IN3LtE6JzkPKll1zIvf+iyN 2YmIupWpMA7ceiQt8WEiqBtcdkoX9i5u7UaMnPXlsg258/tURrCbirXDTD/Rg4Ird99GdzdM8Fk nhaUPyBah9Pnbq1J0RXUqccU98QVi2vNUiW1mmvLVKvIsyUqdRIY87xrqP/IJfC5BMBENDJ4dJz SjkRwqYH+YUkXV9/gAA1mLwAE74/3I+KA3b+K7+tgq1CGQVZv9R/yuam+jR//bH6FsBACY2nyeb TdXjtf0vfe6ELpRMzOFR+BHc8BAs9lwkPkXLwK2oYTPcQJNsqvEfS3TXy9KArqXDBhvBP7aEBXH MCf1xs0Za8AM+ZiZHtWBskRjVjebMbbH3u7MoYop1TMbp X-Google-Smtp-Source: AGHT+IGjhm4UoT9sIRuMi6LJ3PckciFbedF155akQbB9Je1WUsPeFnWRyQM277JxKA2gk+2CA6BZEw== X-Received: by 2002:a05:6a20:6a07:b0:233:f0c6:a89e with SMTP id adf61e73a8af0-233f0c6ab12mr11603467637.33.1752513864998; Mon, 14 Jul 2025 10:24:24 -0700 (PDT) Received: from DESKTOP-P76LG1N.lan ([42.114.162.205]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74eb9e06537sm10495468b3a.43.2025.07.14.10.24.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Jul 2025 10:24:24 -0700 (PDT) From: Nam Tran To: lee@kernel.org Cc: pavel@kernel.org, rdunlap@infradead.org, christophe.jaillet@wanadoo.fr, krzk+dt@kernel.org, robh@kernel.org, conor+dt@kernel.org, corbet@lwn.net, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, Nam Tran Subject: [PATCH v11 2/4] leds: add basic support for TI/National Semiconductor LP5812 LED Driver Date: Tue, 15 Jul 2025 00:23:53 +0700 Message-Id: <20250714172355.84609-3-trannamatk@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250714172355.84609-1-trannamatk@gmail.com> References: <20250714172355.84609-1-trannamatk@gmail.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 Content-Type: text/plain; charset="utf-8" The LP5812 is a 4x3 matrix RGB LED driver with an autonomous animation engine and time-cross-multiplexing (TCM) support for up to 12 LEDs or 4 RGB LEDs. Each LED can be configured through the related registers to realize vivid and fancy lighting effects. This patch adds minimal driver support for the LP5812, implementing only the essential functionality: I2C communication with the device, LED registration, brightness control in manual mode, and basic sysfs interfaces for LED configuration and fault monitoring. Signed-off-by: Nam Tran --- MAINTAINERS | 4 + drivers/leds/rgb/Kconfig | 13 + drivers/leds/rgb/Makefile | 1 + drivers/leds/rgb/leds-lp5812.c | 1147 ++++++++++++++++++++++++++++++++ drivers/leds/rgb/leds-lp5812.h | 164 +++++ 5 files changed, 1329 insertions(+) create mode 100644 drivers/leds/rgb/leds-lp5812.c create mode 100644 drivers/leds/rgb/leds-lp5812.h diff --git a/MAINTAINERS b/MAINTAINERS index 83a779dc9bcd..b4eb3265c800 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24566,6 +24566,10 @@ M: Nam Tran L: linux-leds@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/leds/ti,lp5812.yaml +F: drivers/leds/rgb/Kconfig +F: drivers/leds/rgb/Makefile +F: drivers/leds/rgb/leds-lp5812.c +F: drivers/leds/rgb/leds-lp5812.h =20 TEXAS INSTRUMENTS' LB8864 LED BACKLIGHT DRIVER M: Alexander Sverdlin diff --git a/drivers/leds/rgb/Kconfig b/drivers/leds/rgb/Kconfig index 222d943d826a..28ef4c487367 100644 --- a/drivers/leds/rgb/Kconfig +++ b/drivers/leds/rgb/Kconfig @@ -26,6 +26,19 @@ config LEDS_KTD202X To compile this driver as a module, choose M here: the module will be called leds-ktd202x. =20 +config LEDS_LP5812 + tristate "LED support for Texas Instruments LP5812" + depends on I2C + help + If you say Y here you get support for TI LP5812 LED driver. + The LP5812 is a 4x3 matrix RGB LED driver with autonomous + animation engine control. + + To compile this driver as a module, choose M here: the + module will be called leds-lp5812. + + If unsure, say N. + config LEDS_NCP5623 tristate "LED support for NCP5623" depends on I2C diff --git a/drivers/leds/rgb/Makefile b/drivers/leds/rgb/Makefile index a501fd27f179..be45991f63f5 100644 --- a/drivers/leds/rgb/Makefile +++ b/drivers/leds/rgb/Makefile @@ -2,6 +2,7 @@ =20 obj-$(CONFIG_LEDS_GROUP_MULTICOLOR) +=3D leds-group-multicolor.o obj-$(CONFIG_LEDS_KTD202X) +=3D leds-ktd202x.o +obj-$(CONFIG_LEDS_LP5812) +=3D leds-lp5812.o obj-$(CONFIG_LEDS_NCP5623) +=3D leds-ncp5623.o obj-$(CONFIG_LEDS_PWM_MULTICOLOR) +=3D leds-pwm-multicolor.o obj-$(CONFIG_LEDS_QCOM_LPG) +=3D leds-qcom-lpg.o diff --git a/drivers/leds/rgb/leds-lp5812.c b/drivers/leds/rgb/leds-lp5812.c new file mode 100644 index 000000000000..278c0a09e7c4 --- /dev/null +++ b/drivers/leds/rgb/leds-lp5812.c @@ -0,0 +1,1147 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * LP5812 LED driver + * + * Copyright (C) 2025 Texas Instruments + * + * Author: Jared Zhou + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "leds-lp5812.h" + +#define LP5812_SC_LED "SC_LED" +#define LP5812_MC_LED "MC_LED" + +static int lp5812_write(struct lp5812_chip *chip, u16 reg, u8 val) +{ + struct device *dev =3D &chip->client->dev; + struct i2c_msg msg; + u8 buf[2]; + u8 extracted_bits; + int ret; + + /* Extract register address bits 9 and 8 for Address Byte 1 */ + extracted_bits =3D (reg >> 8) & 0x03; + + /* Prepare payload: Address Byte 2 (bits [7:0]) and value to write */ + buf[0] =3D (u8)(reg & 0xFF); + buf[1] =3D val; + + /* Construct I2C message for a write operation */ + msg.addr =3D (chip->client->addr << 2) | extracted_bits; + msg.flags =3D 0; + msg.len =3D sizeof(buf); + msg.buf =3D buf; + + ret =3D i2c_transfer(chip->client->adapter, &msg, 1); + if (ret !=3D 1) { + dev_err(dev, "I2C write error, ret=3D%d\n", ret); + ret =3D ret < 0 ? ret : -EIO; + } else { + ret =3D 0; + } + + return ret; +} + +static int lp5812_read(struct lp5812_chip *chip, u16 reg, u8 *val) +{ + struct device *dev =3D &chip->client->dev; + struct i2c_msg msgs[2]; + u8 ret_val; + u8 extracted_bits; + u8 converted_reg; + int ret; + + /* Extract register address bits 9 and 8 for Address Byte 1 */ + extracted_bits =3D (reg >> 8) & 0x03; + + /* Lower 8 bits go in Address Byte 2 */ + converted_reg =3D (u8)(reg & 0xFF); + + /* Prepare I2C write message to set register address */ + msgs[0].addr =3D (chip->client->addr << 2) | extracted_bits; + msgs[0].flags =3D 0; + msgs[0].len =3D 1; + msgs[0].buf =3D &converted_reg; + + /* Prepare I2C read message to retrieve register value */ + msgs[1].addr =3D (chip->client->addr << 2) | extracted_bits; + msgs[1].flags =3D I2C_M_RD; + msgs[1].len =3D 1; + msgs[1].buf =3D &ret_val; + + ret =3D i2c_transfer(chip->client->adapter, msgs, 2); + if (ret !=3D 2) { + dev_err(dev, "I2C read error, ret=3D%d\n", ret); + *val =3D 0; + ret =3D ret < 0 ? ret : -EIO; + } else { + /* Store the value retrieved from the hardware */ + *val =3D ret_val; + ret =3D 0; + } + + return ret; +} + +static int lp5812_parse_led_channel(struct device_node *np, + struct lp5812_led_config *cfg, + int led_index, int color_number) +{ + int color_id =3D 0, reg, ret; + + ret =3D of_property_read_u32(np, "reg", ®); + if (ret) + return ret; + + cfg[led_index].led_id[color_number] =3D reg; + + of_property_read_u8(np, "led-max-microamp", + &cfg[led_index].max_current[color_number]); + + of_property_read_u32(np, "color", &color_id); + cfg[led_index].color_id[color_number] =3D color_id; + + return 0; +} + +static int lp5812_parse_led(struct device_node *np, + struct lp5812_led_config *cfg, + int led_index) +{ + int num_colors =3D 0, ret; + + of_property_read_string(np, "label", &cfg[led_index].name); + + ret =3D of_property_read_u32(np, "reg", &cfg[led_index].chan_nr); + if (ret) + return ret; + + for_each_available_child_of_node_scoped(np, child) { + ret =3D lp5812_parse_led_channel(child, cfg, led_index, num_colors); + if (ret) + return ret; + num_colors++; + } + + if (num_colors =3D=3D 0) { + ret =3D lp5812_parse_led_channel(np, cfg, led_index, 0); + if (ret) + return ret; + num_colors =3D 1; + cfg[led_index].is_sc_led =3D true; + } else { + cfg[led_index].is_sc_led =3D false; + } + + cfg[led_index].num_colors =3D num_colors; + + return 0; +} + +static int lp5812_of_populate_pdata(struct device *dev, + struct device_node *np, + struct lp5812_chip *chip) +{ + struct lp5812_led_config *cfg; + int num_channels, i =3D 0, ret; + + num_channels =3D of_get_available_child_count(np); + if (num_channels =3D=3D 0) { + dev_err(dev, "no LED channels\n"); + return -EINVAL; + } + + cfg =3D devm_kcalloc(dev, num_channels, sizeof(*cfg), GFP_KERNEL); + if (!cfg) + return -ENOMEM; + + chip->led_config =3D &cfg[0]; + chip->num_channels =3D num_channels; + + for_each_available_child_of_node_scoped(np, child) { + ret =3D lp5812_parse_led(child, cfg, i); + if (ret) + return -EINVAL; + i++; + } + + of_property_read_string(np, "label", &chip->label); + return 0; +} + +static int lp5812_read_tsd_config_status(struct lp5812_chip *chip, u8 *reg= _val) +{ + return lp5812_read(chip, chip->cfg->reg_tsd_config_status.addr, reg_val); +} + +static int lp5812_update_regs_config(struct lp5812_chip *chip) +{ + u8 reg_val; + int ret; + + ret =3D lp5812_write(chip, chip->cfg->reg_cmd_update.addr, LP5812_UPDATE_= CMD_VAL); + if (ret) + return ret; + + ret =3D lp5812_read_tsd_config_status(chip, ®_val); /* Save register v= alue */ + if (ret =3D=3D 0) + return (int)(reg_val & 0x01); + + return ret; +} + +static int lp5812_disable_all_leds(struct lp5812_chip *chip) +{ + int ret; + + ret =3D lp5812_write(chip, chip->cfg->reg_led_en_1.addr, 0x00); + if (ret) + return ret; + ret =3D lp5812_write(chip, chip->cfg->reg_led_en_2.addr, 0x00); + if (ret) + return ret; + + return ret; +} + +static int lp5812_fault_clear(struct lp5812_chip *chip, u8 value) +{ + u8 reg_val; + + if (value =3D=3D 0) + reg_val =3D LOD_CLEAR_VAL; + else if (value =3D=3D 1) + reg_val =3D LSD_CLEAR_VAL; + else if (value =3D=3D 2) + reg_val =3D TSD_CLEAR_VAL; + else if (value =3D=3D 3) + reg_val =3D FAULT_CLEAR_ALL; + else + return -EINVAL; + + return lp5812_write(chip, chip->cfg->reg_reset.addr, reg_val); +} + +static void set_mix_sel_led(struct lp5812_chip *chip, int mix_sel_led) +{ + if (mix_sel_led =3D=3D 0) + chip->u_drive_mode.s_drive_mode.mix_sel_led_0 =3D 1; + + if (mix_sel_led =3D=3D 1) + chip->u_drive_mode.s_drive_mode.mix_sel_led_1 =3D 1; + + if (mix_sel_led =3D=3D 2) + chip->u_drive_mode.s_drive_mode.mix_sel_led_2 =3D 1; + + if (mix_sel_led =3D=3D 3) + chip->u_drive_mode.s_drive_mode.mix_sel_led_3 =3D 1; +} + +static ssize_t parse_drive_mode(struct lp5812_chip *chip, char *str) +{ + char *sub_str; + int tcm_scan_num, mix_scan_num, mix_sel_led, scan_oder[4], i, ret; + + chip->u_drive_mode.s_drive_mode.mix_sel_led_0 =3D 0; + chip->u_drive_mode.s_drive_mode.mix_sel_led_1 =3D 0; + chip->u_drive_mode.s_drive_mode.mix_sel_led_2 =3D 0; + chip->u_drive_mode.s_drive_mode.mix_sel_led_3 =3D 0; + + sub_str =3D strsep(&str, ":"); + if (sysfs_streq(sub_str, "direct_mode")) { + chip->u_drive_mode.s_drive_mode.led_mode =3D 0; + } else if (sysfs_streq(sub_str, "tcmscan")) { + /* Get tcm scan number */ + sub_str =3D strsep(&str, ":"); + if (!sub_str) + return -EINVAL; + ret =3D kstrtoint(sub_str, 0, &tcm_scan_num); + if (ret) + return ret; + if (tcm_scan_num < 0 || tcm_scan_num > 4) + return -EINVAL; + chip->u_drive_mode.s_drive_mode.led_mode =3D tcm_scan_num; + + for (i =3D 0; i < tcm_scan_num; i++) { + sub_str =3D strsep(&str, ":"); + if (!sub_str) + return -EINVAL; + ret =3D kstrtoint(sub_str, 0, &scan_oder[i]); + if (ret) + return ret; + } + + chip->u_scan_order.s_scan_order.scan_order_0 =3D scan_oder[0]; + chip->u_scan_order.s_scan_order.scan_order_1 =3D scan_oder[1]; + chip->u_scan_order.s_scan_order.scan_order_2 =3D scan_oder[2]; + chip->u_scan_order.s_scan_order.scan_order_3 =3D scan_oder[3]; + } else if (sysfs_streq(sub_str, "mixscan")) { + /* Get mix scan number */ + sub_str =3D strsep(&str, ":"); + if (!sub_str) + return -EINVAL; + ret =3D kstrtoint(sub_str, 0, &mix_scan_num); + if (ret) + return ret; + if (mix_scan_num < 0 || mix_scan_num > 3) + return -EINVAL; + + chip->u_drive_mode.s_drive_mode.led_mode =3D mix_scan_num + 4; + /* Get mix_sel_led */ + sub_str =3D strsep(&str, ":"); + if (!sub_str) + return -EINVAL; + ret =3D kstrtoint(sub_str, 0, &mix_sel_led); + if (ret) + return ret; + if (mix_sel_led < 0 || mix_sel_led > 3) + return -EINVAL; + set_mix_sel_led(chip, mix_sel_led); + + for (i =3D 0; i < mix_scan_num; i++) { + sub_str =3D strsep(&str, ":"); + if (!sub_str) + return -EINVAL; + ret =3D kstrtoint(sub_str, 0, &scan_oder[i]); + if (ret) + return ret; + if (scan_oder[i] =3D=3D mix_sel_led || scan_oder[i] < 0 || scan_oder[i]= > 3) + return -EINVAL; + } + chip->u_scan_order.s_scan_order.scan_order_0 =3D scan_oder[0]; + chip->u_scan_order.s_scan_order.scan_order_1 =3D scan_oder[1]; + chip->u_scan_order.s_scan_order.scan_order_2 =3D scan_oder[2]; + chip->u_scan_order.s_scan_order.scan_order_3 =3D scan_oder[3]; + } else { + return -EINVAL; + } + return 0; +} + +static int lp5812_set_drive_mode_scan_order(struct lp5812_chip *chip) +{ + u8 val; + int ret; + + /* Set led mode */ + val =3D chip->u_drive_mode.drive_mode_val; + ret =3D lp5812_write(chip, chip->cfg->reg_dev_config_1.addr, val); + if (ret) + return ret; + + /* Setup scan order */ + val =3D chip->u_scan_order.scan_order_val; + ret =3D lp5812_write(chip, chip->cfg->reg_dev_config_2.addr, val); + + return ret; +} + +static ssize_t dev_config_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct lp5812_led *led =3D i2c_get_clientdata(to_i2c_client(dev)); + struct lp5812_chip *chip =3D led->chip; + int ret; + + guard(mutex)(&chip->lock); + ret =3D parse_drive_mode(chip, (char *)buf); + if (ret) + return ret; + + ret =3D lp5812_set_drive_mode_scan_order(chip); + if (ret) + return ret; + + ret =3D lp5812_update_regs_config(chip); + if (ret) + return ret; + + return len; +} + +static ssize_t fault_clear_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct lp5812_led *led =3D i2c_get_clientdata(to_i2c_client(dev)); + struct lp5812_chip *chip =3D led->chip; + int fault_clear, ret; + + ret =3D kstrtoint(buf, 0, &fault_clear); + if (ret) + return ret; + + if (fault_clear < 0 || fault_clear > 3) + return -EINVAL; + + guard(mutex)(&chip->lock); + ret =3D lp5812_fault_clear(chip, fault_clear); + if (ret) + return -EIO; + + return len; +} + +static ssize_t tsd_config_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct lp5812_led *led =3D i2c_get_clientdata(to_i2c_client(dev)); + struct lp5812_chip *chip =3D led->chip; + int tsd_stat, config_stat, ret; + u8 reg_val; + + guard(mutex)(&chip->lock); + ret =3D lp5812_read(chip, chip->cfg->reg_tsd_config_status.addr, ®_val= ); + if (ret) + return -EIO; + tsd_stat =3D (reg_val >> 1) & 0x01; + config_stat =3D reg_val & 0x01; + + return sysfs_emit(buf, "%d %d\n", tsd_stat, config_stat); +} + +static ssize_t sw_reset_store(struct device *dev, struct device_attribute = *attr, + const char *buf, size_t len) +{ + struct lp5812_led *led =3D i2c_get_clientdata(to_i2c_client(dev)); + struct lp5812_chip *chip =3D led->chip; + int reset, ret; + + ret =3D kstrtoint(buf, 0, &reset); + if (ret) + return ret; + + if (reset !=3D 1) + return -EINVAL; + + guard(mutex)(&chip->lock); + ret =3D lp5812_write(chip, chip->cfg->reg_reset.addr, LP5812_RESET); + if (ret) + return -EIO; + + return len; +} + +static void lp5812_deinit_device(struct lp5812_chip *chip) +{ + (void)lp5812_disable_all_leds(chip); + (void)lp5812_write(chip, chip->cfg->reg_chip_en.addr, (u8)0); +} + +static int lp5812_init_device(struct lp5812_chip *chip) +{ + int ret; + + usleep_range(1000, 1100); + + ret =3D lp5812_write(chip, chip->cfg->reg_chip_en.addr, (u8)1); + if (ret) { + dev_err(&chip->client->dev, "lp5812_enable_disable failed\n"); + return ret; + } + + ret =3D lp5812_write(chip, chip->cfg->reg_dev_config_12.addr, 0x0B); + if (ret) { + dev_err(&chip->client->dev, "write 0x0B to DEV_CONFIG12 failed\n"); + return ret; + } + + ret =3D lp5812_update_regs_config(chip); + if (ret) { + dev_err(&chip->client->dev, "lp5812_update_regs_config failed\n"); + return ret; + } + + return 0; +} + +static struct lp5812_led *lp5812_dev_to_led(struct device *dev) +{ + struct led_classdev *cdev =3D dev_get_drvdata(dev); + const char *name =3D dev->platform_data; + + if (strcmp(name, LP5812_SC_LED) =3D=3D 0) + return container_of(cdev, struct lp5812_led, cdev); + + return container_of((struct led_classdev_mc *)cdev, struct lp5812_led, mc= _cdev); +} + +static int lp5812_read_lod_status(struct lp5812_chip *chip, int led_number= , u8 *val) +{ + u8 reg_val; + u16 reg; + int ret; + + if (!val) + return -1; + + if (led_number < 0x8) + reg =3D chip->cfg->reg_lod_status_base.addr; + else + reg =3D chip->cfg->reg_lod_status_base.addr + 1; + + ret =3D lp5812_read(chip, reg, ®_val); + if (ret) + return ret; + + *val =3D (reg_val & (1 << (led_number % 8))) ? 1 : 0; + + return ret; +} + +static int lp5812_read_lsd_status(struct lp5812_chip *chip, int led_number= , u8 *val) +{ + u8 reg_val; + u16 reg; + int ret; + + if (!val) + return -1; + + if (led_number < 0x8) + reg =3D chip->cfg->reg_lsd_status_base.addr; + else + reg =3D chip->cfg->reg_lsd_status_base.addr + 1; + + ret =3D lp5812_read(chip, reg, ®_val); + if (ret) + return ret; + + *val =3D (reg_val & (1 << (led_number % 8))) ? 1 : 0; + + return ret; +} + +static int lp5812_set_led_mode(struct lp5812_chip *chip, int led_number, + enum control_mode mode) +{ + u8 reg_val; + u16 reg; + int ret; + + if (led_number <=3D 7) + reg =3D chip->cfg->reg_dev_config_3.addr; + else + reg =3D chip->cfg->reg_dev_config_4.addr; + + ret =3D lp5812_read(chip, reg, ®_val); + if (ret) + return ret; + + if (mode =3D=3D LP5812_MODE_MANUAL) + reg_val &=3D ~(1 << (led_number % 8)); + else + reg_val |=3D (1 << (led_number % 8)); + + ret =3D lp5812_write(chip, reg, reg_val); + if (ret) + return ret; + + ret =3D lp5812_update_regs_config(chip); + + return ret; +} + +static int lp5812_get_led_mode(struct lp5812_chip *chip, int led_number, + enum control_mode *mode) +{ + u8 reg_val; + u16 reg; + int ret; + + if (led_number <=3D 7) + reg =3D chip->cfg->reg_dev_config_3.addr; + else + reg =3D chip->cfg->reg_dev_config_4.addr; + + ret =3D lp5812_read(chip, reg, ®_val); + if (ret) + return ret; + + *mode =3D (reg_val & (1 << (led_number % 8))) ? LP5812_MODE_AUTONOMOUS : = LP5812_MODE_MANUAL; + return 0; +} + +static int lp5812_manual_dc_pwm_control(struct lp5812_chip *chip, int led_= number, + u8 val, enum dimming_type dimming_type) +{ + u16 led_base_reg; + int ret; + + if (dimming_type =3D=3D LP5812_DIMMING_ANALOG) + led_base_reg =3D chip->cfg->reg_manual_dc_base.addr; + else + led_base_reg =3D chip->cfg->reg_manual_pwm_base.addr; + ret =3D lp5812_write(chip, led_base_reg + led_number, val); + + return ret; +} + +static int lp5812_auto_dc(struct lp5812_chip *chip, + int led_number, u8 val) +{ + return lp5812_write(chip, chip->cfg->reg_auto_dc_base.addr + led_number, = val); +} + +static int lp5812_multicolor_brightness(struct lp5812_led *led) +{ + int ret, i; + struct lp5812_chip *chip =3D led->chip; + + guard(mutex)(&chip->lock); + for (i =3D 0; i < led->mc_cdev.num_colors; i++) { + ret =3D lp5812_manual_dc_pwm_control(chip, led->mc_cdev.subled_info[i].c= hannel, + led->mc_cdev.subled_info[i].brightness, + LP5812_DIMMING_PWM); + if (ret) + break; + } + + return ret; +} + +static int lp5812_led_brightness(struct lp5812_led *led) +{ + struct lp5812_chip *chip =3D led->chip; + struct lp5812_led_config *led_cfg; + int ret; + + led_cfg =3D &chip->led_config[led->chan_nr]; + + guard(mutex)(&chip->lock); + ret =3D lp5812_manual_dc_pwm_control(chip, led_cfg->led_id[0], + led->brightness, LP5812_DIMMING_PWM); + + return ret; +} + +static ssize_t activate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct lp5812_led *led; + struct lp5812_chip *chip; + struct lp5812_led_config *led_cfg; + char *sub_str, *str =3D (char *)buf; + u8 reg_val, chan_nr =3D 0; + u16 reg; + int val[LED_COLOR_ID_MAX]; + int i, ret; + + led =3D lp5812_dev_to_led(dev); + chan_nr =3D led->chan_nr; + chip =3D led->chip; + led_cfg =3D &chip->led_config[chan_nr]; + for (i =3D 0; i < led_cfg->num_colors; i++) { + sub_str =3D strsep(&str, " "); + if (!sub_str) + return -EINVAL; + if (kstrtoint(sub_str, 0, &val[i])) + return -EINVAL; + if (val[i] !=3D 0 && val[i] !=3D 1) + return -EINVAL; + } + + guard(mutex)(&chip->lock); + for (i =3D 0; i < led_cfg->num_colors; i++) { + if (led_cfg->led_id[i] < 0x8) + reg =3D chip->cfg->reg_led_en_1.addr; + else + reg =3D chip->cfg->reg_led_en_2.addr; + + ret =3D lp5812_read(chip, reg, ®_val); + if (ret) + return -EIO; + + if (val[i] =3D=3D 0) + reg_val &=3D ~(1 << (led_cfg->led_id[i] % 8)); + else + reg_val |=3D (1 << (led_cfg->led_id[i] % 8)); + + ret =3D lp5812_write(chip, reg, reg_val); + if (ret) + return -EIO; + } + + return len; +} + +static ssize_t led_current_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct lp5812_led *led; + struct lp5812_chip *chip; + struct lp5812_led_config *led_cfg; + enum control_mode mode; + char *sub_str, *str =3D (char *)buf; + u8 chan_nr =3D 0; + int val[LED_COLOR_ID_MAX]; + int i, ret; + + led =3D lp5812_dev_to_led(dev); + chan_nr =3D led->chan_nr; + chip =3D led->chip; + led_cfg =3D &chip->led_config[chan_nr]; + for (i =3D 0; i < led_cfg->num_colors; i++) { + sub_str =3D strsep(&str, " "); + if (!sub_str) + return -EINVAL; + if (kstrtoint(sub_str, 0, &val[i])) + return -EINVAL; + } + + guard(mutex)(&chip->lock); + for (i =3D 0; i < led_cfg->num_colors; i++) { + ret =3D lp5812_get_led_mode(chip, led_cfg->led_id[i], &mode); + if (ret) + return -EIO; + + if (mode =3D=3D 1) + ret =3D lp5812_auto_dc(chip, led_cfg->led_id[i], val[i]); + else + ret =3D lp5812_manual_dc_pwm_control(chip, led_cfg->led_id[i], + val[i], LP5812_DIMMING_ANALOG); + if (ret) + return -EIO; + } + + return len; +} + +static ssize_t lod_lsd_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct lp5812_led *led; + struct lp5812_chip *chip; + struct lp5812_led_config *led_cfg; + u8 chan_nr =3D 0, i, lsd_status, lod_status; + int size =3D 0, ret; + + led =3D lp5812_dev_to_led(dev); + chan_nr =3D led->chan_nr; + chip =3D led->chip; + led_cfg =3D &chip->led_config[chan_nr]; + + guard(mutex)(&chip->lock); + for (i =3D 0; i < led_cfg->num_colors; i++) { + ret =3D lp5812_read_lsd_status(chip, led_cfg->led_id[i], &lsd_status); + if (!ret) + ret =3D lp5812_read_lod_status(chip, led_cfg->led_id[i], &lod_status); + if (ret) + return -EIO; + + size +=3D sysfs_emit_at(buf, size, "%d:%d %d\n", + led_cfg->led_id[i], lod_status, lsd_status); + } + return size; +} + +static ssize_t max_current_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct lp5812_led *led; + struct lp5812_chip *chip; + u8 val; + int ret; + + led =3D lp5812_dev_to_led(dev); + chip =3D led->chip; + + guard(mutex)(&chip->lock); + ret =3D lp5812_read(chip, chip->cfg->reg_dev_config_0.addr, &val); + if (ret) + return ret; + + return sysfs_emit(buf, "%d\n", (val & 0x01)); +} + +static DEVICE_ATTR_WO(led_current); +static DEVICE_ATTR_RO(max_current); +static DEVICE_ATTR_WO(activate); +static DEVICE_ATTR_RO(lod_lsd); + +static struct attribute *lp5812_led_attrs[] =3D { + &dev_attr_led_current.attr, + &dev_attr_max_current.attr, + &dev_attr_activate.attr, + &dev_attr_lod_lsd.attr, + NULL +}; +ATTRIBUTE_GROUPS(lp5812_led); + +static int lp5812_set_brightness(struct led_classdev *cdev, + enum led_brightness brightness) +{ + struct lp5812_led *led =3D container_of(cdev, struct lp5812_led, cdev); + + led->brightness =3D (u8)brightness; + return lp5812_led_brightness(led); +} + +static int lp5812_set_mc_brightness(struct led_classdev *cdev, + enum led_brightness brightness) +{ + struct led_classdev_mc *mc_dev =3D lcdev_to_mccdev(cdev); + struct lp5812_led *led =3D container_of(mc_dev, struct lp5812_led, mc_cde= v); + + led_mc_calc_color_components(&led->mc_cdev, brightness); + return lp5812_multicolor_brightness(led); +} + +static int lp5812_init_led(struct lp5812_led *led, struct lp5812_chip *chi= p, int chan) +{ + struct device *dev =3D &chip->client->dev; + struct mc_subled *mc_led_info; + struct led_classdev *led_cdev; + int i, ret =3D 0; + + if (chip->led_config[chan].name) { + led->cdev.name =3D chip->led_config[chan].name; + } else { + led->cdev.name =3D devm_kasprintf(dev, GFP_KERNEL, "%s:channel%d", + chip->label ? : chip->client->name, chan); + if (!led->cdev.name) + return -ENOMEM; + } + + if (!chip->led_config[chan].is_sc_led) { + mc_led_info =3D devm_kcalloc(dev, + chip->led_config[chan].num_colors, + sizeof(*mc_led_info), GFP_KERNEL); + if (!mc_led_info) + return -ENOMEM; + + led_cdev =3D &led->mc_cdev.led_cdev; + led_cdev->name =3D led->cdev.name; + led_cdev->brightness_set_blocking =3D lp5812_set_mc_brightness; + led->mc_cdev.num_colors =3D chip->led_config[chan].num_colors; + for (i =3D 0; i < led->mc_cdev.num_colors; i++) { + mc_led_info[i].color_index =3D + chip->led_config[chan].color_id[i]; + mc_led_info[i].channel =3D + chip->led_config[chan].led_id[i]; + } + + led->mc_cdev.subled_info =3D mc_led_info; + } else { + led->cdev.brightness_set_blocking =3D lp5812_set_brightness; + } + + led->cdev.groups =3D lp5812_led_groups; + led->chan_nr =3D chan; + + if (chip->led_config[chan].is_sc_led) { + ret =3D devm_led_classdev_register(dev, &led->cdev); + if (ret =3D=3D 0) { + led->cdev.dev->platform_data =3D devm_kstrdup(dev, LP5812_SC_LED, GFP_K= ERNEL); + if (!led->cdev.dev->platform_data) + return -ENOMEM; + } + } else { + ret =3D devm_led_classdev_multicolor_register(dev, &led->mc_cdev); + if (ret =3D=3D 0) { + led->mc_cdev.led_cdev.dev->platform_data =3D + devm_kstrdup(dev, LP5812_MC_LED, GFP_KERNEL); + if (!led->mc_cdev.led_cdev.dev->platform_data) + return -ENOMEM; + + ret =3D sysfs_create_groups(&led->mc_cdev.led_cdev.dev->kobj, + lp5812_led_groups); + if (ret) + dev_err(dev, "sysfs_create_groups failed\n"); + } + } + + if (ret) { + dev_err(dev, "led register err: %d\n", ret); + return ret; + } + + return 0; +} + +static int lp5812_register_leds(struct lp5812_led *led, struct lp5812_chip= *chip) +{ + struct lp5812_led *each; + int num_channels =3D chip->num_channels; + int ret, i, j; + + for (i =3D 0; i < num_channels; i++) { + each =3D led + i; + ret =3D lp5812_init_led(each, chip, i); + if (ret) + goto err_init_led; + + each->chip =3D chip; + + for (j =3D 0; j < chip->led_config[i].num_colors; j++) { + ret =3D lp5812_auto_dc(chip, chip->led_config[i].led_id[j], + chip->led_config[i].led_id[j]); + if (ret) + goto err_init_led; + + ret =3D lp5812_set_led_mode(chip, chip->led_config[i].led_id[j], + LP5812_MODE_MANUAL); + if (ret) + goto err_init_led; + } + } + + return 0; + +err_init_led: + return ret; +} + +static int lp5812_register_sysfs(struct lp5812_chip *chip) +{ + struct device *dev =3D &chip->client->dev; + const struct lp5812_device_config *cfg =3D chip->cfg; + int ret; + + ret =3D sysfs_create_group(&dev->kobj, cfg->dev_attr_group); + if (ret) + return ret; + + return 0; +} + +static void lp5812_unregister_sysfs(struct lp5812_led *led, struct lp5812_= chip *chip) +{ + struct device *dev =3D &chip->client->dev; + const struct lp5812_device_config *cfg =3D chip->cfg; + struct lp5812_led *each; + int i; + + sysfs_remove_group(&dev->kobj, cfg->dev_attr_group); + + for (i =3D 0; i < chip->num_channels; i++) { + if (!chip->led_config[i].is_sc_led) { + each =3D led + i; + sysfs_remove_groups(&each->mc_cdev.led_cdev.dev->kobj, lp5812_led_group= s); + } + } +} + +static int lp5812_probe(struct i2c_client *client) +{ + struct lp5812_chip *chip; + const struct i2c_device_id *id =3D i2c_client_get_device_id(client); + struct device_node *np =3D dev_of_node(&client->dev); + struct lp5812_led *led; + int ret; + + chip =3D devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); + if (!chip) + return -ENOMEM; + + chip->cfg =3D i2c_get_match_data(client); + + if (np) { + ret =3D lp5812_of_populate_pdata(&client->dev, np, chip); + if (ret) + goto err_init; + } else { + return dev_err_probe(&client->dev, -EINVAL, "No platform data\n"); + } + + led =3D devm_kcalloc(&client->dev, chip->num_channels, sizeof(*led), GFP_= KERNEL); + if (!led) + return -ENOMEM; + + chip->client =3D client; + + mutex_init(&chip->lock); + + i2c_set_clientdata(client, led); + + ret =3D lp5812_init_device(chip); + if (ret) + goto err_init; + + dev_info(&client->dev, "%s Programmable led chip found\n", id->name); + + ret =3D lp5812_register_leds(led, chip); + if (ret) + goto err_out; + + ret =3D lp5812_register_sysfs(chip); + if (ret) { + dev_err_probe(&client->dev, ret, "Registering sysfs failed\n"); + goto err_out; + } + + return 0; + +err_out: + lp5812_deinit_device(chip); +err_init: + return ret; +} + +static void lp5812_remove(struct i2c_client *client) +{ + struct lp5812_led *led =3D i2c_get_clientdata(client); + + lp5812_unregister_sysfs(led, led->chip); + lp5812_deinit_device(led->chip); + + dev_info(&client->dev, "Removed driver\n"); +} + +static LP5812_DEV_ATTR_WO(dev_config); +static LP5812_DEV_ATTR_WO(sw_reset); +static LP5812_DEV_ATTR_WO(fault_clear); +static LP5812_DEV_ATTR_RO(tsd_config_status); + +static struct attribute *lp5812_chip_attributes[] =3D { + &dev_attr_fault_clear.attr, + &dev_attr_sw_reset.attr, + &dev_attr_dev_config.attr, + &dev_attr_tsd_config_status.attr, + NULL +}; + +static const struct attribute_group lp5812_group =3D { + .name =3D "lp5812_chip_setup", + .attrs =3D lp5812_chip_attributes +}; + +/* Chip specific configurations */ +static struct lp5812_device_config lp5812_cfg =3D { + .reg_reset =3D { + .addr =3D LP5812_REG_RESET, + .val =3D LP5812_RESET + }, + .reg_chip_en =3D { + .addr =3D LP5812_REG_ENABLE, + .val =3D LP5812_ENABLE_DEFAULT + }, + .reg_dev_config_0 =3D { + .addr =3D LP5812_DEV_CONFIG0, + .val =3D 0 + }, + .reg_dev_config_1 =3D { + .addr =3D LP5812_DEV_CONFIG1, + .val =3D 0 + }, + .reg_dev_config_2 =3D { + .addr =3D LP5812_DEV_CONFIG2, + .val =3D 0 + }, + .reg_dev_config_3 =3D { + .addr =3D LP5812_DEV_CONFIG3, + .val =3D 0 + }, + .reg_dev_config_4 =3D { + .addr =3D LP5812_DEV_CONFIG4, + .val =3D 0 + }, + .reg_dev_config_5 =3D { + .addr =3D LP5812_DEV_CONFIG5, + .val =3D 0 + }, + .reg_dev_config_6 =3D { + .addr =3D LP5812_DEV_CONFIG6, + .val =3D 0 + }, + .reg_dev_config_7 =3D { + .addr =3D LP5812_DEV_CONFIG7, + .val =3D 0 + }, + .reg_dev_config_12 =3D { + .addr =3D LP5812_DEV_CONFIG12, + .val =3D LP5812_DEV_CONFIG12_DEFAULT + }, + .reg_cmd_update =3D { + .addr =3D LP5812_CMD_UPDATE, + .val =3D 0 + }, + .reg_tsd_config_status =3D { + .addr =3D LP5812_TSD_CONFIG_STATUS, + .val =3D 0 + }, + .reg_led_en_1 =3D { + .addr =3D LP5812_LED_EN_1, + .val =3D 0 + }, + .reg_led_en_2 =3D { + .addr =3D LP5812_LED_EN_2, + .val =3D 0 + }, + .reg_fault_clear =3D { + .addr =3D LP5812_FAULT_CLEAR, + .val =3D 0 + }, + .reg_manual_dc_base =3D { + .addr =3D LP5812_MANUAL_DC_BASE, + .val =3D 0 + }, + .reg_auto_dc_base =3D { + .addr =3D LP5812_AUTO_DC_BASE, + .val =3D 0 + }, + .reg_manual_pwm_base =3D { + .addr =3D LP5812_MANUAL_PWM_BASE, + .val =3D 0 + }, + .reg_lod_status_base =3D { + .addr =3D LP5812_LOD_STATUS, + .val =3D 0 + }, + .reg_lsd_status_base =3D { + .addr =3D LP5812_LSD_STATUS, + .val =3D 0 + }, + + .dev_attr_group =3D &lp5812_group +}; + +static const struct i2c_device_id lp5812_id[] =3D { + { "lp5812", .driver_data =3D (kernel_ulong_t)&lp5812_cfg }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, lp5812_id); + +#ifdef CONFIG_OF +static const struct of_device_id of_lp5812_match[] =3D { + { .compatible =3D "ti,lp5812", .data =3D &lp5812_cfg }, + {/* NULL */} +}; + +MODULE_DEVICE_TABLE(of, of_lp5812_match); +#endif + +static struct i2c_driver lp5812_driver =3D { + .driver =3D { + .name =3D "lp5812", + .of_match_table =3D of_match_ptr(of_lp5812_match), + }, + .probe =3D lp5812_probe, + .remove =3D lp5812_remove, + .id_table =3D lp5812_id, +}; + +module_i2c_driver(lp5812_driver); + +MODULE_DESCRIPTION("Texas Instruments LP5812 LED Driver"); +MODULE_AUTHOR("Jared Zhou"); +MODULE_LICENSE("GPL"); diff --git a/drivers/leds/rgb/leds-lp5812.h b/drivers/leds/rgb/leds-lp5812.h new file mode 100644 index 000000000000..c98bbb8ced9d --- /dev/null +++ b/drivers/leds/rgb/leds-lp5812.h @@ -0,0 +1,164 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * LP5812 Driver Header + * + * Copyright (C) 2025 Texas Instruments + * + * Author: Jared Zhou + */ + +#ifndef _LP5812_H_ +#define _LP5812_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define LP5812_REG_ENABLE 0x0000 +#define LP5812_REG_RESET 0x0023 +#define LP5812_DEV_CONFIG0 0x0001 +#define LP5812_DEV_CONFIG1 0x0002 +#define LP5812_DEV_CONFIG2 0x0003 +#define LP5812_DEV_CONFIG3 0x0004 +#define LP5812_DEV_CONFIG4 0x0005 +#define LP5812_DEV_CONFIG5 0x0006 +#define LP5812_DEV_CONFIG6 0x0007 +#define LP5812_DEV_CONFIG7 0x0008 +#define LP5812_DEV_CONFIG8 0x0009 +#define LP5812_DEV_CONFIG9 0x000A +#define LP5812_DEV_CONFIG10 0x000B +#define LP5812_DEV_CONFIG11 0x000c +#define LP5812_DEV_CONFIG12 0x000D +#define LP5812_CMD_UPDATE 0x0010 +#define LP5812_LED_EN_1 0x0020 +#define LP5812_LED_EN_2 0x0021 +#define LP5812_FAULT_CLEAR 0x0022 +#define LP5812_MANUAL_DC_BASE 0x0030 +#define LP5812_AUTO_DC_BASE 0x0050 +#define LP5812_MANUAL_PWM_BASE 0x0040 + +#define LP5812_TSD_CONFIG_STATUS 0x0300 +#define LP5812_LOD_STATUS 0x0301 +#define LP5812_LSD_STATUS 0x0303 + +#define LP5812_ENABLE_DEFAULT 0x01 +#define FAULT_CLEAR_ALL 0x07 +#define TSD_CLEAR_VAL 0x04 +#define LSD_CLEAR_VAL 0x02 +#define LOD_CLEAR_VAL 0x01 +#define LP5812_RESET 0x66 +#define LP5812_DEV_CONFIG12_DEFAULT 0x08 + +#define LP5812_UPDATE_CMD_VAL 0x55 + +#define LP5812_DEV_ATTR_RW(name) \ + DEVICE_ATTR_RW(name) +#define LP5812_DEV_ATTR_RO(name) \ + DEVICE_ATTR_RO(name) +#define LP5812_DEV_ATTR_WO(name) \ + DEVICE_ATTR_WO(name) + +enum control_mode { + LP5812_MODE_MANUAL =3D 0, + LP5812_MODE_AUTONOMOUS +}; + +enum dimming_type { + LP5812_DIMMING_ANALOG, + LP5812_DIMMING_PWM +}; + +union u_scan_order { + struct { + u8 scan_order_0:2; + u8 scan_order_1:2; + u8 scan_order_2:2; + u8 scan_order_3:2; + } s_scan_order; + u8 scan_order_val; +}; + +union u_drive_mode { + struct { + u8 mix_sel_led_0:1; + u8 mix_sel_led_1:1; + u8 mix_sel_led_2:1; + u8 mix_sel_led_3:1; + u8 led_mode:3; + u8 pwm_fre:1; + } s_drive_mode; + u8 drive_mode_val; +}; + +struct lp5812_reg { + u16 addr; + union { + u8 val; + u8 mask; + u8 shift; + }; +}; + +struct lp5812_led_config { + bool is_sc_led; + const char *name; + u8 color_id[LED_COLOR_ID_MAX]; + u8 max_current[LED_COLOR_ID_MAX]; + int chan_nr; + int num_colors; + int led_id[LED_COLOR_ID_MAX]; +}; + +struct lp5812_chip { + u8 num_channels; + struct i2c_client *client; + struct mutex lock; /* Protects register access */ + struct lp5812_led_config *led_config; + const char *label; + const struct lp5812_device_config *cfg; + union u_scan_order u_scan_order; + union u_drive_mode u_drive_mode; +}; + +struct lp5812_led { + u8 brightness; + int chan_nr; + struct led_classdev cdev; + struct led_classdev_mc mc_cdev; + struct lp5812_chip *chip; +}; + +struct lp5812_device_config { + const struct lp5812_reg reg_reset; + const struct lp5812_reg reg_chip_en; + const struct lp5812_reg reg_dev_config_0; + const struct lp5812_reg reg_dev_config_1; + const struct lp5812_reg reg_dev_config_2; + const struct lp5812_reg reg_dev_config_3; + const struct lp5812_reg reg_dev_config_4; + const struct lp5812_reg reg_dev_config_5; + const struct lp5812_reg reg_dev_config_6; + const struct lp5812_reg reg_dev_config_7; + const struct lp5812_reg reg_dev_config_12; + const struct lp5812_reg reg_cmd_update; + + const struct lp5812_reg reg_led_en_1; + const struct lp5812_reg reg_led_en_2; + const struct lp5812_reg reg_fault_clear; + const struct lp5812_reg reg_manual_dc_base; + const struct lp5812_reg reg_auto_dc_base; + const struct lp5812_reg reg_manual_pwm_base; + const struct lp5812_reg reg_tsd_config_status; + const struct lp5812_reg reg_lod_status_base; + const struct lp5812_reg reg_lsd_status_base; + + /* Additional device specific attributes */ + const struct attribute_group *dev_attr_group; +}; + +#endif /*_LP5812_H_*/ --=20 2.25.1 From nobody Tue Oct 7 03:50:36 2025 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A693266EFB; Mon, 14 Jul 2025 17:24:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513873; cv=none; b=SnV6pob/COxULxI3GDglylpbzMqaEJRgJnL/WtZlhSNlAdCjtdI9x3vgsumZPjaMvnuFwGYA7UBh9NLgiEs3N3fQdQ8gQq/lTzYtM/e4pOC/csBGHZjiePZX3mvftZD8VBvfGI8ZF2111vs0QbST/6wtkzKU/ag/VpfFu0uq1n4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513873; c=relaxed/simple; bh=Vl2YaMKjly/V1W36xIR4JIP4lS7i+8jGRYUWL/eIeyY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GV1edeF9UP0bgEe7ToI9LcRsWVRzfWS49JaAG6O2PEuFWfv1CFsf8OEC1bTyUw3N6Odd5a4Mw/F6xdI/RGQYcv0ohoSoIIAE4XTOctA2M3WIxYYmOLG53A2iw1ZH/piCZs5PFgl2DplMD6iamhmPMT6b3FHDIVFA8nFYjD/c240= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EGG2X0+P; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EGG2X0+P" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-7426c44e014so4376214b3a.3; Mon, 14 Jul 2025 10:24:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752513871; x=1753118671; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hBxIn0XqrDJ/+zfvzzgIjEfOUJRZPwb+TvxglfGh4nE=; b=EGG2X0+PunjKiFGLIUH5FekguAJg42O/UTRdOxwkzO1VNguAH3Cu2pK3Zp/nPjZGPf DKVNoNAy8IqcRmmRQZ9jlRV/LaYs2fF9c4kiH3gkTgLBTRq4edS/oAw4hlqM0XFT3AKh /v4f7xlllMyrpDEU6g2Sb6AYQ5lrnIkMuPRCAqRn55/+M8YjHgLCebTNC0Ll4zosdOo9 V0Z0miPWkSwRg802OGnpwE/ca11C4V2JfHucTaRKdTQAG6BNEckbraJ/IIDXaotSGVwz GkMwnvTcHhuoYbGkqDCg+KTesdlk75PLtKhwIezLyWZEHSD0OdVMEecj0V8VH+s+aGpn Q2IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752513871; x=1753118671; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hBxIn0XqrDJ/+zfvzzgIjEfOUJRZPwb+TvxglfGh4nE=; b=hKDgl6OoYYsNQLRFj6z9/85yONMmJC19c6kuYqN2CI2xHRQIn06MZhJBD26D0aOJpp TSlWnh3amQ0dp5tsgysmz+Dv4kmQOgit34E59K3/eVdubKJOMANPv0umn5uWsLHoKnEW NFUqIjWFLOXX9LZi9Lo1MWYHNEL4iWVlxGm+FQVhWy7dvBN00eTaMQFO/EMuqKWtFDF5 zFCeuSqEiGLAwT1YxCQ3b4LyMx8d/p9od9ZnmoUuty8Hey7VTye5/p9zElKYNCry6NfY bz/3yJE/irNB0ac2n7vJARbi8JNC/s53ZQbFUgw1c1yHs/kfwSZ/i5S2BseRpdo9u7Bj oHQg== X-Forwarded-Encrypted: i=1; AJvYcCVdvtRLtuoHOPYfOYxkHI4O3kVumkxU9C7ld0Qf5VgN6tw6ZY5RpfZQ46PhnEqOL45WsQudSC5tB58w@vger.kernel.org, AJvYcCVvuOhLP5Ig/E1Mf23Jw+ErplVe8WWbR0XZ99/rbZFgXiOE72SoHkQLKmtsBPQguNT3g4WjkK5IHOxY@vger.kernel.org, AJvYcCWB6PL5zfyjSl7ybhIdRyCFKTlGWtPKaPuVhrjkD/cKV7M4h2xMncDUtZdSgQq8gQxNWcsIWJ7/9Iuc5N77@vger.kernel.org, AJvYcCXbScy9DCfV2CgGEwmxPGCR44bmixOpDkRR5+bl7dvZrhPR2LPsoIvtsAe3t86kdY91x2OHkWFB/IODiw==@vger.kernel.org X-Gm-Message-State: AOJu0Yxl9UrAjsc+aQCT3dEt8nQyxtwt4iNIKz3wFqjaEeY2N8tbYnGh iLAF9dGRvakm0D8hmtJ8OQHlPp6GYxQ7mVCIr38upfkNJLZ4J5ERNKFo X-Gm-Gg: ASbGncvqAO1g+vnZW4Sjf5B/L0XH0P3PpNPkzHQ8hw0kRYE5ohDXFRseEbpmAHrq70T uLekomEDIDhl1rtbd1xoXEazY3fdsFXRxTcHPnQhy6mDa7K5UxnAFNFP3icI7UW/8rQxLprhMmp QCE8coHJquzacuHyrgI1D/JvXM/aFP7CurCAALlXO8Fa6s2O7Rx0VkpUtp3GJi0Wblt1UQPVX3P tKqwLQBGDxtQjWjlA+S432XLCe3M3dS0Sr73y4WWzYv+s3/Uv4V0qThEvCE6c/YAd9kcZh8FFZa awf+F5vuNlFXrfgSZ1mRYsmSONtzCg3Sm//28UNmIlkLnnGDpO8LHd9Qw0khF5yP9XPZFbjjsuR wXaWxCPejbR6II+1B37zc7gVzZFWmD04fVA== X-Google-Smtp-Source: AGHT+IHwmnZXpLqY2IKYZmv+OOwTMUX/Qu8BaMQQjuNTWTEoPhcsSl7dMOIHWf8MnB29GBBo4yhKuQ== X-Received: by 2002:a05:6a00:2d15:b0:749:112:c172 with SMTP id d2e1a72fcca58-74f1ebccf03mr15370648b3a.16.1752513870516; Mon, 14 Jul 2025 10:24:30 -0700 (PDT) Received: from DESKTOP-P76LG1N.lan ([42.114.162.205]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74eb9e06537sm10495468b3a.43.2025.07.14.10.24.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Jul 2025 10:24:30 -0700 (PDT) From: Nam Tran To: lee@kernel.org Cc: pavel@kernel.org, rdunlap@infradead.org, christophe.jaillet@wanadoo.fr, krzk+dt@kernel.org, robh@kernel.org, conor+dt@kernel.org, corbet@lwn.net, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, Nam Tran Subject: [PATCH v11 3/4] docs: ABI: Document LP5812 LED sysfs interfaces Date: Tue, 15 Jul 2025 00:23:54 +0700 Message-Id: <20250714172355.84609-4-trannamatk@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250714172355.84609-1-trannamatk@gmail.com> References: <20250714172355.84609-1-trannamatk@gmail.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 Content-Type: text/plain; charset="utf-8" The LP5812 is a 4x3 matrix RGB LED driver with autonomous animation engine control. The driver provides interfaces to configure LED modes manual/autonomous, set PWM/DC values, and manage autonomous animation engines. Signed-off-by: Nam Tran --- .../ABI/testing/sysfs-bus-i2c-devices-lp5812 | 40 ++++++ .../ABI/testing/sysfs-class-led-lp5812 | 120 ++++++++++++++++++ MAINTAINERS | 2 + 3 files changed, 162 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-bus-i2c-devices-lp5812 create mode 100644 Documentation/ABI/testing/sysfs-class-led-lp5812 diff --git a/Documentation/ABI/testing/sysfs-bus-i2c-devices-lp5812 b/Docum= entation/ABI/testing/sysfs-bus-i2c-devices-lp5812 new file mode 100644 index 000000000000..a8b1d5c52a82 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-i2c-devices-lp5812 @@ -0,0 +1,40 @@ +What: /sys/bus/i2c/devices/.../lp5812_chip_setup/dev_config +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Configures drive mode and scan order. (WO) + Some valid values: tcmscan:4:0:1:2:3 (default), tcmscan:3:0:1:2, mixscan= :2:2:0:3, mixscan:3:0:1:2:3 + +What: /sys/bus/i2c/devices/.../lp5812_chip_setup/device_command +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Issues device-level commands. (WO) + Valid values: "update", "start", "stop", "pause", "continue" + +What: /sys/bus/i2c/devices/.../lp5812_chip_setup/sw_reset +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Triggers a software reset of the device. (WO) + 1 - resets device + 0 - does not reset device + +What: /sys/bus/i2c/devices/.../lp5812_chip_setup/fault_clear +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Clears fault status. (WO) + 1 - clears fault status + 0 - does not clear fault status + +What: /sys/bus/i2c/devices/.../lp5812_chip_setup/tsd_config_status +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Report the current thermal shutdown config status. (RO) diff --git a/Documentation/ABI/testing/sysfs-class-led-lp5812 b/Documentati= on/ABI/testing/sysfs-class-led-lp5812 new file mode 100644 index 000000000000..a6cb49fb523f --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-led-lp5812 @@ -0,0 +1,120 @@ +What: /sys/class/leds/led_/activate +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Activate or deactivate the specified LED channel. (WO) + 1 - Activate + 0 - Deactivate + +What: /sys/class/leds/led_/mode +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Selects LED operation mode. (WO) + Valid values: "manual", "autonomous" + +What: /sys/class/leds/led_/led_current +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + DC current level. (WO) + Valid values: 0 - 255 + +What: /sys/class/leds/led_/max_current +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Shows maximum DC current bit setting. (RO) + 0 (default) means the LED maximum current is set to 25.5 mA. + 1 means the LED maximum current is set to 51 mA. + +What: /sys/class/leds/led_/pwm_dimming_scale +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + PWM dimming scale type. (WO) + Valid values: "linear", "exponential" + +What: /sys/class/leds/led_/pwm_phase_align +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Configures PWM phase alignment. (WO) + Valid values: "forward", "middle", "backward" + +What: /sys/class/leds/led_/auto_time_pause_at_start +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Controls start pause time. (WO) + Valid values: 0 - 15 + +What: /sys/class/leds/led_/auto_time_pause_at_stop +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Controls stop pause time. (WO) + Valid values: 0 - 15 + +What: /sys/class/leds/led_/auto_playback_eau_number +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Active AEU number of led_ selection. (WO) + Valid values: 0 - 3 + 0 - only use AEU1 + 1 - use AEU1 and AEU2 + 2 - use AEU1, AEU2 and AEU3 + 3 - use AEU1, AEU2 and AEU3 (the same as 2) + +What: /sys/class/leds/led_/auto_playback_time +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + Animation pattern playback times of led_. (WO) + Valid values: 0 - 15 + 0 - 14 means 0 - 14 times, 15 means infinite times + +What: /sys/class/leds/led_/aeu_playback_time +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + AEU pattern playback times of led_. (WO) + Format: aeu: where x (1 - 3) indicates the AEU number, + y (0 - 3) indicates the number of playback times. + +What: /sys/class/leds/led_/aeu_pwm_ +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + AEU PWM duty cycle setting. (WO) + Format: aeu: where x (1 - 3) indicates the AEU number, + y (0 - 255) indicates pwm value. + +What: /sys/class/leds/led_/aeu_slop_time_ +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + AEU slop time setting. (WO) + Format: aeu: where x (1 - 3) indicates the AEU number, + y (0 - 15) indicates the slop time value. + +What: /sys/class/leds/led_/lod_lsd +Date: July 2025 +KernelVersion: 6.17 +Contact: Nam Tran +Description: + 0 0 mean no lod and lsd fault detected, 1 1 mean lod and lsd fault detec= ted (RO) diff --git a/MAINTAINERS b/MAINTAINERS index b4eb3265c800..cdba86f1768b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24565,6 +24565,8 @@ TEXAS INSTRUMENTS' LP5812 RGB LED DRIVER M: Nam Tran L: linux-leds@vger.kernel.org S: Maintained +F: Documentation/ABI/testing/sysfs-bus-i2c-devices-lp5812 +F: Documentation/ABI/testing/sysfs-class-led-lp5812 F: Documentation/devicetree/bindings/leds/ti,lp5812.yaml F: drivers/leds/rgb/Kconfig F: drivers/leds/rgb/Makefile --=20 2.25.1 From nobody Tue Oct 7 03:50:36 2025 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7287267AFC; Mon, 14 Jul 2025 17:24:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513878; cv=none; b=QuelVp4pfR3WQYTx64BQi78prU/7kdEzDf0PoOy5pzE5/8Eyb6943Y5JBbr9AvyFK9nAEkCu5rXl20aCaSMaXH3E1KUH4K6g2NC+NBNaGtO3dMgJ190c4pw7D+4ZJ0kPuNYiUL+c8BC8O5dwWoOdy1yU7fGmljc8ElwS7IDNXuA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752513878; c=relaxed/simple; bh=56Sl/nGt3m5t3J5G+VzsIzv0+c8kzRwGZwhJI4NYYaI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=ctP1f6/oueXSlMs2WCBDO3tx+elIEyNaD6jSe3VZ7sgqr/RC+ivY2/nHEh+Ys4CQUH5cGLQC8aXdI0YlWHETvopWRYarHm7Fef1bH8y/bUffJtmSf8pRq9OE5iGtGJbxR0QKTUusZyBiXGIw7CrcdxVRXWvsNXFcrApBU3PB6UU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hkNU2zvo; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hkNU2zvo" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-748feca4a61so2572243b3a.3; Mon, 14 Jul 2025 10:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752513876; x=1753118676; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4V9Yp9AA3hWAb7aqFhJTn2UKytTjSMNN61SVrfVNk7w=; b=hkNU2zvopT3DJgrEUqXD6pMaRgQgNkTJNXjVdsFpoWWD1Or07isluURJ/oZeTGDZ+q DqWb7kFkkeeuExs5EbWKmG2jjB7/fO6kqRaSRxFDX0wQkvgSd8G/7zISCtWse4Ool9Fk qrpbefK0Hqfh02FqcyybEn3mCZeS23r3D1w5LkClN7gnmNRx7ECLNyYl0llyoh/4M+vm LjbWSFBccP0b+CtiX7p6QmjEBSo8C8q55VXXQY4fI+svHA3zmhOlMsm12btbgmd1yUo0 wlJiIGQUHdBUy3vFmOF8FeWmBooE4NlwIou0QIAIJb93dajiU4t8LPTMl+bbDPWiIYk3 U0pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752513876; x=1753118676; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4V9Yp9AA3hWAb7aqFhJTn2UKytTjSMNN61SVrfVNk7w=; b=QXLKCC5QdlXzDEXhaNz3TlwwNkmlYKbnLepHOIPR9uvcNabfXKlf+DAl/csNJWP7pQ 3RJ8szwkAVqWoKiMe9dxlTZSv7LELo8MKalcwBaqJF6sgo/ZhN7pzPegXOfhmh6AFCE4 oTLprRgyrKVTz9C1+f2GLUGzY9HmctIQVG78/jtq5/CF7nFqFMXIPNGz2A6aon1ffJQz 5LGW8uEA4pqjsEdUKYntN138x+F4vw1PcWUZsrHSEX/DgvpeH4Wk1qKNvxoy8l40yxRJ evIeemgrmCMmb2HSKzXTpM6jOyVoiLWrRSquysnydn8pkuxjNVzu/MPHlYcBSowQ3nzw v9uw== X-Forwarded-Encrypted: i=1; AJvYcCUKNl6Mw1BigeE7Vmlcp7TfaUUAD/gfEq7DSN1w5Jldm3nhYvE1V/cLG/YN+1ww1b96O1nqRIS0ItPyJeRR@vger.kernel.org, AJvYcCWq+Yk0q/MC7zKUuOcFOsJBD7fMoGy+7NLX1oeKv1+awTtALwwJYK11QX455saRotcsJYrbebFMab8G@vger.kernel.org, AJvYcCWr5T4XGu3z38p8QaLWhT681tGGzwc+00k+1GucQsK0lesNp/rCT7SVNnF04GSK73owni4ozKrq5qHGiQ==@vger.kernel.org, AJvYcCX+0wtEvQE1/mZeeLhAmuC/gqjDpZdi1jrCXAXQu8i5tzuEVFQn911H67KEzgdq9+O0ai36OymkGwsr@vger.kernel.org X-Gm-Message-State: AOJu0YxKxu2MUOh+UpE3DpBywe2bchwiqTgDv+8hsTmJs4CrTbSR6IIy 9oP/jJkte9/jFNal5TEZUQh4BzezJ+c9FgCxWJouTRil0zahWHmhQJP2 X-Gm-Gg: ASbGncvJ6vskCKXUxwgiB05dWCZsKq71KIbW5bPKy5uY0Tf8zeODiC/Wlhiw2CR14Q3 5Z52wqONQf+irqlk57AyRjDJPEUuxzrDaf46Gam9SnX8IJyU5nMjaaIETHVjMmS83yx7/8fFg7x sJOMP0215msc9kcJuRGVRIED4rBA9GYsgJaVpbXwL5DufkeeqqJRHx+Ny1jkimV29Sw3/B9WEpx Dfizuw3gNSTHv8bQdzfAgwEAmLtZToqZonf6YpBHcwJ7CRQuqAGqdSus2USLQyAWONoU2/3SLIV OshtuJZQ6WURVJbcJxjxBQ1Mg8+5y+i42fqVLE7cAhl3Z7tFggzw4Mo+cu+vpCQpLxVMFXhvehq zFrWbzOGs8tlqNoF1ibSS8DBLFOCs+PJqsA== X-Google-Smtp-Source: AGHT+IE0vWBFAezL6BFt/xd6WGaxPsrHQkKxkqR4Xfc2/0QldAgEmWlTpd+zhOh8PwX2N7mWh7mZEg== X-Received: by 2002:a05:6a00:3cc9:b0:747:b04e:941a with SMTP id d2e1a72fcca58-74ee274d335mr15918850b3a.17.1752513875900; Mon, 14 Jul 2025 10:24:35 -0700 (PDT) Received: from DESKTOP-P76LG1N.lan ([42.114.162.205]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74eb9e06537sm10495468b3a.43.2025.07.14.10.24.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Jul 2025 10:24:35 -0700 (PDT) From: Nam Tran To: lee@kernel.org Cc: pavel@kernel.org, rdunlap@infradead.org, christophe.jaillet@wanadoo.fr, krzk+dt@kernel.org, robh@kernel.org, conor+dt@kernel.org, corbet@lwn.net, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, Nam Tran Subject: [PATCH v11 4/4] docs: leds: Document TI LP5812 LED driver Date: Tue, 15 Jul 2025 00:23:55 +0700 Message-Id: <20250714172355.84609-5-trannamatk@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250714172355.84609-1-trannamatk@gmail.com> References: <20250714172355.84609-1-trannamatk@gmail.com> 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 The driver provides sysfs interfaces to control and configure the LP5812 device and its LED channels. The documetation describes the chip's capabilities, sysfs interface, and usage examples. Signed-off-by: Nam Tran --- Documentation/leds/index.rst | 1 + Documentation/leds/leds-lp5812.rst | 84 ++++++++++++++++++++++++++++++ MAINTAINERS | 1 + 3 files changed, 86 insertions(+) create mode 100644 Documentation/leds/leds-lp5812.rst diff --git a/Documentation/leds/index.rst b/Documentation/leds/index.rst index 76fae171039c..bebf44004278 100644 --- a/Documentation/leds/index.rst +++ b/Documentation/leds/index.rst @@ -25,6 +25,7 @@ LEDs leds-lp5523 leds-lp5562 leds-lp55xx + leds-lp5812 leds-mlxcpld leds-mt6370-rgb leds-sc27xx diff --git a/Documentation/leds/leds-lp5812.rst b/Documentation/leds/leds-l= p5812.rst new file mode 100644 index 000000000000..4538cfdf415d --- /dev/null +++ b/Documentation/leds/leds-lp5812.rst @@ -0,0 +1,84 @@ +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Kernel driver for lp5812 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +* TI/National Semiconductor LP5812 LED Driver +* Datasheet: https://www.ti.com/product/LP5812#tech-docs + +Authors: Jared Zhou + +Description +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The LP5812 is a 4x3 matrix LED driver with support for both manual and +autonomous animation control. It provides features such as: + +- PWM dimming and DC current control +- Slope time configuration +- Autonomous Engine Unit (AEU) for LED animation playback +- Flexible scan and drive mode configuration + +This driver provides sysfs interfaces to control and configure the LP5812 +device and its LED channels. + +Sysfs Interface +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +LP5812 device exposes a chip-level sysfs group: + /sys/bus/i2c/devices//lp5812_chip_setup/ + +The following attributes are available at chip level: + - dev_config: Configure drive mode and scan order (RW) + - device_command: Issue device-wide commands (WO) + - sw_reset: Reset the hardware (WO) + - fault_clear: Clear any device faults (WO) + - tsd_config_status: Read thermal shutdown config status (RO) + +Each LED channel is exposed as: + /sys/class/leds/led_/ + +Each LED exposes the following attributes: + - activate: Activate or deactivate the LED (WO) + - mode: manual or autonomous mode (WO) + - led_current: DC current value (0=E2=80=93255) (WO) + - max_current: maximum DC current bit setting (RO) + - pwm_dimming_scale: linear or exponential (WO) + - pwm_phase_align: PWM alignment mode (WO) + - auto_time_pause_at_start: config start pause time (WO) + - auto_time_pause_at_stop: config stop pause time (WO) + - auto_playback_eau_number: Activate AEU number (WO) + - auto_playback_time: Animation pattern playback times (WO) + - aeu_playback_time: playback times for the specific AEU (WO) + - aeu_pwm_: PWM duty cycle setting for the specific AEU (WO) + - aeu_slop_time_: slop time setting for the specific AEU (WO) + - lod_lsd: lod and lsd fault detected status (RO) + +Example Usage +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +To control led_A in manual mode:: + echo 1 1 1 > /sys/class/leds/LED_A/activate + echo manual manual manual > /sys/class/leds/LED_A/mode + echo 100 100 100 > /sys/class/leds/LED_A/led_current + echo 50 50 50 > /sys/class/leds/LED_A/multi-intensity + +To control led_A in autonomous mode:: + echo 1 1 1 > /sys/bus/i2c/drivers/lp5812/xxxx/led_A/activate + echo autonomous autonomous autonomous > /sys/class/leds/LED_A/mode + echo linear exponential linear > /sys/class/leds/led_/pwm_dimming_= scale + echo forward forward backward > /sys/class/leds/led_/pwm_phase_ali= gn + echo 0 0 0 > /sys/class/leds/led_A/auto_playback_eau_number # only use= AEU1 + echo 10 10 10 > /sys/class/leds/led_A/auto_time_pause_at_start + echo 10 10 10 > /sys/class/leds/led_A/auto_time_pause_at_stop + echo 15 15 15 > /sys/class/leds/led_A/auto_playback_time + echo aeu1:100 100 100 > /sys/class/leds/led_A/aeu_pwm1 + echo aeu1:100 100 100 > /sys/class/leds/led_A/aeu_pwm2 + echo aeu1:100 100 100 > /sys/class/leds/led_A/aeu_pwm3 + echo aeu1:100 100 100 > /sys/class/leds/led_A/aeu_pwm4 + echo aeu1:100 100 100 > /sys/class/leds/led_A/aeu_pwm5 + echo aeu1:5 5 5 > /sys/class/leds/led_A/aeu_slop_time_t1 + echo aeu1:5 5 5 > /sys/class/leds/led_A/aeu_slop_time_t2 + echo aeu1:5 5 5 > /sys/class/leds/led_A/aeu_slop_time_t3 + echo aeu1:5 5 5 > /sys/class/leds/led_A/aeu_slop_time_t4 + echo aeu1:1 1 1 > /sys/class/leds/led_A/aeu_playback_time + echo start > /sys/bus/i2c/drivers/lp5812/xxxx/lp5812_chip_setup/device= _command diff --git a/MAINTAINERS b/MAINTAINERS index cdba86f1768b..4fefc7fb7a9a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24568,6 +24568,7 @@ S: Maintained F: Documentation/ABI/testing/sysfs-bus-i2c-devices-lp5812 F: Documentation/ABI/testing/sysfs-class-led-lp5812 F: Documentation/devicetree/bindings/leds/ti,lp5812.yaml +F: Documentation/leds/leds-lp5812.rst F: drivers/leds/rgb/Kconfig F: drivers/leds/rgb/Makefile F: drivers/leds/rgb/leds-lp5812.c --=20 2.25.1