Skip to content

Commit 24e2d05

Browse files
anderssonpavelmachek
authored andcommitted
leds: Add driver for Qualcomm LPG
The Light Pulse Generator (LPG) is a PWM-block found in a wide range of PMICs from Qualcomm. These PMICs typically comes with 1-8 LPG instances, with their output being routed to various other components, such as current sinks or GPIOs. Each LPG instance can operate on fixed parameters or based on a shared lookup-table, altering the duty cycle over time. This provides the means for hardware assisted transitions of LED brightness. A typical use case for the fixed parameter mode is to drive a PWM backlight control signal, the driver therefor allows each LPG instance to be exposed to the kernel either through the LED framework or the PWM framework. A typical use case for the LED configuration is to drive RGB LEDs in smartphones etc, for which the driver supports multiple channels to be ganged up to a MULTICOLOR LED. In this configuration the pattern generators will be synchronized, to allow for multi-color patterns. The idea of modelling this as a LED driver ontop of a PWM driver was considered, but setting the properties related to patterns does not fit in the PWM API. Similarly the idea of just duplicating the lower bits in a PWM and LED driver separately was considered, but this would not allow the PWM channels and LEDs to be configured on a per-board basis. The driver implements the more complex LED interface, and provides a PWM interface on the side of that, in the same driver. Signed-off-by: Bjorn Andersson <[email protected]> Tested-by: Douglas Anderson <[email protected]> Tested-by: Luca Weiss <[email protected]> Reviewed-by: Marijn Suijten <[email protected]> Tested-by: Marijn Suijten <[email protected]> [On the Sony Xperia Nile Discovery, SDM630] Signed-off-by: Pavel Machek <[email protected]>
1 parent a8e53db commit 24e2d05

File tree

6 files changed

+1508
-0
lines changed

6 files changed

+1508
-0
lines changed

Documentation/leds/leds-qcom-lpg.rst

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
.. SPDX-License-Identifier: GPL-2.0
2+
3+
==============================
4+
Kernel driver for Qualcomm LPG
5+
==============================
6+
7+
Description
8+
-----------
9+
10+
The Qualcomm LPG can be found in a variety of Qualcomm PMICs and consists of a
11+
number of PWM channels, a programmable pattern lookup table and a RGB LED
12+
current sink.
13+
14+
To facilitate the various use cases, the LPG channels can be exposed as
15+
individual LEDs, grouped together as RGB LEDs or otherwise be accessed as PWM
16+
channels. The output of each PWM channel is routed to other hardware
17+
blocks, such as the RGB current sink, GPIO pins etc.
18+
19+
The each PWM channel can operate with a period between 27us and 384 seconds and
20+
has a 9 bit resolution of the duty cycle.
21+
22+
In order to provide support for status notifications with the CPU subsystem in
23+
deeper idle states the LPG provides pattern support. This consists of a shared
24+
lookup table of brightness values and per channel properties to select the
25+
range within the table to use, the rate and if the pattern should repeat.
26+
27+
The pattern for a channel can be programmed using the "pattern" trigger, using
28+
the hw_pattern attribute.
29+
30+
/sys/class/leds/<led>/hw_pattern
31+
--------------------------------
32+
33+
Specify a hardware pattern for a Qualcomm LPG LED.
34+
35+
The pattern is a series of brightness and hold-time pairs, with the hold-time
36+
expressed in milliseconds. The hold time is a property of the pattern and must
37+
therefor be identical for each element in the pattern (except for the pauses
38+
described below).
39+
40+
Simple pattern::
41+
42+
"255 500 0 500"
43+
44+
^
45+
|
46+
255 +----+ +----+
47+
| | | | ...
48+
0 | +----+ +----
49+
+---------------------->
50+
0 5 10 15 time (100ms)
51+
52+
The LPG supports specifying a longer hold-time for the first and last element
53+
in the pattern, the so called "low pause" and "high pause".
54+
55+
Low-pause pattern::
56+
57+
"255 1000 0 500 255 500 0 500"
58+
59+
^
60+
|
61+
255 +--------+ +----+ +----+ +--------+
62+
| | | | | | | | ...
63+
0 | +----+ +----+ +----+ +----
64+
+----------------------------->
65+
0 5 10 15 20 25 time (100ms)
66+
67+
Similarily, the last entry can be stretched by using a higher hold-time on the
68+
last entry.
69+
70+
In order to save space in the shared lookup table the LPG supports "ping-pong"
71+
mode, in which case each run through the pattern is performed by first running
72+
the pattern forward, then backwards. This mode is automatically used by the
73+
driver when the given pattern is a palindrome. In this case the "high pause"
74+
denotes the wait time before the pattern is run in reverse and as such the
75+
specified hold-time of the middle item in the pattern is allowed to have a
76+
different hold-time.

drivers/leds/Kconfig

+3
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,9 @@ source "drivers/leds/blink/Kconfig"
869869
comment "Flash and Torch LED drivers"
870870
source "drivers/leds/flash/Kconfig"
871871

872+
comment "RGB LED drivers"
873+
source "drivers/leds/rgb/Kconfig"
874+
872875
comment "LED Triggers"
873876
source "drivers/leds/trigger/Kconfig"
874877

drivers/leds/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ obj-$(CONFIG_LEDS_USER) += uleds.o
9999
# Flash and Torch LED Drivers
100100
obj-$(CONFIG_LEDS_CLASS_FLASH) += flash/
101101

102+
# RGB LED Drivers
103+
obj-$(CONFIG_LEDS_CLASS_MULTICOLOR) += rgb/
104+
102105
# LED Triggers
103106
obj-$(CONFIG_LEDS_TRIGGERS) += trigger/
104107

drivers/leds/rgb/Kconfig

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
3+
if LEDS_CLASS_MULTICOLOR
4+
5+
config LEDS_QCOM_LPG
6+
tristate "LED support for Qualcomm LPG"
7+
depends on OF
8+
depends on SPMI
9+
help
10+
This option enables support for the Light Pulse Generator found in a
11+
wide variety of Qualcomm PMICs. The LPG consists of a number of PWM
12+
channels and typically a shared pattern lookup table and a current
13+
sink, intended to drive RGB LEDs. Each channel can either be used as
14+
a LED, grouped to represent a RGB LED or exposed as PWM channels.
15+
16+
If compiled as a module, the module will be named leds-qcom-lpg.
17+
18+
endif # LEDS_CLASS_MULTICOLOR

drivers/leds/rgb/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
3+
obj-$(CONFIG_LEDS_QCOM_LPG) += leds-qcom-lpg.o

0 commit comments

Comments
 (0)