objtool: Re-arrange validate_functions()
[linux-block.git] / drivers / hwmon / pmbus / max34440.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Hardware monitoring driver for Maxim MAX34440/MAX34441
4  *
5  * Copyright (c) 2011 Ericsson AB.
6  * Copyright (c) 2012 Guenter Roeck
7  */
8
9 #include <linux/bitops.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/err.h>
14 #include <linux/i2c.h>
15 #include "pmbus.h"
16
17 enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
18
19 #define MAX34440_MFR_VOUT_PEAK          0xd4
20 #define MAX34440_MFR_IOUT_PEAK          0xd5
21 #define MAX34440_MFR_TEMPERATURE_PEAK   0xd6
22 #define MAX34440_MFR_VOUT_MIN           0xd7
23
24 #define MAX34446_MFR_POUT_PEAK          0xe0
25 #define MAX34446_MFR_POUT_AVG           0xe1
26 #define MAX34446_MFR_IOUT_AVG           0xe2
27 #define MAX34446_MFR_TEMPERATURE_AVG    0xe3
28
29 #define MAX34440_STATUS_OC_WARN         BIT(0)
30 #define MAX34440_STATUS_OC_FAULT        BIT(1)
31 #define MAX34440_STATUS_OT_FAULT        BIT(5)
32 #define MAX34440_STATUS_OT_WARN         BIT(6)
33
34 #define MAX34451_MFR_CHANNEL_CONFIG     0xe4
35 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK    0x3f
36
37 struct max34440_data {
38         int id;
39         struct pmbus_driver_info info;
40 };
41
42 #define to_max34440_data(x)  container_of(x, struct max34440_data, info)
43
44 static int max34440_read_word_data(struct i2c_client *client, int page, int reg)
45 {
46         int ret;
47         const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
48         const struct max34440_data *data = to_max34440_data(info);
49
50         switch (reg) {
51         case PMBUS_VIRT_READ_VOUT_MIN:
52                 ret = pmbus_read_word_data(client, page,
53                                            MAX34440_MFR_VOUT_MIN);
54                 break;
55         case PMBUS_VIRT_READ_VOUT_MAX:
56                 ret = pmbus_read_word_data(client, page,
57                                            MAX34440_MFR_VOUT_PEAK);
58                 break;
59         case PMBUS_VIRT_READ_IOUT_AVG:
60                 if (data->id != max34446 && data->id != max34451)
61                         return -ENXIO;
62                 ret = pmbus_read_word_data(client, page,
63                                            MAX34446_MFR_IOUT_AVG);
64                 break;
65         case PMBUS_VIRT_READ_IOUT_MAX:
66                 ret = pmbus_read_word_data(client, page,
67                                            MAX34440_MFR_IOUT_PEAK);
68                 break;
69         case PMBUS_VIRT_READ_POUT_AVG:
70                 if (data->id != max34446)
71                         return -ENXIO;
72                 ret = pmbus_read_word_data(client, page,
73                                            MAX34446_MFR_POUT_AVG);
74                 break;
75         case PMBUS_VIRT_READ_POUT_MAX:
76                 if (data->id != max34446)
77                         return -ENXIO;
78                 ret = pmbus_read_word_data(client, page,
79                                            MAX34446_MFR_POUT_PEAK);
80                 break;
81         case PMBUS_VIRT_READ_TEMP_AVG:
82                 if (data->id != max34446 && data->id != max34460 &&
83                     data->id != max34461)
84                         return -ENXIO;
85                 ret = pmbus_read_word_data(client, page,
86                                            MAX34446_MFR_TEMPERATURE_AVG);
87                 break;
88         case PMBUS_VIRT_READ_TEMP_MAX:
89                 ret = pmbus_read_word_data(client, page,
90                                            MAX34440_MFR_TEMPERATURE_PEAK);
91                 break;
92         case PMBUS_VIRT_RESET_POUT_HISTORY:
93                 if (data->id != max34446)
94                         return -ENXIO;
95                 ret = 0;
96                 break;
97         case PMBUS_VIRT_RESET_VOUT_HISTORY:
98         case PMBUS_VIRT_RESET_IOUT_HISTORY:
99         case PMBUS_VIRT_RESET_TEMP_HISTORY:
100                 ret = 0;
101                 break;
102         default:
103                 ret = -ENODATA;
104                 break;
105         }
106         return ret;
107 }
108
109 static int max34440_write_word_data(struct i2c_client *client, int page,
110                                     int reg, u16 word)
111 {
112         const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
113         const struct max34440_data *data = to_max34440_data(info);
114         int ret;
115
116         switch (reg) {
117         case PMBUS_VIRT_RESET_POUT_HISTORY:
118                 ret = pmbus_write_word_data(client, page,
119                                             MAX34446_MFR_POUT_PEAK, 0);
120                 if (ret)
121                         break;
122                 ret = pmbus_write_word_data(client, page,
123                                             MAX34446_MFR_POUT_AVG, 0);
124                 break;
125         case PMBUS_VIRT_RESET_VOUT_HISTORY:
126                 ret = pmbus_write_word_data(client, page,
127                                             MAX34440_MFR_VOUT_MIN, 0x7fff);
128                 if (ret)
129                         break;
130                 ret = pmbus_write_word_data(client, page,
131                                             MAX34440_MFR_VOUT_PEAK, 0);
132                 break;
133         case PMBUS_VIRT_RESET_IOUT_HISTORY:
134                 ret = pmbus_write_word_data(client, page,
135                                             MAX34440_MFR_IOUT_PEAK, 0);
136                 if (!ret && (data->id == max34446 || data->id == max34451))
137                         ret = pmbus_write_word_data(client, page,
138                                         MAX34446_MFR_IOUT_AVG, 0);
139
140                 break;
141         case PMBUS_VIRT_RESET_TEMP_HISTORY:
142                 ret = pmbus_write_word_data(client, page,
143                                             MAX34440_MFR_TEMPERATURE_PEAK,
144                                             0x8000);
145                 if (!ret && data->id == max34446)
146                         ret = pmbus_write_word_data(client, page,
147                                         MAX34446_MFR_TEMPERATURE_AVG, 0);
148                 break;
149         default:
150                 ret = -ENODATA;
151                 break;
152         }
153         return ret;
154 }
155
156 static int max34440_read_byte_data(struct i2c_client *client, int page, int reg)
157 {
158         int ret = 0;
159         int mfg_status;
160
161         if (page >= 0) {
162                 ret = pmbus_set_page(client, page);
163                 if (ret < 0)
164                         return ret;
165         }
166
167         switch (reg) {
168         case PMBUS_STATUS_IOUT:
169                 mfg_status = pmbus_read_word_data(client, 0,
170                                                   PMBUS_STATUS_MFR_SPECIFIC);
171                 if (mfg_status < 0)
172                         return mfg_status;
173                 if (mfg_status & MAX34440_STATUS_OC_WARN)
174                         ret |= PB_IOUT_OC_WARNING;
175                 if (mfg_status & MAX34440_STATUS_OC_FAULT)
176                         ret |= PB_IOUT_OC_FAULT;
177                 break;
178         case PMBUS_STATUS_TEMPERATURE:
179                 mfg_status = pmbus_read_word_data(client, 0,
180                                                   PMBUS_STATUS_MFR_SPECIFIC);
181                 if (mfg_status < 0)
182                         return mfg_status;
183                 if (mfg_status & MAX34440_STATUS_OT_WARN)
184                         ret |= PB_TEMP_OT_WARNING;
185                 if (mfg_status & MAX34440_STATUS_OT_FAULT)
186                         ret |= PB_TEMP_OT_FAULT;
187                 break;
188         default:
189                 ret = -ENODATA;
190                 break;
191         }
192         return ret;
193 }
194
195 static int max34451_set_supported_funcs(struct i2c_client *client,
196                                          struct max34440_data *data)
197 {
198         /*
199          * Each of the channel 0-15 can be configured to monitor the following
200          * functions based on MFR_CHANNEL_CONFIG[5:0]
201          * 0x10: Sequencing + voltage monitoring (only valid for PAGES 0–11)
202          * 0x20: Voltage monitoring (no sequencing)
203          * 0x21: Voltage read only
204          * 0x22: Current monitoring
205          * 0x23: Current read only
206          * 0x30: General-purpose input active low
207          * 0x34: General-purpose input active high
208          * 0x00:  Disabled
209          */
210
211         int page, rv;
212
213         for (page = 0; page < 16; page++) {
214                 rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
215                 if (rv < 0)
216                         return rv;
217
218                 rv = i2c_smbus_read_word_data(client,
219                                               MAX34451_MFR_CHANNEL_CONFIG);
220                 if (rv < 0)
221                         return rv;
222
223                 switch (rv & MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK) {
224                 case 0x10:
225                 case 0x20:
226                         data->info.func[page] = PMBUS_HAVE_VOUT |
227                                 PMBUS_HAVE_STATUS_VOUT;
228                         break;
229                 case 0x21:
230                         data->info.func[page] = PMBUS_HAVE_VOUT;
231                         break;
232                 case 0x22:
233                         data->info.func[page] = PMBUS_HAVE_IOUT |
234                                 PMBUS_HAVE_STATUS_IOUT;
235                         break;
236                 case 0x23:
237                         data->info.func[page] = PMBUS_HAVE_IOUT;
238                         break;
239                 default:
240                         break;
241                 }
242         }
243
244         return 0;
245 }
246
247 static struct pmbus_driver_info max34440_info[] = {
248         [max34440] = {
249                 .pages = 14,
250                 .format[PSC_VOLTAGE_IN] = direct,
251                 .format[PSC_VOLTAGE_OUT] = direct,
252                 .format[PSC_TEMPERATURE] = direct,
253                 .format[PSC_CURRENT_OUT] = direct,
254                 .m[PSC_VOLTAGE_IN] = 1,
255                 .b[PSC_VOLTAGE_IN] = 0,
256                 .R[PSC_VOLTAGE_IN] = 3,     /* R = 0 in datasheet reflects mV */
257                 .m[PSC_VOLTAGE_OUT] = 1,
258                 .b[PSC_VOLTAGE_OUT] = 0,
259                 .R[PSC_VOLTAGE_OUT] = 3,    /* R = 0 in datasheet reflects mV */
260                 .m[PSC_CURRENT_OUT] = 1,
261                 .b[PSC_CURRENT_OUT] = 0,
262                 .R[PSC_CURRENT_OUT] = 3,    /* R = 0 in datasheet reflects mA */
263                 .m[PSC_TEMPERATURE] = 1,
264                 .b[PSC_TEMPERATURE] = 0,
265                 .R[PSC_TEMPERATURE] = 2,
266                 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
267                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
268                 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
269                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
270                 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
271                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
272                 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
273                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
274                 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
275                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
276                 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
277                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
278                 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
279                 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
280                 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
281                 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
282                 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
283                 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
284                 .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
285                 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
286                 .read_byte_data = max34440_read_byte_data,
287                 .read_word_data = max34440_read_word_data,
288                 .write_word_data = max34440_write_word_data,
289         },
290         [max34441] = {
291                 .pages = 12,
292                 .format[PSC_VOLTAGE_IN] = direct,
293                 .format[PSC_VOLTAGE_OUT] = direct,
294                 .format[PSC_TEMPERATURE] = direct,
295                 .format[PSC_CURRENT_OUT] = direct,
296                 .format[PSC_FAN] = direct,
297                 .m[PSC_VOLTAGE_IN] = 1,
298                 .b[PSC_VOLTAGE_IN] = 0,
299                 .R[PSC_VOLTAGE_IN] = 3,
300                 .m[PSC_VOLTAGE_OUT] = 1,
301                 .b[PSC_VOLTAGE_OUT] = 0,
302                 .R[PSC_VOLTAGE_OUT] = 3,
303                 .m[PSC_CURRENT_OUT] = 1,
304                 .b[PSC_CURRENT_OUT] = 0,
305                 .R[PSC_CURRENT_OUT] = 3,
306                 .m[PSC_TEMPERATURE] = 1,
307                 .b[PSC_TEMPERATURE] = 0,
308                 .R[PSC_TEMPERATURE] = 2,
309                 .m[PSC_FAN] = 1,
310                 .b[PSC_FAN] = 0,
311                 .R[PSC_FAN] = 0,
312                 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
313                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
314                 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
315                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
316                 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
317                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
318                 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
319                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
320                 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
321                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
322                 .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
323                 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
324                 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
325                 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
326                 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
327                 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
328                 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
329                 .read_byte_data = max34440_read_byte_data,
330                 .read_word_data = max34440_read_word_data,
331                 .write_word_data = max34440_write_word_data,
332         },
333         [max34446] = {
334                 .pages = 7,
335                 .format[PSC_VOLTAGE_IN] = direct,
336                 .format[PSC_VOLTAGE_OUT] = direct,
337                 .format[PSC_TEMPERATURE] = direct,
338                 .format[PSC_CURRENT_OUT] = direct,
339                 .format[PSC_POWER] = direct,
340                 .m[PSC_VOLTAGE_IN] = 1,
341                 .b[PSC_VOLTAGE_IN] = 0,
342                 .R[PSC_VOLTAGE_IN] = 3,
343                 .m[PSC_VOLTAGE_OUT] = 1,
344                 .b[PSC_VOLTAGE_OUT] = 0,
345                 .R[PSC_VOLTAGE_OUT] = 3,
346                 .m[PSC_CURRENT_OUT] = 1,
347                 .b[PSC_CURRENT_OUT] = 0,
348                 .R[PSC_CURRENT_OUT] = 3,
349                 .m[PSC_POWER] = 1,
350                 .b[PSC_POWER] = 0,
351                 .R[PSC_POWER] = 3,
352                 .m[PSC_TEMPERATURE] = 1,
353                 .b[PSC_TEMPERATURE] = 0,
354                 .R[PSC_TEMPERATURE] = 2,
355                 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
356                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
357                 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
358                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
359                 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
360                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
361                 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
362                   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
363                 .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
364                 .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
365                 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
366                 .read_byte_data = max34440_read_byte_data,
367                 .read_word_data = max34440_read_word_data,
368                 .write_word_data = max34440_write_word_data,
369         },
370         [max34451] = {
371                 .pages = 21,
372                 .format[PSC_VOLTAGE_OUT] = direct,
373                 .format[PSC_TEMPERATURE] = direct,
374                 .format[PSC_CURRENT_OUT] = direct,
375                 .m[PSC_VOLTAGE_OUT] = 1,
376                 .b[PSC_VOLTAGE_OUT] = 0,
377                 .R[PSC_VOLTAGE_OUT] = 3,
378                 .m[PSC_CURRENT_OUT] = 1,
379                 .b[PSC_CURRENT_OUT] = 0,
380                 .R[PSC_CURRENT_OUT] = 2,
381                 .m[PSC_TEMPERATURE] = 1,
382                 .b[PSC_TEMPERATURE] = 0,
383                 .R[PSC_TEMPERATURE] = 2,
384                 /* func 0-15 is set dynamically before probing */
385                 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
386                 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
387                 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
388                 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
389                 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
390                 .read_byte_data = max34440_read_byte_data,
391                 .read_word_data = max34440_read_word_data,
392                 .write_word_data = max34440_write_word_data,
393         },
394         [max34460] = {
395                 .pages = 18,
396                 .format[PSC_VOLTAGE_OUT] = direct,
397                 .format[PSC_TEMPERATURE] = direct,
398                 .m[PSC_VOLTAGE_OUT] = 1,
399                 .b[PSC_VOLTAGE_OUT] = 0,
400                 .R[PSC_VOLTAGE_OUT] = 3,
401                 .m[PSC_TEMPERATURE] = 1,
402                 .b[PSC_TEMPERATURE] = 0,
403                 .R[PSC_TEMPERATURE] = 2,
404                 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
405                 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
406                 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
407                 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
408                 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
409                 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
410                 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
411                 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
412                 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
413                 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
414                 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
415                 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
416                 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
417                 .func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
418                 .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
419                 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
420                 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
421                 .read_byte_data = max34440_read_byte_data,
422                 .read_word_data = max34440_read_word_data,
423                 .write_word_data = max34440_write_word_data,
424         },
425         [max34461] = {
426                 .pages = 23,
427                 .format[PSC_VOLTAGE_OUT] = direct,
428                 .format[PSC_TEMPERATURE] = direct,
429                 .m[PSC_VOLTAGE_OUT] = 1,
430                 .b[PSC_VOLTAGE_OUT] = 0,
431                 .R[PSC_VOLTAGE_OUT] = 3,
432                 .m[PSC_TEMPERATURE] = 1,
433                 .b[PSC_TEMPERATURE] = 0,
434                 .R[PSC_TEMPERATURE] = 2,
435                 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
436                 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
437                 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
438                 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
439                 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
440                 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
441                 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
442                 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
443                 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
444                 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
445                 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
446                 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
447                 .func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
448                 .func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
449                 .func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
450                 .func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
451                 /* page 16 is reserved */
452                 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
453                 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
454                 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
455                 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
456                 .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
457                 .read_byte_data = max34440_read_byte_data,
458                 .read_word_data = max34440_read_word_data,
459                 .write_word_data = max34440_write_word_data,
460         },
461 };
462
463 static int max34440_probe(struct i2c_client *client,
464                           const struct i2c_device_id *id)
465 {
466         struct max34440_data *data;
467         int rv;
468
469         data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
470                             GFP_KERNEL);
471         if (!data)
472                 return -ENOMEM;
473         data->id = id->driver_data;
474         data->info = max34440_info[id->driver_data];
475
476         if (data->id == max34451) {
477                 rv = max34451_set_supported_funcs(client, data);
478                 if (rv)
479                         return rv;
480         }
481
482         return pmbus_do_probe(client, id, &data->info);
483 }
484
485 static const struct i2c_device_id max34440_id[] = {
486         {"max34440", max34440},
487         {"max34441", max34441},
488         {"max34446", max34446},
489         {"max34451", max34451},
490         {"max34460", max34460},
491         {"max34461", max34461},
492         {}
493 };
494 MODULE_DEVICE_TABLE(i2c, max34440_id);
495
496 /* This is the driver that will be inserted */
497 static struct i2c_driver max34440_driver = {
498         .driver = {
499                    .name = "max34440",
500                    },
501         .probe = max34440_probe,
502         .remove = pmbus_do_remove,
503         .id_table = max34440_id,
504 };
505
506 module_i2c_driver(max34440_driver);
507
508 MODULE_AUTHOR("Guenter Roeck");
509 MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
510 MODULE_LICENSE("GPL");