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/max1619.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/hwmon/max1619.c')
-rw-r--r-- | drivers/hwmon/max1619.c | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/drivers/hwmon/max1619.c b/drivers/hwmon/max1619.c index 445e5d40ac8..022ded09810 100644 --- a/drivers/hwmon/max1619.c +++ b/drivers/hwmon/max1619.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * max1619.c - Part of lm_sensors, Linux kernel modules for hardware | 2 | * max1619.c - Part of lm_sensors, Linux kernel modules for hardware |
3 | * monitoring | 3 | * monitoring |
4 | * Copyright (C) 2003-2004 Oleksij Rempel <bug-track@fisher-privat.net> | 4 | * Copyright (C) 2003-2004 Alexey Fisher <fishor@mail.ru> |
5 | * Jean Delvare <khali@linux-fr.org> | 5 | * Jean Delvare <khali@linux-fr.org> |
6 | * | 6 | * |
7 | * Based on the lm90 driver. The MAX1619 is a sensor chip made by Maxim. | 7 | * Based on the lm90 driver. The MAX1619 is a sensor chip made by Maxim. |
@@ -125,7 +125,7 @@ struct max1619_data { | |||
125 | u8 temp_input2, temp_low2, temp_high2; /* remote */ | 125 | u8 temp_input2, temp_low2, temp_high2; /* remote */ |
126 | u8 temp_crit2; | 126 | u8 temp_crit2; |
127 | u8 temp_hyst2; | 127 | u8 temp_hyst2; |
128 | u8 alarms; | 128 | u8 alarms; |
129 | }; | 129 | }; |
130 | 130 | ||
131 | /* | 131 | /* |
@@ -133,8 +133,7 @@ struct max1619_data { | |||
133 | */ | 133 | */ |
134 | 134 | ||
135 | #define show_temp(value) \ | 135 | #define show_temp(value) \ |
136 | static ssize_t show_##value(struct device *dev, struct device_attribute *attr, \ | 136 | static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ |
137 | char *buf) \ | ||
138 | { \ | 137 | { \ |
139 | struct max1619_data *data = max1619_update_device(dev); \ | 138 | struct max1619_data *data = max1619_update_device(dev); \ |
140 | return sprintf(buf, "%d\n", temp_from_reg(data->value)); \ | 139 | return sprintf(buf, "%d\n", temp_from_reg(data->value)); \ |
@@ -147,17 +146,13 @@ show_temp(temp_crit2); | |||
147 | show_temp(temp_hyst2); | 146 | show_temp(temp_hyst2); |
148 | 147 | ||
149 | #define set_temp2(value, reg) \ | 148 | #define set_temp2(value, reg) \ |
150 | static ssize_t set_##value(struct device *dev, struct device_attribute *attr, \ | 149 | static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, \ |
151 | const char *buf, \ | ||
152 | size_t count) \ | 150 | size_t count) \ |
153 | { \ | 151 | { \ |
154 | struct i2c_client *client = to_i2c_client(dev); \ | 152 | struct i2c_client *client = to_i2c_client(dev); \ |
155 | struct max1619_data *data = i2c_get_clientdata(client); \ | 153 | struct max1619_data *data = i2c_get_clientdata(client); \ |
156 | long val; \ | 154 | long val = simple_strtol(buf, NULL, 10); \ |
157 | int err = kstrtol(buf, 10, &val); \ | 155 | \ |
158 | if (err) \ | ||
159 | return err; \ | ||
160 | \ | ||
161 | mutex_lock(&data->update_lock); \ | 156 | mutex_lock(&data->update_lock); \ |
162 | data->value = temp_to_reg(val); \ | 157 | data->value = temp_to_reg(val); \ |
163 | i2c_smbus_write_byte_data(client, reg, data->value); \ | 158 | i2c_smbus_write_byte_data(client, reg, data->value); \ |
@@ -170,8 +165,7 @@ set_temp2(temp_high2, MAX1619_REG_W_REMOTE_HIGH); | |||
170 | set_temp2(temp_crit2, MAX1619_REG_W_REMOTE_CRIT); | 165 | set_temp2(temp_crit2, MAX1619_REG_W_REMOTE_CRIT); |
171 | set_temp2(temp_hyst2, MAX1619_REG_W_TCRIT_HYST); | 166 | set_temp2(temp_hyst2, MAX1619_REG_W_TCRIT_HYST); |
172 | 167 | ||
173 | static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, | 168 | static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf) |
174 | char *buf) | ||
175 | { | 169 | { |
176 | struct max1619_data *data = max1619_update_device(dev); | 170 | struct max1619_data *data = max1619_update_device(dev); |
177 | return sprintf(buf, "%d\n", data->alarms); | 171 | return sprintf(buf, "%d\n", data->alarms); |
@@ -267,10 +261,11 @@ static int max1619_probe(struct i2c_client *new_client, | |||
267 | struct max1619_data *data; | 261 | struct max1619_data *data; |
268 | int err; | 262 | int err; |
269 | 263 | ||
270 | data = devm_kzalloc(&new_client->dev, sizeof(struct max1619_data), | 264 | data = kzalloc(sizeof(struct max1619_data), GFP_KERNEL); |
271 | GFP_KERNEL); | 265 | if (!data) { |
272 | if (!data) | 266 | err = -ENOMEM; |
273 | return -ENOMEM; | 267 | goto exit; |
268 | } | ||
274 | 269 | ||
275 | i2c_set_clientdata(new_client, data); | 270 | i2c_set_clientdata(new_client, data); |
276 | data->valid = 0; | 271 | data->valid = 0; |
@@ -280,9 +275,8 @@ static int max1619_probe(struct i2c_client *new_client, | |||
280 | max1619_init_client(new_client); | 275 | max1619_init_client(new_client); |
281 | 276 | ||
282 | /* Register sysfs hooks */ | 277 | /* Register sysfs hooks */ |
283 | err = sysfs_create_group(&new_client->dev.kobj, &max1619_group); | 278 | if ((err = sysfs_create_group(&new_client->dev.kobj, &max1619_group))) |
284 | if (err) | 279 | goto exit_free; |
285 | return err; | ||
286 | 280 | ||
287 | data->hwmon_dev = hwmon_device_register(&new_client->dev); | 281 | data->hwmon_dev = hwmon_device_register(&new_client->dev); |
288 | if (IS_ERR(data->hwmon_dev)) { | 282 | if (IS_ERR(data->hwmon_dev)) { |
@@ -294,6 +288,9 @@ static int max1619_probe(struct i2c_client *new_client, | |||
294 | 288 | ||
295 | exit_remove_files: | 289 | exit_remove_files: |
296 | sysfs_remove_group(&new_client->dev.kobj, &max1619_group); | 290 | sysfs_remove_group(&new_client->dev.kobj, &max1619_group); |
291 | exit_free: | ||
292 | kfree(data); | ||
293 | exit: | ||
297 | return err; | 294 | return err; |
298 | } | 295 | } |
299 | 296 | ||
@@ -319,6 +316,7 @@ static int max1619_remove(struct i2c_client *client) | |||
319 | hwmon_device_unregister(data->hwmon_dev); | 316 | hwmon_device_unregister(data->hwmon_dev); |
320 | sysfs_remove_group(&client->dev.kobj, &max1619_group); | 317 | sysfs_remove_group(&client->dev.kobj, &max1619_group); |
321 | 318 | ||
319 | kfree(data); | ||
322 | return 0; | 320 | return 0; |
323 | } | 321 | } |
324 | 322 | ||
@@ -355,9 +353,20 @@ static struct max1619_data *max1619_update_device(struct device *dev) | |||
355 | return data; | 353 | return data; |
356 | } | 354 | } |
357 | 355 | ||
358 | module_i2c_driver(max1619_driver); | 356 | static int __init sensors_max1619_init(void) |
357 | { | ||
358 | return i2c_add_driver(&max1619_driver); | ||
359 | } | ||
359 | 360 | ||
360 | MODULE_AUTHOR("Oleksij Rempel <bug-track@fisher-privat.net> and " | 361 | static void __exit sensors_max1619_exit(void) |
362 | { | ||
363 | i2c_del_driver(&max1619_driver); | ||
364 | } | ||
365 | |||
366 | MODULE_AUTHOR("Alexey Fisher <fishor@mail.ru> and " | ||
361 | "Jean Delvare <khali@linux-fr.org>"); | 367 | "Jean Delvare <khali@linux-fr.org>"); |
362 | MODULE_DESCRIPTION("MAX1619 sensor driver"); | 368 | MODULE_DESCRIPTION("MAX1619 sensor driver"); |
363 | MODULE_LICENSE("GPL"); | 369 | MODULE_LICENSE("GPL"); |
370 | |||
371 | module_init(sensors_max1619_init); | ||
372 | module_exit(sensors_max1619_exit); | ||