-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hwmon: (pmbus) Add support for Infineon Multi-phase xdpe122 family co…
…ntrollers Add support for devices XDPE12254, XDPE12284. All these device support two pages. The below lists of VOUT_MODE command readout with their related VID protocols, Digital to Analog Converter steps, supported by these devices: VR12.0 mode, 5-mV DAC - 0x01; VR12.5 mode, 10-mV DAC - 0x02; IMVP9 mode, 5-mV DAC - 0x03; AMD mode 6.25mV - 0x10. Signed-off-by: Vadim Pasternak <vadimp@mellanox.com> Link: https://lore.kernel.org/r/20200113150841.17670-5-vadimp@mellanox.com [groeck: Added missing break statement] Signed-off-by: Guenter Roeck <linux@roeck-us.net>
- Loading branch information
Vadim Pasternak
authored and
Guenter Roeck
committed
Jan 23, 2020
1 parent
583dc92
commit aaafb7c
Showing
3 changed files
with
127 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
/* | ||
* Hardware monitoring driver for Infineon Multi-phase Digital VR Controllers | ||
* | ||
* Copyright (c) 2020 Mellanox Technologies. All rights reserved. | ||
*/ | ||
|
||
#include <linux/err.h> | ||
#include <linux/i2c.h> | ||
#include <linux/init.h> | ||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include "pmbus.h" | ||
|
||
#define XDPE122_PROT_VR12_5MV 0x01 /* VR12.0 mode, 5-mV DAC */ | ||
#define XDPE122_PROT_VR12_5_10MV 0x02 /* VR12.5 mode, 10-mV DAC */ | ||
#define XDPE122_PROT_IMVP9_10MV 0x03 /* IMVP9 mode, 10-mV DAC */ | ||
#define XDPE122_AMD_625MV 0x10 /* AMD mode 6.25mV */ | ||
#define XDPE122_PAGE_NUM 2 | ||
|
||
static int xdpe122_identify(struct i2c_client *client, | ||
struct pmbus_driver_info *info) | ||
{ | ||
u8 vout_params; | ||
int i, ret; | ||
|
||
for (i = 0; i < XDPE122_PAGE_NUM; i++) { | ||
/* Read the register with VOUT scaling value.*/ | ||
ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE); | ||
if (ret < 0) | ||
return ret; | ||
|
||
vout_params = ret & GENMASK(4, 0); | ||
|
||
switch (vout_params) { | ||
case XDPE122_PROT_VR12_5_10MV: | ||
info->vrm_version[i] = vr13; | ||
break; | ||
case XDPE122_PROT_VR12_5MV: | ||
info->vrm_version[i] = vr12; | ||
break; | ||
case XDPE122_PROT_IMVP9_10MV: | ||
info->vrm_version[i] = imvp9; | ||
break; | ||
case XDPE122_AMD_625MV: | ||
info->vrm_version[i] = amd625mv; | ||
break; | ||
default: | ||
return -EINVAL; | ||
} | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static struct pmbus_driver_info xdpe122_info = { | ||
.pages = XDPE122_PAGE_NUM, | ||
.format[PSC_VOLTAGE_IN] = linear, | ||
.format[PSC_VOLTAGE_OUT] = vid, | ||
.format[PSC_TEMPERATURE] = linear, | ||
.format[PSC_CURRENT_IN] = linear, | ||
.format[PSC_CURRENT_OUT] = linear, | ||
.format[PSC_POWER] = linear, | ||
.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | | ||
PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | | ||
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | | ||
PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT, | ||
.func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | | ||
PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | | ||
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | | ||
PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT, | ||
.identify = xdpe122_identify, | ||
}; | ||
|
||
static int xdpe122_probe(struct i2c_client *client, | ||
const struct i2c_device_id *id) | ||
{ | ||
struct pmbus_driver_info *info; | ||
|
||
info = devm_kmemdup(&client->dev, &xdpe122_info, sizeof(*info), | ||
GFP_KERNEL); | ||
if (!info) | ||
return -ENOMEM; | ||
|
||
return pmbus_do_probe(client, id, info); | ||
} | ||
|
||
static const struct i2c_device_id xdpe122_id[] = { | ||
{"xdpe12254", 0}, | ||
{"xdpe12284", 0}, | ||
{} | ||
}; | ||
|
||
MODULE_DEVICE_TABLE(i2c, xdpe122_id); | ||
|
||
static const struct of_device_id __maybe_unused xdpe122_of_match[] = { | ||
{.compatible = "infineon, xdpe12254"}, | ||
{.compatible = "infineon, xdpe12284"}, | ||
{} | ||
}; | ||
MODULE_DEVICE_TABLE(of, xdpe122_of_match); | ||
|
||
static struct i2c_driver xdpe122_driver = { | ||
.driver = { | ||
.name = "xdpe12284", | ||
.of_match_table = of_match_ptr(xdpe122_of_match), | ||
}, | ||
.probe = xdpe122_probe, | ||
.remove = pmbus_do_remove, | ||
.id_table = xdpe122_id, | ||
}; | ||
|
||
module_i2c_driver(xdpe122_driver); | ||
|
||
MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>"); | ||
MODULE_DESCRIPTION("PMBus driver for Infineon XDPE122 family"); | ||
MODULE_LICENSE("GPL"); |