mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
hwmon: (pmbus/tps25990) Rework driver for multi-device support
Rework existing implementation to allow adding support for new devices to the existing driver. chip_id is used to identify the current device and differentiate logic where needed. Changes include: - Add an enum listing supported chips - Add a structure to hold per-device m, b, R coefficients Signed-off-by: Stoyan Bogdanov <sbogdanov@baylibre.com> Link: https://patch.msgid.link/20260817101455.3526260-2-sbogdanov@baylibre.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
9d5443e2cd
commit
83e3d1372e
|
|
@ -47,6 +47,15 @@
|
|||
PK_MIN_AVG_RST_AVG | \
|
||||
PK_MIN_AVG_RST_MIN)
|
||||
|
||||
enum chips {
|
||||
tps25990,
|
||||
};
|
||||
|
||||
struct tps25990_data {
|
||||
struct pmbus_driver_info info;
|
||||
enum chips chip_id;
|
||||
};
|
||||
|
||||
/*
|
||||
* Arbitrary default Rimon value: 1kOhm
|
||||
* This correspond to an overcurrent limit of 55A, close to the specified limit
|
||||
|
|
@ -337,63 +346,65 @@ static const struct regulator_desc tps25990_reg_desc[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static const struct pmbus_driver_info tps25990_base_info = {
|
||||
.pages = 1,
|
||||
.format[PSC_VOLTAGE_IN] = direct,
|
||||
.m[PSC_VOLTAGE_IN] = 5251,
|
||||
.b[PSC_VOLTAGE_IN] = 0,
|
||||
.R[PSC_VOLTAGE_IN] = -2,
|
||||
.format[PSC_VOLTAGE_OUT] = direct,
|
||||
.m[PSC_VOLTAGE_OUT] = 5251,
|
||||
.b[PSC_VOLTAGE_OUT] = 0,
|
||||
.R[PSC_VOLTAGE_OUT] = -2,
|
||||
.format[PSC_TEMPERATURE] = direct,
|
||||
.m[PSC_TEMPERATURE] = 140,
|
||||
.b[PSC_TEMPERATURE] = 32100,
|
||||
.R[PSC_TEMPERATURE] = -2,
|
||||
/*
|
||||
* Current and Power measurement depends on the ohm value
|
||||
* of Rimon. m is multiplied by 1000 below to have an integer
|
||||
* and -3 is added to R to compensate.
|
||||
*/
|
||||
.format[PSC_CURRENT_IN] = direct,
|
||||
.m[PSC_CURRENT_IN] = 9538,
|
||||
.b[PSC_CURRENT_IN] = 0,
|
||||
.R[PSC_CURRENT_IN] = -6,
|
||||
.format[PSC_POWER] = direct,
|
||||
.m[PSC_POWER] = 4901,
|
||||
.b[PSC_POWER] = 0,
|
||||
.R[PSC_POWER] = -7,
|
||||
.func[0] = (PMBUS_HAVE_VIN |
|
||||
PMBUS_HAVE_VOUT |
|
||||
PMBUS_HAVE_VMON |
|
||||
PMBUS_HAVE_IIN |
|
||||
PMBUS_HAVE_PIN |
|
||||
PMBUS_HAVE_TEMP |
|
||||
PMBUS_HAVE_STATUS_VOUT |
|
||||
PMBUS_HAVE_STATUS_IOUT |
|
||||
PMBUS_HAVE_STATUS_INPUT |
|
||||
PMBUS_HAVE_STATUS_TEMP |
|
||||
PMBUS_HAVE_SAMPLES),
|
||||
.read_word_data = tps25990_read_word_data,
|
||||
.write_word_data = tps25990_write_word_data,
|
||||
.read_byte_data = tps25990_read_byte_data,
|
||||
.write_byte_data = tps25990_write_byte_data,
|
||||
static const struct pmbus_driver_info tps25990_base_info[] = {
|
||||
[tps25990] = {
|
||||
.pages = 1,
|
||||
.format[PSC_VOLTAGE_IN] = direct,
|
||||
.m[PSC_VOLTAGE_IN] = 5251,
|
||||
.b[PSC_VOLTAGE_IN] = 0,
|
||||
.R[PSC_VOLTAGE_IN] = -2,
|
||||
.format[PSC_VOLTAGE_OUT] = direct,
|
||||
.m[PSC_VOLTAGE_OUT] = 5251,
|
||||
.b[PSC_VOLTAGE_OUT] = 0,
|
||||
.R[PSC_VOLTAGE_OUT] = -2,
|
||||
.format[PSC_TEMPERATURE] = direct,
|
||||
.m[PSC_TEMPERATURE] = 140,
|
||||
.b[PSC_TEMPERATURE] = 32100,
|
||||
.R[PSC_TEMPERATURE] = -2,
|
||||
/*
|
||||
* Current and Power measurement depends on the ohm value
|
||||
* of Rimon. m is multiplied by 1000 below to have an integer
|
||||
* and -3 is added to R to compensate.
|
||||
*/
|
||||
.format[PSC_CURRENT_IN] = direct,
|
||||
.m[PSC_CURRENT_IN] = 9538,
|
||||
.b[PSC_CURRENT_IN] = 0,
|
||||
.R[PSC_CURRENT_IN] = -6,
|
||||
.format[PSC_POWER] = direct,
|
||||
.m[PSC_POWER] = 4901,
|
||||
.b[PSC_POWER] = 0,
|
||||
.R[PSC_POWER] = -7,
|
||||
.func[0] = (PMBUS_HAVE_VIN |
|
||||
PMBUS_HAVE_VOUT |
|
||||
PMBUS_HAVE_VMON |
|
||||
PMBUS_HAVE_IIN |
|
||||
PMBUS_HAVE_PIN |
|
||||
PMBUS_HAVE_TEMP |
|
||||
PMBUS_HAVE_STATUS_VOUT |
|
||||
PMBUS_HAVE_STATUS_IOUT |
|
||||
PMBUS_HAVE_STATUS_INPUT |
|
||||
PMBUS_HAVE_STATUS_TEMP |
|
||||
PMBUS_HAVE_SAMPLES),
|
||||
.read_word_data = tps25990_read_word_data,
|
||||
.write_word_data = tps25990_write_word_data,
|
||||
.read_byte_data = tps25990_read_byte_data,
|
||||
.write_byte_data = tps25990_write_byte_data,
|
||||
|
||||
#if IS_ENABLED(CONFIG_SENSORS_TPS25990_REGULATOR)
|
||||
.reg_desc = tps25990_reg_desc,
|
||||
.num_regulators = ARRAY_SIZE(tps25990_reg_desc),
|
||||
.reg_desc = tps25990_reg_desc,
|
||||
.num_regulators = ARRAY_SIZE(tps25990_reg_desc),
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
static const struct i2c_device_id tps25990_i2c_id[] = {
|
||||
{ .name = "tps25990" },
|
||||
{ }
|
||||
{ .name = "tps25990", .driver_data = tps25990 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, tps25990_i2c_id);
|
||||
|
||||
static const struct of_device_id tps25990_of_match[] = {
|
||||
{ .compatible = "ti,tps25990" },
|
||||
{ .compatible = "ti,tps25990", .data = (void *)tps25990 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tps25990_of_match);
|
||||
|
|
@ -401,8 +412,9 @@ MODULE_DEVICE_TABLE(of, tps25990_of_match);
|
|||
static int tps25990_probe(struct i2c_client *client)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
struct pmbus_driver_info *info;
|
||||
struct tps25990_data *data;
|
||||
const char *propname;
|
||||
enum chips chip_id;
|
||||
u32 rimon;
|
||||
int ret;
|
||||
|
||||
|
|
@ -415,15 +427,20 @@ static int tps25990_probe(struct i2c_client *client)
|
|||
rimon = TPS25990_DEFAULT_RIMON;
|
||||
}
|
||||
|
||||
info = devm_kmemdup(dev, &tps25990_base_info, sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
chip_id = (enum chips)(unsigned long)i2c_get_match_data(client);
|
||||
|
||||
data = devm_kzalloc(dev, sizeof(struct tps25990_data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Adapt the current and power scale for each instance */
|
||||
tps25990_set_m(&info->m[PSC_CURRENT_IN], rimon);
|
||||
tps25990_set_m(&info->m[PSC_POWER], rimon);
|
||||
data->info = tps25990_base_info[chip_id];
|
||||
data->chip_id = chip_id;
|
||||
|
||||
return pmbus_do_probe(client, info);
|
||||
/* Adapt the current and power scale for each instance */
|
||||
tps25990_set_m(&data->info.m[PSC_CURRENT_IN], rimon);
|
||||
tps25990_set_m(&data->info.m[PSC_POWER], rimon);
|
||||
|
||||
return pmbus_do_probe(client, &data->info);
|
||||
}
|
||||
|
||||
static struct i2c_driver tps25990_driver = {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user