0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/init.h>
0014 #include <linux/err.h>
0015 #include <linux/slab.h>
0016 #include <linux/i2c.h>
0017 #include <linux/hwmon.h>
0018 #include <linux/hwmon-sysfs.h>
0019 #include <linux/jiffies.h>
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #define PEM_OPERATION 0x01
0037 #define PEM_CLEAR_INFO_FLAGS 0x03
0038 #define PEM_VOUT_COMMAND 0x21
0039 #define PEM_VOUT_OV_FAULT_LIMIT 0x40
0040 #define PEM_READ_DATA_STRING 0xd0
0041 #define PEM_READ_INPUT_STRING 0xdc
0042 #define PEM_READ_FIRMWARE_REV 0xdd
0043 #define PEM_READ_RUN_TIMER 0xde
0044 #define PEM_FAN_HI_SPEED 0xdf
0045 #define PEM_FAN_NORMAL_SPEED 0xe0
0046 #define PEM_READ_FAN_SPEED 0xe1
0047
0048
0049 #define PEM_DATA_STATUS_2 0
0050 #define PEM_DATA_STATUS_1 1
0051 #define PEM_DATA_ALARM_2 2
0052 #define PEM_DATA_ALARM_1 3
0053 #define PEM_DATA_VOUT_LSB 4
0054 #define PEM_DATA_VOUT_MSB 5
0055 #define PEM_DATA_CURRENT 6
0056 #define PEM_DATA_TEMP 7
0057
0058
0059 #define PEM_DATA_TEMP_MAX 10
0060 #define PEM_DATA_TEMP_CRIT 11
0061
0062
0063 #define PEM_INPUT_VOLTAGE 0
0064 #define PEM_INPUT_POWER_LSB 1
0065 #define PEM_INPUT_POWER_MSB 2
0066
0067
0068 #define PEM_FAN_ADJUSTMENT 0
0069 #define PEM_FAN_FAN1 1
0070 #define PEM_FAN_FAN2 2
0071 #define PEM_FAN_FAN3 3
0072
0073
0074 #define STS1_OUTPUT_ON (1 << 0)
0075 #define STS1_LEDS_FLASHING (1 << 1)
0076 #define STS1_EXT_FAULT (1 << 2)
0077 #define STS1_SERVICE_LED_ON (1 << 3)
0078 #define STS1_SHUTDOWN_OCCURRED (1 << 4)
0079 #define STS1_INT_FAULT (1 << 5)
0080 #define STS1_ISOLATION_TEST_OK (1 << 6)
0081
0082 #define STS2_ENABLE_PIN_HI (1 << 0)
0083 #define STS2_DATA_OUT_RANGE (1 << 1)
0084 #define STS2_RESTARTED_OK (1 << 1)
0085 #define STS2_ISOLATION_TEST_FAIL (1 << 3)
0086 #define STS2_HIGH_POWER_CAP (1 << 4)
0087 #define STS2_INVALID_INSTR (1 << 5)
0088 #define STS2_WILL_RESTART (1 << 6)
0089 #define STS2_PEC_ERR (1 << 7)
0090
0091
0092 #define ALRM1_VIN_OUT_LIMIT (1 << 0)
0093 #define ALRM1_VOUT_OUT_LIMIT (1 << 1)
0094 #define ALRM1_OV_VOLT_SHUTDOWN (1 << 2)
0095 #define ALRM1_VIN_OVERCURRENT (1 << 3)
0096 #define ALRM1_TEMP_WARNING (1 << 4)
0097 #define ALRM1_TEMP_SHUTDOWN (1 << 5)
0098 #define ALRM1_PRIMARY_FAULT (1 << 6)
0099 #define ALRM1_POWER_LIMIT (1 << 7)
0100
0101 #define ALRM2_5V_OUT_LIMIT (1 << 1)
0102 #define ALRM2_TEMP_FAULT (1 << 2)
0103 #define ALRM2_OV_LOW (1 << 3)
0104 #define ALRM2_DCDC_TEMP_HIGH (1 << 4)
0105 #define ALRM2_PRI_TEMP_HIGH (1 << 5)
0106 #define ALRM2_NO_PRIMARY (1 << 6)
0107 #define ALRM2_FAN_FAULT (1 << 7)
0108
0109 #define FIRMWARE_REV_LEN 4
0110 #define DATA_STRING_LEN 9
0111 #define INPUT_STRING_LEN 5
0112 #define FAN_SPEED_LEN 5
0113
0114 struct pem_data {
0115 struct i2c_client *client;
0116 const struct attribute_group *groups[4];
0117
0118 struct mutex update_lock;
0119 bool valid;
0120 bool fans_supported;
0121 int input_length;
0122 unsigned long last_updated;
0123
0124 u8 firmware_rev[FIRMWARE_REV_LEN];
0125 u8 data_string[DATA_STRING_LEN];
0126 u8 input_string[INPUT_STRING_LEN];
0127 u8 fan_speed[FAN_SPEED_LEN];
0128 };
0129
0130 static int pem_read_block(struct i2c_client *client, u8 command, u8 *data,
0131 int data_len)
0132 {
0133 u8 block_buffer[I2C_SMBUS_BLOCK_MAX];
0134 int result;
0135
0136 result = i2c_smbus_read_block_data(client, command, block_buffer);
0137 if (unlikely(result < 0))
0138 goto abort;
0139 if (unlikely(result == 0xff || result != data_len)) {
0140 result = -EIO;
0141 goto abort;
0142 }
0143 memcpy(data, block_buffer, data_len);
0144 result = 0;
0145 abort:
0146 return result;
0147 }
0148
0149 static struct pem_data *pem_update_device(struct device *dev)
0150 {
0151 struct pem_data *data = dev_get_drvdata(dev);
0152 struct i2c_client *client = data->client;
0153 struct pem_data *ret = data;
0154
0155 mutex_lock(&data->update_lock);
0156
0157 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
0158 int result;
0159
0160
0161 result = pem_read_block(client, PEM_READ_DATA_STRING,
0162 data->data_string,
0163 sizeof(data->data_string));
0164 if (unlikely(result < 0)) {
0165 ret = ERR_PTR(result);
0166 goto abort;
0167 }
0168
0169
0170 if (data->input_length) {
0171 result = pem_read_block(client, PEM_READ_INPUT_STRING,
0172 data->input_string,
0173 data->input_length);
0174 if (unlikely(result < 0)) {
0175 ret = ERR_PTR(result);
0176 goto abort;
0177 }
0178 }
0179
0180
0181 if (data->fans_supported) {
0182 result = pem_read_block(client, PEM_READ_FAN_SPEED,
0183 data->fan_speed,
0184 sizeof(data->fan_speed));
0185 if (unlikely(result < 0)) {
0186 ret = ERR_PTR(result);
0187 goto abort;
0188 }
0189 }
0190
0191 i2c_smbus_write_byte(client, PEM_CLEAR_INFO_FLAGS);
0192
0193 data->last_updated = jiffies;
0194 data->valid = true;
0195 }
0196 abort:
0197 mutex_unlock(&data->update_lock);
0198 return ret;
0199 }
0200
0201 static long pem_get_data(u8 *data, int len, int index)
0202 {
0203 long val;
0204
0205 switch (index) {
0206 case PEM_DATA_VOUT_LSB:
0207 val = (data[index] + (data[index+1] << 8)) * 5 / 2;
0208 break;
0209 case PEM_DATA_CURRENT:
0210 val = data[index] * 200;
0211 break;
0212 case PEM_DATA_TEMP:
0213 val = data[index] * 1000;
0214 break;
0215 case PEM_DATA_TEMP_MAX:
0216 val = 97 * 1000;
0217 break;
0218 case PEM_DATA_TEMP_CRIT:
0219 val = 107 * 1000;
0220 break;
0221 default:
0222 WARN_ON_ONCE(1);
0223 val = 0;
0224 }
0225 return val;
0226 }
0227
0228 static long pem_get_input(u8 *data, int len, int index)
0229 {
0230 long val;
0231
0232 switch (index) {
0233 case PEM_INPUT_VOLTAGE:
0234 if (len == INPUT_STRING_LEN)
0235 val = (data[index] + (data[index+1] << 8) - 75) * 1000;
0236 else
0237 val = (data[index] - 75) * 1000;
0238 break;
0239 case PEM_INPUT_POWER_LSB:
0240 if (len == INPUT_STRING_LEN)
0241 index++;
0242 val = (data[index] + (data[index+1] << 8)) * 1000000L;
0243 break;
0244 default:
0245 WARN_ON_ONCE(1);
0246 val = 0;
0247 }
0248 return val;
0249 }
0250
0251 static long pem_get_fan(u8 *data, int len, int index)
0252 {
0253 long val;
0254
0255 switch (index) {
0256 case PEM_FAN_FAN1:
0257 case PEM_FAN_FAN2:
0258 case PEM_FAN_FAN3:
0259 val = data[index] * 100;
0260 break;
0261 default:
0262 WARN_ON_ONCE(1);
0263 val = 0;
0264 }
0265 return val;
0266 }
0267
0268
0269
0270
0271
0272 static ssize_t pem_bool_show(struct device *dev, struct device_attribute *da,
0273 char *buf)
0274 {
0275 struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(da);
0276 struct pem_data *data = pem_update_device(dev);
0277 u8 status;
0278
0279 if (IS_ERR(data))
0280 return PTR_ERR(data);
0281
0282 status = data->data_string[attr->nr] & attr->index;
0283 return sysfs_emit(buf, "%d\n", !!status);
0284 }
0285
0286 static ssize_t pem_data_show(struct device *dev, struct device_attribute *da,
0287 char *buf)
0288 {
0289 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0290 struct pem_data *data = pem_update_device(dev);
0291 long value;
0292
0293 if (IS_ERR(data))
0294 return PTR_ERR(data);
0295
0296 value = pem_get_data(data->data_string, sizeof(data->data_string),
0297 attr->index);
0298
0299 return sysfs_emit(buf, "%ld\n", value);
0300 }
0301
0302 static ssize_t pem_input_show(struct device *dev, struct device_attribute *da,
0303 char *buf)
0304 {
0305 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0306 struct pem_data *data = pem_update_device(dev);
0307 long value;
0308
0309 if (IS_ERR(data))
0310 return PTR_ERR(data);
0311
0312 value = pem_get_input(data->input_string, sizeof(data->input_string),
0313 attr->index);
0314
0315 return sysfs_emit(buf, "%ld\n", value);
0316 }
0317
0318 static ssize_t pem_fan_show(struct device *dev, struct device_attribute *da,
0319 char *buf)
0320 {
0321 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0322 struct pem_data *data = pem_update_device(dev);
0323 long value;
0324
0325 if (IS_ERR(data))
0326 return PTR_ERR(data);
0327
0328 value = pem_get_fan(data->fan_speed, sizeof(data->fan_speed),
0329 attr->index);
0330
0331 return sysfs_emit(buf, "%ld\n", value);
0332 }
0333
0334
0335 static SENSOR_DEVICE_ATTR_RO(in1_input, pem_data, PEM_DATA_VOUT_LSB);
0336 static SENSOR_DEVICE_ATTR_2_RO(in1_alarm, pem_bool, PEM_DATA_ALARM_1,
0337 ALRM1_VOUT_OUT_LIMIT);
0338 static SENSOR_DEVICE_ATTR_2_RO(in1_crit_alarm, pem_bool, PEM_DATA_ALARM_1,
0339 ALRM1_OV_VOLT_SHUTDOWN);
0340 static SENSOR_DEVICE_ATTR_RO(in2_input, pem_input, PEM_INPUT_VOLTAGE);
0341 static SENSOR_DEVICE_ATTR_2_RO(in2_alarm, pem_bool, PEM_DATA_ALARM_1,
0342 ALRM1_VIN_OUT_LIMIT | ALRM1_PRIMARY_FAULT);
0343
0344
0345 static SENSOR_DEVICE_ATTR_RO(curr1_input, pem_data, PEM_DATA_CURRENT);
0346 static SENSOR_DEVICE_ATTR_2_RO(curr1_alarm, pem_bool, PEM_DATA_ALARM_1,
0347 ALRM1_VIN_OVERCURRENT);
0348
0349
0350 static SENSOR_DEVICE_ATTR_RO(power1_input, pem_input, PEM_INPUT_POWER_LSB);
0351 static SENSOR_DEVICE_ATTR_2_RO(power1_alarm, pem_bool, PEM_DATA_ALARM_1,
0352 ALRM1_POWER_LIMIT);
0353
0354
0355 static SENSOR_DEVICE_ATTR_RO(fan1_input, pem_fan, PEM_FAN_FAN1);
0356 static SENSOR_DEVICE_ATTR_RO(fan2_input, pem_fan, PEM_FAN_FAN2);
0357 static SENSOR_DEVICE_ATTR_RO(fan3_input, pem_fan, PEM_FAN_FAN3);
0358 static SENSOR_DEVICE_ATTR_2_RO(fan1_alarm, pem_bool, PEM_DATA_ALARM_2,
0359 ALRM2_FAN_FAULT);
0360
0361
0362 static SENSOR_DEVICE_ATTR_RO(temp1_input, pem_data, PEM_DATA_TEMP);
0363 static SENSOR_DEVICE_ATTR_RO(temp1_max, pem_data, PEM_DATA_TEMP_MAX);
0364 static SENSOR_DEVICE_ATTR_RO(temp1_crit, pem_data, PEM_DATA_TEMP_CRIT);
0365 static SENSOR_DEVICE_ATTR_2_RO(temp1_alarm, pem_bool, PEM_DATA_ALARM_1,
0366 ALRM1_TEMP_WARNING);
0367 static SENSOR_DEVICE_ATTR_2_RO(temp1_crit_alarm, pem_bool, PEM_DATA_ALARM_1,
0368 ALRM1_TEMP_SHUTDOWN);
0369 static SENSOR_DEVICE_ATTR_2_RO(temp1_fault, pem_bool, PEM_DATA_ALARM_2,
0370 ALRM2_TEMP_FAULT);
0371
0372 static struct attribute *pem_attributes[] = {
0373 &sensor_dev_attr_in1_input.dev_attr.attr,
0374 &sensor_dev_attr_in1_alarm.dev_attr.attr,
0375 &sensor_dev_attr_in1_crit_alarm.dev_attr.attr,
0376 &sensor_dev_attr_in2_alarm.dev_attr.attr,
0377
0378 &sensor_dev_attr_curr1_alarm.dev_attr.attr,
0379
0380 &sensor_dev_attr_power1_alarm.dev_attr.attr,
0381
0382 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
0383
0384 &sensor_dev_attr_temp1_input.dev_attr.attr,
0385 &sensor_dev_attr_temp1_max.dev_attr.attr,
0386 &sensor_dev_attr_temp1_crit.dev_attr.attr,
0387 &sensor_dev_attr_temp1_alarm.dev_attr.attr,
0388 &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
0389 &sensor_dev_attr_temp1_fault.dev_attr.attr,
0390
0391 NULL,
0392 };
0393
0394 static const struct attribute_group pem_group = {
0395 .attrs = pem_attributes,
0396 };
0397
0398 static struct attribute *pem_input_attributes[] = {
0399 &sensor_dev_attr_in2_input.dev_attr.attr,
0400 &sensor_dev_attr_curr1_input.dev_attr.attr,
0401 &sensor_dev_attr_power1_input.dev_attr.attr,
0402 NULL
0403 };
0404
0405 static const struct attribute_group pem_input_group = {
0406 .attrs = pem_input_attributes,
0407 };
0408
0409 static struct attribute *pem_fan_attributes[] = {
0410 &sensor_dev_attr_fan1_input.dev_attr.attr,
0411 &sensor_dev_attr_fan2_input.dev_attr.attr,
0412 &sensor_dev_attr_fan3_input.dev_attr.attr,
0413 NULL
0414 };
0415
0416 static const struct attribute_group pem_fan_group = {
0417 .attrs = pem_fan_attributes,
0418 };
0419
0420 static int pem_probe(struct i2c_client *client)
0421 {
0422 struct i2c_adapter *adapter = client->adapter;
0423 struct device *dev = &client->dev;
0424 struct device *hwmon_dev;
0425 struct pem_data *data;
0426 int ret, idx = 0;
0427
0428 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BLOCK_DATA
0429 | I2C_FUNC_SMBUS_WRITE_BYTE))
0430 return -ENODEV;
0431
0432 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
0433 if (!data)
0434 return -ENOMEM;
0435
0436 data->client = client;
0437 mutex_init(&data->update_lock);
0438
0439
0440
0441
0442
0443 ret = pem_read_block(client, PEM_READ_FIRMWARE_REV,
0444 data->firmware_rev, sizeof(data->firmware_rev));
0445 if (ret < 0)
0446 return ret;
0447
0448 ret = i2c_smbus_write_byte(client, PEM_CLEAR_INFO_FLAGS);
0449 if (ret < 0)
0450 return ret;
0451
0452 dev_info(dev, "Firmware revision %d.%d.%d\n",
0453 data->firmware_rev[0], data->firmware_rev[1],
0454 data->firmware_rev[2]);
0455
0456
0457 data->groups[idx++] = &pem_group;
0458
0459
0460
0461
0462
0463
0464
0465 ret = pem_read_block(client, PEM_READ_INPUT_STRING,
0466 data->input_string,
0467 sizeof(data->input_string) - 1);
0468 if (!ret && (data->input_string[0] || data->input_string[1] ||
0469 data->input_string[2]))
0470 data->input_length = sizeof(data->input_string) - 1;
0471 else if (ret < 0) {
0472
0473 ret = pem_read_block(client, PEM_READ_INPUT_STRING,
0474 data->input_string,
0475 sizeof(data->input_string));
0476 if (!ret && (data->input_string[0] || data->input_string[1] ||
0477 data->input_string[2] || data->input_string[3]))
0478 data->input_length = sizeof(data->input_string);
0479 }
0480
0481 if (data->input_length)
0482 data->groups[idx++] = &pem_input_group;
0483
0484
0485
0486
0487
0488
0489
0490 ret = pem_read_block(client, PEM_READ_FAN_SPEED,
0491 data->fan_speed,
0492 sizeof(data->fan_speed));
0493 if (!ret && (data->fan_speed[0] || data->fan_speed[1] ||
0494 data->fan_speed[2] || data->fan_speed[3])) {
0495 data->fans_supported = true;
0496 data->groups[idx++] = &pem_fan_group;
0497 }
0498
0499 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
0500 data, data->groups);
0501 return PTR_ERR_OR_ZERO(hwmon_dev);
0502 }
0503
0504 static const struct i2c_device_id pem_id[] = {
0505 {"lineage_pem", 0},
0506 {}
0507 };
0508 MODULE_DEVICE_TABLE(i2c, pem_id);
0509
0510 static struct i2c_driver pem_driver = {
0511 .driver = {
0512 .name = "lineage_pem",
0513 },
0514 .probe_new = pem_probe,
0515 .id_table = pem_id,
0516 };
0517
0518 module_i2c_driver(pem_driver);
0519
0520 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
0521 MODULE_DESCRIPTION("Lineage CPL PEM hardware monitoring driver");
0522 MODULE_LICENSE("GPL");