I changed the code to follow your recommendations then now in case of a multiphase buck, only one set of interrupt is requested.+static int tps6594_get_rdev_by_name(const char *regulator_name,
+ struct regulator_dev *rdevbucktbl[BUCK_NB],
+ struct regulator_dev *rdevldotbl[LDO_NB],
+ struct regulator_dev *dev)
+{
+ int i;
+
+ for (i = 0; i <= BUCK_NB; i++) {
+ if (strcmp(regulator_name, buck_regs[i].name) == 0) {
+ dev = rdevbucktbl[i];
+ return 0;
+ }
+ }
+
+ for (i = 0; i < ARRAY_SIZE(ldo_regs); i++) {
+ if (strcmp(regulator_name, ldo_regs[i].name) == 0) {
+ dev = rdevldotbl[i];
+ return 0;
+ }
+ }
+ return -EINVAL;
+}
+ for (i = 0; i < ARRAY_SIZE(tps6594_regulator_irq_types); ++i) {
+ irq_type = &tps6594_regulator_irq_types[i];
+
+ irq = platform_get_irq_byname(pdev, irq_type->irq_name);
+ if (irq < 0)
+ return -EINVAL;
+
+ irq_data[i].dev = tps->dev;
+ irq_data[i].type = irq_type;
+
+ tps6594_get_rdev_by_name(irq_type->regulator_name, rdevbucktbl,
+ rdevldotbl, rdev);
This would be simpler and you wouldn't need this lookup function if the
regulator descriptions included their IRQ names, then you could just
request the interrupts while registering the regulators.
I'm not sure to understand this sentence correctly. You mean all the interrupts already requested are still allocated after the error occurs?
+ error = devm_request_threaded_irq(tps->dev, irq, NULL,
+ tps6594_regulator_irq_handler,
+ IRQF_ONESHOT,
+ irq_type->irq_name,
+ &irq_data[i]);
+ if (error) {
+ dev_err(tps->dev, "failed to request %s IRQ %d: %d\n",
+ irq_type->irq_name, irq, error);
+ return error;
+ }
This leaks all previously requested interrupts.