• Axel Lin's avatar
    regulator: tps80031: Fix LDO2 track mode for TPS80031 or TPS80032-ES1.0 · 58fa6ab4
    Axel Lin authored
    Currently we have a special code in tps80031_ldo_set_voltage_sel() to handle
    LDO2 track mode for TPS80031 or TPS80032-ES1.0. The purpose is to address below
    issues:
    
    Issue description:
    - LDO2 traking mode is enabled
    - LDO2 tracks SMPS2 voltage.
    - LDO2 automatically switch-off when LDO2_CFG_VOLTAGE is changed to some discrete values (non exhaustive list):
                00011001, 00011010, 00011011, 00011100, .
    - LDO2 switch-on again when LDO2_CFG_VOLTAGE is changed to other values (non exhaustive list):
            00011000, 00010111, .
    
    LDOs have reserved codes. For these codes, LDO is switch-off.
    
    In tracking, LDO2 ref comes from SMPS2.
    However LDO2 enable is still gated by LDO2 VSEL decoding.
    As a result, in tracking mode LDO2 will be disabled for following code (SMPS VSEL format):
    000000 & 100000 (MSB not decoded)
    011001 & 111001 (MSB not decoded)
    011010 & 111010 (MSB not decoded)
    011100 & 111100 (MSB not decoded)
    011101 & 111101 (MSB not decoded)
    011110 & 111110 (MSB not decoded)
    
    However, current code has below bugs:
    1. It uses regulator_list_voltage_linear, so list_voltage() still shows above
       invalid selectors have supported voltage.
    2. Current code may return -EINVAL in tps80031_ldo_set_voltage_sel() for
       supported voltage. This is because when we use regulator_list_voltage_linear
       as list_voltage callback, regulator core will default use
       regulator_map_voltage_linear(). regulator_map_voltage_linear() has an
       assumption that the voltages are linear which is not true for this case.
    
       For example,
       when request voltage range is: min_uV=950000 uV && max_uV=1200000 uV
       regulator_map_voltage_linear() returns the selector is 29 (0x1D),
       set_voltage_sel() returns -EINVAL.
       (The selector is in invalid range, 0x19 ~ 0x1f).
    
       In above case, map_voltage() should find the lowest valid voltage within
       specific range (selector = 0x20) and set_voltage_sel() should successfully
       set the voltage to 987500 uV.
    
    This patch fixes these issues by:
    1. Add checking valid setting for LDO2 track mode of TPS80031 or TPS80032-ES1.0
       in list_voltage.  So it returns -EINVAL for invalid selectors.
    2. Implement tps80031_ldo_map_voltage, use regulator_map_voltage_iterate()
       to find the lowest voltage within specific range for TPS80031 or
       TPS80032-ES1.0. This is required when the voltage map is no longer linear.
    Signed-off-by: default avatarAxel Lin <axel.lin@ingics.com>
    Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
    58fa6ab4
tps80031-regulator.c 22 KB