Commit efdab64d authored by Marcello Sylvester Bauer's avatar Marcello Sylvester Bauer Committed by Guenter Roeck

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: default avatarMarcello Sylvester Bauer <sylv@sylv.io>
Link: https://lore.kernel.org/r/fa6a4b636a05ecb337d132824efca2545188a2a2.1646214248.git.sylv@sylv.ioSigned-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent ff4670ed
...@@ -5,6 +5,10 @@ Kernel driver xdpe122 ...@@ -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: ...@@ -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.
......
...@@ -76,7 +76,22 @@ static int xdpe122_identify(struct i2c_client *client, ...@@ -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, ...@@ -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 = { ...@@ -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) ...@@ -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[] = { ...@@ -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"},
{} {}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment