On Wed, Jan 08, 2020 at 02:11:39PM +0000, Vadim Pasternak wrote: > Add support for devices XDPE12250, XDPE12254, XDPE12283, XDPE12284, > XDPE12286. > > 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@xxxxxxxxxxxx> > --- > drivers/hwmon/pmbus/Kconfig | 9 +++ > drivers/hwmon/pmbus/Makefile | 1 + > drivers/hwmon/pmbus/xdpe12284.c | 121 ++++++++++++++++++++++++++++++++++++++++ Please also provide Documentation/hwmon/xdpe12284.rst. That we don't have that for the TI chips is an oversight from my side and not a reason to skip it here. Thanks, Guenter > 3 files changed, 131 insertions(+) > create mode 100644 drivers/hwmon/pmbus/xdpe12284.c > > diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig > index 0dd30b07bf18..ae6eb02419e6 100644 > --- a/drivers/hwmon/pmbus/Kconfig > +++ b/drivers/hwmon/pmbus/Kconfig > @@ -228,6 +228,15 @@ config SENSORS_UCD9200 > This driver can also be built as a module. If so, the module will > be called ucd9200. > > +config SENSORS_XDPE122 > + tristate "Infineon XDPE122 family" > + help > + If you say yes here you get hardware monitoring support for Infineon > + XDPE12250, XDPE12254, XDPE12283, XDPE12284, XDPE12286 devices. > + > + This driver can also be built as a module. If so, the module will > + be called xdpe12284. > + > config SENSORS_ZL6100 > tristate "Intersil ZL6100 and compatibles" > help > diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile > index 3f8c1014938b..5421fcc0a01c 100644 > --- a/drivers/hwmon/pmbus/Makefile > +++ b/drivers/hwmon/pmbus/Makefile > @@ -26,4 +26,5 @@ obj-$(CONFIG_SENSORS_TPS40422) += tps40422.o > obj-$(CONFIG_SENSORS_TPS53679) += tps53679.o > obj-$(CONFIG_SENSORS_UCD9000) += ucd9000.o > obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o > +obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o > obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o > diff --git a/drivers/hwmon/pmbus/xdpe12284.c b/drivers/hwmon/pmbus/xdpe12284.c > new file mode 100644 > index 000000000000..91162cfe1be6 > --- /dev/null > +++ b/drivers/hwmon/pmbus/xdpe12284.c > @@ -0,0 +1,121 @@ > +// 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; > + 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_OUT] = linear, > + .format[PSC_POWER] = linear, > + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | > + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | > + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | > + PMBUS_HAVE_POUT, > + .func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | > + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | > + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | > + PMBUS_HAVE_POUT, > + .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[] = { > + {"xdpe12250", 0}, > + {"xdpe12254", 0}, > + {"xdpe12283", 0}, > + {"xdpe12284", 0}, > + {"xdpe12286", 0}, > + {} > +}; > + > +MODULE_DEVICE_TABLE(i2c, xdpe122_id); > + > +static const struct of_device_id __maybe_unused xdpe122_of_match[] = { > + {.compatible = "infineon, xdpe12250"}, > + {.compatible = "infineon, xdpe12254"}, > + {.compatible = "infineon, xdpe12283"}, > + {.compatible = "infineon, xdpe12284"}, > + {.compatible = "infineon, xdpe12286"}, > + {} > +}; > +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@xxxxxxxxxxxx>"); > +MODULE_DESCRIPTION("PMBus driver for Infineon XDPE122 family"); > +MODULE_LICENSE("GPL");