aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/adt7475.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index fba2f016e4d8..188ae428ccdd 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -76,6 +76,9 @@
76#define REG_EXTEND1 0x76 76#define REG_EXTEND1 0x76
77#define REG_EXTEND2 0x77 77#define REG_EXTEND2 0x77
78#define REG_CONFIG5 0x7C 78#define REG_CONFIG5 0x7C
79#define REG_CONFIG4 0x7D
80
81#define CONFIG4_MAXDUTY 0x08
79 82
80#define CONFIG5_TWOSCOMP 0x01 83#define CONFIG5_TWOSCOMP 0x01
81#define CONFIG5_TEMPOFFSET 0x02 84#define CONFIG5_TEMPOFFSET 0x02
@@ -132,6 +135,7 @@ struct adt7475_data {
132 unsigned long limits_updated; 135 unsigned long limits_updated;
133 char valid; 136 char valid;
134 137
138 u8 config4;
135 u8 config5; 139 u8 config5;
136 u16 alarms; 140 u16 alarms;
137 u16 voltage[3][3]; 141 u16 voltage[3][3];
@@ -779,6 +783,38 @@ static ssize_t set_pwmfreq(struct device *dev, struct device_attribute *attr,
779 return count; 783 return count;
780} 784}
781 785
786static ssize_t show_pwm_at_crit(struct device *dev,
787 struct device_attribute *devattr, char *buf)
788{
789 struct adt7475_data *data = adt7475_update_device(dev);
790 return sprintf(buf, "%d\n", !!(data->config4 & CONFIG4_MAXDUTY));
791}
792
793static ssize_t set_pwm_at_crit(struct device *dev,
794 struct device_attribute *devattr,
795 const char *buf, size_t count)
796{
797 struct i2c_client *client = to_i2c_client(dev);
798 struct adt7475_data *data = i2c_get_clientdata(client);
799 long val;
800
801 if (strict_strtol(buf, 10, &val))
802 return -EINVAL;
803 if (val != 0 && val != 1)
804 return -EINVAL;
805
806 mutex_lock(&data->lock);
807 data->config4 = i2c_smbus_read_byte_data(client, REG_CONFIG4);
808 if (val)
809 data->config4 |= CONFIG4_MAXDUTY;
810 else
811 data->config4 &= ~CONFIG4_MAXDUTY;
812 i2c_smbus_write_byte_data(client, REG_CONFIG4, data->config4);
813 mutex_unlock(&data->lock);
814
815 return count;
816}
817
782static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_voltage, NULL, INPUT, 0); 818static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_voltage, NULL, INPUT, 0);
783static SENSOR_DEVICE_ATTR_2(in1_max, S_IRUGO | S_IWUSR, show_voltage, 819static SENSOR_DEVICE_ATTR_2(in1_max, S_IRUGO | S_IWUSR, show_voltage,
784 set_voltage, MAX, 0); 820 set_voltage, MAX, 0);
@@ -894,6 +930,10 @@ static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm,
894static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO | S_IWUSR, show_pwm, 930static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO | S_IWUSR, show_pwm,
895 set_pwm, MAX, 2); 931 set_pwm, MAX, 2);
896 932
933/* Non-standard name, might need revisiting */
934static DEVICE_ATTR(pwm_use_point2_pwm_at_crit, S_IWUSR | S_IRUGO,
935 show_pwm_at_crit, set_pwm_at_crit);
936
897static struct attribute *adt7475_attrs[] = { 937static struct attribute *adt7475_attrs[] = {
898 &sensor_dev_attr_in1_input.dev_attr.attr, 938 &sensor_dev_attr_in1_input.dev_attr.attr,
899 &sensor_dev_attr_in1_max.dev_attr.attr, 939 &sensor_dev_attr_in1_max.dev_attr.attr,
@@ -962,6 +1002,7 @@ static struct attribute *adt7475_attrs[] = {
962 &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr, 1002 &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr,
963 &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, 1003 &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
964 &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, 1004 &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
1005 &dev_attr_pwm_use_point2_pwm_at_crit.attr,
965 NULL, 1006 NULL,
966}; 1007};
967 1008
@@ -1160,6 +1201,7 @@ static struct adt7475_data *adt7475_update_device(struct device *dev)
1160 /* Limits and settings, should never change update every 60 seconds */ 1201 /* Limits and settings, should never change update every 60 seconds */
1161 if (time_after(jiffies, data->limits_updated + HZ * 60) || 1202 if (time_after(jiffies, data->limits_updated + HZ * 60) ||
1162 !data->valid) { 1203 !data->valid) {
1204 data->config4 = adt7475_read(REG_CONFIG4);
1163 data->config5 = adt7475_read(REG_CONFIG5); 1205 data->config5 = adt7475_read(REG_CONFIG5);
1164 1206
1165 for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) { 1207 for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) {