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 <linux/delay.h> 16 #include "pmbus.h" 17 18 enum chips { 19 adpm12160, 20 adpm12200, 21 adpm12250, 22 max34440, 23 max34441, 24 max34446, 25 max34451, 26 max34460, 27 max34461, 28 }; 29 30 /* 31 * Firmware is sometimes not ready if we try and read the 32 * data from the page immediately after setting. Maxim 33 * recommends 50us delay due to the chip failing to clock 34 * stretch long enough here. 35 */ 36 #define MAX34440_PAGE_CHANGE_DELAY 50 37 38 #define MAX34440_MFR_VOUT_PEAK 0xd4 39 #define MAX34440_MFR_IOUT_PEAK 0xd5 40 #define MAX34440_MFR_TEMPERATURE_PEAK 0xd6 41 #define MAX34440_MFR_VOUT_MIN 0xd7 42 43 #define MAX34446_MFR_POUT_PEAK 0xe0 44 #define MAX34446_MFR_POUT_AVG 0xe1 45 #define MAX34446_MFR_IOUT_AVG 0xe2 46 #define MAX34446_MFR_TEMPERATURE_AVG 0xe3 47 48 #define MAX34440_STATUS_OC_WARN BIT(0) 49 #define MAX34440_STATUS_OC_FAULT BIT(1) 50 #define MAX34440_STATUS_OT_FAULT BIT(5) 51 #define MAX34440_STATUS_OT_WARN BIT(6) 52 53 /* 54 * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT 55 * swapped from the standard pmbus spec addresses. 56 * For max34451, version MAX34451ETNA6+ and later has this issue fixed. 57 */ 58 #define MAX34440_IOUT_OC_WARN_LIMIT 0x46 59 #define MAX34440_IOUT_OC_FAULT_LIMIT 0x4A 60 61 #define MAX34451ETNA6_MFR_REV 0x0012 62 63 #define MAX34451_MFR_CHANNEL_CONFIG 0xe4 64 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK 0x3f 65 66 struct max34440_data { 67 int id; 68 struct pmbus_driver_info info; 69 u8 iout_oc_warn_limit; 70 u8 iout_oc_fault_limit; 71 }; 72 73 #define to_max34440_data(x) container_of(x, struct max34440_data, info) 74 75 static int max34440_read_word_data(struct i2c_client *client, int page, 76 int phase, int reg) 77 { 78 int ret; 79 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); 80 const struct max34440_data *data = to_max34440_data(info); 81 82 switch (reg) { 83 case PMBUS_IOUT_OC_FAULT_LIMIT: 84 ret = pmbus_read_word_data(client, page, phase, 85 data->iout_oc_fault_limit); 86 break; 87 case PMBUS_IOUT_OC_WARN_LIMIT: 88 ret = pmbus_read_word_data(client, page, phase, 89 data->iout_oc_warn_limit); 90 break; 91 case PMBUS_VIRT_READ_VOUT_MIN: 92 ret = pmbus_read_word_data(client, page, phase, 93 MAX34440_MFR_VOUT_MIN); 94 break; 95 case PMBUS_VIRT_READ_VOUT_MAX: 96 ret = pmbus_read_word_data(client, page, phase, 97 MAX34440_MFR_VOUT_PEAK); 98 break; 99 case PMBUS_VIRT_READ_IOUT_AVG: 100 if (data->id != max34446 && data->id != max34451 && 101 data->id != adpm12160 && data->id != adpm12200 && 102 data->id != adpm12250) 103 return -ENXIO; 104 ret = pmbus_read_word_data(client, page, phase, 105 MAX34446_MFR_IOUT_AVG); 106 break; 107 case PMBUS_VIRT_READ_IOUT_MAX: 108 ret = pmbus_read_word_data(client, page, phase, 109 MAX34440_MFR_IOUT_PEAK); 110 break; 111 case PMBUS_VIRT_READ_POUT_AVG: 112 if (data->id != max34446) 113 return -ENXIO; 114 ret = pmbus_read_word_data(client, page, phase, 115 MAX34446_MFR_POUT_AVG); 116 break; 117 case PMBUS_VIRT_READ_POUT_MAX: 118 if (data->id != max34446) 119 return -ENXIO; 120 ret = pmbus_read_word_data(client, page, phase, 121 MAX34446_MFR_POUT_PEAK); 122 break; 123 case PMBUS_VIRT_READ_TEMP_AVG: 124 if (data->id != max34446 && data->id != max34460 && 125 data->id != max34461) 126 return -ENXIO; 127 ret = pmbus_read_word_data(client, page, phase, 128 MAX34446_MFR_TEMPERATURE_AVG); 129 break; 130 case PMBUS_VIRT_READ_TEMP_MAX: 131 ret = pmbus_read_word_data(client, page, phase, 132 MAX34440_MFR_TEMPERATURE_PEAK); 133 break; 134 case PMBUS_VIRT_RESET_POUT_HISTORY: 135 if (data->id != max34446) 136 return -ENXIO; 137 ret = 0; 138 break; 139 case PMBUS_VIRT_RESET_VOUT_HISTORY: 140 case PMBUS_VIRT_RESET_IOUT_HISTORY: 141 case PMBUS_VIRT_RESET_TEMP_HISTORY: 142 ret = 0; 143 break; 144 default: 145 ret = -ENODATA; 146 break; 147 } 148 return ret; 149 } 150 151 static int max34440_write_word_data(struct i2c_client *client, int page, 152 int reg, u16 word) 153 { 154 const struct pmbus_driver_info *info = pmbus_get_driver_info(client); 155 const struct max34440_data *data = to_max34440_data(info); 156 int ret; 157 158 switch (reg) { 159 case PMBUS_IOUT_OC_FAULT_LIMIT: 160 ret = pmbus_write_word_data(client, page, data->iout_oc_fault_limit, 161 word); 162 break; 163 case PMBUS_IOUT_OC_WARN_LIMIT: 164 ret = pmbus_write_word_data(client, page, data->iout_oc_warn_limit, 165 word); 166 break; 167 case PMBUS_VIRT_RESET_POUT_HISTORY: 168 ret = pmbus_write_word_data(client, page, 169 MAX34446_MFR_POUT_PEAK, 0); 170 if (ret) 171 break; 172 ret = pmbus_write_word_data(client, page, 173 MAX34446_MFR_POUT_AVG, 0); 174 break; 175 case PMBUS_VIRT_RESET_VOUT_HISTORY: 176 ret = pmbus_write_word_data(client, page, 177 MAX34440_MFR_VOUT_MIN, 0x7fff); 178 if (ret) 179 break; 180 ret = pmbus_write_word_data(client, page, 181 MAX34440_MFR_VOUT_PEAK, 0); 182 break; 183 case PMBUS_VIRT_RESET_IOUT_HISTORY: 184 ret = pmbus_write_word_data(client, page, 185 MAX34440_MFR_IOUT_PEAK, 0); 186 if (!ret && (data->id == max34446 || data->id == max34451 || 187 data->id == adpm12160 || data->id == adpm12200 || 188 data->id == adpm12250)) 189 ret = pmbus_write_word_data(client, page, 190 MAX34446_MFR_IOUT_AVG, 0); 191 192 break; 193 case PMBUS_VIRT_RESET_TEMP_HISTORY: 194 ret = pmbus_write_word_data(client, page, 195 MAX34440_MFR_TEMPERATURE_PEAK, 196 0x8000); 197 if (!ret && data->id == max34446) 198 ret = pmbus_write_word_data(client, page, 199 MAX34446_MFR_TEMPERATURE_AVG, 0); 200 break; 201 default: 202 ret = -ENODATA; 203 break; 204 } 205 return ret; 206 } 207 208 static int max34440_read_byte_data(struct i2c_client *client, int page, int reg) 209 { 210 int ret = 0; 211 int mfg_status; 212 213 if (page >= 0) { 214 ret = pmbus_set_page(client, page, 0xff); 215 if (ret < 0) 216 return ret; 217 } 218 219 switch (reg) { 220 case PMBUS_STATUS_IOUT: 221 mfg_status = pmbus_read_word_data(client, 0, 0xff, 222 PMBUS_STATUS_MFR_SPECIFIC); 223 if (mfg_status < 0) 224 return mfg_status; 225 if (mfg_status & MAX34440_STATUS_OC_WARN) 226 ret |= PB_IOUT_OC_WARNING; 227 if (mfg_status & MAX34440_STATUS_OC_FAULT) 228 ret |= PB_IOUT_OC_FAULT; 229 break; 230 case PMBUS_STATUS_TEMPERATURE: 231 mfg_status = pmbus_read_word_data(client, 0, 0xff, 232 PMBUS_STATUS_MFR_SPECIFIC); 233 if (mfg_status < 0) 234 return mfg_status; 235 if (mfg_status & MAX34440_STATUS_OT_WARN) 236 ret |= PB_TEMP_OT_WARNING; 237 if (mfg_status & MAX34440_STATUS_OT_FAULT) 238 ret |= PB_TEMP_OT_FAULT; 239 break; 240 default: 241 ret = -ENODATA; 242 break; 243 } 244 return ret; 245 } 246 247 static int max34451_set_supported_funcs(struct i2c_client *client, 248 struct max34440_data *data) 249 { 250 /* 251 * Each of the channel 0-15 can be configured to monitor the following 252 * functions based on MFR_CHANNEL_CONFIG[5:0] 253 * 0x10: Sequencing + voltage monitoring (only valid for PAGES 0–11) 254 * 0x20: Voltage monitoring (no sequencing) 255 * 0x21: Voltage read only 256 * 0x22: Current monitoring 257 * 0x23: Current read only 258 * 0x30: General-purpose input active low 259 * 0x34: General-purpose input active high 260 * 0x00: Disabled 261 */ 262 263 int page, rv; 264 bool max34451_na6 = false; 265 266 rv = i2c_smbus_read_word_data(client, PMBUS_MFR_REVISION); 267 if (rv < 0) 268 return rv; 269 270 if (rv >= MAX34451ETNA6_MFR_REV) { 271 max34451_na6 = true; 272 data->info.format[PSC_VOLTAGE_IN] = direct; 273 data->info.format[PSC_CURRENT_IN] = direct; 274 data->info.m[PSC_VOLTAGE_IN] = 1; 275 data->info.b[PSC_VOLTAGE_IN] = 0; 276 data->info.R[PSC_VOLTAGE_IN] = 3; 277 data->info.m[PSC_CURRENT_IN] = 1; 278 data->info.b[PSC_CURRENT_IN] = 0; 279 data->info.R[PSC_CURRENT_IN] = 2; 280 data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT; 281 data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT; 282 } 283 284 for (page = 0; page < 16; page++) { 285 rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page); 286 fsleep(MAX34440_PAGE_CHANGE_DELAY); 287 if (rv < 0) 288 return rv; 289 290 rv = i2c_smbus_read_word_data(client, 291 MAX34451_MFR_CHANNEL_CONFIG); 292 if (rv < 0) 293 return rv; 294 295 switch (rv & MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK) { 296 case 0x10: 297 case 0x20: 298 data->info.func[page] = PMBUS_HAVE_VOUT | 299 PMBUS_HAVE_STATUS_VOUT; 300 301 if (max34451_na6) 302 data->info.func[page] |= PMBUS_HAVE_VIN | 303 PMBUS_HAVE_STATUS_INPUT; 304 break; 305 case 0x21: 306 data->info.func[page] = PMBUS_HAVE_VOUT; 307 308 if (max34451_na6) 309 data->info.func[page] |= PMBUS_HAVE_VIN; 310 break; 311 case 0x22: 312 data->info.func[page] = PMBUS_HAVE_IOUT | 313 PMBUS_HAVE_STATUS_IOUT; 314 315 if (max34451_na6) 316 data->info.func[page] |= PMBUS_HAVE_IIN | 317 PMBUS_HAVE_STATUS_INPUT; 318 break; 319 case 0x23: 320 data->info.func[page] = PMBUS_HAVE_IOUT; 321 322 if (max34451_na6) 323 data->info.func[page] |= PMBUS_HAVE_IIN; 324 break; 325 default: 326 break; 327 } 328 } 329 330 return 0; 331 } 332 333 static struct pmbus_driver_info max34440_info[] = { 334 [adpm12160] = { 335 .pages = 19, 336 .format[PSC_VOLTAGE_IN] = direct, 337 .format[PSC_VOLTAGE_OUT] = direct, 338 .format[PSC_CURRENT_IN] = direct, 339 .format[PSC_CURRENT_OUT] = direct, 340 .format[PSC_TEMPERATURE] = direct, 341 .m[PSC_VOLTAGE_IN] = 125, 342 .b[PSC_VOLTAGE_IN] = 0, 343 .R[PSC_VOLTAGE_IN] = 0, 344 .m[PSC_VOLTAGE_OUT] = 125, 345 .b[PSC_VOLTAGE_OUT] = 0, 346 .R[PSC_VOLTAGE_OUT] = 0, 347 .m[PSC_CURRENT_IN] = 250, 348 .b[PSC_CURRENT_IN] = 0, 349 .R[PSC_CURRENT_IN] = -1, 350 .m[PSC_CURRENT_OUT] = 250, 351 .b[PSC_CURRENT_OUT] = 0, 352 .R[PSC_CURRENT_OUT] = -1, 353 .m[PSC_TEMPERATURE] = 1, 354 .b[PSC_TEMPERATURE] = 0, 355 .R[PSC_TEMPERATURE] = 2, 356 /* absent func below [18] are not for monitoring */ 357 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 358 .func[4] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 359 .func[5] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 360 .func[6] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 361 .func[7] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 362 .func[8] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 363 .func[9] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT, 364 .func[10] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT, 365 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 366 .read_word_data = max34440_read_word_data, 367 .write_word_data = max34440_write_word_data, 368 }, 369 [adpm12200] = { 370 .pages = 19, 371 .format[PSC_VOLTAGE_IN] = direct, 372 .format[PSC_VOLTAGE_OUT] = direct, 373 .format[PSC_CURRENT_IN] = direct, 374 .format[PSC_CURRENT_OUT] = direct, 375 .format[PSC_TEMPERATURE] = direct, 376 .m[PSC_VOLTAGE_IN] = 125, 377 .b[PSC_VOLTAGE_IN] = 0, 378 .R[PSC_VOLTAGE_IN] = 0, 379 .m[PSC_VOLTAGE_OUT] = 125, 380 .b[PSC_VOLTAGE_OUT] = 0, 381 .R[PSC_VOLTAGE_OUT] = 0, 382 .m[PSC_CURRENT_IN] = 250, 383 .b[PSC_CURRENT_IN] = 0, 384 .R[PSC_CURRENT_IN] = -1, 385 .m[PSC_CURRENT_OUT] = 250, 386 .b[PSC_CURRENT_OUT] = 0, 387 .R[PSC_CURRENT_OUT] = -1, 388 .m[PSC_TEMPERATURE] = 1, 389 .b[PSC_TEMPERATURE] = 0, 390 .R[PSC_TEMPERATURE] = 2, 391 /* absent func below [18] are not for monitoring */ 392 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 393 .func[4] = PMBUS_HAVE_STATUS_IOUT, 394 .func[5] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 395 .func[6] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 396 .func[7] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 397 .func[8] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 398 .func[9] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT, 399 .func[10] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT, 400 .func[14] = PMBUS_HAVE_IOUT, 401 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 402 .read_word_data = max34440_read_word_data, 403 .write_word_data = max34440_write_word_data, 404 }, 405 [adpm12250] = { 406 .pages = 19, 407 .format[PSC_VOLTAGE_IN] = direct, 408 .format[PSC_VOLTAGE_OUT] = direct, 409 .format[PSC_CURRENT_IN] = direct, 410 .format[PSC_CURRENT_OUT] = direct, 411 .format[PSC_TEMPERATURE] = direct, 412 .m[PSC_VOLTAGE_IN] = 125, 413 .b[PSC_VOLTAGE_IN] = 0, 414 .R[PSC_VOLTAGE_IN] = 0, 415 .m[PSC_VOLTAGE_OUT] = 125, 416 .b[PSC_VOLTAGE_OUT] = 0, 417 .R[PSC_VOLTAGE_OUT] = 0, 418 .m[PSC_CURRENT_IN] = 250, 419 .b[PSC_CURRENT_IN] = 0, 420 .R[PSC_CURRENT_IN] = -1, 421 .m[PSC_CURRENT_OUT] = 250, 422 .b[PSC_CURRENT_OUT] = 0, 423 .R[PSC_CURRENT_OUT] = -1, 424 .m[PSC_TEMPERATURE] = 1, 425 .b[PSC_TEMPERATURE] = 0, 426 .R[PSC_TEMPERATURE] = 2, 427 /* absent func below [18] are not for monitoring */ 428 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 429 .func[4] = PMBUS_HAVE_STATUS_IOUT, 430 .func[5] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 431 .func[6] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 432 .func[9] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT, 433 .func[10] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT, 434 .func[14] = PMBUS_HAVE_IOUT, 435 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 436 .read_word_data = max34440_read_word_data, 437 .write_word_data = max34440_write_word_data, 438 }, 439 [max34440] = { 440 .pages = 14, 441 .format[PSC_VOLTAGE_IN] = direct, 442 .format[PSC_VOLTAGE_OUT] = direct, 443 .format[PSC_TEMPERATURE] = direct, 444 .format[PSC_CURRENT_OUT] = direct, 445 .m[PSC_VOLTAGE_IN] = 1, 446 .b[PSC_VOLTAGE_IN] = 0, 447 .R[PSC_VOLTAGE_IN] = 3, /* R = 0 in datasheet reflects mV */ 448 .m[PSC_VOLTAGE_OUT] = 1, 449 .b[PSC_VOLTAGE_OUT] = 0, 450 .R[PSC_VOLTAGE_OUT] = 3, /* R = 0 in datasheet reflects mV */ 451 .m[PSC_CURRENT_OUT] = 1, 452 .b[PSC_CURRENT_OUT] = 0, 453 .R[PSC_CURRENT_OUT] = 3, /* R = 0 in datasheet reflects mA */ 454 .m[PSC_TEMPERATURE] = 1, 455 .b[PSC_TEMPERATURE] = 0, 456 .R[PSC_TEMPERATURE] = 2, 457 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 458 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 459 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 460 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 461 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 462 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 463 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 464 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 465 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 466 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 467 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 468 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 469 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 470 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 471 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 472 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 473 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 474 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 475 .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 476 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 477 .read_byte_data = max34440_read_byte_data, 478 .read_word_data = max34440_read_word_data, 479 .write_word_data = max34440_write_word_data, 480 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY, 481 }, 482 [max34441] = { 483 .pages = 12, 484 .format[PSC_VOLTAGE_IN] = direct, 485 .format[PSC_VOLTAGE_OUT] = direct, 486 .format[PSC_TEMPERATURE] = direct, 487 .format[PSC_CURRENT_OUT] = direct, 488 .format[PSC_FAN] = direct, 489 .m[PSC_VOLTAGE_IN] = 1, 490 .b[PSC_VOLTAGE_IN] = 0, 491 .R[PSC_VOLTAGE_IN] = 3, 492 .m[PSC_VOLTAGE_OUT] = 1, 493 .b[PSC_VOLTAGE_OUT] = 0, 494 .R[PSC_VOLTAGE_OUT] = 3, 495 .m[PSC_CURRENT_OUT] = 1, 496 .b[PSC_CURRENT_OUT] = 0, 497 .R[PSC_CURRENT_OUT] = 3, 498 .m[PSC_TEMPERATURE] = 1, 499 .b[PSC_TEMPERATURE] = 0, 500 .R[PSC_TEMPERATURE] = 2, 501 .m[PSC_FAN] = 1, 502 .b[PSC_FAN] = 0, 503 .R[PSC_FAN] = 0, 504 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 505 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 506 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 507 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 508 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 509 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 510 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 511 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 512 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 513 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 514 .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12, 515 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 516 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 517 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 518 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 519 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 520 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 521 .read_byte_data = max34440_read_byte_data, 522 .read_word_data = max34440_read_word_data, 523 .write_word_data = max34440_write_word_data, 524 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY, 525 }, 526 [max34446] = { 527 .pages = 7, 528 .format[PSC_VOLTAGE_IN] = direct, 529 .format[PSC_VOLTAGE_OUT] = direct, 530 .format[PSC_TEMPERATURE] = direct, 531 .format[PSC_CURRENT_OUT] = direct, 532 .format[PSC_POWER] = direct, 533 .m[PSC_VOLTAGE_IN] = 1, 534 .b[PSC_VOLTAGE_IN] = 0, 535 .R[PSC_VOLTAGE_IN] = 3, 536 .m[PSC_VOLTAGE_OUT] = 1, 537 .b[PSC_VOLTAGE_OUT] = 0, 538 .R[PSC_VOLTAGE_OUT] = 3, 539 .m[PSC_CURRENT_OUT] = 1, 540 .b[PSC_CURRENT_OUT] = 0, 541 .R[PSC_CURRENT_OUT] = 3, 542 .m[PSC_POWER] = 1, 543 .b[PSC_POWER] = 0, 544 .R[PSC_POWER] = 3, 545 .m[PSC_TEMPERATURE] = 1, 546 .b[PSC_TEMPERATURE] = 0, 547 .R[PSC_TEMPERATURE] = 2, 548 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 549 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT, 550 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 551 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 552 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 553 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT, 554 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 555 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 556 .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 557 .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 558 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 559 .read_byte_data = max34440_read_byte_data, 560 .read_word_data = max34440_read_word_data, 561 .write_word_data = max34440_write_word_data, 562 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY, 563 }, 564 [max34451] = { 565 .pages = 21, 566 .format[PSC_VOLTAGE_OUT] = direct, 567 .format[PSC_TEMPERATURE] = direct, 568 .format[PSC_CURRENT_OUT] = direct, 569 .m[PSC_VOLTAGE_OUT] = 1, 570 .b[PSC_VOLTAGE_OUT] = 0, 571 .R[PSC_VOLTAGE_OUT] = 3, 572 .m[PSC_CURRENT_OUT] = 1, 573 .b[PSC_CURRENT_OUT] = 0, 574 .R[PSC_CURRENT_OUT] = 2, 575 .m[PSC_TEMPERATURE] = 1, 576 .b[PSC_TEMPERATURE] = 0, 577 .R[PSC_TEMPERATURE] = 2, 578 /* func 0-15 is set dynamically before probing */ 579 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 580 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 581 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 582 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 583 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 584 .read_word_data = max34440_read_word_data, 585 .write_word_data = max34440_write_word_data, 586 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY, 587 }, 588 [max34460] = { 589 .pages = 18, 590 .format[PSC_VOLTAGE_OUT] = direct, 591 .format[PSC_TEMPERATURE] = direct, 592 .m[PSC_VOLTAGE_OUT] = 1, 593 .b[PSC_VOLTAGE_OUT] = 0, 594 .R[PSC_VOLTAGE_OUT] = 3, 595 .m[PSC_TEMPERATURE] = 1, 596 .b[PSC_TEMPERATURE] = 0, 597 .R[PSC_TEMPERATURE] = 2, 598 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 599 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 600 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 601 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 602 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 603 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 604 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 605 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 606 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 607 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 608 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 609 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 610 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 611 .func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 612 .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 613 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 614 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 615 .read_word_data = max34440_read_word_data, 616 .write_word_data = max34440_write_word_data, 617 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY, 618 }, 619 [max34461] = { 620 .pages = 23, 621 .format[PSC_VOLTAGE_OUT] = direct, 622 .format[PSC_TEMPERATURE] = direct, 623 .m[PSC_VOLTAGE_OUT] = 1, 624 .b[PSC_VOLTAGE_OUT] = 0, 625 .R[PSC_VOLTAGE_OUT] = 3, 626 .m[PSC_TEMPERATURE] = 1, 627 .b[PSC_TEMPERATURE] = 0, 628 .R[PSC_TEMPERATURE] = 2, 629 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 630 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 631 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 632 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 633 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 634 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 635 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 636 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 637 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 638 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 639 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 640 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 641 .func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 642 .func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 643 .func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 644 .func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 645 /* page 16 is reserved */ 646 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 647 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 648 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 649 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 650 .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, 651 .read_word_data = max34440_read_word_data, 652 .write_word_data = max34440_write_word_data, 653 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY, 654 }, 655 }; 656 657 static int max34440_probe(struct i2c_client *client) 658 { 659 struct max34440_data *data; 660 int rv; 661 662 data = devm_kzalloc(&client->dev, sizeof(struct max34440_data), 663 GFP_KERNEL); 664 if (!data) 665 return -ENOMEM; 666 data->id = (uintptr_t)i2c_get_match_data(client); 667 data->info = max34440_info[data->id]; 668 data->iout_oc_fault_limit = MAX34440_IOUT_OC_FAULT_LIMIT; 669 data->iout_oc_warn_limit = MAX34440_IOUT_OC_WARN_LIMIT; 670 671 if (data->id == max34451) { 672 rv = max34451_set_supported_funcs(client, data); 673 if (rv) 674 return rv; 675 } else if (data->id == adpm12160 || data->id == adpm12200 || 676 data->id == adpm12250) { 677 data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT; 678 data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT; 679 } 680 681 return pmbus_do_probe(client, &data->info); 682 } 683 684 static const struct i2c_device_id max34440_id[] = { 685 { .name = "adpm12160", .driver_data = adpm12160 }, 686 { .name = "adpm12200", .driver_data = adpm12200 }, 687 { .name = "adpm12250", .driver_data = adpm12250 }, 688 { .name = "max34440", .driver_data = max34440 }, 689 { .name = "max34441", .driver_data = max34441 }, 690 { .name = "max34446", .driver_data = max34446 }, 691 { .name = "max34451", .driver_data = max34451 }, 692 { .name = "max34460", .driver_data = max34460 }, 693 { .name = "max34461", .driver_data = max34461 }, 694 { } 695 }; 696 MODULE_DEVICE_TABLE(i2c, max34440_id); 697 698 /* This is the driver that will be inserted */ 699 static struct i2c_driver max34440_driver = { 700 .driver = { 701 .name = "max34440", 702 }, 703 .probe = max34440_probe, 704 .id_table = max34440_id, 705 }; 706 707 module_i2c_driver(max34440_driver); 708 709 MODULE_AUTHOR("Guenter Roeck"); 710 MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441"); 711 MODULE_LICENSE("GPL"); 712 MODULE_IMPORT_NS("PMBUS"); 713