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"); 511