aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/max1619.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/max1619.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/hwmon/max1619.c')
-rw-r--r--drivers/hwmon/max1619.c53
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) \
136static ssize_t show_##value(struct device *dev, struct device_attribute *attr, \ 136static 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);
147show_temp(temp_hyst2); 146show_temp(temp_hyst2);
148 147
149#define set_temp2(value, reg) \ 148#define set_temp2(value, reg) \
150static ssize_t set_##value(struct device *dev, struct device_attribute *attr, \ 149static 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);
170set_temp2(temp_crit2, MAX1619_REG_W_REMOTE_CRIT); 165set_temp2(temp_crit2, MAX1619_REG_W_REMOTE_CRIT);
171set_temp2(temp_hyst2, MAX1619_REG_W_TCRIT_HYST); 166set_temp2(temp_hyst2, MAX1619_REG_W_TCRIT_HYST);
172 167
173static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, 168static 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
295exit_remove_files: 289exit_remove_files:
296 sysfs_remove_group(&new_client->dev.kobj, &max1619_group); 290 sysfs_remove_group(&new_client->dev.kobj, &max1619_group);
291exit_free:
292 kfree(data);
293exit:
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
358module_i2c_driver(max1619_driver); 356static int __init sensors_max1619_init(void)
357{
358 return i2c_add_driver(&max1619_driver);
359}
359 360
360MODULE_AUTHOR("Oleksij Rempel <bug-track@fisher-privat.net> and " 361static void __exit sensors_max1619_exit(void)
362{
363 i2c_del_driver(&max1619_driver);
364}
365
366MODULE_AUTHOR("Alexey Fisher <fishor@mail.ru> and "
361 "Jean Delvare <khali@linux-fr.org>"); 367 "Jean Delvare <khali@linux-fr.org>");
362MODULE_DESCRIPTION("MAX1619 sensor driver"); 368MODULE_DESCRIPTION("MAX1619 sensor driver");
363MODULE_LICENSE("GPL"); 369MODULE_LICENSE("GPL");
370
371module_init(sensors_max1619_init);
372module_exit(sensors_max1619_exit);