diff mbox series

[1/2] hwmon: (pmbus/max34440): Fix support for max34451

Message ID 20250320-dev_adpm12160-v1-1-8f7b975eac75@analog.com (mailing list archive)
State Changes Requested
Headers show
Series Add support for ADPM12160 a DC/DC Power Module | expand

Commit Message

Torreno, Alexis Czezar March 20, 2025, 3:55 a.m. UTC
The max344** family has an issue with some PMBUS address being switched.
This includes max34451 however version MAX34451-NA6 and later has this
issue fixed and this commit supports that update.

Signed-off-by: Alexis Czezar Torreno <alexisczezar.torreno@analog.com>
---
 Documentation/hwmon/max34440.rst |   8 ++-
 drivers/hwmon/pmbus/max34440.c   | 102 ++++++++++++++++++++++++++-------------
 2 files changed, 74 insertions(+), 36 deletions(-)

Comments

Guenter Roeck March 20, 2025, 4:24 a.m. UTC | #1
On 3/19/25 20:55, Alexis Czezar Torreno wrote:
> The max344** family has an issue with some PMBUS address being switched.
> This includes max34451 however version MAX34451-NA6 and later has this
> issue fixed and this commit supports that update.
> 
> Signed-off-by: Alexis Czezar Torreno <alexisczezar.torreno@analog.com>
> ---
>   Documentation/hwmon/max34440.rst |   8 ++-
>   drivers/hwmon/pmbus/max34440.c   | 102 ++++++++++++++++++++++++++-------------
>   2 files changed, 74 insertions(+), 36 deletions(-)
> 
> diff --git a/Documentation/hwmon/max34440.rst b/Documentation/hwmon/max34440.rst
> index 162d289f08140341e8e76ab7033834ba07a8b935..b1f3f75091bb8e233e766c24913194dd62b0cd90 100644
> --- a/Documentation/hwmon/max34440.rst
> +++ b/Documentation/hwmon/max34440.rst
> @@ -35,7 +35,7 @@ Supported chips:
>   
>       PMBus 16-Channel V/I Monitor and 12-Channel Sequencer/Marginer
>   
> -    Prefixes: 'max34451'
> +    Prefixes: 'max34451', 'max34451_na6'
>   
>       Addresses scanned: -
>   
> @@ -93,6 +93,10 @@ attribute is set to a positive value. Power measurement is only enabled if
>   channel 1 (3) is configured for voltage measurement, and channel 2 (4) is
>   configured for current measurement.
>   
> +For MAX34451, version MAX34451ETNA6+ and later are denoted with prefix
> +'max34451_na6'. The previous versions contains some errors on the PMBUS
> +addresses and these are fixed on the later versions.
> +
>   
>   Platform data support
>   ---------------------
> @@ -192,4 +196,4 @@ temp[1-8]_reset_history	Write any value to reset history.
>      - MAX34451 supports attribute groups in[1-16] (or curr[1-16] based on
>        input pins) and temp[1-5].
>      - MAX34460 supports attribute groups in[1-12] and temp[1-5].
> -   - MAX34461 supports attribute groups in[1-16] and temp[1-5].
> +   - MAX34461 supports attribute groups in[1-16] and temp[1-5].
> \ No newline at end of file
> diff --git a/drivers/hwmon/pmbus/max34440.c b/drivers/hwmon/pmbus/max34440.c
> index c9dda33831ff24e7b5e2fd1956a65e6bd2bfcbb9..d483c01f256c96f048c9da5981f10f52402d981c 100644
> --- a/drivers/hwmon/pmbus/max34440.c
> +++ b/drivers/hwmon/pmbus/max34440.c
> @@ -14,7 +14,15 @@
>   #include <linux/i2c.h>
>   #include "pmbus.h"
>   
> -enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
> +enum chips {
> +	max34440,
> +	max34441,
> +	max34446,
> +	max34451,
> +	max34451_na6,
> +	max34460,
> +	max34461,
> +};
>   
>   #define MAX34440_MFR_VOUT_PEAK		0xd4
>   #define MAX34440_MFR_IOUT_PEAK		0xd5
> @@ -34,6 +42,7 @@ enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
>   /*
>    * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT
>    * swapped from the standard pmbus spec addresses.
> + * For max34451, version MAX34451ETNA6+ and later has this issue fixed.
>    */
>   #define MAX34440_IOUT_OC_WARN_LIMIT	0x46
>   #define MAX34440_IOUT_OC_FAULT_LIMIT	0x4A
> @@ -59,12 +68,20 @@ static int max34440_read_word_data(struct i2c_client *client, int page,
>   
>   	switch (reg) {
>   	case PMBUS_IOUT_OC_FAULT_LIMIT:
> -		ret = pmbus_read_word_data(client, page, phase,
> -					   MAX34440_IOUT_OC_FAULT_LIMIT);
> +		if (data->id == max34451_na6)

Use a flag instead of a chip ID, or even better store the register addresses
in max34440_data to avoid the runtime checks.

> +			ret = pmbus_read_word_data(client, page, phase,
> +						   PMBUS_IOUT_OC_FAULT_LIMIT);
> +		else
> +			ret = pmbus_read_word_data(client, page, phase,
> +						   MAX34440_IOUT_OC_FAULT_LIMIT);
>   		break;
>   	case PMBUS_IOUT_OC_WARN_LIMIT:
> -		ret = pmbus_read_word_data(client, page, phase,
> -					   MAX34440_IOUT_OC_WARN_LIMIT);
> +		if (data->id == max34451_na6)
> +			ret = pmbus_read_word_data(client, page, phase,
> +						   PMBUS_IOUT_OC_WARN_LIMIT);
> +		else
> +			ret = pmbus_read_word_data(client, page, phase,
> +						   MAX34440_IOUT_OC_WARN_LIMIT);
>   		break;
>   	case PMBUS_VIRT_READ_VOUT_MIN:
>   		ret = pmbus_read_word_data(client, page, phase,
> @@ -75,7 +92,8 @@ static int max34440_read_word_data(struct i2c_client *client, int page,
>   					   MAX34440_MFR_VOUT_PEAK);
>   		break;
>   	case PMBUS_VIRT_READ_IOUT_AVG:
> -		if (data->id != max34446 && data->id != max34451)
> +		if (data->id != max34446 && data->id != max34451 &&
> +		    data->id != max34451_na6)
>   			return -ENXIO;
>   		ret = pmbus_read_word_data(client, page, phase,
>   					   MAX34446_MFR_IOUT_AVG);
> @@ -133,12 +151,20 @@ static int max34440_write_word_data(struct i2c_client *client, int page,
>   
>   	switch (reg) {
>   	case PMBUS_IOUT_OC_FAULT_LIMIT:
> -		ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT,
> -					    word);
> +		if (data->id == max34451_na6)
> +			ret = pmbus_write_word_data(client, page, PMBUS_IOUT_OC_FAULT_LIMIT,
> +						    word);
> +		else
> +			ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT,
> +						    word);
>   		break;
>   	case PMBUS_IOUT_OC_WARN_LIMIT:
> -		ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT,
> -					    word);
> +		if (data->id == max34451_na6)
> +			ret = pmbus_write_word_data(client, page, PMBUS_IOUT_OC_WARN_LIMIT,
> +						    word);
> +		else
> +			ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT,
> +						    word);
>   		break;
>   	case PMBUS_VIRT_RESET_POUT_HISTORY:
>   		ret = pmbus_write_word_data(client, page,
> @@ -159,7 +185,8 @@ static int max34440_write_word_data(struct i2c_client *client, int page,
>   	case PMBUS_VIRT_RESET_IOUT_HISTORY:
>   		ret = pmbus_write_word_data(client, page,
>   					    MAX34440_MFR_IOUT_PEAK, 0);
> -		if (!ret && (data->id == max34446 || data->id == max34451))
> +		if (!ret && (data->id == max34446 || data->id == max34451 ||
> +			     data->id == max34451_na6))
>   			ret = pmbus_write_word_data(client, page,
>   					MAX34446_MFR_IOUT_AVG, 0);
>   
> @@ -270,6 +297,29 @@ static int max34451_set_supported_funcs(struct i2c_client *client,
>   	return 0;
>   }
>   
> +#define MAX34451_COMMON_INFO \
> +	.pages = 21, \
> +	.format[PSC_VOLTAGE_OUT] = direct, \
> +	.format[PSC_TEMPERATURE] = direct, \
> +	.format[PSC_CURRENT_OUT] = direct, \
> +	.m[PSC_VOLTAGE_OUT] = 1, \
> +	.b[PSC_VOLTAGE_OUT] = 0, \
> +	.R[PSC_VOLTAGE_OUT] = 3, \
> +	.m[PSC_CURRENT_OUT] = 1, \
> +	.b[PSC_CURRENT_OUT] = 0, \
> +	.R[PSC_CURRENT_OUT] = 2, \
> +	.m[PSC_TEMPERATURE] = 1, \
> +	.b[PSC_TEMPERATURE] = 0, \
> +	.R[PSC_TEMPERATURE] = 2, \
> +	/* func 0-15 is set dynamically before probing */ \
> +	.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
> +	.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
> +	.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
> +	.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
> +	.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
> +	.read_word_data = max34440_read_word_data, \
> +	.write_word_data = max34440_write_word_data,
> +
>   static struct pmbus_driver_info max34440_info[] = {
>   	[max34440] = {
>   		.pages = 14,
> @@ -394,27 +444,10 @@ static struct pmbus_driver_info max34440_info[] = {
>   		.write_word_data = max34440_write_word_data,
>   	},
>   	[max34451] = {
> -		.pages = 21,
> -		.format[PSC_VOLTAGE_OUT] = direct,
> -		.format[PSC_TEMPERATURE] = direct,
> -		.format[PSC_CURRENT_OUT] = direct,
> -		.m[PSC_VOLTAGE_OUT] = 1,
> -		.b[PSC_VOLTAGE_OUT] = 0,
> -		.R[PSC_VOLTAGE_OUT] = 3,
> -		.m[PSC_CURRENT_OUT] = 1,
> -		.b[PSC_CURRENT_OUT] = 0,
> -		.R[PSC_CURRENT_OUT] = 2,
> -		.m[PSC_TEMPERATURE] = 1,
> -		.b[PSC_TEMPERATURE] = 0,
> -		.R[PSC_TEMPERATURE] = 2,
> -		/* func 0-15 is set dynamically before probing */
> -		.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
> -		.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
> -		.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
> -		.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
> -		.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
> -		.read_word_data = max34440_read_word_data,
> -		.write_word_data = max34440_write_word_data,
> +		MAX34451_COMMON_INFO,
> +	},
> +	[max34451_na6] = {
> +		MAX34451_COMMON_INFO,
>   	},

This is way too complicated. Use a flag or set the register addresses in struct
max34440_data instead.

>   	[max34460] = {
>   		.pages = 18,
> @@ -495,7 +528,7 @@ static int max34440_probe(struct i2c_client *client)
>   	data->id = i2c_match_id(max34440_id, client)->driver_data;
>   	data->info = max34440_info[data->id];
>   
> -	if (data->id == max34451) {
> +	if (data->id == max34451 || data->id == max34451_na6) {
>   		rv = max34451_set_supported_funcs(client, data);
>   		if (rv)
>   			return rv;
> @@ -509,6 +542,7 @@ static const struct i2c_device_id max34440_id[] = {
>   	{"max34441", max34441},
>   	{"max34446", max34446},
>   	{"max34451", max34451},
> +	{"max34451_na6", max34451_na6},

Relying on this is way too fragile. This must be detectable from the chip;
maybe using MFR_REVISION.

>   	{"max34460", max34460},
>   	{"max34461", max34461},
>   	{}
> @@ -529,4 +563,4 @@ module_i2c_driver(max34440_driver);
>   MODULE_AUTHOR("Guenter Roeck");
>   MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
>   MODULE_LICENSE("GPL");
> -MODULE_IMPORT_NS("PMBUS");
> +MODULE_IMPORT_NS(PMBUS);

Looks like your code is based on an older kernel branch. Please
rebase on top of mainline.

Guenter



>
kernel test robot March 20, 2025, 2:15 p.m. UTC | #2
Hi Alexis,

kernel test robot noticed the following build errors:

[auto build test ERROR on c812cc42f92d3d0b17c01b5db9a1dee5793a1491]

url:    https://github.com/intel-lab-lkp/linux/commits/Alexis-Czezar-Torreno/hwmon-pmbus-max34440-Fix-support-for-max34451/20250320-115905
base:   c812cc42f92d3d0b17c01b5db9a1dee5793a1491
patch link:    https://lore.kernel.org/r/20250320-dev_adpm12160-v1-1-8f7b975eac75%40analog.com
patch subject: [PATCH 1/2] hwmon: (pmbus/max34440): Fix support for max34451
config: i386-buildonly-randconfig-005-20250320 (https://download.01.org/0day-ci/archive/20250320/202503202136.NJ1U3Zos-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250320/202503202136.NJ1U3Zos-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503202136.NJ1U3Zos-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/hwmon/pmbus/max34440.c:447:37: error: expected expression before ',' token
     447 |                 MAX34451_COMMON_INFO,
         |                                     ^
   drivers/hwmon/pmbus/max34440.c:450:37: error: expected expression before ',' token
     450 |                 MAX34451_COMMON_INFO,
         |                                     ^
   In file included from include/linux/module.h:22,
                    from drivers/hwmon/pmbus/max34440.c:11:
>> drivers/hwmon/pmbus/max34440.c:566:18: error: expected ',' or ';' before 'PMBUS'
     566 | MODULE_IMPORT_NS(PMBUS);
         |                  ^~~~~
   include/linux/moduleparam.h:26:61: note: in definition of macro '__MODULE_INFO'
      26 |                 = __MODULE_INFO_PREFIX __stringify(tag) "=" info
         |                                                             ^~~~
   include/linux/module.h:299:33: note: in expansion of macro 'MODULE_INFO'
     299 | #define MODULE_IMPORT_NS(ns)    MODULE_INFO(import_ns, ns)
         |                                 ^~~~~~~~~~~
   drivers/hwmon/pmbus/max34440.c:566:1: note: in expansion of macro 'MODULE_IMPORT_NS'
     566 | MODULE_IMPORT_NS(PMBUS);
         | ^~~~~~~~~~~~~~~~


vim +447 drivers/hwmon/pmbus/max34440.c

   299	
   300	#define MAX34451_COMMON_INFO \
   301		.pages = 21, \
   302		.format[PSC_VOLTAGE_OUT] = direct, \
   303		.format[PSC_TEMPERATURE] = direct, \
   304		.format[PSC_CURRENT_OUT] = direct, \
   305		.m[PSC_VOLTAGE_OUT] = 1, \
   306		.b[PSC_VOLTAGE_OUT] = 0, \
   307		.R[PSC_VOLTAGE_OUT] = 3, \
   308		.m[PSC_CURRENT_OUT] = 1, \
   309		.b[PSC_CURRENT_OUT] = 0, \
   310		.R[PSC_CURRENT_OUT] = 2, \
   311		.m[PSC_TEMPERATURE] = 1, \
   312		.b[PSC_TEMPERATURE] = 0, \
   313		.R[PSC_TEMPERATURE] = 2, \
   314		/* func 0-15 is set dynamically before probing */ \
   315		.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   316		.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   317		.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   318		.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   319		.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   320		.read_word_data = max34440_read_word_data, \
   321		.write_word_data = max34440_write_word_data,
   322	
   323	static struct pmbus_driver_info max34440_info[] = {
   324		[max34440] = {
   325			.pages = 14,
   326			.format[PSC_VOLTAGE_IN] = direct,
   327			.format[PSC_VOLTAGE_OUT] = direct,
   328			.format[PSC_TEMPERATURE] = direct,
   329			.format[PSC_CURRENT_OUT] = direct,
   330			.m[PSC_VOLTAGE_IN] = 1,
   331			.b[PSC_VOLTAGE_IN] = 0,
   332			.R[PSC_VOLTAGE_IN] = 3,	    /* R = 0 in datasheet reflects mV */
   333			.m[PSC_VOLTAGE_OUT] = 1,
   334			.b[PSC_VOLTAGE_OUT] = 0,
   335			.R[PSC_VOLTAGE_OUT] = 3,    /* R = 0 in datasheet reflects mV */
   336			.m[PSC_CURRENT_OUT] = 1,
   337			.b[PSC_CURRENT_OUT] = 0,
   338			.R[PSC_CURRENT_OUT] = 3,    /* R = 0 in datasheet reflects mA */
   339			.m[PSC_TEMPERATURE] = 1,
   340			.b[PSC_TEMPERATURE] = 0,
   341			.R[PSC_TEMPERATURE] = 2,
   342			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   343			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   344			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   345			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   346			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   347			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   348			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   349			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   350			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   351			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   352			.func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   353			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   354			.func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   355			.func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   356			.func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   357			.func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   358			.func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   359			.func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   360			.func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   361			.func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   362			.read_byte_data = max34440_read_byte_data,
   363			.read_word_data = max34440_read_word_data,
   364			.write_word_data = max34440_write_word_data,
   365		},
   366		[max34441] = {
   367			.pages = 12,
   368			.format[PSC_VOLTAGE_IN] = direct,
   369			.format[PSC_VOLTAGE_OUT] = direct,
   370			.format[PSC_TEMPERATURE] = direct,
   371			.format[PSC_CURRENT_OUT] = direct,
   372			.format[PSC_FAN] = direct,
   373			.m[PSC_VOLTAGE_IN] = 1,
   374			.b[PSC_VOLTAGE_IN] = 0,
   375			.R[PSC_VOLTAGE_IN] = 3,
   376			.m[PSC_VOLTAGE_OUT] = 1,
   377			.b[PSC_VOLTAGE_OUT] = 0,
   378			.R[PSC_VOLTAGE_OUT] = 3,
   379			.m[PSC_CURRENT_OUT] = 1,
   380			.b[PSC_CURRENT_OUT] = 0,
   381			.R[PSC_CURRENT_OUT] = 3,
   382			.m[PSC_TEMPERATURE] = 1,
   383			.b[PSC_TEMPERATURE] = 0,
   384			.R[PSC_TEMPERATURE] = 2,
   385			.m[PSC_FAN] = 1,
   386			.b[PSC_FAN] = 0,
   387			.R[PSC_FAN] = 0,
   388			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   389			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   390			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   391			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   392			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   393			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   394			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   395			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   396			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   397			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   398			.func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
   399			.func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   400			.func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   401			.func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   402			.func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   403			.func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   404			.func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   405			.read_byte_data = max34440_read_byte_data,
   406			.read_word_data = max34440_read_word_data,
   407			.write_word_data = max34440_write_word_data,
   408		},
   409		[max34446] = {
   410			.pages = 7,
   411			.format[PSC_VOLTAGE_IN] = direct,
   412			.format[PSC_VOLTAGE_OUT] = direct,
   413			.format[PSC_TEMPERATURE] = direct,
   414			.format[PSC_CURRENT_OUT] = direct,
   415			.format[PSC_POWER] = direct,
   416			.m[PSC_VOLTAGE_IN] = 1,
   417			.b[PSC_VOLTAGE_IN] = 0,
   418			.R[PSC_VOLTAGE_IN] = 3,
   419			.m[PSC_VOLTAGE_OUT] = 1,
   420			.b[PSC_VOLTAGE_OUT] = 0,
   421			.R[PSC_VOLTAGE_OUT] = 3,
   422			.m[PSC_CURRENT_OUT] = 1,
   423			.b[PSC_CURRENT_OUT] = 0,
   424			.R[PSC_CURRENT_OUT] = 3,
   425			.m[PSC_POWER] = 1,
   426			.b[PSC_POWER] = 0,
   427			.R[PSC_POWER] = 3,
   428			.m[PSC_TEMPERATURE] = 1,
   429			.b[PSC_TEMPERATURE] = 0,
   430			.R[PSC_TEMPERATURE] = 2,
   431			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   432			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
   433			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   434			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   435			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   436			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
   437			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   438			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   439			.func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   440			.func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   441			.func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   442			.read_byte_data = max34440_read_byte_data,
   443			.read_word_data = max34440_read_word_data,
   444			.write_word_data = max34440_write_word_data,
   445		},
   446		[max34451] = {
 > 447			MAX34451_COMMON_INFO,
   448		},
   449		[max34451_na6] = {
   450			MAX34451_COMMON_INFO,
   451		},
   452		[max34460] = {
   453			.pages = 18,
   454			.format[PSC_VOLTAGE_OUT] = direct,
   455			.format[PSC_TEMPERATURE] = direct,
   456			.m[PSC_VOLTAGE_OUT] = 1,
   457			.b[PSC_VOLTAGE_OUT] = 0,
   458			.R[PSC_VOLTAGE_OUT] = 3,
   459			.m[PSC_TEMPERATURE] = 1,
   460			.b[PSC_TEMPERATURE] = 0,
   461			.R[PSC_TEMPERATURE] = 2,
   462			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   463			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   464			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   465			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   466			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   467			.func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   468			.func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   469			.func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   470			.func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   471			.func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   472			.func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   473			.func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   474			.func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   475			.func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   476			.func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   477			.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   478			.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   479			.read_word_data = max34440_read_word_data,
   480			.write_word_data = max34440_write_word_data,
   481		},
   482		[max34461] = {
   483			.pages = 23,
   484			.format[PSC_VOLTAGE_OUT] = direct,
   485			.format[PSC_TEMPERATURE] = direct,
   486			.m[PSC_VOLTAGE_OUT] = 1,
   487			.b[PSC_VOLTAGE_OUT] = 0,
   488			.R[PSC_VOLTAGE_OUT] = 3,
   489			.m[PSC_TEMPERATURE] = 1,
   490			.b[PSC_TEMPERATURE] = 0,
   491			.R[PSC_TEMPERATURE] = 2,
   492			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   493			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   494			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   495			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   496			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   497			.func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   498			.func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   499			.func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   500			.func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   501			.func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   502			.func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   503			.func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   504			.func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   505			.func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   506			.func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   507			.func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   508			/* page 16 is reserved */
   509			.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   510			.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   511			.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   512			.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   513			.func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   514			.read_word_data = max34440_read_word_data,
   515			.write_word_data = max34440_write_word_data,
   516		},
   517	};
   518	
   519	static int max34440_probe(struct i2c_client *client)
   520	{
   521		struct max34440_data *data;
   522		int rv;
   523	
   524		data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
   525				    GFP_KERNEL);
   526		if (!data)
   527			return -ENOMEM;
   528		data->id = i2c_match_id(max34440_id, client)->driver_data;
   529		data->info = max34440_info[data->id];
   530	
   531		if (data->id == max34451 || data->id == max34451_na6) {
   532			rv = max34451_set_supported_funcs(client, data);
   533			if (rv)
   534				return rv;
   535		}
   536	
   537		return pmbus_do_probe(client, &data->info);
   538	}
   539	
   540	static const struct i2c_device_id max34440_id[] = {
   541		{"max34440", max34440},
   542		{"max34441", max34441},
   543		{"max34446", max34446},
   544		{"max34451", max34451},
   545		{"max34451_na6", max34451_na6},
   546		{"max34460", max34460},
   547		{"max34461", max34461},
   548		{}
   549	};
   550	MODULE_DEVICE_TABLE(i2c, max34440_id);
   551	
   552	/* This is the driver that will be inserted */
   553	static struct i2c_driver max34440_driver = {
   554		.driver = {
   555			   .name = "max34440",
   556			   },
   557		.probe = max34440_probe,
   558		.id_table = max34440_id,
   559	};
   560	
   561	module_i2c_driver(max34440_driver);
   562	
   563	MODULE_AUTHOR("Guenter Roeck");
   564	MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
   565	MODULE_LICENSE("GPL");
 > 566	MODULE_IMPORT_NS(PMBUS);
kernel test robot March 20, 2025, 10:56 p.m. UTC | #3
Hi Alexis,

kernel test robot noticed the following build errors:

[auto build test ERROR on c812cc42f92d3d0b17c01b5db9a1dee5793a1491]

url:    https://github.com/intel-lab-lkp/linux/commits/Alexis-Czezar-Torreno/hwmon-pmbus-max34440-Fix-support-for-max34451/20250320-115905
base:   c812cc42f92d3d0b17c01b5db9a1dee5793a1491
patch link:    https://lore.kernel.org/r/20250320-dev_adpm12160-v1-1-8f7b975eac75%40analog.com
patch subject: [PATCH 1/2] hwmon: (pmbus/max34440): Fix support for max34451
config: x86_64-randconfig-074-20250321 (https://download.01.org/0day-ci/archive/20250321/202503210647.xC0D586I-lkp@intel.com/config)
compiler: clang version 20.1.1 (https://github.com/llvm/llvm-project 424c2d9b7e4de40d0804dd374721e6411c27d1d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250321/202503210647.xC0D586I-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503210647.xC0D586I-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/hwmon/pmbus/max34440.c:447:23: error: expected expression
     447 |                 MAX34451_COMMON_INFO,
         |                                     ^
   drivers/hwmon/pmbus/max34440.c:450:23: error: expected expression
     450 |                 MAX34451_COMMON_INFO,
         |                                     ^
>> drivers/hwmon/pmbus/max34440.c:566:18: error: expected ';' after top level declarator
     566 | MODULE_IMPORT_NS(PMBUS);
         |                  ^
   3 errors generated.


vim +447 drivers/hwmon/pmbus/max34440.c

   299	
   300	#define MAX34451_COMMON_INFO \
   301		.pages = 21, \
   302		.format[PSC_VOLTAGE_OUT] = direct, \
   303		.format[PSC_TEMPERATURE] = direct, \
   304		.format[PSC_CURRENT_OUT] = direct, \
   305		.m[PSC_VOLTAGE_OUT] = 1, \
   306		.b[PSC_VOLTAGE_OUT] = 0, \
   307		.R[PSC_VOLTAGE_OUT] = 3, \
   308		.m[PSC_CURRENT_OUT] = 1, \
   309		.b[PSC_CURRENT_OUT] = 0, \
   310		.R[PSC_CURRENT_OUT] = 2, \
   311		.m[PSC_TEMPERATURE] = 1, \
   312		.b[PSC_TEMPERATURE] = 0, \
   313		.R[PSC_TEMPERATURE] = 2, \
   314		/* func 0-15 is set dynamically before probing */ \
   315		.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   316		.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   317		.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   318		.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   319		.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
   320		.read_word_data = max34440_read_word_data, \
   321		.write_word_data = max34440_write_word_data,
   322	
   323	static struct pmbus_driver_info max34440_info[] = {
   324		[max34440] = {
   325			.pages = 14,
   326			.format[PSC_VOLTAGE_IN] = direct,
   327			.format[PSC_VOLTAGE_OUT] = direct,
   328			.format[PSC_TEMPERATURE] = direct,
   329			.format[PSC_CURRENT_OUT] = direct,
   330			.m[PSC_VOLTAGE_IN] = 1,
   331			.b[PSC_VOLTAGE_IN] = 0,
   332			.R[PSC_VOLTAGE_IN] = 3,	    /* R = 0 in datasheet reflects mV */
   333			.m[PSC_VOLTAGE_OUT] = 1,
   334			.b[PSC_VOLTAGE_OUT] = 0,
   335			.R[PSC_VOLTAGE_OUT] = 3,    /* R = 0 in datasheet reflects mV */
   336			.m[PSC_CURRENT_OUT] = 1,
   337			.b[PSC_CURRENT_OUT] = 0,
   338			.R[PSC_CURRENT_OUT] = 3,    /* R = 0 in datasheet reflects mA */
   339			.m[PSC_TEMPERATURE] = 1,
   340			.b[PSC_TEMPERATURE] = 0,
   341			.R[PSC_TEMPERATURE] = 2,
   342			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   343			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   344			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   345			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   346			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   347			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   348			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   349			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   350			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   351			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   352			.func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   353			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   354			.func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   355			.func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   356			.func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   357			.func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   358			.func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   359			.func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   360			.func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   361			.func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   362			.read_byte_data = max34440_read_byte_data,
   363			.read_word_data = max34440_read_word_data,
   364			.write_word_data = max34440_write_word_data,
   365		},
   366		[max34441] = {
   367			.pages = 12,
   368			.format[PSC_VOLTAGE_IN] = direct,
   369			.format[PSC_VOLTAGE_OUT] = direct,
   370			.format[PSC_TEMPERATURE] = direct,
   371			.format[PSC_CURRENT_OUT] = direct,
   372			.format[PSC_FAN] = direct,
   373			.m[PSC_VOLTAGE_IN] = 1,
   374			.b[PSC_VOLTAGE_IN] = 0,
   375			.R[PSC_VOLTAGE_IN] = 3,
   376			.m[PSC_VOLTAGE_OUT] = 1,
   377			.b[PSC_VOLTAGE_OUT] = 0,
   378			.R[PSC_VOLTAGE_OUT] = 3,
   379			.m[PSC_CURRENT_OUT] = 1,
   380			.b[PSC_CURRENT_OUT] = 0,
   381			.R[PSC_CURRENT_OUT] = 3,
   382			.m[PSC_TEMPERATURE] = 1,
   383			.b[PSC_TEMPERATURE] = 0,
   384			.R[PSC_TEMPERATURE] = 2,
   385			.m[PSC_FAN] = 1,
   386			.b[PSC_FAN] = 0,
   387			.R[PSC_FAN] = 0,
   388			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   389			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   390			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   391			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   392			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   393			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   394			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   395			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   396			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   397			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   398			.func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
   399			.func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   400			.func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   401			.func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   402			.func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   403			.func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   404			.func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   405			.read_byte_data = max34440_read_byte_data,
   406			.read_word_data = max34440_read_word_data,
   407			.write_word_data = max34440_write_word_data,
   408		},
   409		[max34446] = {
   410			.pages = 7,
   411			.format[PSC_VOLTAGE_IN] = direct,
   412			.format[PSC_VOLTAGE_OUT] = direct,
   413			.format[PSC_TEMPERATURE] = direct,
   414			.format[PSC_CURRENT_OUT] = direct,
   415			.format[PSC_POWER] = direct,
   416			.m[PSC_VOLTAGE_IN] = 1,
   417			.b[PSC_VOLTAGE_IN] = 0,
   418			.R[PSC_VOLTAGE_IN] = 3,
   419			.m[PSC_VOLTAGE_OUT] = 1,
   420			.b[PSC_VOLTAGE_OUT] = 0,
   421			.R[PSC_VOLTAGE_OUT] = 3,
   422			.m[PSC_CURRENT_OUT] = 1,
   423			.b[PSC_CURRENT_OUT] = 0,
   424			.R[PSC_CURRENT_OUT] = 3,
   425			.m[PSC_POWER] = 1,
   426			.b[PSC_POWER] = 0,
   427			.R[PSC_POWER] = 3,
   428			.m[PSC_TEMPERATURE] = 1,
   429			.b[PSC_TEMPERATURE] = 0,
   430			.R[PSC_TEMPERATURE] = 2,
   431			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   432			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
   433			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   434			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   435			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   436			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
   437			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
   438			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
   439			.func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   440			.func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   441			.func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   442			.read_byte_data = max34440_read_byte_data,
   443			.read_word_data = max34440_read_word_data,
   444			.write_word_data = max34440_write_word_data,
   445		},
   446		[max34451] = {
 > 447			MAX34451_COMMON_INFO,
   448		},
   449		[max34451_na6] = {
   450			MAX34451_COMMON_INFO,
   451		},
   452		[max34460] = {
   453			.pages = 18,
   454			.format[PSC_VOLTAGE_OUT] = direct,
   455			.format[PSC_TEMPERATURE] = direct,
   456			.m[PSC_VOLTAGE_OUT] = 1,
   457			.b[PSC_VOLTAGE_OUT] = 0,
   458			.R[PSC_VOLTAGE_OUT] = 3,
   459			.m[PSC_TEMPERATURE] = 1,
   460			.b[PSC_TEMPERATURE] = 0,
   461			.R[PSC_TEMPERATURE] = 2,
   462			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   463			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   464			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   465			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   466			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   467			.func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   468			.func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   469			.func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   470			.func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   471			.func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   472			.func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   473			.func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   474			.func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   475			.func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   476			.func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   477			.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   478			.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   479			.read_word_data = max34440_read_word_data,
   480			.write_word_data = max34440_write_word_data,
   481		},
   482		[max34461] = {
   483			.pages = 23,
   484			.format[PSC_VOLTAGE_OUT] = direct,
   485			.format[PSC_TEMPERATURE] = direct,
   486			.m[PSC_VOLTAGE_OUT] = 1,
   487			.b[PSC_VOLTAGE_OUT] = 0,
   488			.R[PSC_VOLTAGE_OUT] = 3,
   489			.m[PSC_TEMPERATURE] = 1,
   490			.b[PSC_TEMPERATURE] = 0,
   491			.R[PSC_TEMPERATURE] = 2,
   492			.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   493			.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   494			.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   495			.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   496			.func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   497			.func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   498			.func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   499			.func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   500			.func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   501			.func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   502			.func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   503			.func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   504			.func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   505			.func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   506			.func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   507			.func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
   508			/* page 16 is reserved */
   509			.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   510			.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   511			.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   512			.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   513			.func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
   514			.read_word_data = max34440_read_word_data,
   515			.write_word_data = max34440_write_word_data,
   516		},
   517	};
   518	
   519	static int max34440_probe(struct i2c_client *client)
   520	{
   521		struct max34440_data *data;
   522		int rv;
   523	
   524		data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
   525				    GFP_KERNEL);
   526		if (!data)
   527			return -ENOMEM;
   528		data->id = i2c_match_id(max34440_id, client)->driver_data;
   529		data->info = max34440_info[data->id];
   530	
   531		if (data->id == max34451 || data->id == max34451_na6) {
   532			rv = max34451_set_supported_funcs(client, data);
   533			if (rv)
   534				return rv;
   535		}
   536	
   537		return pmbus_do_probe(client, &data->info);
   538	}
   539	
   540	static const struct i2c_device_id max34440_id[] = {
   541		{"max34440", max34440},
   542		{"max34441", max34441},
   543		{"max34446", max34446},
   544		{"max34451", max34451},
   545		{"max34451_na6", max34451_na6},
   546		{"max34460", max34460},
   547		{"max34461", max34461},
   548		{}
   549	};
   550	MODULE_DEVICE_TABLE(i2c, max34440_id);
   551	
   552	/* This is the driver that will be inserted */
   553	static struct i2c_driver max34440_driver = {
   554		.driver = {
   555			   .name = "max34440",
   556			   },
   557		.probe = max34440_probe,
   558		.id_table = max34440_id,
   559	};
   560	
   561	module_i2c_driver(max34440_driver);
   562	
   563	MODULE_AUTHOR("Guenter Roeck");
   564	MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
   565	MODULE_LICENSE("GPL");
 > 566	MODULE_IMPORT_NS(PMBUS);
diff mbox series

Patch

diff --git a/Documentation/hwmon/max34440.rst b/Documentation/hwmon/max34440.rst
index 162d289f08140341e8e76ab7033834ba07a8b935..b1f3f75091bb8e233e766c24913194dd62b0cd90 100644
--- a/Documentation/hwmon/max34440.rst
+++ b/Documentation/hwmon/max34440.rst
@@ -35,7 +35,7 @@  Supported chips:
 
     PMBus 16-Channel V/I Monitor and 12-Channel Sequencer/Marginer
 
-    Prefixes: 'max34451'
+    Prefixes: 'max34451', 'max34451_na6'
 
     Addresses scanned: -
 
@@ -93,6 +93,10 @@  attribute is set to a positive value. Power measurement is only enabled if
 channel 1 (3) is configured for voltage measurement, and channel 2 (4) is
 configured for current measurement.
 
+For MAX34451, version MAX34451ETNA6+ and later are denoted with prefix
+'max34451_na6'. The previous versions contains some errors on the PMBUS
+addresses and these are fixed on the later versions.
+
 
 Platform data support
 ---------------------
@@ -192,4 +196,4 @@  temp[1-8]_reset_history	Write any value to reset history.
    - MAX34451 supports attribute groups in[1-16] (or curr[1-16] based on
      input pins) and temp[1-5].
    - MAX34460 supports attribute groups in[1-12] and temp[1-5].
-   - MAX34461 supports attribute groups in[1-16] and temp[1-5].
+   - MAX34461 supports attribute groups in[1-16] and temp[1-5].
\ No newline at end of file
diff --git a/drivers/hwmon/pmbus/max34440.c b/drivers/hwmon/pmbus/max34440.c
index c9dda33831ff24e7b5e2fd1956a65e6bd2bfcbb9..d483c01f256c96f048c9da5981f10f52402d981c 100644
--- a/drivers/hwmon/pmbus/max34440.c
+++ b/drivers/hwmon/pmbus/max34440.c
@@ -14,7 +14,15 @@ 
 #include <linux/i2c.h>
 #include "pmbus.h"
 
-enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
+enum chips {
+	max34440,
+	max34441,
+	max34446,
+	max34451,
+	max34451_na6,
+	max34460,
+	max34461,
+};
 
 #define MAX34440_MFR_VOUT_PEAK		0xd4
 #define MAX34440_MFR_IOUT_PEAK		0xd5
@@ -34,6 +42,7 @@  enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
 /*
  * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT
  * swapped from the standard pmbus spec addresses.
+ * For max34451, version MAX34451ETNA6+ and later has this issue fixed.
  */
 #define MAX34440_IOUT_OC_WARN_LIMIT	0x46
 #define MAX34440_IOUT_OC_FAULT_LIMIT	0x4A
@@ -59,12 +68,20 @@  static int max34440_read_word_data(struct i2c_client *client, int page,
 
 	switch (reg) {
 	case PMBUS_IOUT_OC_FAULT_LIMIT:
-		ret = pmbus_read_word_data(client, page, phase,
-					   MAX34440_IOUT_OC_FAULT_LIMIT);
+		if (data->id == max34451_na6)
+			ret = pmbus_read_word_data(client, page, phase,
+						   PMBUS_IOUT_OC_FAULT_LIMIT);
+		else
+			ret = pmbus_read_word_data(client, page, phase,
+						   MAX34440_IOUT_OC_FAULT_LIMIT);
 		break;
 	case PMBUS_IOUT_OC_WARN_LIMIT:
-		ret = pmbus_read_word_data(client, page, phase,
-					   MAX34440_IOUT_OC_WARN_LIMIT);
+		if (data->id == max34451_na6)
+			ret = pmbus_read_word_data(client, page, phase,
+						   PMBUS_IOUT_OC_WARN_LIMIT);
+		else
+			ret = pmbus_read_word_data(client, page, phase,
+						   MAX34440_IOUT_OC_WARN_LIMIT);
 		break;
 	case PMBUS_VIRT_READ_VOUT_MIN:
 		ret = pmbus_read_word_data(client, page, phase,
@@ -75,7 +92,8 @@  static int max34440_read_word_data(struct i2c_client *client, int page,
 					   MAX34440_MFR_VOUT_PEAK);
 		break;
 	case PMBUS_VIRT_READ_IOUT_AVG:
-		if (data->id != max34446 && data->id != max34451)
+		if (data->id != max34446 && data->id != max34451 &&
+		    data->id != max34451_na6)
 			return -ENXIO;
 		ret = pmbus_read_word_data(client, page, phase,
 					   MAX34446_MFR_IOUT_AVG);
@@ -133,12 +151,20 @@  static int max34440_write_word_data(struct i2c_client *client, int page,
 
 	switch (reg) {
 	case PMBUS_IOUT_OC_FAULT_LIMIT:
-		ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT,
-					    word);
+		if (data->id == max34451_na6)
+			ret = pmbus_write_word_data(client, page, PMBUS_IOUT_OC_FAULT_LIMIT,
+						    word);
+		else
+			ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT,
+						    word);
 		break;
 	case PMBUS_IOUT_OC_WARN_LIMIT:
-		ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT,
-					    word);
+		if (data->id == max34451_na6)
+			ret = pmbus_write_word_data(client, page, PMBUS_IOUT_OC_WARN_LIMIT,
+						    word);
+		else
+			ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT,
+						    word);
 		break;
 	case PMBUS_VIRT_RESET_POUT_HISTORY:
 		ret = pmbus_write_word_data(client, page,
@@ -159,7 +185,8 @@  static int max34440_write_word_data(struct i2c_client *client, int page,
 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
 		ret = pmbus_write_word_data(client, page,
 					    MAX34440_MFR_IOUT_PEAK, 0);
-		if (!ret && (data->id == max34446 || data->id == max34451))
+		if (!ret && (data->id == max34446 || data->id == max34451 ||
+			     data->id == max34451_na6))
 			ret = pmbus_write_word_data(client, page,
 					MAX34446_MFR_IOUT_AVG, 0);
 
@@ -270,6 +297,29 @@  static int max34451_set_supported_funcs(struct i2c_client *client,
 	return 0;
 }
 
+#define MAX34451_COMMON_INFO \
+	.pages = 21, \
+	.format[PSC_VOLTAGE_OUT] = direct, \
+	.format[PSC_TEMPERATURE] = direct, \
+	.format[PSC_CURRENT_OUT] = direct, \
+	.m[PSC_VOLTAGE_OUT] = 1, \
+	.b[PSC_VOLTAGE_OUT] = 0, \
+	.R[PSC_VOLTAGE_OUT] = 3, \
+	.m[PSC_CURRENT_OUT] = 1, \
+	.b[PSC_CURRENT_OUT] = 0, \
+	.R[PSC_CURRENT_OUT] = 2, \
+	.m[PSC_TEMPERATURE] = 1, \
+	.b[PSC_TEMPERATURE] = 0, \
+	.R[PSC_TEMPERATURE] = 2, \
+	/* func 0-15 is set dynamically before probing */ \
+	.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
+	.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
+	.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
+	.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
+	.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, \
+	.read_word_data = max34440_read_word_data, \
+	.write_word_data = max34440_write_word_data,
+
 static struct pmbus_driver_info max34440_info[] = {
 	[max34440] = {
 		.pages = 14,
@@ -394,27 +444,10 @@  static struct pmbus_driver_info max34440_info[] = {
 		.write_word_data = max34440_write_word_data,
 	},
 	[max34451] = {
-		.pages = 21,
-		.format[PSC_VOLTAGE_OUT] = direct,
-		.format[PSC_TEMPERATURE] = direct,
-		.format[PSC_CURRENT_OUT] = direct,
-		.m[PSC_VOLTAGE_OUT] = 1,
-		.b[PSC_VOLTAGE_OUT] = 0,
-		.R[PSC_VOLTAGE_OUT] = 3,
-		.m[PSC_CURRENT_OUT] = 1,
-		.b[PSC_CURRENT_OUT] = 0,
-		.R[PSC_CURRENT_OUT] = 2,
-		.m[PSC_TEMPERATURE] = 1,
-		.b[PSC_TEMPERATURE] = 0,
-		.R[PSC_TEMPERATURE] = 2,
-		/* func 0-15 is set dynamically before probing */
-		.func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
-		.func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
-		.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
-		.func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
-		.func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
-		.read_word_data = max34440_read_word_data,
-		.write_word_data = max34440_write_word_data,
+		MAX34451_COMMON_INFO,
+	},
+	[max34451_na6] = {
+		MAX34451_COMMON_INFO,
 	},
 	[max34460] = {
 		.pages = 18,
@@ -495,7 +528,7 @@  static int max34440_probe(struct i2c_client *client)
 	data->id = i2c_match_id(max34440_id, client)->driver_data;
 	data->info = max34440_info[data->id];
 
-	if (data->id == max34451) {
+	if (data->id == max34451 || data->id == max34451_na6) {
 		rv = max34451_set_supported_funcs(client, data);
 		if (rv)
 			return rv;
@@ -509,6 +542,7 @@  static const struct i2c_device_id max34440_id[] = {
 	{"max34441", max34441},
 	{"max34446", max34446},
 	{"max34451", max34451},
+	{"max34451_na6", max34451_na6},
 	{"max34460", max34460},
 	{"max34461", max34461},
 	{}
@@ -529,4 +563,4 @@  module_i2c_driver(max34440_driver);
 MODULE_AUTHOR("Guenter Roeck");
 MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
 MODULE_LICENSE("GPL");
-MODULE_IMPORT_NS("PMBUS");
+MODULE_IMPORT_NS(PMBUS);