0001
0002
0003
0004
0005
0006 #include <linux/kernel.h>
0007 #include <linux/module.h>
0008 #include <linux/init.h>
0009 #include <linux/err.h>
0010 #include <linux/i2c.h>
0011 #include "pmbus.h"
0012
0013 enum max31785_regs {
0014 MFR_REVISION = 0x9b,
0015 MFR_FAN_CONFIG = 0xf1,
0016 };
0017
0018 #define MAX31785 0x3030
0019 #define MAX31785A 0x3040
0020 #define MAX31785B 0x3061
0021
0022 #define MFR_FAN_CONFIG_DUAL_TACH BIT(12)
0023
0024 #define MAX31785_NR_PAGES 23
0025 #define MAX31785_NR_FAN_PAGES 6
0026
0027 static int max31785_read_byte_data(struct i2c_client *client, int page,
0028 int reg)
0029 {
0030 if (page < MAX31785_NR_PAGES)
0031 return -ENODATA;
0032
0033 switch (reg) {
0034 case PMBUS_VOUT_MODE:
0035 return -ENOTSUPP;
0036 case PMBUS_FAN_CONFIG_12:
0037 return pmbus_read_byte_data(client, page - MAX31785_NR_PAGES,
0038 reg);
0039 }
0040
0041 return -ENODATA;
0042 }
0043
0044 static int max31785_write_byte(struct i2c_client *client, int page, u8 value)
0045 {
0046 if (page < MAX31785_NR_PAGES)
0047 return -ENODATA;
0048
0049 return -ENOTSUPP;
0050 }
0051
0052 static int max31785_read_long_data(struct i2c_client *client, int page,
0053 int reg, u32 *data)
0054 {
0055 unsigned char cmdbuf[1];
0056 unsigned char rspbuf[4];
0057 int rc;
0058
0059 struct i2c_msg msg[2] = {
0060 {
0061 .addr = client->addr,
0062 .flags = 0,
0063 .len = sizeof(cmdbuf),
0064 .buf = cmdbuf,
0065 },
0066 {
0067 .addr = client->addr,
0068 .flags = I2C_M_RD,
0069 .len = sizeof(rspbuf),
0070 .buf = rspbuf,
0071 },
0072 };
0073
0074 cmdbuf[0] = reg;
0075
0076 rc = pmbus_set_page(client, page, 0xff);
0077 if (rc < 0)
0078 return rc;
0079
0080 rc = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
0081 if (rc < 0)
0082 return rc;
0083
0084 *data = (rspbuf[0] << (0 * 8)) | (rspbuf[1] << (1 * 8)) |
0085 (rspbuf[2] << (2 * 8)) | (rspbuf[3] << (3 * 8));
0086
0087 return rc;
0088 }
0089
0090 static int max31785_get_pwm(struct i2c_client *client, int page)
0091 {
0092 int rv;
0093
0094 rv = pmbus_get_fan_rate_device(client, page, 0, percent);
0095 if (rv < 0)
0096 return rv;
0097 else if (rv >= 0x8000)
0098 return 0;
0099 else if (rv >= 0x2711)
0100 return 0x2710;
0101
0102 return rv;
0103 }
0104
0105 static int max31785_get_pwm_mode(struct i2c_client *client, int page)
0106 {
0107 int config;
0108 int command;
0109
0110 config = pmbus_read_byte_data(client, page, PMBUS_FAN_CONFIG_12);
0111 if (config < 0)
0112 return config;
0113
0114 command = pmbus_read_word_data(client, page, 0xff, PMBUS_FAN_COMMAND_1);
0115 if (command < 0)
0116 return command;
0117
0118 if (config & PB_FAN_1_RPM)
0119 return (command >= 0x8000) ? 3 : 2;
0120
0121 if (command >= 0x8000)
0122 return 3;
0123 else if (command >= 0x2711)
0124 return 0;
0125
0126 return 1;
0127 }
0128
0129 static int max31785_read_word_data(struct i2c_client *client, int page,
0130 int phase, int reg)
0131 {
0132 u32 val;
0133 int rv;
0134
0135 switch (reg) {
0136 case PMBUS_READ_FAN_SPEED_1:
0137 if (page < MAX31785_NR_PAGES)
0138 return -ENODATA;
0139
0140 rv = max31785_read_long_data(client, page - MAX31785_NR_PAGES,
0141 reg, &val);
0142 if (rv < 0)
0143 return rv;
0144
0145 rv = (val >> 16) & 0xffff;
0146 break;
0147 case PMBUS_FAN_COMMAND_1:
0148
0149
0150
0151
0152
0153
0154 rv = (page >= MAX31785_NR_PAGES) ? -ENOTSUPP : -ENODATA;
0155 break;
0156 case PMBUS_VIRT_PWM_1:
0157 rv = max31785_get_pwm(client, page);
0158 break;
0159 case PMBUS_VIRT_PWM_ENABLE_1:
0160 rv = max31785_get_pwm_mode(client, page);
0161 break;
0162 default:
0163 rv = -ENODATA;
0164 break;
0165 }
0166
0167 return rv;
0168 }
0169
0170 static inline u32 max31785_scale_pwm(u32 sensor_val)
0171 {
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188 return (sensor_val * 100) / 255;
0189 }
0190
0191 static int max31785_pwm_enable(struct i2c_client *client, int page,
0192 u16 word)
0193 {
0194 int config = 0;
0195 int rate;
0196
0197 switch (word) {
0198 case 0:
0199 rate = 0x7fff;
0200 break;
0201 case 1:
0202 rate = pmbus_get_fan_rate_cached(client, page, 0, percent);
0203 if (rate < 0)
0204 return rate;
0205 rate = max31785_scale_pwm(rate);
0206 break;
0207 case 2:
0208 config = PB_FAN_1_RPM;
0209 rate = pmbus_get_fan_rate_cached(client, page, 0, rpm);
0210 if (rate < 0)
0211 return rate;
0212 break;
0213 case 3:
0214 rate = 0xffff;
0215 break;
0216 default:
0217 return -EINVAL;
0218 }
0219
0220 return pmbus_update_fan(client, page, 0, config, PB_FAN_1_RPM, rate);
0221 }
0222
0223 static int max31785_write_word_data(struct i2c_client *client, int page,
0224 int reg, u16 word)
0225 {
0226 switch (reg) {
0227 case PMBUS_VIRT_PWM_1:
0228 return pmbus_update_fan(client, page, 0, 0, PB_FAN_1_RPM,
0229 max31785_scale_pwm(word));
0230 case PMBUS_VIRT_PWM_ENABLE_1:
0231 return max31785_pwm_enable(client, page, word);
0232 default:
0233 break;
0234 }
0235
0236 return -ENODATA;
0237 }
0238
0239 #define MAX31785_FAN_FUNCS \
0240 (PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12 | PMBUS_HAVE_PWM12)
0241
0242 #define MAX31785_TEMP_FUNCS \
0243 (PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP)
0244
0245 #define MAX31785_VOUT_FUNCS \
0246 (PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT)
0247
0248 static const struct pmbus_driver_info max31785_info = {
0249 .pages = MAX31785_NR_PAGES,
0250
0251 .write_word_data = max31785_write_word_data,
0252 .read_byte_data = max31785_read_byte_data,
0253 .read_word_data = max31785_read_word_data,
0254 .write_byte = max31785_write_byte,
0255
0256
0257 .format[PSC_FAN] = direct,
0258 .m[PSC_FAN] = 1,
0259 .b[PSC_FAN] = 0,
0260 .R[PSC_FAN] = 0,
0261
0262 .format[PSC_PWM] = direct,
0263 .m[PSC_PWM] = 1,
0264 .b[PSC_PWM] = 0,
0265 .R[PSC_PWM] = 2,
0266 .func[0] = MAX31785_FAN_FUNCS,
0267 .func[1] = MAX31785_FAN_FUNCS,
0268 .func[2] = MAX31785_FAN_FUNCS,
0269 .func[3] = MAX31785_FAN_FUNCS,
0270 .func[4] = MAX31785_FAN_FUNCS,
0271 .func[5] = MAX31785_FAN_FUNCS,
0272
0273 .format[PSC_TEMPERATURE] = direct,
0274 .m[PSC_TEMPERATURE] = 1,
0275 .b[PSC_TEMPERATURE] = 0,
0276 .R[PSC_TEMPERATURE] = 2,
0277 .func[6] = MAX31785_TEMP_FUNCS,
0278 .func[7] = MAX31785_TEMP_FUNCS,
0279 .func[8] = MAX31785_TEMP_FUNCS,
0280 .func[9] = MAX31785_TEMP_FUNCS,
0281 .func[10] = MAX31785_TEMP_FUNCS,
0282 .func[11] = MAX31785_TEMP_FUNCS,
0283 .func[12] = MAX31785_TEMP_FUNCS,
0284 .func[13] = MAX31785_TEMP_FUNCS,
0285 .func[14] = MAX31785_TEMP_FUNCS,
0286 .func[15] = MAX31785_TEMP_FUNCS,
0287 .func[16] = MAX31785_TEMP_FUNCS,
0288
0289 .format[PSC_VOLTAGE_OUT] = direct,
0290 .m[PSC_VOLTAGE_OUT] = 1,
0291 .b[PSC_VOLTAGE_OUT] = 0,
0292 .R[PSC_VOLTAGE_OUT] = 0,
0293 .func[17] = MAX31785_VOUT_FUNCS,
0294 .func[18] = MAX31785_VOUT_FUNCS,
0295 .func[19] = MAX31785_VOUT_FUNCS,
0296 .func[20] = MAX31785_VOUT_FUNCS,
0297 .func[21] = MAX31785_VOUT_FUNCS,
0298 .func[22] = MAX31785_VOUT_FUNCS,
0299 };
0300
0301 static int max31785_configure_dual_tach(struct i2c_client *client,
0302 struct pmbus_driver_info *info)
0303 {
0304 int ret;
0305 int i;
0306
0307 for (i = 0; i < MAX31785_NR_FAN_PAGES; i++) {
0308 ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, i);
0309 if (ret < 0)
0310 return ret;
0311
0312 ret = i2c_smbus_read_word_data(client, MFR_FAN_CONFIG);
0313 if (ret < 0)
0314 return ret;
0315
0316 if (ret & MFR_FAN_CONFIG_DUAL_TACH) {
0317 int virtual = MAX31785_NR_PAGES + i;
0318
0319 info->pages = virtual + 1;
0320 info->func[virtual] |= PMBUS_HAVE_FAN12;
0321 info->func[virtual] |= PMBUS_PAGE_VIRTUAL;
0322 }
0323 }
0324
0325 return 0;
0326 }
0327
0328 static int max31785_probe(struct i2c_client *client)
0329 {
0330 struct device *dev = &client->dev;
0331 struct pmbus_driver_info *info;
0332 bool dual_tach = false;
0333 int ret;
0334
0335 if (!i2c_check_functionality(client->adapter,
0336 I2C_FUNC_SMBUS_BYTE_DATA |
0337 I2C_FUNC_SMBUS_WORD_DATA))
0338 return -ENODEV;
0339
0340 info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL);
0341 if (!info)
0342 return -ENOMEM;
0343
0344 *info = max31785_info;
0345
0346 ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, 255);
0347 if (ret < 0)
0348 return ret;
0349
0350 ret = i2c_smbus_read_word_data(client, MFR_REVISION);
0351 if (ret < 0)
0352 return ret;
0353
0354 if (ret == MAX31785A || ret == MAX31785B) {
0355 dual_tach = true;
0356 } else if (ret == MAX31785) {
0357 if (!strcmp("max31785a", client->name) ||
0358 !strcmp("max31785b", client->name))
0359 dev_warn(dev, "Expected max31785a/b, found max31785: cannot provide secondary tachometer readings\n");
0360 } else {
0361 dev_err(dev, "Unrecognized MAX31785 revision: %x\n", ret);
0362 return -ENODEV;
0363 }
0364
0365 if (dual_tach) {
0366 ret = max31785_configure_dual_tach(client, info);
0367 if (ret < 0)
0368 return ret;
0369 }
0370
0371 return pmbus_do_probe(client, info);
0372 }
0373
0374 static const struct i2c_device_id max31785_id[] = {
0375 { "max31785", 0 },
0376 { "max31785a", 0 },
0377 { "max31785b", 0 },
0378 { },
0379 };
0380
0381 MODULE_DEVICE_TABLE(i2c, max31785_id);
0382
0383 static const struct of_device_id max31785_of_match[] = {
0384 { .compatible = "maxim,max31785" },
0385 { .compatible = "maxim,max31785a" },
0386 { .compatible = "maxim,max31785b" },
0387 { },
0388 };
0389
0390 MODULE_DEVICE_TABLE(of, max31785_of_match);
0391
0392 static struct i2c_driver max31785_driver = {
0393 .driver = {
0394 .name = "max31785",
0395 .of_match_table = max31785_of_match,
0396 },
0397 .probe_new = max31785_probe,
0398 .id_table = max31785_id,
0399 };
0400
0401 module_i2c_driver(max31785_driver);
0402
0403 MODULE_AUTHOR("Andrew Jeffery <andrew@aj.id.au>");
0404 MODULE_DESCRIPTION("PMBus driver for the Maxim MAX31785");
0405 MODULE_LICENSE("GPL");
0406 MODULE_IMPORT_NS(PMBUS);