aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/w83627hf.c76
1 files changed, 25 insertions, 51 deletions
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c
index c02c3bbde19f..9564fb069957 100644
--- a/drivers/hwmon/w83627hf.c
+++ b/drivers/hwmon/w83627hf.c
@@ -323,10 +323,8 @@ static inline u8 pwm_freq_to_reg(unsigned long val)
323 return (0x80 | (180000UL / (val << 8))); 323 return (0x80 | (180000UL / (val << 8)));
324} 324}
325 325
326#define BEEP_MASK_FROM_REG(val) (val) 326#define BEEP_MASK_FROM_REG(val) ((val) & 0xff7fff)
327#define BEEP_MASK_TO_REG(val) ((val) & 0xffffff) 327#define BEEP_MASK_TO_REG(val) ((val) & 0xff7fff)
328#define BEEP_ENABLE_TO_REG(val) ((val)?1:0)
329#define BEEP_ENABLE_FROM_REG(val) ((val)?1:0)
330 328
331#define DIV_FROM_REG(val) (1 << (val)) 329#define DIV_FROM_REG(val) (1 << (val))
332 330
@@ -367,7 +365,6 @@ struct w83627hf_data {
367 u8 vid; /* Register encoding, combined */ 365 u8 vid; /* Register encoding, combined */
368 u32 alarms; /* Register encoding, combined */ 366 u32 alarms; /* Register encoding, combined */
369 u32 beep_mask; /* Register encoding, combined */ 367 u32 beep_mask; /* Register encoding, combined */
370 u8 beep_enable; /* Boolean */
371 u8 pwm[3]; /* Register value */ 368 u8 pwm[3]; /* Register value */
372 u8 pwm_freq[3]; /* Register value */ 369 u8 pwm_freq[3]; /* Register value */
373 u16 sens[3]; /* 1 = pentium diode; 2 = 3904 diode; 370 u16 sens[3]; /* 1 = pentium diode; 2 = 3904 diode;
@@ -740,65 +737,41 @@ static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
740static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5); 737static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5);
741static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13); 738static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
742 739
743#define show_beep_reg(REG, reg) \ 740static ssize_t
744static ssize_t show_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \ 741show_beep_mask(struct device *dev, struct device_attribute *attr, char *buf)
745{ \ 742{
746 struct w83627hf_data *data = w83627hf_update_device(dev); \ 743 struct w83627hf_data *data = w83627hf_update_device(dev);
747 return sprintf(buf,"%ld\n", \ 744 return sprintf(buf, "%ld\n",
748 (long)BEEP_##REG##_FROM_REG(data->beep_##reg)); \ 745 (long)BEEP_MASK_FROM_REG(data->beep_mask));
749} 746}
750show_beep_reg(ENABLE, enable)
751show_beep_reg(MASK, mask)
752
753#define BEEP_ENABLE 0 /* Store beep_enable */
754#define BEEP_MASK 1 /* Store beep_mask */
755 747
756static ssize_t 748static ssize_t
757store_beep_reg(struct device *dev, const char *buf, size_t count, 749store_beep_mask(struct device *dev, struct device_attribute *attr,
758 int update_mask) 750 const char *buf, size_t count)
759{ 751{
760 struct w83627hf_data *data = dev_get_drvdata(dev); 752 struct w83627hf_data *data = dev_get_drvdata(dev);
761 u32 val, val2; 753 unsigned long val;
762 754
763 val = simple_strtoul(buf, NULL, 10); 755 val = simple_strtoul(buf, NULL, 10);
764 756
765 mutex_lock(&data->update_lock); 757 mutex_lock(&data->update_lock);
766 758
767 if (update_mask == BEEP_MASK) { /* We are storing beep_mask */ 759 /* preserve beep enable */
768 data->beep_mask = BEEP_MASK_TO_REG(val); 760 data->beep_mask = (data->beep_mask & 0x8000)
769 w83627hf_write_value(data, W83781D_REG_BEEP_INTS1, 761 | BEEP_MASK_TO_REG(val);
770 data->beep_mask & 0xff); 762 w83627hf_write_value(data, W83781D_REG_BEEP_INTS1,
771 w83627hf_write_value(data, W83781D_REG_BEEP_INTS3, 763 data->beep_mask & 0xff);
772 ((data->beep_mask) >> 16) & 0xff); 764 w83627hf_write_value(data, W83781D_REG_BEEP_INTS3,
773 val2 = (data->beep_mask >> 8) & 0x7f; 765 ((data->beep_mask) >> 16) & 0xff);
774 } else { /* We are storing beep_enable */
775 val2 =
776 w83627hf_read_value(data, W83781D_REG_BEEP_INTS2) & 0x7f;
777 data->beep_enable = BEEP_ENABLE_TO_REG(val);
778 }
779
780 w83627hf_write_value(data, W83781D_REG_BEEP_INTS2, 766 w83627hf_write_value(data, W83781D_REG_BEEP_INTS2,
781 val2 | data->beep_enable << 7); 767 (data->beep_mask >> 8) & 0xff);
782 768
783 mutex_unlock(&data->update_lock); 769 mutex_unlock(&data->update_lock);
784 return count; 770 return count;
785} 771}
786 772
787#define sysfs_beep(REG, reg) \ 773static DEVICE_ATTR(beep_mask, S_IRUGO | S_IWUSR,
788static ssize_t show_regs_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \ 774 show_beep_mask, store_beep_mask);
789{ \
790 return show_beep_##reg(dev, attr, buf); \
791} \
792static ssize_t \
793store_regs_beep_##reg (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
794{ \
795 return store_beep_reg(dev, buf, count, BEEP_##REG); \
796} \
797static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, \
798 show_regs_beep_##reg, store_regs_beep_##reg);
799
800sysfs_beep(ENABLE, enable);
801sysfs_beep(MASK, mask);
802 775
803static ssize_t 776static ssize_t
804show_beep(struct device *dev, struct device_attribute *attr, char *buf) 777show_beep(struct device *dev, struct device_attribute *attr, char *buf)
@@ -884,6 +857,8 @@ static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO | S_IWUSR,
884 show_beep, store_beep, 5); 857 show_beep, store_beep, 5);
885static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO | S_IWUSR, 858static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO | S_IWUSR,
886 show_beep, store_beep, 13); 859 show_beep, store_beep, 13);
860static SENSOR_DEVICE_ATTR(beep_enable, S_IRUGO | S_IWUSR,
861 show_beep, store_beep, 15);
887 862
888static ssize_t 863static ssize_t
889show_fan_div(struct device *dev, struct device_attribute *devattr, char *buf) 864show_fan_div(struct device *dev, struct device_attribute *devattr, char *buf)
@@ -1223,7 +1198,7 @@ static struct attribute *w83627hf_attributes[] = {
1223 TEMP_UNIT_ATTRS(2), 1198 TEMP_UNIT_ATTRS(2),
1224 1199
1225 &dev_attr_alarms.attr, 1200 &dev_attr_alarms.attr,
1226 &dev_attr_beep_enable.attr, 1201 &sensor_dev_attr_beep_enable.dev_attr.attr,
1227 &dev_attr_beep_mask.attr, 1202 &dev_attr_beep_mask.attr,
1228 1203
1229 &sensor_dev_attr_pwm1.dev_attr.attr, 1204 &sensor_dev_attr_pwm1.dev_attr.attr,
@@ -1748,8 +1723,7 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev)
1748 (w83627hf_read_value(data, W83781D_REG_ALARM2) << 8) | 1723 (w83627hf_read_value(data, W83781D_REG_ALARM2) << 8) |
1749 (w83627hf_read_value(data, W83781D_REG_ALARM3) << 16); 1724 (w83627hf_read_value(data, W83781D_REG_ALARM3) << 16);
1750 i = w83627hf_read_value(data, W83781D_REG_BEEP_INTS2); 1725 i = w83627hf_read_value(data, W83781D_REG_BEEP_INTS2);
1751 data->beep_enable = i >> 7; 1726 data->beep_mask = (i << 8) |
1752 data->beep_mask = ((i & 0x7f) << 8) |
1753 w83627hf_read_value(data, W83781D_REG_BEEP_INTS1) | 1727 w83627hf_read_value(data, W83781D_REG_BEEP_INTS1) |
1754 w83627hf_read_value(data, W83781D_REG_BEEP_INTS3) << 16; 1728 w83627hf_read_value(data, W83781D_REG_BEEP_INTS3) << 16;
1755 data->last_updated = jiffies; 1729 data->last_updated = jiffies;