X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fhwmon%2Fsmsc47m1.c;fp=drivers%2Fhwmon%2Fsmsc47m1.c;h=d1e3ec0fe4dfa284570695784f0b2a19c742120d;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=825e8f72698fdf8d24bf021e88d7551f167749bb;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c index 825e8f726..d1e3ec0fe 100644 --- a/drivers/hwmon/smsc47m1.c +++ b/drivers/hwmon/smsc47m1.c @@ -34,7 +34,6 @@ #include #include #include -#include #include /* Address is autodetected, there is no default value */ @@ -103,9 +102,9 @@ superio_exit(void) struct smsc47m1_data { struct i2c_client client; struct class_device *class_dev; - struct mutex lock; + struct semaphore lock; - struct mutex update_lock; + struct semaphore update_lock; unsigned long last_updated; /* In jiffies */ u8 fan[2]; /* Register value */ @@ -189,25 +188,25 @@ static ssize_t set_fan_min(struct device *dev, const char *buf, struct smsc47m1_data *data = i2c_get_clientdata(client); long rpmdiv, val = simple_strtol(buf, NULL, 10); - mutex_lock(&data->update_lock); + down(&data->update_lock); rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]); if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) { - mutex_unlock(&data->update_lock); + up(&data->update_lock); return -EINVAL; } data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv); smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD(nr), data->fan_preload[nr]); - mutex_unlock(&data->update_lock); + up(&data->update_lock); return count; } /* Note: we save and restore the fan minimum here, because its value is determined in part by the fan clock divider. This follows the principle - of least surprise; the user doesn't expect the fan minimum to change just + of least suprise; the user doesn't expect the fan minimum to change just because the divider changed. */ static ssize_t set_fan_div(struct device *dev, const char *buf, size_t count, int nr) @@ -221,14 +220,14 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, if (new_div == old_div) /* No change */ return count; - mutex_lock(&data->update_lock); + down(&data->update_lock); switch (new_div) { case 1: data->fan_div[nr] = 0; break; case 2: data->fan_div[nr] = 1; break; case 4: data->fan_div[nr] = 2; break; case 8: data->fan_div[nr] = 3; break; default: - mutex_unlock(&data->update_lock); + up(&data->update_lock); return -EINVAL; } @@ -242,7 +241,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, data->fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191); smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD(nr), data->fan_preload[nr]); - mutex_unlock(&data->update_lock); + up(&data->update_lock); return count; } @@ -258,12 +257,12 @@ static ssize_t set_pwm(struct device *dev, const char *buf, if (val < 0 || val > 255) return -EINVAL; - mutex_lock(&data->update_lock); + down(&data->update_lock); data->pwm[nr] &= 0x81; /* Preserve additional bits */ data->pwm[nr] |= PWM_TO_REG(val); smsc47m1_write_value(client, SMSC47M1_REG_PWM(nr), data->pwm[nr]); - mutex_unlock(&data->update_lock); + up(&data->update_lock); return count; } @@ -279,12 +278,12 @@ static ssize_t set_pwm_en(struct device *dev, const char *buf, if (val != 0 && val != 1) return -EINVAL; - mutex_lock(&data->update_lock); + down(&data->update_lock); data->pwm[nr] &= 0xFE; /* preserve the other bits */ data->pwm[nr] |= !val; smsc47m1_write_value(client, SMSC47M1_REG_PWM(nr), data->pwm[nr]); - mutex_unlock(&data->update_lock); + up(&data->update_lock); return count; } @@ -409,13 +408,13 @@ static int smsc47m1_detect(struct i2c_adapter *adapter) new_client = &data->client; i2c_set_clientdata(new_client, data); new_client->addr = address; - mutex_init(&data->lock); + init_MUTEX(&data->lock); new_client->adapter = adapter; new_client->driver = &smsc47m1_driver; new_client->flags = 0; strlcpy(new_client->name, "smsc47m1", I2C_NAME_SIZE); - mutex_init(&data->update_lock); + init_MUTEX(&data->update_lock); /* If no function is properly configured, there's no point in actually registering the chip. */ @@ -513,17 +512,17 @@ static int smsc47m1_read_value(struct i2c_client *client, u8 reg) { int res; - mutex_lock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); + down(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); res = inb_p(client->addr + reg); - mutex_unlock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); + up(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); return res; } static void smsc47m1_write_value(struct i2c_client *client, u8 reg, u8 value) { - mutex_lock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); + down(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); outb_p(value, client->addr + reg); - mutex_unlock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); + up(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); } static struct smsc47m1_data *smsc47m1_update_device(struct device *dev, @@ -532,7 +531,7 @@ static struct smsc47m1_data *smsc47m1_update_device(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct smsc47m1_data *data = i2c_get_clientdata(client); - mutex_lock(&data->update_lock); + down(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) { int i; @@ -559,7 +558,7 @@ static struct smsc47m1_data *smsc47m1_update_device(struct device *dev, data->last_updated = jiffies; } - mutex_unlock(&data->update_lock); + up(&data->update_lock); return data; }