Kernel driver for Qualcomm LPG

Description

The Qualcomm LPG can be found in a variety of Qualcomm PMICs and consists of anumber of PWM channels, a programmable pattern lookup table and a RGB LEDcurrent sink.

To facilitate the various use cases, the LPG channels can be exposed asindividual LEDs, grouped together as RGB LEDs or otherwise be accessed as PWMchannels. The output of each PWM channel is routed to other hardwareblocks, such as the RGB current sink, GPIO pins etc.

The each PWM channel can operate with a period between 27us and 384 seconds andhas a 9 bit resolution of the duty cycle.

In order to provide support for status notifications with the CPU subsystem indeeper idle states the LPG provides pattern support. This consists of a sharedlookup table of brightness values and per channel properties to select therange 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, usingthe 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-timeexpressed in milliseconds. The hold time is a property of the pattern and musttherefore be identical for each element in the pattern (except for the pausesdescribed below). As the LPG hardware is not able to perform the lineartransitions expected by the leds-trigger-pattern format, each entry in thepattern must be followed a zero-length entry of the same brightness.

Simple pattern:

"255 500 255 0 0 500 0 0"    ^    |255 +----+    +----+    |    |    |    |      ...  0 |    +----+    +----    +---------------------->    0    5   10   15     time (100ms)

The LPG supports specifying a longer hold-time for the first and last elementin the pattern, the so called “low pause” and “high pause”.

Low-pause pattern:

"255 1000 255 0 0 500 0 0 255 500 255 0 0 500 0 0"    ^    |255 +--------+    +----+    +----+    +--------+    |        |    |    |    |    |    |        |      ...  0 |        +----+    +----+    +----+        +----    +----------------------------->    0    5   10   15  20   25   time (100ms)

Similarly, the last entry can be stretched by using a higher hold-time on thelast 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 runningthe pattern forward, then backwards. This mode is automatically used by thedriver 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 thespecified hold-time of the middle item in the pattern is allowed to have adifferent hold-time.