1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // TPS65214/TPS65215/TPS65219 PMIC Regulator Driver 4 // 5 // Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/ 6 // Copyright (C) 2024 Texas Instruments Incorporated - https://www.ti.com/ 7 // 8 // This implementation derived from tps65218 authored by 9 // "J Keerthy <j-keerthy@ti.com>" 10 // 11 12 #include <linux/kernel.h> 13 #include <linux/module.h> 14 #include <linux/device.h> 15 #include <linux/init.h> 16 #include <linux/err.h> 17 #include <linux/of.h> 18 #include <linux/platform_device.h> 19 #include <linux/regmap.h> 20 #include <linux/regulator/of_regulator.h> 21 #include <linux/regulator/driver.h> 22 #include <linux/regulator/machine.h> 23 #include <linux/mfd/tps65219.h> 24 25 struct tps65219_regulator_irq_type { 26 const char *irq_name; 27 const char *regulator_name; 28 const char *event_name; 29 unsigned long event; 30 }; 31 32 static struct tps65219_regulator_irq_type tps65215_regulator_irq_types[] = { 33 { "SENSOR_3_WARM", "SENSOR3", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN}, 34 { "SENSOR_3_HOT", "SENSOR3", "hot temperature", REGULATOR_EVENT_OVER_TEMP}, 35 }; 36 37 static struct tps65219_regulator_irq_type tps65219_regulator_irq_types[] = { 38 { "LDO3_SCG", "LDO3", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 39 { "LDO3_OC", "LDO3", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 40 { "LDO3_UV", "LDO3", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 41 { "LDO4_SCG", "LDO4", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 42 { "LDO4_OC", "LDO4", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 43 { "LDO4_UV", "LDO4", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 44 { "LDO3_RV", "LDO3", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 45 { "LDO4_RV", "LDO4", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 46 { "LDO3_RV_SD", "LDO3", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 47 { "LDO4_RV_SD", "LDO4", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 48 { "SENSOR_3_WARM", "SENSOR3", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN}, 49 { "SENSOR_3_HOT", "SENSOR3", "hot temperature", REGULATOR_EVENT_OVER_TEMP}, 50 }; 51 52 /* All of TPS65214's irq types are the same as common_regulator_irq_types */ 53 static struct tps65219_regulator_irq_type common_regulator_irq_types[] = { 54 { "LDO1_SCG", "LDO1", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 55 { "LDO1_OC", "LDO1", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 56 { "LDO1_UV", "LDO1", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 57 { "LDO2_SCG", "LDO2", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 58 { "LDO2_OC", "LDO2", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 59 { "LDO2_UV", "LDO2", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 60 { "BUCK3_SCG", "BUCK3", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 61 { "BUCK3_OC", "BUCK3", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 62 { "BUCK3_NEG_OC", "BUCK3", "negative overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 63 { "BUCK3_UV", "BUCK3", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 64 { "BUCK1_SCG", "BUCK1", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 65 { "BUCK1_OC", "BUCK1", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 66 { "BUCK1_NEG_OC", "BUCK1", "negative overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 67 { "BUCK1_UV", "BUCK1", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 68 { "BUCK2_SCG", "BUCK2", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT }, 69 { "BUCK2_OC", "BUCK2", "overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 70 { "BUCK2_NEG_OC", "BUCK2", "negative overcurrent", REGULATOR_EVENT_OVER_CURRENT }, 71 { "BUCK2_UV", "BUCK2", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE }, 72 { "BUCK1_RV", "BUCK1", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 73 { "BUCK2_RV", "BUCK2", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 74 { "BUCK3_RV", "BUCK3", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 75 { "LDO1_RV", "LDO1", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 76 { "LDO2_RV", "LDO2", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 77 { "BUCK1_RV_SD", "BUCK1", "residual voltage on shutdown", 78 REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 79 { "BUCK2_RV_SD", "BUCK2", "residual voltage on shutdown", 80 REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 81 { "BUCK3_RV_SD", "BUCK3", "residual voltage on shutdown", 82 REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 83 { "LDO1_RV_SD", "LDO1", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 84 { "LDO2_RV_SD", "LDO2", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN }, 85 { "SENSOR_2_WARM", "SENSOR2", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN }, 86 { "SENSOR_1_WARM", "SENSOR1", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN }, 87 { "SENSOR_0_WARM", "SENSOR0", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN }, 88 { "SENSOR_2_HOT", "SENSOR2", "hot temperature", REGULATOR_EVENT_OVER_TEMP }, 89 { "SENSOR_1_HOT", "SENSOR1", "hot temperature", REGULATOR_EVENT_OVER_TEMP }, 90 { "SENSOR_0_HOT", "SENSOR0", "hot temperature", REGULATOR_EVENT_OVER_TEMP }, 91 { "TIMEOUT", "", "", REGULATOR_EVENT_ABORT_VOLTAGE_CHANGE }, 92 }; 93 94 struct tps65219_regulator_irq_data { 95 struct device *dev; 96 struct tps65219_regulator_irq_type *type; 97 struct regulator_dev *rdev; 98 }; 99 100 #define TPS65219_REGULATOR(_name, _of, _id, _type, _ops, _n, _vr, _vm, _er, \ 101 _em, _cr, _cm, _lr, _nlr, _delay, _fuv, \ 102 _ct, _ncl, _bpm) \ 103 { \ 104 .name = _name, \ 105 .of_match = _of, \ 106 .regulators_node = of_match_ptr("regulators"), \ 107 .supply_name = _of, \ 108 .id = _id, \ 109 .ops = &(_ops), \ 110 .n_voltages = _n, \ 111 .type = _type, \ 112 .owner = THIS_MODULE, \ 113 .vsel_reg = _vr, \ 114 .vsel_mask = _vm, \ 115 .csel_reg = _cr, \ 116 .csel_mask = _cm, \ 117 .curr_table = _ct, \ 118 .n_current_limits = _ncl, \ 119 .enable_reg = _er, \ 120 .enable_mask = _em, \ 121 .volt_table = NULL, \ 122 .linear_ranges = _lr, \ 123 .n_linear_ranges = _nlr, \ 124 .ramp_delay = _delay, \ 125 .fixed_uV = _fuv, \ 126 .bypass_reg = _vr, \ 127 .bypass_mask = _bpm, \ 128 } \ 129 130 static const struct linear_range bucks_ranges[] = { 131 REGULATOR_LINEAR_RANGE(600000, 0x0, 0x1f, 25000), 132 REGULATOR_LINEAR_RANGE(1400000, 0x20, 0x33, 100000), 133 REGULATOR_LINEAR_RANGE(3400000, 0x34, 0x3f, 0), 134 }; 135 136 static const struct linear_range ldo_1_range[] = { 137 REGULATOR_LINEAR_RANGE(600000, 0x0, 0x37, 50000), 138 REGULATOR_LINEAR_RANGE(3400000, 0x38, 0x3f, 0), 139 }; 140 141 static const struct linear_range tps65214_ldo_1_2_range[] = { 142 REGULATOR_LINEAR_RANGE(600000, 0x0, 0x2, 0), 143 REGULATOR_LINEAR_RANGE(650000, 0x3, 0x37, 50000), 144 REGULATOR_LINEAR_RANGE(3300000, 0x38, 0x3F, 0), 145 }; 146 147 static const struct linear_range tps65215_ldo_2_range[] = { 148 REGULATOR_LINEAR_RANGE(1200000, 0x0, 0xC, 50000), 149 REGULATOR_LINEAR_RANGE(3300000, 0x36, 0x3F, 0), 150 }; 151 152 static const struct linear_range tps65219_ldo_2_range[] = { 153 REGULATOR_LINEAR_RANGE(600000, 0x0, 0x37, 50000), 154 REGULATOR_LINEAR_RANGE(3400000, 0x38, 0x3f, 0), 155 }; 156 157 static const struct linear_range tps65219_ldos_3_4_range[] = { 158 REGULATOR_LINEAR_RANGE(1200000, 0x0, 0xC, 0), 159 REGULATOR_LINEAR_RANGE(1250000, 0xD, 0x35, 50000), 160 REGULATOR_LINEAR_RANGE(3300000, 0x36, 0x3F, 0), 161 }; 162 163 static int tps65219_set_mode(struct regulator_dev *dev, unsigned int mode) 164 { 165 struct tps65219 *tps = rdev_get_drvdata(dev); 166 167 switch (mode) { 168 case REGULATOR_MODE_NORMAL: 169 return regmap_set_bits(tps->regmap, TPS65219_REG_STBY_1_CONFIG, 170 dev->desc->enable_mask); 171 172 case REGULATOR_MODE_STANDBY: 173 return regmap_clear_bits(tps->regmap, 174 TPS65219_REG_STBY_1_CONFIG, 175 dev->desc->enable_mask); 176 default: 177 return -EINVAL; 178 } 179 } 180 181 static unsigned int tps65219_get_mode(struct regulator_dev *dev) 182 { 183 struct tps65219 *tps = rdev_get_drvdata(dev); 184 unsigned int rid = rdev_get_id(dev); 185 int ret, value = 0; 186 187 ret = regmap_read(tps->regmap, TPS65219_REG_STBY_1_CONFIG, &value); 188 if (ret) { 189 dev_dbg(tps->dev, "%s failed for regulator %s: %d ", 190 __func__, dev->desc->name, ret); 191 return ret; 192 } 193 value = (value & BIT(rid)) >> rid; 194 if (value) 195 return REGULATOR_MODE_STANDBY; 196 else 197 return REGULATOR_MODE_NORMAL; 198 } 199 200 /* Operations permitted on BUCK1/2/3 */ 201 static const struct regulator_ops bucks_ops = { 202 .is_enabled = regulator_is_enabled_regmap, 203 .enable = regulator_enable_regmap, 204 .disable = regulator_disable_regmap, 205 .set_mode = tps65219_set_mode, 206 .get_mode = tps65219_get_mode, 207 .get_voltage_sel = regulator_get_voltage_sel_regmap, 208 .set_voltage_sel = regulator_set_voltage_sel_regmap, 209 .list_voltage = regulator_list_voltage_linear_range, 210 .map_voltage = regulator_map_voltage_linear_range, 211 .set_voltage_time_sel = regulator_set_voltage_time_sel, 212 213 }; 214 215 /* Operations permitted on LDO1/2 */ 216 static const struct regulator_ops ldos_1_2_ops = { 217 .is_enabled = regulator_is_enabled_regmap, 218 .enable = regulator_enable_regmap, 219 .disable = regulator_disable_regmap, 220 .set_mode = tps65219_set_mode, 221 .get_mode = tps65219_get_mode, 222 .get_voltage_sel = regulator_get_voltage_sel_regmap, 223 .set_voltage_sel = regulator_set_voltage_sel_regmap, 224 .list_voltage = regulator_list_voltage_linear_range, 225 .map_voltage = regulator_map_voltage_linear_range, 226 .set_bypass = regulator_set_bypass_regmap, 227 .get_bypass = regulator_get_bypass_regmap, 228 }; 229 230 /* Operations permitted on LDO3/4 */ 231 static const struct regulator_ops ldos_3_4_ops = { 232 .is_enabled = regulator_is_enabled_regmap, 233 .enable = regulator_enable_regmap, 234 .disable = regulator_disable_regmap, 235 .set_mode = tps65219_set_mode, 236 .get_mode = tps65219_get_mode, 237 .get_voltage_sel = regulator_get_voltage_sel_regmap, 238 .set_voltage_sel = regulator_set_voltage_sel_regmap, 239 .list_voltage = regulator_list_voltage_linear_range, 240 .map_voltage = regulator_map_voltage_linear_range, 241 }; 242 243 static const struct regulator_desc common_regs[] = { 244 TPS65219_REGULATOR("BUCK1", "buck1", TPS65219_BUCK_1, 245 REGULATOR_VOLTAGE, bucks_ops, 64, 246 TPS65219_REG_BUCK1_VOUT, 247 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 248 TPS65219_REG_ENABLE_CTRL, 249 TPS65219_ENABLE_BUCK1_EN_MASK, 0, 0, bucks_ranges, 250 3, 4000, 0, NULL, 0, 0), 251 TPS65219_REGULATOR("BUCK2", "buck2", TPS65219_BUCK_2, 252 REGULATOR_VOLTAGE, bucks_ops, 64, 253 TPS65219_REG_BUCK2_VOUT, 254 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 255 TPS65219_REG_ENABLE_CTRL, 256 TPS65219_ENABLE_BUCK2_EN_MASK, 0, 0, bucks_ranges, 257 3, 4000, 0, NULL, 0, 0), 258 TPS65219_REGULATOR("BUCK3", "buck3", TPS65219_BUCK_3, 259 REGULATOR_VOLTAGE, bucks_ops, 64, 260 TPS65219_REG_BUCK3_VOUT, 261 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 262 TPS65219_REG_ENABLE_CTRL, 263 TPS65219_ENABLE_BUCK3_EN_MASK, 0, 0, bucks_ranges, 264 3, 0, 0, NULL, 0, 0), 265 }; 266 267 static const struct regulator_desc tps65214_regs[] = { 268 // TPS65214's LDO3 pin maps to TPS65219's LDO3 pin 269 TPS65219_REGULATOR("LDO1", "ldo1", TPS65214_LDO_1, 270 REGULATOR_VOLTAGE, ldos_3_4_ops, 64, 271 TPS65214_REG_LDO1_VOUT, 272 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 273 TPS65219_REG_ENABLE_CTRL, 274 TPS65219_ENABLE_LDO3_EN_MASK, 0, 0, tps65214_ldo_1_2_range, 275 3, 0, 0, NULL, 0, 0), 276 TPS65219_REGULATOR("LDO2", "ldo2", TPS65214_LDO_2, 277 REGULATOR_VOLTAGE, ldos_3_4_ops, 64, 278 TPS65214_REG_LDO2_VOUT, 279 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 280 TPS65219_REG_ENABLE_CTRL, 281 TPS65219_ENABLE_LDO2_EN_MASK, 0, 0, tps65214_ldo_1_2_range, 282 3, 0, 0, NULL, 0, 0), 283 }; 284 285 static const struct regulator_desc tps65215_regs[] = { 286 /* 287 * TPS65215's LDO1 is the same as TPS65219's LDO1. LDO1 is 288 * configurable as load switch and bypass-mode. 289 * TPS65215's LDO2 is the same as TPS65219's LDO3 290 */ 291 TPS65219_REGULATOR("LDO1", "ldo1", TPS65219_LDO_1, 292 REGULATOR_VOLTAGE, ldos_1_2_ops, 64, 293 TPS65219_REG_LDO1_VOUT, 294 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 295 TPS65219_REG_ENABLE_CTRL, 296 TPS65219_ENABLE_LDO1_EN_MASK, 0, 0, ldo_1_range, 297 2, 0, 0, NULL, 0, TPS65219_LDOS_BYP_CONFIG_MASK), 298 TPS65219_REGULATOR("LDO2", "ldo2", TPS65215_LDO_2, 299 REGULATOR_VOLTAGE, ldos_3_4_ops, 64, 300 TPS65215_REG_LDO2_VOUT, 301 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 302 TPS65219_REG_ENABLE_CTRL, 303 TPS65215_ENABLE_LDO2_EN_MASK, 0, 0, tps65215_ldo_2_range, 304 2, 0, 0, NULL, 0, 0), 305 }; 306 307 static const struct regulator_desc tps65219_regs[] = { 308 TPS65219_REGULATOR("LDO1", "ldo1", TPS65219_LDO_1, 309 REGULATOR_VOLTAGE, ldos_1_2_ops, 64, 310 TPS65219_REG_LDO1_VOUT, 311 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 312 TPS65219_REG_ENABLE_CTRL, 313 TPS65219_ENABLE_LDO1_EN_MASK, 0, 0, ldo_1_range, 314 2, 0, 0, NULL, 0, TPS65219_LDOS_BYP_CONFIG_MASK), 315 TPS65219_REGULATOR("LDO2", "ldo2", TPS65219_LDO_2, 316 REGULATOR_VOLTAGE, ldos_1_2_ops, 64, 317 TPS65219_REG_LDO2_VOUT, 318 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 319 TPS65219_REG_ENABLE_CTRL, 320 TPS65219_ENABLE_LDO2_EN_MASK, 0, 0, tps65219_ldo_2_range, 321 2, 0, 0, NULL, 0, TPS65219_LDOS_BYP_CONFIG_MASK), 322 TPS65219_REGULATOR("LDO3", "ldo3", TPS65219_LDO_3, 323 REGULATOR_VOLTAGE, ldos_3_4_ops, 64, 324 TPS65219_REG_LDO3_VOUT, 325 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 326 TPS65219_REG_ENABLE_CTRL, 327 TPS65219_ENABLE_LDO3_EN_MASK, 0, 0, tps65219_ldos_3_4_range, 328 3, 0, 0, NULL, 0, 0), 329 TPS65219_REGULATOR("LDO4", "ldo4", TPS65219_LDO_4, 330 REGULATOR_VOLTAGE, ldos_3_4_ops, 64, 331 TPS65219_REG_LDO4_VOUT, 332 TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, 333 TPS65219_REG_ENABLE_CTRL, 334 TPS65219_ENABLE_LDO4_EN_MASK, 0, 0, tps65219_ldos_3_4_range, 335 3, 0, 0, NULL, 0, 0), 336 }; 337 338 static irqreturn_t tps65219_regulator_irq_handler(int irq, void *data) 339 { 340 struct tps65219_regulator_irq_data *irq_data = data; 341 342 if (irq_data->type->event_name[0] == '\0') { 343 /* This is the timeout interrupt no specific regulator */ 344 dev_err(irq_data->dev, 345 "System was put in shutdown due to timeout during an active or standby transition.\n"); 346 return IRQ_HANDLED; 347 } 348 349 regulator_notifier_call_chain(irq_data->rdev, 350 irq_data->type->event, NULL); 351 352 dev_err(irq_data->dev, "Error IRQ trap %s for %s\n", 353 irq_data->type->event_name, irq_data->type->regulator_name); 354 return IRQ_HANDLED; 355 } 356 357 struct tps65219_chip_data { 358 size_t rdesc_size; 359 size_t common_rdesc_size; 360 size_t dev_irq_size; 361 size_t common_irq_size; 362 const struct regulator_desc *rdesc; 363 const struct regulator_desc *common_rdesc; 364 struct tps65219_regulator_irq_type *irq_types; 365 struct tps65219_regulator_irq_type *common_irq_types; 366 }; 367 368 static struct tps65219_chip_data chip_info_table[] = { 369 [TPS65214] = { 370 .rdesc = tps65214_regs, 371 .rdesc_size = ARRAY_SIZE(tps65214_regs), 372 .common_rdesc = common_regs, 373 .common_rdesc_size = ARRAY_SIZE(common_regs), 374 .irq_types = NULL, 375 .dev_irq_size = 0, 376 .common_irq_types = common_regulator_irq_types, 377 .common_irq_size = ARRAY_SIZE(common_regulator_irq_types), 378 }, 379 [TPS65215] = { 380 .rdesc = tps65215_regs, 381 .rdesc_size = ARRAY_SIZE(tps65215_regs), 382 .common_rdesc = common_regs, 383 .common_rdesc_size = ARRAY_SIZE(common_regs), 384 .irq_types = tps65215_regulator_irq_types, 385 .dev_irq_size = ARRAY_SIZE(tps65215_regulator_irq_types), 386 .common_irq_types = common_regulator_irq_types, 387 .common_irq_size = ARRAY_SIZE(common_regulator_irq_types), 388 }, 389 [TPS65219] = { 390 .rdesc = tps65219_regs, 391 .rdesc_size = ARRAY_SIZE(tps65219_regs), 392 .common_rdesc = common_regs, 393 .common_rdesc_size = ARRAY_SIZE(common_regs), 394 .irq_types = tps65219_regulator_irq_types, 395 .dev_irq_size = ARRAY_SIZE(tps65219_regulator_irq_types), 396 .common_irq_types = common_regulator_irq_types, 397 .common_irq_size = ARRAY_SIZE(common_regulator_irq_types), 398 }, 399 }; 400 401 static int tps65219_regulator_probe(struct platform_device *pdev) 402 { 403 struct tps65219_regulator_irq_data *irq_data; 404 struct tps65219_regulator_irq_type *irq_type; 405 struct tps65219_chip_data *pmic; 406 struct regulator_dev *rdev; 407 int error; 408 int irq; 409 int i; 410 411 struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent); 412 struct regulator_config config = { }; 413 enum pmic_id chip = platform_get_device_id(pdev)->driver_data; 414 415 pmic = &chip_info_table[chip]; 416 417 config.dev = tps->dev; 418 config.driver_data = tps; 419 config.regmap = tps->regmap; 420 421 for (i = 0; i < pmic->common_rdesc_size; i++) { 422 rdev = devm_regulator_register(&pdev->dev, &pmic->common_rdesc[i], 423 &config); 424 if (IS_ERR(rdev)) 425 return dev_err_probe(tps->dev, PTR_ERR(rdev), 426 "Failed to register %s regulator\n", 427 pmic->common_rdesc[i].name); 428 } 429 430 for (i = 0; i < pmic->rdesc_size; i++) { 431 rdev = devm_regulator_register(&pdev->dev, &pmic->rdesc[i], 432 &config); 433 if (IS_ERR(rdev)) 434 return dev_err_probe(tps->dev, PTR_ERR(rdev), 435 "Failed to register %s regulator\n", 436 pmic->rdesc[i].name); 437 } 438 439 irq_data = devm_kmalloc(tps->dev, pmic->common_irq_size, GFP_KERNEL); 440 if (!irq_data) 441 return -ENOMEM; 442 443 for (i = 0; i < pmic->common_irq_size; ++i) { 444 irq_type = &pmic->common_irq_types[i]; 445 irq = platform_get_irq_byname(pdev, irq_type->irq_name); 446 if (irq < 0) 447 return -EINVAL; 448 449 irq_data[i].dev = tps->dev; 450 irq_data[i].type = irq_type; 451 error = devm_request_threaded_irq(tps->dev, irq, NULL, 452 tps65219_regulator_irq_handler, 453 IRQF_ONESHOT, 454 irq_type->irq_name, 455 &irq_data[i]); 456 if (error) 457 return dev_err_probe(tps->dev, PTR_ERR(rdev), 458 "Failed to request %s IRQ %d: %d\n", 459 irq_type->irq_name, irq, error); 460 } 461 462 irq_data = devm_kmalloc(tps->dev, pmic->dev_irq_size, GFP_KERNEL); 463 if (!irq_data) 464 return -ENOMEM; 465 466 for (i = 0; i < pmic->dev_irq_size; ++i) { 467 irq_type = &pmic->irq_types[i]; 468 irq = platform_get_irq_byname(pdev, irq_type->irq_name); 469 if (irq < 0) 470 return -EINVAL; 471 472 irq_data[i].dev = tps->dev; 473 irq_data[i].type = irq_type; 474 error = devm_request_threaded_irq(tps->dev, irq, NULL, 475 tps65219_regulator_irq_handler, 476 IRQF_ONESHOT, 477 irq_type->irq_name, 478 &irq_data[i]); 479 if (error) 480 return dev_err_probe(tps->dev, PTR_ERR(rdev), 481 "Failed to request %s IRQ %d: %d\n", 482 irq_type->irq_name, irq, error); 483 } 484 485 return 0; 486 } 487 488 static const struct platform_device_id tps65219_regulator_id_table[] = { 489 { "tps65214-regulator", TPS65214 }, 490 { "tps65215-regulator", TPS65215 }, 491 { "tps65219-regulator", TPS65219 }, 492 { /* sentinel */ } 493 }; 494 MODULE_DEVICE_TABLE(platform, tps65219_regulator_id_table); 495 496 static struct platform_driver tps65219_regulator_driver = { 497 .driver = { 498 .name = "tps65219-regulator", 499 .probe_type = PROBE_PREFER_ASYNCHRONOUS, 500 }, 501 .probe = tps65219_regulator_probe, 502 .id_table = tps65219_regulator_id_table, 503 }; 504 505 module_platform_driver(tps65219_regulator_driver); 506 507 MODULE_AUTHOR("Jerome Neanne <j-neanne@baylibre.com>"); 508 MODULE_DESCRIPTION("TPS65214/TPS65215/TPS65219 Regulator driver"); 509 MODULE_LICENSE("GPL"); 510