123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- Qualcomm Technologies, Inc. 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. QTI 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.
- - reg-names: Name for the above register.
- "qpnp-lpg-channel-base" = physical base address of the
- controller's LPG channel register.
- - qcom,lpg-lut-size: LPG LUT size.
- - qcom,channel-id: channel Id for the PWM.
- - qcom,supported-sizes: Supported PWM sizes.
- Following three pwm sizes lists are supported by PWM/LPG controllers.
- <6>, <9>;
- <7>, <8>;
- <6>, <7>, <9>;
- - qcom,ramp-index: Ramp index in LUT ramp control register.
- Each LPG has an index in the LUT ramp control register.
- One exception is that, if LPG does not support LUT mode
- and supports only PWM mode then there is no need to
- provide the ramp-index.
- Optional device bindings:
- - qcom,force-pwm-size: For certain LPG channels, PWM size can be forced.
- Possible values 6, 7, 8 and 9.
- - qcom,channel-owner: A string value to supply owner information.
- - qcom,mode-select: 0 = PWM mode
- 1 = LPG mode
- - qcom,dtest-line: indicates which DTEST line to be configured for LPG
- or PWM output. For LPG subtypes, possible values are 1,
- 2, 3 and 4. For PWM subtype, possibe values are 1 and 2.
- - qcom,dtest-output: indicates the output configuration for DTEST line.
- For LPG subtypes, possible output values are:
- 0 = Disabled
- 1 = LPG output low
- 2 = LPG output high
- 3,4,5 = DTEST line specific configuration
- 6,7 = Not used
- For PWM subtype, possible output values are:
- 0 = Disabled
- 1 = pwm_out for DTEST1 or reserved
- 2 = pwm_out for DTEST2 or reserved
- 3 = Not used
- 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.
- - reg: Offset and length of 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: Name for the above register.
- "qpnp-lpg-lut-base" = physical base address of LPG LUT.
- - 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>;
- qcom,supported-sizes = <6>, <7>, <9>;
- qcom,ramp-index = <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,supported-sizes = <6>, <7>, <9>;
- qcom,ramp-index = <1>;
- qcom,force-pwm-size = <9>;
- 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,supported-sizes = <6>, <7>, <9>;
- qcom,ramp-index = <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";
- };
- };
- pwm@b300 {
- #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 = <2>;
- qcom,supported-sizes = <6>, <7>, <9>;
- qcom,ramp-index = <1>;
- qcom,force-pwm-size = <9>;
- qcom,period = <6000000>;
- qcom,dtest-line = <3>;
- qcom,dtest-output = <1>;
- status = "okay";
- qcom,pwm {
- qcom,duty = <4000000>;
- label = "pwm";
- };
- };
- };
- };
- 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.
- 4. This configuration is pretty similar to #2 above except in this case channel
- #3 is configured for PWM mode. Also it's DTEST3 line is configured to output
- LPG OUT low.
|