2
0

max31785.c 22 KB

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