On Thu, May 04, 2023 at 10:30:27AM +0200, Mårten Lindahl wrote:I understand. I'll change it. Explanation below why I did it like this.
+static int tps6287x_get_voltage(struct regulator_dev *rdev)Don't open code the voltage conversion, just use selectors - in which
+{
+ struct device *dev = rdev_get_dev(rdev);
+ struct tps6287x_chip *chip =
+ i2c_get_clientdata(to_i2c_client(dev->parent));
+ unsigned int val;
+ int ret;
+
+ ret = regmap_read(rdev->regmap, TPS6287X_VSET, &val);
+ if (ret != 0)
+ return -ENOTRECOVERABLE;
+
+ return (val * chip->uv_step) + rdev->constraints->min_uV;
+}
case you can simply describe the bitfield that the device has and use
the generic regmap helpers.
The driver should also never be referring to constraints to figure out
what the register values mean, this is just not going to work - boards
will typically be able to use far fewer voltages than the regulator
supports.
Also try to avoid squashing error codes, just pass the result back.
+static int tps6287x_set_voltage(struct regulator_dev *rdev, int min_uv,Similarly here, describe the bitfield and use the generic helpers.
+ int max_uv, unsigned int *selector)
+static int tps6287x_setup_vrange(struct tps6287x_chip *chip)No, as I said above the driver should just know what the device
+{
+ struct regulator_dev *rdev = chip->rdev;
+ unsigned int val, r;
+ bool found = false;
+ int ret;
+
+ /*
+ * Match DT voltage range to one of the predefined ranges,
+ * and configure the regulator with the selected range.
+ */
+ for (r = 0; r < ARRAY_SIZE(tps6287x_voltage_table); r++) {
+ if (tps6287x_voltage_table[r][0] == rdev->constraints->min_uV &&
+ tps6287x_voltage_table[r][1] == rdev->constraints->max_uV) {
+ found = true;
+ break;
+ }
+ }
supports based on the device ID. In general if a regulator driver is
looking at the constraints that indicates that it's doing something
wrong, the purpose of constraints is to grant permission for the
features of the regulator to be used on the board.
+static const struct of_device_id tps6287x_dt_ids[] = {Use the .data field here...
+ { .compatible = "ti,tps62870", },
+ { .compatible = "ti,tps62871", },
+ { .compatible = "ti,tps62872", },
+ { .compatible = "ti,tps62873", },
+ { }
+};
+static const struct i2c_device_id tps6287x_i2c_id[] = {...and here to enumerate which of the variants is being used and hence
+ { "tps62870", 0 },
+ { "tps62871", 0 },
+ { "tps62872", 0 },
+ { "tps62873", 0 },
+ {},
+};
which voltage range is required.