diff options
Diffstat (limited to 'drivers/hwmon/lm63.c')
-rw-r--r-- | drivers/hwmon/lm63.c | 74 |
1 files changed, 53 insertions, 21 deletions
diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 508cb291f71b..e02d7f01b01b 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c | |||
@@ -204,7 +204,12 @@ static ssize_t set_fan(struct device *dev, struct device_attribute *dummy, | |||
204 | { | 204 | { |
205 | struct i2c_client *client = to_i2c_client(dev); | 205 | struct i2c_client *client = to_i2c_client(dev); |
206 | struct lm63_data *data = i2c_get_clientdata(client); | 206 | struct lm63_data *data = i2c_get_clientdata(client); |
207 | unsigned long val = simple_strtoul(buf, NULL, 10); | 207 | unsigned long val; |
208 | int err; | ||
209 | |||
210 | err = kstrtoul(buf, 10, &val); | ||
211 | if (err) | ||
212 | return err; | ||
208 | 213 | ||
209 | mutex_lock(&data->update_lock); | 214 | mutex_lock(&data->update_lock); |
210 | data->fan[1] = FAN_TO_REG(val); | 215 | data->fan[1] = FAN_TO_REG(val); |
@@ -231,11 +236,15 @@ static ssize_t set_pwm1(struct device *dev, struct device_attribute *dummy, | |||
231 | struct i2c_client *client = to_i2c_client(dev); | 236 | struct i2c_client *client = to_i2c_client(dev); |
232 | struct lm63_data *data = i2c_get_clientdata(client); | 237 | struct lm63_data *data = i2c_get_clientdata(client); |
233 | unsigned long val; | 238 | unsigned long val; |
234 | 239 | int err; | |
240 | |||
235 | if (!(data->config_fan & 0x20)) /* register is read-only */ | 241 | if (!(data->config_fan & 0x20)) /* register is read-only */ |
236 | return -EPERM; | 242 | return -EPERM; |
237 | 243 | ||
238 | val = simple_strtoul(buf, NULL, 10); | 244 | err = kstrtoul(buf, 10, &val); |
245 | if (err) | ||
246 | return err; | ||
247 | |||
239 | mutex_lock(&data->update_lock); | 248 | mutex_lock(&data->update_lock); |
240 | data->pwm1_value = val <= 0 ? 0 : | 249 | data->pwm1_value = val <= 0 ? 0 : |
241 | val >= 255 ? 2 * data->pwm1_freq : | 250 | val >= 255 ? 2 * data->pwm1_freq : |
@@ -245,8 +254,8 @@ static ssize_t set_pwm1(struct device *dev, struct device_attribute *dummy, | |||
245 | return count; | 254 | return count; |
246 | } | 255 | } |
247 | 256 | ||
248 | static ssize_t show_pwm1_enable(struct device *dev, struct device_attribute *dummy, | 257 | static ssize_t show_pwm1_enable(struct device *dev, |
249 | char *buf) | 258 | struct device_attribute *dummy, char *buf) |
250 | { | 259 | { |
251 | struct lm63_data *data = lm63_update_device(dev); | 260 | struct lm63_data *data = lm63_update_device(dev); |
252 | return sprintf(buf, "%d\n", data->config_fan & 0x20 ? 1 : 2); | 261 | return sprintf(buf, "%d\n", data->config_fan & 0x20 ? 1 : 2); |
@@ -283,7 +292,12 @@ static ssize_t set_local_temp8(struct device *dev, | |||
283 | { | 292 | { |
284 | struct i2c_client *client = to_i2c_client(dev); | 293 | struct i2c_client *client = to_i2c_client(dev); |
285 | struct lm63_data *data = i2c_get_clientdata(client); | 294 | struct lm63_data *data = i2c_get_clientdata(client); |
286 | long val = simple_strtol(buf, NULL, 10); | 295 | long val; |
296 | int err; | ||
297 | |||
298 | err = kstrtol(buf, 10, &val); | ||
299 | if (err) | ||
300 | return err; | ||
287 | 301 | ||
288 | mutex_lock(&data->update_lock); | 302 | mutex_lock(&data->update_lock); |
289 | data->temp8[1] = TEMP8_TO_REG(val); | 303 | data->temp8[1] = TEMP8_TO_REG(val); |
@@ -314,9 +328,14 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, | |||
314 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 328 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
315 | struct i2c_client *client = to_i2c_client(dev); | 329 | struct i2c_client *client = to_i2c_client(dev); |
316 | struct lm63_data *data = i2c_get_clientdata(client); | 330 | struct lm63_data *data = i2c_get_clientdata(client); |
317 | long val = simple_strtol(buf, NULL, 10); | 331 | long val; |
332 | int err; | ||
318 | int nr = attr->index; | 333 | int nr = attr->index; |
319 | 334 | ||
335 | err = kstrtol(buf, 10, &val); | ||
336 | if (err) | ||
337 | return err; | ||
338 | |||
320 | mutex_lock(&data->update_lock); | 339 | mutex_lock(&data->update_lock); |
321 | data->temp11[nr] = TEMP11_TO_REG(val - data->temp2_offset); | 340 | data->temp11[nr] = TEMP11_TO_REG(val - data->temp2_offset); |
322 | i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2], | 341 | i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2], |
@@ -327,10 +346,12 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, | |||
327 | return count; | 346 | return count; |
328 | } | 347 | } |
329 | 348 | ||
330 | /* Hysteresis register holds a relative value, while we want to present | 349 | /* |
331 | an absolute to user-space */ | 350 | * Hysteresis register holds a relative value, while we want to present |
332 | static ssize_t show_temp2_crit_hyst(struct device *dev, struct device_attribute *dummy, | 351 | * an absolute to user-space |
333 | char *buf) | 352 | */ |
353 | static ssize_t show_temp2_crit_hyst(struct device *dev, | ||
354 | struct device_attribute *dummy, char *buf) | ||
334 | { | 355 | { |
335 | struct lm63_data *data = lm63_update_device(dev); | 356 | struct lm63_data *data = lm63_update_device(dev); |
336 | return sprintf(buf, "%d\n", TEMP8_FROM_REG(data->temp8[2]) | 357 | return sprintf(buf, "%d\n", TEMP8_FROM_REG(data->temp8[2]) |
@@ -338,16 +359,24 @@ static ssize_t show_temp2_crit_hyst(struct device *dev, struct device_attribute | |||
338 | - TEMP8_FROM_REG(data->temp2_crit_hyst)); | 359 | - TEMP8_FROM_REG(data->temp2_crit_hyst)); |
339 | } | 360 | } |
340 | 361 | ||
341 | /* And now the other way around, user-space provides an absolute | 362 | /* |
342 | hysteresis value and we have to store a relative one */ | 363 | * And now the other way around, user-space provides an absolute |
343 | static ssize_t set_temp2_crit_hyst(struct device *dev, struct device_attribute *dummy, | 364 | * hysteresis value and we have to store a relative one |
365 | */ | ||
366 | static ssize_t set_temp2_crit_hyst(struct device *dev, | ||
367 | struct device_attribute *dummy, | ||
344 | const char *buf, size_t count) | 368 | const char *buf, size_t count) |
345 | { | 369 | { |
346 | struct i2c_client *client = to_i2c_client(dev); | 370 | struct i2c_client *client = to_i2c_client(dev); |
347 | struct lm63_data *data = i2c_get_clientdata(client); | 371 | struct lm63_data *data = i2c_get_clientdata(client); |
348 | long val = simple_strtol(buf, NULL, 10); | 372 | long val; |
373 | int err; | ||
349 | long hyst; | 374 | long hyst; |
350 | 375 | ||
376 | err = kstrtol(buf, 10, &val); | ||
377 | if (err) | ||
378 | return err; | ||
379 | |||
351 | mutex_lock(&data->update_lock); | 380 | mutex_lock(&data->update_lock); |
352 | hyst = TEMP8_FROM_REG(data->temp8[2]) + data->temp2_offset - val; | 381 | hyst = TEMP8_FROM_REG(data->temp8[2]) + data->temp2_offset - val; |
353 | i2c_smbus_write_byte_data(client, LM63_REG_REMOTE_TCRIT_HYST, | 382 | i2c_smbus_write_byte_data(client, LM63_REG_REMOTE_TCRIT_HYST, |
@@ -518,12 +547,13 @@ static int lm63_probe(struct i2c_client *new_client, | |||
518 | lm63_init_client(new_client); | 547 | lm63_init_client(new_client); |
519 | 548 | ||
520 | /* Register sysfs hooks */ | 549 | /* Register sysfs hooks */ |
521 | if ((err = sysfs_create_group(&new_client->dev.kobj, | 550 | err = sysfs_create_group(&new_client->dev.kobj, &lm63_group); |
522 | &lm63_group))) | 551 | if (err) |
523 | goto exit_free; | 552 | goto exit_free; |
524 | if (data->config & 0x04) { /* tachometer enabled */ | 553 | if (data->config & 0x04) { /* tachometer enabled */ |
525 | if ((err = sysfs_create_group(&new_client->dev.kobj, | 554 | err = sysfs_create_group(&new_client->dev.kobj, |
526 | &lm63_group_fan1))) | 555 | &lm63_group_fan1); |
556 | if (err) | ||
527 | goto exit_remove_files; | 557 | goto exit_remove_files; |
528 | } | 558 | } |
529 | 559 | ||
@@ -544,8 +574,10 @@ exit: | |||
544 | return err; | 574 | return err; |
545 | } | 575 | } |
546 | 576 | ||
547 | /* Idealy we shouldn't have to initialize anything, since the BIOS | 577 | /* |
548 | should have taken care of everything */ | 578 | * Ideally we shouldn't have to initialize anything, since the BIOS |
579 | * should have taken care of everything | ||
580 | */ | ||
549 | static void lm63_init_client(struct i2c_client *client) | 581 | static void lm63_init_client(struct i2c_client *client) |
550 | { | 582 | { |
551 | struct lm63_data *data = i2c_get_clientdata(client); | 583 | struct lm63_data *data = i2c_get_clientdata(client); |