^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Hardware monitoring driver for Maxim MAX34440/MAX34441
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2011 Ericsson AB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2012 Guenter Roeck
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "pmbus.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define MAX34440_MFR_VOUT_PEAK 0xd4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define MAX34440_MFR_IOUT_PEAK 0xd5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define MAX34440_MFR_TEMPERATURE_PEAK 0xd6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define MAX34440_MFR_VOUT_MIN 0xd7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define MAX34446_MFR_POUT_PEAK 0xe0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define MAX34446_MFR_POUT_AVG 0xe1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define MAX34446_MFR_IOUT_AVG 0xe2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define MAX34446_MFR_TEMPERATURE_AVG 0xe3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define MAX34440_STATUS_OC_WARN BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define MAX34440_STATUS_OC_FAULT BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MAX34440_STATUS_OT_FAULT BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define MAX34440_STATUS_OT_WARN BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * swapped from the standard pmbus spec addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define MAX34440_IOUT_OC_WARN_LIMIT 0x46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define MAX34440_IOUT_OC_FAULT_LIMIT 0x4A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define MAX34451_MFR_CHANNEL_CONFIG 0xe4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK 0x3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct max34440_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct pmbus_driver_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define to_max34440_data(x) container_of(x, struct max34440_data, info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static const struct i2c_device_id max34440_id[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static int max34440_read_word_data(struct i2c_client *client, int page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int phase, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) const struct max34440_data *data = to_max34440_data(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) case PMBUS_IOUT_OC_FAULT_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) MAX34440_IOUT_OC_FAULT_LIMIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) case PMBUS_IOUT_OC_WARN_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) MAX34440_IOUT_OC_WARN_LIMIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) case PMBUS_VIRT_READ_VOUT_MIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) MAX34440_MFR_VOUT_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) case PMBUS_VIRT_READ_VOUT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) MAX34440_MFR_VOUT_PEAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) case PMBUS_VIRT_READ_IOUT_AVG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (data->id != max34446 && data->id != max34451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) MAX34446_MFR_IOUT_AVG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) case PMBUS_VIRT_READ_IOUT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) MAX34440_MFR_IOUT_PEAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) case PMBUS_VIRT_READ_POUT_AVG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (data->id != max34446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) MAX34446_MFR_POUT_AVG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) case PMBUS_VIRT_READ_POUT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (data->id != max34446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) MAX34446_MFR_POUT_PEAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) case PMBUS_VIRT_READ_TEMP_AVG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if (data->id != max34446 && data->id != max34460 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) data->id != max34461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) MAX34446_MFR_TEMPERATURE_AVG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) case PMBUS_VIRT_READ_TEMP_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ret = pmbus_read_word_data(client, page, phase,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) MAX34440_MFR_TEMPERATURE_PEAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) case PMBUS_VIRT_RESET_POUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) if (data->id != max34446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) case PMBUS_VIRT_RESET_VOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) case PMBUS_VIRT_RESET_IOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) case PMBUS_VIRT_RESET_TEMP_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ret = -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static int max34440_write_word_data(struct i2c_client *client, int page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) int reg, u16 word)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) const struct max34440_data *data = to_max34440_data(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) case PMBUS_IOUT_OC_FAULT_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) word);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) case PMBUS_IOUT_OC_WARN_LIMIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) word);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) case PMBUS_VIRT_RESET_POUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) MAX34446_MFR_POUT_PEAK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) MAX34446_MFR_POUT_AVG, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) case PMBUS_VIRT_RESET_VOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) MAX34440_MFR_VOUT_MIN, 0x7fff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) MAX34440_MFR_VOUT_PEAK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) case PMBUS_VIRT_RESET_IOUT_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) MAX34440_MFR_IOUT_PEAK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (!ret && (data->id == max34446 || data->id == max34451))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) MAX34446_MFR_IOUT_AVG, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) case PMBUS_VIRT_RESET_TEMP_HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) MAX34440_MFR_TEMPERATURE_PEAK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (!ret && data->id == max34446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ret = pmbus_write_word_data(client, page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) MAX34446_MFR_TEMPERATURE_AVG, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ret = -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static int max34440_read_byte_data(struct i2c_client *client, int page, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) int mfg_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (page >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ret = pmbus_set_page(client, page, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) case PMBUS_STATUS_IOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) mfg_status = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) PMBUS_STATUS_MFR_SPECIFIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (mfg_status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) return mfg_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (mfg_status & MAX34440_STATUS_OC_WARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) ret |= PB_IOUT_OC_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (mfg_status & MAX34440_STATUS_OC_FAULT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) ret |= PB_IOUT_OC_FAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) case PMBUS_STATUS_TEMPERATURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) mfg_status = pmbus_read_word_data(client, 0, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) PMBUS_STATUS_MFR_SPECIFIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if (mfg_status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) return mfg_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (mfg_status & MAX34440_STATUS_OT_WARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) ret |= PB_TEMP_OT_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) if (mfg_status & MAX34440_STATUS_OT_FAULT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) ret |= PB_TEMP_OT_FAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ret = -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) static int max34451_set_supported_funcs(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct max34440_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * Each of the channel 0-15 can be configured to monitor the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * functions based on MFR_CHANNEL_CONFIG[5:0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * 0x10: Sequencing + voltage monitoring (only valid for PAGES 0–11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * 0x20: Voltage monitoring (no sequencing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * 0x21: Voltage read only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) * 0x22: Current monitoring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * 0x23: Current read only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * 0x30: General-purpose input active low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) * 0x34: General-purpose input active high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * 0x00: Disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) int page, rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) for (page = 0; page < 16; page++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) rv = i2c_smbus_read_word_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) MAX34451_MFR_CHANNEL_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) switch (rv & MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) case 0x10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) case 0x20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) data->info.func[page] = PMBUS_HAVE_VOUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) PMBUS_HAVE_STATUS_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) case 0x21:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) data->info.func[page] = PMBUS_HAVE_VOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) case 0x22:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) data->info.func[page] = PMBUS_HAVE_IOUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) PMBUS_HAVE_STATUS_IOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) case 0x23:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) data->info.func[page] = PMBUS_HAVE_IOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) static struct pmbus_driver_info max34440_info[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) [max34440] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .pages = 14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .format[PSC_VOLTAGE_IN] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .format[PSC_VOLTAGE_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .format[PSC_TEMPERATURE] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .format[PSC_CURRENT_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .m[PSC_VOLTAGE_IN] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .b[PSC_VOLTAGE_IN] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .R[PSC_VOLTAGE_IN] = 3, /* R = 0 in datasheet reflects mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .m[PSC_VOLTAGE_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .b[PSC_VOLTAGE_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .R[PSC_VOLTAGE_OUT] = 3, /* R = 0 in datasheet reflects mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) .m[PSC_CURRENT_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) .b[PSC_CURRENT_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) .R[PSC_CURRENT_OUT] = 3, /* R = 0 in datasheet reflects mA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .m[PSC_TEMPERATURE] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .b[PSC_TEMPERATURE] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .R[PSC_TEMPERATURE] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) .read_byte_data = max34440_read_byte_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) .read_word_data = max34440_read_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) .write_word_data = max34440_write_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) [max34441] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) .pages = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) .format[PSC_VOLTAGE_IN] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) .format[PSC_VOLTAGE_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .format[PSC_TEMPERATURE] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) .format[PSC_CURRENT_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) .format[PSC_FAN] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .m[PSC_VOLTAGE_IN] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) .b[PSC_VOLTAGE_IN] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) .R[PSC_VOLTAGE_IN] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) .m[PSC_VOLTAGE_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) .b[PSC_VOLTAGE_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) .R[PSC_VOLTAGE_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) .m[PSC_CURRENT_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) .b[PSC_CURRENT_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) .R[PSC_CURRENT_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) .m[PSC_TEMPERATURE] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) .b[PSC_TEMPERATURE] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) .R[PSC_TEMPERATURE] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) .m[PSC_FAN] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) .b[PSC_FAN] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) .R[PSC_FAN] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) .read_byte_data = max34440_read_byte_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .read_word_data = max34440_read_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) .write_word_data = max34440_write_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) [max34446] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) .pages = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) .format[PSC_VOLTAGE_IN] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) .format[PSC_VOLTAGE_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .format[PSC_TEMPERATURE] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) .format[PSC_CURRENT_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) .format[PSC_POWER] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) .m[PSC_VOLTAGE_IN] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) .b[PSC_VOLTAGE_IN] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) .R[PSC_VOLTAGE_IN] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) .m[PSC_VOLTAGE_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) .b[PSC_VOLTAGE_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) .R[PSC_VOLTAGE_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) .m[PSC_CURRENT_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) .b[PSC_CURRENT_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .R[PSC_CURRENT_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .m[PSC_POWER] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .b[PSC_POWER] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .R[PSC_POWER] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) .m[PSC_TEMPERATURE] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .b[PSC_TEMPERATURE] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .R[PSC_TEMPERATURE] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) .read_byte_data = max34440_read_byte_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) .read_word_data = max34440_read_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) .write_word_data = max34440_write_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) [max34451] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) .pages = 21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .format[PSC_VOLTAGE_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .format[PSC_TEMPERATURE] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .format[PSC_CURRENT_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .m[PSC_VOLTAGE_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) .b[PSC_VOLTAGE_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .R[PSC_VOLTAGE_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) .m[PSC_CURRENT_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .b[PSC_CURRENT_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) .R[PSC_CURRENT_OUT] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) .m[PSC_TEMPERATURE] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) .b[PSC_TEMPERATURE] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .R[PSC_TEMPERATURE] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /* func 0-15 is set dynamically before probing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .read_word_data = max34440_read_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) .write_word_data = max34440_write_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) [max34460] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) .pages = 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) .format[PSC_VOLTAGE_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) .format[PSC_TEMPERATURE] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) .m[PSC_VOLTAGE_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .b[PSC_VOLTAGE_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) .R[PSC_VOLTAGE_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) .m[PSC_TEMPERATURE] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) .b[PSC_TEMPERATURE] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) .R[PSC_TEMPERATURE] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) .func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .read_word_data = max34440_read_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .write_word_data = max34440_write_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) [max34461] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .pages = 23,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .format[PSC_VOLTAGE_OUT] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .format[PSC_TEMPERATURE] = direct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) .m[PSC_VOLTAGE_OUT] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .b[PSC_VOLTAGE_OUT] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) .R[PSC_VOLTAGE_OUT] = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) .m[PSC_TEMPERATURE] = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) .b[PSC_TEMPERATURE] = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) .R[PSC_TEMPERATURE] = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) .func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) .func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) .func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) /* page 16 is reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) .read_word_data = max34440_read_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) .write_word_data = max34440_write_word_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static int max34440_probe(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) struct max34440_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) data->id = i2c_match_id(max34440_id, client)->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) data->info = max34440_info[data->id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) if (data->id == max34451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) rv = max34451_set_supported_funcs(client, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) if (rv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) return pmbus_do_probe(client, &data->info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) static const struct i2c_device_id max34440_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) {"max34440", max34440},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) {"max34441", max34441},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {"max34446", max34446},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {"max34451", max34451},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {"max34460", max34460},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {"max34461", max34461},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) MODULE_DEVICE_TABLE(i2c, max34440_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) /* This is the driver that will be inserted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) static struct i2c_driver max34440_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .name = "max34440",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) .probe_new = max34440_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .remove = pmbus_do_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .id_table = max34440_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) module_i2c_driver(max34440_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) MODULE_AUTHOR("Guenter Roeck");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) MODULE_LICENSE("GPL");