hwmon: (xdpe12284) Add support for xdpe11280

Add support for another Infineon Multi-phase controller chip. The
xdpe11280 uses linear instead of vid data format for VOUT. Detect
VOUT_MODE format during identification and skip the xdpe122 related
adaptions in case it is linear.

Signed-off-by: Marcello Sylvester Bauer <sylv@sylv.io>
Link: https://lore.kernel.org/r/fa6a4b636a05ecb337d132824efca2545188a2a2.1646214248.git.sylv@sylv.io
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Marcello Sylvester Bauer 2022-03-02 10:49:20 +01:00 committed by Guenter Roeck
parent ff4670ed6e
commit efdab64d88
2 changed files with 26 additions and 7 deletions

View File

@ -5,6 +5,10 @@ Kernel driver xdpe122
Supported chips: Supported chips:
* Infineon XDPE11280
Prefix: 'xdpe11280'
* Infineon XDPE12254 * Infineon XDPE12254
Prefix: 'xdpe12254' Prefix: 'xdpe12254'
@ -20,10 +24,10 @@ Authors:
Description Description
----------- -----------
This driver implements support for Infineon Multi-phase XDPE122 family This driver implements support for Infineon Multi-phase XDPE112 and XDPE122
dual loop voltage regulators. family dual loop voltage regulators.
The family includes XDPE12284 and XDPE12254 devices. These families include XDPE11280, XDPE12284 and XDPE12254 devices.
The devices from this family complaint with: The devices from this family compliant with:
- Intel VR13 and VR13HC rev 1.3, IMVP8 rev 1.2 and IMPVP9 rev 1.3 DC-DC - Intel VR13 and VR13HC rev 1.3, IMVP8 rev 1.2 and IMPVP9 rev 1.3 DC-DC
converter specification. converter specification.

View File

@ -76,7 +76,22 @@ static int xdpe122_identify(struct i2c_client *client,
struct pmbus_driver_info *info) struct pmbus_driver_info *info)
{ {
u8 vout_params; u8 vout_params;
int i, ret; int i, ret, vout_mode;
vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
if (vout_mode >= 0 && vout_mode != 0xff) {
switch (vout_mode >> 5) {
case 0:
info->format[PSC_VOLTAGE_OUT] = linear;
return 0;
case 1:
info->format[PSC_VOLTAGE_OUT] = vid;
info->read_word_data = xdpe122_read_word_data;
break;
default:
return -ENODEV;
}
}
for (i = 0; i < XDPE122_PAGE_NUM; i++) { for (i = 0; i < XDPE122_PAGE_NUM; i++) {
/* Read the register with VOUT scaling value.*/ /* Read the register with VOUT scaling value.*/
@ -110,7 +125,6 @@ static int xdpe122_identify(struct i2c_client *client,
static struct pmbus_driver_info xdpe122_info = { static struct pmbus_driver_info xdpe122_info = {
.pages = XDPE122_PAGE_NUM, .pages = XDPE122_PAGE_NUM,
.format[PSC_VOLTAGE_IN] = linear, .format[PSC_VOLTAGE_IN] = linear,
.format[PSC_VOLTAGE_OUT] = vid,
.format[PSC_TEMPERATURE] = linear, .format[PSC_TEMPERATURE] = linear,
.format[PSC_CURRENT_IN] = linear, .format[PSC_CURRENT_IN] = linear,
.format[PSC_CURRENT_OUT] = linear, .format[PSC_CURRENT_OUT] = linear,
@ -124,7 +138,6 @@ static struct pmbus_driver_info xdpe122_info = {
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT, PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT,
.identify = xdpe122_identify, .identify = xdpe122_identify,
.read_word_data = xdpe122_read_word_data,
}; };
static int xdpe122_probe(struct i2c_client *client) static int xdpe122_probe(struct i2c_client *client)
@ -140,6 +153,7 @@ static int xdpe122_probe(struct i2c_client *client)
} }
static const struct i2c_device_id xdpe122_id[] = { static const struct i2c_device_id xdpe122_id[] = {
{"xdpe11280", 0},
{"xdpe12254", 0}, {"xdpe12254", 0},
{"xdpe12284", 0}, {"xdpe12284", 0},
{} {}
@ -148,6 +162,7 @@ static const struct i2c_device_id xdpe122_id[] = {
MODULE_DEVICE_TABLE(i2c, xdpe122_id); MODULE_DEVICE_TABLE(i2c, xdpe122_id);
static const struct of_device_id __maybe_unused xdpe122_of_match[] = { static const struct of_device_id __maybe_unused xdpe122_of_match[] = {
{.compatible = "infineon,xdpe11280"},
{.compatible = "infineon,xdpe12254"}, {.compatible = "infineon,xdpe12254"},
{.compatible = "infineon,xdpe12284"}, {.compatible = "infineon,xdpe12284"},
{} {}