xref: /openbmc/linux/drivers/hwmon/emc1403.c (revision e3d786a3)
1 /*
2  * emc1403.c - SMSC Thermal Driver
3  *
4  * Copyright (C) 2008 Intel Corp
5  *
6  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; version 2 of the License.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
20  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21  */
22 
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/slab.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/sysfs.h>
31 #include <linux/mutex.h>
32 #include <linux/regmap.h>
33 
34 #define THERMAL_PID_REG		0xfd
35 #define THERMAL_SMSC_ID_REG	0xfe
36 #define THERMAL_REVISION_REG	0xff
37 
38 enum emc1403_chip { emc1402, emc1403, emc1404 };
39 
40 struct thermal_data {
41 	struct regmap *regmap;
42 	struct mutex mutex;
43 	const struct attribute_group *groups[4];
44 };
45 
46 static ssize_t show_temp(struct device *dev,
47 			struct device_attribute *attr, char *buf)
48 {
49 	struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
50 	struct thermal_data *data = dev_get_drvdata(dev);
51 	unsigned int val;
52 	int retval;
53 
54 	retval = regmap_read(data->regmap, sda->index, &val);
55 	if (retval < 0)
56 		return retval;
57 	return sprintf(buf, "%d000\n", val);
58 }
59 
60 static ssize_t show_bit(struct device *dev,
61 			struct device_attribute *attr, char *buf)
62 {
63 	struct sensor_device_attribute_2 *sda = to_sensor_dev_attr_2(attr);
64 	struct thermal_data *data = dev_get_drvdata(dev);
65 	unsigned int val;
66 	int retval;
67 
68 	retval = regmap_read(data->regmap, sda->nr, &val);
69 	if (retval < 0)
70 		return retval;
71 	return sprintf(buf, "%d\n", !!(val & sda->index));
72 }
73 
74 static ssize_t store_temp(struct device *dev,
75 		struct device_attribute *attr, const char *buf, size_t count)
76 {
77 	struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
78 	struct thermal_data *data = dev_get_drvdata(dev);
79 	unsigned long val;
80 	int retval;
81 
82 	if (kstrtoul(buf, 10, &val))
83 		return -EINVAL;
84 	retval = regmap_write(data->regmap, sda->index,
85 			      DIV_ROUND_CLOSEST(val, 1000));
86 	if (retval < 0)
87 		return retval;
88 	return count;
89 }
90 
91 static ssize_t store_bit(struct device *dev,
92 		struct device_attribute *attr, const char *buf, size_t count)
93 {
94 	struct sensor_device_attribute_2 *sda = to_sensor_dev_attr_2(attr);
95 	struct thermal_data *data = dev_get_drvdata(dev);
96 	unsigned long val;
97 	int retval;
98 
99 	if (kstrtoul(buf, 10, &val))
100 		return -EINVAL;
101 
102 	retval = regmap_update_bits(data->regmap, sda->nr, sda->index,
103 				    val ? sda->index : 0);
104 	if (retval < 0)
105 		return retval;
106 	return count;
107 }
108 
109 static ssize_t show_hyst_common(struct device *dev,
110 				struct device_attribute *attr, char *buf,
111 				bool is_min)
112 {
113 	struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
114 	struct thermal_data *data = dev_get_drvdata(dev);
115 	struct regmap *regmap = data->regmap;
116 	unsigned int limit;
117 	unsigned int hyst;
118 	int retval;
119 
120 	retval = regmap_read(regmap, sda->index, &limit);
121 	if (retval < 0)
122 		return retval;
123 
124 	retval = regmap_read(regmap, 0x21, &hyst);
125 	if (retval < 0)
126 		return retval;
127 
128 	return sprintf(buf, "%d000\n", is_min ? limit + hyst : limit - hyst);
129 }
130 
131 static ssize_t show_hyst(struct device *dev,
132 			 struct device_attribute *attr, char *buf)
133 {
134 	return show_hyst_common(dev, attr, buf, false);
135 }
136 
137 static ssize_t show_min_hyst(struct device *dev,
138 			     struct device_attribute *attr, char *buf)
139 {
140 	return show_hyst_common(dev, attr, buf, true);
141 }
142 
143 static ssize_t store_hyst(struct device *dev,
144 		struct device_attribute *attr, const char *buf, size_t count)
145 {
146 	struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
147 	struct thermal_data *data = dev_get_drvdata(dev);
148 	struct regmap *regmap = data->regmap;
149 	unsigned int limit;
150 	int retval;
151 	int hyst;
152 	unsigned long val;
153 
154 	if (kstrtoul(buf, 10, &val))
155 		return -EINVAL;
156 
157 	mutex_lock(&data->mutex);
158 	retval = regmap_read(regmap, sda->index, &limit);
159 	if (retval < 0)
160 		goto fail;
161 
162 	hyst = limit * 1000 - val;
163 	hyst = clamp_val(DIV_ROUND_CLOSEST(hyst, 1000), 0, 255);
164 	retval = regmap_write(regmap, 0x21, hyst);
165 	if (retval == 0)
166 		retval = count;
167 fail:
168 	mutex_unlock(&data->mutex);
169 	return retval;
170 }
171 
172 /*
173  *	Sensors. We pass the actual i2c register to the methods.
174  */
175 
176 static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO | S_IWUSR,
177 	show_temp, store_temp, 0x06);
178 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
179 	show_temp, store_temp, 0x05);
180 static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO | S_IWUSR,
181 	show_temp, store_temp, 0x20);
182 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0x00);
183 static SENSOR_DEVICE_ATTR_2(temp1_min_alarm, S_IRUGO,
184 	show_bit, NULL, 0x36, 0x01);
185 static SENSOR_DEVICE_ATTR_2(temp1_max_alarm, S_IRUGO,
186 	show_bit, NULL, 0x35, 0x01);
187 static SENSOR_DEVICE_ATTR_2(temp1_crit_alarm, S_IRUGO,
188 	show_bit, NULL, 0x37, 0x01);
189 static SENSOR_DEVICE_ATTR(temp1_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x06);
190 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_hyst, NULL, 0x05);
191 static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO | S_IWUSR,
192 	show_hyst, store_hyst, 0x20);
193 
194 static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO | S_IWUSR,
195 	show_temp, store_temp, 0x08);
196 static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
197 	show_temp, store_temp, 0x07);
198 static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO | S_IWUSR,
199 	show_temp, store_temp, 0x19);
200 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0x01);
201 static SENSOR_DEVICE_ATTR_2(temp2_fault, S_IRUGO, show_bit, NULL, 0x1b, 0x02);
202 static SENSOR_DEVICE_ATTR_2(temp2_min_alarm, S_IRUGO,
203 	show_bit, NULL, 0x36, 0x02);
204 static SENSOR_DEVICE_ATTR_2(temp2_max_alarm, S_IRUGO,
205 	show_bit, NULL, 0x35, 0x02);
206 static SENSOR_DEVICE_ATTR_2(temp2_crit_alarm, S_IRUGO,
207 	show_bit, NULL, 0x37, 0x02);
208 static SENSOR_DEVICE_ATTR(temp2_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x08);
209 static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO, show_hyst, NULL, 0x07);
210 static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_hyst, NULL, 0x19);
211 
212 static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO | S_IWUSR,
213 	show_temp, store_temp, 0x16);
214 static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR,
215 	show_temp, store_temp, 0x15);
216 static SENSOR_DEVICE_ATTR(temp3_crit, S_IRUGO | S_IWUSR,
217 	show_temp, store_temp, 0x1A);
218 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 0x23);
219 static SENSOR_DEVICE_ATTR_2(temp3_fault, S_IRUGO, show_bit, NULL, 0x1b, 0x04);
220 static SENSOR_DEVICE_ATTR_2(temp3_min_alarm, S_IRUGO,
221 	show_bit, NULL, 0x36, 0x04);
222 static SENSOR_DEVICE_ATTR_2(temp3_max_alarm, S_IRUGO,
223 	show_bit, NULL, 0x35, 0x04);
224 static SENSOR_DEVICE_ATTR_2(temp3_crit_alarm, S_IRUGO,
225 	show_bit, NULL, 0x37, 0x04);
226 static SENSOR_DEVICE_ATTR(temp3_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x16);
227 static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO, show_hyst, NULL, 0x15);
228 static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, show_hyst, NULL, 0x1A);
229 
230 static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO | S_IWUSR,
231 	show_temp, store_temp, 0x2D);
232 static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO | S_IWUSR,
233 	show_temp, store_temp, 0x2C);
234 static SENSOR_DEVICE_ATTR(temp4_crit, S_IRUGO | S_IWUSR,
235 	show_temp, store_temp, 0x30);
236 static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 0x2A);
237 static SENSOR_DEVICE_ATTR_2(temp4_fault, S_IRUGO, show_bit, NULL, 0x1b, 0x08);
238 static SENSOR_DEVICE_ATTR_2(temp4_min_alarm, S_IRUGO,
239 	show_bit, NULL, 0x36, 0x08);
240 static SENSOR_DEVICE_ATTR_2(temp4_max_alarm, S_IRUGO,
241 	show_bit, NULL, 0x35, 0x08);
242 static SENSOR_DEVICE_ATTR_2(temp4_crit_alarm, S_IRUGO,
243 	show_bit, NULL, 0x37, 0x08);
244 static SENSOR_DEVICE_ATTR(temp4_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x2D);
245 static SENSOR_DEVICE_ATTR(temp4_max_hyst, S_IRUGO, show_hyst, NULL, 0x2C);
246 static SENSOR_DEVICE_ATTR(temp4_crit_hyst, S_IRUGO, show_hyst, NULL, 0x30);
247 
248 static SENSOR_DEVICE_ATTR_2(power_state, S_IRUGO | S_IWUSR,
249 	show_bit, store_bit, 0x03, 0x40);
250 
251 static struct attribute *emc1402_attrs[] = {
252 	&sensor_dev_attr_temp1_min.dev_attr.attr,
253 	&sensor_dev_attr_temp1_max.dev_attr.attr,
254 	&sensor_dev_attr_temp1_crit.dev_attr.attr,
255 	&sensor_dev_attr_temp1_input.dev_attr.attr,
256 	&sensor_dev_attr_temp1_min_hyst.dev_attr.attr,
257 	&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
258 	&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
259 
260 	&sensor_dev_attr_temp2_min.dev_attr.attr,
261 	&sensor_dev_attr_temp2_max.dev_attr.attr,
262 	&sensor_dev_attr_temp2_crit.dev_attr.attr,
263 	&sensor_dev_attr_temp2_input.dev_attr.attr,
264 	&sensor_dev_attr_temp2_min_hyst.dev_attr.attr,
265 	&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
266 	&sensor_dev_attr_temp2_crit_hyst.dev_attr.attr,
267 
268 	&sensor_dev_attr_power_state.dev_attr.attr,
269 	NULL
270 };
271 
272 static const struct attribute_group emc1402_group = {
273 		.attrs = emc1402_attrs,
274 };
275 
276 static struct attribute *emc1403_attrs[] = {
277 	&sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
278 	&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
279 	&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
280 
281 	&sensor_dev_attr_temp2_fault.dev_attr.attr,
282 	&sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
283 	&sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
284 	&sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
285 
286 	&sensor_dev_attr_temp3_min.dev_attr.attr,
287 	&sensor_dev_attr_temp3_max.dev_attr.attr,
288 	&sensor_dev_attr_temp3_crit.dev_attr.attr,
289 	&sensor_dev_attr_temp3_input.dev_attr.attr,
290 	&sensor_dev_attr_temp3_fault.dev_attr.attr,
291 	&sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
292 	&sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
293 	&sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
294 	&sensor_dev_attr_temp3_min_hyst.dev_attr.attr,
295 	&sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
296 	&sensor_dev_attr_temp3_crit_hyst.dev_attr.attr,
297 	NULL
298 };
299 
300 static const struct attribute_group emc1403_group = {
301 	.attrs = emc1403_attrs,
302 };
303 
304 static struct attribute *emc1404_attrs[] = {
305 	&sensor_dev_attr_temp4_min.dev_attr.attr,
306 	&sensor_dev_attr_temp4_max.dev_attr.attr,
307 	&sensor_dev_attr_temp4_crit.dev_attr.attr,
308 	&sensor_dev_attr_temp4_input.dev_attr.attr,
309 	&sensor_dev_attr_temp4_fault.dev_attr.attr,
310 	&sensor_dev_attr_temp4_min_alarm.dev_attr.attr,
311 	&sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
312 	&sensor_dev_attr_temp4_crit_alarm.dev_attr.attr,
313 	&sensor_dev_attr_temp4_min_hyst.dev_attr.attr,
314 	&sensor_dev_attr_temp4_max_hyst.dev_attr.attr,
315 	&sensor_dev_attr_temp4_crit_hyst.dev_attr.attr,
316 	NULL
317 };
318 
319 static const struct attribute_group emc1404_group = {
320 	.attrs = emc1404_attrs,
321 };
322 
323 /*
324  * EMC14x2 uses a different register and different bits to report alarm and
325  * fault status. For simplicity, provide a separate attribute group for this
326  * chip series.
327  * Since we can not re-use the same attribute names, create a separate attribute
328  * array.
329  */
330 static struct sensor_device_attribute_2 emc1402_alarms[] = {
331 	SENSOR_ATTR_2(temp1_min_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x20),
332 	SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x40),
333 	SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x01),
334 
335 	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_bit, NULL, 0x02, 0x04),
336 	SENSOR_ATTR_2(temp2_min_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x08),
337 	SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x10),
338 	SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x02),
339 };
340 
341 static struct attribute *emc1402_alarm_attrs[] = {
342 	&emc1402_alarms[0].dev_attr.attr,
343 	&emc1402_alarms[1].dev_attr.attr,
344 	&emc1402_alarms[2].dev_attr.attr,
345 	&emc1402_alarms[3].dev_attr.attr,
346 	&emc1402_alarms[4].dev_attr.attr,
347 	&emc1402_alarms[5].dev_attr.attr,
348 	&emc1402_alarms[6].dev_attr.attr,
349 	NULL,
350 };
351 
352 static const struct attribute_group emc1402_alarm_group = {
353 	.attrs = emc1402_alarm_attrs,
354 };
355 
356 static int emc1403_detect(struct i2c_client *client,
357 			struct i2c_board_info *info)
358 {
359 	int id;
360 	/* Check if thermal chip is SMSC and EMC1403 or EMC1423 */
361 
362 	id = i2c_smbus_read_byte_data(client, THERMAL_SMSC_ID_REG);
363 	if (id != 0x5d)
364 		return -ENODEV;
365 
366 	id = i2c_smbus_read_byte_data(client, THERMAL_PID_REG);
367 	switch (id) {
368 	case 0x20:
369 		strlcpy(info->type, "emc1402", I2C_NAME_SIZE);
370 		break;
371 	case 0x21:
372 		strlcpy(info->type, "emc1403", I2C_NAME_SIZE);
373 		break;
374 	case 0x22:
375 		strlcpy(info->type, "emc1422", I2C_NAME_SIZE);
376 		break;
377 	case 0x23:
378 		strlcpy(info->type, "emc1423", I2C_NAME_SIZE);
379 		break;
380 	case 0x25:
381 		strlcpy(info->type, "emc1404", I2C_NAME_SIZE);
382 		break;
383 	case 0x27:
384 		strlcpy(info->type, "emc1424", I2C_NAME_SIZE);
385 		break;
386 	default:
387 		return -ENODEV;
388 	}
389 
390 	id = i2c_smbus_read_byte_data(client, THERMAL_REVISION_REG);
391 	if (id < 0x01 || id > 0x04)
392 		return -ENODEV;
393 
394 	return 0;
395 }
396 
397 static bool emc1403_regmap_is_volatile(struct device *dev, unsigned int reg)
398 {
399 	switch (reg) {
400 	case 0x00:	/* internal diode high byte */
401 	case 0x01:	/* external diode 1 high byte */
402 	case 0x02:	/* status */
403 	case 0x10:	/* external diode 1 low byte */
404 	case 0x1b:	/* external diode fault */
405 	case 0x23:	/* external diode 2 high byte */
406 	case 0x24:	/* external diode 2 low byte */
407 	case 0x29:	/* internal diode low byte */
408 	case 0x2a:	/* externl diode 3 high byte */
409 	case 0x2b:	/* external diode 3 low byte */
410 	case 0x35:	/* high limit status */
411 	case 0x36:	/* low limit status */
412 	case 0x37:	/* therm limit status */
413 		return true;
414 	default:
415 		return false;
416 	}
417 }
418 
419 static const struct regmap_config emc1403_regmap_config = {
420 	.reg_bits = 8,
421 	.val_bits = 8,
422 	.cache_type = REGCACHE_RBTREE,
423 	.volatile_reg = emc1403_regmap_is_volatile,
424 };
425 
426 static int emc1403_probe(struct i2c_client *client,
427 			const struct i2c_device_id *id)
428 {
429 	struct thermal_data *data;
430 	struct device *hwmon_dev;
431 
432 	data = devm_kzalloc(&client->dev, sizeof(struct thermal_data),
433 			    GFP_KERNEL);
434 	if (data == NULL)
435 		return -ENOMEM;
436 
437 	data->regmap = devm_regmap_init_i2c(client, &emc1403_regmap_config);
438 	if (IS_ERR(data->regmap))
439 		return PTR_ERR(data->regmap);
440 
441 	mutex_init(&data->mutex);
442 
443 	switch (id->driver_data) {
444 	case emc1404:
445 		data->groups[2] = &emc1404_group;
446 		/* fall through */
447 	case emc1403:
448 		data->groups[1] = &emc1403_group;
449 		/* fall through */
450 	case emc1402:
451 		data->groups[0] = &emc1402_group;
452 	}
453 
454 	if (id->driver_data == emc1402)
455 		data->groups[1] = &emc1402_alarm_group;
456 
457 	hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev,
458 							   client->name, data,
459 							   data->groups);
460 	if (IS_ERR(hwmon_dev))
461 		return PTR_ERR(hwmon_dev);
462 
463 	dev_info(&client->dev, "%s Thermal chip found\n", id->name);
464 	return 0;
465 }
466 
467 static const unsigned short emc1403_address_list[] = {
468 	0x18, 0x1c, 0x29, 0x4c, 0x4d, 0x5c, I2C_CLIENT_END
469 };
470 
471 /* Last digit of chip name indicates number of channels */
472 static const struct i2c_device_id emc1403_idtable[] = {
473 	{ "emc1402", emc1402 },
474 	{ "emc1403", emc1403 },
475 	{ "emc1404", emc1404 },
476 	{ "emc1412", emc1402 },
477 	{ "emc1413", emc1403 },
478 	{ "emc1414", emc1404 },
479 	{ "emc1422", emc1402 },
480 	{ "emc1423", emc1403 },
481 	{ "emc1424", emc1404 },
482 	{ }
483 };
484 MODULE_DEVICE_TABLE(i2c, emc1403_idtable);
485 
486 static struct i2c_driver sensor_emc1403 = {
487 	.class = I2C_CLASS_HWMON,
488 	.driver = {
489 		.name = "emc1403",
490 	},
491 	.detect = emc1403_detect,
492 	.probe = emc1403_probe,
493 	.id_table = emc1403_idtable,
494 	.address_list = emc1403_address_list,
495 };
496 
497 module_i2c_driver(sensor_emc1403);
498 
499 MODULE_AUTHOR("Kalhan Trisal <kalhan.trisal@intel.com");
500 MODULE_DESCRIPTION("emc1403 Thermal Driver");
501 MODULE_LICENSE("GPL v2");
502