aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/ad7418.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/ad7418.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/hwmon/ad7418.c')
-rw-r--r--drivers/hwmon/ad7418.c69
1 files changed, 45 insertions, 24 deletions
diff --git a/drivers/hwmon/ad7418.c b/drivers/hwmon/ad7418.c
index 57d4a629567..ffc781fec18 100644
--- a/drivers/hwmon/ad7418.c
+++ b/drivers/hwmon/ad7418.c
@@ -76,6 +76,20 @@ static struct i2c_driver ad7418_driver = {
76 .id_table = ad7418_id, 76 .id_table = ad7418_id,
77}; 77};
78 78
79/* All registers are word-sized, except for the configuration registers.
80 * AD7418 uses a high-byte first convention. Do NOT use those functions to
81 * access the configuration registers CONF and CONF2, as they are byte-sized.
82 */
83static inline int ad7418_read(struct i2c_client *client, u8 reg)
84{
85 return swab16(i2c_smbus_read_word_data(client, reg));
86}
87
88static inline int ad7418_write(struct i2c_client *client, u8 reg, u16 value)
89{
90 return i2c_smbus_write_word_data(client, reg, swab16(value));
91}
92
79static void ad7418_init_client(struct i2c_client *client) 93static void ad7418_init_client(struct i2c_client *client)
80{ 94{
81 struct ad7418_data *data = i2c_get_clientdata(client); 95 struct ad7418_data *data = i2c_get_clientdata(client);
@@ -114,9 +128,7 @@ static struct ad7418_data *ad7418_update_device(struct device *dev)
114 udelay(30); 128 udelay(30);
115 129
116 for (i = 0; i < 3; i++) { 130 for (i = 0; i < 3; i++) {
117 data->temp[i] = 131 data->temp[i] = ad7418_read(client, AD7418_REG_TEMP[i]);
118 i2c_smbus_read_word_swapped(client,
119 AD7418_REG_TEMP[i]);
120 } 132 }
121 133
122 for (i = 0, ch = 4; i < data->adc_max; i++, ch--) { 134 for (i = 0, ch = 4; i < data->adc_max; i++, ch--) {
@@ -126,12 +138,11 @@ static struct ad7418_data *ad7418_update_device(struct device *dev)
126 138
127 udelay(15); 139 udelay(15);
128 data->in[data->adc_max - 1 - i] = 140 data->in[data->adc_max - 1 - i] =
129 i2c_smbus_read_word_swapped(client, 141 ad7418_read(client, AD7418_REG_ADC);
130 AD7418_REG_ADC);
131 } 142 }
132 143
133 /* restore old configuration value */ 144 /* restore old configuration value */
134 i2c_smbus_write_word_swapped(client, AD7418_REG_CONF, cfg); 145 ad7418_write(client, AD7418_REG_CONF, cfg);
135 146
136 data->last_updated = jiffies; 147 data->last_updated = jiffies;
137 data->valid = 1; 148 data->valid = 1;
@@ -167,17 +178,11 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
167 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 178 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
168 struct i2c_client *client = to_i2c_client(dev); 179 struct i2c_client *client = to_i2c_client(dev);
169 struct ad7418_data *data = i2c_get_clientdata(client); 180 struct ad7418_data *data = i2c_get_clientdata(client);
170 long temp; 181 long temp = simple_strtol(buf, NULL, 10);
171 int ret = kstrtol(buf, 10, &temp);
172
173 if (ret < 0)
174 return ret;
175 182
176 mutex_lock(&data->lock); 183 mutex_lock(&data->lock);
177 data->temp[attr->index] = LM75_TEMP_TO_REG(temp); 184 data->temp[attr->index] = LM75_TEMP_TO_REG(temp);
178 i2c_smbus_write_word_swapped(client, 185 ad7418_write(client, AD7418_REG_TEMP[attr->index], data->temp[attr->index]);
179 AD7418_REG_TEMP[attr->index],
180 data->temp[attr->index]);
181 mutex_unlock(&data->lock); 186 mutex_unlock(&data->lock);
182 return count; 187 return count;
183} 188}
@@ -227,13 +232,15 @@ static int ad7418_probe(struct i2c_client *client,
227 int err; 232 int err;
228 233
229 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | 234 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
230 I2C_FUNC_SMBUS_WORD_DATA)) 235 I2C_FUNC_SMBUS_WORD_DATA)) {
231 return -EOPNOTSUPP; 236 err = -EOPNOTSUPP;
237 goto exit;
238 }
232 239
233 data = devm_kzalloc(&client->dev, sizeof(struct ad7418_data), 240 if (!(data = kzalloc(sizeof(struct ad7418_data), GFP_KERNEL))) {
234 GFP_KERNEL); 241 err = -ENOMEM;
235 if (!data) 242 goto exit;
236 return -ENOMEM; 243 }
237 244
238 i2c_set_clientdata(client, data); 245 i2c_set_clientdata(client, data);
239 246
@@ -263,9 +270,8 @@ static int ad7418_probe(struct i2c_client *client,
263 ad7418_init_client(client); 270 ad7418_init_client(client);
264 271
265 /* Register sysfs hooks */ 272 /* Register sysfs hooks */
266 err = sysfs_create_group(&client->dev.kobj, &data->attrs); 273 if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs)))
267 if (err) 274 goto exit_free;
268 return err;
269 275
270 data->hwmon_dev = hwmon_device_register(&client->dev); 276 data->hwmon_dev = hwmon_device_register(&client->dev);
271 if (IS_ERR(data->hwmon_dev)) { 277 if (IS_ERR(data->hwmon_dev)) {
@@ -277,6 +283,9 @@ static int ad7418_probe(struct i2c_client *client,
277 283
278exit_remove: 284exit_remove:
279 sysfs_remove_group(&client->dev.kobj, &data->attrs); 285 sysfs_remove_group(&client->dev.kobj, &data->attrs);
286exit_free:
287 kfree(data);
288exit:
280 return err; 289 return err;
281} 290}
282 291
@@ -285,12 +294,24 @@ static int ad7418_remove(struct i2c_client *client)
285 struct ad7418_data *data = i2c_get_clientdata(client); 294 struct ad7418_data *data = i2c_get_clientdata(client);
286 hwmon_device_unregister(data->hwmon_dev); 295 hwmon_device_unregister(data->hwmon_dev);
287 sysfs_remove_group(&client->dev.kobj, &data->attrs); 296 sysfs_remove_group(&client->dev.kobj, &data->attrs);
297 kfree(data);
288 return 0; 298 return 0;
289} 299}
290 300
291module_i2c_driver(ad7418_driver); 301static int __init ad7418_init(void)
302{
303 return i2c_add_driver(&ad7418_driver);
304}
305
306static void __exit ad7418_exit(void)
307{
308 i2c_del_driver(&ad7418_driver);
309}
292 310
293MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); 311MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
294MODULE_DESCRIPTION("AD7416/17/18 driver"); 312MODULE_DESCRIPTION("AD7416/17/18 driver");
295MODULE_LICENSE("GPL"); 313MODULE_LICENSE("GPL");
296MODULE_VERSION(DRV_VERSION); 314MODULE_VERSION(DRV_VERSION);
315
316module_init(ad7418_init);
317module_exit(ad7418_exit);