mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 13:23:02 -04:00
hwmon: (pmbus/max20830): add support for max20830c and max20840c
Add support for MAX20830C and MAX20840 step-down DC-DC switching regulator with PMBus interface. MAX20830C is a different packaging for MAX20830, and MAX20840C supports 40A regulation compared to MAX20830 that is only 30A. Signed-off-by: Alexis Czezar Torreno <alexisczezar.torreno@analog.com> Link: https://lore.kernel.org/r/20260730-dev-max20830c-v5-4-a7553f84ee74@analog.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
committed by
Guenter Roeck
parent
b60e4b3ae1
commit
4cdcd4789f
@@ -13,6 +13,22 @@ Supported chips:
|
||||
|
||||
Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/max20830.pdf
|
||||
|
||||
* Analog Devices MAX20830C
|
||||
|
||||
Prefix: 'max20830c'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet:
|
||||
|
||||
* Analog Devices MAX20840C
|
||||
|
||||
Prefix: 'max20840c'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet:
|
||||
|
||||
Author:
|
||||
|
||||
- Alexis Czezar Torreno <alexisczezar.torreno@analog.com>
|
||||
@@ -21,12 +37,13 @@ Author:
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware monitoring for Analog Devices MAX20830
|
||||
Step-Down Switching Regulator with PMBus Interface.
|
||||
This driver supports hardware monitoring for Analog Devices MAX20830, MAX20830C
|
||||
and MAX20840C. These are Step-Down Switching Regulator with PMBus Interface.
|
||||
|
||||
The MAX20830 is a 2.7V to 16V, 30A fully integrated step-down DC-DC switching
|
||||
regulator. Through the PMBus interface, the device can monitor input/output
|
||||
voltages, output current and temperature.
|
||||
MAX20830, and MAX20830C are 2.7V to 16V, 30A fully integrated step-down DC-DC
|
||||
switching regulators. MAX20840C is similar but can reach 40A. Through the PMBus
|
||||
interface, these devices can monitor input/output voltages, output current and
|
||||
temperature.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
|
||||
|
||||
@@ -394,10 +394,10 @@ config SENSORS_MAX20751
|
||||
be called max20751.
|
||||
|
||||
config SENSORS_MAX20830
|
||||
tristate "Analog Devices MAX20830"
|
||||
tristate "Analog Devices MAX20830 and compatibles"
|
||||
help
|
||||
If you say yes here you get hardware monitoring support for Analog
|
||||
Devices MAX20830.
|
||||
Devices MAX20830, MAX20830C, and MAX20840C.
|
||||
|
||||
This driver can also be built as a module. If so, the module will
|
||||
be called max20830.
|
||||
|
||||
@@ -20,6 +20,12 @@ struct max20830_data {
|
||||
u32 vout_rfb2;
|
||||
};
|
||||
|
||||
static const char * const supported_chip_ids[] = {
|
||||
"MAX20830",
|
||||
"MAX20830C",
|
||||
"MAX20840C",
|
||||
};
|
||||
|
||||
/*
|
||||
* MAX20830 only supports READ_VOUT for VOUT monitoring.
|
||||
*
|
||||
@@ -83,7 +89,7 @@ static int max20830_probe(struct i2c_client *client)
|
||||
{
|
||||
u8 buf[I2C_SMBUS_BLOCK_MAX + 1] = {};
|
||||
struct max20830_data *data;
|
||||
int ret;
|
||||
int i, ret;
|
||||
|
||||
data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
@@ -105,13 +111,12 @@ static int max20830_probe(struct i2c_client *client)
|
||||
* which do not support SMBus block reads.
|
||||
*/
|
||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BLOCK_DATA)) {
|
||||
/* Reads 9 Data bytes from MAX20830 */
|
||||
ret = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, buf);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(&client->dev, ret,
|
||||
"Failed to read IC_DEVICE_ID\n");
|
||||
} else {
|
||||
/* Reads 1 length byte + 9 Data bytes from MAX20830 */
|
||||
/* Reads 1 length byte + data bytes */
|
||||
ret = i2c_smbus_read_i2c_block_data(client, PMBUS_IC_DEVICE_ID,
|
||||
MAX20830_IC_DEVICE_ID_LENGTH + 1,
|
||||
buf);
|
||||
@@ -127,20 +132,25 @@ static int max20830_probe(struct i2c_client *client)
|
||||
ret = ret - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* MAX20830 IC_DEVICE_ID sends string data "MAX20830\0".
|
||||
* Return value should at least be 9 bytes of data.
|
||||
*/
|
||||
/* Verify we read the expected number of bytes */
|
||||
if (ret < MAX20830_IC_DEVICE_ID_LENGTH)
|
||||
return dev_err_probe(&client->dev, -ENODEV,
|
||||
"IC_DEVICE_ID too short: expected at least 9 bytes, got %d\n",
|
||||
ret);
|
||||
"IC_DEVICE_ID too short: expected %d bytes, got %d\n",
|
||||
MAX20830_IC_DEVICE_ID_LENGTH, ret);
|
||||
|
||||
/* 9 bytes of data, buf[0]-buf[7] = "MAX20830", buf[8] = '\0' */
|
||||
buf[MAX20830_IC_DEVICE_ID_LENGTH - 1] = '\0';
|
||||
if (strncmp(buf, "MAX20830", MAX20830_IC_DEVICE_ID_LENGTH - 1))
|
||||
/* Null-terminate the string */
|
||||
buf[ret] = '\0';
|
||||
|
||||
/* Verify the device ID matches what we expect */
|
||||
for (i = 0; i < ARRAY_SIZE(supported_chip_ids); i++) {
|
||||
if (!strcmp(buf, supported_chip_ids[i]))
|
||||
break;
|
||||
}
|
||||
|
||||
/* No match found - unsupported device */
|
||||
if (i == ARRAY_SIZE(supported_chip_ids))
|
||||
return dev_err_probe(&client->dev, -ENODEV,
|
||||
"Unsupported device: '%s'\n", buf);
|
||||
"Unsupported device: '%*pE'\n", ret, buf);
|
||||
|
||||
return pmbus_do_probe(client, &data->info);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user