Lines Matching +full:keep +full:- +full:on +full:- +full:stby

1 // SPDX-License-Identifier: GPL-2.0
3 // bd96801-regulator.c ROHM BD96801 regulator driver
8 * the configurations which should be done when the PMIC is in STBY mode.
11 * regulator safety limits (like limits for the over/under -voltages, over
14 * should be able to ensure the PMIC is in STBY state when the
20 * Users who require the STBY state configurations can have a look at the
23 * which implements some of the safety limit configurations - but leaves the
27 * STBY configuration support in your downstream driver ;)
36 #include <linux/mfd/rohm-generic.h>
37 #include <linux/mfd/rohm-bd96801.h>
146 * and the range from 0x10 to 0x1f is bd96801_buck_init_volts - 150mV ...
147 * bd96801_buck_init_volts - 0. But as the members of linear_range
148 * are all unsigned I will apply offset of -150 mV to value in
149 * linear_range - which should increase these ranges with
158 REGULATOR_LINEAR_RANGE(500000 - 150000, 0x00, 0xc8, 5000),
159 REGULATOR_LINEAR_RANGE(1550000 - 150000, 0xc9, 0xec, 50000),
160 REGULATOR_LINEAR_RANGE(3300000 - 150000, 0xed, 0xff, 0),
189 .err_cfg = -1, \
190 .wrn_cfg = -1, \
200 BD96801_IRQINFO(BD96801_PROT_OCP, "buck1-over-curr-h", 500,
201 "bd96801-buck1-overcurr-h"),
202 BD96801_IRQINFO(BD96801_PROT_OCP, "buck1-over-curr-l", 500,
203 "bd96801-buck1-overcurr-l"),
204 BD96801_IRQINFO(BD96801_PROT_OCP, "buck1-over-curr-n", 500,
205 "bd96801-buck1-overcurr-n"),
206 BD96801_IRQINFO(BD96801_PROT_OVP, "buck1-over-voltage", 500,
207 "bd96801-buck1-overvolt"),
208 BD96801_IRQINFO(BD96801_PROT_UVP, "buck1-under-voltage", 500,
209 "bd96801-buck1-undervolt"),
210 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck1-over-temp", 500,
211 "bd96801-buck1-thermal")
215 BD96801_IRQINFO(BD96801_PROT_OCP, "buck2-over-curr-h", 500,
216 "bd96801-buck2-overcurr-h"),
217 BD96801_IRQINFO(BD96801_PROT_OCP, "buck2-over-curr-l", 500,
218 "bd96801-buck2-overcurr-l"),
219 BD96801_IRQINFO(BD96801_PROT_OCP, "buck2-over-curr-n", 500,
220 "bd96801-buck2-overcurr-n"),
221 BD96801_IRQINFO(BD96801_PROT_OVP, "buck2-over-voltage", 500,
222 "bd96801-buck2-overvolt"),
223 BD96801_IRQINFO(BD96801_PROT_UVP, "buck2-under-voltage", 500,
224 "bd96801-buck2-undervolt"),
225 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck2-over-temp", 500,
226 "bd96801-buck2-thermal")
230 BD96801_IRQINFO(BD96801_PROT_OCP, "buck3-over-curr-h", 500,
231 "bd96801-buck3-overcurr-h"),
232 BD96801_IRQINFO(BD96801_PROT_OCP, "buck3-over-curr-l", 500,
233 "bd96801-buck3-overcurr-l"),
234 BD96801_IRQINFO(BD96801_PROT_OCP, "buck3-over-curr-n", 500,
235 "bd96801-buck3-overcurr-n"),
236 BD96801_IRQINFO(BD96801_PROT_OVP, "buck3-over-voltage", 500,
237 "bd96801-buck3-overvolt"),
238 BD96801_IRQINFO(BD96801_PROT_UVP, "buck3-under-voltage", 500,
239 "bd96801-buck3-undervolt"),
240 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck3-over-temp", 500,
241 "bd96801-buck3-thermal")
245 BD96801_IRQINFO(BD96801_PROT_OCP, "buck4-over-curr-h", 500,
246 "bd96801-buck4-overcurr-h"),
247 BD96801_IRQINFO(BD96801_PROT_OCP, "buck4-over-curr-l", 500,
248 "bd96801-buck4-overcurr-l"),
249 BD96801_IRQINFO(BD96801_PROT_OCP, "buck4-over-curr-n", 500,
250 "bd96801-buck4-overcurr-n"),
251 BD96801_IRQINFO(BD96801_PROT_OVP, "buck4-over-voltage", 500,
252 "bd96801-buck4-overvolt"),
253 BD96801_IRQINFO(BD96801_PROT_UVP, "buck4-under-voltage", 500,
254 "bd96801-buck4-undervolt"),
255 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck4-over-temp", 500,
256 "bd96801-buck4-thermal")
260 BD96801_IRQINFO(BD96801_PROT_OCP, "ldo5-overcurr", 500,
261 "bd96801-ldo5-overcurr"),
262 BD96801_IRQINFO(BD96801_PROT_OVP, "ldo5-over-voltage", 500,
263 "bd96801-ldo5-overvolt"),
264 BD96801_IRQINFO(BD96801_PROT_UVP, "ldo5-under-voltage", 500,
265 "bd96801-ldo5-undervolt"),
269 BD96801_IRQINFO(BD96801_PROT_OCP, "ldo6-overcurr", 500,
270 "bd96801-ldo6-overcurr"),
271 BD96801_IRQINFO(BD96801_PROT_OVP, "ldo6-over-voltage", 500,
272 "bd96801-ldo6-overvolt"),
273 BD96801_IRQINFO(BD96801_PROT_UVP, "ldo6-under-voltage", 500,
274 "bd96801-ldo6-undervolt"),
278 BD96801_IRQINFO(BD96801_PROT_OCP, "ldo7-overcurr", 500,
279 "bd96801-ldo7-overcurr"),
280 BD96801_IRQINFO(BD96801_PROT_OVP, "ldo7-over-voltage", 500,
281 "bd96801-ldo7-overvolt"),
282 BD96801_IRQINFO(BD96801_PROT_UVP, "ldo7-under-voltage", 500,
283 "bd96801-ldo7-undervolt"),
312 for (i = 0; i < rid->num_states; i++) {
316 rdev = rid->states[i].rdev;
317 rdata = container_of(rdev->desc, struct bd96801_regulator_data,
319 rid->states[i].notifs = regulator_err2notif(rdata->ldo_errs);
320 rid->states[i].errors = rdata->ldo_errs;
332 data = container_of(rdev->desc, struct bd96801_regulator_data, desc);
338 * register is voltage tuning value which applies -150 mV ... +150 mV
345 * As a result, we increase the tuning voltage which we get based on
352 return voltage + data->initial_voltage;
381 int reg = BD96801_INT_VOUT_BASE_REG + data->desc.id;
383 if (data->num_ranges) {
387 ret = linear_range_get_value_array(data->init_ranges,
388 data->num_ranges, sel,
393 data->initial_voltage = initial_uv;
394 dev_dbg(dev, "Tune-scaled initial voltage %u\n",
395 data->initial_voltage);
408 ret = regmap_read(regmap, data->ldo_vol_lvl, &cfgreg);
414 data->desc.volt_table = ldo_ddr_volt_table;
415 data->desc.n_voltages = ARRAY_SIZE(ldo_ddr_volt_table);
418 data->desc.volt_table = ldo_sd_volt_table;
419 data->desc.n_voltages = ARRAY_SIZE(ldo_sd_volt_table);
427 data->desc.ops = &bd96801_ldo_table_ops,
428 data->desc.vsel_mask = 1;
429 data->desc.vsel_reg = data->ldo_vol_lvl;
438 if (data->desc.id <= BD96801_BUCK4)
452 of_get_child_by_name(dev->parent->of_node, "regulators");
455 return -ENODEV;
462 * If STBY configs are supported, we must pass node
475 if (of_property_read_bool(np, "rohm,keep-on-stby")) {
481 "failed to set %s on-at-stby\n",
494 * struct so we should be on a safe side even if there were multiple PMICs to
497 * multi-PMIC case will be handled. I don't know if the processor will have I2C
499 * access provided to all PMICs for voltage scaling - but the errors will only
501 * driver instances - either with or without the IRQs... Well, let's first
502 * just support the simple and clear single-PMIC setup and ponder the multi PMIC
708 template = pdata->regulator_data[r].irq_desc.irqinfo;
709 num_infos = pdata->regulator_data[r].irq_desc.num_irqs;
713 return -ENOMEM;
715 pdata->regulator_data[r].irq_desc.irqinfo = new;
729 for (i = 0; i < rid->num_states; i++) {
730 rid->states[i].notifs = REGULATOR_EVENT_FAIL;
731 rid->states[i].errors = REGULATOR_ERROR_FAIL;
744 "bd96801-%s-pvin-err", "bd96801-%s-ovp-err",
745 "bd96801-%s-uvp-err", "bd96801-%s-shdn-err",
757 snprintf(tmp, 255, single_out_errb_irqs[i], rdev->desc->name);
766 retp = devm_regulator_irq_helper(&pdev->dev, &id, irq, 0,
782 "bd96801-otp-err", "bd96801-dbist-err", "bd96801-eep-err",
783 "bd96801-abist-err", "bd96801-prstb-err", "bd96801-drmoserr1",
784 "bd96801-drmoserr2", "bd96801-slave-err", "bd96801-vref-err",
785 "bd96801-tsd", "bd96801-uvlo-err", "bd96801-ovlo-err",
786 "bd96801-osc-err", "bd96801-pon-err", "bd96801-poff-err",
787 "bd96801-cmd-shdn-err", "bd96801-int-shdn-err"
803 retp = devm_regulator_irq_helper(&pdev->dev, &id, irq, 0,
840 if (!iinfo->err_cfg && !iinfo->wrn_cfg)
843 if (WARN_ON(iinfo->type >= BD96801_NUM_PROT))
844 return -EINVAL;
846 if (iinfo->err_cfg)
847 err = err_flags[iinfo->type];
848 else if (iinfo->wrn_cfg)
849 err = wrn_flags[iinfo->type];
851 iinfo->irq_desc.data = pdata;
852 irq = platform_get_irq_byname(pdev, iinfo->irq_name);
858 retp = devm_regulator_irq_helper(&pdev->dev,
859 &iinfo->irq_desc, irq,
882 parent = pdev->dev.parent;
884 pdata = devm_kmemdup(&pdev->dev, &bd96801_data, sizeof(bd96801_data),
887 return -ENOMEM;
889 if (initialize_pmic_data(&pdev->dev, pdata))
890 return -ENOMEM;
892 pdata->regmap = dev_get_regmap(parent, NULL);
893 if (!pdata->regmap) {
894 dev_err(&pdev->dev, "No register map found\n");
895 return -ENODEV;
898 rdesc = &pdata->regulator_data[0];
901 config.regmap = pdata->regmap;
904 ret = of_property_match_string(pdev->dev.parent->of_node,
905 "interrupt-names", "errb");
911 ret = bd96801_walk_regulator_dt(&pdev->dev, pdata->regmap, rdesc,
916 for (i = 0; i < ARRAY_SIZE(pdata->regulator_data); i++) {
921 rdev = devm_regulator_register(&pdev->dev,
924 dev_err(&pdev->dev,
943 for (j = 0; j < idesc->num_irqs; j++) {
945 &idesc->irqinfo[j], rdev);
959 .name = "bd96801-core-thermal",
964 irq = platform_get_irq_byname(pdev, "bd96801-core-thermal");
968 retp = devm_regulator_irq_helper(&pdev->dev, &tw_desc, irq, 0,
984 { "bd96801-regulator", },
991 .name = "bd96801-pmic"