1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Maxim MAX31785 PMBus 6-Channel Fan Controller 4 * 5 * Datasheet: 6 * https://datasheets.maximintegrated.com/en/ds/MAX31785.pdf 7 * 8 * Copyright(c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. 9 */ 10 11 #include "qemu/osdep.h" 12 #include "hw/i2c/pmbus_device.h" 13 #include "hw/irq.h" 14 #include "migration/vmstate.h" 15 #include "qapi/error.h" 16 #include "qapi/visitor.h" 17 #include "qemu/log.h" 18 #include "qemu/module.h" 19 20 #define TYPE_MAX31785 "max31785" 21 #define MAX31785(obj) OBJECT_CHECK(MAX31785State, (obj), TYPE_MAX31785) 22 23 /* MAX31785 mfr specific PMBus commands */ 24 #define MAX31785_MFR_MODE 0xD1 25 #define MAX31785_MFR_PSEN_CONFIG 0xD2 26 #define MAX31785_MFR_VOUT_PEAK 0xD4 27 #define MAX31785_MFR_TEMPERATURE_PEAK 0xD6 28 #define MAX31785_MFR_VOUT_MIN 0xD7 29 #define MAX31785_MFR_FAULT_RESPONSE 0xD9 30 #define MAX31785_MFR_NV_FAULT_LOG 0xDC 31 #define MAX31785_MFR_TIME_COUNT 0xDD 32 #define MAX31785_MFR_TEMP_SENSOR_CONFIG 0xF0 33 #define MAX31785_MFR_FAN_CONFIG 0xF1 34 #define MAX31785_MFR_FAN_LUT 0xF2 35 #define MAX31785_MFR_READ_FAN_PWM 0xF3 36 #define MAX31785_MFR_FAN_FAULT_LIMIT 0xF5 37 #define MAX31785_MFR_FAN_WARN_LIMIT 0xF6 38 #define MAX31785_MFR_FAN_RUN_TIME 0xF7 39 #define MAX31785_MFR_FAN_PWM_AVG 0xF8 40 #define MAX31785_MFR_FAN_PWM2RPM 0xF9 41 42 /* defaults as per the data sheet */ 43 #define MAX31785_DEFAULT_CAPABILITY 0x10 44 #define MAX31785_DEFAULT_VOUT_MODE 0x40 45 #define MAX31785_DEFAULT_VOUT_SCALE_MONITOR 0x7FFF 46 #define MAX31785_DEFAULT_FAN_COMMAND_1 0x7FFF 47 #define MAX31785_DEFAULT_OV_FAULT_LIMIT 0x7FFF 48 #define MAX31785_DEFAULT_OV_WARN_LIMIT 0x7FFF 49 #define MAX31785_DEFAULT_OT_FAULT_LIMIT 0x7FFF 50 #define MAX31785_DEFAULT_OT_WARN_LIMIT 0x7FFF 51 #define MAX31785_DEFAULT_PMBUS_REVISION 0x11 52 #define MAX31785_DEFAULT_MFR_ID 0x4D 53 #define MAX31785_DEFAULT_MFR_MODEL 0x53 54 #define MAX31785_DEFAULT_MFR_REVISION 0x3030 55 #define MAX31785A_DEFAULT_MFR_REVISION 0x3040 56 #define MAX31785B_DEFAULT_MFR_REVISION 0x3061 57 #define MAX31785B_DEFAULT_MFR_TEMPERATURE_PEAK 0x8000 58 #define MAX31785B_DEFAULT_MFR_VOUT_MIN 0x7FFF 59 #define MAX31785_DEFAULT_TEXT 0x3130313031303130 60 61 /* MAX31785 pages */ 62 #define MAX31785_TOTAL_NUM_PAGES 23 63 #define MAX31785_FAN_PAGES 6 64 #define MAX31785_MIN_FAN_PAGE 0 65 #define MAX31785_MAX_FAN_PAGE 5 66 #define MAX31785_MIN_TEMP_PAGE 6 67 #define MAX31785_MAX_TEMP_PAGE 16 68 #define MAX31785_MIN_ADC_VOLTAGE_PAGE 17 69 #define MAX31785_MAX_ADC_VOLTAGE_PAGE 22 70 71 /* FAN_CONFIG_1_2 */ 72 #define MAX31785_MFR_FAN_CONFIG 0xF1 73 #define MAX31785_FAN_CONFIG_ENABLE BIT(7) 74 #define MAX31785_FAN_CONFIG_RPM_PWM BIT(6) 75 #define MAX31785_FAN_CONFIG_PULSE(pulse) (pulse << 4) 76 #define MAX31785_DEFAULT_FAN_CONFIG_1_2(pulse) \ 77 (MAX31785_FAN_CONFIG_ENABLE | MAX31785_FAN_CONFIG_PULSE(pulse)) 78 #define MAX31785_DEFAULT_MFR_FAN_CONFIG 0x0000 79 80 /* fan speed in RPM */ 81 #define MAX31785_DEFAULT_FAN_SPEED 0x7fff 82 #define MAX31785_DEFAULT_FAN_STATUS 0x00 83 84 #define MAX31785_DEFAULT_FAN_MAX_PWM 0x2710 85 86 /* 87 * MAX31785State: 88 * @code: The command code received 89 * @page: Each page corresponds to a device monitored by the Max 31785 90 * The page register determines the available commands depending on device 91 * _____________________________________________________________________________ 92 * | 0 | Fan Connected to PWM0 | 93 * |_______|___________________________________________________________________| 94 * | 1 | Fan Connected to PWM1 | 95 * |_______|___________________________________________________________________| 96 * | 2 | Fan Connected to PWM2 | 97 * |_______|___________________________________________________________________| 98 * | 3 | Fan Connected to PWM3 | 99 * |_______|___________________________________________________________________| 100 * | 4 | Fan Connected to PWM4 | 101 * |_______|___________________________________________________________________| 102 * | 5 | Fan Connected to PWM5 | 103 * |_______|___________________________________________________________________| 104 * | 6 | Remote Thermal Diode Connected to ADC 0 | 105 * |_______|___________________________________________________________________| 106 * | 7 | Remote Thermal Diode Connected to ADC 1 | 107 * |_______|___________________________________________________________________| 108 * | 8 | Remote Thermal Diode Connected to ADC 2 | 109 * |_______|___________________________________________________________________| 110 * | 9 | Remote Thermal Diode Connected to ADC 3 | 111 * |_______|___________________________________________________________________| 112 * | 10 | Remote Thermal Diode Connected to ADC 4 | 113 * |_______|___________________________________________________________________| 114 * | 11 | Remote Thermal Diode Connected to ADC 5 | 115 * |_______|___________________________________________________________________| 116 * | 12 | Internal Temperature Sensor | 117 * |_______|___________________________________________________________________| 118 * | 13 | Remote I2C Temperature Sensor with Address 0 | 119 * |_______|___________________________________________________________________| 120 * | 14 | Remote I2C Temperature Sensor with Address 1 | 121 * |_______|___________________________________________________________________| 122 * | 15 | Remote I2C Temperature Sensor with Address 2 | 123 * |_______|___________________________________________________________________| 124 * | 16 | Remote I2C Temperature Sensor with Address 3 | 125 * |_______|___________________________________________________________________| 126 * | 17 | Remote I2C Temperature Sensor with Address 4 | 127 * |_______|___________________________________________________________________| 128 * | 17 | Remote Voltage Connected to ADC0 | 129 * |_______|___________________________________________________________________| 130 * | 18 | Remote Voltage Connected to ADC1 | 131 * |_______|___________________________________________________________________| 132 * | 19 | Remote Voltage Connected to ADC2 | 133 * |_______|___________________________________________________________________| 134 * | 20 | Remote Voltage Connected to ADC3 | 135 * |_______|___________________________________________________________________| 136 * | 21 | Remote Voltage Connected to ADC4 | 137 * |_______|___________________________________________________________________| 138 * | 22 | Remote Voltage Connected to ADC5 | 139 * |_______|___________________________________________________________________| 140 * |23-254 | Reserved | 141 * |_______|___________________________________________________________________| 142 * | 255 | Applies to all pages | 143 * |_______|___________________________________________________________________| 144 */ 145 146 /* Place holder to save the max31785 mfr specific registers */ 147 typedef struct MAX31785State { 148 PMBusDevice parent; 149 uint16_t mfr_mode[MAX31785_TOTAL_NUM_PAGES]; 150 uint16_t vout_peak[MAX31785_TOTAL_NUM_PAGES]; 151 uint16_t temperature_peak[MAX31785_TOTAL_NUM_PAGES]; 152 uint16_t vout_min[MAX31785_TOTAL_NUM_PAGES]; 153 uint8_t fault_response[MAX31785_TOTAL_NUM_PAGES]; 154 uint32_t time_count[MAX31785_TOTAL_NUM_PAGES]; 155 uint16_t temp_sensor_config[MAX31785_TOTAL_NUM_PAGES]; 156 uint16_t fan_config[MAX31785_TOTAL_NUM_PAGES]; 157 uint16_t read_fan_pwm[MAX31785_TOTAL_NUM_PAGES]; 158 uint16_t fan_fault_limit[MAX31785_TOTAL_NUM_PAGES]; 159 uint16_t fan_warn_limit[MAX31785_TOTAL_NUM_PAGES]; 160 uint16_t fan_run_time[MAX31785_TOTAL_NUM_PAGES]; 161 uint16_t fan_pwm_avg[MAX31785_TOTAL_NUM_PAGES]; 162 uint64_t fan_pwm2rpm[MAX31785_TOTAL_NUM_PAGES]; 163 uint64_t mfr_location; 164 uint64_t mfr_date; 165 uint64_t mfr_serial; 166 uint16_t mfr_revision; 167 } MAX31785State; 168 169 static uint8_t max31785_read_byte(PMBusDevice *pmdev) 170 { 171 MAX31785State *s = MAX31785(pmdev); 172 switch (pmdev->code) { 173 174 case PMBUS_FAN_CONFIG_1_2: 175 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 176 pmbus_send8(pmdev, pmdev->pages[pmdev->page].fan_config_1_2); 177 } 178 break; 179 180 case PMBUS_FAN_COMMAND_1: 181 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 182 pmbus_send16(pmdev, pmdev->pages[pmdev->page].fan_command_1); 183 } 184 break; 185 186 case PMBUS_READ_FAN_SPEED_1: 187 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 188 pmbus_send16(pmdev, pmdev->pages[pmdev->page].read_fan_speed_1); 189 } 190 break; 191 192 case PMBUS_STATUS_FANS_1_2: 193 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 194 pmbus_send16(pmdev, pmdev->pages[pmdev->page].status_fans_1_2); 195 } 196 break; 197 198 case PMBUS_MFR_REVISION: 199 pmbus_send16(pmdev, MAX31785_DEFAULT_MFR_REVISION); 200 break; 201 202 case PMBUS_MFR_ID: 203 pmbus_send8(pmdev, 0x4d); /* Maxim */ 204 break; 205 206 case PMBUS_MFR_MODEL: 207 pmbus_send8(pmdev, 0x53); 208 break; 209 210 case PMBUS_MFR_LOCATION: 211 pmbus_send64(pmdev, s->mfr_location); 212 break; 213 214 case PMBUS_MFR_DATE: 215 pmbus_send64(pmdev, s->mfr_date); 216 break; 217 218 case PMBUS_MFR_SERIAL: 219 pmbus_send64(pmdev, s->mfr_serial); 220 break; 221 222 case MAX31785_MFR_MODE: 223 pmbus_send16(pmdev, s->mfr_mode[pmdev->page]); 224 break; 225 226 case MAX31785_MFR_VOUT_PEAK: 227 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) && 228 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) { 229 pmbus_send16(pmdev, s->vout_peak[pmdev->page]); 230 } 231 break; 232 233 case MAX31785_MFR_TEMPERATURE_PEAK: 234 if ((pmdev->page >= MAX31785_MIN_TEMP_PAGE) && 235 (pmdev->page <= MAX31785_MAX_TEMP_PAGE)) { 236 pmbus_send16(pmdev, s->temperature_peak[pmdev->page]); 237 } 238 break; 239 240 case MAX31785_MFR_VOUT_MIN: 241 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) && 242 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) { 243 pmbus_send16(pmdev, s->vout_min[pmdev->page]); 244 } 245 break; 246 247 case MAX31785_MFR_FAULT_RESPONSE: 248 pmbus_send8(pmdev, s->fault_response[pmdev->page]); 249 break; 250 251 case MAX31785_MFR_TIME_COUNT: /* R/W 32 */ 252 pmbus_send32(pmdev, s->time_count[pmdev->page]); 253 break; 254 255 case MAX31785_MFR_TEMP_SENSOR_CONFIG: /* R/W 16 */ 256 if ((pmdev->page >= MAX31785_MIN_TEMP_PAGE) && 257 (pmdev->page <= MAX31785_MAX_TEMP_PAGE)) { 258 pmbus_send16(pmdev, s->temp_sensor_config[pmdev->page]); 259 } 260 break; 261 262 case MAX31785_MFR_FAN_CONFIG: /* R/W 16 */ 263 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 264 pmbus_send16(pmdev, s->fan_config[pmdev->page]); 265 } 266 break; 267 268 case MAX31785_MFR_READ_FAN_PWM: /* R/W 16 */ 269 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 270 pmbus_send16(pmdev, s->read_fan_pwm[pmdev->page]); 271 } 272 break; 273 274 case MAX31785_MFR_FAN_FAULT_LIMIT: /* R/W 16 */ 275 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 276 pmbus_send16(pmdev, s->fan_fault_limit[pmdev->page]); 277 } 278 break; 279 280 case MAX31785_MFR_FAN_WARN_LIMIT: /* R/W 16 */ 281 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 282 pmbus_send16(pmdev, s->fan_warn_limit[pmdev->page]); 283 } 284 break; 285 286 case MAX31785_MFR_FAN_RUN_TIME: /* R/W 16 */ 287 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 288 pmbus_send16(pmdev, s->fan_run_time[pmdev->page]); 289 } 290 break; 291 292 case MAX31785_MFR_FAN_PWM_AVG: /* R/W 16 */ 293 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 294 pmbus_send16(pmdev, s->fan_pwm_avg[pmdev->page]); 295 } 296 break; 297 298 case MAX31785_MFR_FAN_PWM2RPM: /* R/W 64 */ 299 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 300 pmbus_send64(pmdev, s->fan_pwm2rpm[pmdev->page]); 301 } 302 break; 303 304 default: 305 qemu_log_mask(LOG_GUEST_ERROR, 306 "%s: reading from unsupported register: 0x%02x\n", 307 __func__, pmdev->code); 308 break; 309 } 310 311 return 0xFF; 312 } 313 314 static int max31785_write_data(PMBusDevice *pmdev, const uint8_t *buf, 315 uint8_t len) 316 { 317 MAX31785State *s = MAX31785(pmdev); 318 if (len == 0) { 319 qemu_log_mask(LOG_GUEST_ERROR, "%s: writing empty data\n", __func__); 320 return -1; 321 } 322 323 pmdev->code = buf[0]; /* PMBus command code */ 324 325 if (len == 1) { 326 return 0; 327 } 328 329 /* Exclude command code from buffer */ 330 buf++; 331 len--; 332 333 switch (pmdev->code) { 334 335 case PMBUS_FAN_CONFIG_1_2: 336 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 337 pmdev->pages[pmdev->page].fan_config_1_2 = pmbus_receive8(pmdev); 338 } 339 break; 340 341 case PMBUS_FAN_COMMAND_1: 342 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 343 pmdev->pages[pmdev->page].fan_command_1 = pmbus_receive16(pmdev); 344 pmdev->pages[pmdev->page].read_fan_speed_1 = 345 ((MAX31785_DEFAULT_FAN_SPEED / MAX31785_DEFAULT_FAN_MAX_PWM) * 346 pmdev->pages[pmdev->page].fan_command_1); 347 } 348 break; 349 350 case PMBUS_MFR_LOCATION: /* R/W 64 */ 351 s->mfr_location = pmbus_receive64(pmdev); 352 break; 353 354 case PMBUS_MFR_DATE: /* R/W 64 */ 355 s->mfr_date = pmbus_receive64(pmdev); 356 break; 357 358 case PMBUS_MFR_SERIAL: /* R/W 64 */ 359 s->mfr_serial = pmbus_receive64(pmdev); 360 break; 361 362 case MAX31785_MFR_MODE: /* R/W word */ 363 s->mfr_mode[pmdev->page] = pmbus_receive16(pmdev); 364 break; 365 366 case MAX31785_MFR_VOUT_PEAK: /* R/W word */ 367 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) && 368 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) { 369 s->vout_peak[pmdev->page] = pmbus_receive16(pmdev); 370 } 371 break; 372 373 case MAX31785_MFR_TEMPERATURE_PEAK: /* R/W word */ 374 if ((pmdev->page >= 6) && (pmdev->page <= 16)) { 375 s->temperature_peak[pmdev->page] = pmbus_receive16(pmdev); 376 } 377 break; 378 379 case MAX31785_MFR_VOUT_MIN: /* R/W word */ 380 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) && 381 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) { 382 s->vout_min[pmdev->page] = pmbus_receive16(pmdev); 383 } 384 break; 385 386 case MAX31785_MFR_FAULT_RESPONSE: /* R/W 8 */ 387 s->fault_response[pmdev->page] = pmbus_receive8(pmdev); 388 break; 389 390 case MAX31785_MFR_TIME_COUNT: /* R/W 32 */ 391 s->time_count[pmdev->page] = pmbus_receive32(pmdev); 392 break; 393 394 case MAX31785_MFR_TEMP_SENSOR_CONFIG: /* R/W 16 */ 395 if ((pmdev->page >= MAX31785_MIN_TEMP_PAGE) && 396 (pmdev->page <= MAX31785_MAX_TEMP_PAGE)) { 397 s->temp_sensor_config[pmdev->page] = pmbus_receive16(pmdev); 398 } 399 break; 400 401 case MAX31785_MFR_FAN_CONFIG: /* R/W 16 */ 402 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 403 s->fan_config[pmdev->page] = pmbus_receive16(pmdev); 404 } 405 break; 406 407 case MAX31785_MFR_FAN_FAULT_LIMIT: /* R/W 16 */ 408 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 409 s->fan_fault_limit[pmdev->page] = pmbus_receive16(pmdev); 410 } 411 break; 412 413 case MAX31785_MFR_FAN_WARN_LIMIT: /* R/W 16 */ 414 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 415 s->fan_warn_limit[pmdev->page] = pmbus_receive16(pmdev); 416 } 417 break; 418 419 case MAX31785_MFR_FAN_RUN_TIME: /* R/W 16 */ 420 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 421 s->fan_run_time[pmdev->page] = pmbus_receive16(pmdev); 422 } 423 break; 424 425 case MAX31785_MFR_FAN_PWM_AVG: /* R/W 16 */ 426 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 427 s->fan_pwm_avg[pmdev->page] = pmbus_receive16(pmdev); 428 } 429 break; 430 431 case MAX31785_MFR_FAN_PWM2RPM: /* R/W 64 */ 432 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) { 433 s->fan_pwm2rpm[pmdev->page] = pmbus_receive64(pmdev); 434 } 435 break; 436 437 default: 438 qemu_log_mask(LOG_GUEST_ERROR, 439 "%s: writing to unsupported register: 0x%02x\n", 440 __func__, pmdev->code); 441 break; 442 } 443 444 return 0; 445 } 446 447 static void max31785_exit_reset(Object *obj) 448 { 449 PMBusDevice *pmdev = PMBUS_DEVICE(obj); 450 MAX31785State *s = MAX31785(obj); 451 452 pmdev->capability = MAX31785_DEFAULT_CAPABILITY; 453 454 for (int i = MAX31785_MIN_FAN_PAGE; i <= MAX31785_MAX_FAN_PAGE; i++) { 455 pmdev->pages[i].vout_mode = MAX31785_DEFAULT_VOUT_MODE; 456 pmdev->pages[i].fan_command_1 = MAX31785_DEFAULT_FAN_COMMAND_1; 457 pmdev->pages[i].revision = MAX31785_DEFAULT_PMBUS_REVISION; 458 pmdev->pages[i].fan_config_1_2 = MAX31785_DEFAULT_FAN_CONFIG_1_2(0); 459 pmdev->pages[i].read_fan_speed_1 = MAX31785_DEFAULT_FAN_SPEED; 460 pmdev->pages[i].status_fans_1_2 = MAX31785_DEFAULT_FAN_STATUS; 461 } 462 463 for (int i = MAX31785_MIN_TEMP_PAGE; i <= MAX31785_MAX_TEMP_PAGE; i++) { 464 pmdev->pages[i].vout_mode = MAX31785_DEFAULT_VOUT_MODE; 465 pmdev->pages[i].revision = MAX31785_DEFAULT_PMBUS_REVISION; 466 pmdev->pages[i].ot_fault_limit = MAX31785_DEFAULT_OT_FAULT_LIMIT; 467 pmdev->pages[i].ot_warn_limit = MAX31785_DEFAULT_OT_WARN_LIMIT; 468 } 469 470 for (int i = MAX31785_MIN_ADC_VOLTAGE_PAGE; 471 i <= MAX31785_MAX_ADC_VOLTAGE_PAGE; 472 i++) { 473 pmdev->pages[i].vout_mode = MAX31785_DEFAULT_VOUT_MODE; 474 pmdev->pages[i].revision = MAX31785_DEFAULT_PMBUS_REVISION; 475 pmdev->pages[i].vout_scale_monitor = 476 MAX31785_DEFAULT_VOUT_SCALE_MONITOR; 477 pmdev->pages[i].vout_ov_fault_limit = MAX31785_DEFAULT_OV_FAULT_LIMIT; 478 pmdev->pages[i].vout_ov_warn_limit = MAX31785_DEFAULT_OV_WARN_LIMIT; 479 } 480 481 s->mfr_location = MAX31785_DEFAULT_TEXT; 482 s->mfr_date = MAX31785_DEFAULT_TEXT; 483 s->mfr_serial = MAX31785_DEFAULT_TEXT; 484 } 485 486 static const VMStateDescription vmstate_max31785 = { 487 .name = TYPE_MAX31785, 488 .version_id = 0, 489 .minimum_version_id = 0, 490 .fields = (VMStateField[]){ 491 VMSTATE_PMBUS_DEVICE(parent, MAX31785State), 492 VMSTATE_UINT16_ARRAY(mfr_mode, MAX31785State, 493 MAX31785_TOTAL_NUM_PAGES), 494 VMSTATE_UINT16_ARRAY(vout_peak, MAX31785State, 495 MAX31785_TOTAL_NUM_PAGES), 496 VMSTATE_UINT16_ARRAY(temperature_peak, MAX31785State, 497 MAX31785_TOTAL_NUM_PAGES), 498 VMSTATE_UINT16_ARRAY(vout_min, MAX31785State, 499 MAX31785_TOTAL_NUM_PAGES), 500 VMSTATE_UINT8_ARRAY(fault_response, MAX31785State, 501 MAX31785_TOTAL_NUM_PAGES), 502 VMSTATE_UINT32_ARRAY(time_count, MAX31785State, 503 MAX31785_TOTAL_NUM_PAGES), 504 VMSTATE_UINT16_ARRAY(temp_sensor_config, MAX31785State, 505 MAX31785_TOTAL_NUM_PAGES), 506 VMSTATE_UINT16_ARRAY(fan_config, MAX31785State, 507 MAX31785_TOTAL_NUM_PAGES), 508 VMSTATE_UINT16_ARRAY(read_fan_pwm, MAX31785State, 509 MAX31785_TOTAL_NUM_PAGES), 510 VMSTATE_UINT16_ARRAY(fan_fault_limit, MAX31785State, 511 MAX31785_TOTAL_NUM_PAGES), 512 VMSTATE_UINT16_ARRAY(fan_warn_limit, MAX31785State, 513 MAX31785_TOTAL_NUM_PAGES), 514 VMSTATE_UINT16_ARRAY(fan_run_time, MAX31785State, 515 MAX31785_TOTAL_NUM_PAGES), 516 VMSTATE_UINT16_ARRAY(fan_pwm_avg, MAX31785State, 517 MAX31785_TOTAL_NUM_PAGES), 518 VMSTATE_UINT64_ARRAY(fan_pwm2rpm, MAX31785State, 519 MAX31785_TOTAL_NUM_PAGES), 520 VMSTATE_UINT64(mfr_location, MAX31785State), 521 VMSTATE_UINT64(mfr_date, MAX31785State), 522 VMSTATE_UINT64(mfr_serial, MAX31785State), 523 VMSTATE_END_OF_LIST() 524 } 525 }; 526 527 static void max31785_init(Object *obj) 528 { 529 PMBusDevice *pmdev = PMBUS_DEVICE(obj); 530 531 for (int i = MAX31785_MIN_FAN_PAGE; i <= MAX31785_MAX_FAN_PAGE; i++) { 532 pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE); 533 } 534 535 for (int i = MAX31785_MIN_TEMP_PAGE; i <= MAX31785_MAX_TEMP_PAGE; i++) { 536 pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE | PB_HAS_TEMPERATURE); 537 } 538 539 for (int i = MAX31785_MIN_ADC_VOLTAGE_PAGE; 540 i <= MAX31785_MAX_ADC_VOLTAGE_PAGE; 541 i++) { 542 pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE | PB_HAS_VOUT | 543 PB_HAS_VOUT_RATING); 544 } 545 } 546 547 static void max31785_class_init(ObjectClass *klass, void *data) 548 { 549 ResettableClass *rc = RESETTABLE_CLASS(klass); 550 DeviceClass *dc = DEVICE_CLASS(klass); 551 PMBusDeviceClass *k = PMBUS_DEVICE_CLASS(klass); 552 dc->desc = "Maxim MAX31785 6-Channel Fan Controller"; 553 dc->vmsd = &vmstate_max31785; 554 k->write_data = max31785_write_data; 555 k->receive_byte = max31785_read_byte; 556 k->device_num_pages = MAX31785_TOTAL_NUM_PAGES; 557 rc->phases.exit = max31785_exit_reset; 558 } 559 560 static const TypeInfo max31785_info = { 561 .name = TYPE_MAX31785, 562 .parent = TYPE_PMBUS_DEVICE, 563 .instance_size = sizeof(MAX31785State), 564 .instance_init = max31785_init, 565 .class_init = max31785_class_init, 566 }; 567 568 static void max31785_register_types(void) 569 { 570 type_register_static(&max31785_info); 571 } 572 573 type_init(max31785_register_types) 574