0001
0002
0003
0004
0005
0006
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
0036
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
0226
0227
0228
0229
0230
0231
0232
0233
0234
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,
0283 .m[PSC_VOLTAGE_OUT] = 1,
0284 .b[PSC_VOLTAGE_OUT] = 0,
0285 .R[PSC_VOLTAGE_OUT] = 3,
0286 .m[PSC_CURRENT_OUT] = 1,
0287 .b[PSC_CURRENT_OUT] = 0,
0288 .R[PSC_CURRENT_OUT] = 3,
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
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
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
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);