diff options
-rw-r--r-- | drivers/hwmon/lm85.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c index c323c2b89808..3a84dc863df0 100644 --- a/drivers/hwmon/lm85.c +++ b/drivers/hwmon/lm85.c | |||
@@ -5,6 +5,7 @@ | |||
5 | Copyright (c) 2002, 2003 Philip Pokorny <ppokorny@penguincomputing.com> | 5 | Copyright (c) 2002, 2003 Philip Pokorny <ppokorny@penguincomputing.com> |
6 | Copyright (c) 2003 Margit Schubert-While <margitsw@t-online.de> | 6 | Copyright (c) 2003 Margit Schubert-While <margitsw@t-online.de> |
7 | Copyright (c) 2004 Justin Thiessen <jthiessen@penguincomputing.com> | 7 | Copyright (c) 2004 Justin Thiessen <jthiessen@penguincomputing.com> |
8 | Copyright (C) 2007, 2008 Jean Delvare <khali@linux-fr.org> | ||
8 | 9 | ||
9 | Chip details at <http://www.national.com/ds/LM/LM85.pdf> | 10 | Chip details at <http://www.national.com/ds/LM/LM85.pdf> |
10 | 11 | ||
@@ -192,20 +193,27 @@ static int RANGE_TO_REG(int range) | |||
192 | 193 | ||
193 | /* These are the PWM frequency encodings */ | 194 | /* These are the PWM frequency encodings */ |
194 | static const int lm85_freq_map[8] = { /* 1 Hz */ | 195 | static const int lm85_freq_map[8] = { /* 1 Hz */ |
195 | 10, 15, 23, 30, 38, 47, 62, 94 | 196 | 10, 15, 23, 30, 38, 47, 61, 94 |
197 | }; | ||
198 | static const int adm1027_freq_map[8] = { /* 1 Hz */ | ||
199 | 11, 15, 22, 29, 35, 44, 59, 88 | ||
196 | }; | 200 | }; |
197 | 201 | ||
198 | static int FREQ_TO_REG(int freq) | 202 | static int FREQ_TO_REG(const int *map, int freq) |
199 | { | 203 | { |
200 | int i; | 204 | int i; |
201 | 205 | ||
202 | /* Find the closest match */ | 206 | /* Find the closest match */ |
203 | for (i = 0; i < 7; ++i) | 207 | for (i = 0; i < 7; ++i) |
204 | if (freq <= (lm85_freq_map[i] + lm85_freq_map[i + 1]) / 2) | 208 | if (freq <= (map[i] + map[i + 1]) / 2) |
205 | break; | 209 | break; |
206 | return i; | 210 | return i; |
207 | } | 211 | } |
208 | #define FREQ_FROM_REG(val) lm85_freq_map[(val) & 0x07] | 212 | |
213 | static int FREQ_FROM_REG(const int *map, u8 reg) | ||
214 | { | ||
215 | return map[reg & 0x07]; | ||
216 | } | ||
209 | 217 | ||
210 | /* Since we can't use strings, I'm abusing these numbers | 218 | /* Since we can't use strings, I'm abusing these numbers |
211 | * to stand in for the following meanings: | 219 | * to stand in for the following meanings: |
@@ -283,6 +291,7 @@ struct lm85_autofan { | |||
283 | struct lm85_data { | 291 | struct lm85_data { |
284 | struct i2c_client client; | 292 | struct i2c_client client; |
285 | struct device *hwmon_dev; | 293 | struct device *hwmon_dev; |
294 | const int *freq_map; | ||
286 | enum chips type; | 295 | enum chips type; |
287 | 296 | ||
288 | struct mutex update_lock; | 297 | struct mutex update_lock; |
@@ -532,7 +541,8 @@ static ssize_t show_pwm_freq(struct device *dev, | |||
532 | { | 541 | { |
533 | int nr = to_sensor_dev_attr(attr)->index; | 542 | int nr = to_sensor_dev_attr(attr)->index; |
534 | struct lm85_data *data = lm85_update_device(dev); | 543 | struct lm85_data *data = lm85_update_device(dev); |
535 | return sprintf(buf, "%d\n", FREQ_FROM_REG(data->pwm_freq[nr])); | 544 | return sprintf(buf, "%d\n", FREQ_FROM_REG(data->freq_map, |
545 | data->pwm_freq[nr])); | ||
536 | } | 546 | } |
537 | 547 | ||
538 | static ssize_t set_pwm_freq(struct device *dev, | 548 | static ssize_t set_pwm_freq(struct device *dev, |
@@ -544,7 +554,7 @@ static ssize_t set_pwm_freq(struct device *dev, | |||
544 | long val = simple_strtol(buf, NULL, 10); | 554 | long val = simple_strtol(buf, NULL, 10); |
545 | 555 | ||
546 | mutex_lock(&data->update_lock); | 556 | mutex_lock(&data->update_lock); |
547 | data->pwm_freq[nr] = FREQ_TO_REG(val); | 557 | data->pwm_freq[nr] = FREQ_TO_REG(data->freq_map, val); |
548 | lm85_write_value(client, LM85_REG_AFAN_RANGE(nr), | 558 | lm85_write_value(client, LM85_REG_AFAN_RANGE(nr), |
549 | (data->zone[nr].range << 4) | 559 | (data->zone[nr].range << 4) |
550 | | data->pwm_freq[nr]); | 560 | | data->pwm_freq[nr]); |
@@ -1184,24 +1194,31 @@ static int lm85_detect(struct i2c_adapter *adapter, int address, | |||
1184 | switch (kind) { | 1194 | switch (kind) { |
1185 | case lm85b: | 1195 | case lm85b: |
1186 | type_name = "lm85b"; | 1196 | type_name = "lm85b"; |
1197 | data->freq_map = lm85_freq_map; | ||
1187 | break; | 1198 | break; |
1188 | case lm85c: | 1199 | case lm85c: |
1189 | type_name = "lm85c"; | 1200 | type_name = "lm85c"; |
1201 | data->freq_map = lm85_freq_map; | ||
1190 | break; | 1202 | break; |
1191 | case adm1027: | 1203 | case adm1027: |
1192 | type_name = "adm1027"; | 1204 | type_name = "adm1027"; |
1205 | data->freq_map = adm1027_freq_map; | ||
1193 | break; | 1206 | break; |
1194 | case adt7463: | 1207 | case adt7463: |
1195 | type_name = "adt7463"; | 1208 | type_name = "adt7463"; |
1209 | data->freq_map = adm1027_freq_map; | ||
1196 | break; | 1210 | break; |
1197 | case emc6d100: | 1211 | case emc6d100: |
1198 | type_name = "emc6d100"; | 1212 | type_name = "emc6d100"; |
1213 | data->freq_map = adm1027_freq_map; | ||
1199 | break; | 1214 | break; |
1200 | case emc6d102: | 1215 | case emc6d102: |
1201 | type_name = "emc6d102"; | 1216 | type_name = "emc6d102"; |
1217 | data->freq_map = adm1027_freq_map; | ||
1202 | break; | 1218 | break; |
1203 | default: | 1219 | default: |
1204 | type_name = "lm85"; | 1220 | type_name = "lm85"; |
1221 | data->freq_map = lm85_freq_map; | ||
1205 | } | 1222 | } |
1206 | strlcpy(client->name, type_name, I2C_NAME_SIZE); | 1223 | strlcpy(client->name, type_name, I2C_NAME_SIZE); |
1207 | 1224 | ||