xref: /openbmc/linux/drivers/hwmon/max1668.c (revision 615c36f5)
1 /*
2     Copyright (c) 2011 David George <david.george@ska.ac.za>
3 
4     based on adm1021.c
5     some credit to Christoph Scheurer, but largely a rewrite
6 
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11 
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16 
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/jiffies.h>
26 #include <linux/i2c.h>
27 #include <linux/hwmon.h>
28 #include <linux/hwmon-sysfs.h>
29 #include <linux/err.h>
30 #include <linux/mutex.h>
31 
32 /* Addresses to scan */
33 static unsigned short max1668_addr_list[] = {
34 	0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END };
35 
36 /* max1668 registers */
37 
38 #define MAX1668_REG_TEMP(nr)	(nr)
39 #define MAX1668_REG_STAT1	0x05
40 #define MAX1668_REG_STAT2	0x06
41 #define MAX1668_REG_MAN_ID	0xfe
42 #define MAX1668_REG_DEV_ID	0xff
43 
44 /* limits */
45 
46 /* write high limits */
47 #define MAX1668_REG_LIMH_WR(nr)	(0x13 + 2 * (nr))
48 /* write low limits */
49 #define MAX1668_REG_LIML_WR(nr)	(0x14 + 2 * (nr))
50 /* read high limits */
51 #define MAX1668_REG_LIMH_RD(nr)	(0x08 + 2 * (nr))
52 /* read low limits */
53 #define MAX1668_REG_LIML_RD(nr)	(0x09 + 2 * (nr))
54 
55 /* manufacturer and device ID Constants */
56 #define MAN_ID_MAXIM		0x4d
57 #define DEV_ID_MAX1668		0x3
58 #define DEV_ID_MAX1805		0x5
59 #define DEV_ID_MAX1989		0xb
60 
61 /* read only mode module parameter */
62 static int read_only;
63 module_param(read_only, bool, 0);
64 MODULE_PARM_DESC(read_only, "Don't set any values, read only mode");
65 
66 enum chips { max1668, max1805, max1989 };
67 
68 struct max1668_data {
69 	struct device *hwmon_dev;
70 	enum chips type;
71 
72 	struct mutex update_lock;
73 	char valid;		/* !=0 if following fields are valid */
74 	unsigned long last_updated;	/* In jiffies */
75 
76 	/* 1x local and 4x remote */
77 	s8 temp_max[5];
78 	s8 temp_min[5];
79 	s8 temp[5];
80 	u16 alarms;
81 };
82 
83 static struct max1668_data *max1668_update_device(struct device *dev)
84 {
85 	struct i2c_client *client = to_i2c_client(dev);
86 	struct max1668_data *data = i2c_get_clientdata(client);
87 	struct max1668_data *ret = data;
88 	s32 val;
89 	int i;
90 
91 	mutex_lock(&data->update_lock);
92 
93 	if (data->valid && !time_after(jiffies,
94 			data->last_updated + HZ + HZ / 2))
95 		goto abort;
96 
97 	for (i = 0; i < 5; i++) {
98 		val = i2c_smbus_read_byte_data(client, MAX1668_REG_TEMP(i));
99 		if (unlikely(val < 0)) {
100 			ret = ERR_PTR(val);
101 			goto abort;
102 		}
103 		data->temp[i] = (s8) val;
104 
105 		val = i2c_smbus_read_byte_data(client, MAX1668_REG_LIMH_RD(i));
106 		if (unlikely(val < 0)) {
107 			ret = ERR_PTR(val);
108 			goto abort;
109 		}
110 		data->temp_max[i] = (s8) val;
111 
112 		val = i2c_smbus_read_byte_data(client, MAX1668_REG_LIML_RD(i));
113 		if (unlikely(val < 0)) {
114 			ret = ERR_PTR(val);
115 			goto abort;
116 		}
117 		data->temp_min[i] = (s8) val;
118 	}
119 
120 	val = i2c_smbus_read_byte_data(client, MAX1668_REG_STAT1);
121 	if (unlikely(val < 0)) {
122 		ret = ERR_PTR(val);
123 		goto abort;
124 	}
125 	data->alarms = val << 8;
126 
127 	val = i2c_smbus_read_byte_data(client, MAX1668_REG_STAT2);
128 	if (unlikely(val < 0)) {
129 		ret = ERR_PTR(val);
130 		goto abort;
131 	}
132 	data->alarms |= val;
133 
134 	data->last_updated = jiffies;
135 	data->valid = 1;
136 abort:
137 	mutex_unlock(&data->update_lock);
138 
139 	return ret;
140 }
141 
142 static ssize_t show_temp(struct device *dev,
143 			 struct device_attribute *devattr, char *buf)
144 {
145 	int index = to_sensor_dev_attr(devattr)->index;
146 	struct max1668_data *data = max1668_update_device(dev);
147 
148 	if (IS_ERR(data))
149 		return PTR_ERR(data);
150 
151 	return sprintf(buf, "%d\n", data->temp[index] * 1000);
152 }
153 
154 static ssize_t show_temp_max(struct device *dev,
155 			     struct device_attribute *devattr, char *buf)
156 {
157 	int index = to_sensor_dev_attr(devattr)->index;
158 	struct max1668_data *data = max1668_update_device(dev);
159 
160 	if (IS_ERR(data))
161 		return PTR_ERR(data);
162 
163 	return sprintf(buf, "%d\n", data->temp_max[index] * 1000);
164 }
165 
166 static ssize_t show_temp_min(struct device *dev,
167 			     struct device_attribute *devattr, char *buf)
168 {
169 	int index = to_sensor_dev_attr(devattr)->index;
170 	struct max1668_data *data = max1668_update_device(dev);
171 
172 	if (IS_ERR(data))
173 		return PTR_ERR(data);
174 
175 	return sprintf(buf, "%d\n", data->temp_min[index] * 1000);
176 }
177 
178 static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
179 			  char *buf)
180 {
181 	int index = to_sensor_dev_attr(attr)->index;
182 	struct max1668_data *data = max1668_update_device(dev);
183 
184 	if (IS_ERR(data))
185 		return PTR_ERR(data);
186 
187 	return sprintf(buf, "%u\n", (data->alarms >> index) & 0x1);
188 }
189 
190 static ssize_t show_fault(struct device *dev,
191 			  struct device_attribute *devattr, char *buf)
192 {
193 	int index = to_sensor_dev_attr(devattr)->index;
194 	struct max1668_data *data = max1668_update_device(dev);
195 
196 	if (IS_ERR(data))
197 		return PTR_ERR(data);
198 
199 	return sprintf(buf, "%u\n",
200 		       (data->alarms & (1 << 12)) && data->temp[index] == 127);
201 }
202 
203 static ssize_t set_temp_max(struct device *dev,
204 			    struct device_attribute *devattr,
205 			    const char *buf, size_t count)
206 {
207 	int index = to_sensor_dev_attr(devattr)->index;
208 	struct i2c_client *client = to_i2c_client(dev);
209 	struct max1668_data *data = i2c_get_clientdata(client);
210 	long temp;
211 	int ret;
212 
213 	ret = kstrtol(buf, 10, &temp);
214 	if (ret < 0)
215 		return ret;
216 
217 	mutex_lock(&data->update_lock);
218 	data->temp_max[index] = SENSORS_LIMIT(temp/1000, -128, 127);
219 	if (i2c_smbus_write_byte_data(client,
220 					MAX1668_REG_LIMH_WR(index),
221 					data->temp_max[index]))
222 		count = -EIO;
223 	mutex_unlock(&data->update_lock);
224 
225 	return count;
226 }
227 
228 static ssize_t set_temp_min(struct device *dev,
229 			    struct device_attribute *devattr,
230 			    const char *buf, size_t count)
231 {
232 	int index = to_sensor_dev_attr(devattr)->index;
233 	struct i2c_client *client = to_i2c_client(dev);
234 	struct max1668_data *data = i2c_get_clientdata(client);
235 	long temp;
236 	int ret;
237 
238 	ret = kstrtol(buf, 10, &temp);
239 	if (ret < 0)
240 		return ret;
241 
242 	mutex_lock(&data->update_lock);
243 	data->temp_min[index] = SENSORS_LIMIT(temp/1000, -128, 127);
244 	if (i2c_smbus_write_byte_data(client,
245 					MAX1668_REG_LIML_WR(index),
246 					data->temp_max[index]))
247 		count = -EIO;
248 	mutex_unlock(&data->update_lock);
249 
250 	return count;
251 }
252 
253 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
254 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_max,
255 				set_temp_max, 0);
256 static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO, show_temp_min,
257 				set_temp_min, 0);
258 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
259 static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO, show_temp_max,
260 				set_temp_max, 1);
261 static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO, show_temp_min,
262 				set_temp_min, 1);
263 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
264 static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO, show_temp_max,
265 				set_temp_max, 2);
266 static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO, show_temp_min,
267 				set_temp_min, 2);
268 static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3);
269 static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO, show_temp_max,
270 				set_temp_max, 3);
271 static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO, show_temp_min,
272 				set_temp_min, 3);
273 static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4);
274 static SENSOR_DEVICE_ATTR(temp5_max, S_IRUGO, show_temp_max,
275 				set_temp_max, 4);
276 static SENSOR_DEVICE_ATTR(temp5_min, S_IRUGO, show_temp_min,
277 				set_temp_min, 4);
278 
279 static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 14);
280 static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 13);
281 static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 7);
282 static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 6);
283 static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_alarm, NULL, 5);
284 static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_alarm, NULL, 4);
285 static SENSOR_DEVICE_ATTR(temp4_min_alarm, S_IRUGO, show_alarm, NULL, 3);
286 static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO, show_alarm, NULL, 2);
287 static SENSOR_DEVICE_ATTR(temp5_min_alarm, S_IRUGO, show_alarm, NULL, 1);
288 static SENSOR_DEVICE_ATTR(temp5_max_alarm, S_IRUGO, show_alarm, NULL, 0);
289 
290 static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_fault, NULL, 1);
291 static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_fault, NULL, 2);
292 static SENSOR_DEVICE_ATTR(temp4_fault, S_IRUGO, show_fault, NULL, 3);
293 static SENSOR_DEVICE_ATTR(temp5_fault, S_IRUGO, show_fault, NULL, 4);
294 
295 /* Attributes common to MAX1668, MAX1989 and MAX1805 */
296 static struct attribute *max1668_attribute_common[] = {
297 	&sensor_dev_attr_temp1_max.dev_attr.attr,
298 	&sensor_dev_attr_temp1_min.dev_attr.attr,
299 	&sensor_dev_attr_temp1_input.dev_attr.attr,
300 	&sensor_dev_attr_temp2_max.dev_attr.attr,
301 	&sensor_dev_attr_temp2_min.dev_attr.attr,
302 	&sensor_dev_attr_temp2_input.dev_attr.attr,
303 	&sensor_dev_attr_temp3_max.dev_attr.attr,
304 	&sensor_dev_attr_temp3_min.dev_attr.attr,
305 	&sensor_dev_attr_temp3_input.dev_attr.attr,
306 
307 	&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
308 	&sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
309 	&sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
310 	&sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
311 	&sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
312 	&sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
313 
314 	&sensor_dev_attr_temp2_fault.dev_attr.attr,
315 	&sensor_dev_attr_temp3_fault.dev_attr.attr,
316 	NULL
317 };
318 
319 /* Attributes not present on MAX1805 */
320 static struct attribute *max1668_attribute_unique[] = {
321 	&sensor_dev_attr_temp4_max.dev_attr.attr,
322 	&sensor_dev_attr_temp4_min.dev_attr.attr,
323 	&sensor_dev_attr_temp4_input.dev_attr.attr,
324 	&sensor_dev_attr_temp5_max.dev_attr.attr,
325 	&sensor_dev_attr_temp5_min.dev_attr.attr,
326 	&sensor_dev_attr_temp5_input.dev_attr.attr,
327 
328 	&sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
329 	&sensor_dev_attr_temp4_min_alarm.dev_attr.attr,
330 	&sensor_dev_attr_temp5_max_alarm.dev_attr.attr,
331 	&sensor_dev_attr_temp5_min_alarm.dev_attr.attr,
332 
333 	&sensor_dev_attr_temp4_fault.dev_attr.attr,
334 	&sensor_dev_attr_temp5_fault.dev_attr.attr,
335 	NULL
336 };
337 
338 static mode_t max1668_attribute_mode(struct kobject *kobj,
339 				     struct attribute *attr, int index)
340 {
341 	int ret = S_IRUGO;
342 	if (read_only)
343 		return ret;
344 	if (attr == &sensor_dev_attr_temp1_max.dev_attr.attr ||
345 	    attr == &sensor_dev_attr_temp2_max.dev_attr.attr ||
346 	    attr == &sensor_dev_attr_temp3_max.dev_attr.attr ||
347 	    attr == &sensor_dev_attr_temp4_max.dev_attr.attr ||
348 	    attr == &sensor_dev_attr_temp5_max.dev_attr.attr ||
349 	    attr == &sensor_dev_attr_temp1_min.dev_attr.attr ||
350 	    attr == &sensor_dev_attr_temp2_min.dev_attr.attr ||
351 	    attr == &sensor_dev_attr_temp3_min.dev_attr.attr ||
352 	    attr == &sensor_dev_attr_temp4_min.dev_attr.attr ||
353 	    attr == &sensor_dev_attr_temp5_min.dev_attr.attr)
354 		ret |= S_IWUSR;
355 	return ret;
356 }
357 
358 static const struct attribute_group max1668_group_common = {
359 	.attrs = max1668_attribute_common,
360 	.is_visible = max1668_attribute_mode
361 };
362 
363 static const struct attribute_group max1668_group_unique = {
364 	.attrs = max1668_attribute_unique,
365 	.is_visible = max1668_attribute_mode
366 };
367 
368 /* Return 0 if detection is successful, -ENODEV otherwise */
369 static int max1668_detect(struct i2c_client *client,
370 			  struct i2c_board_info *info)
371 {
372 	struct i2c_adapter *adapter = client->adapter;
373 	const char *type_name;
374 	int man_id, dev_id;
375 
376 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
377 		return -ENODEV;
378 
379 	/* Check for unsupported part */
380 	man_id = i2c_smbus_read_byte_data(client, MAX1668_REG_MAN_ID);
381 	if (man_id != MAN_ID_MAXIM)
382 		return -ENODEV;
383 
384 	dev_id = i2c_smbus_read_byte_data(client, MAX1668_REG_DEV_ID);
385 	if (dev_id < 0)
386 		return -ENODEV;
387 
388 	type_name = NULL;
389 	if (dev_id == DEV_ID_MAX1668)
390 		type_name = "max1668";
391 	else if (dev_id == DEV_ID_MAX1805)
392 		type_name = "max1805";
393 	else if (dev_id == DEV_ID_MAX1989)
394 		type_name = "max1989";
395 
396 	if (!type_name)
397 		return -ENODEV;
398 
399 	strlcpy(info->type, type_name, I2C_NAME_SIZE);
400 
401 	return 0;
402 }
403 
404 static int max1668_probe(struct i2c_client *client,
405 			 const struct i2c_device_id *id)
406 {
407 	struct i2c_adapter *adapter = client->adapter;
408 	struct max1668_data *data;
409 	int err;
410 
411 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
412 		return -ENODEV;
413 
414 	data = kzalloc(sizeof(struct max1668_data), GFP_KERNEL);
415 	if (!data)
416 		return -ENOMEM;
417 
418 	i2c_set_clientdata(client, data);
419 	data->type = id->driver_data;
420 	mutex_init(&data->update_lock);
421 
422 	/* Register sysfs hooks */
423 	err = sysfs_create_group(&client->dev.kobj, &max1668_group_common);
424 	if (err)
425 		goto error_free;
426 
427 	if (data->type == max1668 || data->type == max1989) {
428 		err = sysfs_create_group(&client->dev.kobj,
429 					 &max1668_group_unique);
430 		if (err)
431 			goto error_sysrem0;
432 	}
433 
434 	data->hwmon_dev = hwmon_device_register(&client->dev);
435 	if (IS_ERR(data->hwmon_dev)) {
436 		err = PTR_ERR(data->hwmon_dev);
437 		goto error_sysrem1;
438 	}
439 
440 	return 0;
441 
442 error_sysrem1:
443 	if (data->type == max1668 || data->type == max1989)
444 		sysfs_remove_group(&client->dev.kobj, &max1668_group_unique);
445 error_sysrem0:
446 	sysfs_remove_group(&client->dev.kobj, &max1668_group_common);
447 error_free:
448 	kfree(data);
449 	return err;
450 }
451 
452 static int max1668_remove(struct i2c_client *client)
453 {
454 	struct max1668_data *data = i2c_get_clientdata(client);
455 
456 	hwmon_device_unregister(data->hwmon_dev);
457 	if (data->type == max1668 || data->type == max1989)
458 		sysfs_remove_group(&client->dev.kobj, &max1668_group_unique);
459 
460 	sysfs_remove_group(&client->dev.kobj, &max1668_group_common);
461 
462 	kfree(data);
463 	return 0;
464 }
465 
466 static const struct i2c_device_id max1668_id[] = {
467 	{ "max1668", max1668 },
468 	{ "max1805", max1805 },
469 	{ "max1989", max1989 },
470 	{ }
471 };
472 MODULE_DEVICE_TABLE(i2c, max1668_id);
473 
474 /* This is the driver that will be inserted */
475 static struct i2c_driver max1668_driver = {
476 	.class = I2C_CLASS_HWMON,
477 	.driver = {
478 		  .name	= "max1668",
479 		  },
480 	.probe = max1668_probe,
481 	.remove	= max1668_remove,
482 	.id_table = max1668_id,
483 	.detect	= max1668_detect,
484 	.address_list = max1668_addr_list,
485 };
486 
487 static int __init sensors_max1668_init(void)
488 {
489 	return i2c_add_driver(&max1668_driver);
490 }
491 
492 static void __exit sensors_max1668_exit(void)
493 {
494 	i2c_del_driver(&max1668_driver);
495 }
496 
497 MODULE_AUTHOR("David George <david.george@ska.ac.za>");
498 MODULE_DESCRIPTION("MAX1668 remote temperature sensor driver");
499 MODULE_LICENSE("GPL");
500 
501 module_init(sensors_max1668_init)
502 module_exit(sensors_max1668_exit)
503