161 lines
6.6 KiB
Plaintext
161 lines
6.6 KiB
Plaintext
|
Qualcomm QPNP PWM/LPG controller
|
||
|
|
||
|
qpnp-pwm driver supports Pulse Width Module (PWM) functionality. PWM feature is
|
||
|
used in range of applications such as varying Display brightness, LED dimming,
|
||
|
etc. The Qualcomm PMICs have a physical device called Light Pulse Generator
|
||
|
(LPG). In addition to support PWM functionality, the LPG module provides
|
||
|
a rich set of user defined PWM pattern configurations, such as sawtooth, linear
|
||
|
up, linear down, triangular patterns etc. The PWM patterns are used in
|
||
|
applications such as charger driver where the driver uses these patterns
|
||
|
to indicate various states of charging.
|
||
|
|
||
|
Required device bindings:
|
||
|
- compatible: should be "qcom,qpnp-pwm"
|
||
|
- reg: Offset and length of the controller's LPG channel register,
|
||
|
and LPG look-up table (LUT). The LPG look-up table is a
|
||
|
contiguous address space that is populated with PWM values.
|
||
|
The size of PWM value is 9 bit and the size of each
|
||
|
entry of the table is 8 bit. Thus, two entries are used
|
||
|
to fill each PWM value. The lower entry is used for PWM
|
||
|
LSB byte and higher entry is used for PWM MSB bit.
|
||
|
- reg-names: Names for the above registers.
|
||
|
"qpnp-lpg-channel-base" = physical base address of the
|
||
|
controller's LPG channel register.
|
||
|
"qpnp-lpg-lut-base" = physical base address of LPG LUT.
|
||
|
- qcom,channel-id: channel Id for the PWM.
|
||
|
|
||
|
Optional device bindings:
|
||
|
- qcom,channel-owner: A string value to supply owner information.
|
||
|
- qcom,mode-select: 0 = PWM mode
|
||
|
1 = LPG mode
|
||
|
If this binding is specified along with the required bindings of PWM/LPG then
|
||
|
in addition to configure PWM/LPG the qpnp-pwm driver also enables the feature
|
||
|
at the probe time. In the case where the binding is not specified the qpnp-pwm
|
||
|
driver does not enable the feature. Also, it is considered an error to specify
|
||
|
a particular mode using this binding but not the respective feature subnode.
|
||
|
|
||
|
All PWM devices support both PWM and LPG features within the same device.
|
||
|
To support each feature, there are some required and optional bindings passed
|
||
|
through device tree.
|
||
|
|
||
|
The PWM device can enable one feature (either PWM or LPG) at any given time.
|
||
|
Therefore, the qpnp-pwm driver applies the last PWM or LPG feature configuration
|
||
|
and enables that feature.
|
||
|
|
||
|
Required bindings to support PWM feature:
|
||
|
- qcom,period: PWM period time in microseconds.
|
||
|
- qcom,duty: PWM duty time in microseconds.
|
||
|
- label: "pwm"
|
||
|
|
||
|
Required bindings to support LPG feature:
|
||
|
The following bindings are needed to configure LPG mode, where a list of
|
||
|
duty cycle percentages is populated. The size of the list cannot exceed
|
||
|
the size of the LPG look-up table.
|
||
|
|
||
|
- qcom,period: PWM period time in microseconds.
|
||
|
- qcom,duty-percents: List of entries for look-up table
|
||
|
- cell-index: Index of look-up table that should be used to start
|
||
|
filling up the duty-pct list. start-idx + size of list
|
||
|
cannot exceed the size of look-up table.
|
||
|
- label: "lpg"
|
||
|
|
||
|
|
||
|
Optional bindings to support LPG feature:
|
||
|
- qcom,ramp-step-duration: Time (in ms) to wait before loading next entry of LUT
|
||
|
- qcom,lpg-lut-pause-hi: Time (in ms) to wait once pattern reaches to hi
|
||
|
index.
|
||
|
- qcom,lpg-lut-pause-lo: Time (in ms) to wait once pattern reaches to lo
|
||
|
index.
|
||
|
- qcom,lpg-lut-ramp-direction: 1 = Start the pattern from lo index to hi index.
|
||
|
0 = Start the pattern from hi index to lo index.
|
||
|
- qcom,lpg-lut-pattern-repeat: 1 = Repeat the pattern after the pause once it
|
||
|
reaches to last duty cycle.
|
||
|
0 = Do not repeat the pattern.
|
||
|
- qcom,lpg-lut-ramp-toggle: 1 = Toggle the direction of the pattern.
|
||
|
0 = Do not toggle the direction.
|
||
|
- qcom,lpg-lut-enable-pause-hi: 1 = Enable pause time at hi index.
|
||
|
0 = Disable pause time at hi index.
|
||
|
- qcom,lpg-lut-enable-pause-lo: 1 = Enable pause time at lo index.
|
||
|
0 = Disable pause time at lo index.
|
||
|
|
||
|
|
||
|
Example:
|
||
|
qcom,spmi@fc4c0000 {
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <0>;
|
||
|
|
||
|
qcom,pm8941@1 {
|
||
|
spmi-slave-container;
|
||
|
reg = <0x1>;
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
|
||
|
pwm@b100 {
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
compatible = "qcom,qpnp-pwm";
|
||
|
reg = <0xb100 0x100>,
|
||
|
<0xb040 0x80>;
|
||
|
reg-names = "qpnp-lpg-channel-base", "qpnp-lpg-lut-base";
|
||
|
qcom,channel-id = <0>;
|
||
|
status = "okay";
|
||
|
};
|
||
|
|
||
|
pwm@b200 {
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
compatible = "qcom,qpnp-pwm";
|
||
|
reg = <0xb200 0x100>,
|
||
|
<0xb040 0x80>;
|
||
|
reg-names = "qpnp-lpg-channel-base", "qpnp-lpg-lut-base";
|
||
|
qcom,channel-id = <1>;
|
||
|
qcom,period = <6000000>;
|
||
|
status = "okay";
|
||
|
qcom,pwm {
|
||
|
qcom,duty = <4000000>;
|
||
|
label = "pwm";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
pwm@b500 {
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
compatible = "qcom,qpnp-pwm";
|
||
|
reg = <0xb500 0x100>,
|
||
|
<0xb040 0x80>;
|
||
|
reg-names = "qpnp-lpg-channel-base", "qpnp-lpg-lut-base";
|
||
|
qcom,channel-id = <4>;
|
||
|
qcom,period = <6000000>;
|
||
|
qcom,mode-select = <0>;
|
||
|
qcom,channel-owner = "RGB-led";
|
||
|
status = "okay";
|
||
|
|
||
|
qcom,pwm {
|
||
|
qcom,duty = <4000000>;
|
||
|
label = "pwm";
|
||
|
};
|
||
|
|
||
|
qcom,lpg {
|
||
|
qcom,duty-percents = <1 14 28 42 56 84 100
|
||
|
100 84 56 42 28 14 1>;
|
||
|
cell-index = <0>;
|
||
|
qcom,ramp-step-duration = <20>;
|
||
|
label = "lpg";
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
There are couple of ways to configure PWM device channels as shown in above
|
||
|
example,
|
||
|
1. The PWM device channel #0 is configured with only required device bindings.
|
||
|
In this case, the qpnp-pwm driver does not configure any mode by default.
|
||
|
|
||
|
2. The qpnp-pwm driver configures PWM device channel #1 with PWM feature
|
||
|
configuration, but does not enable the channel since "qcom,mode-select" binding
|
||
|
is not specified in the devicetree.
|
||
|
|
||
|
3. Both the PWM and LPG configurations are provided for PWM device channel #4.
|
||
|
The qpnp-pwm driver configures both the modes, but enables PWM mode at the probe
|
||
|
time. It also sets the channel owner information for the channel.
|