Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Hardware monitoring driver for Maxim MAX34440/MAX34441
0004  *
0005  * Copyright (c) 2011 Ericsson AB.
0006  * Copyright (c) 2012 Guenter Roeck
0007  */
0008 
0009 #include <linux/bitops.h>
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/init.h>
0013 #include <linux/err.h>
0014 #include <linux/i2c.h>
0015 #include "pmbus.h"
0016 
0017 enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
0018 
0019 #define MAX34440_MFR_VOUT_PEAK      0xd4
0020 #define MAX34440_MFR_IOUT_PEAK      0xd5
0021 #define MAX34440_MFR_TEMPERATURE_PEAK   0xd6
0022 #define MAX34440_MFR_VOUT_MIN       0xd7
0023 
0024 #define MAX34446_MFR_POUT_PEAK      0xe0
0025 #define MAX34446_MFR_POUT_AVG       0xe1
0026 #define MAX34446_MFR_IOUT_AVG       0xe2
0027 #define MAX34446_MFR_TEMPERATURE_AVG    0xe3
0028 
0029 #define MAX34440_STATUS_OC_WARN     BIT(0)
0030 #define MAX34440_STATUS_OC_FAULT    BIT(1)
0031 #define MAX34440_STATUS_OT_FAULT    BIT(5)
0032 #define MAX34440_STATUS_OT_WARN     BIT(6)
0033 
0034 /*
0035  * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT
0036  * swapped from the standard pmbus spec addresses.
0037  */
0038 #define MAX34440_IOUT_OC_WARN_LIMIT 0x46
0039 #define MAX34440_IOUT_OC_FAULT_LIMIT    0x4A
0040 
0041 #define MAX34451_MFR_CHANNEL_CONFIG 0xe4
0042 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK    0x3f
0043 
0044 struct max34440_data {
0045     int id;
0046     struct pmbus_driver_info info;
0047 };
0048 
0049 #define to_max34440_data(x)  container_of(x, struct max34440_data, info)
0050 
0051 static const struct i2c_device_id max34440_id[];
0052 
0053 static int max34440_read_word_data(struct i2c_client *client, int page,
0054                    int phase, int reg)
0055 {
0056     int ret;
0057     const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
0058     const struct max34440_data *data = to_max34440_data(info);
0059 
0060     switch (reg) {
0061     case PMBUS_IOUT_OC_FAULT_LIMIT:
0062         ret = pmbus_read_word_data(client, page, phase,
0063                        MAX34440_IOUT_OC_FAULT_LIMIT);
0064         break;
0065     case PMBUS_IOUT_OC_WARN_LIMIT:
0066         ret = pmbus_read_word_data(client, page, phase,
0067                        MAX34440_IOUT_OC_WARN_LIMIT);
0068         break;
0069     case PMBUS_VIRT_READ_VOUT_MIN:
0070         ret = pmbus_read_word_data(client, page, phase,
0071                        MAX34440_MFR_VOUT_MIN);
0072         break;
0073     case PMBUS_VIRT_READ_VOUT_MAX:
0074         ret = pmbus_read_word_data(client, page, phase,
0075                        MAX34440_MFR_VOUT_PEAK);
0076         break;
0077     case PMBUS_VIRT_READ_IOUT_AVG:
0078         if (data->id != max34446 && data->id != max34451)
0079             return -ENXIO;
0080         ret = pmbus_read_word_data(client, page, phase,
0081                        MAX34446_MFR_IOUT_AVG);
0082         break;
0083     case PMBUS_VIRT_READ_IOUT_MAX:
0084         ret = pmbus_read_word_data(client, page, phase,
0085                        MAX34440_MFR_IOUT_PEAK);
0086         break;
0087     case PMBUS_VIRT_READ_POUT_AVG:
0088         if (data->id != max34446)
0089             return -ENXIO;
0090         ret = pmbus_read_word_data(client, page, phase,
0091                        MAX34446_MFR_POUT_AVG);
0092         break;
0093     case PMBUS_VIRT_READ_POUT_MAX:
0094         if (data->id != max34446)
0095             return -ENXIO;
0096         ret = pmbus_read_word_data(client, page, phase,
0097                        MAX34446_MFR_POUT_PEAK);
0098         break;
0099     case PMBUS_VIRT_READ_TEMP_AVG:
0100         if (data->id != max34446 && data->id != max34460 &&
0101             data->id != max34461)
0102             return -ENXIO;
0103         ret = pmbus_read_word_data(client, page, phase,
0104                        MAX34446_MFR_TEMPERATURE_AVG);
0105         break;
0106     case PMBUS_VIRT_READ_TEMP_MAX:
0107         ret = pmbus_read_word_data(client, page, phase,
0108                        MAX34440_MFR_TEMPERATURE_PEAK);
0109         break;
0110     case PMBUS_VIRT_RESET_POUT_HISTORY:
0111         if (data->id != max34446)
0112             return -ENXIO;
0113         ret = 0;
0114         break;
0115     case PMBUS_VIRT_RESET_VOUT_HISTORY:
0116     case PMBUS_VIRT_RESET_IOUT_HISTORY:
0117     case PMBUS_VIRT_RESET_TEMP_HISTORY:
0118         ret = 0;
0119         break;
0120     default:
0121         ret = -ENODATA;
0122         break;
0123     }
0124     return ret;
0125 }
0126 
0127 static int max34440_write_word_data(struct i2c_client *client, int page,
0128                     int reg, u16 word)
0129 {
0130     const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
0131     const struct max34440_data *data = to_max34440_data(info);
0132     int ret;
0133 
0134     switch (reg) {
0135     case PMBUS_IOUT_OC_FAULT_LIMIT:
0136         ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT,
0137                         word);
0138         break;
0139     case PMBUS_IOUT_OC_WARN_LIMIT:
0140         ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT,
0141                         word);
0142         break;
0143     case PMBUS_VIRT_RESET_POUT_HISTORY:
0144         ret = pmbus_write_word_data(client, page,
0145                         MAX34446_MFR_POUT_PEAK, 0);
0146         if (ret)
0147             break;
0148         ret = pmbus_write_word_data(client, page,
0149                         MAX34446_MFR_POUT_AVG, 0);
0150         break;
0151     case PMBUS_VIRT_RESET_VOUT_HISTORY:
0152         ret = pmbus_write_word_data(client, page,
0153                         MAX34440_MFR_VOUT_MIN, 0x7fff);
0154         if (ret)
0155             break;
0156         ret = pmbus_write_word_data(client, page,
0157                         MAX34440_MFR_VOUT_PEAK, 0);
0158         break;
0159     case PMBUS_VIRT_RESET_IOUT_HISTORY:
0160         ret = pmbus_write_word_data(client, page,
0161                         MAX34440_MFR_IOUT_PEAK, 0);
0162         if (!ret && (data->id == max34446 || data->id == max34451))
0163             ret = pmbus_write_word_data(client, page,
0164                     MAX34446_MFR_IOUT_AVG, 0);
0165 
0166         break;
0167     case PMBUS_VIRT_RESET_TEMP_HISTORY:
0168         ret = pmbus_write_word_data(client, page,
0169                         MAX34440_MFR_TEMPERATURE_PEAK,
0170                         0x8000);
0171         if (!ret && data->id == max34446)
0172             ret = pmbus_write_word_data(client, page,
0173                     MAX34446_MFR_TEMPERATURE_AVG, 0);
0174         break;
0175     default:
0176         ret = -ENODATA;
0177         break;
0178     }
0179     return ret;
0180 }
0181 
0182 static int max34440_read_byte_data(struct i2c_client *client, int page, int reg)
0183 {
0184     int ret = 0;
0185     int mfg_status;
0186 
0187     if (page >= 0) {
0188         ret = pmbus_set_page(client, page, 0xff);
0189         if (ret < 0)
0190             return ret;
0191     }
0192 
0193     switch (reg) {
0194     case PMBUS_STATUS_IOUT:
0195         mfg_status = pmbus_read_word_data(client, 0, 0xff,
0196                           PMBUS_STATUS_MFR_SPECIFIC);
0197         if (mfg_status < 0)
0198             return mfg_status;
0199         if (mfg_status & MAX34440_STATUS_OC_WARN)
0200             ret |= PB_IOUT_OC_WARNING;
0201         if (mfg_status & MAX34440_STATUS_OC_FAULT)
0202             ret |= PB_IOUT_OC_FAULT;
0203         break;
0204     case PMBUS_STATUS_TEMPERATURE:
0205         mfg_status = pmbus_read_word_data(client, 0, 0xff,
0206                           PMBUS_STATUS_MFR_SPECIFIC);
0207         if (mfg_status < 0)
0208             return mfg_status;
0209         if (mfg_status & MAX34440_STATUS_OT_WARN)
0210             ret |= PB_TEMP_OT_WARNING;
0211         if (mfg_status & MAX34440_STATUS_OT_FAULT)
0212             ret |= PB_TEMP_OT_FAULT;
0213         break;
0214     default:
0215         ret = -ENODATA;
0216         break;
0217     }
0218     return ret;
0219 }
0220 
0221 static int max34451_set_supported_funcs(struct i2c_client *client,
0222                      struct max34440_data *data)
0223 {
0224     /*
0225      * Each of the channel 0-15 can be configured to monitor the following
0226      * functions based on MFR_CHANNEL_CONFIG[5:0]
0227      * 0x10: Sequencing + voltage monitoring (only valid for PAGES 0–11)
0228      * 0x20: Voltage monitoring (no sequencing)
0229      * 0x21: Voltage read only
0230      * 0x22: Current monitoring
0231      * 0x23: Current read only
0232      * 0x30: General-purpose input active low
0233      * 0x34: General-purpose input active high
0234      * 0x00:  Disabled
0235      */
0236 
0237     int page, rv;
0238 
0239     for (page = 0; page < 16; page++) {
0240         rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
0241         if (rv < 0)
0242             return rv;
0243 
0244         rv = i2c_smbus_read_word_data(client,
0245                           MAX34451_MFR_CHANNEL_CONFIG);
0246         if (rv < 0)
0247             return rv;
0248 
0249         switch (rv & MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK) {
0250         case 0x10:
0251         case 0x20:
0252             data->info.func[page] = PMBUS_HAVE_VOUT |
0253                 PMBUS_HAVE_STATUS_VOUT;
0254             break;
0255         case 0x21:
0256             data->info.func[page] = PMBUS_HAVE_VOUT;
0257             break;
0258         case 0x22:
0259             data->info.func[page] = PMBUS_HAVE_IOUT |
0260                 PMBUS_HAVE_STATUS_IOUT;
0261             break;
0262         case 0x23:
0263             data->info.func[page] = PMBUS_HAVE_IOUT;
0264             break;
0265         default:
0266             break;
0267         }
0268     }
0269 
0270     return 0;
0271 }
0272 
0273 static struct pmbus_driver_info max34440_info[] = {
0274     [max34440] = {
0275         .pages = 14,
0276         .format[PSC_VOLTAGE_IN] = direct,
0277         .format[PSC_VOLTAGE_OUT] = direct,
0278         .format[PSC_TEMPERATURE] = direct,
0279         .format[PSC_CURRENT_OUT] = direct,
0280         .m[PSC_VOLTAGE_IN] = 1,
0281         .b[PSC_VOLTAGE_IN] = 0,
0282         .R[PSC_VOLTAGE_IN] = 3,     /* R = 0 in datasheet reflects mV */
0283         .m[PSC_VOLTAGE_OUT] = 1,
0284         .b[PSC_VOLTAGE_OUT] = 0,
0285         .R[PSC_VOLTAGE_OUT] = 3,    /* R = 0 in datasheet reflects mV */
0286         .m[PSC_CURRENT_OUT] = 1,
0287         .b[PSC_CURRENT_OUT] = 0,
0288         .R[PSC_CURRENT_OUT] = 3,    /* R = 0 in datasheet reflects mA */
0289         .m[PSC_TEMPERATURE] = 1,
0290         .b[PSC_TEMPERATURE] = 0,
0291         .R[PSC_TEMPERATURE] = 2,
0292         .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0293           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0294         .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0295           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0296         .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0297           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0298         .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0299           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0300         .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0301           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0302         .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0303           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0304         .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0305         .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0306         .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0307         .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0308         .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0309         .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0310         .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0311         .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0312         .read_byte_data = max34440_read_byte_data,
0313         .read_word_data = max34440_read_word_data,
0314         .write_word_data = max34440_write_word_data,
0315     },
0316     [max34441] = {
0317         .pages = 12,
0318         .format[PSC_VOLTAGE_IN] = direct,
0319         .format[PSC_VOLTAGE_OUT] = direct,
0320         .format[PSC_TEMPERATURE] = direct,
0321         .format[PSC_CURRENT_OUT] = direct,
0322         .format[PSC_FAN] = direct,
0323         .m[PSC_VOLTAGE_IN] = 1,
0324         .b[PSC_VOLTAGE_IN] = 0,
0325         .R[PSC_VOLTAGE_IN] = 3,
0326         .m[PSC_VOLTAGE_OUT] = 1,
0327         .b[PSC_VOLTAGE_OUT] = 0,
0328         .R[PSC_VOLTAGE_OUT] = 3,
0329         .m[PSC_CURRENT_OUT] = 1,
0330         .b[PSC_CURRENT_OUT] = 0,
0331         .R[PSC_CURRENT_OUT] = 3,
0332         .m[PSC_TEMPERATURE] = 1,
0333         .b[PSC_TEMPERATURE] = 0,
0334         .R[PSC_TEMPERATURE] = 2,
0335         .m[PSC_FAN] = 1,
0336         .b[PSC_FAN] = 0,
0337         .R[PSC_FAN] = 0,
0338         .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0339           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0340         .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0341           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0342         .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0343           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0344         .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0345           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0346         .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0347           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0348         .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
0349         .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0350         .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0351         .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0352         .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0353         .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0354         .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0355         .read_byte_data = max34440_read_byte_data,
0356         .read_word_data = max34440_read_word_data,
0357         .write_word_data = max34440_write_word_data,
0358     },
0359     [max34446] = {
0360         .pages = 7,
0361         .format[PSC_VOLTAGE_IN] = direct,
0362         .format[PSC_VOLTAGE_OUT] = direct,
0363         .format[PSC_TEMPERATURE] = direct,
0364         .format[PSC_CURRENT_OUT] = direct,
0365         .format[PSC_POWER] = direct,
0366         .m[PSC_VOLTAGE_IN] = 1,
0367         .b[PSC_VOLTAGE_IN] = 0,
0368         .R[PSC_VOLTAGE_IN] = 3,
0369         .m[PSC_VOLTAGE_OUT] = 1,
0370         .b[PSC_VOLTAGE_OUT] = 0,
0371         .R[PSC_VOLTAGE_OUT] = 3,
0372         .m[PSC_CURRENT_OUT] = 1,
0373         .b[PSC_CURRENT_OUT] = 0,
0374         .R[PSC_CURRENT_OUT] = 3,
0375         .m[PSC_POWER] = 1,
0376         .b[PSC_POWER] = 0,
0377         .R[PSC_POWER] = 3,
0378         .m[PSC_TEMPERATURE] = 1,
0379         .b[PSC_TEMPERATURE] = 0,
0380         .R[PSC_TEMPERATURE] = 2,
0381         .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0382           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
0383         .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0384           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0385         .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0386           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
0387         .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
0388           | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
0389         .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0390         .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0391         .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0392         .read_byte_data = max34440_read_byte_data,
0393         .read_word_data = max34440_read_word_data,
0394         .write_word_data = max34440_write_word_data,
0395     },
0396     [max34451] = {
0397         .pages = 21,
0398         .format[PSC_VOLTAGE_OUT] = direct,
0399         .format[PSC_TEMPERATURE] = direct,
0400         .format[PSC_CURRENT_OUT] = direct,
0401         .m[PSC_VOLTAGE_OUT] = 1,
0402         .b[PSC_VOLTAGE_OUT] = 0,
0403         .R[PSC_VOLTAGE_OUT] = 3,
0404         .m[PSC_CURRENT_OUT] = 1,
0405         .b[PSC_CURRENT_OUT] = 0,
0406         .R[PSC_CURRENT_OUT] = 2,
0407         .m[PSC_TEMPERATURE] = 1,
0408         .b[PSC_TEMPERATURE] = 0,
0409         .R[PSC_TEMPERATURE] = 2,
0410         /* func 0-15 is set dynamically before probing */
0411         .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0412         .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0413         .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0414         .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0415         .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0416         .read_word_data = max34440_read_word_data,
0417         .write_word_data = max34440_write_word_data,
0418     },
0419     [max34460] = {
0420         .pages = 18,
0421         .format[PSC_VOLTAGE_OUT] = direct,
0422         .format[PSC_TEMPERATURE] = direct,
0423         .m[PSC_VOLTAGE_OUT] = 1,
0424         .b[PSC_VOLTAGE_OUT] = 0,
0425         .R[PSC_VOLTAGE_OUT] = 3,
0426         .m[PSC_TEMPERATURE] = 1,
0427         .b[PSC_TEMPERATURE] = 0,
0428         .R[PSC_TEMPERATURE] = 2,
0429         .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0430         .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0431         .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0432         .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0433         .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0434         .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0435         .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0436         .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0437         .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0438         .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0439         .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0440         .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0441         .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0442         .func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0443         .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0444         .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0445         .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0446         .read_word_data = max34440_read_word_data,
0447         .write_word_data = max34440_write_word_data,
0448     },
0449     [max34461] = {
0450         .pages = 23,
0451         .format[PSC_VOLTAGE_OUT] = direct,
0452         .format[PSC_TEMPERATURE] = direct,
0453         .m[PSC_VOLTAGE_OUT] = 1,
0454         .b[PSC_VOLTAGE_OUT] = 0,
0455         .R[PSC_VOLTAGE_OUT] = 3,
0456         .m[PSC_TEMPERATURE] = 1,
0457         .b[PSC_TEMPERATURE] = 0,
0458         .R[PSC_TEMPERATURE] = 2,
0459         .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0460         .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0461         .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0462         .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0463         .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0464         .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0465         .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0466         .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0467         .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0468         .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0469         .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0470         .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0471         .func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0472         .func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0473         .func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0474         .func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0475         /* page 16 is reserved */
0476         .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0477         .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0478         .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0479         .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0480         .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
0481         .read_word_data = max34440_read_word_data,
0482         .write_word_data = max34440_write_word_data,
0483     },
0484 };
0485 
0486 static int max34440_probe(struct i2c_client *client)
0487 {
0488     struct max34440_data *data;
0489     int rv;
0490 
0491     data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
0492                 GFP_KERNEL);
0493     if (!data)
0494         return -ENOMEM;
0495     data->id = i2c_match_id(max34440_id, client)->driver_data;
0496     data->info = max34440_info[data->id];
0497 
0498     if (data->id == max34451) {
0499         rv = max34451_set_supported_funcs(client, data);
0500         if (rv)
0501             return rv;
0502     }
0503 
0504     return pmbus_do_probe(client, &data->info);
0505 }
0506 
0507 static const struct i2c_device_id max34440_id[] = {
0508     {"max34440", max34440},
0509     {"max34441", max34441},
0510     {"max34446", max34446},
0511     {"max34451", max34451},
0512     {"max34460", max34460},
0513     {"max34461", max34461},
0514     {}
0515 };
0516 MODULE_DEVICE_TABLE(i2c, max34440_id);
0517 
0518 /* This is the driver that will be inserted */
0519 static struct i2c_driver max34440_driver = {
0520     .driver = {
0521            .name = "max34440",
0522            },
0523     .probe_new = max34440_probe,
0524     .id_table = max34440_id,
0525 };
0526 
0527 module_i2c_driver(max34440_driver);
0528 
0529 MODULE_AUTHOR("Guenter Roeck");
0530 MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
0531 MODULE_LICENSE("GPL");
0532 MODULE_IMPORT_NS(PMBUS);