]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
regulator: tps65219: Add support for TPS65215 Regulator IRQs
authorShree Ramamoorthy <s-ramamoorthy@ti.com>
Fri, 25 Apr 2025 20:57:35 +0000 (15:57 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 1 May 2025 20:39:05 +0000 (05:39 +0900)
Isolate all changes involving regulator IRQ types:
- Adding in TPS65215 resources
- Organize what resources are common vs device-specific
- How the chip_data uses these resource structs
- Restructure the probe() for multi-PMIC support.

Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
Link: https://patch.msgid.link/20250425205736.76433-4-s-ramamoorthy@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/tps65219-regulator.c

index b95fb676e5d2a78571c38f7718530531ff2cda82..d84ab9586ec41152716076b5ac768ff98328e01e 100644 (file)
@@ -36,6 +36,14 @@ static struct tps65219_regulator_irq_type tps65219_regulator_irq_types[] = {
        { "LDO4_SCG", "LDO4", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT },
        { "LDO4_OC", "LDO4", "overcurrent", REGULATOR_EVENT_OVER_CURRENT },
        { "LDO4_UV", "LDO4", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE },
+       { "LDO3_RV", "LDO3", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
+       { "LDO4_RV", "LDO4", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
+       { "LDO3_RV_SD", "LDO3", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
+       { "LDO4_RV_SD", "LDO4", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
+};
+
+/*  All of TPS65215's irq types are the same as common_regulator_irq_types */
+static struct tps65219_regulator_irq_type common_regulator_irq_types[] = {
        { "LDO1_SCG", "LDO1", "short circuit to ground", REGULATOR_EVENT_REGULATION_OUT },
        { "LDO1_OC", "LDO1", "overcurrent", REGULATOR_EVENT_OVER_CURRENT },
        { "LDO1_UV", "LDO1", "undervoltage", REGULATOR_EVENT_UNDER_VOLTAGE },
@@ -59,8 +67,6 @@ static struct tps65219_regulator_irq_type tps65219_regulator_irq_types[] = {
        { "BUCK3_RV", "BUCK3", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "LDO1_RV", "LDO1", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "LDO2_RV", "LDO2", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
-       { "LDO3_RV", "LDO3", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
-       { "LDO4_RV", "LDO4", "residual voltage", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "BUCK1_RV_SD", "BUCK1", "residual voltage on shutdown",
         REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "BUCK2_RV_SD", "BUCK2", "residual voltage on shutdown",
@@ -69,8 +75,6 @@ static struct tps65219_regulator_irq_type tps65219_regulator_irq_types[] = {
         REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "LDO1_RV_SD", "LDO1", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "LDO2_RV_SD", "LDO2", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
-       { "LDO3_RV_SD", "LDO3", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
-       { "LDO4_RV_SD", "LDO4", "residual voltage on shutdown", REGULATOR_EVENT_OVER_VOLTAGE_WARN },
        { "SENSOR_3_WARM", "SENSOR3", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN},
        { "SENSOR_2_WARM", "SENSOR2", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN },
        { "SENSOR_1_WARM", "SENSOR1", "warm temperature", REGULATOR_EVENT_OVER_TEMP_WARN },
@@ -264,7 +268,7 @@ static const struct regulator_desc tps65215_regs[] = {
                           TPS65219_BUCKS_LDOS_VOUT_VSET_MASK,
                           TPS65219_REG_ENABLE_CTRL,
                           TPS65215_ENABLE_LDO2_EN_MASK, 0, 0, tps65215_ldo_2_range,
-                          3, 0, 0, NULL, 0, 0),
+                          2, 0, 0, NULL, 0, 0),
 };
 
 static const struct regulator_desc tps65219_regs[] = {
@@ -313,8 +317,12 @@ static irqreturn_t tps65219_regulator_irq_handler(int irq, void *data)
 struct tps65219_chip_data {
        size_t rdesc_size;
        size_t common_rdesc_size;
+       size_t dev_irq_size;
+       size_t common_irq_size;
        const struct regulator_desc *rdesc;
        const struct regulator_desc *common_rdesc;
+       struct tps65219_regulator_irq_type *irq_types;
+       struct tps65219_regulator_irq_type *common_irq_types;
 };
 
 static struct tps65219_chip_data chip_info_table[] = {
@@ -323,12 +331,20 @@ static struct tps65219_chip_data chip_info_table[] = {
                .rdesc_size = ARRAY_SIZE(tps65215_regs),
                .common_rdesc = common_regs,
                .common_rdesc_size = ARRAY_SIZE(common_regs),
+               .irq_types = NULL,
+               .dev_irq_size = 0,
+               .common_irq_types = common_regulator_irq_types,
+               .common_irq_size = ARRAY_SIZE(common_regulator_irq_types),
        },
        [TPS65219] = {
                .rdesc = tps65219_regs,
                .rdesc_size = ARRAY_SIZE(tps65219_regs),
                .common_rdesc = common_regs,
                .common_rdesc_size = ARRAY_SIZE(common_regs),
+               .irq_types = tps65219_regulator_irq_types,
+               .dev_irq_size = ARRAY_SIZE(tps65219_regulator_irq_types),
+               .common_irq_types = common_regulator_irq_types,
+               .common_irq_size = ARRAY_SIZE(common_regulator_irq_types),
        },
 };
 
@@ -336,7 +352,6 @@ static int tps65219_regulator_probe(struct platform_device *pdev)
 {
        struct tps65219_regulator_irq_data *irq_data;
        struct tps65219_regulator_irq_type *irq_type;
-
        struct tps65219_chip_data *pmic;
        struct regulator_dev *rdev;
        int error;
@@ -371,33 +386,50 @@ static int tps65219_regulator_probe(struct platform_device *pdev)
                                             pmic->rdesc[i].name);
        }
 
-       irq_data = devm_kmalloc(tps->dev,
-                               ARRAY_SIZE(tps65219_regulator_irq_types) *
-                               sizeof(struct tps65219_regulator_irq_data),
-                               GFP_KERNEL);
+       irq_data = devm_kmalloc(tps->dev, pmic->common_irq_size, GFP_KERNEL);
        if (!irq_data)
                return -ENOMEM;
 
-       for (i = 0; i < ARRAY_SIZE(tps65219_regulator_irq_types); ++i) {
-               irq_type = &tps65219_regulator_irq_types[i];
-
+       for (i = 0; i < pmic->common_irq_size; ++i) {
+               irq_type = &pmic->common_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;
+               error = devm_request_threaded_irq(tps->dev, irq, NULL,
+                                                 tps65219_regulator_irq_handler,
+                                                 IRQF_ONESHOT,
+                                                 irq_type->irq_name,
+                                                 &irq_data[i]);
+               if (error)
+                       return dev_err_probe(tps->dev, PTR_ERR(rdev),
+                                            "Failed to request %s IRQ %d: %d\n",
+                                            irq_type->irq_name, irq, error);
+       }
+
+       irq_data = devm_kmalloc(tps->dev, pmic->dev_irq_size, GFP_KERNEL);
+       if (!irq_data)
+               return -ENOMEM;
 
+       for (i = 0; i < pmic->dev_irq_size; ++i) {
+               irq_type = &pmic->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;
                error = devm_request_threaded_irq(tps->dev, irq, NULL,
                                                  tps65219_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;
-               }
+               if (error)
+                       return dev_err_probe(tps->dev, PTR_ERR(rdev),
+                                            "Failed to request %s IRQ %d: %d\n",
+                                            irq_type->irq_name, irq, error);
        }
 
        return 0;