aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/adm1029.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/hwmon/adm1029.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/hwmon/adm1029.c')
-rw-r--r--drivers/hwmon/adm1029.c68
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() */
84static const u8 ADM1029_REG_TEMP[] = { 84static 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 240Access 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*/
246static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 243static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
247static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); 244static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
248static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); 245static 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) 406function that update the status of the chips (temperature for example)
407 */ 407*/
408static struct adm1029_data *adm1029_update_device(struct device *dev) 408static 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
449module_i2c_driver(adm1029_driver); 449/*
450 Common module stuff
451*/
452static int __init sensors_adm1029_init(void)
453{
454
455 return i2c_add_driver(&adm1029_driver);
456}
457
458static void __exit sensors_adm1029_exit(void)
459{
460
461 i2c_del_driver(&adm1029_driver);
462}
450 463
451MODULE_AUTHOR("Corentin LABBE <corentin.labbe@geomatys.fr>"); 464MODULE_AUTHOR("Corentin LABBE <corentin.labbe@geomatys.fr>");
452MODULE_DESCRIPTION("adm1029 driver"); 465MODULE_DESCRIPTION("adm1029 driver");
453MODULE_LICENSE("GPL v2"); 466MODULE_LICENSE("GPL v2");
467
468module_init(sensors_adm1029_init);
469module_exit(sensors_adm1029_exit);