1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (C) 2024 ROHM Semiconductors 3 // bd96801-regulator.c ROHM BD96801 regulator driver 4 5 /* 6 * This version of the "BD86801 scalable PMIC"'s driver supports only very 7 * basic set of the PMIC features. Most notably, there is no support for 8 * the configurations which should be done when the PMIC is in STBY mode. 9 * 10 * Being able to reliably do the configurations like changing the 11 * regulator safety limits (like limits for the over/under -voltages, over 12 * current, thermal protection) would require the configuring driver to be 13 * synchronized with entity causing the PMIC state transitions. Eg, one 14 * should be able to ensure the PMIC is in STBY state when the 15 * configurations are applied to the hardware. How and when the PMIC state 16 * transitions are to be done is likely to be very system specific, as will 17 * be the need to configure these safety limits. Hence it's not simple to 18 * come up with a generic solution. 19 * 20 * Users who require the STBY state configurations can have a look at the 21 * original RFC: 22 * https://lore.kernel.org/all/cover.1712920132.git.mazziesaccount@gmail.com/ 23 * which implements some of the safety limit configurations - but leaves the 24 * state change handling and synchronization to be implemented. 25 * 26 * It would be great to hear (and receive a patch!) if you implement the 27 * STBY configuration support in your downstream driver ;) 28 */ 29 30 #include <linux/cleanup.h> 31 #include <linux/delay.h> 32 #include <linux/err.h> 33 #include <linux/interrupt.h> 34 #include <linux/kernel.h> 35 #include <linux/linear_range.h> 36 #include <linux/mfd/rohm-generic.h> 37 #include <linux/mfd/rohm-bd96801.h> 38 #include <linux/module.h> 39 #include <linux/of.h> 40 #include <linux/platform_device.h> 41 #include <linux/regmap.h> 42 #include <linux/regulator/coupler.h> 43 #include <linux/regulator/driver.h> 44 #include <linux/regulator/machine.h> 45 #include <linux/regulator/of_regulator.h> 46 #include <linux/slab.h> 47 #include <linux/timer.h> 48 49 enum { 50 BD96801_BUCK1, 51 BD96801_BUCK2, 52 BD96801_BUCK3, 53 BD96801_BUCK4, 54 BD96801_LDO5, 55 BD96801_LDO6, 56 BD96801_LDO7, 57 BD96801_REGULATOR_AMOUNT, 58 }; 59 60 enum { 61 BD96801_PROT_OVP, 62 BD96801_PROT_UVP, 63 BD96801_PROT_OCP, 64 BD96801_PROT_TEMP, 65 BD96801_NUM_PROT, 66 }; 67 68 #define BD96801_ALWAYS_ON_REG 0x3c 69 #define BD96801_REG_ENABLE 0x0b 70 #define BD96801_BUCK1_EN_MASK BIT(0) 71 #define BD96801_BUCK2_EN_MASK BIT(1) 72 #define BD96801_BUCK3_EN_MASK BIT(2) 73 #define BD96801_BUCK4_EN_MASK BIT(3) 74 #define BD96801_LDO5_EN_MASK BIT(4) 75 #define BD96801_LDO6_EN_MASK BIT(5) 76 #define BD96801_LDO7_EN_MASK BIT(6) 77 78 #define BD96801_BUCK1_VSEL_REG 0x28 79 #define BD96801_BUCK2_VSEL_REG 0x29 80 #define BD96801_BUCK3_VSEL_REG 0x2a 81 #define BD96801_BUCK4_VSEL_REG 0x2b 82 #define BD96801_LDO5_VSEL_REG 0x25 83 #define BD96801_LDO6_VSEL_REG 0x26 84 #define BD96801_LDO7_VSEL_REG 0x27 85 #define BD96801_BUCK_VSEL_MASK 0x1F 86 #define BD96805_BUCK_VSEL_MASK 0x3f 87 #define BD96801_LDO_VSEL_MASK 0xff 88 89 #define BD96801_MASK_RAMP_DELAY 0xc0 90 #define BD96801_INT_VOUT_BASE_REG 0x21 91 #define BD96801_BUCK_INT_VOUT_MASK 0xff 92 93 #define BD96801_BUCK_VOLTS 256 94 #define BD96805_BUCK_VOLTS 64 95 #define BD96801_LDO_VOLTS 256 96 97 #define BD96801_OVP_MASK 0x03 98 #define BD96801_MASK_BUCK1_OVP_SHIFT 0x00 99 #define BD96801_MASK_BUCK2_OVP_SHIFT 0x02 100 #define BD96801_MASK_BUCK3_OVP_SHIFT 0x04 101 #define BD96801_MASK_BUCK4_OVP_SHIFT 0x06 102 #define BD96801_MASK_LDO5_OVP_SHIFT 0x00 103 #define BD96801_MASK_LDO6_OVP_SHIFT 0x02 104 #define BD96801_MASK_LDO7_OVP_SHIFT 0x04 105 106 #define BD96801_PROT_LIMIT_OCP_MIN 0x00 107 #define BD96801_PROT_LIMIT_LOW 0x01 108 #define BD96801_PROT_LIMIT_MID 0x02 109 #define BD96801_PROT_LIMIT_HI 0x03 110 111 #define BD96801_REG_BUCK1_OCP 0x32 112 #define BD96801_REG_BUCK2_OCP 0x32 113 #define BD96801_REG_BUCK3_OCP 0x33 114 #define BD96801_REG_BUCK4_OCP 0x33 115 116 #define BD96801_MASK_BUCK1_OCP_SHIFT 0x00 117 #define BD96801_MASK_BUCK2_OCP_SHIFT 0x04 118 #define BD96801_MASK_BUCK3_OCP_SHIFT 0x00 119 #define BD96801_MASK_BUCK4_OCP_SHIFT 0x04 120 121 #define BD96801_REG_LDO5_OCP 0x34 122 #define BD96801_REG_LDO6_OCP 0x34 123 #define BD96801_REG_LDO7_OCP 0x34 124 125 #define BD96801_MASK_LDO5_OCP_SHIFT 0x00 126 #define BD96801_MASK_LDO6_OCP_SHIFT 0x02 127 #define BD96801_MASK_LDO7_OCP_SHIFT 0x04 128 129 #define BD96801_MASK_SHD_INTB BIT(7) 130 #define BD96801_INTB_FATAL BIT(7) 131 132 #define BD96801_NUM_REGULATORS 7 133 #define BD96801_NUM_LDOS 4 134 135 /* 136 * Ramp rates for bucks are controlled by bits [7:6] as follows: 137 * 00 => 1 mV/uS 138 * 01 => 5 mV/uS 139 * 10 => 10 mV/uS 140 * 11 => 20 mV/uS 141 */ 142 static const unsigned int buck_ramp_table[] = { 1000, 5000, 10000, 20000 }; 143 144 /* 145 * This is a voltage range that get's appended to selected 146 * bd96801_buck_init_volts value. The range from 0x0 to 0xF is actually 147 * bd96801_buck_init_volts + 0 ... bd96801_buck_init_volts + 150mV 148 * and the range from 0x10 to 0x1f is bd96801_buck_init_volts - 150mV ... 149 * bd96801_buck_init_volts - 0. But as the members of linear_range 150 * are all unsigned I will apply offset of -150 mV to value in 151 * linear_range - which should increase these ranges with 152 * 150 mV getting all the values to >= 0. 153 */ 154 static const struct linear_range bd96801_tune_volts[] = { 155 REGULATOR_LINEAR_RANGE(150000, 0x00, 0xF, 10000), 156 REGULATOR_LINEAR_RANGE(0, 0x10, 0x1F, 10000), 157 }; 158 159 static const struct linear_range bd96801_buck_init_volts[] = { 160 REGULATOR_LINEAR_RANGE(500000 - 150000, 0x00, 0xc8, 5000), 161 REGULATOR_LINEAR_RANGE(1550000 - 150000, 0xc9, 0xec, 50000), 162 REGULATOR_LINEAR_RANGE(3300000 - 150000, 0xed, 0xff, 0), 163 }; 164 165 /* BD96802 uses same voltage ranges for bucks as BD96801 */ 166 #define bd96802_tune_volts bd96801_tune_volts 167 #define bd96802_buck_init_volts bd96801_buck_init_volts 168 169 /* 170 * On BD96805 we have similar "negative tuning range" as on BD96801, except 171 * that the max tuning is -310 ... +310 mV (instead of the 150mV). We use same 172 * approach as with the BD96801 ranges. 173 */ 174 static const struct linear_range bd96805_tune_volts[] = { 175 REGULATOR_LINEAR_RANGE(310000, 0x00, 0x1F, 10000), 176 REGULATOR_LINEAR_RANGE(0, 0x20, 0x3F, 10000), 177 }; 178 179 static const struct linear_range bd96805_buck_init_volts[] = { 180 REGULATOR_LINEAR_RANGE(500000 - 310000, 0x00, 0xc8, 5000), 181 REGULATOR_LINEAR_RANGE(1550000 - 310000, 0xc9, 0xec, 50000), 182 REGULATOR_LINEAR_RANGE(3300000 - 310000, 0xed, 0xff, 0), 183 }; 184 185 /* BD96806 uses same voltage ranges for bucks as BD96805 */ 186 #define bd96806_tune_volts bd96805_tune_volts 187 #define bd96806_buck_init_volts bd96805_buck_init_volts 188 189 static const struct linear_range bd96801_ldo_int_volts[] = { 190 REGULATOR_LINEAR_RANGE(300000, 0x00, 0x78, 25000), 191 REGULATOR_LINEAR_RANGE(3300000, 0x79, 0xff, 0), 192 }; 193 194 #define BD96801_LDO_SD_VOLT_MASK 0x1 195 #define BD96801_LDO_MODE_MASK 0x6 196 #define BD96801_LDO_MODE_INT 0x0 197 #define BD96801_LDO_MODE_SD 0x2 198 #define BD96801_LDO_MODE_DDR 0x4 199 200 static int ldo_ddr_volt_table[] = {500000, 300000}; 201 static int ldo_sd_volt_table[] = {3300000, 1800000}; 202 203 /* Constant IRQ initialization data (templates) */ 204 struct bd96801_irqinfo { 205 int type; 206 struct regulator_irq_desc irq_desc; 207 int err_cfg; 208 int wrn_cfg; 209 const char *irq_name; 210 }; 211 212 #define BD96801_IRQINFO(_type, _name, _irqoff_ms, _irqname) \ 213 { \ 214 .type = (_type), \ 215 .err_cfg = -1, \ 216 .wrn_cfg = -1, \ 217 .irq_name = (_irqname), \ 218 .irq_desc = { \ 219 .name = (_name), \ 220 .irq_off_ms = (_irqoff_ms), \ 221 .map_event = regulator_irq_map_event_simple, \ 222 }, \ 223 } 224 225 static const struct bd96801_irqinfo buck1_irqinfo[] = { 226 BD96801_IRQINFO(BD96801_PROT_OCP, "buck1-over-curr-h", 500, 227 "buck1-overcurr-h"), 228 BD96801_IRQINFO(BD96801_PROT_OCP, "buck1-over-curr-l", 500, 229 "buck1-overcurr-l"), 230 BD96801_IRQINFO(BD96801_PROT_OCP, "buck1-over-curr-n", 500, 231 "buck1-overcurr-n"), 232 BD96801_IRQINFO(BD96801_PROT_OVP, "buck1-over-voltage", 500, 233 "buck1-overvolt"), 234 BD96801_IRQINFO(BD96801_PROT_UVP, "buck1-under-voltage", 500, 235 "buck1-undervolt"), 236 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck1-over-temp", 500, 237 "buck1-thermal") 238 }; 239 240 static const struct bd96801_irqinfo buck2_irqinfo[] = { 241 BD96801_IRQINFO(BD96801_PROT_OCP, "buck2-over-curr-h", 500, 242 "buck2-overcurr-h"), 243 BD96801_IRQINFO(BD96801_PROT_OCP, "buck2-over-curr-l", 500, 244 "buck2-overcurr-l"), 245 BD96801_IRQINFO(BD96801_PROT_OCP, "buck2-over-curr-n", 500, 246 "buck2-overcurr-n"), 247 BD96801_IRQINFO(BD96801_PROT_OVP, "buck2-over-voltage", 500, 248 "buck2-overvolt"), 249 BD96801_IRQINFO(BD96801_PROT_UVP, "buck2-under-voltage", 500, 250 "buck2-undervolt"), 251 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck2-over-temp", 500, 252 "buck2-thermal") 253 }; 254 255 static const struct bd96801_irqinfo buck3_irqinfo[] = { 256 BD96801_IRQINFO(BD96801_PROT_OCP, "buck3-over-curr-h", 500, 257 "buck3-overcurr-h"), 258 BD96801_IRQINFO(BD96801_PROT_OCP, "buck3-over-curr-l", 500, 259 "buck3-overcurr-l"), 260 BD96801_IRQINFO(BD96801_PROT_OCP, "buck3-over-curr-n", 500, 261 "buck3-overcurr-n"), 262 BD96801_IRQINFO(BD96801_PROT_OVP, "buck3-over-voltage", 500, 263 "buck3-overvolt"), 264 BD96801_IRQINFO(BD96801_PROT_UVP, "buck3-under-voltage", 500, 265 "buck3-undervolt"), 266 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck3-over-temp", 500, 267 "buck3-thermal") 268 }; 269 270 static const struct bd96801_irqinfo buck4_irqinfo[] = { 271 BD96801_IRQINFO(BD96801_PROT_OCP, "buck4-over-curr-h", 500, 272 "buck4-overcurr-h"), 273 BD96801_IRQINFO(BD96801_PROT_OCP, "buck4-over-curr-l", 500, 274 "buck4-overcurr-l"), 275 BD96801_IRQINFO(BD96801_PROT_OCP, "buck4-over-curr-n", 500, 276 "buck4-overcurr-n"), 277 BD96801_IRQINFO(BD96801_PROT_OVP, "buck4-over-voltage", 500, 278 "buck4-overvolt"), 279 BD96801_IRQINFO(BD96801_PROT_UVP, "buck4-under-voltage", 500, 280 "buck4-undervolt"), 281 BD96801_IRQINFO(BD96801_PROT_TEMP, "buck4-over-temp", 500, 282 "buck4-thermal") 283 }; 284 285 static const struct bd96801_irqinfo ldo5_irqinfo[] = { 286 BD96801_IRQINFO(BD96801_PROT_OCP, "ldo5-overcurr", 500, 287 "ldo5-overcurr"), 288 BD96801_IRQINFO(BD96801_PROT_OVP, "ldo5-over-voltage", 500, 289 "ldo5-overvolt"), 290 BD96801_IRQINFO(BD96801_PROT_UVP, "ldo5-under-voltage", 500, 291 "ldo5-undervolt"), 292 }; 293 294 static const struct bd96801_irqinfo ldo6_irqinfo[] = { 295 BD96801_IRQINFO(BD96801_PROT_OCP, "ldo6-overcurr", 500, 296 "ldo6-overcurr"), 297 BD96801_IRQINFO(BD96801_PROT_OVP, "ldo6-over-voltage", 500, 298 "ldo6-overvolt"), 299 BD96801_IRQINFO(BD96801_PROT_UVP, "ldo6-under-voltage", 500, 300 "ldo6-undervolt"), 301 }; 302 303 static const struct bd96801_irqinfo ldo7_irqinfo[] = { 304 BD96801_IRQINFO(BD96801_PROT_OCP, "ldo7-overcurr", 500, 305 "ldo7-overcurr"), 306 BD96801_IRQINFO(BD96801_PROT_OVP, "ldo7-over-voltage", 500, 307 "ldo7-overvolt"), 308 BD96801_IRQINFO(BD96801_PROT_UVP, "ldo7-under-voltage", 500, 309 "ldo7-undervolt"), 310 }; 311 312 struct bd96801_irq_desc { 313 struct bd96801_irqinfo *irqinfo; 314 int num_irqs; 315 }; 316 317 struct bd96801_regulator_data { 318 struct regulator_desc desc; 319 const struct linear_range *init_ranges; 320 int num_ranges; 321 struct bd96801_irq_desc irq_desc; 322 int initial_voltage; 323 int ldo_vol_lvl; 324 int ldo_errs; 325 }; 326 327 struct bd96801_pmic_data { 328 struct bd96801_regulator_data regulator_data[BD96801_NUM_REGULATORS]; 329 struct regmap *regmap; 330 int fatal_ind; 331 int num_regulators; 332 }; 333 334 static int ldo_map_notif(int irq, struct regulator_irq_data *rid, 335 unsigned long *dev_mask) 336 { 337 int i; 338 339 for (i = 0; i < rid->num_states; i++) { 340 struct bd96801_regulator_data *rdata; 341 struct regulator_dev *rdev; 342 343 rdev = rid->states[i].rdev; 344 rdata = container_of(rdev->desc, struct bd96801_regulator_data, 345 desc); 346 rid->states[i].notifs = regulator_err2notif(rdata->ldo_errs); 347 rid->states[i].errors = rdata->ldo_errs; 348 *dev_mask |= BIT(i); 349 } 350 return 0; 351 } 352 353 static int bd96801_list_voltage_lr(struct regulator_dev *rdev, 354 unsigned int selector) 355 { 356 int voltage; 357 struct bd96801_regulator_data *data; 358 359 data = container_of(rdev->desc, struct bd96801_regulator_data, desc); 360 361 /* 362 * The BD096801 has voltage setting in two registers. One giving the 363 * "initial voltage" (can be changed only when regulator is disabled. 364 * This driver caches the value and sets it only at startup. The other 365 * register is voltage tuning value which applies -150 mV ... +150 mV 366 * offset to the voltage. 367 * 368 * Note that the cached initial voltage stored in regulator data is 369 * 'scaled down' by the 150 mV so that all of our tuning values are 370 * >= 0. This is done because the linear_ranges uses unsigned values. 371 * 372 * As a result, we increase the tuning voltage which we get based on 373 * the selector by the stored initial_voltage. 374 */ 375 voltage = regulator_list_voltage_linear_range(rdev, selector); 376 if (voltage < 0) 377 return voltage; 378 379 return voltage + data->initial_voltage; 380 } 381 382 383 static const struct regulator_ops bd96801_ldo_table_ops = { 384 .is_enabled = regulator_is_enabled_regmap, 385 .list_voltage = regulator_list_voltage_table, 386 .get_voltage_sel = regulator_get_voltage_sel_regmap, 387 }; 388 389 static const struct regulator_ops bd96801_buck_ops = { 390 .is_enabled = regulator_is_enabled_regmap, 391 .list_voltage = bd96801_list_voltage_lr, 392 .set_voltage_sel = regulator_set_voltage_sel_regmap, 393 .get_voltage_sel = regulator_get_voltage_sel_regmap, 394 .set_voltage_time_sel = regulator_set_voltage_time_sel, 395 .set_ramp_delay = regulator_set_ramp_delay_regmap, 396 }; 397 398 static const struct regulator_ops bd96801_ldo_ops = { 399 .is_enabled = regulator_is_enabled_regmap, 400 .list_voltage = regulator_list_voltage_linear_range, 401 .get_voltage_sel = regulator_get_voltage_sel_regmap, 402 }; 403 404 static int buck_get_initial_voltage(struct regmap *regmap, struct device *dev, 405 struct bd96801_regulator_data *data) 406 { 407 int ret = 0, sel, initial_uv; 408 int reg = BD96801_INT_VOUT_BASE_REG + data->desc.id; 409 410 if (data->num_ranges) { 411 ret = regmap_read(regmap, reg, &sel); 412 sel &= BD96801_BUCK_INT_VOUT_MASK; 413 414 ret = linear_range_get_value_array(data->init_ranges, 415 data->num_ranges, sel, 416 &initial_uv); 417 if (ret) 418 return ret; 419 420 data->initial_voltage = initial_uv; 421 dev_dbg(dev, "Tune-scaled initial voltage %u\n", 422 data->initial_voltage); 423 } 424 425 return 0; 426 } 427 428 static int get_ldo_initial_voltage(struct regmap *regmap, 429 struct device *dev, 430 struct bd96801_regulator_data *data) 431 { 432 int ret; 433 int cfgreg; 434 435 ret = regmap_read(regmap, data->ldo_vol_lvl, &cfgreg); 436 if (ret) 437 return ret; 438 439 switch (cfgreg & BD96801_LDO_MODE_MASK) { 440 case BD96801_LDO_MODE_DDR: 441 data->desc.volt_table = ldo_ddr_volt_table; 442 data->desc.n_voltages = ARRAY_SIZE(ldo_ddr_volt_table); 443 break; 444 case BD96801_LDO_MODE_SD: 445 data->desc.volt_table = ldo_sd_volt_table; 446 data->desc.n_voltages = ARRAY_SIZE(ldo_sd_volt_table); 447 break; 448 default: 449 dev_info(dev, "Leaving LDO to normal mode"); 450 return 0; 451 } 452 453 /* SD or DDR mode => override default ops */ 454 data->desc.ops = &bd96801_ldo_table_ops, 455 data->desc.vsel_mask = 1; 456 data->desc.vsel_reg = data->ldo_vol_lvl; 457 458 return 0; 459 } 460 461 static int get_initial_voltage(struct device *dev, struct regmap *regmap, 462 struct bd96801_regulator_data *data) 463 { 464 /* BUCK */ 465 if (data->desc.id <= BD96801_BUCK4) 466 return buck_get_initial_voltage(regmap, dev, data); 467 468 /* LDO */ 469 return get_ldo_initial_voltage(regmap, dev, data); 470 } 471 472 static int bd96801_walk_regulator_dt(struct device *dev, struct regmap *regmap, 473 struct bd96801_regulator_data *data, 474 int num) 475 { 476 int i, ret; 477 478 struct device_node *nproot __free(device_node) = 479 of_get_child_by_name(dev->parent->of_node, "regulators"); 480 if (!nproot) { 481 dev_err(dev, "failed to find regulators node\n"); 482 return -ENODEV; 483 } 484 for_each_child_of_node_scoped(nproot, np) { 485 for (i = 0; i < num; i++) { 486 if (!of_node_name_eq(np, data[i].desc.of_match)) 487 continue; 488 /* 489 * If STBY configs are supported, we must pass node 490 * here to extract the initial voltages from the DT. 491 * Thus we do the initial voltage getting in this 492 * loop. 493 */ 494 ret = get_initial_voltage(dev, regmap, &data[i]); 495 if (ret) { 496 dev_err(dev, 497 "Initializing voltages for %s failed\n", 498 data[i].desc.name); 499 return ret; 500 } 501 502 if (of_property_read_bool(np, "rohm,keep-on-stby")) { 503 ret = regmap_set_bits(regmap, 504 BD96801_ALWAYS_ON_REG, 505 1 << data[i].desc.id); 506 if (ret) { 507 dev_err(dev, 508 "failed to set %s on-at-stby\n", 509 data[i].desc.name); 510 return ret; 511 } 512 } 513 } 514 } 515 516 return 0; 517 } 518 519 /* 520 * Template for regulator data. Probe will allocate dynamic / driver instance 521 * struct so we should be on a safe side even if there were multiple PMICs to 522 * control. Note that there is a plan to allow multiple PMICs to be used so 523 * systems can scale better. I am however still slightly unsure how the 524 * multi-PMIC case will be handled. I don't know if the processor will have I2C 525 * acces to all of the PMICs or only the first one. I'd guess there will be 526 * access provided to all PMICs for voltage scaling - but the errors will only 527 * be informed via the master PMIC. Eg, we should prepare to support multiple 528 * driver instances - either with or without the IRQs... Well, let's first 529 * just support the simple and clear single-PMIC setup and ponder the multi PMIC 530 * case later. What we can easly do for preparing is to not use static global 531 * data for regulators though. 532 */ 533 static const struct bd96801_pmic_data bd96802_data = { 534 .regulator_data = { 535 { 536 .desc = { 537 .name = "buck1", 538 .of_match = of_match_ptr("buck1"), 539 .regulators_node = of_match_ptr("regulators"), 540 .id = BD96801_BUCK1, 541 .ops = &bd96801_buck_ops, 542 .type = REGULATOR_VOLTAGE, 543 .linear_ranges = bd96802_tune_volts, 544 .n_linear_ranges = ARRAY_SIZE(bd96802_tune_volts), 545 .n_voltages = BD96801_BUCK_VOLTS, 546 .enable_reg = BD96801_REG_ENABLE, 547 .enable_mask = BD96801_BUCK1_EN_MASK, 548 .enable_is_inverted = true, 549 .vsel_reg = BD96801_BUCK1_VSEL_REG, 550 .vsel_mask = BD96801_BUCK_VSEL_MASK, 551 .ramp_reg = BD96801_BUCK1_VSEL_REG, 552 .ramp_mask = BD96801_MASK_RAMP_DELAY, 553 .ramp_delay_table = &buck_ramp_table[0], 554 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 555 .owner = THIS_MODULE, 556 }, 557 .init_ranges = bd96802_buck_init_volts, 558 .num_ranges = ARRAY_SIZE(bd96802_buck_init_volts), 559 .irq_desc = { 560 .irqinfo = (struct bd96801_irqinfo *)&buck1_irqinfo[0], 561 .num_irqs = ARRAY_SIZE(buck1_irqinfo), 562 }, 563 }, 564 { 565 .desc = { 566 .name = "buck2", 567 .of_match = of_match_ptr("buck2"), 568 .regulators_node = of_match_ptr("regulators"), 569 .id = BD96801_BUCK2, 570 .ops = &bd96801_buck_ops, 571 .type = REGULATOR_VOLTAGE, 572 .linear_ranges = bd96802_tune_volts, 573 .n_linear_ranges = ARRAY_SIZE(bd96802_tune_volts), 574 .n_voltages = BD96801_BUCK_VOLTS, 575 .enable_reg = BD96801_REG_ENABLE, 576 .enable_mask = BD96801_BUCK2_EN_MASK, 577 .enable_is_inverted = true, 578 .vsel_reg = BD96801_BUCK2_VSEL_REG, 579 .vsel_mask = BD96801_BUCK_VSEL_MASK, 580 .ramp_reg = BD96801_BUCK2_VSEL_REG, 581 .ramp_mask = BD96801_MASK_RAMP_DELAY, 582 .ramp_delay_table = &buck_ramp_table[0], 583 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 584 .owner = THIS_MODULE, 585 }, 586 .irq_desc = { 587 .irqinfo = (struct bd96801_irqinfo *)&buck2_irqinfo[0], 588 .num_irqs = ARRAY_SIZE(buck2_irqinfo), 589 }, 590 .init_ranges = bd96802_buck_init_volts, 591 .num_ranges = ARRAY_SIZE(bd96802_buck_init_volts), 592 }, 593 }, 594 .num_regulators = 2, 595 }; 596 597 static const struct bd96801_pmic_data bd96801_data = { 598 .regulator_data = { 599 { 600 .desc = { 601 .name = "buck1", 602 .of_match = of_match_ptr("buck1"), 603 .regulators_node = of_match_ptr("regulators"), 604 .id = BD96801_BUCK1, 605 .ops = &bd96801_buck_ops, 606 .type = REGULATOR_VOLTAGE, 607 .linear_ranges = bd96801_tune_volts, 608 .n_linear_ranges = ARRAY_SIZE(bd96801_tune_volts), 609 .n_voltages = BD96801_BUCK_VOLTS, 610 .enable_reg = BD96801_REG_ENABLE, 611 .enable_mask = BD96801_BUCK1_EN_MASK, 612 .enable_is_inverted = true, 613 .vsel_reg = BD96801_BUCK1_VSEL_REG, 614 .vsel_mask = BD96801_BUCK_VSEL_MASK, 615 .ramp_reg = BD96801_BUCK1_VSEL_REG, 616 .ramp_mask = BD96801_MASK_RAMP_DELAY, 617 .ramp_delay_table = &buck_ramp_table[0], 618 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 619 .owner = THIS_MODULE, 620 }, 621 .init_ranges = bd96801_buck_init_volts, 622 .num_ranges = ARRAY_SIZE(bd96801_buck_init_volts), 623 .irq_desc = { 624 .irqinfo = (struct bd96801_irqinfo *)&buck1_irqinfo[0], 625 .num_irqs = ARRAY_SIZE(buck1_irqinfo), 626 }, 627 }, { 628 .desc = { 629 .name = "buck2", 630 .of_match = of_match_ptr("buck2"), 631 .regulators_node = of_match_ptr("regulators"), 632 .id = BD96801_BUCK2, 633 .ops = &bd96801_buck_ops, 634 .type = REGULATOR_VOLTAGE, 635 .linear_ranges = bd96801_tune_volts, 636 .n_linear_ranges = ARRAY_SIZE(bd96801_tune_volts), 637 .n_voltages = BD96801_BUCK_VOLTS, 638 .enable_reg = BD96801_REG_ENABLE, 639 .enable_mask = BD96801_BUCK2_EN_MASK, 640 .enable_is_inverted = true, 641 .vsel_reg = BD96801_BUCK2_VSEL_REG, 642 .vsel_mask = BD96801_BUCK_VSEL_MASK, 643 .ramp_reg = BD96801_BUCK2_VSEL_REG, 644 .ramp_mask = BD96801_MASK_RAMP_DELAY, 645 .ramp_delay_table = &buck_ramp_table[0], 646 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 647 .owner = THIS_MODULE, 648 }, 649 .irq_desc = { 650 .irqinfo = (struct bd96801_irqinfo *)&buck2_irqinfo[0], 651 .num_irqs = ARRAY_SIZE(buck2_irqinfo), 652 }, 653 .init_ranges = bd96801_buck_init_volts, 654 .num_ranges = ARRAY_SIZE(bd96801_buck_init_volts), 655 }, { 656 .desc = { 657 .name = "buck3", 658 .of_match = of_match_ptr("buck3"), 659 .regulators_node = of_match_ptr("regulators"), 660 .id = BD96801_BUCK3, 661 .ops = &bd96801_buck_ops, 662 .type = REGULATOR_VOLTAGE, 663 .linear_ranges = bd96801_tune_volts, 664 .n_linear_ranges = ARRAY_SIZE(bd96801_tune_volts), 665 .n_voltages = BD96801_BUCK_VOLTS, 666 .enable_reg = BD96801_REG_ENABLE, 667 .enable_mask = BD96801_BUCK3_EN_MASK, 668 .enable_is_inverted = true, 669 .vsel_reg = BD96801_BUCK3_VSEL_REG, 670 .vsel_mask = BD96801_BUCK_VSEL_MASK, 671 .ramp_reg = BD96801_BUCK3_VSEL_REG, 672 .ramp_mask = BD96801_MASK_RAMP_DELAY, 673 .ramp_delay_table = &buck_ramp_table[0], 674 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 675 .owner = THIS_MODULE, 676 }, 677 .irq_desc = { 678 .irqinfo = (struct bd96801_irqinfo *)&buck3_irqinfo[0], 679 .num_irqs = ARRAY_SIZE(buck3_irqinfo), 680 }, 681 .init_ranges = bd96801_buck_init_volts, 682 .num_ranges = ARRAY_SIZE(bd96801_buck_init_volts), 683 }, { 684 .desc = { 685 .name = "buck4", 686 .of_match = of_match_ptr("buck4"), 687 .regulators_node = of_match_ptr("regulators"), 688 .id = BD96801_BUCK4, 689 .ops = &bd96801_buck_ops, 690 .type = REGULATOR_VOLTAGE, 691 .linear_ranges = bd96801_tune_volts, 692 .n_linear_ranges = ARRAY_SIZE(bd96801_tune_volts), 693 .n_voltages = BD96801_BUCK_VOLTS, 694 .enable_reg = BD96801_REG_ENABLE, 695 .enable_mask = BD96801_BUCK4_EN_MASK, 696 .enable_is_inverted = true, 697 .vsel_reg = BD96801_BUCK4_VSEL_REG, 698 .vsel_mask = BD96801_BUCK_VSEL_MASK, 699 .ramp_reg = BD96801_BUCK4_VSEL_REG, 700 .ramp_mask = BD96801_MASK_RAMP_DELAY, 701 .ramp_delay_table = &buck_ramp_table[0], 702 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 703 .owner = THIS_MODULE, 704 }, 705 .irq_desc = { 706 .irqinfo = (struct bd96801_irqinfo *)&buck4_irqinfo[0], 707 .num_irqs = ARRAY_SIZE(buck4_irqinfo), 708 }, 709 .init_ranges = bd96801_buck_init_volts, 710 .num_ranges = ARRAY_SIZE(bd96801_buck_init_volts), 711 }, { 712 .desc = { 713 .name = "ldo5", 714 .of_match = of_match_ptr("ldo5"), 715 .regulators_node = of_match_ptr("regulators"), 716 .id = BD96801_LDO5, 717 .ops = &bd96801_ldo_ops, 718 .type = REGULATOR_VOLTAGE, 719 .linear_ranges = bd96801_ldo_int_volts, 720 .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts), 721 .n_voltages = BD96801_LDO_VOLTS, 722 .enable_reg = BD96801_REG_ENABLE, 723 .enable_mask = BD96801_LDO5_EN_MASK, 724 .enable_is_inverted = true, 725 .vsel_reg = BD96801_LDO5_VSEL_REG, 726 .vsel_mask = BD96801_LDO_VSEL_MASK, 727 .owner = THIS_MODULE, 728 }, 729 .irq_desc = { 730 .irqinfo = (struct bd96801_irqinfo *)&ldo5_irqinfo[0], 731 .num_irqs = ARRAY_SIZE(ldo5_irqinfo), 732 }, 733 .ldo_vol_lvl = BD96801_LDO5_VOL_LVL_REG, 734 }, { 735 .desc = { 736 .name = "ldo6", 737 .of_match = of_match_ptr("ldo6"), 738 .regulators_node = of_match_ptr("regulators"), 739 .id = BD96801_LDO6, 740 .ops = &bd96801_ldo_ops, 741 .type = REGULATOR_VOLTAGE, 742 .linear_ranges = bd96801_ldo_int_volts, 743 .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts), 744 .n_voltages = BD96801_LDO_VOLTS, 745 .enable_reg = BD96801_REG_ENABLE, 746 .enable_mask = BD96801_LDO6_EN_MASK, 747 .enable_is_inverted = true, 748 .vsel_reg = BD96801_LDO6_VSEL_REG, 749 .vsel_mask = BD96801_LDO_VSEL_MASK, 750 .owner = THIS_MODULE, 751 }, 752 .irq_desc = { 753 .irqinfo = (struct bd96801_irqinfo *)&ldo6_irqinfo[0], 754 .num_irqs = ARRAY_SIZE(ldo6_irqinfo), 755 }, 756 .ldo_vol_lvl = BD96801_LDO6_VOL_LVL_REG, 757 }, { 758 .desc = { 759 .name = "ldo7", 760 .of_match = of_match_ptr("ldo7"), 761 .regulators_node = of_match_ptr("regulators"), 762 .id = BD96801_LDO7, 763 .ops = &bd96801_ldo_ops, 764 .type = REGULATOR_VOLTAGE, 765 .linear_ranges = bd96801_ldo_int_volts, 766 .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts), 767 .n_voltages = BD96801_LDO_VOLTS, 768 .enable_reg = BD96801_REG_ENABLE, 769 .enable_mask = BD96801_LDO7_EN_MASK, 770 .enable_is_inverted = true, 771 .vsel_reg = BD96801_LDO7_VSEL_REG, 772 .vsel_mask = BD96801_LDO_VSEL_MASK, 773 .owner = THIS_MODULE, 774 }, 775 .irq_desc = { 776 .irqinfo = (struct bd96801_irqinfo *)&ldo7_irqinfo[0], 777 .num_irqs = ARRAY_SIZE(ldo7_irqinfo), 778 }, 779 .ldo_vol_lvl = BD96801_LDO7_VOL_LVL_REG, 780 }, 781 }, 782 .num_regulators = 7, 783 }; 784 785 static const struct bd96801_pmic_data bd96805_data = { 786 .regulator_data = { 787 { 788 .desc = { 789 .name = "buck1", 790 .of_match = of_match_ptr("buck1"), 791 .regulators_node = of_match_ptr("regulators"), 792 .id = BD96801_BUCK1, 793 .ops = &bd96801_buck_ops, 794 .type = REGULATOR_VOLTAGE, 795 .linear_ranges = bd96805_tune_volts, 796 .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts), 797 .n_voltages = BD96805_BUCK_VOLTS, 798 .enable_reg = BD96801_REG_ENABLE, 799 .enable_mask = BD96801_BUCK1_EN_MASK, 800 .enable_is_inverted = true, 801 .vsel_reg = BD96801_BUCK1_VSEL_REG, 802 .vsel_mask = BD96805_BUCK_VSEL_MASK, 803 .ramp_reg = BD96801_BUCK1_VSEL_REG, 804 .ramp_mask = BD96801_MASK_RAMP_DELAY, 805 .ramp_delay_table = &buck_ramp_table[0], 806 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 807 .owner = THIS_MODULE, 808 }, 809 .init_ranges = bd96805_buck_init_volts, 810 .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts), 811 .irq_desc = { 812 .irqinfo = (struct bd96801_irqinfo *)&buck1_irqinfo[0], 813 .num_irqs = ARRAY_SIZE(buck1_irqinfo), 814 }, 815 }, { 816 .desc = { 817 .name = "buck2", 818 .of_match = of_match_ptr("buck2"), 819 .regulators_node = of_match_ptr("regulators"), 820 .id = BD96801_BUCK2, 821 .ops = &bd96801_buck_ops, 822 .type = REGULATOR_VOLTAGE, 823 .linear_ranges = bd96805_tune_volts, 824 .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts), 825 .n_voltages = BD96805_BUCK_VOLTS, 826 .enable_reg = BD96801_REG_ENABLE, 827 .enable_mask = BD96801_BUCK2_EN_MASK, 828 .enable_is_inverted = true, 829 .vsel_reg = BD96801_BUCK2_VSEL_REG, 830 .vsel_mask = BD96805_BUCK_VSEL_MASK, 831 .ramp_reg = BD96801_BUCK2_VSEL_REG, 832 .ramp_mask = BD96801_MASK_RAMP_DELAY, 833 .ramp_delay_table = &buck_ramp_table[0], 834 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 835 .owner = THIS_MODULE, 836 }, 837 .irq_desc = { 838 .irqinfo = (struct bd96801_irqinfo *)&buck2_irqinfo[0], 839 .num_irqs = ARRAY_SIZE(buck2_irqinfo), 840 }, 841 .init_ranges = bd96805_buck_init_volts, 842 .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts), 843 }, { 844 .desc = { 845 .name = "buck3", 846 .of_match = of_match_ptr("buck3"), 847 .regulators_node = of_match_ptr("regulators"), 848 .id = BD96801_BUCK3, 849 .ops = &bd96801_buck_ops, 850 .type = REGULATOR_VOLTAGE, 851 .linear_ranges = bd96805_tune_volts, 852 .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts), 853 .n_voltages = BD96805_BUCK_VOLTS, 854 .enable_reg = BD96801_REG_ENABLE, 855 .enable_mask = BD96801_BUCK3_EN_MASK, 856 .enable_is_inverted = true, 857 .vsel_reg = BD96801_BUCK3_VSEL_REG, 858 .vsel_mask = BD96805_BUCK_VSEL_MASK, 859 .ramp_reg = BD96801_BUCK3_VSEL_REG, 860 .ramp_mask = BD96801_MASK_RAMP_DELAY, 861 .ramp_delay_table = &buck_ramp_table[0], 862 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 863 .owner = THIS_MODULE, 864 }, 865 .irq_desc = { 866 .irqinfo = (struct bd96801_irqinfo *)&buck3_irqinfo[0], 867 .num_irqs = ARRAY_SIZE(buck3_irqinfo), 868 }, 869 .init_ranges = bd96805_buck_init_volts, 870 .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts), 871 }, { 872 .desc = { 873 .name = "buck4", 874 .of_match = of_match_ptr("buck4"), 875 .regulators_node = of_match_ptr("regulators"), 876 .id = BD96801_BUCK4, 877 .ops = &bd96801_buck_ops, 878 .type = REGULATOR_VOLTAGE, 879 .linear_ranges = bd96805_tune_volts, 880 .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts), 881 .n_voltages = BD96805_BUCK_VOLTS, 882 .enable_reg = BD96801_REG_ENABLE, 883 .enable_mask = BD96801_BUCK4_EN_MASK, 884 .enable_is_inverted = true, 885 .vsel_reg = BD96801_BUCK4_VSEL_REG, 886 .vsel_mask = BD96805_BUCK_VSEL_MASK, 887 .ramp_reg = BD96801_BUCK4_VSEL_REG, 888 .ramp_mask = BD96801_MASK_RAMP_DELAY, 889 .ramp_delay_table = &buck_ramp_table[0], 890 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 891 .owner = THIS_MODULE, 892 }, 893 .irq_desc = { 894 .irqinfo = (struct bd96801_irqinfo *)&buck4_irqinfo[0], 895 .num_irqs = ARRAY_SIZE(buck4_irqinfo), 896 }, 897 .init_ranges = bd96805_buck_init_volts, 898 .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts), 899 }, { 900 .desc = { 901 .name = "ldo5", 902 .of_match = of_match_ptr("ldo5"), 903 .regulators_node = of_match_ptr("regulators"), 904 .id = BD96801_LDO5, 905 .ops = &bd96801_ldo_ops, 906 .type = REGULATOR_VOLTAGE, 907 .linear_ranges = bd96801_ldo_int_volts, 908 .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts), 909 .n_voltages = BD96801_LDO_VOLTS, 910 .enable_reg = BD96801_REG_ENABLE, 911 .enable_mask = BD96801_LDO5_EN_MASK, 912 .enable_is_inverted = true, 913 .vsel_reg = BD96801_LDO5_VSEL_REG, 914 .vsel_mask = BD96801_LDO_VSEL_MASK, 915 .owner = THIS_MODULE, 916 }, 917 .irq_desc = { 918 .irqinfo = (struct bd96801_irqinfo *)&ldo5_irqinfo[0], 919 .num_irqs = ARRAY_SIZE(ldo5_irqinfo), 920 }, 921 .ldo_vol_lvl = BD96801_LDO5_VOL_LVL_REG, 922 }, { 923 .desc = { 924 .name = "ldo6", 925 .of_match = of_match_ptr("ldo6"), 926 .regulators_node = of_match_ptr("regulators"), 927 .id = BD96801_LDO6, 928 .ops = &bd96801_ldo_ops, 929 .type = REGULATOR_VOLTAGE, 930 .linear_ranges = bd96801_ldo_int_volts, 931 .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts), 932 .n_voltages = BD96801_LDO_VOLTS, 933 .enable_reg = BD96801_REG_ENABLE, 934 .enable_mask = BD96801_LDO6_EN_MASK, 935 .enable_is_inverted = true, 936 .vsel_reg = BD96801_LDO6_VSEL_REG, 937 .vsel_mask = BD96801_LDO_VSEL_MASK, 938 .owner = THIS_MODULE, 939 }, 940 .irq_desc = { 941 .irqinfo = (struct bd96801_irqinfo *)&ldo6_irqinfo[0], 942 .num_irqs = ARRAY_SIZE(ldo6_irqinfo), 943 }, 944 .ldo_vol_lvl = BD96801_LDO6_VOL_LVL_REG, 945 }, { 946 .desc = { 947 .name = "ldo7", 948 .of_match = of_match_ptr("ldo7"), 949 .regulators_node = of_match_ptr("regulators"), 950 .id = BD96801_LDO7, 951 .ops = &bd96801_ldo_ops, 952 .type = REGULATOR_VOLTAGE, 953 .linear_ranges = bd96801_ldo_int_volts, 954 .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts), 955 .n_voltages = BD96801_LDO_VOLTS, 956 .enable_reg = BD96801_REG_ENABLE, 957 .enable_mask = BD96801_LDO7_EN_MASK, 958 .enable_is_inverted = true, 959 .vsel_reg = BD96801_LDO7_VSEL_REG, 960 .vsel_mask = BD96801_LDO_VSEL_MASK, 961 .owner = THIS_MODULE, 962 }, 963 .irq_desc = { 964 .irqinfo = (struct bd96801_irqinfo *)&ldo7_irqinfo[0], 965 .num_irqs = ARRAY_SIZE(ldo7_irqinfo), 966 }, 967 .ldo_vol_lvl = BD96801_LDO7_VOL_LVL_REG, 968 }, 969 }, 970 .num_regulators = 7, 971 }; 972 973 static const struct bd96801_pmic_data bd96806_data = { 974 .regulator_data = { 975 { 976 .desc = { 977 .name = "buck1", 978 .of_match = of_match_ptr("buck1"), 979 .regulators_node = of_match_ptr("regulators"), 980 .id = BD96801_BUCK1, 981 .ops = &bd96801_buck_ops, 982 .type = REGULATOR_VOLTAGE, 983 .linear_ranges = bd96806_tune_volts, 984 .n_linear_ranges = ARRAY_SIZE(bd96806_tune_volts), 985 .n_voltages = BD96805_BUCK_VOLTS, 986 .enable_reg = BD96801_REG_ENABLE, 987 .enable_mask = BD96801_BUCK1_EN_MASK, 988 .enable_is_inverted = true, 989 .vsel_reg = BD96801_BUCK1_VSEL_REG, 990 .vsel_mask = BD96805_BUCK_VSEL_MASK, 991 .ramp_reg = BD96801_BUCK1_VSEL_REG, 992 .ramp_mask = BD96801_MASK_RAMP_DELAY, 993 .ramp_delay_table = &buck_ramp_table[0], 994 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 995 .owner = THIS_MODULE, 996 }, 997 .init_ranges = bd96806_buck_init_volts, 998 .num_ranges = ARRAY_SIZE(bd96806_buck_init_volts), 999 .irq_desc = { 1000 .irqinfo = (struct bd96801_irqinfo *)&buck1_irqinfo[0], 1001 .num_irqs = ARRAY_SIZE(buck1_irqinfo), 1002 }, 1003 }, 1004 { 1005 .desc = { 1006 .name = "buck2", 1007 .of_match = of_match_ptr("buck2"), 1008 .regulators_node = of_match_ptr("regulators"), 1009 .id = BD96801_BUCK2, 1010 .ops = &bd96801_buck_ops, 1011 .type = REGULATOR_VOLTAGE, 1012 .linear_ranges = bd96806_tune_volts, 1013 .n_linear_ranges = ARRAY_SIZE(bd96806_tune_volts), 1014 .n_voltages = BD96805_BUCK_VOLTS, 1015 .enable_reg = BD96801_REG_ENABLE, 1016 .enable_mask = BD96801_BUCK2_EN_MASK, 1017 .enable_is_inverted = true, 1018 .vsel_reg = BD96801_BUCK2_VSEL_REG, 1019 .vsel_mask = BD96805_BUCK_VSEL_MASK, 1020 .ramp_reg = BD96801_BUCK2_VSEL_REG, 1021 .ramp_mask = BD96801_MASK_RAMP_DELAY, 1022 .ramp_delay_table = &buck_ramp_table[0], 1023 .n_ramp_values = ARRAY_SIZE(buck_ramp_table), 1024 .owner = THIS_MODULE, 1025 }, 1026 .irq_desc = { 1027 .irqinfo = (struct bd96801_irqinfo *)&buck2_irqinfo[0], 1028 .num_irqs = ARRAY_SIZE(buck2_irqinfo), 1029 }, 1030 .init_ranges = bd96806_buck_init_volts, 1031 .num_ranges = ARRAY_SIZE(bd96806_buck_init_volts), 1032 }, 1033 }, 1034 .num_regulators = 2, 1035 }; 1036 1037 static int initialize_pmic_data(struct platform_device *pdev, 1038 struct bd96801_pmic_data *pdata) 1039 { 1040 struct device *dev = &pdev->dev; 1041 int r, i; 1042 1043 /* 1044 * Allocate and initialize IRQ data for all of the regulators. We 1045 * wish to modify IRQ information independently for each driver 1046 * instance. 1047 */ 1048 for (r = 0; r < pdata->num_regulators; r++) { 1049 const struct bd96801_irqinfo *template; 1050 struct bd96801_irqinfo *new; 1051 int num_infos; 1052 1053 template = pdata->regulator_data[r].irq_desc.irqinfo; 1054 num_infos = pdata->regulator_data[r].irq_desc.num_irqs; 1055 1056 new = devm_kcalloc(dev, num_infos, sizeof(*new), GFP_KERNEL); 1057 if (!new) 1058 return -ENOMEM; 1059 1060 pdata->regulator_data[r].irq_desc.irqinfo = new; 1061 1062 for (i = 0; i < num_infos; i++) 1063 new[i] = template[i]; 1064 } 1065 1066 return 0; 1067 } 1068 1069 static int bd96801_map_event_all(int irq, struct regulator_irq_data *rid, 1070 unsigned long *dev_mask) 1071 { 1072 int i; 1073 1074 for (i = 0; i < rid->num_states; i++) { 1075 rid->states[i].notifs = REGULATOR_EVENT_FAIL; 1076 rid->states[i].errors = REGULATOR_ERROR_FAIL; 1077 *dev_mask |= BIT(i); 1078 } 1079 1080 return 0; 1081 } 1082 1083 static int bd96801_rdev_errb_irqs(struct platform_device *pdev, 1084 struct regulator_dev *rdev) 1085 { 1086 int i; 1087 void *retp; 1088 static const char * const single_out_errb_irqs[] = { 1089 "%s-pvin-err", "%s-ovp-err", "%s-uvp-err", "%s-shdn-err", 1090 }; 1091 1092 for (i = 0; i < ARRAY_SIZE(single_out_errb_irqs); i++) { 1093 struct regulator_irq_desc id = { 1094 .map_event = bd96801_map_event_all, 1095 .irq_off_ms = 1000, 1096 }; 1097 struct regulator_dev *rdev_arr[1]; 1098 char tmp[255]; 1099 int irq; 1100 1101 snprintf(tmp, 255, single_out_errb_irqs[i], rdev->desc->name); 1102 tmp[254] = 0; 1103 id.name = tmp; 1104 1105 irq = platform_get_irq_byname(pdev, tmp); 1106 if (irq < 0) 1107 continue; 1108 1109 rdev_arr[0] = rdev; 1110 retp = devm_regulator_irq_helper(&pdev->dev, &id, irq, 0, 1111 REGULATOR_ERROR_FAIL, NULL, 1112 rdev_arr, 1); 1113 if (IS_ERR(retp)) 1114 return PTR_ERR(retp); 1115 1116 } 1117 return 0; 1118 } 1119 1120 static int bd96801_global_errb_irqs(struct platform_device *pdev, 1121 struct regulator_dev **rdev, int num_rdev) 1122 { 1123 int i, num_irqs; 1124 void *retp; 1125 static const char * const global_errb_irqs[] = { 1126 "otp-err", "dbist-err", "eep-err", "abist-err", "prstb-err", 1127 "drmoserr1", "drmoserr2", "slave-err", "vref-err", "tsd", 1128 "uvlo-err", "ovlo-err", "osc-err", "pon-err", "poff-err", 1129 "cmd-shdn-err", "int-shdn-err" 1130 }; 1131 1132 num_irqs = ARRAY_SIZE(global_errb_irqs); 1133 for (i = 0; i < num_irqs; i++) { 1134 int irq; 1135 struct regulator_irq_desc id = { 1136 .name = global_errb_irqs[i], 1137 .map_event = bd96801_map_event_all, 1138 .irq_off_ms = 1000, 1139 }; 1140 1141 irq = platform_get_irq_byname(pdev, global_errb_irqs[i]); 1142 if (irq < 0) 1143 continue; 1144 1145 retp = devm_regulator_irq_helper(&pdev->dev, &id, irq, 0, 1146 REGULATOR_ERROR_FAIL, NULL, 1147 rdev, num_rdev); 1148 if (IS_ERR(retp)) 1149 return PTR_ERR(retp); 1150 } 1151 1152 return 0; 1153 } 1154 1155 static int bd96801_rdev_intb_irqs(struct platform_device *pdev, 1156 struct bd96801_pmic_data *pdata, 1157 struct bd96801_irqinfo *iinfo, 1158 struct regulator_dev *rdev) 1159 { 1160 struct regulator_dev *rdev_arr[1]; 1161 void *retp; 1162 int err = 0; 1163 int irq; 1164 int err_flags[] = { 1165 [BD96801_PROT_OVP] = REGULATOR_ERROR_REGULATION_OUT, 1166 [BD96801_PROT_UVP] = REGULATOR_ERROR_UNDER_VOLTAGE, 1167 [BD96801_PROT_OCP] = REGULATOR_ERROR_OVER_CURRENT, 1168 [BD96801_PROT_TEMP] = REGULATOR_ERROR_OVER_TEMP, 1169 1170 }; 1171 int wrn_flags[] = { 1172 [BD96801_PROT_OVP] = REGULATOR_ERROR_OVER_VOLTAGE_WARN, 1173 [BD96801_PROT_UVP] = REGULATOR_ERROR_UNDER_VOLTAGE_WARN, 1174 [BD96801_PROT_OCP] = REGULATOR_ERROR_OVER_CURRENT_WARN, 1175 [BD96801_PROT_TEMP] = REGULATOR_ERROR_OVER_TEMP_WARN, 1176 }; 1177 1178 /* 1179 * Don't install IRQ handler if both error and warning 1180 * notifications are explicitly disabled 1181 */ 1182 if (!iinfo->err_cfg && !iinfo->wrn_cfg) 1183 return 0; 1184 1185 if (WARN_ON(iinfo->type >= BD96801_NUM_PROT)) 1186 return -EINVAL; 1187 1188 if (iinfo->err_cfg) 1189 err = err_flags[iinfo->type]; 1190 else if (iinfo->wrn_cfg) 1191 err = wrn_flags[iinfo->type]; 1192 1193 iinfo->irq_desc.data = pdata; 1194 irq = platform_get_irq_byname(pdev, iinfo->irq_name); 1195 if (irq < 0) 1196 return irq; 1197 /* Find notifications for this IRQ (WARN/ERR) */ 1198 1199 rdev_arr[0] = rdev; 1200 retp = devm_regulator_irq_helper(&pdev->dev, 1201 &iinfo->irq_desc, irq, 1202 0, err, NULL, rdev_arr, 1203 1); 1204 if (IS_ERR(retp)) 1205 return PTR_ERR(retp); 1206 1207 return 0; 1208 } 1209 1210 static int bd96801_probe(struct platform_device *pdev) 1211 { 1212 struct regulator_dev *ldo_errs_rdev_arr[BD96801_NUM_LDOS]; 1213 struct regulator_dev *all_rdevs[BD96801_NUM_REGULATORS]; 1214 struct bd96801_pmic_data *pdata_template; 1215 struct bd96801_regulator_data *rdesc; 1216 struct regulator_config config = {}; 1217 int ldo_errs_arr[BD96801_NUM_LDOS]; 1218 struct bd96801_pmic_data *pdata; 1219 int temp_notif_ldos = 0; 1220 struct device *parent; 1221 int i, ret; 1222 bool use_errb; 1223 void *retp; 1224 1225 parent = pdev->dev.parent; 1226 1227 pdata_template = (struct bd96801_pmic_data *)platform_get_device_id(pdev)->driver_data; 1228 if (!pdata_template) 1229 return -ENODEV; 1230 1231 pdata = devm_kmemdup(&pdev->dev, pdata_template, sizeof(bd96801_data), 1232 GFP_KERNEL); 1233 if (!pdata) 1234 return -ENOMEM; 1235 1236 if (initialize_pmic_data(pdev, pdata)) 1237 return -ENOMEM; 1238 1239 pdata->regmap = dev_get_regmap(parent, NULL); 1240 if (!pdata->regmap) { 1241 dev_err(&pdev->dev, "No register map found\n"); 1242 return -ENODEV; 1243 } 1244 1245 rdesc = &pdata->regulator_data[0]; 1246 1247 config.driver_data = pdata; 1248 config.regmap = pdata->regmap; 1249 config.dev = parent; 1250 1251 ret = of_property_match_string(pdev->dev.parent->of_node, 1252 "interrupt-names", "errb"); 1253 if (ret < 0) 1254 use_errb = false; 1255 else 1256 use_errb = true; 1257 1258 ret = bd96801_walk_regulator_dt(&pdev->dev, pdata->regmap, rdesc, 1259 pdata->num_regulators); 1260 if (ret) 1261 return ret; 1262 1263 for (i = 0; i < pdata->num_regulators; i++) { 1264 struct regulator_dev *rdev; 1265 struct bd96801_irq_desc *idesc = &rdesc[i].irq_desc; 1266 int j; 1267 1268 rdev = devm_regulator_register(&pdev->dev, 1269 &rdesc[i].desc, &config); 1270 if (IS_ERR(rdev)) { 1271 dev_err(&pdev->dev, 1272 "failed to register %s regulator\n", 1273 rdesc[i].desc.name); 1274 return PTR_ERR(rdev); 1275 } 1276 1277 all_rdevs[i] = rdev; 1278 /* 1279 * LDOs don't have own temperature monitoring. If temperature 1280 * notification was requested for this LDO from DT then we will 1281 * add the regulator to be notified if central IC temperature 1282 * exceeds threshold. 1283 */ 1284 if (rdesc[i].ldo_errs) { 1285 ldo_errs_rdev_arr[temp_notif_ldos] = rdev; 1286 ldo_errs_arr[temp_notif_ldos] = rdesc[i].ldo_errs; 1287 temp_notif_ldos++; 1288 } 1289 1290 /* Register INTB handlers for configured protections */ 1291 for (j = 0; j < idesc->num_irqs; j++) { 1292 ret = bd96801_rdev_intb_irqs(pdev, pdata, 1293 &idesc->irqinfo[j], rdev); 1294 if (ret) 1295 return ret; 1296 } 1297 /* Register per regulator ERRB notifiers */ 1298 if (use_errb) { 1299 ret = bd96801_rdev_errb_irqs(pdev, rdev); 1300 if (ret) 1301 return ret; 1302 } 1303 } 1304 if (temp_notif_ldos) { 1305 int irq; 1306 struct regulator_irq_desc tw_desc = { 1307 .name = "core-thermal", 1308 .irq_off_ms = 500, 1309 .map_event = ldo_map_notif, 1310 }; 1311 1312 irq = platform_get_irq_byname(pdev, "core-thermal"); 1313 if (irq < 0) 1314 return irq; 1315 1316 retp = devm_regulator_irq_helper(&pdev->dev, &tw_desc, irq, 0, 1317 0, &ldo_errs_arr[0], 1318 &ldo_errs_rdev_arr[0], 1319 temp_notif_ldos); 1320 if (IS_ERR(retp)) 1321 return PTR_ERR(retp); 1322 } 1323 1324 if (use_errb) 1325 return bd96801_global_errb_irqs(pdev, all_rdevs, 1326 pdata->num_regulators); 1327 1328 return 0; 1329 } 1330 1331 static const struct platform_device_id bd96801_pmic_id[] = { 1332 { "bd96801-regulator", (kernel_ulong_t)&bd96801_data }, 1333 { "bd96802-regulator", (kernel_ulong_t)&bd96802_data }, 1334 { "bd96805-regulator", (kernel_ulong_t)&bd96805_data }, 1335 { "bd96806-regulator", (kernel_ulong_t)&bd96806_data }, 1336 { }, 1337 }; 1338 MODULE_DEVICE_TABLE(platform, bd96801_pmic_id); 1339 1340 static struct platform_driver bd96801_regulator = { 1341 .driver = { 1342 .name = "bd96801-pmic" 1343 }, 1344 .probe = bd96801_probe, 1345 .id_table = bd96801_pmic_id, 1346 }; 1347 1348 module_platform_driver(bd96801_regulator); 1349 1350 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); 1351 MODULE_DESCRIPTION("BD96801 voltage regulator driver"); 1352 MODULE_LICENSE("GPL"); 1353