Merge tag 'regulator-fix-v6.6-merge-window' of git://git.kernel.org/pub/scm/linux...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Sep 2023 22:51:07 +0000 (15:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Sep 2023 22:51:07 +0000 (15:51 -0700)
Pull regulator fixes from Mark Brown:
 "A couple of fixes that came in during the merge window, both driver
  specific - one for a bug that came up in testing, one for a bug due
  to a misreading of the datasheet"

* tag 'regulator-fix-v6.6-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator:
  regulator: tps6594-regulator: Fix random kernel crash
  regulator: tps6287x: Fix n_voltages

drivers/regulator/tps6287x-regulator.c
drivers/regulator/tps6594-regulator.c

index d022184a8e7dac6529d251046f7aab7aa683c6e6..9b7c3d77789e3dca8e42f24e9ab9b8ed615fb628 100644 (file)
@@ -119,7 +119,7 @@ static struct regulator_desc tps6287x_reg = {
        .ramp_mask = TPS6287X_CTRL1_VRAMP,
        .ramp_delay_table = tps6287x_ramp_table,
        .n_ramp_values = ARRAY_SIZE(tps6287x_ramp_table),
-       .n_voltages = 256,
+       .n_voltages = 256 * ARRAY_SIZE(tps6287x_voltage_ranges),
        .linear_ranges = tps6287x_voltage_ranges,
        .n_linear_ranges = ARRAY_SIZE(tps6287x_voltage_ranges),
        .linear_range_selectors_bitfield = tps6287x_voltage_range_sel,
index 25ef102c82707c4becd4e99adcc09852273fc16c..b7f0c87797577eee4d34a9cbb16ccae039559169 100644 (file)
@@ -384,21 +384,19 @@ static int tps6594_request_reg_irqs(struct platform_device *pdev,
                if (irq < 0)
                        return -EINVAL;
 
-               irq_data[*irq_idx + j].dev = tps->dev;
-               irq_data[*irq_idx + j].type = irq_type;
-               irq_data[*irq_idx + j].rdev = rdev;
+               irq_data[*irq_idx].dev = tps->dev;
+               irq_data[*irq_idx].type = irq_type;
+               irq_data[*irq_idx].rdev = rdev;
 
                error = devm_request_threaded_irq(tps->dev, irq, NULL,
-                                                 tps6594_regulator_irq_handler,
-                                                 IRQF_ONESHOT,
-                                                 irq_type->irq_name,
-                                                 &irq_data[*irq_idx]);
-               (*irq_idx)++;
+                                                 tps6594_regulator_irq_handler, IRQF_ONESHOT,
+                                                 irq_type->irq_name, &irq_data[*irq_idx]);
                if (error) {
                        dev_err(tps->dev, "tps6594 failed to request %s IRQ %d: %d\n",
                                irq_type->irq_name, irq, error);
                        return error;
                }
+               (*irq_idx)++;
        }
        return 0;
 }
@@ -420,8 +418,8 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
        int error, i, irq, multi, delta;
        int irq_idx = 0;
        int buck_idx = 0;
-       int ext_reg_irq_nb = 2;
-
+       size_t ext_reg_irq_nb = 2;
+       size_t reg_irq_nb;
        enum {
                MULTI_BUCK12,
                MULTI_BUCK123,
@@ -484,15 +482,16 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
                }
        }
 
-       if (tps->chip_id == LP8764)
+       if (tps->chip_id == LP8764) {
                /* There is only 4 buck on LP8764 */
                buck_configured[4] = 1;
+               reg_irq_nb = size_mul(REGS_INT_NB, (BUCK_NB - 1));
+       } else {
+               reg_irq_nb = size_mul(REGS_INT_NB, (size_add(BUCK_NB, LDO_NB)));
+       }
 
-       irq_data = devm_kmalloc_array(tps->dev,
-                               REGS_INT_NB * sizeof(struct tps6594_regulator_irq_data),
-                               ARRAY_SIZE(tps6594_bucks_irq_types) +
-                               ARRAY_SIZE(tps6594_ldos_irq_types),
-                               GFP_KERNEL);
+       irq_data = devm_kmalloc_array(tps->dev, reg_irq_nb,
+                                     sizeof(struct tps6594_regulator_irq_data), GFP_KERNEL);
        if (!irq_data)
                return -ENOMEM;