Add support for MPS Multi-phase mp2888 controller
Subsystems (3)
v2 cover Add support for MPS Multi-phase mp2888 controller
Add driver and documentation for mp2888 device from Monolithic Power Systems, Inc. (MPS) vendor. This is a digital, multi-phase, pulse-width modulation controller.
Patch set includes:
Patch #1 - increases maximum number of phases. Patch #2 - provides mp2888 driver and documentation. Patch #3 - providesy binding documentation.
Vadim Pasternak (3):
hwmon: (pmbus) Increase maximum number of phases per page
hwmon: (pmbus) Add support for MPS Multi-phase mp2888 controller
dt-bindings: Add MP2888 voltage regulator device
.../devicetree/bindings/trivial-devices.yaml | 2 + Documentation/hwmon/mp2888.rst | 111 ++++++ drivers/hwmon/pmbus/Kconfig | 9 + drivers/hwmon/pmbus/Makefile | 1 + drivers/hwmon/pmbus/mp2888.c | 373 +++++++++++++++++++++ drivers/hwmon/pmbus/pmbus.h | 2 +- 6 files changed, 497 insertions(+), 1 deletion(-) create mode 100644 Documentation/hwmon/mp2888.rst create mode 100644 drivers/hwmon/pmbus/mp2888.c
Signature · 1 line
2.11.0
PATCH v2 1/3 hwmon: (pmbus) Increase maximum number of phases per page
Increase maximum number of phases from 8 to 10 to support multi-phase devices allowing up to 10 phases.
--- drivers/hwmon/pmbus/pmbus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/pmbus/pmbus.h +1 -1
@@ -375,7 +375,7 @@ enum pmbus_sensor_classes { };#define PMBUS_PAGES 32/* Per PMBus specification */ -#define PMBUS_PHASES 8/* Maximum number of phases per page */ +#define PMBUS_PHASES 10/* Maximum number of phases per page */ /* Functionality bit mask */ #define PMBUS_HAVE_VIN BIT(0)
Signature · 1 line
2.11.0
PATCH v2 2/3 hwmon: (pmbus) Add support for MPS Multi-phase mp2888 controller
In reply to Vadim PasternakAdd support for mp2888 device from Monolithic Power Systems, Inc. (MPS) vendor. This is a digital, multi-phase, pulse-width modulation controller.
This device supports:
- One power rail.
- Programmable Multi-Phase up to 10 Phases.
- PWM-VID Interface
- One pages 0 for telemetry.
- Programmable pins for PMBus Address.
- Built-In EEPROM to Store Custom Configurations.
- Can configured VOUT readout in direct or VID format and allows setting of different formats on rails 1 and 2. For VID the following protocols are available: VR13 mode with 5-mV DAC; VR13 mode with 10-mV DAC, IMVP9 mode with 5-mV DAC.
---v1->v2:
Comments pointed out by Guenter:
- Use standard access for getting PMBUS_OT_WARN_LIMIT, PMBUS_VIN_OV_FAULT_LIMIT, PMBUS_VIN_UV_WARN_LIMIT.
- Use linear11 conversion for PMBUS_READ_VIN, PMBUS_READ_POUT, PMBUS_READ_PIN, PMBUS_READ_TEMPERATURE_1 and adjust coefficients.
- Add reading phases current from the dedicated registers.
- Add comment for not implemented or implemented not according to the spec registers, for which "ENXIO" code is returned.
- Set PMBUS_HAVE_IOUT" statically.
Notes from Vadim:
- READ_IOUT uses direct format, so I did not adjust it like the below registers.
--- Documentation/hwmon/mp2888.rst | 111 ++++++++++++ drivers/hwmon/pmbus/Kconfig | 9 + drivers/hwmon/pmbus/Makefile | 1 + drivers/hwmon/pmbus/mp2888.c | 373 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 494 insertions(+) create mode 100644 Documentation/hwmon/mp2888.rst create mode 100644 drivers/hwmon/pmbus/mp2888.c
Documentation/hwmon/mp2888.rst new file +111 -0
@@ -0,0 +1,111 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Kernel driver mp2888 +==================== + +Supported chips: + + * MPS MP12254 + + Prefix: 'mp2888' + +Author: + + Vadim Pasternak <[email protected]> + +Description +----------- + +This driver implements support for Monolithic Power Systems, Inc. (MPS) +vendor dual-loop, digital, multi-phase controller MP2888. + +This device: supports: + +- One power rail. +- Programmable Multi-Phase up to 10 Phases. +- PWM-VID Interface +- One pages 0 for telemetry. +- Programmable pins for PMBus Address. +- Built-In EEPROM to Store Custom Configurations. + +Device complaint with: + +- PMBus rev 1.3 interface. + +Device supports direct format for reading output current, output voltage, +input and output power and temperature. +Device supports linear format for reading input voltage and input power. + +The driver provides the next attributes for the current: + +- for current out input and maximum alarm; +- for phase current: input and label. + +The driver exports the following attributes via the 'sysfs' files, where: + +- 'n' is number of configured phases (from 1 to 10); +- index 1 for "iout"; +- indexes 2 ... 1 + n for phases. + +**curr1_alarm** + +**curr[1-{1+n}]_input** + +**curr[1-{1+n}]_label** + +The driver provides the next attributes for the voltage: + +- for voltage in: input, low and high critical thresholds, low and high + critical alarms; +- for voltage out: input and high alarm; + +The driver exports the following attributes via the 'sysfs' files, where + +**in1_crit** + +**in1_crit_alarm** + +**in1_input** + +**in1_label** + +**in1_min** + +**in1_min_alarm** + +**in2_alarm** + +**in2_input** + +**in2_label** + +The driver provides the next attributes for the power: + +- for power in alarm and input. +- for power out: cap, cap alarm an input. + +The driver exports the following attributes via the 'sysfs' files, where +- indexes 1 for "pin"; +- indexes 2 for "pout"; + +**power1_alarm** + +**power1_input** + +**power1_label** + +**power2_cap** + +**power2_cap_alarm** + +**power2_input** + +**power2_label** + +The driver provides the next attributes for the temperature: + +**temp1_input** + +**temp1_max** + +**temp1_max_alarm**
drivers/hwmon/pmbus/Kconfig +9 -0
@@ -211,6 +211,15 @@ config SENSORS_MAX8688 This driver can also be built as a module. If so, the module will be called max8688. +config SENSORS_MP2888 + tristate "MPS MP2888" + help + If you say yes here you get hardware monitoring support for MPS + MP2888 Digital, Multi-Phase, Pulse-Width Modulation Controller. + + This driver can also be built as a module. If so, the module will + be called mp2888. + config SENSORS_MP2975 tristate "MPS MP2975" help
drivers/hwmon/pmbus/Makefile +1 -0
@@ -24,6 +24,7 @@ obj-$(CONFIG_SENSORS_MAX20751) += max20751.o obj-$(CONFIG_SENSORS_MAX31785) += max31785.o obj-$(CONFIG_SENSORS_MAX34440) += max34440.o obj-$(CONFIG_SENSORS_MAX8688) += max8688.o +obj-$(CONFIG_SENSORS_MP2888) += mp2888.o obj-$(CONFIG_SENSORS_MP2975) += mp2975.o obj-$(CONFIG_SENSORS_PM6764TR) += pm6764tr.o obj-$(CONFIG_SENSORS_PXE1610) += pxe1610.o
drivers/hwmon/pmbus/mp2888.c new file +373 -0
373 lines not on this page · raw message
Signature · 1 line
2.11.0
kernel test robot
build botRe: [PATCH hwmon-next v2 2/3] hwmon: (pmbus) Add support for MPS Multi-phase mp2888 controller
I love your patch! Yet something to improve:
Hi Vadim,
I love your patch! Yet something to improve:
[auto build test ERROR on hwmon/hwmon-next]
[also build test ERROR on robh/for-next v5.12-rc8 next-20210419] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Vadim-Pasternak/Add-support-for-MPS-Multi-phase-mp2888-controller/20210419-210711 base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next config: sh-allmodconfig (attached as .config) compiler: sh4-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/d106a4d0141a89fe7b41d016067a7dbba730c932
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Vadim-Pasternak/Add-support-for-MPS-Multi-phase-mp2888-controller/20210419-210711 git checkout d106a4d0141a89fe7b41d016067a7dbba730c932
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross W=1 ARCH=sh
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> ERROR: modpost: "__udivdi3" [drivers/hwmon/pmbus/mp2888.ko] undefined! >> ERROR: modpost: "__divdi3" [drivers/hwmon/pmbus/mp2888.ko] undefined!
ERROR: modpost: "__delay" [drivers/net/mdio/mdio-cavium.ko] undefined!
ERROR: modpost: "__udivdi3" [fs/btrfs/btrfs.ko] undefined!
ERROR: modpost: "__umoddi3" [fs/btrfs/btrfs.ko] undefined!
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for SND_ATMEL_SOC_PDC
Depends on SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC && HAS_DMA Selected by
- SND_ATMEL_SOC_SSC && SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC
- SND_ATMEL_SOC_SSC_PDC && SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC && ATMEL_SSC
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
Guenter Roeck
maintainerRe: [PATCH hwmon-next v2 2/3] hwmon: (pmbus) Add support for MPS Multi-phase mp2888 controller
In reply to Vadim PasternakQuoted 380 lines · Vadim Pasternak
Add support for mp2888 device from Monolithic Power Systems, Inc. (MPS) vendor. This is a digital, multi-phase, pulse-width modulation controller.
This device supports:
- One power rail.
- Programmable Multi-Phase up to 10 Phases.
- PWM-VID Interface
- One pages 0 for telemetry.
- Programmable pins for PMBus Address.
- Built-In EEPROM to Store Custom Configurations.
- Can configured VOUT readout in direct or VID format and allows setting of different formats on rails 1 and 2. For VID the following protocols are available: VR13 mode with 5-mV DAC; VR13 mode with 10-mV DAC, IMVP9 mode with 5-mV DAC.Signed-off-by Vadim Pasternak <[email protected]>---
v1->v2:
Comments pointed out by Guenter:
- Use standard access for gettingPMBUS_OT_WARN_LIMIT,PMBUS_VIN_OV_FAULT_LIMIT,PMBUS_VIN_UV_WARN_LIMIT.
- Use linear11 conversion forPMBUS_READ_VIN,PMBUS_READ_POUT,PMBUS_READ_PIN,PMBUS_READ_TEMPERATURE_1and adjust coefficients.
- Add reading phases current from the dedicated registers.
- Add comment for not implemented or implemented not according to the spec registers, for which "ENXIO" code is returned.
- SetPMBUS_HAVE_IOUT" statically.
Notes from Vadim:
-READ_IOUTuses direct format, so I did not adjust it like the below registers.--- Documentation/hwmon/mp2888.rst | 111 ++++++++++++ drivers/hwmon/pmbus/Kconfig | 9 + drivers/hwmon/pmbus/Makefile | 1 + drivers/hwmon/pmbus/mp2888.c | 373 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 494 insertions(+) create mode 100644 Documentation/hwmon/mp2888.rst create mode 100644 drivers/hwmon/pmbus/mp2888.cDocumentation/hwmon/mp2888.rst new file +111
-0@@ -0,0 +1,111 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Kernel driver mp2888 +==================== + +Supported chips: + + * MPS MP12254 + + Prefix: 'mp2888' + +Author: + + Vadim Pasternak <[email protected]> + +Description +----------- + +This driver implements support for Monolithic Power Systems, Inc. (MPS) +vendor dual-loop, digital, multi-phase controller MP2888. + +This device: supports: + +- One power rail. +- Programmable Multi-Phase up to 10 Phases. +- PWM-VID Interface +- One pages 0 for telemetry. +- Programmable pins for PMBus Address. +- Built-In EEPROM to Store Custom Configurations. + +Device complaint with: + +- PMBus rev 1.3 interface. + +Device supports direct format for reading output current, output voltage, +input and output power and temperature. +Device supports linear format for reading input voltage and input power. + +The driver provides the next attributes for the current: + +- for current out input and maximum alarm; +- for phase current: input and label. + +The driver exports the following attributes via the 'sysfs' files, where: + +- 'n' is number of configured phases (from 1 to 10); +- index 1 for "iout"; +- indexes 2 ... 1 + n for phases. + +**curr1_alarm** + +**curr[1-{1+n}]_input** + +**curr[1-{1+n}]_label** + +The driver provides the next attributes for the voltage: + +- for voltage in: input, low and high critical thresholds, low and high + critical alarms; +- for voltage out: input and high alarm; + +The driver exports the following attributes via the 'sysfs' files, where + +**in1_crit** + +**in1_crit_alarm** + +**in1_input** + +**in1_label** + +**in1_min** + +**in1_min_alarm** + +**in2_alarm** + +**in2_input** + +**in2_label** + +The driver provides the next attributes for the power: + +- for power in alarm and input. +- for power out: cap, cap alarm an input. + +The driver exports the following attributes via the 'sysfs' files, where +- indexes 1 for "pin"; +- indexes 2 for "pout"; + +**power1_alarm** + +**power1_input** + +**power1_label** + +**power2_cap** + +**power2_cap_alarm** + +**power2_input** + +**power2_label** + +The driver provides the next attributes for the temperature: + +**temp1_input** + +**temp1_max** + +**temp1_max_alarm**drivers/hwmon/pmbus/Kconfig +9
-0@@ -211,6 +211,15 @@ config SENSORS_MAX8688 This driver can also be built as a module. If so, the module will be called max8688. +config SENSORS_MP2888 + tristate "MPS MP2888" + help + If you say yes here you get hardware monitoring support for MPS + MP2888 Digital, Multi-Phase, Pulse-Width Modulation Controller. + + This driver can also be built as a module. If so, the module will + be called mp2888. + config SENSORS_MP2975 tristate "MPS MP2975" helpdrivers/hwmon/pmbus/Makefile +1
-0@@ -24,6 +24,7 @@ obj-$(CONFIG_SENSORS_MAX20751) += max20751.o obj-$(CONFIG_SENSORS_MAX31785) += max31785.o obj-$(CONFIG_SENSORS_MAX34440) += max34440.o obj-$(CONFIG_SENSORS_MAX8688) += max8688.o +obj-$(CONFIG_SENSORS_MP2888) += mp2888.o obj-$(CONFIG_SENSORS_MP2975) += mp2975.o obj-$(CONFIG_SENSORS_PM6764TR) += pm6764tr.o obj-$(CONFIG_SENSORS_PXE1610) += pxe1610.odrivers/hwmon/pmbus/mp2888.c new file +185
-0@@ -0,0 +1,373 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Hardware monitoring driver for MPS Multi-phase Digital VR Controllers +* +* Copyright (C) 2020 Nvidia Technologies Ltd. +*/ + +#include <linux/err.h> +#include <linux/i2c.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include "pmbus.h" + +/* Vendor specific registers. */ +#define MP2888_MFR_SYS_CONFIG 0x44 +#define MP2888_MFR_READ_CS1_2 0x73 +#define MP2888_MFR_READ_CS3_4 0x74 +#define MP2888_MFR_READ_CS5_6 0x75 +#define MP2888_MFR_READ_CS7_8 0x76 +#define MP2888_MFR_READ_CS9_10 0x77 +#define MP2888_MFR_VR_CONFIG1 0xe1 + +#define MP2888_TOTAL_CURRENT_RESOLUTION BIT(3) +#define MP2888_PHASE_CURRENT_RESOLUTION BIT(4) +#define MP2888_DRMOS_KCS GENMASK(2, 0) +#define MP2888_VIN_LIMIT_UNIT 8 +#define MP2888_VIN_UNIT 3125 +#define MP2888_TEMP_UNIT 10 +#define MP2888_MAX_PHASE 10 + +struct mp2888_data { +struct pmbus_driver_info info; +int total_curr_resolution; +int phase_curr_resolution; +int curr_sense_gain; +}; + +#define to_mp2888_data (x) container_of(x, struct mp2888_data, info) + +static int mp2888_read_byte_data (struct i2c_client *client,int page,int reg) +{ +switch (reg) { +case PMBUS_VOUT_MODE : +/* Enforce VOUT direct format. */ +return PB_VOUT_MODE_DIRECT ; +default : +return -ENODATA ; + } +} + +/* Convert linear sensor values to milli- or micro-units depending on sensor type. */ +static s64 mp2888_reg2data_linear11 (int data,enum pmbus_sensor_classes class) +{ +s16 exponent; +s32 mantissa; +s64 val; + + exponent = ((s16 )data) >>11 ; + mantissa = ((s16)((data &0x7ff ) <<5 )) >>5 ; + val = mantissa; + +/* Scale result to micro-units for power sensors. */ +if (class ==PSC_POWER ) + val = val *1000LL ; + +if (exponent >=0 ) + val <<= exponent; +else + val >>= -exponent; + +return val; +} + +static int +mp2888_current_sense_gain_and_resolution_get (struct i2c_client *client,struct mp2888_data *data) +{ +int ret; + +/* +* Obtain DrMOS current sense gain of power stage from the register +* , bits 0-2. The value is selected as below: +* 00b - 5µA/A, 01b - 8.5µA/A, 10b - 9.7µA/A, 11b - 10µA/A. Other +* values are reserved. +*/ + ret =i2c_smbus_read_word_data (client,MP2888_MFR_SYS_CONFIG ); +if (ret <0 ) +return ret; + +switch (ret &MP2888_DRMOS_KCS ) { +case 0 : + data->curr_sense_gain =85 ; +break ; +case 1 : + data->curr_sense_gain =97 ; +break ; +case 2 : + data->curr_sense_gain =100 ; +break ; +case 3 : + data->curr_sense_gain =50 ; +break ; +default : +return -EINVAL ; + } + +/* +* Obtain resolution selector for total and phase current report and protection. +* 0: original resolution; 1: half resolution (in such case phase current value should +* be doubled. +*/ + data->total_curr_resolution = (ret &MP2888_TOTAL_CURRENT_RESOLUTION ) >>3 ; + data->phase_curr_resolution = (ret &MP2888_PHASE_CURRENT_RESOLUTION ) >>4 ; + +return 0 ; +} + +static int +mp2888_read_phase (struct i2c_client *client,struct mp2888_data *data,int page,int phase,u8 reg) +{ +int ret; + + ret =pmbus_read_word_data (client, page, phase, reg); +if (ret <0 ) +return ret; + +if (!((phase +1 ) %2 )) + ret >>=8 ; + ret &=0xff ; + +/* +* Output value is calculated as: (READ_CSx / 80 – 1.23) / (Kcs * Rcs) +* where: +* - Kcs is the DrMOS current sense gain of power stage, which is obtained from the +* register MP2888_MFR_VR_CONFIG1, bits 13-12 with the following selection of DrMOS +* (data->curr_sense_gain): +* 00b - 5µA/A, 01b - 8.5µA/A, 10b - 9.7µA/A, 11b - 10µA/A. +* - Rcs is the internal phase current sense resistor. This parameter depends on hardware +* assembly. By default it is set to 1kΩ. In case of different assembly, user should +* scale this parameter by dividing it by Rcs. +* If phase current resolution bit is set to 1, READ_CSx value should be doubled. +* Note, that current phase sensing, providing by the device is not accurate. This is +* because sampling of current occurrence of bit weight has a big deviation, especially for +* light load. +*/ +if (data->phase_curr_resolution) + ret *=2 ; +return DIV_ROUND_CLOSEST (ret *100 -9800 , data->curr_sense_gain); +} + +static int +mp2888_read_phases (struct i2c_client *client,struct mp2888_data *data,int page,int phase) +{ +int ret; + +switch (phase) { + case 0 ... 1: + ret =mp2888_read_phase (client, data, page, phase,MP2888_MFR_READ_CS1_2 ); +break ; + case 2 ... 3: + ret =mp2888_read_phase (client, data, page, phase,MP2888_MFR_READ_CS3_4 ); +break ; + case 4 ... 5: + ret =mp2888_read_phase (client, data, page, phase,MP2888_MFR_READ_CS5_6 ); +break ; + case 6 ... 7: + ret =mp2888_read_phase (client, data, page, phase,MP2888_MFR_READ_CS7_8 ); +break ; + case 8 ... 9: + ret =mp2888_read_phase (client, data, page, phase,MP2888_MFR_READ_CS9_10 ); +break ; +default : +return -ENODATA ; + } +return ret; +} + +static int mp2888_read_word_data (struct i2c_client *client,int page,int phase,int reg) +{ +const struct pmbus_driver_info *info =pmbus_get_driver_info (client); +struct mp2888_data *data =to_mp2888_data (info); +s64 val; +int ret; + +switch (reg) {
drivers/hwmon/pmbus/mp2888.c line 195
Quoted 10 lines
drivers/hwmon/pmbus/mp2888.c new file +10
-0+case PMBUS_READ_VIN : + ret =pmbus_read_word_data (client, page, phase, reg); +if (ret <=0 ) +return ret; +/* +* READ_VIN register has unused bits 15:10 with fixed value 111011b. Clear these +* bits and scale with coefficient 0.03125. +*/ + val =mp2888_reg2data_linear11 (ret &=GENMASK (9 ,0 ),PSC_VOLTAGE_IN ); + ret =DIV_ROUND_CLOSEST (val *MP2888_VIN_UNIT ,100000 );
This needs to be DIV_ROUND_CLOSEST_ULL().
Note that I do wonder if s64 is really needed here. The return value is supposed to fit into a 16-bit value, after all. In this specific case, the passed parameter already has bit 10..15 cleared, so the return value will always be the same value as passed to mp2888_reg2data_linear11(). This means the maximum value, in reality, is 1023 * 3125, which is then divided by 100000. This in turn means the code looses lots of precision since, effectively, the 10 bit value range is reduced to about 5 bit.
Please simplify in a way that doesn't loose precision.
drivers/hwmon/pmbus/mp2888.c line 202
Quoted 7 lines
drivers/hwmon/pmbus/mp2888.c new file +7
-0+break ; +case PMBUS_READ_TEMPERATURE_1 : + ret =pmbus_read_word_data (client, page, phase, reg); +if (ret <0 ) +return ret; + val =mp2888_reg2data_linear11 (ret,PSC_TEMPERATURE ); + ret =DIV_ROUND_CLOSEST (val,MP2888_TEMP_UNIT );
Same here. The divide operation causes a loss in precision which we really should avoid.
drivers/hwmon/pmbus/mp2888.c line 214
Quoted 12 lines
drivers/hwmon/pmbus/mp2888.c new file +12
-0+break ; +case PMBUS_READ_IOUT : +if (phase !=0xff ) +return mp2888_read_phases (client, data, page, phase); + + ret =pmbus_read_word_data (client, page, phase, reg); +if (ret <0 ) +return ret; +/* +* READ_IOUT register has unused bits 15:12 with fixed value 1110b. Clear these +* bits and scale with total current resolution. Data is provided in direct format. +*/
Doesn't that suggest LINEAR11 format ? 1110b in bits 15:12 is exponent -2, after all.
drivers/hwmon/pmbus/mp2888.c line 225
Quoted 11 lines
drivers/hwmon/pmbus/mp2888.c new file +11
-0+ ret &=GENMASK (11 ,0 ); + ret = data->total_curr_resolution ?DIV_ROUND_CLOSEST (ret,2 ) : +DIV_ROUND_CLOSEST (ret,4 ); +break ; +case PMBUS_READ_POUT : +case PMBUS_READ_PIN : + ret =pmbus_read_word_data (client, page, phase, reg); +if (ret <0 ) +return ret; + val =mp2888_reg2data_linear11 (ret,PSC_POWER ); + ret = data->total_curr_resolution ? val :DIV_ROUND_CLOSEST (val,2 );
Another use case for DIV_ROUND_CLOSEST_ULL.
Quoted 151 lines
drivers/hwmon/pmbus/mp2888.c new file +148
-0+break ; +/* +* The below registers are not implemented by device or implemented not according to the +* spec. Skip all of them to avoid exposing non-relevant inputs to sysfs. +*/ +case PMBUS_OT_FAULT_LIMIT : +case PMBUS_UT_WARN_LIMIT : +case PMBUS_UT_FAULT_LIMIT : +case PMBUS_VIN_UV_FAULT_LIMIT : +case PMBUS_VOUT_UV_WARN_LIMIT : +case PMBUS_VOUT_OV_WARN_LIMIT : +case PMBUS_VOUT_UV_FAULT_LIMIT : +case PMBUS_VOUT_OV_FAULT_LIMIT : +case PMBUS_VIN_OV_WARN_LIMIT : +case PMBUS_IOUT_OC_LV_FAULT_LIMIT : +case PMBUS_IOUT_OC_WARN_LIMIT : +case PMBUS_IOUT_OC_FAULT_LIMIT : +case PMBUS_IOUT_UC_FAULT_LIMIT : +case PMBUS_POUT_OP_FAULT_LIMIT : +case PMBUS_POUT_OP_WARN_LIMIT : +case PMBUS_PIN_OP_WARN_LIMIT : +case PMBUS_MFR_VIN_MIN : +case PMBUS_MFR_VIN_MAX : +case PMBUS_MFR_VOUT_MAX : +case PMBUS_MFR_IIN_MAX : +case PMBUS_MFR_IOUT_MAX : +case PMBUS_MFR_PIN_MAX : +case PMBUS_MFR_POUT_MAX : +case PMBUS_MFR_MAX_TEMP_1 : +return -ENXIO ; +default : +return -ENODATA ; + } + +return ret; +} + +static int +mp2888_identify_multiphase (struct i2c_client *client,struct mp2888_data *data, +struct pmbus_driver_info *info) +{ +int ret; + + ret =i2c_smbus_write_byte_data (client,PMBUS_PAGE ,0 ); +if (ret <0 ) +return ret; + +/* Identify multiphase number - could be from 1 to 10. */ + ret =i2c_smbus_read_word_data (client,MP2888_MFR_VR_CONFIG1 ); +if (ret <=0 ) +return ret; + + info->phases[0 ] = ret &GENMASK (3 ,0 ); + +/* +* The device provides a total of 10 PWM pins, and can be configured to different phase +* count applications for rail. +*/ +if (info->phases[0 ] >MP2888_MAX_PHASE ) +return -EINVAL ; + +return 0 ; +} + +static struct pmbus_driver_info mp2888_info = { + .pages =1 , + .format[PSC_VOLTAGE_IN ] = linear, + .format[PSC_VOLTAGE_OUT ] = direct, + .format[PSC_TEMPERATURE ] = direct, + .format[PSC_CURRENT_IN ] = linear, + .format[PSC_CURRENT_OUT ] = direct, + .format[PSC_POWER ] = direct, + .m[PSC_TEMPERATURE ] =1 , + .m[PSC_VOLTAGE_OUT ] =1 , + .R[PSC_VOLTAGE_OUT ] =3 , + .m[PSC_CURRENT_OUT ] =1 , + .m[PSC_POWER ] =1 , + .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 |PMBUS_HAVE_PIN |PMBUS_HAVE_STATUS_INPUT | +PMBUS_PHASE_VIRTUAL , + .pfunc[0 ] =PMBUS_HAVE_IOUT , + .pfunc[1 ] =PMBUS_HAVE_IOUT , + .pfunc[2 ] =PMBUS_HAVE_IOUT , + .pfunc[3 ] =PMBUS_HAVE_IOUT , + .pfunc[4 ] =PMBUS_HAVE_IOUT , + .pfunc[5 ] =PMBUS_HAVE_IOUT , + .pfunc[6 ] =PMBUS_HAVE_IOUT , + .pfunc[7 ] =PMBUS_HAVE_IOUT , + .pfunc[8 ] =PMBUS_HAVE_IOUT , + .pfunc[9 ] =PMBUS_HAVE_IOUT , + .read_byte_data = mp2888_read_byte_data, + .read_word_data = mp2888_read_word_data, +}; + +static int mp2888_probe (struct i2c_client *client) +{ +struct pmbus_driver_info *info; +struct mp2888_data *data; +int ret; + + data =devm_kzalloc (&client->dev,sizeof (struct mp2888_data ),GFP_KERNEL ); +if (!data) +return -ENOMEM ; + +memcpy (&data->info, &mp2888_info,sizeof (*info)); + info = &data->info; + +/* Identify multiphase configuration. */ + ret =mp2888_identify_multiphase (client, data, info); +if (ret) +return ret; + +/* Obtain current sense gain of power stage and current resolution. */ + ret =mp2888_current_sense_gain_and_resolution_get (client, data); +if (ret) +return ret; + +return pmbus_do_probe (client, info); +} + +static const struct i2c_device_id mp2888_id[] = { + {"mp2888" ,0 }, + {} +}; + +MODULE_DEVICE_TABLE (i2c, mp2888_id); + +static const struct of_device_id __maybe_unused mp2888_of_match[] = { + {.compatible ="mps,mp2888" }, + {} +}; +MODULE_DEVICE_TABLE (of, mp2888_of_match); + +static struct i2c_driver mp2888_driver = { + .driver = { + .name ="mp2888" , + .of_match_table =of_match_ptr (mp2888_of_match), + }, + .probe_new = mp2888_probe, + .id_table = mp2888_id, +}; + +module_i2c_driver (mp2888_driver); + +MODULE_AUTHOR ("Vadim Pasternak <[email protected]>" ); +MODULE_DESCRIPTION ("PMBus driver for MPS MP2888 device" ); +MODULE_LICENSE ("GPL" );Signature · 1 line
2.11.0
kernel test robot
build botRe: [PATCH hwmon-next v2 2/3] hwmon: (pmbus) Add support for MPS Multi-phase mp2888 controller
In reply to Vadim PasternakI love your patch! Yet something to improve:
Hi Vadim,
I love your patch! Yet something to improve:
[auto build test ERROR on hwmon/hwmon-next]
[also build test ERROR on robh/for-next v5.12-rc8 next-20210419] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Vadim-Pasternak/Add-support-for-MPS-Multi-phase-mp2888-controller/20210419-210711 base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next config: mips-allyesconfig (attached as .config) compiler: mips-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/d106a4d0141a89fe7b41d016067a7dbba730c932
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Vadim-Pasternak/Add-support-for-MPS-Multi-phase-mp2888-controller/20210419-210711 git checkout d106a4d0141a89fe7b41d016067a7dbba730c932
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross W=1 ARCH=mips
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>):
arch/mips/kernel/head.o: in function `kernel_entry':
(.ref.text+0xac): relocation truncated to fit: R_MIPS_26 against start_kernel' init/main.o: in function set_reset_devices':
main.c:(.init.text+0x20): relocation truncated to fit: R_MIPS_26 against _mcount' main.c:(.init.text+0x30): relocation truncated to fit: R_MIPS_26 against __sanitizer_cov_trace_pc' init/main.o: in function `debug_kernel':
main.c:(.init.text+0x9c): relocation truncated to fit: R_MIPS_26 against _mcount' main.c:(.init.text+0xac): relocation truncated to fit: R_MIPS_26 against __sanitizer_cov_trace_pc' init/main.o: in function `quiet_kernel':
main.c:(.init.text+0x118): relocation truncated to fit: R_MIPS_26 against _mcount' main.c:(.init.text+0x128): relocation truncated to fit: R_MIPS_26 against __sanitizer_cov_trace_pc' init/main.o: in function `init_setup':
main.c:(.init.text+0x1ac): relocation truncated to fit: R_MIPS_26 against _mcount' main.c:(.init.text+0x1cc): relocation truncated to fit: R_MIPS_26 against __sanitizer_cov_trace_pc' main.c:(.init.text+0x204): relocation truncated to fit: R_MIPS_26 against `__sanitizer_cov_trace_pc' main.c:(.init.text+0x22c): additional relocation overflows omitted from the output
mips-linux-ld: drivers/hwmon/pmbus/mp2888.o: in function `mp2888_read_word_data':
>> mp2888.c:(.text.mp2888_read_word_data+0x120): undefined reference to `__divdi3' >> mips-linux-ld: mp2888.c:(.text.mp2888_read_word_data+0x23c): undefined reference to `__divdi3'
mips-linux-ld: mp2888.c:(.text.mp2888_read_word_data+0x268): undefined reference to `__divdi3'
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
PATCH v2 3/3 dt-bindings: Add MP2888 voltage regulator device
In reply to Vadim PasternakMonolithic Power Systems, Inc. (MPS) dual-loop, digital, multi-phase controller.
--- Documentation/devicetree/bindings/trivial-devices.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/trivial-devices.yaml +2 -0
@@ -98,6 +98,8 @@ properties: - fsl,mpl3115 # MPR121: Proximity Capacitive Touch Sensor Controller - fsl,mpr121 + # Monolithic Power Systems Inc. multi-phase controller mp2888 + - mps,mp2888 # Monolithic Power Systems Inc. multi-phase controller mp2975 - mps,mp2975 # G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface
Signature · 1 line
2.11.0