0001
0002
0003
0004
0005
0006
0007 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0008
0009 #include <linux/module.h>
0010 #include <linux/mod_devicetable.h>
0011 #include <linux/init.h>
0012 #include <linux/slab.h>
0013 #include <linux/jiffies.h>
0014 #include <linux/platform_device.h>
0015 #include <linux/hwmon.h>
0016 #include <linux/hwmon-sysfs.h>
0017 #include <linux/err.h>
0018 #include <linux/mutex.h>
0019 #include "sch56xx-common.h"
0020
0021 #define DRVNAME "sch5636"
0022 #define DEVNAME "theseus"
0023
0024 #define SCH5636_REG_FUJITSU_ID 0x780
0025 #define SCH5636_REG_FUJITSU_REV 0x783
0026
0027 #define SCH5636_NO_INS 5
0028 #define SCH5636_NO_TEMPS 16
0029 #define SCH5636_NO_FANS 8
0030
0031 static const u16 SCH5636_REG_IN_VAL[SCH5636_NO_INS] = {
0032 0x22, 0x23, 0x24, 0x25, 0x189 };
0033 static const u16 SCH5636_REG_IN_FACTORS[SCH5636_NO_INS] = {
0034 4400, 1500, 4000, 4400, 16000 };
0035 static const char * const SCH5636_IN_LABELS[SCH5636_NO_INS] = {
0036 "3.3V", "VREF", "VBAT", "3.3AUX", "12V" };
0037
0038 static const u16 SCH5636_REG_TEMP_VAL[SCH5636_NO_TEMPS] = {
0039 0x2B, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x180, 0x181,
0040 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C };
0041 #define SCH5636_REG_TEMP_CTRL(i) (0x790 + (i))
0042 #define SCH5636_TEMP_WORKING 0x01
0043 #define SCH5636_TEMP_ALARM 0x02
0044 #define SCH5636_TEMP_DEACTIVATED 0x80
0045
0046 static const u16 SCH5636_REG_FAN_VAL[SCH5636_NO_FANS] = {
0047 0x2C, 0x2E, 0x30, 0x32, 0x62, 0x64, 0x66, 0x68 };
0048 #define SCH5636_REG_FAN_CTRL(i) (0x880 + (i))
0049
0050 #define SCH5636_FAN_ALARM 0x04
0051 #define SCH5636_FAN_NOT_PRESENT 0x08
0052 #define SCH5636_FAN_DEACTIVATED 0x80
0053
0054
0055 struct sch5636_data {
0056 unsigned short addr;
0057 struct device *hwmon_dev;
0058
0059 struct mutex update_lock;
0060 bool valid;
0061 unsigned long last_updated;
0062 u8 in[SCH5636_NO_INS];
0063 u8 temp_val[SCH5636_NO_TEMPS];
0064 u8 temp_ctrl[SCH5636_NO_TEMPS];
0065 u16 fan_val[SCH5636_NO_FANS];
0066 u8 fan_ctrl[SCH5636_NO_FANS];
0067 };
0068
0069 static struct sch5636_data *sch5636_update_device(struct device *dev)
0070 {
0071 struct sch5636_data *data = dev_get_drvdata(dev);
0072 struct sch5636_data *ret = data;
0073 int i, val;
0074
0075 mutex_lock(&data->update_lock);
0076
0077
0078 if (data->valid && !time_after(jiffies, data->last_updated + HZ))
0079 goto abort;
0080
0081 for (i = 0; i < SCH5636_NO_INS; i++) {
0082 val = sch56xx_read_virtual_reg(data->addr,
0083 SCH5636_REG_IN_VAL[i]);
0084 if (unlikely(val < 0)) {
0085 ret = ERR_PTR(val);
0086 goto abort;
0087 }
0088 data->in[i] = val;
0089 }
0090
0091 for (i = 0; i < SCH5636_NO_TEMPS; i++) {
0092 if (data->temp_ctrl[i] & SCH5636_TEMP_DEACTIVATED)
0093 continue;
0094
0095 val = sch56xx_read_virtual_reg(data->addr,
0096 SCH5636_REG_TEMP_VAL[i]);
0097 if (unlikely(val < 0)) {
0098 ret = ERR_PTR(val);
0099 goto abort;
0100 }
0101 data->temp_val[i] = val;
0102
0103 val = sch56xx_read_virtual_reg(data->addr,
0104 SCH5636_REG_TEMP_CTRL(i));
0105 if (unlikely(val < 0)) {
0106 ret = ERR_PTR(val);
0107 goto abort;
0108 }
0109 data->temp_ctrl[i] = val;
0110
0111 if (val & SCH5636_TEMP_ALARM) {
0112 sch56xx_write_virtual_reg(data->addr,
0113 SCH5636_REG_TEMP_CTRL(i), val);
0114 }
0115 }
0116
0117 for (i = 0; i < SCH5636_NO_FANS; i++) {
0118 if (data->fan_ctrl[i] & SCH5636_FAN_DEACTIVATED)
0119 continue;
0120
0121 val = sch56xx_read_virtual_reg16(data->addr,
0122 SCH5636_REG_FAN_VAL[i]);
0123 if (unlikely(val < 0)) {
0124 ret = ERR_PTR(val);
0125 goto abort;
0126 }
0127 data->fan_val[i] = val;
0128
0129 val = sch56xx_read_virtual_reg(data->addr,
0130 SCH5636_REG_FAN_CTRL(i));
0131 if (unlikely(val < 0)) {
0132 ret = ERR_PTR(val);
0133 goto abort;
0134 }
0135 data->fan_ctrl[i] = val;
0136
0137 if (val & SCH5636_FAN_ALARM) {
0138 sch56xx_write_virtual_reg(data->addr,
0139 SCH5636_REG_FAN_CTRL(i), val);
0140 }
0141 }
0142
0143 data->last_updated = jiffies;
0144 data->valid = true;
0145 abort:
0146 mutex_unlock(&data->update_lock);
0147 return ret;
0148 }
0149
0150 static int reg_to_rpm(u16 reg)
0151 {
0152 if (reg == 0)
0153 return -EIO;
0154 if (reg == 0xffff)
0155 return 0;
0156
0157 return 5400540 / reg;
0158 }
0159
0160 static ssize_t name_show(struct device *dev, struct device_attribute *devattr,
0161 char *buf)
0162 {
0163 return sysfs_emit(buf, "%s\n", DEVNAME);
0164 }
0165
0166 static ssize_t in_value_show(struct device *dev,
0167 struct device_attribute *devattr, char *buf)
0168 {
0169 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0170 struct sch5636_data *data = sch5636_update_device(dev);
0171 int val;
0172
0173 if (IS_ERR(data))
0174 return PTR_ERR(data);
0175
0176 val = DIV_ROUND_CLOSEST(
0177 data->in[attr->index] * SCH5636_REG_IN_FACTORS[attr->index],
0178 255);
0179 return sysfs_emit(buf, "%d\n", val);
0180 }
0181
0182 static ssize_t in_label_show(struct device *dev,
0183 struct device_attribute *devattr, char *buf)
0184 {
0185 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0186
0187 return sysfs_emit(buf, "%s\n",
0188 SCH5636_IN_LABELS[attr->index]);
0189 }
0190
0191 static ssize_t temp_value_show(struct device *dev,
0192 struct device_attribute *devattr, char *buf)
0193 {
0194 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0195 struct sch5636_data *data = sch5636_update_device(dev);
0196 int val;
0197
0198 if (IS_ERR(data))
0199 return PTR_ERR(data);
0200
0201 val = (data->temp_val[attr->index] - 64) * 1000;
0202 return sysfs_emit(buf, "%d\n", val);
0203 }
0204
0205 static ssize_t temp_fault_show(struct device *dev,
0206 struct device_attribute *devattr, char *buf)
0207 {
0208 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0209 struct sch5636_data *data = sch5636_update_device(dev);
0210 int val;
0211
0212 if (IS_ERR(data))
0213 return PTR_ERR(data);
0214
0215 val = (data->temp_ctrl[attr->index] & SCH5636_TEMP_WORKING) ? 0 : 1;
0216 return sysfs_emit(buf, "%d\n", val);
0217 }
0218
0219 static ssize_t temp_alarm_show(struct device *dev,
0220 struct device_attribute *devattr, char *buf)
0221 {
0222 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0223 struct sch5636_data *data = sch5636_update_device(dev);
0224 int val;
0225
0226 if (IS_ERR(data))
0227 return PTR_ERR(data);
0228
0229 val = (data->temp_ctrl[attr->index] & SCH5636_TEMP_ALARM) ? 1 : 0;
0230 return sysfs_emit(buf, "%d\n", val);
0231 }
0232
0233 static ssize_t fan_value_show(struct device *dev,
0234 struct device_attribute *devattr, char *buf)
0235 {
0236 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0237 struct sch5636_data *data = sch5636_update_device(dev);
0238 int val;
0239
0240 if (IS_ERR(data))
0241 return PTR_ERR(data);
0242
0243 val = reg_to_rpm(data->fan_val[attr->index]);
0244 if (val < 0)
0245 return val;
0246
0247 return sysfs_emit(buf, "%d\n", val);
0248 }
0249
0250 static ssize_t fan_fault_show(struct device *dev,
0251 struct device_attribute *devattr, char *buf)
0252 {
0253 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0254 struct sch5636_data *data = sch5636_update_device(dev);
0255 int val;
0256
0257 if (IS_ERR(data))
0258 return PTR_ERR(data);
0259
0260 val = (data->fan_ctrl[attr->index] & SCH5636_FAN_NOT_PRESENT) ? 1 : 0;
0261 return sysfs_emit(buf, "%d\n", val);
0262 }
0263
0264 static ssize_t fan_alarm_show(struct device *dev,
0265 struct device_attribute *devattr, char *buf)
0266 {
0267 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
0268 struct sch5636_data *data = sch5636_update_device(dev);
0269 int val;
0270
0271 if (IS_ERR(data))
0272 return PTR_ERR(data);
0273
0274 val = (data->fan_ctrl[attr->index] & SCH5636_FAN_ALARM) ? 1 : 0;
0275 return sysfs_emit(buf, "%d\n", val);
0276 }
0277
0278 static struct sensor_device_attribute sch5636_attr[] = {
0279 SENSOR_ATTR_RO(name, name, 0),
0280 SENSOR_ATTR_RO(in0_input, in_value, 0),
0281 SENSOR_ATTR_RO(in0_label, in_label, 0),
0282 SENSOR_ATTR_RO(in1_input, in_value, 1),
0283 SENSOR_ATTR_RO(in1_label, in_label, 1),
0284 SENSOR_ATTR_RO(in2_input, in_value, 2),
0285 SENSOR_ATTR_RO(in2_label, in_label, 2),
0286 SENSOR_ATTR_RO(in3_input, in_value, 3),
0287 SENSOR_ATTR_RO(in3_label, in_label, 3),
0288 SENSOR_ATTR_RO(in4_input, in_value, 4),
0289 SENSOR_ATTR_RO(in4_label, in_label, 4),
0290 };
0291
0292 static struct sensor_device_attribute sch5636_temp_attr[] = {
0293 SENSOR_ATTR_RO(temp1_input, temp_value, 0),
0294 SENSOR_ATTR_RO(temp1_fault, temp_fault, 0),
0295 SENSOR_ATTR_RO(temp1_alarm, temp_alarm, 0),
0296 SENSOR_ATTR_RO(temp2_input, temp_value, 1),
0297 SENSOR_ATTR_RO(temp2_fault, temp_fault, 1),
0298 SENSOR_ATTR_RO(temp2_alarm, temp_alarm, 1),
0299 SENSOR_ATTR_RO(temp3_input, temp_value, 2),
0300 SENSOR_ATTR_RO(temp3_fault, temp_fault, 2),
0301 SENSOR_ATTR_RO(temp3_alarm, temp_alarm, 2),
0302 SENSOR_ATTR_RO(temp4_input, temp_value, 3),
0303 SENSOR_ATTR_RO(temp4_fault, temp_fault, 3),
0304 SENSOR_ATTR_RO(temp4_alarm, temp_alarm, 3),
0305 SENSOR_ATTR_RO(temp5_input, temp_value, 4),
0306 SENSOR_ATTR_RO(temp5_fault, temp_fault, 4),
0307 SENSOR_ATTR_RO(temp5_alarm, temp_alarm, 4),
0308 SENSOR_ATTR_RO(temp6_input, temp_value, 5),
0309 SENSOR_ATTR_RO(temp6_fault, temp_fault, 5),
0310 SENSOR_ATTR_RO(temp6_alarm, temp_alarm, 5),
0311 SENSOR_ATTR_RO(temp7_input, temp_value, 6),
0312 SENSOR_ATTR_RO(temp7_fault, temp_fault, 6),
0313 SENSOR_ATTR_RO(temp7_alarm, temp_alarm, 6),
0314 SENSOR_ATTR_RO(temp8_input, temp_value, 7),
0315 SENSOR_ATTR_RO(temp8_fault, temp_fault, 7),
0316 SENSOR_ATTR_RO(temp8_alarm, temp_alarm, 7),
0317 SENSOR_ATTR_RO(temp9_input, temp_value, 8),
0318 SENSOR_ATTR_RO(temp9_fault, temp_fault, 8),
0319 SENSOR_ATTR_RO(temp9_alarm, temp_alarm, 8),
0320 SENSOR_ATTR_RO(temp10_input, temp_value, 9),
0321 SENSOR_ATTR_RO(temp10_fault, temp_fault, 9),
0322 SENSOR_ATTR_RO(temp10_alarm, temp_alarm, 9),
0323 SENSOR_ATTR_RO(temp11_input, temp_value, 10),
0324 SENSOR_ATTR_RO(temp11_fault, temp_fault, 10),
0325 SENSOR_ATTR_RO(temp11_alarm, temp_alarm, 10),
0326 SENSOR_ATTR_RO(temp12_input, temp_value, 11),
0327 SENSOR_ATTR_RO(temp12_fault, temp_fault, 11),
0328 SENSOR_ATTR_RO(temp12_alarm, temp_alarm, 11),
0329 SENSOR_ATTR_RO(temp13_input, temp_value, 12),
0330 SENSOR_ATTR_RO(temp13_fault, temp_fault, 12),
0331 SENSOR_ATTR_RO(temp13_alarm, temp_alarm, 12),
0332 SENSOR_ATTR_RO(temp14_input, temp_value, 13),
0333 SENSOR_ATTR_RO(temp14_fault, temp_fault, 13),
0334 SENSOR_ATTR_RO(temp14_alarm, temp_alarm, 13),
0335 SENSOR_ATTR_RO(temp15_input, temp_value, 14),
0336 SENSOR_ATTR_RO(temp15_fault, temp_fault, 14),
0337 SENSOR_ATTR_RO(temp15_alarm, temp_alarm, 14),
0338 SENSOR_ATTR_RO(temp16_input, temp_value, 15),
0339 SENSOR_ATTR_RO(temp16_fault, temp_fault, 15),
0340 SENSOR_ATTR_RO(temp16_alarm, temp_alarm, 15),
0341 };
0342
0343 static struct sensor_device_attribute sch5636_fan_attr[] = {
0344 SENSOR_ATTR_RO(fan1_input, fan_value, 0),
0345 SENSOR_ATTR_RO(fan1_fault, fan_fault, 0),
0346 SENSOR_ATTR_RO(fan1_alarm, fan_alarm, 0),
0347 SENSOR_ATTR_RO(fan2_input, fan_value, 1),
0348 SENSOR_ATTR_RO(fan2_fault, fan_fault, 1),
0349 SENSOR_ATTR_RO(fan2_alarm, fan_alarm, 1),
0350 SENSOR_ATTR_RO(fan3_input, fan_value, 2),
0351 SENSOR_ATTR_RO(fan3_fault, fan_fault, 2),
0352 SENSOR_ATTR_RO(fan3_alarm, fan_alarm, 2),
0353 SENSOR_ATTR_RO(fan4_input, fan_value, 3),
0354 SENSOR_ATTR_RO(fan4_fault, fan_fault, 3),
0355 SENSOR_ATTR_RO(fan4_alarm, fan_alarm, 3),
0356 SENSOR_ATTR_RO(fan5_input, fan_value, 4),
0357 SENSOR_ATTR_RO(fan5_fault, fan_fault, 4),
0358 SENSOR_ATTR_RO(fan5_alarm, fan_alarm, 4),
0359 SENSOR_ATTR_RO(fan6_input, fan_value, 5),
0360 SENSOR_ATTR_RO(fan6_fault, fan_fault, 5),
0361 SENSOR_ATTR_RO(fan6_alarm, fan_alarm, 5),
0362 SENSOR_ATTR_RO(fan7_input, fan_value, 6),
0363 SENSOR_ATTR_RO(fan7_fault, fan_fault, 6),
0364 SENSOR_ATTR_RO(fan7_alarm, fan_alarm, 6),
0365 SENSOR_ATTR_RO(fan8_input, fan_value, 7),
0366 SENSOR_ATTR_RO(fan8_fault, fan_fault, 7),
0367 SENSOR_ATTR_RO(fan8_alarm, fan_alarm, 7),
0368 };
0369
0370 static int sch5636_remove(struct platform_device *pdev)
0371 {
0372 struct sch5636_data *data = platform_get_drvdata(pdev);
0373 int i;
0374
0375 if (data->hwmon_dev)
0376 hwmon_device_unregister(data->hwmon_dev);
0377
0378 for (i = 0; i < ARRAY_SIZE(sch5636_attr); i++)
0379 device_remove_file(&pdev->dev, &sch5636_attr[i].dev_attr);
0380
0381 for (i = 0; i < SCH5636_NO_TEMPS * 3; i++)
0382 device_remove_file(&pdev->dev,
0383 &sch5636_temp_attr[i].dev_attr);
0384
0385 for (i = 0; i < SCH5636_NO_FANS * 3; i++)
0386 device_remove_file(&pdev->dev,
0387 &sch5636_fan_attr[i].dev_attr);
0388
0389 return 0;
0390 }
0391
0392 static int sch5636_probe(struct platform_device *pdev)
0393 {
0394 struct sch5636_data *data;
0395 int i, err, val, revision[2];
0396 char id[4];
0397
0398 data = devm_kzalloc(&pdev->dev, sizeof(struct sch5636_data),
0399 GFP_KERNEL);
0400 if (!data)
0401 return -ENOMEM;
0402
0403 data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
0404 mutex_init(&data->update_lock);
0405 platform_set_drvdata(pdev, data);
0406
0407 for (i = 0; i < 3; i++) {
0408 val = sch56xx_read_virtual_reg(data->addr,
0409 SCH5636_REG_FUJITSU_ID + i);
0410 if (val < 0) {
0411 pr_err("Could not read Fujitsu id byte at %#x\n",
0412 SCH5636_REG_FUJITSU_ID + i);
0413 err = val;
0414 goto error;
0415 }
0416 id[i] = val;
0417 }
0418 id[i] = '\0';
0419
0420 if (strcmp(id, "THS")) {
0421 pr_err("Unknown Fujitsu id: %02x%02x%02x\n",
0422 id[0], id[1], id[2]);
0423 err = -ENODEV;
0424 goto error;
0425 }
0426
0427 for (i = 0; i < 2; i++) {
0428 val = sch56xx_read_virtual_reg(data->addr,
0429 SCH5636_REG_FUJITSU_REV + i);
0430 if (val < 0) {
0431 err = val;
0432 goto error;
0433 }
0434 revision[i] = val;
0435 }
0436 pr_info("Found %s chip at %#hx, revision: %d.%02d\n", DEVNAME,
0437 data->addr, revision[0], revision[1]);
0438
0439
0440 for (i = 0; i < SCH5636_NO_TEMPS; i++) {
0441 val = sch56xx_read_virtual_reg(data->addr,
0442 SCH5636_REG_TEMP_CTRL(i));
0443 if (unlikely(val < 0)) {
0444 err = val;
0445 goto error;
0446 }
0447 data->temp_ctrl[i] = val;
0448 }
0449
0450 for (i = 0; i < SCH5636_NO_FANS; i++) {
0451 val = sch56xx_read_virtual_reg(data->addr,
0452 SCH5636_REG_FAN_CTRL(i));
0453 if (unlikely(val < 0)) {
0454 err = val;
0455 goto error;
0456 }
0457 data->fan_ctrl[i] = val;
0458 }
0459
0460 for (i = 0; i < ARRAY_SIZE(sch5636_attr); i++) {
0461 err = device_create_file(&pdev->dev,
0462 &sch5636_attr[i].dev_attr);
0463 if (err)
0464 goto error;
0465 }
0466
0467 for (i = 0; i < (SCH5636_NO_TEMPS * 3); i++) {
0468 if (data->temp_ctrl[i/3] & SCH5636_TEMP_DEACTIVATED)
0469 continue;
0470
0471 err = device_create_file(&pdev->dev,
0472 &sch5636_temp_attr[i].dev_attr);
0473 if (err)
0474 goto error;
0475 }
0476
0477 for (i = 0; i < (SCH5636_NO_FANS * 3); i++) {
0478 if (data->fan_ctrl[i/3] & SCH5636_FAN_DEACTIVATED)
0479 continue;
0480
0481 err = device_create_file(&pdev->dev,
0482 &sch5636_fan_attr[i].dev_attr);
0483 if (err)
0484 goto error;
0485 }
0486
0487 data->hwmon_dev = hwmon_device_register(&pdev->dev);
0488 if (IS_ERR(data->hwmon_dev)) {
0489 err = PTR_ERR(data->hwmon_dev);
0490 data->hwmon_dev = NULL;
0491 goto error;
0492 }
0493
0494
0495 sch56xx_watchdog_register(&pdev->dev, data->addr, (revision[0] << 8) | revision[1],
0496 &data->update_lock, 0);
0497
0498 return 0;
0499
0500 error:
0501 sch5636_remove(pdev);
0502 return err;
0503 }
0504
0505 static const struct platform_device_id sch5636_device_id[] = {
0506 {
0507 .name = "sch5636",
0508 },
0509 { }
0510 };
0511 MODULE_DEVICE_TABLE(platform, sch5636_device_id);
0512
0513 static struct platform_driver sch5636_driver = {
0514 .driver = {
0515 .name = DRVNAME,
0516 },
0517 .probe = sch5636_probe,
0518 .remove = sch5636_remove,
0519 .id_table = sch5636_device_id,
0520 };
0521
0522 module_platform_driver(sch5636_driver);
0523
0524 MODULE_DESCRIPTION("SMSC SCH5636 Hardware Monitoring Driver");
0525 MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
0526 MODULE_LICENSE("GPL");