diff options
| -rw-r--r-- | Documentation/devicetree/bindings/regulator/palmas-pmic.txt | 12 | ||||
| -rw-r--r-- | drivers/regulator/palmas-regulator.c | 166 |
2 files changed, 168 insertions, 10 deletions
diff --git a/Documentation/devicetree/bindings/regulator/palmas-pmic.txt b/Documentation/devicetree/bindings/regulator/palmas-pmic.txt index 875639ae0606..42e6b6bc48ff 100644 --- a/Documentation/devicetree/bindings/regulator/palmas-pmic.txt +++ b/Documentation/devicetree/bindings/regulator/palmas-pmic.txt | |||
| @@ -26,11 +26,17 @@ Optional nodes: | |||
| 26 | 26 | ||
| 27 | For ti,palmas-pmic - smps12, smps123, smps3 depending on OTP, | 27 | For ti,palmas-pmic - smps12, smps123, smps3 depending on OTP, |
| 28 | smps45, smps457, smps7 depending on variant, smps6, smps[8-9], | 28 | smps45, smps457, smps7 depending on variant, smps6, smps[8-9], |
| 29 | smps10_out2, smps10_out1, do[1-9], ldoln, ldousb. | 29 | smps10_out2, smps10_out1, ldo[1-9], ldoln, ldousb. |
| 30 | 30 | ||
| 31 | Optional sub-node properties: | 31 | Optional sub-node properties: |
| 32 | ti,warm-reset - maintain voltage during warm reset(boolean) | 32 | ti,warm-reset - maintain voltage during warm reset(boolean) |
| 33 | ti,roof-floor - control voltage selection by pin(boolean) | 33 | ti,roof-floor - This takes as optional argument on platform supporting |
| 34 | the rail from desired external control. If there is no argument then | ||
| 35 | it will be assume that it is controlled by NSLEEP pin. | ||
| 36 | The valid value for external pins are: | ||
| 37 | ENABLE1 then 1, | ||
| 38 | ENABLE2 then 2 or | ||
| 39 | NSLEEP then 3. | ||
| 34 | ti,mode-sleep - mode to adopt in pmic sleep 0 - off, 1 - auto, | 40 | ti,mode-sleep - mode to adopt in pmic sleep 0 - off, 1 - auto, |
| 35 | 2 - eco, 3 - forced pwm | 41 | 2 - eco, 3 - forced pwm |
| 36 | ti,smps-range - OTP has the wrong range set for the hardware so override | 42 | ti,smps-range - OTP has the wrong range set for the hardware so override |
| @@ -61,7 +67,7 @@ pmic { | |||
| 61 | regulator-always-on; | 67 | regulator-always-on; |
| 62 | regulator-boot-on; | 68 | regulator-boot-on; |
| 63 | ti,warm-reset; | 69 | ti,warm-reset; |
| 64 | ti,roof-floor; | 70 | ti,roof-floor = <1>; /* ENABLE1 control */ |
| 65 | ti,mode-sleep = <0>; | 71 | ti,mode-sleep = <0>; |
| 66 | ti,smps-range = <1>; | 72 | ti,smps-range = <1>; |
| 67 | }; | 73 | }; |
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 4f79c0d61faf..9c62b1d34685 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c | |||
| @@ -33,6 +33,7 @@ struct regs_info { | |||
| 33 | u8 vsel_addr; | 33 | u8 vsel_addr; |
| 34 | u8 ctrl_addr; | 34 | u8 ctrl_addr; |
| 35 | u8 tstep_addr; | 35 | u8 tstep_addr; |
| 36 | int sleep_id; | ||
| 36 | }; | 37 | }; |
| 37 | 38 | ||
| 38 | static const struct regs_info palmas_regs_info[] = { | 39 | static const struct regs_info palmas_regs_info[] = { |
| @@ -42,6 +43,7 @@ static const struct regs_info palmas_regs_info[] = { | |||
| 42 | .vsel_addr = PALMAS_SMPS12_VOLTAGE, | 43 | .vsel_addr = PALMAS_SMPS12_VOLTAGE, |
| 43 | .ctrl_addr = PALMAS_SMPS12_CTRL, | 44 | .ctrl_addr = PALMAS_SMPS12_CTRL, |
| 44 | .tstep_addr = PALMAS_SMPS12_TSTEP, | 45 | .tstep_addr = PALMAS_SMPS12_TSTEP, |
| 46 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS12, | ||
| 45 | }, | 47 | }, |
| 46 | { | 48 | { |
| 47 | .name = "SMPS123", | 49 | .name = "SMPS123", |
| @@ -49,12 +51,14 @@ static const struct regs_info palmas_regs_info[] = { | |||
| 49 | .vsel_addr = PALMAS_SMPS12_VOLTAGE, | 51 | .vsel_addr = PALMAS_SMPS12_VOLTAGE, |
| 50 | .ctrl_addr = PALMAS_SMPS12_CTRL, | 52 | .ctrl_addr = PALMAS_SMPS12_CTRL, |
| 51 | .tstep_addr = PALMAS_SMPS12_TSTEP, | 53 | .tstep_addr = PALMAS_SMPS12_TSTEP, |
| 54 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS12, | ||
| 52 | }, | 55 | }, |
| 53 | { | 56 | { |
| 54 | .name = "SMPS3", | 57 | .name = "SMPS3", |
| 55 | .sname = "smps3-in", | 58 | .sname = "smps3-in", |
| 56 | .vsel_addr = PALMAS_SMPS3_VOLTAGE, | 59 | .vsel_addr = PALMAS_SMPS3_VOLTAGE, |
| 57 | .ctrl_addr = PALMAS_SMPS3_CTRL, | 60 | .ctrl_addr = PALMAS_SMPS3_CTRL, |
| 61 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS3, | ||
| 58 | }, | 62 | }, |
| 59 | { | 63 | { |
| 60 | .name = "SMPS45", | 64 | .name = "SMPS45", |
| @@ -62,6 +66,7 @@ static const struct regs_info palmas_regs_info[] = { | |||
| 62 | .vsel_addr = PALMAS_SMPS45_VOLTAGE, | 66 | .vsel_addr = PALMAS_SMPS45_VOLTAGE, |
| 63 | .ctrl_addr = PALMAS_SMPS45_CTRL, | 67 | .ctrl_addr = PALMAS_SMPS45_CTRL, |
| 64 | .tstep_addr = PALMAS_SMPS45_TSTEP, | 68 | .tstep_addr = PALMAS_SMPS45_TSTEP, |
| 69 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS45, | ||
| 65 | }, | 70 | }, |
| 66 | { | 71 | { |
| 67 | .name = "SMPS457", | 72 | .name = "SMPS457", |
| @@ -69,6 +74,7 @@ static const struct regs_info palmas_regs_info[] = { | |||
| 69 | .vsel_addr = PALMAS_SMPS45_VOLTAGE, | 74 | .vsel_addr = PALMAS_SMPS45_VOLTAGE, |
| 70 | .ctrl_addr = PALMAS_SMPS45_CTRL, | 75 | .ctrl_addr = PALMAS_SMPS45_CTRL, |
| 71 | .tstep_addr = PALMAS_SMPS45_TSTEP, | 76 | .tstep_addr = PALMAS_SMPS45_TSTEP, |
| 77 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS45, | ||
| 72 | }, | 78 | }, |
| 73 | { | 79 | { |
| 74 | .name = "SMPS6", | 80 | .name = "SMPS6", |
| @@ -76,12 +82,14 @@ static const struct regs_info palmas_regs_info[] = { | |||
| 76 | .vsel_addr = PALMAS_SMPS6_VOLTAGE, | 82 | .vsel_addr = PALMAS_SMPS6_VOLTAGE, |
| 77 | .ctrl_addr = PALMAS_SMPS6_CTRL, | 83 | .ctrl_addr = PALMAS_SMPS6_CTRL, |
| 78 | .tstep_addr = PALMAS_SMPS6_TSTEP, | 84 | .tstep_addr = PALMAS_SMPS6_TSTEP, |
| 85 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS6, | ||
| 79 | }, | 86 | }, |
| 80 | { | 87 | { |
| 81 | .name = "SMPS7", | 88 | .name = "SMPS7", |
| 82 | .sname = "smps7-in", | 89 | .sname = "smps7-in", |
| 83 | .vsel_addr = PALMAS_SMPS7_VOLTAGE, | 90 | .vsel_addr = PALMAS_SMPS7_VOLTAGE, |
| 84 | .ctrl_addr = PALMAS_SMPS7_CTRL, | 91 | .ctrl_addr = PALMAS_SMPS7_CTRL, |
| 92 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS7, | ||
| 85 | }, | 93 | }, |
| 86 | { | 94 | { |
| 87 | .name = "SMPS8", | 95 | .name = "SMPS8", |
| @@ -89,108 +97,128 @@ static const struct regs_info palmas_regs_info[] = { | |||
| 89 | .vsel_addr = PALMAS_SMPS8_VOLTAGE, | 97 | .vsel_addr = PALMAS_SMPS8_VOLTAGE, |
| 90 | .ctrl_addr = PALMAS_SMPS8_CTRL, | 98 | .ctrl_addr = PALMAS_SMPS8_CTRL, |
| 91 | .tstep_addr = PALMAS_SMPS8_TSTEP, | 99 | .tstep_addr = PALMAS_SMPS8_TSTEP, |
| 100 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS8, | ||
| 92 | }, | 101 | }, |
| 93 | { | 102 | { |
| 94 | .name = "SMPS9", | 103 | .name = "SMPS9", |
| 95 | .sname = "smps9-in", | 104 | .sname = "smps9-in", |
| 96 | .vsel_addr = PALMAS_SMPS9_VOLTAGE, | 105 | .vsel_addr = PALMAS_SMPS9_VOLTAGE, |
| 97 | .ctrl_addr = PALMAS_SMPS9_CTRL, | 106 | .ctrl_addr = PALMAS_SMPS9_CTRL, |
| 107 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS9, | ||
| 98 | }, | 108 | }, |
| 99 | { | 109 | { |
| 100 | .name = "SMPS10_OUT2", | 110 | .name = "SMPS10_OUT2", |
| 101 | .sname = "smps10-in", | 111 | .sname = "smps10-in", |
| 102 | .ctrl_addr = PALMAS_SMPS10_CTRL, | 112 | .ctrl_addr = PALMAS_SMPS10_CTRL, |
| 113 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS10, | ||
| 103 | }, | 114 | }, |
| 104 | { | 115 | { |
| 105 | .name = "SMPS10_OUT1", | 116 | .name = "SMPS10_OUT1", |
| 106 | .sname = "smps10-out2", | 117 | .sname = "smps10-out2", |
| 107 | .ctrl_addr = PALMAS_SMPS10_CTRL, | 118 | .ctrl_addr = PALMAS_SMPS10_CTRL, |
| 119 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS10, | ||
| 108 | }, | 120 | }, |
| 109 | { | 121 | { |
| 110 | .name = "LDO1", | 122 | .name = "LDO1", |
| 111 | .sname = "ldo1-in", | 123 | .sname = "ldo1-in", |
| 112 | .vsel_addr = PALMAS_LDO1_VOLTAGE, | 124 | .vsel_addr = PALMAS_LDO1_VOLTAGE, |
| 113 | .ctrl_addr = PALMAS_LDO1_CTRL, | 125 | .ctrl_addr = PALMAS_LDO1_CTRL, |
| 126 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO1, | ||
| 114 | }, | 127 | }, |
| 115 | { | 128 | { |
| 116 | .name = "LDO2", | 129 | .name = "LDO2", |
| 117 | .sname = "ldo2-in", | 130 | .sname = "ldo2-in", |
| 118 | .vsel_addr = PALMAS_LDO2_VOLTAGE, | 131 | .vsel_addr = PALMAS_LDO2_VOLTAGE, |
| 119 | .ctrl_addr = PALMAS_LDO2_CTRL, | 132 | .ctrl_addr = PALMAS_LDO2_CTRL, |
| 133 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO2, | ||
| 120 | }, | 134 | }, |
| 121 | { | 135 | { |
| 122 | .name = "LDO3", | 136 | .name = "LDO3", |
| 123 | .sname = "ldo3-in", | 137 | .sname = "ldo3-in", |
| 124 | .vsel_addr = PALMAS_LDO3_VOLTAGE, | 138 | .vsel_addr = PALMAS_LDO3_VOLTAGE, |
| 125 | .ctrl_addr = PALMAS_LDO3_CTRL, | 139 | .ctrl_addr = PALMAS_LDO3_CTRL, |
| 140 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO3, | ||
| 126 | }, | 141 | }, |
| 127 | { | 142 | { |
| 128 | .name = "LDO4", | 143 | .name = "LDO4", |
| 129 | .sname = "ldo4-in", | 144 | .sname = "ldo4-in", |
| 130 | .vsel_addr = PALMAS_LDO4_VOLTAGE, | 145 | .vsel_addr = PALMAS_LDO4_VOLTAGE, |
| 131 | .ctrl_addr = PALMAS_LDO4_CTRL, | 146 | .ctrl_addr = PALMAS_LDO4_CTRL, |
| 147 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO4, | ||
| 132 | }, | 148 | }, |
| 133 | { | 149 | { |
| 134 | .name = "LDO5", | 150 | .name = "LDO5", |
| 135 | .sname = "ldo5-in", | 151 | .sname = "ldo5-in", |
| 136 | .vsel_addr = PALMAS_LDO5_VOLTAGE, | 152 | .vsel_addr = PALMAS_LDO5_VOLTAGE, |
| 137 | .ctrl_addr = PALMAS_LDO5_CTRL, | 153 | .ctrl_addr = PALMAS_LDO5_CTRL, |
| 154 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO5, | ||
| 138 | }, | 155 | }, |
| 139 | { | 156 | { |
| 140 | .name = "LDO6", | 157 | .name = "LDO6", |
| 141 | .sname = "ldo6-in", | 158 | .sname = "ldo6-in", |
| 142 | .vsel_addr = PALMAS_LDO6_VOLTAGE, | 159 | .vsel_addr = PALMAS_LDO6_VOLTAGE, |
| 143 | .ctrl_addr = PALMAS_LDO6_CTRL, | 160 | .ctrl_addr = PALMAS_LDO6_CTRL, |
| 161 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO6, | ||
| 144 | }, | 162 | }, |
| 145 | { | 163 | { |
| 146 | .name = "LDO7", | 164 | .name = "LDO7", |
| 147 | .sname = "ldo7-in", | 165 | .sname = "ldo7-in", |
| 148 | .vsel_addr = PALMAS_LDO7_VOLTAGE, | 166 | .vsel_addr = PALMAS_LDO7_VOLTAGE, |
| 149 | .ctrl_addr = PALMAS_LDO7_CTRL, | 167 | .ctrl_addr = PALMAS_LDO7_CTRL, |
| 168 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO7, | ||
| 150 | }, | 169 | }, |
| 151 | { | 170 | { |
| 152 | .name = "LDO8", | 171 | .name = "LDO8", |
| 153 | .sname = "ldo8-in", | 172 | .sname = "ldo8-in", |
| 154 | .vsel_addr = PALMAS_LDO8_VOLTAGE, | 173 | .vsel_addr = PALMAS_LDO8_VOLTAGE, |
| 155 | .ctrl_addr = PALMAS_LDO8_CTRL, | 174 | .ctrl_addr = PALMAS_LDO8_CTRL, |
| 175 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO8, | ||
| 156 | }, | 176 | }, |
| 157 | { | 177 | { |
| 158 | .name = "LDO9", | 178 | .name = "LDO9", |
| 159 | .sname = "ldo9-in", | 179 | .sname = "ldo9-in", |
| 160 | .vsel_addr = PALMAS_LDO9_VOLTAGE, | 180 | .vsel_addr = PALMAS_LDO9_VOLTAGE, |
| 161 | .ctrl_addr = PALMAS_LDO9_CTRL, | 181 | .ctrl_addr = PALMAS_LDO9_CTRL, |
| 182 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO9, | ||
| 162 | }, | 183 | }, |
| 163 | { | 184 | { |
| 164 | .name = "LDOLN", | 185 | .name = "LDOLN", |
| 165 | .sname = "ldoln-in", | 186 | .sname = "ldoln-in", |
| 166 | .vsel_addr = PALMAS_LDOLN_VOLTAGE, | 187 | .vsel_addr = PALMAS_LDOLN_VOLTAGE, |
| 167 | .ctrl_addr = PALMAS_LDOLN_CTRL, | 188 | .ctrl_addr = PALMAS_LDOLN_CTRL, |
| 189 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDOLN, | ||
| 168 | }, | 190 | }, |
| 169 | { | 191 | { |
| 170 | .name = "LDOUSB", | 192 | .name = "LDOUSB", |
| 171 | .sname = "ldousb-in", | 193 | .sname = "ldousb-in", |
| 172 | .vsel_addr = PALMAS_LDOUSB_VOLTAGE, | 194 | .vsel_addr = PALMAS_LDOUSB_VOLTAGE, |
| 173 | .ctrl_addr = PALMAS_LDOUSB_CTRL, | 195 | .ctrl_addr = PALMAS_LDOUSB_CTRL, |
| 196 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDOUSB, | ||
| 174 | }, | 197 | }, |
| 175 | { | 198 | { |
| 176 | .name = "REGEN1", | 199 | .name = "REGEN1", |
| 177 | .ctrl_addr = PALMAS_REGEN1_CTRL, | 200 | .ctrl_addr = PALMAS_REGEN1_CTRL, |
| 201 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN1, | ||
| 178 | }, | 202 | }, |
| 179 | { | 203 | { |
| 180 | .name = "REGEN2", | 204 | .name = "REGEN2", |
| 181 | .ctrl_addr = PALMAS_REGEN2_CTRL, | 205 | .ctrl_addr = PALMAS_REGEN2_CTRL, |
| 206 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN2, | ||
| 182 | }, | 207 | }, |
| 183 | { | 208 | { |
| 184 | .name = "REGEN3", | 209 | .name = "REGEN3", |
| 185 | .ctrl_addr = PALMAS_REGEN3_CTRL, | 210 | .ctrl_addr = PALMAS_REGEN3_CTRL, |
| 211 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN3, | ||
| 186 | }, | 212 | }, |
| 187 | { | 213 | { |
| 188 | .name = "SYSEN1", | 214 | .name = "SYSEN1", |
| 189 | .ctrl_addr = PALMAS_SYSEN1_CTRL, | 215 | .ctrl_addr = PALMAS_SYSEN1_CTRL, |
| 216 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SYSEN1, | ||
| 190 | }, | 217 | }, |
| 191 | { | 218 | { |
| 192 | .name = "SYSEN2", | 219 | .name = "SYSEN2", |
| 193 | .ctrl_addr = PALMAS_SYSEN2_CTRL, | 220 | .ctrl_addr = PALMAS_SYSEN2_CTRL, |
| 221 | .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SYSEN2, | ||
| 194 | }, | 222 | }, |
| 195 | }; | 223 | }; |
| 196 | 224 | ||
| @@ -478,6 +506,17 @@ static struct regulator_ops palmas_ops_smps = { | |||
| 478 | .set_ramp_delay = palmas_smps_set_ramp_delay, | 506 | .set_ramp_delay = palmas_smps_set_ramp_delay, |
| 479 | }; | 507 | }; |
| 480 | 508 | ||
| 509 | static struct regulator_ops palmas_ops_ext_control_smps = { | ||
| 510 | .set_mode = palmas_set_mode_smps, | ||
| 511 | .get_mode = palmas_get_mode_smps, | ||
| 512 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | ||
| 513 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | ||
| 514 | .list_voltage = palmas_list_voltage_smps, | ||
| 515 | .map_voltage = palmas_map_voltage_smps, | ||
| 516 | .set_voltage_time_sel = palma_smps_set_voltage_smps_time_sel, | ||
| 517 | .set_ramp_delay = palmas_smps_set_ramp_delay, | ||
| 518 | }; | ||
| 519 | |||
| 481 | static struct regulator_ops palmas_ops_smps10 = { | 520 | static struct regulator_ops palmas_ops_smps10 = { |
| 482 | .is_enabled = regulator_is_enabled_regmap, | 521 | .is_enabled = regulator_is_enabled_regmap, |
| 483 | .enable = regulator_enable_regmap, | 522 | .enable = regulator_enable_regmap, |
| @@ -513,12 +552,37 @@ static struct regulator_ops palmas_ops_ldo = { | |||
| 513 | .map_voltage = regulator_map_voltage_linear, | 552 | .map_voltage = regulator_map_voltage_linear, |
| 514 | }; | 553 | }; |
| 515 | 554 | ||
| 555 | static struct regulator_ops palmas_ops_ext_control_ldo = { | ||
| 556 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | ||
| 557 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | ||
| 558 | .list_voltage = regulator_list_voltage_linear, | ||
| 559 | .map_voltage = regulator_map_voltage_linear, | ||
| 560 | }; | ||
| 561 | |||
| 516 | static struct regulator_ops palmas_ops_extreg = { | 562 | static struct regulator_ops palmas_ops_extreg = { |
| 517 | .is_enabled = regulator_is_enabled_regmap, | 563 | .is_enabled = regulator_is_enabled_regmap, |
| 518 | .enable = regulator_enable_regmap, | 564 | .enable = regulator_enable_regmap, |
| 519 | .disable = regulator_disable_regmap, | 565 | .disable = regulator_disable_regmap, |
| 520 | }; | 566 | }; |
| 521 | 567 | ||
| 568 | static struct regulator_ops palmas_ops_ext_control_extreg = { | ||
| 569 | }; | ||
| 570 | |||
| 571 | static int palmas_regulator_config_external(struct palmas *palmas, int id, | ||
| 572 | struct palmas_reg_init *reg_init) | ||
| 573 | { | ||
| 574 | int sleep_id = palmas_regs_info[id].sleep_id; | ||
| 575 | int ret; | ||
| 576 | |||
| 577 | ret = palmas_ext_control_req_config(palmas, sleep_id, | ||
| 578 | reg_init->roof_floor, true); | ||
| 579 | if (ret < 0) | ||
| 580 | dev_err(palmas->dev, | ||
| 581 | "Ext control config for regulator %d failed %d\n", | ||
| 582 | id, ret); | ||
| 583 | return ret; | ||
| 584 | } | ||
| 585 | |||
| 522 | /* | 586 | /* |
| 523 | * setup the hardware based sleep configuration of the SMPS/LDO regulators | 587 | * setup the hardware based sleep configuration of the SMPS/LDO regulators |
| 524 | * from the platform data. This is different to the software based control | 588 | * from the platform data. This is different to the software based control |
| @@ -577,7 +641,22 @@ static int palmas_smps_init(struct palmas *palmas, int id, | |||
| 577 | return ret; | 641 | return ret; |
| 578 | } | 642 | } |
| 579 | 643 | ||
| 644 | if (reg_init->roof_floor && (id != PALMAS_REG_SMPS10_OUT1) && | ||
| 645 | (id != PALMAS_REG_SMPS10_OUT2)) { | ||
| 646 | /* Enable externally controlled regulator */ | ||
| 647 | addr = palmas_regs_info[id].ctrl_addr; | ||
| 648 | ret = palmas_smps_read(palmas, addr, ®); | ||
| 649 | if (ret < 0) | ||
| 650 | return ret; | ||
| 580 | 651 | ||
| 652 | if (!(reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK)) { | ||
| 653 | reg |= SMPS_CTRL_MODE_ON; | ||
| 654 | ret = palmas_smps_write(palmas, addr, reg); | ||
| 655 | if (ret < 0) | ||
| 656 | return ret; | ||
| 657 | } | ||
| 658 | return palmas_regulator_config_external(palmas, id, reg_init); | ||
| 659 | } | ||
| 581 | return 0; | 660 | return 0; |
| 582 | } | 661 | } |
| 583 | 662 | ||
| @@ -608,6 +687,20 @@ static int palmas_ldo_init(struct palmas *palmas, int id, | |||
| 608 | if (ret) | 687 | if (ret) |
| 609 | return ret; | 688 | return ret; |
| 610 | 689 | ||
| 690 | if (reg_init->roof_floor) { | ||
| 691 | /* Enable externally controlled regulator */ | ||
| 692 | addr = palmas_regs_info[id].ctrl_addr; | ||
| 693 | ret = palmas_update_bits(palmas, PALMAS_LDO_BASE, | ||
| 694 | addr, PALMAS_LDO1_CTRL_MODE_ACTIVE, | ||
| 695 | PALMAS_LDO1_CTRL_MODE_ACTIVE); | ||
| 696 | if (ret < 0) { | ||
| 697 | dev_err(palmas->dev, | ||
| 698 | "LDO Register 0x%02x update failed %d\n", | ||
| 699 | addr, ret); | ||
| 700 | return ret; | ||
| 701 | } | ||
| 702 | return palmas_regulator_config_external(palmas, id, reg_init); | ||
| 703 | } | ||
| 611 | return 0; | 704 | return 0; |
| 612 | } | 705 | } |
| 613 | 706 | ||
| @@ -630,6 +723,21 @@ static int palmas_extreg_init(struct palmas *palmas, int id, | |||
| 630 | addr, ret); | 723 | addr, ret); |
| 631 | return ret; | 724 | return ret; |
| 632 | } | 725 | } |
| 726 | |||
| 727 | if (reg_init->roof_floor) { | ||
| 728 | /* Enable externally controlled regulator */ | ||
| 729 | addr = palmas_regs_info[id].ctrl_addr; | ||
| 730 | ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE, | ||
| 731 | addr, PALMAS_REGEN1_CTRL_MODE_ACTIVE, | ||
| 732 | PALMAS_REGEN1_CTRL_MODE_ACTIVE); | ||
| 733 | if (ret < 0) { | ||
| 734 | dev_err(palmas->dev, | ||
| 735 | "Resource Register 0x%02x update failed %d\n", | ||
| 736 | addr, ret); | ||
| 737 | return ret; | ||
| 738 | } | ||
| 739 | return palmas_regulator_config_external(palmas, id, reg_init); | ||
| 740 | } | ||
| 633 | return 0; | 741 | return 0; |
| 634 | } | 742 | } |
| 635 | 743 | ||
| @@ -712,7 +820,7 @@ static void palmas_dt_to_pdata(struct device *dev, | |||
| 712 | int idx, ret; | 820 | int idx, ret; |
| 713 | 821 | ||
| 714 | node = of_node_get(node); | 822 | node = of_node_get(node); |
| 715 | regulators = of_find_node_by_name(node, "regulators"); | 823 | regulators = of_get_child_by_name(node, "regulators"); |
| 716 | if (!regulators) { | 824 | if (!regulators) { |
| 717 | dev_info(dev, "regulator node not found\n"); | 825 | dev_info(dev, "regulator node not found\n"); |
| 718 | return; | 826 | return; |
| @@ -740,9 +848,35 @@ static void palmas_dt_to_pdata(struct device *dev, | |||
| 740 | of_property_read_bool(palmas_matches[idx].of_node, | 848 | of_property_read_bool(palmas_matches[idx].of_node, |
| 741 | "ti,warm-reset"); | 849 | "ti,warm-reset"); |
| 742 | 850 | ||
| 743 | pdata->reg_init[idx]->roof_floor = | 851 | ret = of_property_read_u32(palmas_matches[idx].of_node, |
| 744 | of_property_read_bool(palmas_matches[idx].of_node, | 852 | "ti,roof-floor", &prop); |
| 745 | "ti,roof-floor"); | 853 | /* EINVAL: Property not found */ |
| 854 | if (ret != -EINVAL) { | ||
| 855 | int econtrol; | ||
| 856 | |||
| 857 | /* use default value, when no value is specified */ | ||
| 858 | econtrol = PALMAS_EXT_CONTROL_NSLEEP; | ||
| 859 | if (!ret) { | ||
| 860 | switch (prop) { | ||
| 861 | case 1: | ||
| 862 | econtrol = PALMAS_EXT_CONTROL_ENABLE1; | ||
| 863 | break; | ||
| 864 | case 2: | ||
| 865 | econtrol = PALMAS_EXT_CONTROL_ENABLE2; | ||
| 866 | break; | ||
| 867 | case 3: | ||
| 868 | econtrol = PALMAS_EXT_CONTROL_NSLEEP; | ||
| 869 | break; | ||
| 870 | default: | ||
| 871 | WARN_ON(1); | ||
| 872 | dev_warn(dev, | ||
| 873 | "%s: Invalid roof-floor option: %u\n", | ||
| 874 | palmas_matches[idx].name, prop); | ||
| 875 | break; | ||
| 876 | } | ||
| 877 | } | ||
| 878 | pdata->reg_init[idx]->roof_floor = econtrol; | ||
| 879 | } | ||
| 746 | 880 | ||
| 747 | ret = of_property_read_u32(palmas_matches[idx].of_node, | 881 | ret = of_property_read_u32(palmas_matches[idx].of_node, |
| 748 | "ti,mode-sleep", &prop); | 882 | "ti,mode-sleep", &prop); |
| @@ -869,6 +1003,8 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 869 | ret = palmas_smps_init(palmas, id, reg_init); | 1003 | ret = palmas_smps_init(palmas, id, reg_init); |
| 870 | if (ret) | 1004 | if (ret) |
| 871 | return ret; | 1005 | return ret; |
| 1006 | } else { | ||
| 1007 | reg_init = NULL; | ||
| 872 | } | 1008 | } |
| 873 | 1009 | ||
| 874 | /* Register the regulators */ | 1010 | /* Register the regulators */ |
| @@ -913,7 +1049,11 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 913 | if (reg & PALMAS_SMPS12_VOLTAGE_RANGE) | 1049 | if (reg & PALMAS_SMPS12_VOLTAGE_RANGE) |
| 914 | pmic->range[id] = 1; | 1050 | pmic->range[id] = 1; |
| 915 | 1051 | ||
| 916 | pmic->desc[id].ops = &palmas_ops_smps; | 1052 | if (reg_init && reg_init->roof_floor) |
| 1053 | pmic->desc[id].ops = | ||
| 1054 | &palmas_ops_ext_control_smps; | ||
| 1055 | else | ||
| 1056 | pmic->desc[id].ops = &palmas_ops_smps; | ||
| 917 | pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; | 1057 | pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; |
| 918 | pmic->desc[id].vsel_reg = | 1058 | pmic->desc[id].vsel_reg = |
| 919 | PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, | 1059 | PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, |
| @@ -956,6 +1096,10 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 956 | 1096 | ||
| 957 | /* Start this loop from the id left from previous loop */ | 1097 | /* Start this loop from the id left from previous loop */ |
| 958 | for (; id < PALMAS_NUM_REGS; id++) { | 1098 | for (; id < PALMAS_NUM_REGS; id++) { |
| 1099 | if (pdata && pdata->reg_init[id]) | ||
| 1100 | reg_init = pdata->reg_init[id]; | ||
| 1101 | else | ||
| 1102 | reg_init = NULL; | ||
| 959 | 1103 | ||
| 960 | /* Miss out regulators which are not available due | 1104 | /* Miss out regulators which are not available due |
| 961 | * to alternate functions. | 1105 | * to alternate functions. |
| @@ -969,7 +1113,11 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 969 | 1113 | ||
| 970 | if (id < PALMAS_REG_REGEN1) { | 1114 | if (id < PALMAS_REG_REGEN1) { |
| 971 | pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; | 1115 | pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; |
| 972 | pmic->desc[id].ops = &palmas_ops_ldo; | 1116 | if (reg_init && reg_init->roof_floor) |
| 1117 | pmic->desc[id].ops = | ||
| 1118 | &palmas_ops_ext_control_ldo; | ||
| 1119 | else | ||
| 1120 | pmic->desc[id].ops = &palmas_ops_ldo; | ||
| 973 | pmic->desc[id].min_uV = 900000; | 1121 | pmic->desc[id].min_uV = 900000; |
| 974 | pmic->desc[id].uV_step = 50000; | 1122 | pmic->desc[id].uV_step = 50000; |
| 975 | pmic->desc[id].linear_min_sel = 1; | 1123 | pmic->desc[id].linear_min_sel = 1; |
| @@ -999,7 +1147,11 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 999 | pmic->desc[id].enable_time = 2000; | 1147 | pmic->desc[id].enable_time = 2000; |
| 1000 | } else { | 1148 | } else { |
| 1001 | pmic->desc[id].n_voltages = 1; | 1149 | pmic->desc[id].n_voltages = 1; |
| 1002 | pmic->desc[id].ops = &palmas_ops_extreg; | 1150 | if (reg_init && reg_init->roof_floor) |
| 1151 | pmic->desc[id].ops = | ||
| 1152 | &palmas_ops_ext_control_extreg; | ||
| 1153 | else | ||
| 1154 | pmic->desc[id].ops = &palmas_ops_extreg; | ||
| 1003 | pmic->desc[id].enable_reg = | 1155 | pmic->desc[id].enable_reg = |
| 1004 | PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, | 1156 | PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, |
| 1005 | palmas_regs_info[id].ctrl_addr); | 1157 | palmas_regs_info[id].ctrl_addr); |
