-
Notifications
You must be signed in to change notification settings - Fork 5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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]>
- Loading branch information
1 parent
a8e53db
commit 24e2d05
Showing
6 changed files
with
1,508 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
.. SPDX-License-Identifier: GPL-2.0 | ||
============================== | ||
Kernel driver for Qualcomm LPG | ||
============================== | ||
|
||
Description | ||
----------- | ||
|
||
The Qualcomm LPG can be found in a variety of Qualcomm PMICs and consists of a | ||
number of PWM channels, a programmable pattern lookup table and a RGB LED | ||
current sink. | ||
|
||
To facilitate the various use cases, the LPG channels can be exposed as | ||
individual LEDs, grouped together as RGB LEDs or otherwise be accessed as PWM | ||
channels. The output of each PWM channel is routed to other hardware | ||
blocks, such as the RGB current sink, GPIO pins etc. | ||
|
||
The each PWM channel can operate with a period between 27us and 384 seconds and | ||
has a 9 bit resolution of the duty cycle. | ||
|
||
In order to provide support for status notifications with the CPU subsystem in | ||
deeper idle states the LPG provides pattern support. This consists of a shared | ||
lookup table of brightness values and per channel properties to select the | ||
range within the table to use, the rate and if the pattern should repeat. | ||
|
||
The pattern for a channel can be programmed using the "pattern" trigger, using | ||
the hw_pattern attribute. | ||
|
||
/sys/class/leds/<led>/hw_pattern | ||
-------------------------------- | ||
|
||
Specify a hardware pattern for a Qualcomm LPG LED. | ||
|
||
The pattern is a series of brightness and hold-time pairs, with the hold-time | ||
expressed in milliseconds. The hold time is a property of the pattern and must | ||
therefor be identical for each element in the pattern (except for the pauses | ||
described below). | ||
|
||
Simple pattern:: | ||
|
||
"255 500 0 500" | ||
|
||
^ | ||
| | ||
255 +----+ +----+ | ||
| | | | ... | ||
0 | +----+ +---- | ||
+----------------------> | ||
0 5 10 15 time (100ms) | ||
|
||
The LPG supports specifying a longer hold-time for the first and last element | ||
in the pattern, the so called "low pause" and "high pause". | ||
|
||
Low-pause pattern:: | ||
|
||
"255 1000 0 500 255 500 0 500" | ||
|
||
^ | ||
| | ||
255 +--------+ +----+ +----+ +--------+ | ||
| | | | | | | | ... | ||
0 | +----+ +----+ +----+ +---- | ||
+-----------------------------> | ||
0 5 10 15 20 25 time (100ms) | ||
|
||
Similarily, the last entry can be stretched by using a higher hold-time on the | ||
last entry. | ||
|
||
In order to save space in the shared lookup table the LPG supports "ping-pong" | ||
mode, in which case each run through the pattern is performed by first running | ||
the pattern forward, then backwards. This mode is automatically used by the | ||
driver when the given pattern is a palindrome. In this case the "high pause" | ||
denotes the wait time before the pattern is run in reverse and as such the | ||
specified hold-time of the middle item in the pattern is allowed to have a | ||
different hold-time. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
if LEDS_CLASS_MULTICOLOR | ||
|
||
config LEDS_QCOM_LPG | ||
tristate "LED support for Qualcomm LPG" | ||
depends on OF | ||
depends on SPMI | ||
help | ||
This option enables support for the Light Pulse Generator found in a | ||
wide variety of Qualcomm PMICs. The LPG consists of a number of PWM | ||
channels and typically a shared pattern lookup table and a current | ||
sink, intended to drive RGB LEDs. Each channel can either be used as | ||
a LED, grouped to represent a RGB LED or exposed as PWM channels. | ||
|
||
If compiled as a module, the module will be named leds-qcom-lpg. | ||
|
||
endif # LEDS_CLASS_MULTICOLOR |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
obj-$(CONFIG_LEDS_QCOM_LPG) += leds-qcom-lpg.o |
Oops, something went wrong.