]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
regulator: bd96801: Support ROHM BD96805 PMIC
authorMatti Vaittinen <mazziesaccount@gmail.com>
Tue, 8 Apr 2025 08:46:53 +0000 (11:46 +0300)
committerLee Jones <lee@kernel.org>
Thu, 24 Apr 2025 13:53:11 +0000 (14:53 +0100)
The ROHM BD96805 is from the software perspective almost identical to
the ROHM BD96801. The main difference is different voltage tuning
ranges.

Add support differentiating these PMICs and provide correct voltages
for both models.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/eab1369557b14a9762c41a5429d1ac87a4644d9e.1744090658.git.mazziesaccount@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/regulator/bd96801-regulator.c

index 8e96c460c8aefc87ecb90a5f7989c051da5f1a3c..9c7109a2ab96a3eb0ae7c6f23c2df7ff4b430b81 100644 (file)
@@ -83,6 +83,7 @@ enum {
 #define BD96801_LDO6_VSEL_REG          0x26
 #define BD96801_LDO7_VSEL_REG          0x27
 #define BD96801_BUCK_VSEL_MASK         0x1F
+#define BD96805_BUCK_VSEL_MASK         0x3f
 #define BD96801_LDO_VSEL_MASK          0xff
 
 #define BD96801_MASK_RAMP_DELAY                0xc0
@@ -90,6 +91,7 @@ enum {
 #define BD96801_BUCK_INT_VOUT_MASK     0xff
 
 #define BD96801_BUCK_VOLTS             256
+#define BD96805_BUCK_VOLTS             64
 #define BD96801_LDO_VOLTS              256
 
 #define BD96801_OVP_MASK               0x03
@@ -163,6 +165,23 @@ static const struct linear_range bd96801_buck_init_volts[] = {
 /* BD96802 uses same voltage ranges for bucks as BD96801 */
 #define bd96802_tune_volts bd96801_tune_volts
 #define bd96802_buck_init_volts bd96801_buck_init_volts
+
+/*
+ * On BD96805 we have similar "negative tuning range" as on BD96801, except
+ * that the max tuning is -310 ... +310 mV (instead of the 150mV). We use same
+ * approach as with the BD96801 ranges.
+ */
+static const struct linear_range bd96805_tune_volts[] = {
+       REGULATOR_LINEAR_RANGE(310000, 0x00, 0x1F, 10000),
+       REGULATOR_LINEAR_RANGE(0, 0x20, 0x3F, 10000),
+};
+
+static const struct linear_range bd96805_buck_init_volts[] = {
+       REGULATOR_LINEAR_RANGE(500000 - 310000, 0x00, 0xc8, 5000),
+       REGULATOR_LINEAR_RANGE(1550000 - 310000, 0xc9, 0xec, 50000),
+       REGULATOR_LINEAR_RANGE(3300000 - 310000, 0xed, 0xff, 0),
+};
+
 static const struct linear_range bd96801_ldo_int_volts[] = {
        REGULATOR_LINEAR_RANGE(300000, 0x00, 0x78, 25000),
        REGULATOR_LINEAR_RANGE(3300000, 0x79, 0xff, 0),
@@ -759,6 +778,194 @@ static const struct bd96801_pmic_data bd96801_data = {
        .num_regulators = 7,
 };
 
+static const struct bd96801_pmic_data bd96805_data = {
+       .regulator_data = {
+       {
+               .desc = {
+                       .name = "buck1",
+                       .of_match = of_match_ptr("buck1"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_BUCK1,
+                       .ops = &bd96801_buck_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96805_tune_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts),
+                       .n_voltages = BD96805_BUCK_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_BUCK1_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_BUCK1_VSEL_REG,
+                       .vsel_mask = BD96805_BUCK_VSEL_MASK,
+                       .ramp_reg = BD96801_BUCK1_VSEL_REG,
+                       .ramp_mask = BD96801_MASK_RAMP_DELAY,
+                       .ramp_delay_table = &buck_ramp_table[0],
+                       .n_ramp_values = ARRAY_SIZE(buck_ramp_table),
+                       .owner = THIS_MODULE,
+               },
+               .init_ranges = bd96805_buck_init_volts,
+               .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts),
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&buck1_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(buck1_irqinfo),
+               },
+       }, {
+               .desc = {
+                       .name = "buck2",
+                       .of_match = of_match_ptr("buck2"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_BUCK2,
+                       .ops = &bd96801_buck_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96805_tune_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts),
+                       .n_voltages = BD96805_BUCK_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_BUCK2_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_BUCK2_VSEL_REG,
+                       .vsel_mask = BD96805_BUCK_VSEL_MASK,
+                       .ramp_reg = BD96801_BUCK2_VSEL_REG,
+                       .ramp_mask = BD96801_MASK_RAMP_DELAY,
+                       .ramp_delay_table = &buck_ramp_table[0],
+                       .n_ramp_values = ARRAY_SIZE(buck_ramp_table),
+                       .owner = THIS_MODULE,
+               },
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&buck2_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(buck2_irqinfo),
+               },
+               .init_ranges = bd96805_buck_init_volts,
+               .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts),
+       }, {
+               .desc = {
+                       .name = "buck3",
+                       .of_match = of_match_ptr("buck3"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_BUCK3,
+                       .ops = &bd96801_buck_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96805_tune_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts),
+                       .n_voltages = BD96805_BUCK_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_BUCK3_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_BUCK3_VSEL_REG,
+                       .vsel_mask = BD96805_BUCK_VSEL_MASK,
+                       .ramp_reg = BD96801_BUCK3_VSEL_REG,
+                       .ramp_mask = BD96801_MASK_RAMP_DELAY,
+                       .ramp_delay_table = &buck_ramp_table[0],
+                       .n_ramp_values = ARRAY_SIZE(buck_ramp_table),
+                       .owner = THIS_MODULE,
+               },
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&buck3_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(buck3_irqinfo),
+               },
+               .init_ranges = bd96805_buck_init_volts,
+               .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts),
+       }, {
+               .desc = {
+                       .name = "buck4",
+                       .of_match = of_match_ptr("buck4"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_BUCK4,
+                       .ops = &bd96801_buck_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96805_tune_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96805_tune_volts),
+                       .n_voltages = BD96805_BUCK_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_BUCK4_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_BUCK4_VSEL_REG,
+                       .vsel_mask = BD96805_BUCK_VSEL_MASK,
+                       .ramp_reg = BD96801_BUCK4_VSEL_REG,
+                       .ramp_mask = BD96801_MASK_RAMP_DELAY,
+                       .ramp_delay_table = &buck_ramp_table[0],
+                       .n_ramp_values = ARRAY_SIZE(buck_ramp_table),
+                       .owner = THIS_MODULE,
+               },
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&buck4_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(buck4_irqinfo),
+               },
+               .init_ranges = bd96805_buck_init_volts,
+               .num_ranges = ARRAY_SIZE(bd96805_buck_init_volts),
+       }, {
+               .desc = {
+                       .name = "ldo5",
+                       .of_match = of_match_ptr("ldo5"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_LDO5,
+                       .ops = &bd96801_ldo_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96801_ldo_int_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts),
+                       .n_voltages = BD96801_LDO_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_LDO5_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_LDO5_VSEL_REG,
+                       .vsel_mask = BD96801_LDO_VSEL_MASK,
+                       .owner = THIS_MODULE,
+               },
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&ldo5_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(ldo5_irqinfo),
+               },
+               .ldo_vol_lvl = BD96801_LDO5_VOL_LVL_REG,
+       }, {
+               .desc = {
+                       .name = "ldo6",
+                       .of_match = of_match_ptr("ldo6"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_LDO6,
+                       .ops = &bd96801_ldo_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96801_ldo_int_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts),
+                       .n_voltages = BD96801_LDO_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_LDO6_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_LDO6_VSEL_REG,
+                       .vsel_mask = BD96801_LDO_VSEL_MASK,
+                       .owner = THIS_MODULE,
+               },
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&ldo6_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(ldo6_irqinfo),
+               },
+               .ldo_vol_lvl = BD96801_LDO6_VOL_LVL_REG,
+       }, {
+               .desc = {
+                       .name = "ldo7",
+                       .of_match = of_match_ptr("ldo7"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD96801_LDO7,
+                       .ops = &bd96801_ldo_ops,
+                       .type = REGULATOR_VOLTAGE,
+                       .linear_ranges = bd96801_ldo_int_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd96801_ldo_int_volts),
+                       .n_voltages = BD96801_LDO_VOLTS,
+                       .enable_reg = BD96801_REG_ENABLE,
+                       .enable_mask = BD96801_LDO7_EN_MASK,
+                       .enable_is_inverted = true,
+                       .vsel_reg = BD96801_LDO7_VSEL_REG,
+                       .vsel_mask = BD96801_LDO_VSEL_MASK,
+                       .owner = THIS_MODULE,
+               },
+               .irq_desc = {
+                       .irqinfo = (struct bd96801_irqinfo *)&ldo7_irqinfo[0],
+                       .num_irqs = ARRAY_SIZE(ldo7_irqinfo),
+               },
+               .ldo_vol_lvl = BD96801_LDO7_VOL_LVL_REG,
+       },
+       },
+       .num_regulators = 7,
+};
+
 static int initialize_pmic_data(struct platform_device *pdev,
                                struct bd96801_pmic_data *pdata)
 {
@@ -1056,6 +1263,7 @@ static int bd96801_probe(struct platform_device *pdev)
 static const struct platform_device_id bd96801_pmic_id[] = {
        { "bd96801-regulator", (kernel_ulong_t)&bd96801_data },
        { "bd96802-regulator", (kernel_ulong_t)&bd96802_data },
+       { "bd96805-regulator", (kernel_ulong_t)&bd96805_data },
        { },
 };
 MODULE_DEVICE_TABLE(platform, bd96801_pmic_id);