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 <bjorn.andersson@linaro.org> Tested-by: Douglas Anderson <dianders@chromium.org> Tested-by: Luca Weiss <luca@z3ntu.xyz> Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> Tested-by: Marijn Suijten <marijn.suijten@somainline.org> [On the Sony Xperia Nile Discovery, SDM630] Signed-off-by: Pavel Machek <pavel@ucw.cz>
This commit is contained in:
parent
a8e53db46f
commit
24e2d05d1b
76
Documentation/leds/leds-qcom-lpg.rst
Normal file
76
Documentation/leds/leds-qcom-lpg.rst
Normal file
@ -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.
|
@ -869,6 +869,9 @@ source "drivers/leds/blink/Kconfig"
|
||||
comment "Flash and Torch LED drivers"
|
||||
source "drivers/leds/flash/Kconfig"
|
||||
|
||||
comment "RGB LED drivers"
|
||||
source "drivers/leds/rgb/Kconfig"
|
||||
|
||||
comment "LED Triggers"
|
||||
source "drivers/leds/trigger/Kconfig"
|
||||
|
||||
|
@ -99,6 +99,9 @@ obj-$(CONFIG_LEDS_USER) += uleds.o
|
||||
# Flash and Torch LED Drivers
|
||||
obj-$(CONFIG_LEDS_CLASS_FLASH) += flash/
|
||||
|
||||
# RGB LED Drivers
|
||||
obj-$(CONFIG_LEDS_CLASS_MULTICOLOR) += rgb/
|
||||
|
||||
# LED Triggers
|
||||
obj-$(CONFIG_LEDS_TRIGGERS) += trigger/
|
||||
|
||||
|
18
drivers/leds/rgb/Kconfig
Normal file
18
drivers/leds/rgb/Kconfig
Normal file
@ -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
|
3
drivers/leds/rgb/Makefile
Normal file
3
drivers/leds/rgb/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-$(CONFIG_LEDS_QCOM_LPG) += leds-qcom-lpg.o
|
1405
drivers/leds/rgb/leds-qcom-lpg.c
Normal file
1405
drivers/leds/rgb/leds-qcom-lpg.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user