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