3 * Texas Instruments Incorporated, <www.ti.com>
5 * Keerthy <j-keerthy@ti.com>
7 * SPDX-License-Identifier: GPL-2.0+
15 #include <power/pmic.h>
16 #include <power/regulator.h>
17 #include <power/lp873x.h>
19 static const char lp873x_buck_ctrl[LP873X_BUCK_NUM] = {0x2, 0x4};
20 static const char lp873x_buck_volt[LP873X_BUCK_NUM] = {0x6, 0x7};
21 static const char lp873x_ldo_ctrl[LP873X_LDO_NUM] = {0x8, 0x9};
22 static const char lp873x_ldo_volt[LP873X_LDO_NUM] = {0xA, 0xB};
24 static int lp873x_buck_enable(struct udevice *dev, int op, bool *enable)
28 struct dm_regulator_uclass_platdata *uc_pdata;
30 uc_pdata = dev_get_uclass_platdata(dev);
31 adr = uc_pdata->ctrl_reg;
33 ret = pmic_reg_read(dev->parent, adr);
37 if (op == PMIC_OP_GET) {
38 ret &= LP873X_BUCK_MODE_MASK;
46 } else if (op == PMIC_OP_SET) {
48 ret |= LP873X_BUCK_MODE_MASK;
50 ret &= ~(LP873X_BUCK_MODE_MASK);
51 ret = pmic_reg_write(dev->parent, adr, ret);
59 static int lp873x_buck_volt2hex(int uV)
61 if (uV > LP873X_BUCK_VOLT_MAX)
63 else if (uV > 1400000)
64 return (uV - 1420000) / 20000 + 0x9E;
66 return (uV - 735000) / 5000 + 0x18;
67 else if (uV >= 700000)
68 return (uV - 700000) / 10000 + 0x1;
73 static int lp873x_buck_hex2volt(int hex)
75 if (hex > LP873X_BUCK_VOLT_MAX_HEX)
78 return 1400000 + (hex - 0x9D) * 20000;
80 return 730000 + (hex - 0x17) * 5000;
82 return 700000 + (hex - 0x14) * 10000;
87 static int lp873x_buck_val(struct udevice *dev, int op, int *uV)
89 unsigned int hex, adr;
91 struct dm_regulator_uclass_platdata *uc_pdata;
93 uc_pdata = dev_get_uclass_platdata(dev);
95 if (op == PMIC_OP_GET)
98 adr = uc_pdata->volt_reg;
100 ret = pmic_reg_read(dev->parent, adr);
104 if (op == PMIC_OP_GET) {
105 ret &= LP873X_BUCK_VOLT_MASK;
106 ret = lp873x_buck_hex2volt(ret);
114 hex = lp873x_buck_volt2hex(*uV);
121 ret = pmic_reg_write(dev->parent, adr, ret);
126 static int lp873x_ldo_enable(struct udevice *dev, int op, bool *enable)
130 struct dm_regulator_uclass_platdata *uc_pdata;
132 uc_pdata = dev_get_uclass_platdata(dev);
133 adr = uc_pdata->ctrl_reg;
135 ret = pmic_reg_read(dev->parent, adr);
139 if (op == PMIC_OP_GET) {
140 ret &= LP873X_LDO_MODE_MASK;
148 } else if (op == PMIC_OP_SET) {
150 ret |= LP873X_LDO_MODE_MASK;
152 ret &= ~(LP873X_LDO_MODE_MASK);
154 ret = pmic_reg_write(dev->parent, adr, ret);
162 static int lp873x_ldo_volt2hex(int uV)
164 if (uV > LP873X_LDO_VOLT_MAX)
167 return (uV - 800000) / 100000;
170 static int lp873x_ldo_hex2volt(int hex)
172 if (hex > LP873X_LDO_VOLT_MAX_HEX)
178 return (hex * 100000) + 800000;
181 static int lp873x_ldo_val(struct udevice *dev, int op, int *uV)
183 unsigned int hex, adr;
186 struct dm_regulator_uclass_platdata *uc_pdata;
188 if (op == PMIC_OP_GET)
191 uc_pdata = dev_get_uclass_platdata(dev);
193 adr = uc_pdata->volt_reg;
195 ret = pmic_reg_read(dev->parent, adr);
199 if (op == PMIC_OP_GET) {
200 ret &= LP873X_LDO_VOLT_MASK;
201 ret = lp873x_ldo_hex2volt(ret);
208 hex = lp873x_ldo_volt2hex(*uV);
212 ret &= ~LP873X_LDO_VOLT_MASK;
216 ret = pmic_reg_write(dev->parent, adr, ret);
221 static int lp873x_ldo_probe(struct udevice *dev)
223 struct dm_regulator_uclass_platdata *uc_pdata;
225 uc_pdata = dev_get_uclass_platdata(dev);
226 uc_pdata->type = REGULATOR_TYPE_LDO;
228 int idx = dev->driver_data;
229 if (idx >= LP873X_LDO_NUM) {
230 printf("Wrong ID for regulator\n");
234 uc_pdata->ctrl_reg = lp873x_ldo_ctrl[idx];
235 uc_pdata->volt_reg = lp873x_ldo_volt[idx];
240 static int ldo_get_value(struct udevice *dev)
245 ret = lp873x_ldo_val(dev, PMIC_OP_GET, &uV);
252 static int ldo_set_value(struct udevice *dev, int uV)
254 return lp873x_ldo_val(dev, PMIC_OP_SET, &uV);
257 static int ldo_get_enable(struct udevice *dev)
262 ret = lp873x_ldo_enable(dev, PMIC_OP_GET, &enable);
269 static int ldo_set_enable(struct udevice *dev, bool enable)
271 return lp873x_ldo_enable(dev, PMIC_OP_SET, &enable);
274 static int lp873x_buck_probe(struct udevice *dev)
276 struct dm_regulator_uclass_platdata *uc_pdata;
279 uc_pdata = dev_get_uclass_platdata(dev);
280 uc_pdata->type = REGULATOR_TYPE_BUCK;
282 idx = dev->driver_data;
283 if (idx >= LP873X_BUCK_NUM) {
284 printf("Wrong ID for regulator\n");
288 uc_pdata->ctrl_reg = lp873x_buck_ctrl[idx];
289 uc_pdata->volt_reg = lp873x_buck_volt[idx];
294 static int buck_get_value(struct udevice *dev)
299 ret = lp873x_buck_val(dev, PMIC_OP_GET, &uV);
306 static int buck_set_value(struct udevice *dev, int uV)
308 return lp873x_buck_val(dev, PMIC_OP_SET, &uV);
311 static int buck_get_enable(struct udevice *dev)
317 ret = lp873x_buck_enable(dev, PMIC_OP_GET, &enable);
324 static int buck_set_enable(struct udevice *dev, bool enable)
326 return lp873x_buck_enable(dev, PMIC_OP_SET, &enable);
329 static const struct dm_regulator_ops lp873x_ldo_ops = {
330 .get_value = ldo_get_value,
331 .set_value = ldo_set_value,
332 .get_enable = ldo_get_enable,
333 .set_enable = ldo_set_enable,
336 U_BOOT_DRIVER(lp873x_ldo) = {
337 .name = LP873X_LDO_DRIVER,
338 .id = UCLASS_REGULATOR,
339 .ops = &lp873x_ldo_ops,
340 .probe = lp873x_ldo_probe,
343 static const struct dm_regulator_ops lp873x_buck_ops = {
344 .get_value = buck_get_value,
345 .set_value = buck_set_value,
346 .get_enable = buck_get_enable,
347 .set_enable = buck_set_enable,
350 U_BOOT_DRIVER(lp873x_buck) = {
351 .name = LP873X_BUCK_DRIVER,
352 .id = UCLASS_REGULATOR,
353 .ops = &lp873x_buck_ops,
354 .probe = lp873x_buck_probe,