0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/bitops.h>
0010 #include <linux/hwmon.h>
0011 #include <linux/hwmon-sysfs.h>
0012 #include <linux/i2c.h>
0013 #include <linux/init.h>
0014 #include <linux/module.h>
0015 #include <linux/of_device.h>
0016 #include <linux/regmap.h>
0017
0018 #define MAX6621_DRV_NAME "max6621"
0019 #define MAX6621_TEMP_INPUT_REG_NUM 9
0020 #define MAX6621_TEMP_INPUT_MIN -127000
0021 #define MAX6621_TEMP_INPUT_MAX 128000
0022 #define MAX6621_TEMP_ALERT_CHAN_SHIFT 1
0023
0024 #define MAX6621_TEMP_S0D0_REG 0x00
0025 #define MAX6621_TEMP_S0D1_REG 0x01
0026 #define MAX6621_TEMP_S1D0_REG 0x02
0027 #define MAX6621_TEMP_S1D1_REG 0x03
0028 #define MAX6621_TEMP_S2D0_REG 0x04
0029 #define MAX6621_TEMP_S2D1_REG 0x05
0030 #define MAX6621_TEMP_S3D0_REG 0x06
0031 #define MAX6621_TEMP_S3D1_REG 0x07
0032 #define MAX6621_TEMP_MAX_REG 0x08
0033 #define MAX6621_TEMP_MAX_ADDR_REG 0x0a
0034 #define MAX6621_TEMP_ALERT_CAUSE_REG 0x0b
0035 #define MAX6621_CONFIG0_REG 0x0c
0036 #define MAX6621_CONFIG1_REG 0x0d
0037 #define MAX6621_CONFIG2_REG 0x0e
0038 #define MAX6621_CONFIG3_REG 0x0f
0039 #define MAX6621_TEMP_S0_ALERT_REG 0x10
0040 #define MAX6621_TEMP_S1_ALERT_REG 0x11
0041 #define MAX6621_TEMP_S2_ALERT_REG 0x12
0042 #define MAX6621_TEMP_S3_ALERT_REG 0x13
0043 #define MAX6621_CLEAR_ALERT_REG 0x15
0044 #define MAX6621_REG_MAX (MAX6621_CLEAR_ALERT_REG + 1)
0045 #define MAX6621_REG_TEMP_SHIFT 0x06
0046
0047 #define MAX6621_ENABLE_TEMP_ALERTS_BIT 4
0048 #define MAX6621_ENABLE_I2C_CRC_BIT 5
0049 #define MAX6621_ENABLE_ALTERNATE_DATA 6
0050 #define MAX6621_ENABLE_LOCKUP_TO 7
0051 #define MAX6621_ENABLE_S0D0_BIT 8
0052 #define MAX6621_ENABLE_S3D1_BIT 15
0053 #define MAX6621_ENABLE_TEMP_ALL GENMASK(MAX6621_ENABLE_S3D1_BIT, \
0054 MAX6621_ENABLE_S0D0_BIT)
0055 #define MAX6621_POLL_DELAY_MASK 0x5
0056 #define MAX6621_CONFIG0_INIT (MAX6621_ENABLE_TEMP_ALL | \
0057 BIT(MAX6621_ENABLE_LOCKUP_TO) | \
0058 BIT(MAX6621_ENABLE_I2C_CRC_BIT) | \
0059 MAX6621_POLL_DELAY_MASK)
0060 #define MAX6621_PECI_BIT_TIME 0x2
0061 #define MAX6621_PECI_RETRY_NUM 0x3
0062 #define MAX6621_CONFIG1_INIT ((MAX6621_PECI_BIT_TIME << 8) | \
0063 MAX6621_PECI_RETRY_NUM)
0064
0065
0066 #define MAX6621_TRAN_FAILED 0x8100
0067
0068
0069
0070
0071 #define MAX6621_POOL_DIS 0x8101
0072
0073
0074
0075 #define MAX6621_POOL_UNCOMPLETE 0x8102
0076
0077
0078
0079
0080 #define MAX6621_SD_DIS 0x8103
0081
0082
0083
0084
0085
0086
0087
0088 #define MAX6621_ALERT_DIS 0x8104
0089
0090
0091
0092 #define MAX6621_PECI_ERR_MIN 0x8000
0093 #define MAX6621_PECI_ERR_MAX 0x80ff
0094
0095 static const u32 max6621_temp_regs[] = {
0096 MAX6621_TEMP_MAX_REG, MAX6621_TEMP_S0D0_REG, MAX6621_TEMP_S1D0_REG,
0097 MAX6621_TEMP_S2D0_REG, MAX6621_TEMP_S3D0_REG, MAX6621_TEMP_S0D1_REG,
0098 MAX6621_TEMP_S1D1_REG, MAX6621_TEMP_S2D1_REG, MAX6621_TEMP_S3D1_REG,
0099 };
0100
0101 static const char *const max6621_temp_labels[] = {
0102 "maximum",
0103 "socket0_0",
0104 "socket1_0",
0105 "socket2_0",
0106 "socket3_0",
0107 "socket0_1",
0108 "socket1_1",
0109 "socket2_1",
0110 "socket3_1",
0111 };
0112
0113 static const int max6621_temp_alert_chan2reg[] = {
0114 MAX6621_TEMP_S0_ALERT_REG,
0115 MAX6621_TEMP_S1_ALERT_REG,
0116 MAX6621_TEMP_S2_ALERT_REG,
0117 MAX6621_TEMP_S3_ALERT_REG,
0118 };
0119
0120
0121
0122
0123
0124
0125
0126
0127 struct max6621_data {
0128 struct i2c_client *client;
0129 struct regmap *regmap;
0130 int input_chan2reg[MAX6621_TEMP_INPUT_REG_NUM + 1];
0131 };
0132
0133 static long max6621_temp_mc2reg(long val)
0134 {
0135 return (val / 1000L) << MAX6621_REG_TEMP_SHIFT;
0136 }
0137
0138 static umode_t
0139 max6621_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr,
0140 int channel)
0141 {
0142
0143 if (((struct max6621_data *)data)->input_chan2reg[channel] < 0)
0144 return 0;
0145
0146 switch (type) {
0147 case hwmon_temp:
0148 switch (attr) {
0149 case hwmon_temp_input:
0150 case hwmon_temp_label:
0151 case hwmon_temp_crit_alarm:
0152 return 0444;
0153 case hwmon_temp_offset:
0154 case hwmon_temp_crit:
0155 return 0644;
0156 default:
0157 break;
0158 }
0159 break;
0160 default:
0161 break;
0162 }
0163
0164 return 0;
0165 }
0166
0167 static int max6621_verify_reg_data(struct device *dev, int regval)
0168 {
0169 if (regval >= MAX6621_PECI_ERR_MIN &&
0170 regval <= MAX6621_PECI_ERR_MAX) {
0171 dev_dbg(dev, "PECI error code - err 0x%04x.\n",
0172 regval);
0173
0174 return -EIO;
0175 }
0176
0177 switch (regval) {
0178 case MAX6621_TRAN_FAILED:
0179 dev_dbg(dev, "PECI transaction failed - err 0x%04x.\n",
0180 regval);
0181 return -EIO;
0182 case MAX6621_POOL_DIS:
0183 dev_dbg(dev, "Polling disabled - err 0x%04x.\n", regval);
0184 return -EOPNOTSUPP;
0185 case MAX6621_POOL_UNCOMPLETE:
0186 dev_dbg(dev, "First poll not completed on startup - err 0x%04x.\n",
0187 regval);
0188 return -EIO;
0189 case MAX6621_SD_DIS:
0190 dev_dbg(dev, "Resource is disabled - err 0x%04x.\n", regval);
0191 return -EOPNOTSUPP;
0192 case MAX6621_ALERT_DIS:
0193 dev_dbg(dev, "No alert active - err 0x%04x.\n", regval);
0194 return -EOPNOTSUPP;
0195 default:
0196 return 0;
0197 }
0198 }
0199
0200 static int
0201 max6621_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
0202 int channel, long *val)
0203 {
0204 struct max6621_data *data = dev_get_drvdata(dev);
0205 u32 regval;
0206 int reg;
0207 s8 temp;
0208 int ret;
0209
0210 switch (type) {
0211 case hwmon_temp:
0212 switch (attr) {
0213 case hwmon_temp_input:
0214 reg = data->input_chan2reg[channel];
0215 ret = regmap_read(data->regmap, reg, ®val);
0216 if (ret)
0217 return ret;
0218
0219 ret = max6621_verify_reg_data(dev, regval);
0220 if (ret)
0221 return ret;
0222
0223
0224
0225
0226
0227
0228 temp = (regval >> MAX6621_REG_TEMP_SHIFT);
0229 *val = temp * 1000L;
0230
0231 break;
0232 case hwmon_temp_offset:
0233 ret = regmap_read(data->regmap, MAX6621_CONFIG2_REG,
0234 ®val);
0235 if (ret)
0236 return ret;
0237
0238 ret = max6621_verify_reg_data(dev, regval);
0239 if (ret)
0240 return ret;
0241
0242 *val = (regval >> MAX6621_REG_TEMP_SHIFT) *
0243 1000L;
0244
0245 break;
0246 case hwmon_temp_crit:
0247 channel -= MAX6621_TEMP_ALERT_CHAN_SHIFT;
0248 reg = max6621_temp_alert_chan2reg[channel];
0249 ret = regmap_read(data->regmap, reg, ®val);
0250 if (ret)
0251 return ret;
0252
0253 ret = max6621_verify_reg_data(dev, regval);
0254 if (ret)
0255 return ret;
0256
0257 *val = regval * 1000L;
0258
0259 break;
0260 case hwmon_temp_crit_alarm:
0261
0262
0263
0264
0265
0266
0267 *val = 0;
0268 ret = regmap_read(data->regmap,
0269 MAX6621_TEMP_ALERT_CAUSE_REG,
0270 ®val);
0271 if (ret)
0272 return ret;
0273
0274 ret = max6621_verify_reg_data(dev, regval);
0275 if (ret) {
0276
0277 if (regval == MAX6621_ALERT_DIS)
0278 return 0;
0279 else
0280 return ret;
0281 }
0282
0283
0284
0285
0286
0287 if (regval) {
0288 ret = i2c_smbus_write_byte(data->client,
0289 MAX6621_CLEAR_ALERT_REG);
0290 if (ret)
0291 return ret;
0292 }
0293
0294 *val = !!regval;
0295
0296 break;
0297 default:
0298 return -EOPNOTSUPP;
0299 }
0300 break;
0301
0302 default:
0303 return -EOPNOTSUPP;
0304 }
0305
0306 return 0;
0307 }
0308
0309 static int
0310 max6621_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
0311 int channel, long val)
0312 {
0313 struct max6621_data *data = dev_get_drvdata(dev);
0314 u32 reg;
0315
0316 switch (type) {
0317 case hwmon_temp:
0318 switch (attr) {
0319 case hwmon_temp_offset:
0320
0321 val = clamp_val(val, MAX6621_TEMP_INPUT_MIN,
0322 MAX6621_TEMP_INPUT_MAX);
0323 val = max6621_temp_mc2reg(val);
0324
0325 return regmap_write(data->regmap,
0326 MAX6621_CONFIG2_REG, val);
0327 case hwmon_temp_crit:
0328 channel -= MAX6621_TEMP_ALERT_CHAN_SHIFT;
0329 reg = max6621_temp_alert_chan2reg[channel];
0330
0331 val = clamp_val(val, MAX6621_TEMP_INPUT_MIN,
0332 MAX6621_TEMP_INPUT_MAX);
0333 val = val / 1000L;
0334
0335 return regmap_write(data->regmap, reg, val);
0336 default:
0337 return -EOPNOTSUPP;
0338 }
0339 break;
0340
0341 default:
0342 return -EOPNOTSUPP;
0343 }
0344
0345 return -EOPNOTSUPP;
0346 }
0347
0348 static int
0349 max6621_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
0350 int channel, const char **str)
0351 {
0352 switch (type) {
0353 case hwmon_temp:
0354 switch (attr) {
0355 case hwmon_temp_label:
0356 *str = max6621_temp_labels[channel];
0357 return 0;
0358 default:
0359 return -EOPNOTSUPP;
0360 }
0361 break;
0362 default:
0363 return -EOPNOTSUPP;
0364 }
0365
0366 return -EOPNOTSUPP;
0367 }
0368
0369 static bool max6621_writeable_reg(struct device *dev, unsigned int reg)
0370 {
0371 switch (reg) {
0372 case MAX6621_CONFIG0_REG:
0373 case MAX6621_CONFIG1_REG:
0374 case MAX6621_CONFIG2_REG:
0375 case MAX6621_CONFIG3_REG:
0376 case MAX6621_TEMP_S0_ALERT_REG:
0377 case MAX6621_TEMP_S1_ALERT_REG:
0378 case MAX6621_TEMP_S2_ALERT_REG:
0379 case MAX6621_TEMP_S3_ALERT_REG:
0380 case MAX6621_TEMP_ALERT_CAUSE_REG:
0381 return true;
0382 }
0383 return false;
0384 }
0385
0386 static bool max6621_readable_reg(struct device *dev, unsigned int reg)
0387 {
0388 switch (reg) {
0389 case MAX6621_TEMP_S0D0_REG:
0390 case MAX6621_TEMP_S0D1_REG:
0391 case MAX6621_TEMP_S1D0_REG:
0392 case MAX6621_TEMP_S1D1_REG:
0393 case MAX6621_TEMP_S2D0_REG:
0394 case MAX6621_TEMP_S2D1_REG:
0395 case MAX6621_TEMP_S3D0_REG:
0396 case MAX6621_TEMP_S3D1_REG:
0397 case MAX6621_TEMP_MAX_REG:
0398 case MAX6621_TEMP_MAX_ADDR_REG:
0399 case MAX6621_CONFIG0_REG:
0400 case MAX6621_CONFIG1_REG:
0401 case MAX6621_CONFIG2_REG:
0402 case MAX6621_CONFIG3_REG:
0403 case MAX6621_TEMP_S0_ALERT_REG:
0404 case MAX6621_TEMP_S1_ALERT_REG:
0405 case MAX6621_TEMP_S2_ALERT_REG:
0406 case MAX6621_TEMP_S3_ALERT_REG:
0407 return true;
0408 }
0409 return false;
0410 }
0411
0412 static bool max6621_volatile_reg(struct device *dev, unsigned int reg)
0413 {
0414 switch (reg) {
0415 case MAX6621_TEMP_S0D0_REG:
0416 case MAX6621_TEMP_S0D1_REG:
0417 case MAX6621_TEMP_S1D0_REG:
0418 case MAX6621_TEMP_S1D1_REG:
0419 case MAX6621_TEMP_S2D0_REG:
0420 case MAX6621_TEMP_S2D1_REG:
0421 case MAX6621_TEMP_S3D0_REG:
0422 case MAX6621_TEMP_S3D1_REG:
0423 case MAX6621_TEMP_MAX_REG:
0424 case MAX6621_TEMP_S0_ALERT_REG:
0425 case MAX6621_TEMP_S1_ALERT_REG:
0426 case MAX6621_TEMP_S2_ALERT_REG:
0427 case MAX6621_TEMP_S3_ALERT_REG:
0428 case MAX6621_TEMP_ALERT_CAUSE_REG:
0429 return true;
0430 }
0431 return false;
0432 }
0433
0434 static const struct reg_default max6621_regmap_default[] = {
0435 { MAX6621_CONFIG0_REG, MAX6621_CONFIG0_INIT },
0436 { MAX6621_CONFIG1_REG, MAX6621_CONFIG1_INIT },
0437 };
0438
0439 static const struct regmap_config max6621_regmap_config = {
0440 .reg_bits = 8,
0441 .val_bits = 16,
0442 .max_register = MAX6621_REG_MAX,
0443 .val_format_endian = REGMAP_ENDIAN_LITTLE,
0444 .cache_type = REGCACHE_FLAT,
0445 .writeable_reg = max6621_writeable_reg,
0446 .readable_reg = max6621_readable_reg,
0447 .volatile_reg = max6621_volatile_reg,
0448 .reg_defaults = max6621_regmap_default,
0449 .num_reg_defaults = ARRAY_SIZE(max6621_regmap_default),
0450 };
0451
0452 static const struct hwmon_channel_info *max6621_info[] = {
0453 HWMON_CHANNEL_INFO(chip,
0454 HWMON_C_REGISTER_TZ),
0455 HWMON_CHANNEL_INFO(temp,
0456 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
0457 HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_LABEL,
0458 HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_LABEL,
0459 HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_LABEL,
0460 HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_LABEL,
0461 HWMON_T_INPUT | HWMON_T_LABEL,
0462 HWMON_T_INPUT | HWMON_T_LABEL,
0463 HWMON_T_INPUT | HWMON_T_LABEL,
0464 HWMON_T_INPUT | HWMON_T_LABEL),
0465 NULL
0466 };
0467
0468 static const struct hwmon_ops max6621_hwmon_ops = {
0469 .read = max6621_read,
0470 .write = max6621_write,
0471 .read_string = max6621_read_string,
0472 .is_visible = max6621_is_visible,
0473 };
0474
0475 static const struct hwmon_chip_info max6621_chip_info = {
0476 .ops = &max6621_hwmon_ops,
0477 .info = max6621_info,
0478 };
0479
0480 static int max6621_probe(struct i2c_client *client)
0481 {
0482 struct device *dev = &client->dev;
0483 struct max6621_data *data;
0484 struct device *hwmon_dev;
0485 int i;
0486 int ret;
0487
0488 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
0489 if (!data)
0490 return -ENOMEM;
0491
0492 data->regmap = devm_regmap_init_i2c(client, &max6621_regmap_config);
0493 if (IS_ERR(data->regmap))
0494 return PTR_ERR(data->regmap);
0495
0496 i2c_set_clientdata(client, data);
0497 data->client = client;
0498
0499
0500 ret = regmap_write(data->regmap, MAX6621_CONFIG0_REG,
0501 MAX6621_CONFIG0_INIT);
0502 if (ret)
0503 return ret;
0504
0505
0506 ret = regmap_write(data->regmap, MAX6621_CONFIG1_REG,
0507 MAX6621_CONFIG1_INIT);
0508 if (ret)
0509 return ret;
0510
0511
0512 regcache_mark_dirty(data->regmap);
0513 ret = regcache_sync(data->regmap);
0514 if (ret)
0515 return ret;
0516
0517
0518 for (i = 0; i < MAX6621_TEMP_INPUT_REG_NUM; i++) {
0519 ret = i2c_smbus_read_word_data(client, max6621_temp_regs[i]);
0520 if (ret < 0)
0521 return ret;
0522 ret = max6621_verify_reg_data(dev, ret);
0523 if (ret) {
0524 data->input_chan2reg[i] = -1;
0525 continue;
0526 }
0527
0528 data->input_chan2reg[i] = max6621_temp_regs[i];
0529 }
0530
0531 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
0532 data,
0533 &max6621_chip_info,
0534 NULL);
0535
0536 return PTR_ERR_OR_ZERO(hwmon_dev);
0537 }
0538
0539 static const struct i2c_device_id max6621_id[] = {
0540 { MAX6621_DRV_NAME, 0 },
0541 { }
0542 };
0543 MODULE_DEVICE_TABLE(i2c, max6621_id);
0544
0545 static const struct of_device_id __maybe_unused max6621_of_match[] = {
0546 { .compatible = "maxim,max6621" },
0547 { }
0548 };
0549 MODULE_DEVICE_TABLE(of, max6621_of_match);
0550
0551 static struct i2c_driver max6621_driver = {
0552 .class = I2C_CLASS_HWMON,
0553 .driver = {
0554 .name = MAX6621_DRV_NAME,
0555 .of_match_table = of_match_ptr(max6621_of_match),
0556 },
0557 .probe_new = max6621_probe,
0558 .id_table = max6621_id,
0559 };
0560
0561 module_i2c_driver(max6621_driver);
0562
0563 MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
0564 MODULE_DESCRIPTION("Driver for Maxim MAX6621");
0565 MODULE_LICENSE("GPL");