diff options
-rw-r--r-- | drivers/hwmon/w83781d.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c index 96338ddd74a7..4f93d79a4308 100644 --- a/drivers/hwmon/w83781d.c +++ b/drivers/hwmon/w83781d.c | |||
@@ -164,12 +164,9 @@ static const u8 BIT_SCFG2[] = { 0x10, 0x20, 0x40 }; | |||
164 | #define W83781D_REG_RT_IDX 0x50 | 164 | #define W83781D_REG_RT_IDX 0x50 |
165 | #define W83781D_REG_RT_VAL 0x51 | 165 | #define W83781D_REG_RT_VAL 0x51 |
166 | 166 | ||
167 | /* Conversions. Rounding and limit checking is only done on the TO_REG | 167 | /* Conversions */ |
168 | variants. Note that you should be a bit careful with which arguments | 168 | #define IN_TO_REG(val) SENSORS_LIMIT(((val) + 8) / 16, 0, 255) |
169 | these macros are called: arguments may be evaluated more than once. | 169 | #define IN_FROM_REG(val) ((val) * 16) |
170 | Fixing this is just not worth it. */ | ||
171 | #define IN_TO_REG(val) (SENSORS_LIMIT((((val) * 10 + 8)/16),0,255)) | ||
172 | #define IN_FROM_REG(val) (((val) * 16) / 10) | ||
173 | 170 | ||
174 | static inline u8 | 171 | static inline u8 |
175 | FAN_TO_REG(long rpm, int div) | 172 | FAN_TO_REG(long rpm, int div) |
@@ -180,24 +177,24 @@ FAN_TO_REG(long rpm, int div) | |||
180 | return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254); | 177 | return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254); |
181 | } | 178 | } |
182 | 179 | ||
183 | #define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \ | 180 | static inline long |
184 | ((val) == 255 ? 0 : \ | 181 | FAN_FROM_REG(u8 val, int div) |
185 | 1350000 / ((val) * (div)))) | 182 | { |
183 | if (val == 0) | ||
184 | return -1; | ||
185 | if (val == 255) | ||
186 | return 0; | ||
187 | return 1350000 / (val * div); | ||
188 | } | ||
186 | 189 | ||
187 | #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \ | 190 | #define TEMP_TO_REG(val) SENSORS_LIMIT((val) / 1000, -127, 128) |
188 | : (val)) / 1000, 0, 0xff)) | 191 | #define TEMP_FROM_REG(val) ((val) * 1000) |
189 | #define TEMP_FROM_REG(val) (((val) & 0x80 ? (val)-0x100 : (val)) * 1000) | ||
190 | 192 | ||
191 | #define PWM_FROM_REG(val) (val) | ||
192 | #define PWM_TO_REG(val) (SENSORS_LIMIT((val),0,255)) | ||
193 | #define BEEP_MASK_FROM_REG(val,type) ((type) == as99127f ? \ | 193 | #define BEEP_MASK_FROM_REG(val,type) ((type) == as99127f ? \ |
194 | (val) ^ 0x7fff : (val)) | 194 | (val) ^ 0x7fff : (val)) |
195 | #define BEEP_MASK_TO_REG(val,type) ((type) == as99127f ? \ | 195 | #define BEEP_MASK_TO_REG(val,type) ((type) == as99127f ? \ |
196 | (~(val)) & 0x7fff : (val) & 0xffffff) | 196 | (~(val)) & 0x7fff : (val) & 0xffffff) |
197 | 197 | ||
198 | #define BEEP_ENABLE_TO_REG(val) ((val) ? 1 : 0) | ||
199 | #define BEEP_ENABLE_FROM_REG(val) ((val) ? 1 : 0) | ||
200 | |||
201 | #define DIV_FROM_REG(val) (1 << (val)) | 198 | #define DIV_FROM_REG(val) (1 << (val)) |
202 | 199 | ||
203 | static inline u8 | 200 | static inline u8 |
@@ -212,7 +209,7 @@ DIV_TO_REG(long val, enum chips type) | |||
212 | break; | 209 | break; |
213 | val >>= 1; | 210 | val >>= 1; |
214 | } | 211 | } |
215 | return ((u8) i); | 212 | return i; |
216 | } | 213 | } |
217 | 214 | ||
218 | /* There are some complications in a module like this. First off, W83781D chips | 215 | /* There are some complications in a module like this. First off, W83781D chips |
@@ -246,9 +243,9 @@ struct w83781d_data { | |||
246 | u8 in_min[9]; /* Register value - 8 & 9 for 782D only */ | 243 | u8 in_min[9]; /* Register value - 8 & 9 for 782D only */ |
247 | u8 fan[3]; /* Register value */ | 244 | u8 fan[3]; /* Register value */ |
248 | u8 fan_min[3]; /* Register value */ | 245 | u8 fan_min[3]; /* Register value */ |
249 | u8 temp; | 246 | s8 temp; /* Register value */ |
250 | u8 temp_max; /* Register value */ | 247 | s8 temp_max; /* Register value */ |
251 | u8 temp_max_hyst; /* Register value */ | 248 | s8 temp_max_hyst; /* Register value */ |
252 | u16 temp_add[2]; /* Register value */ | 249 | u16 temp_add[2]; /* Register value */ |
253 | u16 temp_max_add[2]; /* Register value */ | 250 | u16 temp_max_add[2]; /* Register value */ |
254 | u16 temp_max_hyst_add[2]; /* Register value */ | 251 | u16 temp_max_hyst_add[2]; /* Register value */ |
@@ -303,7 +300,7 @@ static struct platform_driver w83781d_isa_driver = { | |||
303 | static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ | 300 | static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ |
304 | { \ | 301 | { \ |
305 | struct w83781d_data *data = w83781d_update_device(dev); \ | 302 | struct w83781d_data *data = w83781d_update_device(dev); \ |
306 | return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr] * 10)); \ | 303 | return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->reg[nr])); \ |
307 | } | 304 | } |
308 | show_in_reg(in); | 305 | show_in_reg(in); |
309 | show_in_reg(in_min); | 306 | show_in_reg(in_min); |
@@ -316,7 +313,7 @@ static ssize_t store_in_##reg (struct device *dev, const char *buf, size_t count | |||
316 | struct i2c_client *client = &data->client; \ | 313 | struct i2c_client *client = &data->client; \ |
317 | u32 val; \ | 314 | u32 val; \ |
318 | \ | 315 | \ |
319 | val = simple_strtoul(buf, NULL, 10) / 10; \ | 316 | val = simple_strtoul(buf, NULL, 10); \ |
320 | \ | 317 | \ |
321 | mutex_lock(&data->update_lock); \ | 318 | mutex_lock(&data->update_lock); \ |
322 | data->in_##reg[nr] = IN_TO_REG(val); \ | 319 | data->in_##reg[nr] = IN_TO_REG(val); \ |
@@ -534,8 +531,7 @@ static ssize_t show_beep_mask (struct device *dev, struct device_attribute *attr | |||
534 | static ssize_t show_beep_enable (struct device *dev, struct device_attribute *attr, char *buf) | 531 | static ssize_t show_beep_enable (struct device *dev, struct device_attribute *attr, char *buf) |
535 | { | 532 | { |
536 | struct w83781d_data *data = w83781d_update_device(dev); | 533 | struct w83781d_data *data = w83781d_update_device(dev); |
537 | return sprintf(buf, "%ld\n", | 534 | return sprintf(buf, "%ld\n", (long)data->beep_enable); |
538 | (long)BEEP_ENABLE_FROM_REG(data->beep_enable)); | ||
539 | } | 535 | } |
540 | 536 | ||
541 | #define BEEP_ENABLE 0 /* Store beep_enable */ | 537 | #define BEEP_ENABLE 0 /* Store beep_enable */ |
@@ -566,7 +562,7 @@ store_beep_reg(struct device *dev, const char *buf, size_t count, | |||
566 | val2 = (data->beep_mask >> 8) & 0x7f; | 562 | val2 = (data->beep_mask >> 8) & 0x7f; |
567 | } else { /* We are storing beep_enable */ | 563 | } else { /* We are storing beep_enable */ |
568 | val2 = w83781d_read_value(client, W83781D_REG_BEEP_INTS2) & 0x7f; | 564 | val2 = w83781d_read_value(client, W83781D_REG_BEEP_INTS2) & 0x7f; |
569 | data->beep_enable = BEEP_ENABLE_TO_REG(val); | 565 | data->beep_enable = !!val; |
570 | } | 566 | } |
571 | 567 | ||
572 | w83781d_write_value(client, W83781D_REG_BEEP_INTS2, | 568 | w83781d_write_value(client, W83781D_REG_BEEP_INTS2, |
@@ -659,7 +655,7 @@ static ssize_t | |||
659 | show_pwm_reg(struct device *dev, char *buf, int nr) | 655 | show_pwm_reg(struct device *dev, char *buf, int nr) |
660 | { | 656 | { |
661 | struct w83781d_data *data = w83781d_update_device(dev); | 657 | struct w83781d_data *data = w83781d_update_device(dev); |
662 | return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr - 1])); | 658 | return sprintf(buf, "%ld\n", (long)data->pwm[nr - 1]); |
663 | } | 659 | } |
664 | 660 | ||
665 | static ssize_t | 661 | static ssize_t |
@@ -679,7 +675,7 @@ store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
679 | val = simple_strtoul(buf, NULL, 10); | 675 | val = simple_strtoul(buf, NULL, 10); |
680 | 676 | ||
681 | mutex_lock(&data->update_lock); | 677 | mutex_lock(&data->update_lock); |
682 | data->pwm[nr - 1] = PWM_TO_REG(val); | 678 | data->pwm[nr - 1] = SENSORS_LIMIT(val, 0, 255); |
683 | w83781d_write_value(client, W83781D_REG_PWM(nr), data->pwm[nr - 1]); | 679 | w83781d_write_value(client, W83781D_REG_PWM(nr), data->pwm[nr - 1]); |
684 | mutex_unlock(&data->update_lock); | 680 | mutex_unlock(&data->update_lock); |
685 | return count; | 681 | return count; |