aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/pc87360.c84
1 files changed, 80 insertions, 4 deletions
diff --git a/drivers/hwmon/pc87360.c b/drivers/hwmon/pc87360.c
index 3a7d7fa64ebc..c80ee5f056ba 100644
--- a/drivers/hwmon/pc87360.c
+++ b/drivers/hwmon/pc87360.c
@@ -845,12 +845,76 @@ static ssize_t show_temp_alarms(struct device *dev, struct device_attribute *att
845} 845}
846static DEVICE_ATTR(alarms_temp, S_IRUGO, show_temp_alarms, NULL); 846static DEVICE_ATTR(alarms_temp, S_IRUGO, show_temp_alarms, NULL);
847 847
848/* show_temp_min/max_alarm() reads data from the per-channel status
849 register (sec 12.3.7), not the temp event status registers (sec
850 12.3.2) that show_temp_alarm() reads (via data->temp_alarms) */
851
852static ssize_t show_temp_min_alarm(struct device *dev,
853 struct device_attribute *devattr, char *buf)
854{
855 struct pc87360_data *data = pc87360_update_device(dev);
856 unsigned nr = to_sensor_dev_attr(devattr)->index;
857
858 return sprintf(buf, "%u\n", !!(data->temp_status[nr] & CHAN_ALM_MIN));
859}
860static ssize_t show_temp_max_alarm(struct device *dev,
861 struct device_attribute *devattr, char *buf)
862{
863 struct pc87360_data *data = pc87360_update_device(dev);
864 unsigned nr = to_sensor_dev_attr(devattr)->index;
865
866 return sprintf(buf, "%u\n", !!(data->temp_status[nr] & CHAN_ALM_MAX));
867}
868static ssize_t show_temp_crit_alarm(struct device *dev,
869 struct device_attribute *devattr, char *buf)
870{
871 struct pc87360_data *data = pc87360_update_device(dev);
872 unsigned nr = to_sensor_dev_attr(devattr)->index;
873
874 return sprintf(buf, "%u\n", !!(data->temp_status[nr] & TEMP_ALM_CRIT));
875}
876
877static struct sensor_device_attribute temp_min_alarm[] = {
878 SENSOR_ATTR(temp1_min_alarm, S_IRUGO, show_temp_min_alarm, NULL, 0),
879 SENSOR_ATTR(temp2_min_alarm, S_IRUGO, show_temp_min_alarm, NULL, 1),
880 SENSOR_ATTR(temp3_min_alarm, S_IRUGO, show_temp_min_alarm, NULL, 2),
881};
882static struct sensor_device_attribute temp_max_alarm[] = {
883 SENSOR_ATTR(temp1_max_alarm, S_IRUGO, show_temp_max_alarm, NULL, 0),
884 SENSOR_ATTR(temp2_max_alarm, S_IRUGO, show_temp_max_alarm, NULL, 1),
885 SENSOR_ATTR(temp3_max_alarm, S_IRUGO, show_temp_max_alarm, NULL, 2),
886};
887static struct sensor_device_attribute temp_crit_alarm[] = {
888 SENSOR_ATTR(temp1_crit_alarm, S_IRUGO, show_temp_crit_alarm, NULL, 0),
889 SENSOR_ATTR(temp2_crit_alarm, S_IRUGO, show_temp_crit_alarm, NULL, 1),
890 SENSOR_ATTR(temp3_crit_alarm, S_IRUGO, show_temp_crit_alarm, NULL, 2),
891};
892
893#define TEMP_FAULT 0x40 /* open diode */
894static ssize_t show_temp_fault(struct device *dev,
895 struct device_attribute *devattr, char *buf)
896{
897 struct pc87360_data *data = pc87360_update_device(dev);
898 unsigned nr = to_sensor_dev_attr(devattr)->index;
899
900 return sprintf(buf, "%u\n", !!(data->temp_status[nr] & TEMP_FAULT));
901}
902static struct sensor_device_attribute temp_fault[] = {
903 SENSOR_ATTR(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0),
904 SENSOR_ATTR(temp2_fault, S_IRUGO, show_temp_fault, NULL, 1),
905 SENSOR_ATTR(temp3_fault, S_IRUGO, show_temp_fault, NULL, 2),
906};
907
848#define TEMP_UNIT_ATTRS(X) \ 908#define TEMP_UNIT_ATTRS(X) \
849 &temp_input[X].dev_attr.attr, \ 909 &temp_input[X].dev_attr.attr, \
850 &temp_status[X].dev_attr.attr, \ 910 &temp_status[X].dev_attr.attr, \
851 &temp_min[X].dev_attr.attr, \ 911 &temp_min[X].dev_attr.attr, \
852 &temp_max[X].dev_attr.attr, \ 912 &temp_max[X].dev_attr.attr, \
853 &temp_crit[X].dev_attr.attr 913 &temp_crit[X].dev_attr.attr, \
914 &temp_min_alarm[X].dev_attr.attr, \
915 &temp_max_alarm[X].dev_attr.attr, \
916 &temp_crit_alarm[X].dev_attr.attr, \
917 &temp_fault[X].dev_attr.attr
854 918
855static struct attribute * pc8736x_temp_attr_array[] = { 919static struct attribute * pc8736x_temp_attr_array[] = {
856 TEMP_UNIT_ATTRS(0), 920 TEMP_UNIT_ATTRS(0),
@@ -864,8 +928,8 @@ static const struct attribute_group pc8736x_temp_group = {
864 .attrs = pc8736x_temp_attr_array, 928 .attrs = pc8736x_temp_attr_array,
865}; 929};
866 930
867static ssize_t show_name(struct device *dev, struct device_attribute 931static ssize_t show_name(struct device *dev,
868 *devattr, char *buf) 932 struct device_attribute *devattr, char *buf)
869{ 933{
870 struct pc87360_data *data = dev_get_drvdata(dev); 934 struct pc87360_data *data = dev_get_drvdata(dev);
871 return sprintf(buf, "%s\n", data->name); 935 return sprintf(buf, "%s\n", data->name);
@@ -1086,7 +1150,15 @@ static int __devinit pc87360_probe(struct platform_device *pdev)
1086 || (err = device_create_file(dev, 1150 || (err = device_create_file(dev,
1087 &temp_crit[i].dev_attr)) 1151 &temp_crit[i].dev_attr))
1088 || (err = device_create_file(dev, 1152 || (err = device_create_file(dev,
1089 &temp_status[i].dev_attr))) 1153 &temp_status[i].dev_attr))
1154 || (err = device_create_file(dev,
1155 &temp_min_alarm[i].dev_attr))
1156 || (err = device_create_file(dev,
1157 &temp_max_alarm[i].dev_attr))
1158 || (err = device_create_file(dev,
1159 &temp_crit_alarm[i].dev_attr))
1160 || (err = device_create_file(dev,
1161 &temp_fault[i].dev_attr)))
1090 goto ERROR3; 1162 goto ERROR3;
1091 } 1163 }
1092 if ((err = device_create_file(dev, &dev_attr_alarms_temp))) 1164 if ((err = device_create_file(dev, &dev_attr_alarms_temp)))
@@ -1192,6 +1264,10 @@ static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank,
1192#define CHAN_ALM_ENA 0x10 /* propagate to alarms-reg ?? (chk val!) */ 1264#define CHAN_ALM_ENA 0x10 /* propagate to alarms-reg ?? (chk val!) */
1193#define CHAN_READY (CHAN_ENA|CHAN_CNVRTD) /* sample ready mask */ 1265#define CHAN_READY (CHAN_ENA|CHAN_CNVRTD) /* sample ready mask */
1194 1266
1267#define TEMP_OTS_OE 0x20 /* OTS Output Enable */
1268#define VIN_RW1C_MASK (CHAN_READY|CHAN_ALM_MAX|CHAN_ALM_MIN) /* 0x87 */
1269#define TEMP_RW1C_MASK (VIN_RW1C_MASK|TEMP_ALM_CRIT|TEMP_FAULT) /* 0xCF */
1270
1195static void pc87360_init_device(struct platform_device *pdev, 1271static void pc87360_init_device(struct platform_device *pdev,
1196 int use_thermistors) 1272 int use_thermistors)
1197{ 1273{