diff options
Diffstat (limited to 'drivers/hwmon/asb100.c')
-rw-r--r-- | drivers/hwmon/asb100.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/drivers/hwmon/asb100.c b/drivers/hwmon/asb100.c index ae9de63cf2e0..65b2709f750c 100644 --- a/drivers/hwmon/asb100.c +++ b/drivers/hwmon/asb100.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/err.h> | 44 | #include <linux/err.h> |
45 | #include <linux/init.h> | 45 | #include <linux/init.h> |
46 | #include <linux/jiffies.h> | 46 | #include <linux/jiffies.h> |
47 | #include <linux/mutex.h> | ||
47 | #include "lm75.h" | 48 | #include "lm75.h" |
48 | 49 | ||
49 | /* | 50 | /* |
@@ -182,10 +183,10 @@ static u8 DIV_TO_REG(long val) | |||
182 | struct asb100_data { | 183 | struct asb100_data { |
183 | struct i2c_client client; | 184 | struct i2c_client client; |
184 | struct class_device *class_dev; | 185 | struct class_device *class_dev; |
185 | struct semaphore lock; | 186 | struct mutex lock; |
186 | enum chips type; | 187 | enum chips type; |
187 | 188 | ||
188 | struct semaphore update_lock; | 189 | struct mutex update_lock; |
189 | unsigned long last_updated; /* In jiffies */ | 190 | unsigned long last_updated; /* In jiffies */ |
190 | 191 | ||
191 | /* array of 2 pointers to subclients */ | 192 | /* array of 2 pointers to subclients */ |
@@ -245,11 +246,11 @@ static ssize_t set_in_##reg(struct device *dev, const char *buf, \ | |||
245 | struct asb100_data *data = i2c_get_clientdata(client); \ | 246 | struct asb100_data *data = i2c_get_clientdata(client); \ |
246 | unsigned long val = simple_strtoul(buf, NULL, 10); \ | 247 | unsigned long val = simple_strtoul(buf, NULL, 10); \ |
247 | \ | 248 | \ |
248 | down(&data->update_lock); \ | 249 | mutex_lock(&data->update_lock); \ |
249 | data->in_##reg[nr] = IN_TO_REG(val); \ | 250 | data->in_##reg[nr] = IN_TO_REG(val); \ |
250 | asb100_write_value(client, ASB100_REG_IN_##REG(nr), \ | 251 | asb100_write_value(client, ASB100_REG_IN_##REG(nr), \ |
251 | data->in_##reg[nr]); \ | 252 | data->in_##reg[nr]); \ |
252 | up(&data->update_lock); \ | 253 | mutex_unlock(&data->update_lock); \ |
253 | return count; \ | 254 | return count; \ |
254 | } | 255 | } |
255 | 256 | ||
@@ -331,10 +332,10 @@ static ssize_t set_fan_min(struct device *dev, const char *buf, | |||
331 | struct asb100_data *data = i2c_get_clientdata(client); | 332 | struct asb100_data *data = i2c_get_clientdata(client); |
332 | u32 val = simple_strtoul(buf, NULL, 10); | 333 | u32 val = simple_strtoul(buf, NULL, 10); |
333 | 334 | ||
334 | down(&data->update_lock); | 335 | mutex_lock(&data->update_lock); |
335 | data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); | 336 | data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); |
336 | asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); | 337 | asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); |
337 | up(&data->update_lock); | 338 | mutex_unlock(&data->update_lock); |
338 | return count; | 339 | return count; |
339 | } | 340 | } |
340 | 341 | ||
@@ -351,7 +352,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
351 | unsigned long val = simple_strtoul(buf, NULL, 10); | 352 | unsigned long val = simple_strtoul(buf, NULL, 10); |
352 | int reg; | 353 | int reg; |
353 | 354 | ||
354 | down(&data->update_lock); | 355 | mutex_lock(&data->update_lock); |
355 | 356 | ||
356 | min = FAN_FROM_REG(data->fan_min[nr], | 357 | min = FAN_FROM_REG(data->fan_min[nr], |
357 | DIV_FROM_REG(data->fan_div[nr])); | 358 | DIV_FROM_REG(data->fan_div[nr])); |
@@ -381,7 +382,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
381 | FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); | 382 | FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); |
382 | asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); | 383 | asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); |
383 | 384 | ||
384 | up(&data->update_lock); | 385 | mutex_unlock(&data->update_lock); |
385 | 386 | ||
386 | return count; | 387 | return count; |
387 | } | 388 | } |
@@ -461,7 +462,7 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \ | |||
461 | struct asb100_data *data = i2c_get_clientdata(client); \ | 462 | struct asb100_data *data = i2c_get_clientdata(client); \ |
462 | unsigned long val = simple_strtoul(buf, NULL, 10); \ | 463 | unsigned long val = simple_strtoul(buf, NULL, 10); \ |
463 | \ | 464 | \ |
464 | down(&data->update_lock); \ | 465 | mutex_lock(&data->update_lock); \ |
465 | switch (nr) { \ | 466 | switch (nr) { \ |
466 | case 1: case 2: \ | 467 | case 1: case 2: \ |
467 | data->reg[nr] = LM75_TEMP_TO_REG(val); \ | 468 | data->reg[nr] = LM75_TEMP_TO_REG(val); \ |
@@ -472,7 +473,7 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \ | |||
472 | } \ | 473 | } \ |
473 | asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \ | 474 | asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \ |
474 | data->reg[nr]); \ | 475 | data->reg[nr]); \ |
475 | up(&data->update_lock); \ | 476 | mutex_unlock(&data->update_lock); \ |
476 | return count; \ | 477 | return count; \ |
477 | } | 478 | } |
478 | 479 | ||
@@ -574,11 +575,11 @@ static ssize_t set_pwm1(struct device *dev, struct device_attribute *attr, const | |||
574 | struct asb100_data *data = i2c_get_clientdata(client); | 575 | struct asb100_data *data = i2c_get_clientdata(client); |
575 | unsigned long val = simple_strtoul(buf, NULL, 10); | 576 | unsigned long val = simple_strtoul(buf, NULL, 10); |
576 | 577 | ||
577 | down(&data->update_lock); | 578 | mutex_lock(&data->update_lock); |
578 | data->pwm &= 0x80; /* keep the enable bit */ | 579 | data->pwm &= 0x80; /* keep the enable bit */ |
579 | data->pwm |= (0x0f & ASB100_PWM_TO_REG(val)); | 580 | data->pwm |= (0x0f & ASB100_PWM_TO_REG(val)); |
580 | asb100_write_value(client, ASB100_REG_PWM1, data->pwm); | 581 | asb100_write_value(client, ASB100_REG_PWM1, data->pwm); |
581 | up(&data->update_lock); | 582 | mutex_unlock(&data->update_lock); |
582 | return count; | 583 | return count; |
583 | } | 584 | } |
584 | 585 | ||
@@ -595,11 +596,11 @@ static ssize_t set_pwm_enable1(struct device *dev, struct device_attribute *attr | |||
595 | struct asb100_data *data = i2c_get_clientdata(client); | 596 | struct asb100_data *data = i2c_get_clientdata(client); |
596 | unsigned long val = simple_strtoul(buf, NULL, 10); | 597 | unsigned long val = simple_strtoul(buf, NULL, 10); |
597 | 598 | ||
598 | down(&data->update_lock); | 599 | mutex_lock(&data->update_lock); |
599 | data->pwm &= 0x0f; /* keep the duty cycle bits */ | 600 | data->pwm &= 0x0f; /* keep the duty cycle bits */ |
600 | data->pwm |= (val ? 0x80 : 0x00); | 601 | data->pwm |= (val ? 0x80 : 0x00); |
601 | asb100_write_value(client, ASB100_REG_PWM1, data->pwm); | 602 | asb100_write_value(client, ASB100_REG_PWM1, data->pwm); |
602 | up(&data->update_lock); | 603 | mutex_unlock(&data->update_lock); |
603 | return count; | 604 | return count; |
604 | } | 605 | } |
605 | 606 | ||
@@ -729,7 +730,7 @@ static int asb100_detect(struct i2c_adapter *adapter, int address, int kind) | |||
729 | } | 730 | } |
730 | 731 | ||
731 | new_client = &data->client; | 732 | new_client = &data->client; |
732 | init_MUTEX(&data->lock); | 733 | mutex_init(&data->lock); |
733 | i2c_set_clientdata(new_client, data); | 734 | i2c_set_clientdata(new_client, data); |
734 | new_client->addr = address; | 735 | new_client->addr = address; |
735 | new_client->adapter = adapter; | 736 | new_client->adapter = adapter; |
@@ -789,7 +790,7 @@ static int asb100_detect(struct i2c_adapter *adapter, int address, int kind) | |||
789 | data->type = kind; | 790 | data->type = kind; |
790 | 791 | ||
791 | data->valid = 0; | 792 | data->valid = 0; |
792 | init_MUTEX(&data->update_lock); | 793 | mutex_init(&data->update_lock); |
793 | 794 | ||
794 | /* Tell the I2C layer a new client has arrived */ | 795 | /* Tell the I2C layer a new client has arrived */ |
795 | if ((err = i2c_attach_client(new_client))) | 796 | if ((err = i2c_attach_client(new_client))) |
@@ -885,7 +886,7 @@ static int asb100_read_value(struct i2c_client *client, u16 reg) | |||
885 | struct i2c_client *cl; | 886 | struct i2c_client *cl; |
886 | int res, bank; | 887 | int res, bank; |
887 | 888 | ||
888 | down(&data->lock); | 889 | mutex_lock(&data->lock); |
889 | 890 | ||
890 | bank = (reg >> 8) & 0x0f; | 891 | bank = (reg >> 8) & 0x0f; |
891 | if (bank > 2) | 892 | if (bank > 2) |
@@ -919,7 +920,7 @@ static int asb100_read_value(struct i2c_client *client, u16 reg) | |||
919 | if (bank > 2) | 920 | if (bank > 2) |
920 | i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0); | 921 | i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0); |
921 | 922 | ||
922 | up(&data->lock); | 923 | mutex_unlock(&data->lock); |
923 | 924 | ||
924 | return res; | 925 | return res; |
925 | } | 926 | } |
@@ -930,7 +931,7 @@ static void asb100_write_value(struct i2c_client *client, u16 reg, u16 value) | |||
930 | struct i2c_client *cl; | 931 | struct i2c_client *cl; |
931 | int bank; | 932 | int bank; |
932 | 933 | ||
933 | down(&data->lock); | 934 | mutex_lock(&data->lock); |
934 | 935 | ||
935 | bank = (reg >> 8) & 0x0f; | 936 | bank = (reg >> 8) & 0x0f; |
936 | if (bank > 2) | 937 | if (bank > 2) |
@@ -960,7 +961,7 @@ static void asb100_write_value(struct i2c_client *client, u16 reg, u16 value) | |||
960 | if (bank > 2) | 961 | if (bank > 2) |
961 | i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0); | 962 | i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0); |
962 | 963 | ||
963 | up(&data->lock); | 964 | mutex_unlock(&data->lock); |
964 | } | 965 | } |
965 | 966 | ||
966 | static void asb100_init_client(struct i2c_client *client) | 967 | static void asb100_init_client(struct i2c_client *client) |
@@ -984,7 +985,7 @@ static struct asb100_data *asb100_update_device(struct device *dev) | |||
984 | struct asb100_data *data = i2c_get_clientdata(client); | 985 | struct asb100_data *data = i2c_get_clientdata(client); |
985 | int i; | 986 | int i; |
986 | 987 | ||
987 | down(&data->update_lock); | 988 | mutex_lock(&data->update_lock); |
988 | 989 | ||
989 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) | 990 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) |
990 | || !data->valid) { | 991 | || !data->valid) { |
@@ -1042,7 +1043,7 @@ static struct asb100_data *asb100_update_device(struct device *dev) | |||
1042 | dev_dbg(&client->dev, "... device update complete\n"); | 1043 | dev_dbg(&client->dev, "... device update complete\n"); |
1043 | } | 1044 | } |
1044 | 1045 | ||
1045 | up(&data->update_lock); | 1046 | mutex_unlock(&data->update_lock); |
1046 | 1047 | ||
1047 | return data; | 1048 | return data; |
1048 | } | 1049 | } |