diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/hwmon/adm1029.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/hwmon/adm1029.c')
-rw-r--r-- | drivers/hwmon/adm1029.c | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/drivers/hwmon/adm1029.c b/drivers/hwmon/adm1029.c index 97f4718382f..0b8a3b145bd 100644 --- a/drivers/hwmon/adm1029.c +++ b/drivers/hwmon/adm1029.c | |||
@@ -78,7 +78,7 @@ static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, | |||
78 | 78 | ||
79 | #define TEMP_FROM_REG(val) ((val) * 1000) | 79 | #define TEMP_FROM_REG(val) ((val) * 1000) |
80 | 80 | ||
81 | #define DIV_FROM_REG(val) (1 << (((val) >> 6) - 1)) | 81 | #define DIV_FROM_REG(val) ( 1 << (((val) >> 6) - 1)) |
82 | 82 | ||
83 | /* Registers to be checked by adm1029_update_device() */ | 83 | /* Registers to be checked by adm1029_update_device() */ |
84 | static const u8 ADM1029_REG_TEMP[] = { | 84 | static const u8 ADM1029_REG_TEMP[] = { |
@@ -200,11 +200,8 @@ static ssize_t set_fan_div(struct device *dev, | |||
200 | struct i2c_client *client = to_i2c_client(dev); | 200 | struct i2c_client *client = to_i2c_client(dev); |
201 | struct adm1029_data *data = i2c_get_clientdata(client); | 201 | struct adm1029_data *data = i2c_get_clientdata(client); |
202 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 202 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
203 | long val = simple_strtol(buf, NULL, 10); | ||
203 | u8 reg; | 204 | u8 reg; |
204 | long val; | ||
205 | int ret = kstrtol(buf, 10, &val); | ||
206 | if (ret < 0) | ||
207 | return ret; | ||
208 | 205 | ||
209 | mutex_lock(&data->update_lock); | 206 | mutex_lock(&data->update_lock); |
210 | 207 | ||
@@ -240,9 +237,9 @@ static ssize_t set_fan_div(struct device *dev, | |||
240 | } | 237 | } |
241 | 238 | ||
242 | /* | 239 | /* |
243 | * Access rights on sysfs. S_IRUGO: Is Readable by User, Group and Others | 240 | Access rights on sysfs, S_IRUGO stand for Is Readable by User, Group and Others |
244 | * S_IWUSR: Is Writable by User. | 241 | S_IWUSR stand for Is Writable by User |
245 | */ | 242 | */ |
246 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); | 243 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); |
247 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); | 244 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); |
248 | static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); | 245 | static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); |
@@ -303,8 +300,7 @@ static int adm1029_detect(struct i2c_client *client, | |||
303 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 300 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
304 | return -ENODEV; | 301 | return -ENODEV; |
305 | 302 | ||
306 | /* | 303 | /* ADM1029 doesn't have CHIP ID, check just MAN ID |
307 | * ADM1029 doesn't have CHIP ID, check just MAN ID | ||
308 | * For better detection we check also ADM1029_TEMP_DEVICES_INSTALLED, | 304 | * For better detection we check also ADM1029_TEMP_DEVICES_INSTALLED, |
309 | * ADM1029_REG_NB_FAN_SUPPORT and compare it with possible values | 305 | * ADM1029_REG_NB_FAN_SUPPORT and compare it with possible values |
310 | * documented | 306 | * documented |
@@ -322,10 +318,8 @@ static int adm1029_detect(struct i2c_client *client, | |||
322 | return -ENODEV; | 318 | return -ENODEV; |
323 | 319 | ||
324 | if ((chip_id & 0xF0) != 0x00) { | 320 | if ((chip_id & 0xF0) != 0x00) { |
325 | /* | 321 | /* There are no "official" CHIP ID, so actually |
326 | * There are no "official" CHIP ID, so actually | 322 | * we use Major/Minor revision for that */ |
327 | * we use Major/Minor revision for that | ||
328 | */ | ||
329 | pr_info("adm1029: Unknown major revision %x, " | 323 | pr_info("adm1029: Unknown major revision %x, " |
330 | "please let us know\n", chip_id); | 324 | "please let us know\n", chip_id); |
331 | return -ENODEV; | 325 | return -ENODEV; |
@@ -342,10 +336,11 @@ static int adm1029_probe(struct i2c_client *client, | |||
342 | struct adm1029_data *data; | 336 | struct adm1029_data *data; |
343 | int err; | 337 | int err; |
344 | 338 | ||
345 | data = devm_kzalloc(&client->dev, sizeof(struct adm1029_data), | 339 | data = kzalloc(sizeof(struct adm1029_data), GFP_KERNEL); |
346 | GFP_KERNEL); | 340 | if (!data) { |
347 | if (!data) | 341 | err = -ENOMEM; |
348 | return -ENOMEM; | 342 | goto exit; |
343 | } | ||
349 | 344 | ||
350 | i2c_set_clientdata(client, data); | 345 | i2c_set_clientdata(client, data); |
351 | mutex_init(&data->update_lock); | 346 | mutex_init(&data->update_lock); |
@@ -354,13 +349,14 @@ static int adm1029_probe(struct i2c_client *client, | |||
354 | * Initialize the ADM1029 chip | 349 | * Initialize the ADM1029 chip |
355 | * Check config register | 350 | * Check config register |
356 | */ | 351 | */ |
357 | if (adm1029_init_client(client) == 0) | 352 | if (adm1029_init_client(client) == 0) { |
358 | return -ENODEV; | 353 | err = -ENODEV; |
354 | goto exit_free; | ||
355 | } | ||
359 | 356 | ||
360 | /* Register sysfs hooks */ | 357 | /* Register sysfs hooks */ |
361 | err = sysfs_create_group(&client->dev.kobj, &adm1029_group); | 358 | if ((err = sysfs_create_group(&client->dev.kobj, &adm1029_group))) |
362 | if (err) | 359 | goto exit_free; |
363 | return err; | ||
364 | 360 | ||
365 | data->hwmon_dev = hwmon_device_register(&client->dev); | 361 | data->hwmon_dev = hwmon_device_register(&client->dev); |
366 | if (IS_ERR(data->hwmon_dev)) { | 362 | if (IS_ERR(data->hwmon_dev)) { |
@@ -372,6 +368,9 @@ static int adm1029_probe(struct i2c_client *client, | |||
372 | 368 | ||
373 | exit_remove_files: | 369 | exit_remove_files: |
374 | sysfs_remove_group(&client->dev.kobj, &adm1029_group); | 370 | sysfs_remove_group(&client->dev.kobj, &adm1029_group); |
371 | exit_free: | ||
372 | kfree(data); | ||
373 | exit: | ||
375 | return err; | 374 | return err; |
376 | } | 375 | } |
377 | 376 | ||
@@ -399,12 +398,13 @@ static int adm1029_remove(struct i2c_client *client) | |||
399 | hwmon_device_unregister(data->hwmon_dev); | 398 | hwmon_device_unregister(data->hwmon_dev); |
400 | sysfs_remove_group(&client->dev.kobj, &adm1029_group); | 399 | sysfs_remove_group(&client->dev.kobj, &adm1029_group); |
401 | 400 | ||
401 | kfree(data); | ||
402 | return 0; | 402 | return 0; |
403 | } | 403 | } |
404 | 404 | ||
405 | /* | 405 | /* |
406 | * function that update the status of the chips (temperature for example) | 406 | function that update the status of the chips (temperature for example) |
407 | */ | 407 | */ |
408 | static struct adm1029_data *adm1029_update_device(struct device *dev) | 408 | static struct adm1029_data *adm1029_update_device(struct device *dev) |
409 | { | 409 | { |
410 | struct i2c_client *client = to_i2c_client(dev); | 410 | struct i2c_client *client = to_i2c_client(dev); |
@@ -446,8 +446,24 @@ static struct adm1029_data *adm1029_update_device(struct device *dev) | |||
446 | return data; | 446 | return data; |
447 | } | 447 | } |
448 | 448 | ||
449 | module_i2c_driver(adm1029_driver); | 449 | /* |
450 | Common module stuff | ||
451 | */ | ||
452 | static int __init sensors_adm1029_init(void) | ||
453 | { | ||
454 | |||
455 | return i2c_add_driver(&adm1029_driver); | ||
456 | } | ||
457 | |||
458 | static void __exit sensors_adm1029_exit(void) | ||
459 | { | ||
460 | |||
461 | i2c_del_driver(&adm1029_driver); | ||
462 | } | ||
450 | 463 | ||
451 | MODULE_AUTHOR("Corentin LABBE <corentin.labbe@geomatys.fr>"); | 464 | MODULE_AUTHOR("Corentin LABBE <corentin.labbe@geomatys.fr>"); |
452 | MODULE_DESCRIPTION("adm1029 driver"); | 465 | MODULE_DESCRIPTION("adm1029 driver"); |
453 | MODULE_LICENSE("GPL v2"); | 466 | MODULE_LICENSE("GPL v2"); |
467 | |||
468 | module_init(sensors_adm1029_init); | ||
469 | module_exit(sensors_adm1029_exit); | ||