aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2008-10-17 11:51:13 -0400
committerJean Delvare <khali@mahadeva.delvare>2008-10-17 11:51:13 -0400
commit34e7dc6ca4a663a1bb0a0a4e118426849dccd72d (patch)
treeeaf36724303f94d320990799f768bf86cd5b3b6e /drivers
parent69fc1feba2d5856ff74dedb6ae9d8c490210825c (diff)
hwmon: (lm85) Implement the standard PWM frequency interface
Implement the standard PWM frequency interface: pwm[1-*]_freq in units of 1 Hz, instead of the non-standard pwm[1-*]_auto_pwm_freq in units of 0.1 Hz. The old naming was not only non-standard, it was also confusing, because it suggested that the frequency value only applied in automatic fan speed mode, which isn't true. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Herbert Poetzl <herbert@13thfloor.at>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hwmon/lm85.c77
1 files changed, 38 insertions, 39 deletions
diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c
index 3594a02f281b..6b676df3547b 100644
--- a/drivers/hwmon/lm85.c
+++ b/drivers/hwmon/lm85.c
@@ -191,8 +191,8 @@ static int RANGE_TO_REG(int range)
191#define RANGE_FROM_REG(val) lm85_range_map[(val) & 0x0f] 191#define RANGE_FROM_REG(val) lm85_range_map[(val) & 0x0f]
192 192
193/* These are the PWM frequency encodings */ 193/* These are the PWM frequency encodings */
194static const int lm85_freq_map[] = { /* .1 Hz */ 194static const int lm85_freq_map[8] = { /* 1 Hz */
195 100, 150, 230, 300, 380, 470, 620, 940 195 10, 15, 23, 30, 38, 47, 62, 94
196}; 196};
197 197
198static int FREQ_TO_REG(int freq) 198static int FREQ_TO_REG(int freq)
@@ -275,7 +275,6 @@ struct lm85_zone {
275 275
276struct lm85_autofan { 276struct lm85_autofan {
277 u8 config; /* Register value */ 277 u8 config; /* Register value */
278 u8 freq; /* PWM frequency, encoded */
279 u8 min_pwm; /* Minimum PWM value, encoded */ 278 u8 min_pwm; /* Minimum PWM value, encoded */
280 u8 min_off; /* Min PWM or OFF below "limit", flag */ 279 u8 min_off; /* Min PWM or OFF below "limit", flag */
281}; 280};
@@ -301,6 +300,7 @@ struct lm85_data {
301 u16 fan[4]; /* Register value */ 300 u16 fan[4]; /* Register value */
302 u16 fan_min[4]; /* Register value */ 301 u16 fan_min[4]; /* Register value */
303 u8 pwm[3]; /* Register value */ 302 u8 pwm[3]; /* Register value */
303 u8 pwm_freq[3]; /* Register encoding */
304 u8 temp_ext[3]; /* Decoded values */ 304 u8 temp_ext[3]; /* Decoded values */
305 u8 in_ext[8]; /* Decoded values */ 305 u8 in_ext[8]; /* Decoded values */
306 u8 vid; /* Register value */ 306 u8 vid; /* Register value */
@@ -528,11 +528,38 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
528 return count; 528 return count;
529} 529}
530 530
531static ssize_t show_pwm_freq(struct device *dev,
532 struct device_attribute *attr, char *buf)
533{
534 int nr = to_sensor_dev_attr(attr)->index;
535 struct lm85_data *data = lm85_update_device(dev);
536 return sprintf(buf, "%d\n", FREQ_FROM_REG(data->pwm_freq[nr]));
537}
538
539static ssize_t set_pwm_freq(struct device *dev,
540 struct device_attribute *attr, const char *buf, size_t count)
541{
542 int nr = to_sensor_dev_attr(attr)->index;
543 struct i2c_client *client = to_i2c_client(dev);
544 struct lm85_data *data = i2c_get_clientdata(client);
545 long val = simple_strtol(buf, NULL, 10);
546
547 mutex_lock(&data->update_lock);
548 data->pwm_freq[nr] = FREQ_TO_REG(val);
549 lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
550 (data->zone[nr].range << 4)
551 | data->pwm_freq[nr]);
552 mutex_unlock(&data->update_lock);
553 return count;
554}
555
531#define show_pwm_reg(offset) \ 556#define show_pwm_reg(offset) \
532static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ 557static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
533 show_pwm, set_pwm, offset - 1); \ 558 show_pwm, set_pwm, offset - 1); \
534static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \ 559static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
535 show_pwm_enable, set_pwm_enable, offset - 1) 560 show_pwm_enable, set_pwm_enable, offset - 1); \
561static SENSOR_DEVICE_ATTR(pwm##offset##_freq, S_IRUGO | S_IWUSR, \
562 show_pwm_freq, set_pwm_freq, offset - 1)
536 563
537show_pwm_reg(1); 564show_pwm_reg(1);
538show_pwm_reg(2); 565show_pwm_reg(2);
@@ -761,31 +788,6 @@ static ssize_t set_pwm_auto_pwm_minctl(struct device *dev,
761 return count; 788 return count;
762} 789}
763 790
764static ssize_t show_pwm_auto_pwm_freq(struct device *dev,
765 struct device_attribute *attr, char *buf)
766{
767 int nr = to_sensor_dev_attr(attr)->index;
768 struct lm85_data *data = lm85_update_device(dev);
769 return sprintf(buf, "%d\n", FREQ_FROM_REG(data->autofan[nr].freq));
770}
771
772static ssize_t set_pwm_auto_pwm_freq(struct device *dev,
773 struct device_attribute *attr, const char *buf, size_t count)
774{
775 int nr = to_sensor_dev_attr(attr)->index;
776 struct i2c_client *client = to_i2c_client(dev);
777 struct lm85_data *data = i2c_get_clientdata(client);
778 long val = simple_strtol(buf, NULL, 10);
779
780 mutex_lock(&data->update_lock);
781 data->autofan[nr].freq = FREQ_TO_REG(val);
782 lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
783 (data->zone[nr].range << 4)
784 | data->autofan[nr].freq);
785 mutex_unlock(&data->update_lock);
786 return count;
787}
788
789#define pwm_auto(offset) \ 791#define pwm_auto(offset) \
790static SENSOR_DEVICE_ATTR(pwm##offset##_auto_channels, \ 792static SENSOR_DEVICE_ATTR(pwm##offset##_auto_channels, \
791 S_IRUGO | S_IWUSR, show_pwm_auto_channels, \ 793 S_IRUGO | S_IWUSR, show_pwm_auto_channels, \
@@ -795,10 +797,7 @@ static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_min, \
795 set_pwm_auto_pwm_min, offset - 1); \ 797 set_pwm_auto_pwm_min, offset - 1); \
796static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_minctl, \ 798static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_minctl, \
797 S_IRUGO | S_IWUSR, show_pwm_auto_pwm_minctl, \ 799 S_IRUGO | S_IWUSR, show_pwm_auto_pwm_minctl, \
798 set_pwm_auto_pwm_minctl, offset - 1); \ 800 set_pwm_auto_pwm_minctl, offset - 1)
799static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_freq, \
800 S_IRUGO | S_IWUSR, show_pwm_auto_pwm_freq, \
801 set_pwm_auto_pwm_freq, offset - 1);
802 801
803pwm_auto(1); 802pwm_auto(1);
804pwm_auto(2); 803pwm_auto(2);
@@ -867,7 +866,7 @@ static ssize_t set_temp_auto_temp_min(struct device *dev,
867 TEMP_FROM_REG(data->zone[nr].limit)); 866 TEMP_FROM_REG(data->zone[nr].limit));
868 lm85_write_value(client, LM85_REG_AFAN_RANGE(nr), 867 lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
869 ((data->zone[nr].range & 0x0f) << 4) 868 ((data->zone[nr].range & 0x0f) << 4)
870 | (data->autofan[nr].freq & 0x07)); 869 | (data->pwm_freq[nr] & 0x07));
871 870
872/* Update temp_auto_hyst and temp_auto_off */ 871/* Update temp_auto_hyst and temp_auto_off */
873 data->zone[nr].hyst = HYST_TO_REG(TEMP_FROM_REG( 872 data->zone[nr].hyst = HYST_TO_REG(TEMP_FROM_REG(
@@ -910,7 +909,7 @@ static ssize_t set_temp_auto_temp_max(struct device *dev,
910 val - min); 909 val - min);
911 lm85_write_value(client, LM85_REG_AFAN_RANGE(nr), 910 lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
912 ((data->zone[nr].range & 0x0f) << 4) 911 ((data->zone[nr].range & 0x0f) << 4)
913 | (data->autofan[nr].freq & 0x07)); 912 | (data->pwm_freq[nr] & 0x07));
914 mutex_unlock(&data->update_lock); 913 mutex_unlock(&data->update_lock);
915 return count; 914 return count;
916} 915}
@@ -984,6 +983,9 @@ static struct attribute *lm85_attributes[] = {
984 &sensor_dev_attr_pwm1_enable.dev_attr.attr, 983 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
985 &sensor_dev_attr_pwm2_enable.dev_attr.attr, 984 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
986 &sensor_dev_attr_pwm3_enable.dev_attr.attr, 985 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
986 &sensor_dev_attr_pwm1_freq.dev_attr.attr,
987 &sensor_dev_attr_pwm2_freq.dev_attr.attr,
988 &sensor_dev_attr_pwm3_freq.dev_attr.attr,
987 989
988 &sensor_dev_attr_in0_input.dev_attr.attr, 990 &sensor_dev_attr_in0_input.dev_attr.attr,
989 &sensor_dev_attr_in1_input.dev_attr.attr, 991 &sensor_dev_attr_in1_input.dev_attr.attr,
@@ -1026,9 +1028,6 @@ static struct attribute *lm85_attributes[] = {
1026 &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr, 1028 &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr,
1027 &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr, 1029 &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr,
1028 &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr, 1030 &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr,
1029 &sensor_dev_attr_pwm1_auto_pwm_freq.dev_attr.attr,
1030 &sensor_dev_attr_pwm2_auto_pwm_freq.dev_attr.attr,
1031 &sensor_dev_attr_pwm3_auto_pwm_freq.dev_attr.attr,
1032 1031
1033 &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr, 1032 &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr,
1034 &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr, 1033 &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr,
@@ -1458,7 +1457,7 @@ static struct lm85_data *lm85_update_device(struct device *dev)
1458 data->autofan[i].config = 1457 data->autofan[i].config =
1459 lm85_read_value(client, LM85_REG_AFAN_CONFIG(i)); 1458 lm85_read_value(client, LM85_REG_AFAN_CONFIG(i));
1460 val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i)); 1459 val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i));
1461 data->autofan[i].freq = val & 0x07; 1460 data->pwm_freq[i] = val & 0x07;
1462 data->zone[i].range = val >> 4; 1461 data->zone[i].range = val >> 4;
1463 data->autofan[i].min_pwm = 1462 data->autofan[i].min_pwm =
1464 lm85_read_value(client, LM85_REG_AFAN_MINPWM(i)); 1463 lm85_read_value(client, LM85_REG_AFAN_MINPWM(i));