Source
x
/* max timeout 255 minutes. */
data->wdd.max_hw_heartbeat_ms = 0xFF * 60 * MSEC_PER_SEC;
return watchdog_register_device(&data->wdd);
}
/*****************************************************************************/
/* SysFS handler functions */
/*****************************************************************************/
static ssize_t show_in_value(struct device *dev,
static ssize_t in_value_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
return sprintf(buf, "%u\n", data->volt[index]);
}
static ssize_t show_temp_value(struct device *dev,
static ssize_t temp_value_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
return sprintf(buf, "%u\n", data->temp_input[index]);
}
static ssize_t show_temp_fault(struct device *dev,
static ssize_t temp_fault_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
/* 00h Temperature = Sensor Error */
return sprintf(buf, "%d\n", data->temp_input[index] == 0);
}
static ssize_t show_temp_alarm(struct device *dev,
static ssize_t temp_alarm_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
return sprintf(buf, "%u\n", !!(data->temp_alarm & BIT(index)));
}
static ssize_t
clear_temp_alarm(struct device *dev, struct device_attribute *devattr,
temp_alarm_store(struct device *dev, struct device_attribute *devattr,
const char *buf, size_t count)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
long ret;
ret = fts_update_device(data);
if (ret < 0)
return ret;
if (ret < 0)
goto error;
data->valid = false;
ret = count;
error:
mutex_unlock(&data->update_lock);
return ret;
}
static ssize_t show_fan_value(struct device *dev,
static ssize_t fan_value_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
return sprintf(buf, "%u\n", data->fan_input[index]);
}
static ssize_t show_fan_source(struct device *dev,
static ssize_t fan_source_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
return sprintf(buf, "%u\n", data->fan_source[index]);
}
static ssize_t show_fan_alarm(struct device *dev,
static ssize_t fan_alarm_show(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
int err;
err = fts_update_device(data);
if (err < 0)
return err;
return sprintf(buf, "%d\n", !!(data->fan_alarm & BIT(index)));
}
static ssize_t
clear_fan_alarm(struct device *dev, struct device_attribute *devattr,
fan_alarm_store(struct device *dev, struct device_attribute *devattr,
const char *buf, size_t count)
{
struct fts_data *data = dev_get_drvdata(dev);
int index = to_sensor_dev_attr(devattr)->index;
long ret;
ret = fts_update_device(data);
if (ret < 0)
return ret;
error:
mutex_unlock(&data->update_lock);
return ret;
}
/*****************************************************************************/
/* SysFS structs */
/*****************************************************************************/
/* Temprature sensors */
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_value, NULL, 0);
static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_value, NULL, 1);
static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp_value, NULL, 2);
static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp_value, NULL, 3);
static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp_value, NULL, 4);
static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp_value, NULL, 5);
static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_temp_value, NULL, 6);
static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_temp_value, NULL, 7);
static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_temp_value, NULL, 8);
static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_temp_value, NULL, 9);
static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO, show_temp_value, NULL, 10);
static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO, show_temp_value, NULL, 11);
static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO, show_temp_value, NULL, 12);
static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO, show_temp_value, NULL, 13);
static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO, show_temp_value, NULL, 14);
static SENSOR_DEVICE_ATTR(temp16_input, S_IRUGO, show_temp_value, NULL, 15);
static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0);
static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_temp_fault, NULL, 1);
static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_temp_fault, NULL, 2);
static SENSOR_DEVICE_ATTR(temp4_fault, S_IRUGO, show_temp_fault, NULL, 3);
static SENSOR_DEVICE_ATTR(temp5_fault, S_IRUGO, show_temp_fault, NULL, 4);
static SENSOR_DEVICE_ATTR(temp6_fault, S_IRUGO, show_temp_fault, NULL, 5);
static SENSOR_DEVICE_ATTR(temp7_fault, S_IRUGO, show_temp_fault, NULL, 6);
static SENSOR_DEVICE_ATTR(temp8_fault, S_IRUGO, show_temp_fault, NULL, 7);
static SENSOR_DEVICE_ATTR(temp9_fault, S_IRUGO, show_temp_fault, NULL, 8);
static SENSOR_DEVICE_ATTR(temp10_fault, S_IRUGO, show_temp_fault, NULL, 9);
static SENSOR_DEVICE_ATTR(temp11_fault, S_IRUGO, show_temp_fault, NULL, 10);
static SENSOR_DEVICE_ATTR(temp12_fault, S_IRUGO, show_temp_fault, NULL, 11);
static SENSOR_DEVICE_ATTR(temp13_fault, S_IRUGO, show_temp_fault, NULL, 12);
static SENSOR_DEVICE_ATTR(temp14_fault, S_IRUGO, show_temp_fault, NULL, 13);
static SENSOR_DEVICE_ATTR(temp15_fault, S_IRUGO, show_temp_fault, NULL, 14);
static SENSOR_DEVICE_ATTR(temp16_fault, S_IRUGO, show_temp_fault, NULL, 15);
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 0);
static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 1);
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 2);
static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 3);
static SENSOR_DEVICE_ATTR(temp5_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 4);
static SENSOR_DEVICE_ATTR(temp6_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 5);
static SENSOR_DEVICE_ATTR(temp7_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 6);
static SENSOR_DEVICE_ATTR(temp8_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 7);
static SENSOR_DEVICE_ATTR(temp9_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 8);
static SENSOR_DEVICE_ATTR(temp10_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 9);
static SENSOR_DEVICE_ATTR(temp11_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 10);
static SENSOR_DEVICE_ATTR(temp12_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 11);
static SENSOR_DEVICE_ATTR(temp13_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 12);
static SENSOR_DEVICE_ATTR(temp14_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 13);
static SENSOR_DEVICE_ATTR(temp15_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 14);
static SENSOR_DEVICE_ATTR(temp16_alarm, S_IRUGO | S_IWUSR, show_temp_alarm,
clear_temp_alarm, 15);
static SENSOR_DEVICE_ATTR_RO(temp1_input, temp_value, 0);
static SENSOR_DEVICE_ATTR_RO(temp2_input, temp_value, 1);
static SENSOR_DEVICE_ATTR_RO(temp3_input, temp_value, 2);
static SENSOR_DEVICE_ATTR_RO(temp4_input, temp_value, 3);
static SENSOR_DEVICE_ATTR_RO(temp5_input, temp_value, 4);
static SENSOR_DEVICE_ATTR_RO(temp6_input, temp_value, 5);
static SENSOR_DEVICE_ATTR_RO(temp7_input, temp_value, 6);
static SENSOR_DEVICE_ATTR_RO(temp8_input, temp_value, 7);
static SENSOR_DEVICE_ATTR_RO(temp9_input, temp_value, 8);
static SENSOR_DEVICE_ATTR_RO(temp10_input, temp_value, 9);
static SENSOR_DEVICE_ATTR_RO(temp11_input, temp_value, 10);
static SENSOR_DEVICE_ATTR_RO(temp12_input, temp_value, 11);
static SENSOR_DEVICE_ATTR_RO(temp13_input, temp_value, 12);
static SENSOR_DEVICE_ATTR_RO(temp14_input, temp_value, 13);
static SENSOR_DEVICE_ATTR_RO(temp15_input, temp_value, 14);
static SENSOR_DEVICE_ATTR_RO(temp16_input, temp_value, 15);
static SENSOR_DEVICE_ATTR_RO(temp1_fault, temp_fault, 0);
static SENSOR_DEVICE_ATTR_RO(temp2_fault, temp_fault, 1);
static SENSOR_DEVICE_ATTR_RO(temp3_fault, temp_fault, 2);
static SENSOR_DEVICE_ATTR_RO(temp4_fault, temp_fault, 3);
static SENSOR_DEVICE_ATTR_RO(temp5_fault, temp_fault, 4);
static SENSOR_DEVICE_ATTR_RO(temp6_fault, temp_fault, 5);
static SENSOR_DEVICE_ATTR_RO(temp7_fault, temp_fault, 6);
static SENSOR_DEVICE_ATTR_RO(temp8_fault, temp_fault, 7);
static SENSOR_DEVICE_ATTR_RO(temp9_fault, temp_fault, 8);
static SENSOR_DEVICE_ATTR_RO(temp10_fault, temp_fault, 9);
static SENSOR_DEVICE_ATTR_RO(temp11_fault, temp_fault, 10);
static SENSOR_DEVICE_ATTR_RO(temp12_fault, temp_fault, 11);
static SENSOR_DEVICE_ATTR_RO(temp13_fault, temp_fault, 12);
static SENSOR_DEVICE_ATTR_RO(temp14_fault, temp_fault, 13);
static SENSOR_DEVICE_ATTR_RO(temp15_fault, temp_fault, 14);
static SENSOR_DEVICE_ATTR_RO(temp16_fault, temp_fault, 15);
static SENSOR_DEVICE_ATTR_RW(temp1_alarm, temp_alarm, 0);
static SENSOR_DEVICE_ATTR_RW(temp2_alarm, temp_alarm, 1);
static SENSOR_DEVICE_ATTR_RW(temp3_alarm, temp_alarm, 2);
static SENSOR_DEVICE_ATTR_RW(temp4_alarm, temp_alarm, 3);
static SENSOR_DEVICE_ATTR_RW(temp5_alarm, temp_alarm, 4);
static SENSOR_DEVICE_ATTR_RW(temp6_alarm, temp_alarm, 5);
static SENSOR_DEVICE_ATTR_RW(temp7_alarm, temp_alarm, 6);
static SENSOR_DEVICE_ATTR_RW(temp8_alarm, temp_alarm, 7);
static SENSOR_DEVICE_ATTR_RW(temp9_alarm, temp_alarm, 8);
static SENSOR_DEVICE_ATTR_RW(temp10_alarm, temp_alarm, 9);
static SENSOR_DEVICE_ATTR_RW(temp11_alarm, temp_alarm, 10);
static SENSOR_DEVICE_ATTR_RW(temp12_alarm, temp_alarm, 11);
static SENSOR_DEVICE_ATTR_RW(temp13_alarm, temp_alarm, 12);
static SENSOR_DEVICE_ATTR_RW(temp14_alarm, temp_alarm, 13);
static SENSOR_DEVICE_ATTR_RW(temp15_alarm, temp_alarm, 14);
static SENSOR_DEVICE_ATTR_RW(temp16_alarm, temp_alarm, 15);
static struct attribute *fts_temp_attrs[] = {
&sensor_dev_attr_temp1_input.dev_attr.attr,
&sensor_dev_attr_temp2_input.dev_attr.attr,
&sensor_dev_attr_temp3_input.dev_attr.attr,
&sensor_dev_attr_temp4_input.dev_attr.attr,
&sensor_dev_attr_temp5_input.dev_attr.attr,
&sensor_dev_attr_temp6_input.dev_attr.attr,
&sensor_dev_attr_temp7_input.dev_attr.attr,
&sensor_dev_attr_temp8_input.dev_attr.attr,
&sensor_dev_attr_temp11_alarm.dev_attr.attr,
&sensor_dev_attr_temp12_alarm.dev_attr.attr,
&sensor_dev_attr_temp13_alarm.dev_attr.attr,
&sensor_dev_attr_temp14_alarm.dev_attr.attr,
&sensor_dev_attr_temp15_alarm.dev_attr.attr,
&sensor_dev_attr_temp16_alarm.dev_attr.attr,
NULL
};
/* Fans */
static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_value, NULL, 0);
static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_value, NULL, 1);
static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan_value, NULL, 2);
static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan_value, NULL, 3);
static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan_value, NULL, 4);
static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan_value, NULL, 5);
static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan_value, NULL, 6);
static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan_value, NULL, 7);
static SENSOR_DEVICE_ATTR(fan1_source, S_IRUGO, show_fan_source, NULL, 0);
static SENSOR_DEVICE_ATTR(fan2_source, S_IRUGO, show_fan_source, NULL, 1);
static SENSOR_DEVICE_ATTR(fan3_source, S_IRUGO, show_fan_source, NULL, 2);
static SENSOR_DEVICE_ATTR(fan4_source, S_IRUGO, show_fan_source, NULL, 3);
static SENSOR_DEVICE_ATTR(fan5_source, S_IRUGO, show_fan_source, NULL, 4);
static SENSOR_DEVICE_ATTR(fan6_source, S_IRUGO, show_fan_source, NULL, 5);
static SENSOR_DEVICE_ATTR(fan7_source, S_IRUGO, show_fan_source, NULL, 6);
static SENSOR_DEVICE_ATTR(fan8_source, S_IRUGO, show_fan_source, NULL, 7);
static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 0);
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 1);
static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 2);
static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 3);
static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 4);
static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 5);
static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 6);
static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO | S_IWUSR,
show_fan_alarm, clear_fan_alarm, 7);
static SENSOR_DEVICE_ATTR_RO(fan1_input, fan_value, 0);
static SENSOR_DEVICE_ATTR_RO(fan2_input, fan_value, 1);
static SENSOR_DEVICE_ATTR_RO(fan3_input, fan_value, 2);
static SENSOR_DEVICE_ATTR_RO(fan4_input, fan_value, 3);
static SENSOR_DEVICE_ATTR_RO(fan5_input, fan_value, 4);
static SENSOR_DEVICE_ATTR_RO(fan6_input, fan_value, 5);
static SENSOR_DEVICE_ATTR_RO(fan7_input, fan_value, 6);
static SENSOR_DEVICE_ATTR_RO(fan8_input, fan_value, 7);
static SENSOR_DEVICE_ATTR_RO(fan1_source, fan_source, 0);
static SENSOR_DEVICE_ATTR_RO(fan2_source, fan_source, 1);
static SENSOR_DEVICE_ATTR_RO(fan3_source, fan_source, 2);
static SENSOR_DEVICE_ATTR_RO(fan4_source, fan_source, 3);
static SENSOR_DEVICE_ATTR_RO(fan5_source, fan_source, 4);
static SENSOR_DEVICE_ATTR_RO(fan6_source, fan_source, 5);
static SENSOR_DEVICE_ATTR_RO(fan7_source, fan_source, 6);
static SENSOR_DEVICE_ATTR_RO(fan8_source, fan_source, 7);
static SENSOR_DEVICE_ATTR_RW(fan1_alarm, fan_alarm, 0);
static SENSOR_DEVICE_ATTR_RW(fan2_alarm, fan_alarm, 1);
static SENSOR_DEVICE_ATTR_RW(fan3_alarm, fan_alarm, 2);
static SENSOR_DEVICE_ATTR_RW(fan4_alarm, fan_alarm, 3);
static SENSOR_DEVICE_ATTR_RW(fan5_alarm, fan_alarm, 4);
static SENSOR_DEVICE_ATTR_RW(fan6_alarm, fan_alarm, 5);
static SENSOR_DEVICE_ATTR_RW(fan7_alarm, fan_alarm, 6);
static SENSOR_DEVICE_ATTR_RW(fan8_alarm, fan_alarm, 7);
static struct attribute *fts_fan_attrs[] = {
&sensor_dev_attr_fan1_input.dev_attr.attr,
&sensor_dev_attr_fan2_input.dev_attr.attr,
&sensor_dev_attr_fan3_input.dev_attr.attr,
&sensor_dev_attr_fan4_input.dev_attr.attr,
&sensor_dev_attr_fan5_input.dev_attr.attr,
&sensor_dev_attr_fan6_input.dev_attr.attr,
&sensor_dev_attr_fan7_input.dev_attr.attr,
&sensor_dev_attr_fan8_input.dev_attr.attr,
&sensor_dev_attr_fan3_alarm.dev_attr.attr,
&sensor_dev_attr_fan4_alarm.dev_attr.attr,
&sensor_dev_attr_fan5_alarm.dev_attr.attr,
&sensor_dev_attr_fan6_alarm.dev_attr.attr,
&sensor_dev_attr_fan7_alarm.dev_attr.attr,
&sensor_dev_attr_fan8_alarm.dev_attr.attr,
NULL
};
/* Voltages */
static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in_value, NULL, 0);
static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in_value, NULL, 1);
static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in_value, NULL, 2);
static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in_value, NULL, 3);
static SENSOR_DEVICE_ATTR_RO(in1_input, in_value, 0);
static SENSOR_DEVICE_ATTR_RO(in2_input, in_value, 1);
static SENSOR_DEVICE_ATTR_RO(in3_input, in_value, 2);
static SENSOR_DEVICE_ATTR_RO(in4_input, in_value, 3);
static struct attribute *fts_voltage_attrs[] = {
&sensor_dev_attr_in1_input.dev_attr.attr,
&sensor_dev_attr_in2_input.dev_attr.attr,
&sensor_dev_attr_in3_input.dev_attr.attr,
&sensor_dev_attr_in4_input.dev_attr.attr,
NULL
};
static const struct attribute_group fts_voltage_attr_group = {
.attrs = fts_voltage_attrs