]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mfd: bd96801: Support ROHM BD96806
authorMatti Vaittinen <mazziesaccount@gmail.com>
Tue, 8 Apr 2025 08:47:10 +0000 (11:47 +0300)
committerLee Jones <lee@kernel.org>
Thu, 24 Apr 2025 13:53:13 +0000 (14:53 +0100)
The ROHM BD96806 is from the software perspective almost identical to
the ROHM BD96802. The main difference is different voltage tuning
ranges. Add support differentiating these PMICs based on the compatible,
and invoking the regulator driver with correct IC type.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Link: https://lore.kernel.org/r/ccc95ae33613648fdcba08915777d945412ac5c4.1744090658.git.mazziesaccount@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/rohm-bd96801.c
include/linux/mfd/rohm-generic.h

index dd0be7d675b8ac051d9a6bb4557fdac06d0ef0e1..66fa017ad568a2e47e3453e164311110a3b4e7cc 100644 (file)
@@ -225,6 +225,11 @@ static struct mfd_cell bd96805_cells[] = {
        [REGULATOR_CELL] = { .name = "bd96805-regulator", },
 };
 
+static struct mfd_cell bd96806_cells[] = {
+       [WDG_CELL] = { .name = "bd96806-wdt", },
+       [REGULATOR_CELL] = { .name = "bd96806-regulator", },
+};
+
 static const struct regmap_range bd96801_volatile_ranges[] = {
        /* Status registers */
        regmap_reg_range(BD96801_REG_WD_FEED, BD96801_REG_WD_FAILCOUNT),
@@ -617,6 +622,20 @@ static const struct bd968xx bd96805_data = {
        .unlock_val = BD96801_UNLOCK,
 };
 
+static struct bd968xx bd96806_data = {
+       .errb_irqs = bd96802_reg_errb_irqs,
+       .intb_irqs = bd96802_reg_intb_irqs,
+       .num_errb_irqs = ARRAY_SIZE(bd96802_reg_errb_irqs),
+       .num_intb_irqs = ARRAY_SIZE(bd96802_reg_intb_irqs),
+       .errb_irq_chip = &bd96802_irq_chip_errb,
+       .intb_irq_chip = &bd96802_irq_chip_intb,
+       .regmap_config = &bd96802_regmap_config,
+       .cells = bd96806_cells,
+       .num_cells = ARRAY_SIZE(bd96806_cells),
+       .unlock_reg = BD96801_LOCK_REG,
+       .unlock_val = BD96801_UNLOCK,
+};
+
 static int bd96801_i2c_probe(struct i2c_client *i2c)
 {
        struct regmap_irq_chip_data *intb_irq_data, *errb_irq_data;
@@ -642,6 +661,9 @@ static int bd96801_i2c_probe(struct i2c_client *i2c)
        case ROHM_CHIP_TYPE_BD96805:
                ddata = &bd96805_data;
                break;
+       case ROHM_CHIP_TYPE_BD96806:
+               ddata = &bd96806_data;
+               break;
        default:
                dev_err(&i2c->dev, "Unknown IC\n");
                return -EINVAL;
@@ -739,6 +761,7 @@ static const struct of_device_id bd96801_of_match[] = {
        { .compatible = "rohm,bd96801", .data = (void *)ROHM_CHIP_TYPE_BD96801 },
        { .compatible = "rohm,bd96802", .data = (void *)ROHM_CHIP_TYPE_BD96802 },
        { .compatible = "rohm,bd96805", .data = (void *)ROHM_CHIP_TYPE_BD96805 },
+       { .compatible = "rohm,bd96806", .data = (void *)ROHM_CHIP_TYPE_BD96806 },
        { }
 };
 MODULE_DEVICE_TABLE(of, bd96801_of_match);
index 867acf5baefcba60fb61ababd3892101e517c6fc..579e8dcfcca41d2680283819684a1014617d0d4b 100644 (file)
@@ -19,6 +19,7 @@ enum rohm_chip_type {
        ROHM_CHIP_TYPE_BD96801,
        ROHM_CHIP_TYPE_BD96802,
        ROHM_CHIP_TYPE_BD96805,
+       ROHM_CHIP_TYPE_BD96806,
        ROHM_CHIP_TYPE_AMOUNT
 };