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