• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Hardware monitoring driver for PMBus devices
3  *
4  * Copyright (c) 2010, 2011 Ericsson AB.
5  * Copyright (c) 2012 Guenter Roeck
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/kernel.h>
23 #include <linux/math64.h>
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/err.h>
27 #include <linux/slab.h>
28 #include <linux/i2c.h>
29 #include <linux/hwmon.h>
30 #include <linux/hwmon-sysfs.h>
31 #include <linux/jiffies.h>
32 #include <linux/i2c/pmbus.h>
33 #include "pmbus.h"
34 
35 /*
36  * Number of additional attribute pointers to allocate
37  * with each call to krealloc
38  */
39 #define PMBUS_ATTR_ALLOC_SIZE	32
40 
41 /*
42  * Index into status register array, per status register group
43  */
44 #define PB_STATUS_BASE		0
45 #define PB_STATUS_VOUT_BASE	(PB_STATUS_BASE + PMBUS_PAGES)
46 #define PB_STATUS_IOUT_BASE	(PB_STATUS_VOUT_BASE + PMBUS_PAGES)
47 #define PB_STATUS_FAN_BASE	(PB_STATUS_IOUT_BASE + PMBUS_PAGES)
48 #define PB_STATUS_FAN34_BASE	(PB_STATUS_FAN_BASE + PMBUS_PAGES)
49 #define PB_STATUS_TEMP_BASE	(PB_STATUS_FAN34_BASE + PMBUS_PAGES)
50 #define PB_STATUS_INPUT_BASE	(PB_STATUS_TEMP_BASE + PMBUS_PAGES)
51 #define PB_STATUS_VMON_BASE	(PB_STATUS_INPUT_BASE + 1)
52 
53 #define PB_NUM_STATUS_REG	(PB_STATUS_VMON_BASE + 1)
54 
55 #define PMBUS_NAME_SIZE		24
56 
57 struct pmbus_sensor {
58 	struct pmbus_sensor *next;
59 	char name[PMBUS_NAME_SIZE];	/* sysfs sensor name */
60 	struct device_attribute attribute;
61 	u8 page;		/* page number */
62 	u16 reg;		/* register */
63 	enum pmbus_sensor_classes class;	/* sensor class */
64 	bool update;		/* runtime sensor update needed */
65 	int data;		/* Sensor data.
66 				   Negative if there was a read error */
67 };
68 #define to_pmbus_sensor(_attr) \
69 	container_of(_attr, struct pmbus_sensor, attribute)
70 
71 struct pmbus_boolean {
72 	char name[PMBUS_NAME_SIZE];	/* sysfs boolean name */
73 	struct sensor_device_attribute attribute;
74 	struct pmbus_sensor *s1;
75 	struct pmbus_sensor *s2;
76 };
77 #define to_pmbus_boolean(_attr) \
78 	container_of(_attr, struct pmbus_boolean, attribute)
79 
80 struct pmbus_label {
81 	char name[PMBUS_NAME_SIZE];	/* sysfs label name */
82 	struct device_attribute attribute;
83 	char label[PMBUS_NAME_SIZE];	/* label */
84 };
85 #define to_pmbus_label(_attr) \
86 	container_of(_attr, struct pmbus_label, attribute)
87 
88 struct pmbus_data {
89 	struct device *dev;
90 	struct device *hwmon_dev;
91 
92 	u32 flags;		/* from platform data */
93 
94 	int exponent[PMBUS_PAGES];
95 				/* linear mode: exponent for output voltages */
96 
97 	const struct pmbus_driver_info *info;
98 
99 	int max_attributes;
100 	int num_attributes;
101 	struct attribute_group group;
102 	const struct attribute_group *groups[2];
103 
104 	struct pmbus_sensor *sensors;
105 
106 	struct mutex update_lock;
107 	bool valid;
108 	unsigned long last_updated;	/* in jiffies */
109 
110 	/*
111 	 * A single status register covers multiple attributes,
112 	 * so we keep them all together.
113 	 */
114 	u8 status[PB_NUM_STATUS_REG];
115 	u8 status_register;
116 
117 	u8 currpage;
118 };
119 
pmbus_clear_cache(struct i2c_client * client)120 void pmbus_clear_cache(struct i2c_client *client)
121 {
122 	struct pmbus_data *data = i2c_get_clientdata(client);
123 
124 	data->valid = false;
125 }
126 EXPORT_SYMBOL_GPL(pmbus_clear_cache);
127 
pmbus_set_page(struct i2c_client * client,u8 page)128 int pmbus_set_page(struct i2c_client *client, u8 page)
129 {
130 	struct pmbus_data *data = i2c_get_clientdata(client);
131 	int rv = 0;
132 	int newpage;
133 
134 	if (page != data->currpage) {
135 		rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
136 		newpage = i2c_smbus_read_byte_data(client, PMBUS_PAGE);
137 		if (newpage != page)
138 			rv = -EIO;
139 		else
140 			data->currpage = page;
141 	}
142 	return rv;
143 }
144 EXPORT_SYMBOL_GPL(pmbus_set_page);
145 
pmbus_write_byte(struct i2c_client * client,int page,u8 value)146 int pmbus_write_byte(struct i2c_client *client, int page, u8 value)
147 {
148 	int rv;
149 
150 	if (page >= 0) {
151 		rv = pmbus_set_page(client, page);
152 		if (rv < 0)
153 			return rv;
154 	}
155 
156 	return i2c_smbus_write_byte(client, value);
157 }
158 EXPORT_SYMBOL_GPL(pmbus_write_byte);
159 
160 /*
161  * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if
162  * a device specific mapping function exists and calls it if necessary.
163  */
_pmbus_write_byte(struct i2c_client * client,int page,u8 value)164 static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value)
165 {
166 	struct pmbus_data *data = i2c_get_clientdata(client);
167 	const struct pmbus_driver_info *info = data->info;
168 	int status;
169 
170 	if (info->write_byte) {
171 		status = info->write_byte(client, page, value);
172 		if (status != -ENODATA)
173 			return status;
174 	}
175 	return pmbus_write_byte(client, page, value);
176 }
177 
pmbus_write_word_data(struct i2c_client * client,u8 page,u8 reg,u16 word)178 int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word)
179 {
180 	int rv;
181 
182 	rv = pmbus_set_page(client, page);
183 	if (rv < 0)
184 		return rv;
185 
186 	return i2c_smbus_write_word_data(client, reg, word);
187 }
188 EXPORT_SYMBOL_GPL(pmbus_write_word_data);
189 
190 /*
191  * _pmbus_write_word_data() is similar to pmbus_write_word_data(), but checks if
192  * a device specific mapping function exists and calls it if necessary.
193  */
_pmbus_write_word_data(struct i2c_client * client,int page,int reg,u16 word)194 static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg,
195 				  u16 word)
196 {
197 	struct pmbus_data *data = i2c_get_clientdata(client);
198 	const struct pmbus_driver_info *info = data->info;
199 	int status;
200 
201 	if (info->write_word_data) {
202 		status = info->write_word_data(client, page, reg, word);
203 		if (status != -ENODATA)
204 			return status;
205 	}
206 	if (reg >= PMBUS_VIRT_BASE)
207 		return -ENXIO;
208 	return pmbus_write_word_data(client, page, reg, word);
209 }
210 
pmbus_read_word_data(struct i2c_client * client,u8 page,u8 reg)211 int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg)
212 {
213 	int rv;
214 
215 	rv = pmbus_set_page(client, page);
216 	if (rv < 0)
217 		return rv;
218 
219 	return i2c_smbus_read_word_data(client, reg);
220 }
221 EXPORT_SYMBOL_GPL(pmbus_read_word_data);
222 
223 /*
224  * _pmbus_read_word_data() is similar to pmbus_read_word_data(), but checks if
225  * a device specific mapping function exists and calls it if necessary.
226  */
_pmbus_read_word_data(struct i2c_client * client,int page,int reg)227 static int _pmbus_read_word_data(struct i2c_client *client, int page, int reg)
228 {
229 	struct pmbus_data *data = i2c_get_clientdata(client);
230 	const struct pmbus_driver_info *info = data->info;
231 	int status;
232 
233 	if (info->read_word_data) {
234 		status = info->read_word_data(client, page, reg);
235 		if (status != -ENODATA)
236 			return status;
237 	}
238 	if (reg >= PMBUS_VIRT_BASE)
239 		return -ENXIO;
240 	return pmbus_read_word_data(client, page, reg);
241 }
242 
pmbus_read_byte_data(struct i2c_client * client,int page,u8 reg)243 int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)
244 {
245 	int rv;
246 
247 	if (page >= 0) {
248 		rv = pmbus_set_page(client, page);
249 		if (rv < 0)
250 			return rv;
251 	}
252 
253 	return i2c_smbus_read_byte_data(client, reg);
254 }
255 EXPORT_SYMBOL_GPL(pmbus_read_byte_data);
256 
257 /*
258  * _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
259  * a device specific mapping function exists and calls it if necessary.
260  */
_pmbus_read_byte_data(struct i2c_client * client,int page,int reg)261 static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
262 {
263 	struct pmbus_data *data = i2c_get_clientdata(client);
264 	const struct pmbus_driver_info *info = data->info;
265 	int status;
266 
267 	if (info->read_byte_data) {
268 		status = info->read_byte_data(client, page, reg);
269 		if (status != -ENODATA)
270 			return status;
271 	}
272 	return pmbus_read_byte_data(client, page, reg);
273 }
274 
pmbus_clear_fault_page(struct i2c_client * client,int page)275 static void pmbus_clear_fault_page(struct i2c_client *client, int page)
276 {
277 	_pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
278 }
279 
pmbus_clear_faults(struct i2c_client * client)280 void pmbus_clear_faults(struct i2c_client *client)
281 {
282 	struct pmbus_data *data = i2c_get_clientdata(client);
283 	int i;
284 
285 	for (i = 0; i < data->info->pages; i++)
286 		pmbus_clear_fault_page(client, i);
287 }
288 EXPORT_SYMBOL_GPL(pmbus_clear_faults);
289 
pmbus_check_status_cml(struct i2c_client * client)290 static int pmbus_check_status_cml(struct i2c_client *client)
291 {
292 	struct pmbus_data *data = i2c_get_clientdata(client);
293 	int status, status2;
294 
295 	status = _pmbus_read_byte_data(client, -1, data->status_register);
296 	if (status < 0 || (status & PB_STATUS_CML)) {
297 		status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML);
298 		if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND))
299 			return -EIO;
300 	}
301 	return 0;
302 }
303 
pmbus_check_register(struct i2c_client * client,int (* func)(struct i2c_client * client,int page,int reg),int page,int reg)304 static bool pmbus_check_register(struct i2c_client *client,
305 				 int (*func)(struct i2c_client *client,
306 					     int page, int reg),
307 				 int page, int reg)
308 {
309 	int rv;
310 	struct pmbus_data *data = i2c_get_clientdata(client);
311 
312 	rv = func(client, page, reg);
313 	if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
314 		rv = pmbus_check_status_cml(client);
315 	pmbus_clear_fault_page(client, -1);
316 	return rv >= 0;
317 }
318 
pmbus_check_byte_register(struct i2c_client * client,int page,int reg)319 bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg)
320 {
321 	return pmbus_check_register(client, _pmbus_read_byte_data, page, reg);
322 }
323 EXPORT_SYMBOL_GPL(pmbus_check_byte_register);
324 
pmbus_check_word_register(struct i2c_client * client,int page,int reg)325 bool pmbus_check_word_register(struct i2c_client *client, int page, int reg)
326 {
327 	return pmbus_check_register(client, _pmbus_read_word_data, page, reg);
328 }
329 EXPORT_SYMBOL_GPL(pmbus_check_word_register);
330 
pmbus_get_driver_info(struct i2c_client * client)331 const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client)
332 {
333 	struct pmbus_data *data = i2c_get_clientdata(client);
334 
335 	return data->info;
336 }
337 EXPORT_SYMBOL_GPL(pmbus_get_driver_info);
338 
339 static struct _pmbus_status {
340 	u32 func;
341 	u16 base;
342 	u16 reg;
343 } pmbus_status[] = {
344 	{ PMBUS_HAVE_STATUS_VOUT, PB_STATUS_VOUT_BASE, PMBUS_STATUS_VOUT },
345 	{ PMBUS_HAVE_STATUS_IOUT, PB_STATUS_IOUT_BASE, PMBUS_STATUS_IOUT },
346 	{ PMBUS_HAVE_STATUS_TEMP, PB_STATUS_TEMP_BASE,
347 	  PMBUS_STATUS_TEMPERATURE },
348 	{ PMBUS_HAVE_STATUS_FAN12, PB_STATUS_FAN_BASE, PMBUS_STATUS_FAN_12 },
349 	{ PMBUS_HAVE_STATUS_FAN34, PB_STATUS_FAN34_BASE, PMBUS_STATUS_FAN_34 },
350 };
351 
pmbus_update_device(struct device * dev)352 static struct pmbus_data *pmbus_update_device(struct device *dev)
353 {
354 	struct i2c_client *client = to_i2c_client(dev->parent);
355 	struct pmbus_data *data = i2c_get_clientdata(client);
356 	const struct pmbus_driver_info *info = data->info;
357 	struct pmbus_sensor *sensor;
358 
359 	mutex_lock(&data->update_lock);
360 	if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
361 		int i, j;
362 
363 		for (i = 0; i < info->pages; i++) {
364 			data->status[PB_STATUS_BASE + i]
365 			    = _pmbus_read_byte_data(client, i,
366 						    data->status_register);
367 			for (j = 0; j < ARRAY_SIZE(pmbus_status); j++) {
368 				struct _pmbus_status *s = &pmbus_status[j];
369 
370 				if (!(info->func[i] & s->func))
371 					continue;
372 				data->status[s->base + i]
373 					= _pmbus_read_byte_data(client, i,
374 								s->reg);
375 			}
376 		}
377 
378 		if (info->func[0] & PMBUS_HAVE_STATUS_INPUT)
379 			data->status[PB_STATUS_INPUT_BASE]
380 			  = _pmbus_read_byte_data(client, 0,
381 						  PMBUS_STATUS_INPUT);
382 
383 		if (info->func[0] & PMBUS_HAVE_STATUS_VMON)
384 			data->status[PB_STATUS_VMON_BASE]
385 			  = _pmbus_read_byte_data(client, 0,
386 						  PMBUS_VIRT_STATUS_VMON);
387 
388 		for (sensor = data->sensors; sensor; sensor = sensor->next) {
389 			if (!data->valid || sensor->update)
390 				sensor->data
391 				    = _pmbus_read_word_data(client,
392 							    sensor->page,
393 							    sensor->reg);
394 		}
395 		pmbus_clear_faults(client);
396 		data->last_updated = jiffies;
397 		data->valid = 1;
398 	}
399 	mutex_unlock(&data->update_lock);
400 	return data;
401 }
402 
403 /*
404  * Convert linear sensor values to milli- or micro-units
405  * depending on sensor type.
406  */
pmbus_reg2data_linear(struct pmbus_data * data,struct pmbus_sensor * sensor)407 static long pmbus_reg2data_linear(struct pmbus_data *data,
408 				  struct pmbus_sensor *sensor)
409 {
410 	s16 exponent;
411 	s32 mantissa;
412 	long val;
413 
414 	if (sensor->class == PSC_VOLTAGE_OUT) {	/* LINEAR16 */
415 		exponent = data->exponent[sensor->page];
416 		mantissa = (u16) sensor->data;
417 	} else {				/* LINEAR11 */
418 		exponent = ((s16)sensor->data) >> 11;
419 		mantissa = ((s16)((sensor->data & 0x7ff) << 5)) >> 5;
420 	}
421 
422 	val = mantissa;
423 
424 	/* scale result to milli-units for all sensors except fans */
425 	if (sensor->class != PSC_FAN)
426 		val = val * 1000L;
427 
428 	/* scale result to micro-units for power sensors */
429 	if (sensor->class == PSC_POWER)
430 		val = val * 1000L;
431 
432 	if (exponent >= 0)
433 		val <<= exponent;
434 	else
435 		val >>= -exponent;
436 
437 	return val;
438 }
439 
440 /*
441  * Convert direct sensor values to milli- or micro-units
442  * depending on sensor type.
443  */
pmbus_reg2data_direct(struct pmbus_data * data,struct pmbus_sensor * sensor)444 static long pmbus_reg2data_direct(struct pmbus_data *data,
445 				  struct pmbus_sensor *sensor)
446 {
447 	s64 b, val = (s16)sensor->data;
448 	s32 m, R;
449 
450 	m = data->info->m[sensor->class];
451 	b = data->info->b[sensor->class];
452 	R = data->info->R[sensor->class];
453 
454 	if (m == 0)
455 		return 0;
456 
457 	/* X = 1/m * (Y * 10^-R - b) */
458 	R = -R;
459 	/* scale result to milli-units for everything but fans */
460 	if (sensor->class != PSC_FAN) {
461 		R += 3;
462 		b *= 1000;
463 	}
464 
465 	/* scale result to micro-units for power sensors */
466 	if (sensor->class == PSC_POWER) {
467 		R += 3;
468 		b *= 1000;
469 	}
470 
471 	while (R > 0) {
472 		val *= 10;
473 		R--;
474 	}
475 	while (R < 0) {
476 		val = div_s64(val + 5LL, 10L);  /* round closest */
477 		R++;
478 	}
479 
480 	val = div_s64(val - b, m);
481 	return clamp_val(val, LONG_MIN, LONG_MAX);
482 }
483 
484 /*
485  * Convert VID sensor values to milli- or micro-units
486  * depending on sensor type.
487  * We currently only support VR11.
488  */
pmbus_reg2data_vid(struct pmbus_data * data,struct pmbus_sensor * sensor)489 static long pmbus_reg2data_vid(struct pmbus_data *data,
490 			       struct pmbus_sensor *sensor)
491 {
492 	long val = sensor->data;
493 
494 	if (val < 0x02 || val > 0xb2)
495 		return 0;
496 	return DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100);
497 }
498 
pmbus_reg2data(struct pmbus_data * data,struct pmbus_sensor * sensor)499 static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
500 {
501 	long val;
502 
503 	switch (data->info->format[sensor->class]) {
504 	case direct:
505 		val = pmbus_reg2data_direct(data, sensor);
506 		break;
507 	case vid:
508 		val = pmbus_reg2data_vid(data, sensor);
509 		break;
510 	case linear:
511 	default:
512 		val = pmbus_reg2data_linear(data, sensor);
513 		break;
514 	}
515 	return val;
516 }
517 
518 #define MAX_MANTISSA	(1023 * 1000)
519 #define MIN_MANTISSA	(511 * 1000)
520 
pmbus_data2reg_linear(struct pmbus_data * data,struct pmbus_sensor * sensor,long val)521 static u16 pmbus_data2reg_linear(struct pmbus_data *data,
522 				 struct pmbus_sensor *sensor, long val)
523 {
524 	s16 exponent = 0, mantissa;
525 	bool negative = false;
526 
527 	/* simple case */
528 	if (val == 0)
529 		return 0;
530 
531 	if (sensor->class == PSC_VOLTAGE_OUT) {
532 		/* LINEAR16 does not support negative voltages */
533 		if (val < 0)
534 			return 0;
535 
536 		/*
537 		 * For a static exponents, we don't have a choice
538 		 * but to adjust the value to it.
539 		 */
540 		if (data->exponent[sensor->page] < 0)
541 			val <<= -data->exponent[sensor->page];
542 		else
543 			val >>= data->exponent[sensor->page];
544 		val = DIV_ROUND_CLOSEST(val, 1000);
545 		return val & 0xffff;
546 	}
547 
548 	if (val < 0) {
549 		negative = true;
550 		val = -val;
551 	}
552 
553 	/* Power is in uW. Convert to mW before converting. */
554 	if (sensor->class == PSC_POWER)
555 		val = DIV_ROUND_CLOSEST(val, 1000L);
556 
557 	/*
558 	 * For simplicity, convert fan data to milli-units
559 	 * before calculating the exponent.
560 	 */
561 	if (sensor->class == PSC_FAN)
562 		val = val * 1000;
563 
564 	/* Reduce large mantissa until it fits into 10 bit */
565 	while (val >= MAX_MANTISSA && exponent < 15) {
566 		exponent++;
567 		val >>= 1;
568 	}
569 	/* Increase small mantissa to improve precision */
570 	while (val < MIN_MANTISSA && exponent > -15) {
571 		exponent--;
572 		val <<= 1;
573 	}
574 
575 	/* Convert mantissa from milli-units to units */
576 	mantissa = DIV_ROUND_CLOSEST(val, 1000);
577 
578 	/* Ensure that resulting number is within range */
579 	if (mantissa > 0x3ff)
580 		mantissa = 0x3ff;
581 
582 	/* restore sign */
583 	if (negative)
584 		mantissa = -mantissa;
585 
586 	/* Convert to 5 bit exponent, 11 bit mantissa */
587 	return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800);
588 }
589 
pmbus_data2reg_direct(struct pmbus_data * data,struct pmbus_sensor * sensor,long val)590 static u16 pmbus_data2reg_direct(struct pmbus_data *data,
591 				 struct pmbus_sensor *sensor, long val)
592 {
593 	s64 b, val64 = val;
594 	s32 m, R;
595 
596 	m = data->info->m[sensor->class];
597 	b = data->info->b[sensor->class];
598 	R = data->info->R[sensor->class];
599 
600 	/* Power is in uW. Adjust R and b. */
601 	if (sensor->class == PSC_POWER) {
602 		R -= 3;
603 		b *= 1000;
604 	}
605 
606 	/* Calculate Y = (m * X + b) * 10^R */
607 	if (sensor->class != PSC_FAN) {
608 		R -= 3;		/* Adjust R and b for data in milli-units */
609 		b *= 1000;
610 	}
611 	val64 = val64 * m + b;
612 
613 	while (R > 0) {
614 		val64 *= 10;
615 		R--;
616 	}
617 	while (R < 0) {
618 		val64 = div_s64(val64 + 5LL, 10L);  /* round closest */
619 		R++;
620 	}
621 
622 	return (u16)clamp_val(val64, S16_MIN, S16_MAX);
623 }
624 
pmbus_data2reg_vid(struct pmbus_data * data,struct pmbus_sensor * sensor,long val)625 static u16 pmbus_data2reg_vid(struct pmbus_data *data,
626 			      struct pmbus_sensor *sensor, long val)
627 {
628 	val = clamp_val(val, 500, 1600);
629 
630 	return 2 + DIV_ROUND_CLOSEST((1600 - val) * 100, 625);
631 }
632 
pmbus_data2reg(struct pmbus_data * data,struct pmbus_sensor * sensor,long val)633 static u16 pmbus_data2reg(struct pmbus_data *data,
634 			  struct pmbus_sensor *sensor, long val)
635 {
636 	u16 regval;
637 
638 	switch (data->info->format[sensor->class]) {
639 	case direct:
640 		regval = pmbus_data2reg_direct(data, sensor, val);
641 		break;
642 	case vid:
643 		regval = pmbus_data2reg_vid(data, sensor, val);
644 		break;
645 	case linear:
646 	default:
647 		regval = pmbus_data2reg_linear(data, sensor, val);
648 		break;
649 	}
650 	return regval;
651 }
652 
653 /*
654  * Return boolean calculated from converted data.
655  * <index> defines a status register index and mask.
656  * The mask is in the lower 8 bits, the register index is in bits 8..23.
657  *
658  * The associated pmbus_boolean structure contains optional pointers to two
659  * sensor attributes. If specified, those attributes are compared against each
660  * other to determine if a limit has been exceeded.
661  *
662  * If the sensor attribute pointers are NULL, the function returns true if
663  * (status[reg] & mask) is true.
664  *
665  * If sensor attribute pointers are provided, a comparison against a specified
666  * limit has to be performed to determine the boolean result.
667  * In this case, the function returns true if v1 >= v2 (where v1 and v2 are
668  * sensor values referenced by sensor attribute pointers s1 and s2).
669  *
670  * To determine if an object exceeds upper limits, specify <s1,s2> = <v,limit>.
671  * To determine if an object exceeds lower limits, specify <s1,s2> = <limit,v>.
672  *
673  * If a negative value is stored in any of the referenced registers, this value
674  * reflects an error code which will be returned.
675  */
pmbus_get_boolean(struct pmbus_data * data,struct pmbus_boolean * b,int index)676 static int pmbus_get_boolean(struct pmbus_data *data, struct pmbus_boolean *b,
677 			     int index)
678 {
679 	struct pmbus_sensor *s1 = b->s1;
680 	struct pmbus_sensor *s2 = b->s2;
681 	u16 reg = (index >> 8) & 0xffff;
682 	u8 mask = index & 0xff;
683 	int ret, status;
684 	u8 regval;
685 
686 	status = data->status[reg];
687 	if (status < 0)
688 		return status;
689 
690 	regval = status & mask;
691 	if (!s1 && !s2) {
692 		ret = !!regval;
693 	} else if (!s1 || !s2) {
694 		WARN(1, "Bad boolean descriptor %p: s1=%p, s2=%p\n", b, s1, s2);
695 		return 0;
696 	} else {
697 		long v1, v2;
698 
699 		if (s1->data < 0)
700 			return s1->data;
701 		if (s2->data < 0)
702 			return s2->data;
703 
704 		v1 = pmbus_reg2data(data, s1);
705 		v2 = pmbus_reg2data(data, s2);
706 		ret = !!(regval && v1 >= v2);
707 	}
708 	return ret;
709 }
710 
pmbus_show_boolean(struct device * dev,struct device_attribute * da,char * buf)711 static ssize_t pmbus_show_boolean(struct device *dev,
712 				  struct device_attribute *da, char *buf)
713 {
714 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
715 	struct pmbus_boolean *boolean = to_pmbus_boolean(attr);
716 	struct pmbus_data *data = pmbus_update_device(dev);
717 	int val;
718 
719 	val = pmbus_get_boolean(data, boolean, attr->index);
720 	if (val < 0)
721 		return val;
722 	return snprintf(buf, PAGE_SIZE, "%d\n", val);
723 }
724 
pmbus_show_sensor(struct device * dev,struct device_attribute * devattr,char * buf)725 static ssize_t pmbus_show_sensor(struct device *dev,
726 				 struct device_attribute *devattr, char *buf)
727 {
728 	struct pmbus_data *data = pmbus_update_device(dev);
729 	struct pmbus_sensor *sensor = to_pmbus_sensor(devattr);
730 
731 	if (sensor->data < 0)
732 		return sensor->data;
733 
734 	return snprintf(buf, PAGE_SIZE, "%ld\n", pmbus_reg2data(data, sensor));
735 }
736 
pmbus_set_sensor(struct device * dev,struct device_attribute * devattr,const char * buf,size_t count)737 static ssize_t pmbus_set_sensor(struct device *dev,
738 				struct device_attribute *devattr,
739 				const char *buf, size_t count)
740 {
741 	struct i2c_client *client = to_i2c_client(dev->parent);
742 	struct pmbus_data *data = i2c_get_clientdata(client);
743 	struct pmbus_sensor *sensor = to_pmbus_sensor(devattr);
744 	ssize_t rv = count;
745 	long val = 0;
746 	int ret;
747 	u16 regval;
748 
749 	if (kstrtol(buf, 10, &val) < 0)
750 		return -EINVAL;
751 
752 	mutex_lock(&data->update_lock);
753 	regval = pmbus_data2reg(data, sensor, val);
754 	ret = _pmbus_write_word_data(client, sensor->page, sensor->reg, regval);
755 	if (ret < 0)
756 		rv = ret;
757 	else
758 		sensor->data = regval;
759 	mutex_unlock(&data->update_lock);
760 	return rv;
761 }
762 
pmbus_show_label(struct device * dev,struct device_attribute * da,char * buf)763 static ssize_t pmbus_show_label(struct device *dev,
764 				struct device_attribute *da, char *buf)
765 {
766 	struct pmbus_label *label = to_pmbus_label(da);
767 
768 	return snprintf(buf, PAGE_SIZE, "%s\n", label->label);
769 }
770 
pmbus_add_attribute(struct pmbus_data * data,struct attribute * attr)771 static int pmbus_add_attribute(struct pmbus_data *data, struct attribute *attr)
772 {
773 	if (data->num_attributes >= data->max_attributes - 1) {
774 		int new_max_attrs = data->max_attributes + PMBUS_ATTR_ALLOC_SIZE;
775 		void *new_attrs = krealloc(data->group.attrs,
776 					   new_max_attrs * sizeof(void *),
777 					   GFP_KERNEL);
778 		if (!new_attrs)
779 			return -ENOMEM;
780 		data->group.attrs = new_attrs;
781 		data->max_attributes = new_max_attrs;
782 	}
783 
784 	data->group.attrs[data->num_attributes++] = attr;
785 	data->group.attrs[data->num_attributes] = NULL;
786 	return 0;
787 }
788 
pmbus_dev_attr_init(struct device_attribute * dev_attr,const char * name,umode_t mode,ssize_t (* show)(struct device * dev,struct device_attribute * attr,char * buf),ssize_t (* store)(struct device * dev,struct device_attribute * attr,const char * buf,size_t count))789 static void pmbus_dev_attr_init(struct device_attribute *dev_attr,
790 				const char *name,
791 				umode_t mode,
792 				ssize_t (*show)(struct device *dev,
793 						struct device_attribute *attr,
794 						char *buf),
795 				ssize_t (*store)(struct device *dev,
796 						 struct device_attribute *attr,
797 						 const char *buf, size_t count))
798 {
799 	sysfs_attr_init(&dev_attr->attr);
800 	dev_attr->attr.name = name;
801 	dev_attr->attr.mode = mode;
802 	dev_attr->show = show;
803 	dev_attr->store = store;
804 }
805 
pmbus_attr_init(struct sensor_device_attribute * a,const char * name,umode_t mode,ssize_t (* show)(struct device * dev,struct device_attribute * attr,char * buf),ssize_t (* store)(struct device * dev,struct device_attribute * attr,const char * buf,size_t count),int idx)806 static void pmbus_attr_init(struct sensor_device_attribute *a,
807 			    const char *name,
808 			    umode_t mode,
809 			    ssize_t (*show)(struct device *dev,
810 					    struct device_attribute *attr,
811 					    char *buf),
812 			    ssize_t (*store)(struct device *dev,
813 					     struct device_attribute *attr,
814 					     const char *buf, size_t count),
815 			    int idx)
816 {
817 	pmbus_dev_attr_init(&a->dev_attr, name, mode, show, store);
818 	a->index = idx;
819 }
820 
pmbus_add_boolean(struct pmbus_data * data,const char * name,const char * type,int seq,struct pmbus_sensor * s1,struct pmbus_sensor * s2,u16 reg,u8 mask)821 static int pmbus_add_boolean(struct pmbus_data *data,
822 			     const char *name, const char *type, int seq,
823 			     struct pmbus_sensor *s1,
824 			     struct pmbus_sensor *s2,
825 			     u16 reg, u8 mask)
826 {
827 	struct pmbus_boolean *boolean;
828 	struct sensor_device_attribute *a;
829 
830 	boolean = devm_kzalloc(data->dev, sizeof(*boolean), GFP_KERNEL);
831 	if (!boolean)
832 		return -ENOMEM;
833 
834 	a = &boolean->attribute;
835 
836 	snprintf(boolean->name, sizeof(boolean->name), "%s%d_%s",
837 		 name, seq, type);
838 	boolean->s1 = s1;
839 	boolean->s2 = s2;
840 	pmbus_attr_init(a, boolean->name, S_IRUGO, pmbus_show_boolean, NULL,
841 			(reg << 8) | mask);
842 
843 	return pmbus_add_attribute(data, &a->dev_attr.attr);
844 }
845 
pmbus_add_sensor(struct pmbus_data * data,const char * name,const char * type,int seq,int page,int reg,enum pmbus_sensor_classes class,bool update,bool readonly)846 static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data,
847 					     const char *name, const char *type,
848 					     int seq, int page, int reg,
849 					     enum pmbus_sensor_classes class,
850 					     bool update, bool readonly)
851 {
852 	struct pmbus_sensor *sensor;
853 	struct device_attribute *a;
854 
855 	sensor = devm_kzalloc(data->dev, sizeof(*sensor), GFP_KERNEL);
856 	if (!sensor)
857 		return NULL;
858 	a = &sensor->attribute;
859 
860 	snprintf(sensor->name, sizeof(sensor->name), "%s%d_%s",
861 		 name, seq, type);
862 	sensor->page = page;
863 	sensor->reg = reg;
864 	sensor->class = class;
865 	sensor->update = update;
866 	pmbus_dev_attr_init(a, sensor->name,
867 			    readonly ? S_IRUGO : S_IRUGO | S_IWUSR,
868 			    pmbus_show_sensor, pmbus_set_sensor);
869 
870 	if (pmbus_add_attribute(data, &a->attr))
871 		return NULL;
872 
873 	sensor->next = data->sensors;
874 	data->sensors = sensor;
875 
876 	return sensor;
877 }
878 
pmbus_add_label(struct pmbus_data * data,const char * name,int seq,const char * lstring,int index)879 static int pmbus_add_label(struct pmbus_data *data,
880 			   const char *name, int seq,
881 			   const char *lstring, int index)
882 {
883 	struct pmbus_label *label;
884 	struct device_attribute *a;
885 
886 	label = devm_kzalloc(data->dev, sizeof(*label), GFP_KERNEL);
887 	if (!label)
888 		return -ENOMEM;
889 
890 	a = &label->attribute;
891 
892 	snprintf(label->name, sizeof(label->name), "%s%d_label", name, seq);
893 	if (!index)
894 		strncpy(label->label, lstring, sizeof(label->label) - 1);
895 	else
896 		snprintf(label->label, sizeof(label->label), "%s%d", lstring,
897 			 index);
898 
899 	pmbus_dev_attr_init(a, label->name, S_IRUGO, pmbus_show_label, NULL);
900 	return pmbus_add_attribute(data, &a->attr);
901 }
902 
903 /*
904  * Search for attributes. Allocate sensors, booleans, and labels as needed.
905  */
906 
907 /*
908  * The pmbus_limit_attr structure describes a single limit attribute
909  * and its associated alarm attribute.
910  */
911 struct pmbus_limit_attr {
912 	u16 reg;		/* Limit register */
913 	u16 sbit;		/* Alarm attribute status bit */
914 	bool update;		/* True if register needs updates */
915 	bool low;		/* True if low limit; for limits with compare
916 				   functions only */
917 	const char *attr;	/* Attribute name */
918 	const char *alarm;	/* Alarm attribute name */
919 };
920 
921 /*
922  * The pmbus_sensor_attr structure describes one sensor attribute. This
923  * description includes a reference to the associated limit attributes.
924  */
925 struct pmbus_sensor_attr {
926 	u16 reg;			/* sensor register */
927 	u8 gbit;			/* generic status bit */
928 	u8 nlimit;			/* # of limit registers */
929 	enum pmbus_sensor_classes class;/* sensor class */
930 	const char *label;		/* sensor label */
931 	bool paged;			/* true if paged sensor */
932 	bool update;			/* true if update needed */
933 	bool compare;			/* true if compare function needed */
934 	u32 func;			/* sensor mask */
935 	u32 sfunc;			/* sensor status mask */
936 	int sbase;			/* status base register */
937 	const struct pmbus_limit_attr *limit;/* limit registers */
938 };
939 
940 /*
941  * Add a set of limit attributes and, if supported, the associated
942  * alarm attributes.
943  * returns 0 if no alarm register found, 1 if an alarm register was found,
944  * < 0 on errors.
945  */
pmbus_add_limit_attrs(struct i2c_client * client,struct pmbus_data * data,const struct pmbus_driver_info * info,const char * name,int index,int page,struct pmbus_sensor * base,const struct pmbus_sensor_attr * attr)946 static int pmbus_add_limit_attrs(struct i2c_client *client,
947 				 struct pmbus_data *data,
948 				 const struct pmbus_driver_info *info,
949 				 const char *name, int index, int page,
950 				 struct pmbus_sensor *base,
951 				 const struct pmbus_sensor_attr *attr)
952 {
953 	const struct pmbus_limit_attr *l = attr->limit;
954 	int nlimit = attr->nlimit;
955 	int have_alarm = 0;
956 	int i, ret;
957 	struct pmbus_sensor *curr;
958 
959 	for (i = 0; i < nlimit; i++) {
960 		if (pmbus_check_word_register(client, page, l->reg)) {
961 			curr = pmbus_add_sensor(data, name, l->attr, index,
962 						page, l->reg, attr->class,
963 						attr->update || l->update,
964 						false);
965 			if (!curr)
966 				return -ENOMEM;
967 			if (l->sbit && (info->func[page] & attr->sfunc)) {
968 				ret = pmbus_add_boolean(data, name,
969 					l->alarm, index,
970 					attr->compare ?  l->low ? curr : base
971 						      : NULL,
972 					attr->compare ? l->low ? base : curr
973 						      : NULL,
974 					attr->sbase + page, l->sbit);
975 				if (ret)
976 					return ret;
977 				have_alarm = 1;
978 			}
979 		}
980 		l++;
981 	}
982 	return have_alarm;
983 }
984 
pmbus_add_sensor_attrs_one(struct i2c_client * client,struct pmbus_data * data,const struct pmbus_driver_info * info,const char * name,int index,int page,const struct pmbus_sensor_attr * attr)985 static int pmbus_add_sensor_attrs_one(struct i2c_client *client,
986 				      struct pmbus_data *data,
987 				      const struct pmbus_driver_info *info,
988 				      const char *name,
989 				      int index, int page,
990 				      const struct pmbus_sensor_attr *attr)
991 {
992 	struct pmbus_sensor *base;
993 	int ret;
994 
995 	if (attr->label) {
996 		ret = pmbus_add_label(data, name, index, attr->label,
997 				      attr->paged ? page + 1 : 0);
998 		if (ret)
999 			return ret;
1000 	}
1001 	base = pmbus_add_sensor(data, name, "input", index, page, attr->reg,
1002 				attr->class, true, true);
1003 	if (!base)
1004 		return -ENOMEM;
1005 	if (attr->sfunc) {
1006 		ret = pmbus_add_limit_attrs(client, data, info, name,
1007 					    index, page, base, attr);
1008 		if (ret < 0)
1009 			return ret;
1010 		/*
1011 		 * Add generic alarm attribute only if there are no individual
1012 		 * alarm attributes, if there is a global alarm bit, and if
1013 		 * the generic status register for this page is accessible.
1014 		 */
1015 		if (!ret && attr->gbit &&
1016 		    pmbus_check_byte_register(client, page,
1017 					      data->status_register)) {
1018 			ret = pmbus_add_boolean(data, name, "alarm", index,
1019 						NULL, NULL,
1020 						PB_STATUS_BASE + page,
1021 						attr->gbit);
1022 			if (ret)
1023 				return ret;
1024 		}
1025 	}
1026 	return 0;
1027 }
1028 
pmbus_add_sensor_attrs(struct i2c_client * client,struct pmbus_data * data,const char * name,const struct pmbus_sensor_attr * attrs,int nattrs)1029 static int pmbus_add_sensor_attrs(struct i2c_client *client,
1030 				  struct pmbus_data *data,
1031 				  const char *name,
1032 				  const struct pmbus_sensor_attr *attrs,
1033 				  int nattrs)
1034 {
1035 	const struct pmbus_driver_info *info = data->info;
1036 	int index, i;
1037 	int ret;
1038 
1039 	index = 1;
1040 	for (i = 0; i < nattrs; i++) {
1041 		int page, pages;
1042 
1043 		pages = attrs->paged ? info->pages : 1;
1044 		for (page = 0; page < pages; page++) {
1045 			if (!(info->func[page] & attrs->func))
1046 				continue;
1047 			ret = pmbus_add_sensor_attrs_one(client, data, info,
1048 							 name, index, page,
1049 							 attrs);
1050 			if (ret)
1051 				return ret;
1052 			index++;
1053 		}
1054 		attrs++;
1055 	}
1056 	return 0;
1057 }
1058 
1059 static const struct pmbus_limit_attr vin_limit_attrs[] = {
1060 	{
1061 		.reg = PMBUS_VIN_UV_WARN_LIMIT,
1062 		.attr = "min",
1063 		.alarm = "min_alarm",
1064 		.sbit = PB_VOLTAGE_UV_WARNING,
1065 	}, {
1066 		.reg = PMBUS_VIN_UV_FAULT_LIMIT,
1067 		.attr = "lcrit",
1068 		.alarm = "lcrit_alarm",
1069 		.sbit = PB_VOLTAGE_UV_FAULT,
1070 	}, {
1071 		.reg = PMBUS_VIN_OV_WARN_LIMIT,
1072 		.attr = "max",
1073 		.alarm = "max_alarm",
1074 		.sbit = PB_VOLTAGE_OV_WARNING,
1075 	}, {
1076 		.reg = PMBUS_VIN_OV_FAULT_LIMIT,
1077 		.attr = "crit",
1078 		.alarm = "crit_alarm",
1079 		.sbit = PB_VOLTAGE_OV_FAULT,
1080 	}, {
1081 		.reg = PMBUS_VIRT_READ_VIN_AVG,
1082 		.update = true,
1083 		.attr = "average",
1084 	}, {
1085 		.reg = PMBUS_VIRT_READ_VIN_MIN,
1086 		.update = true,
1087 		.attr = "lowest",
1088 	}, {
1089 		.reg = PMBUS_VIRT_READ_VIN_MAX,
1090 		.update = true,
1091 		.attr = "highest",
1092 	}, {
1093 		.reg = PMBUS_VIRT_RESET_VIN_HISTORY,
1094 		.attr = "reset_history",
1095 	},
1096 };
1097 
1098 static const struct pmbus_limit_attr vmon_limit_attrs[] = {
1099 	{
1100 		.reg = PMBUS_VIRT_VMON_UV_WARN_LIMIT,
1101 		.attr = "min",
1102 		.alarm = "min_alarm",
1103 		.sbit = PB_VOLTAGE_UV_WARNING,
1104 	}, {
1105 		.reg = PMBUS_VIRT_VMON_UV_FAULT_LIMIT,
1106 		.attr = "lcrit",
1107 		.alarm = "lcrit_alarm",
1108 		.sbit = PB_VOLTAGE_UV_FAULT,
1109 	}, {
1110 		.reg = PMBUS_VIRT_VMON_OV_WARN_LIMIT,
1111 		.attr = "max",
1112 		.alarm = "max_alarm",
1113 		.sbit = PB_VOLTAGE_OV_WARNING,
1114 	}, {
1115 		.reg = PMBUS_VIRT_VMON_OV_FAULT_LIMIT,
1116 		.attr = "crit",
1117 		.alarm = "crit_alarm",
1118 		.sbit = PB_VOLTAGE_OV_FAULT,
1119 	}
1120 };
1121 
1122 static const struct pmbus_limit_attr vout_limit_attrs[] = {
1123 	{
1124 		.reg = PMBUS_VOUT_UV_WARN_LIMIT,
1125 		.attr = "min",
1126 		.alarm = "min_alarm",
1127 		.sbit = PB_VOLTAGE_UV_WARNING,
1128 	}, {
1129 		.reg = PMBUS_VOUT_UV_FAULT_LIMIT,
1130 		.attr = "lcrit",
1131 		.alarm = "lcrit_alarm",
1132 		.sbit = PB_VOLTAGE_UV_FAULT,
1133 	}, {
1134 		.reg = PMBUS_VOUT_OV_WARN_LIMIT,
1135 		.attr = "max",
1136 		.alarm = "max_alarm",
1137 		.sbit = PB_VOLTAGE_OV_WARNING,
1138 	}, {
1139 		.reg = PMBUS_VOUT_OV_FAULT_LIMIT,
1140 		.attr = "crit",
1141 		.alarm = "crit_alarm",
1142 		.sbit = PB_VOLTAGE_OV_FAULT,
1143 	}, {
1144 		.reg = PMBUS_VIRT_READ_VOUT_AVG,
1145 		.update = true,
1146 		.attr = "average",
1147 	}, {
1148 		.reg = PMBUS_VIRT_READ_VOUT_MIN,
1149 		.update = true,
1150 		.attr = "lowest",
1151 	}, {
1152 		.reg = PMBUS_VIRT_READ_VOUT_MAX,
1153 		.update = true,
1154 		.attr = "highest",
1155 	}, {
1156 		.reg = PMBUS_VIRT_RESET_VOUT_HISTORY,
1157 		.attr = "reset_history",
1158 	}
1159 };
1160 
1161 static const struct pmbus_sensor_attr voltage_attributes[] = {
1162 	{
1163 		.reg = PMBUS_READ_VIN,
1164 		.class = PSC_VOLTAGE_IN,
1165 		.label = "vin",
1166 		.func = PMBUS_HAVE_VIN,
1167 		.sfunc = PMBUS_HAVE_STATUS_INPUT,
1168 		.sbase = PB_STATUS_INPUT_BASE,
1169 		.gbit = PB_STATUS_VIN_UV,
1170 		.limit = vin_limit_attrs,
1171 		.nlimit = ARRAY_SIZE(vin_limit_attrs),
1172 	}, {
1173 		.reg = PMBUS_VIRT_READ_VMON,
1174 		.class = PSC_VOLTAGE_IN,
1175 		.label = "vmon",
1176 		.func = PMBUS_HAVE_VMON,
1177 		.sfunc = PMBUS_HAVE_STATUS_VMON,
1178 		.sbase = PB_STATUS_VMON_BASE,
1179 		.limit = vmon_limit_attrs,
1180 		.nlimit = ARRAY_SIZE(vmon_limit_attrs),
1181 	}, {
1182 		.reg = PMBUS_READ_VCAP,
1183 		.class = PSC_VOLTAGE_IN,
1184 		.label = "vcap",
1185 		.func = PMBUS_HAVE_VCAP,
1186 	}, {
1187 		.reg = PMBUS_READ_VOUT,
1188 		.class = PSC_VOLTAGE_OUT,
1189 		.label = "vout",
1190 		.paged = true,
1191 		.func = PMBUS_HAVE_VOUT,
1192 		.sfunc = PMBUS_HAVE_STATUS_VOUT,
1193 		.sbase = PB_STATUS_VOUT_BASE,
1194 		.gbit = PB_STATUS_VOUT_OV,
1195 		.limit = vout_limit_attrs,
1196 		.nlimit = ARRAY_SIZE(vout_limit_attrs),
1197 	}
1198 };
1199 
1200 /* Current attributes */
1201 
1202 static const struct pmbus_limit_attr iin_limit_attrs[] = {
1203 	{
1204 		.reg = PMBUS_IIN_OC_WARN_LIMIT,
1205 		.attr = "max",
1206 		.alarm = "max_alarm",
1207 		.sbit = PB_IIN_OC_WARNING,
1208 	}, {
1209 		.reg = PMBUS_IIN_OC_FAULT_LIMIT,
1210 		.attr = "crit",
1211 		.alarm = "crit_alarm",
1212 		.sbit = PB_IIN_OC_FAULT,
1213 	}, {
1214 		.reg = PMBUS_VIRT_READ_IIN_AVG,
1215 		.update = true,
1216 		.attr = "average",
1217 	}, {
1218 		.reg = PMBUS_VIRT_READ_IIN_MIN,
1219 		.update = true,
1220 		.attr = "lowest",
1221 	}, {
1222 		.reg = PMBUS_VIRT_READ_IIN_MAX,
1223 		.update = true,
1224 		.attr = "highest",
1225 	}, {
1226 		.reg = PMBUS_VIRT_RESET_IIN_HISTORY,
1227 		.attr = "reset_history",
1228 	}
1229 };
1230 
1231 static const struct pmbus_limit_attr iout_limit_attrs[] = {
1232 	{
1233 		.reg = PMBUS_IOUT_OC_WARN_LIMIT,
1234 		.attr = "max",
1235 		.alarm = "max_alarm",
1236 		.sbit = PB_IOUT_OC_WARNING,
1237 	}, {
1238 		.reg = PMBUS_IOUT_UC_FAULT_LIMIT,
1239 		.attr = "lcrit",
1240 		.alarm = "lcrit_alarm",
1241 		.sbit = PB_IOUT_UC_FAULT,
1242 	}, {
1243 		.reg = PMBUS_IOUT_OC_FAULT_LIMIT,
1244 		.attr = "crit",
1245 		.alarm = "crit_alarm",
1246 		.sbit = PB_IOUT_OC_FAULT,
1247 	}, {
1248 		.reg = PMBUS_VIRT_READ_IOUT_AVG,
1249 		.update = true,
1250 		.attr = "average",
1251 	}, {
1252 		.reg = PMBUS_VIRT_READ_IOUT_MIN,
1253 		.update = true,
1254 		.attr = "lowest",
1255 	}, {
1256 		.reg = PMBUS_VIRT_READ_IOUT_MAX,
1257 		.update = true,
1258 		.attr = "highest",
1259 	}, {
1260 		.reg = PMBUS_VIRT_RESET_IOUT_HISTORY,
1261 		.attr = "reset_history",
1262 	}
1263 };
1264 
1265 static const struct pmbus_sensor_attr current_attributes[] = {
1266 	{
1267 		.reg = PMBUS_READ_IIN,
1268 		.class = PSC_CURRENT_IN,
1269 		.label = "iin",
1270 		.func = PMBUS_HAVE_IIN,
1271 		.sfunc = PMBUS_HAVE_STATUS_INPUT,
1272 		.sbase = PB_STATUS_INPUT_BASE,
1273 		.limit = iin_limit_attrs,
1274 		.nlimit = ARRAY_SIZE(iin_limit_attrs),
1275 	}, {
1276 		.reg = PMBUS_READ_IOUT,
1277 		.class = PSC_CURRENT_OUT,
1278 		.label = "iout",
1279 		.paged = true,
1280 		.func = PMBUS_HAVE_IOUT,
1281 		.sfunc = PMBUS_HAVE_STATUS_IOUT,
1282 		.sbase = PB_STATUS_IOUT_BASE,
1283 		.gbit = PB_STATUS_IOUT_OC,
1284 		.limit = iout_limit_attrs,
1285 		.nlimit = ARRAY_SIZE(iout_limit_attrs),
1286 	}
1287 };
1288 
1289 /* Power attributes */
1290 
1291 static const struct pmbus_limit_attr pin_limit_attrs[] = {
1292 	{
1293 		.reg = PMBUS_PIN_OP_WARN_LIMIT,
1294 		.attr = "max",
1295 		.alarm = "alarm",
1296 		.sbit = PB_PIN_OP_WARNING,
1297 	}, {
1298 		.reg = PMBUS_VIRT_READ_PIN_AVG,
1299 		.update = true,
1300 		.attr = "average",
1301 	}, {
1302 		.reg = PMBUS_VIRT_READ_PIN_MAX,
1303 		.update = true,
1304 		.attr = "input_highest",
1305 	}, {
1306 		.reg = PMBUS_VIRT_RESET_PIN_HISTORY,
1307 		.attr = "reset_history",
1308 	}
1309 };
1310 
1311 static const struct pmbus_limit_attr pout_limit_attrs[] = {
1312 	{
1313 		.reg = PMBUS_POUT_MAX,
1314 		.attr = "cap",
1315 		.alarm = "cap_alarm",
1316 		.sbit = PB_POWER_LIMITING,
1317 	}, {
1318 		.reg = PMBUS_POUT_OP_WARN_LIMIT,
1319 		.attr = "max",
1320 		.alarm = "max_alarm",
1321 		.sbit = PB_POUT_OP_WARNING,
1322 	}, {
1323 		.reg = PMBUS_POUT_OP_FAULT_LIMIT,
1324 		.attr = "crit",
1325 		.alarm = "crit_alarm",
1326 		.sbit = PB_POUT_OP_FAULT,
1327 	}, {
1328 		.reg = PMBUS_VIRT_READ_POUT_AVG,
1329 		.update = true,
1330 		.attr = "average",
1331 	}, {
1332 		.reg = PMBUS_VIRT_READ_POUT_MAX,
1333 		.update = true,
1334 		.attr = "input_highest",
1335 	}, {
1336 		.reg = PMBUS_VIRT_RESET_POUT_HISTORY,
1337 		.attr = "reset_history",
1338 	}
1339 };
1340 
1341 static const struct pmbus_sensor_attr power_attributes[] = {
1342 	{
1343 		.reg = PMBUS_READ_PIN,
1344 		.class = PSC_POWER,
1345 		.label = "pin",
1346 		.func = PMBUS_HAVE_PIN,
1347 		.sfunc = PMBUS_HAVE_STATUS_INPUT,
1348 		.sbase = PB_STATUS_INPUT_BASE,
1349 		.limit = pin_limit_attrs,
1350 		.nlimit = ARRAY_SIZE(pin_limit_attrs),
1351 	}, {
1352 		.reg = PMBUS_READ_POUT,
1353 		.class = PSC_POWER,
1354 		.label = "pout",
1355 		.paged = true,
1356 		.func = PMBUS_HAVE_POUT,
1357 		.sfunc = PMBUS_HAVE_STATUS_IOUT,
1358 		.sbase = PB_STATUS_IOUT_BASE,
1359 		.limit = pout_limit_attrs,
1360 		.nlimit = ARRAY_SIZE(pout_limit_attrs),
1361 	}
1362 };
1363 
1364 /* Temperature atributes */
1365 
1366 static const struct pmbus_limit_attr temp_limit_attrs[] = {
1367 	{
1368 		.reg = PMBUS_UT_WARN_LIMIT,
1369 		.low = true,
1370 		.attr = "min",
1371 		.alarm = "min_alarm",
1372 		.sbit = PB_TEMP_UT_WARNING,
1373 	}, {
1374 		.reg = PMBUS_UT_FAULT_LIMIT,
1375 		.low = true,
1376 		.attr = "lcrit",
1377 		.alarm = "lcrit_alarm",
1378 		.sbit = PB_TEMP_UT_FAULT,
1379 	}, {
1380 		.reg = PMBUS_OT_WARN_LIMIT,
1381 		.attr = "max",
1382 		.alarm = "max_alarm",
1383 		.sbit = PB_TEMP_OT_WARNING,
1384 	}, {
1385 		.reg = PMBUS_OT_FAULT_LIMIT,
1386 		.attr = "crit",
1387 		.alarm = "crit_alarm",
1388 		.sbit = PB_TEMP_OT_FAULT,
1389 	}, {
1390 		.reg = PMBUS_VIRT_READ_TEMP_MIN,
1391 		.attr = "lowest",
1392 	}, {
1393 		.reg = PMBUS_VIRT_READ_TEMP_AVG,
1394 		.attr = "average",
1395 	}, {
1396 		.reg = PMBUS_VIRT_READ_TEMP_MAX,
1397 		.attr = "highest",
1398 	}, {
1399 		.reg = PMBUS_VIRT_RESET_TEMP_HISTORY,
1400 		.attr = "reset_history",
1401 	}
1402 };
1403 
1404 static const struct pmbus_limit_attr temp_limit_attrs2[] = {
1405 	{
1406 		.reg = PMBUS_UT_WARN_LIMIT,
1407 		.low = true,
1408 		.attr = "min",
1409 		.alarm = "min_alarm",
1410 		.sbit = PB_TEMP_UT_WARNING,
1411 	}, {
1412 		.reg = PMBUS_UT_FAULT_LIMIT,
1413 		.low = true,
1414 		.attr = "lcrit",
1415 		.alarm = "lcrit_alarm",
1416 		.sbit = PB_TEMP_UT_FAULT,
1417 	}, {
1418 		.reg = PMBUS_OT_WARN_LIMIT,
1419 		.attr = "max",
1420 		.alarm = "max_alarm",
1421 		.sbit = PB_TEMP_OT_WARNING,
1422 	}, {
1423 		.reg = PMBUS_OT_FAULT_LIMIT,
1424 		.attr = "crit",
1425 		.alarm = "crit_alarm",
1426 		.sbit = PB_TEMP_OT_FAULT,
1427 	}, {
1428 		.reg = PMBUS_VIRT_READ_TEMP2_MIN,
1429 		.attr = "lowest",
1430 	}, {
1431 		.reg = PMBUS_VIRT_READ_TEMP2_AVG,
1432 		.attr = "average",
1433 	}, {
1434 		.reg = PMBUS_VIRT_READ_TEMP2_MAX,
1435 		.attr = "highest",
1436 	}, {
1437 		.reg = PMBUS_VIRT_RESET_TEMP2_HISTORY,
1438 		.attr = "reset_history",
1439 	}
1440 };
1441 
1442 static const struct pmbus_limit_attr temp_limit_attrs3[] = {
1443 	{
1444 		.reg = PMBUS_UT_WARN_LIMIT,
1445 		.low = true,
1446 		.attr = "min",
1447 		.alarm = "min_alarm",
1448 		.sbit = PB_TEMP_UT_WARNING,
1449 	}, {
1450 		.reg = PMBUS_UT_FAULT_LIMIT,
1451 		.low = true,
1452 		.attr = "lcrit",
1453 		.alarm = "lcrit_alarm",
1454 		.sbit = PB_TEMP_UT_FAULT,
1455 	}, {
1456 		.reg = PMBUS_OT_WARN_LIMIT,
1457 		.attr = "max",
1458 		.alarm = "max_alarm",
1459 		.sbit = PB_TEMP_OT_WARNING,
1460 	}, {
1461 		.reg = PMBUS_OT_FAULT_LIMIT,
1462 		.attr = "crit",
1463 		.alarm = "crit_alarm",
1464 		.sbit = PB_TEMP_OT_FAULT,
1465 	}
1466 };
1467 
1468 static const struct pmbus_sensor_attr temp_attributes[] = {
1469 	{
1470 		.reg = PMBUS_READ_TEMPERATURE_1,
1471 		.class = PSC_TEMPERATURE,
1472 		.paged = true,
1473 		.update = true,
1474 		.compare = true,
1475 		.func = PMBUS_HAVE_TEMP,
1476 		.sfunc = PMBUS_HAVE_STATUS_TEMP,
1477 		.sbase = PB_STATUS_TEMP_BASE,
1478 		.gbit = PB_STATUS_TEMPERATURE,
1479 		.limit = temp_limit_attrs,
1480 		.nlimit = ARRAY_SIZE(temp_limit_attrs),
1481 	}, {
1482 		.reg = PMBUS_READ_TEMPERATURE_2,
1483 		.class = PSC_TEMPERATURE,
1484 		.paged = true,
1485 		.update = true,
1486 		.compare = true,
1487 		.func = PMBUS_HAVE_TEMP2,
1488 		.sfunc = PMBUS_HAVE_STATUS_TEMP,
1489 		.sbase = PB_STATUS_TEMP_BASE,
1490 		.gbit = PB_STATUS_TEMPERATURE,
1491 		.limit = temp_limit_attrs2,
1492 		.nlimit = ARRAY_SIZE(temp_limit_attrs2),
1493 	}, {
1494 		.reg = PMBUS_READ_TEMPERATURE_3,
1495 		.class = PSC_TEMPERATURE,
1496 		.paged = true,
1497 		.update = true,
1498 		.compare = true,
1499 		.func = PMBUS_HAVE_TEMP3,
1500 		.sfunc = PMBUS_HAVE_STATUS_TEMP,
1501 		.sbase = PB_STATUS_TEMP_BASE,
1502 		.gbit = PB_STATUS_TEMPERATURE,
1503 		.limit = temp_limit_attrs3,
1504 		.nlimit = ARRAY_SIZE(temp_limit_attrs3),
1505 	}
1506 };
1507 
1508 static const int pmbus_fan_registers[] = {
1509 	PMBUS_READ_FAN_SPEED_1,
1510 	PMBUS_READ_FAN_SPEED_2,
1511 	PMBUS_READ_FAN_SPEED_3,
1512 	PMBUS_READ_FAN_SPEED_4
1513 };
1514 
1515 static const int pmbus_fan_config_registers[] = {
1516 	PMBUS_FAN_CONFIG_12,
1517 	PMBUS_FAN_CONFIG_12,
1518 	PMBUS_FAN_CONFIG_34,
1519 	PMBUS_FAN_CONFIG_34
1520 };
1521 
1522 static const int pmbus_fan_status_registers[] = {
1523 	PMBUS_STATUS_FAN_12,
1524 	PMBUS_STATUS_FAN_12,
1525 	PMBUS_STATUS_FAN_34,
1526 	PMBUS_STATUS_FAN_34
1527 };
1528 
1529 static const u32 pmbus_fan_flags[] = {
1530 	PMBUS_HAVE_FAN12,
1531 	PMBUS_HAVE_FAN12,
1532 	PMBUS_HAVE_FAN34,
1533 	PMBUS_HAVE_FAN34
1534 };
1535 
1536 static const u32 pmbus_fan_status_flags[] = {
1537 	PMBUS_HAVE_STATUS_FAN12,
1538 	PMBUS_HAVE_STATUS_FAN12,
1539 	PMBUS_HAVE_STATUS_FAN34,
1540 	PMBUS_HAVE_STATUS_FAN34
1541 };
1542 
1543 /* Fans */
pmbus_add_fan_attributes(struct i2c_client * client,struct pmbus_data * data)1544 static int pmbus_add_fan_attributes(struct i2c_client *client,
1545 				    struct pmbus_data *data)
1546 {
1547 	const struct pmbus_driver_info *info = data->info;
1548 	int index = 1;
1549 	int page;
1550 	int ret;
1551 
1552 	for (page = 0; page < info->pages; page++) {
1553 		int f;
1554 
1555 		for (f = 0; f < ARRAY_SIZE(pmbus_fan_registers); f++) {
1556 			int regval;
1557 
1558 			if (!(info->func[page] & pmbus_fan_flags[f]))
1559 				break;
1560 
1561 			if (!pmbus_check_word_register(client, page,
1562 						       pmbus_fan_registers[f]))
1563 				break;
1564 
1565 			/*
1566 			 * Skip fan if not installed.
1567 			 * Each fan configuration register covers multiple fans,
1568 			 * so we have to do some magic.
1569 			 */
1570 			regval = _pmbus_read_byte_data(client, page,
1571 				pmbus_fan_config_registers[f]);
1572 			if (regval < 0 ||
1573 			    (!(regval & (PB_FAN_1_INSTALLED >> ((f & 1) * 4)))))
1574 				continue;
1575 
1576 			if (pmbus_add_sensor(data, "fan", "input", index,
1577 					     page, pmbus_fan_registers[f],
1578 					     PSC_FAN, true, true) == NULL)
1579 				return -ENOMEM;
1580 
1581 			/*
1582 			 * Each fan status register covers multiple fans,
1583 			 * so we have to do some magic.
1584 			 */
1585 			if ((info->func[page] & pmbus_fan_status_flags[f]) &&
1586 			    pmbus_check_byte_register(client,
1587 					page, pmbus_fan_status_registers[f])) {
1588 				int base;
1589 
1590 				if (f > 1)	/* fan 3, 4 */
1591 					base = PB_STATUS_FAN34_BASE + page;
1592 				else
1593 					base = PB_STATUS_FAN_BASE + page;
1594 				ret = pmbus_add_boolean(data, "fan",
1595 					"alarm", index, NULL, NULL, base,
1596 					PB_FAN_FAN1_WARNING >> (f & 1));
1597 				if (ret)
1598 					return ret;
1599 				ret = pmbus_add_boolean(data, "fan",
1600 					"fault", index, NULL, NULL, base,
1601 					PB_FAN_FAN1_FAULT >> (f & 1));
1602 				if (ret)
1603 					return ret;
1604 			}
1605 			index++;
1606 		}
1607 	}
1608 	return 0;
1609 }
1610 
pmbus_find_attributes(struct i2c_client * client,struct pmbus_data * data)1611 static int pmbus_find_attributes(struct i2c_client *client,
1612 				 struct pmbus_data *data)
1613 {
1614 	int ret;
1615 
1616 	/* Voltage sensors */
1617 	ret = pmbus_add_sensor_attrs(client, data, "in", voltage_attributes,
1618 				     ARRAY_SIZE(voltage_attributes));
1619 	if (ret)
1620 		return ret;
1621 
1622 	/* Current sensors */
1623 	ret = pmbus_add_sensor_attrs(client, data, "curr", current_attributes,
1624 				     ARRAY_SIZE(current_attributes));
1625 	if (ret)
1626 		return ret;
1627 
1628 	/* Power sensors */
1629 	ret = pmbus_add_sensor_attrs(client, data, "power", power_attributes,
1630 				     ARRAY_SIZE(power_attributes));
1631 	if (ret)
1632 		return ret;
1633 
1634 	/* Temperature sensors */
1635 	ret = pmbus_add_sensor_attrs(client, data, "temp", temp_attributes,
1636 				     ARRAY_SIZE(temp_attributes));
1637 	if (ret)
1638 		return ret;
1639 
1640 	/* Fans */
1641 	ret = pmbus_add_fan_attributes(client, data);
1642 	return ret;
1643 }
1644 
1645 /*
1646  * Identify chip parameters.
1647  * This function is called for all chips.
1648  */
pmbus_identify_common(struct i2c_client * client,struct pmbus_data * data,int page)1649 static int pmbus_identify_common(struct i2c_client *client,
1650 				 struct pmbus_data *data, int page)
1651 {
1652 	int vout_mode = -1;
1653 
1654 	if (pmbus_check_byte_register(client, page, PMBUS_VOUT_MODE))
1655 		vout_mode = _pmbus_read_byte_data(client, page,
1656 						  PMBUS_VOUT_MODE);
1657 	if (vout_mode >= 0 && vout_mode != 0xff) {
1658 		/*
1659 		 * Not all chips support the VOUT_MODE command,
1660 		 * so a failure to read it is not an error.
1661 		 */
1662 		switch (vout_mode >> 5) {
1663 		case 0:	/* linear mode      */
1664 			if (data->info->format[PSC_VOLTAGE_OUT] != linear)
1665 				return -ENODEV;
1666 
1667 			data->exponent[page] = ((s8)(vout_mode << 3)) >> 3;
1668 			break;
1669 		case 1: /* VID mode         */
1670 			if (data->info->format[PSC_VOLTAGE_OUT] != vid)
1671 				return -ENODEV;
1672 			break;
1673 		case 2:	/* direct mode      */
1674 			if (data->info->format[PSC_VOLTAGE_OUT] != direct)
1675 				return -ENODEV;
1676 			break;
1677 		default:
1678 			return -ENODEV;
1679 		}
1680 	}
1681 
1682 	pmbus_clear_fault_page(client, page);
1683 	return 0;
1684 }
1685 
pmbus_init_common(struct i2c_client * client,struct pmbus_data * data,struct pmbus_driver_info * info)1686 static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
1687 			     struct pmbus_driver_info *info)
1688 {
1689 	struct device *dev = &client->dev;
1690 	int page, ret;
1691 
1692 	/*
1693 	 * Some PMBus chips don't support PMBUS_STATUS_BYTE, so try
1694 	 * to use PMBUS_STATUS_WORD instead if that is the case.
1695 	 * Bail out if both registers are not supported.
1696 	 */
1697 	data->status_register = PMBUS_STATUS_BYTE;
1698 	ret = i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE);
1699 	if (ret < 0 || ret == 0xff) {
1700 		data->status_register = PMBUS_STATUS_WORD;
1701 		ret = i2c_smbus_read_word_data(client, PMBUS_STATUS_WORD);
1702 		if (ret < 0 || ret == 0xffff) {
1703 			dev_err(dev, "PMBus status register not found\n");
1704 			return -ENODEV;
1705 		}
1706 	}
1707 
1708 	pmbus_clear_faults(client);
1709 
1710 	if (info->identify) {
1711 		ret = (*info->identify)(client, info);
1712 		if (ret < 0) {
1713 			dev_err(dev, "Chip identification failed\n");
1714 			return ret;
1715 		}
1716 	}
1717 
1718 	if (info->pages <= 0 || info->pages > PMBUS_PAGES) {
1719 		dev_err(dev, "Bad number of PMBus pages: %d\n", info->pages);
1720 		return -ENODEV;
1721 	}
1722 
1723 	for (page = 0; page < info->pages; page++) {
1724 		ret = pmbus_identify_common(client, data, page);
1725 		if (ret < 0) {
1726 			dev_err(dev, "Failed to identify chip capabilities\n");
1727 			return ret;
1728 		}
1729 	}
1730 	return 0;
1731 }
1732 
pmbus_do_probe(struct i2c_client * client,const struct i2c_device_id * id,struct pmbus_driver_info * info)1733 int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
1734 		   struct pmbus_driver_info *info)
1735 {
1736 	struct device *dev = &client->dev;
1737 	const struct pmbus_platform_data *pdata = dev_get_platdata(dev);
1738 	struct pmbus_data *data;
1739 	int ret;
1740 
1741 	if (!info)
1742 		return -ENODEV;
1743 
1744 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE
1745 				     | I2C_FUNC_SMBUS_BYTE_DATA
1746 				     | I2C_FUNC_SMBUS_WORD_DATA))
1747 		return -ENODEV;
1748 
1749 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
1750 	if (!data)
1751 		return -ENOMEM;
1752 
1753 	i2c_set_clientdata(client, data);
1754 	mutex_init(&data->update_lock);
1755 	data->dev = dev;
1756 
1757 	if (pdata)
1758 		data->flags = pdata->flags;
1759 	data->info = info;
1760 
1761 	ret = pmbus_init_common(client, data, info);
1762 	if (ret < 0)
1763 		return ret;
1764 
1765 	ret = pmbus_find_attributes(client, data);
1766 	if (ret)
1767 		goto out_kfree;
1768 
1769 	/*
1770 	 * If there are no attributes, something is wrong.
1771 	 * Bail out instead of trying to register nothing.
1772 	 */
1773 	if (!data->num_attributes) {
1774 		dev_err(dev, "No attributes found\n");
1775 		ret = -ENODEV;
1776 		goto out_kfree;
1777 	}
1778 
1779 	data->groups[0] = &data->group;
1780 	data->hwmon_dev = hwmon_device_register_with_groups(dev, client->name,
1781 							    data, data->groups);
1782 	if (IS_ERR(data->hwmon_dev)) {
1783 		ret = PTR_ERR(data->hwmon_dev);
1784 		dev_err(dev, "Failed to register hwmon device\n");
1785 		goto out_kfree;
1786 	}
1787 	return 0;
1788 
1789 out_kfree:
1790 	kfree(data->group.attrs);
1791 	return ret;
1792 }
1793 EXPORT_SYMBOL_GPL(pmbus_do_probe);
1794 
pmbus_do_remove(struct i2c_client * client)1795 int pmbus_do_remove(struct i2c_client *client)
1796 {
1797 	struct pmbus_data *data = i2c_get_clientdata(client);
1798 	hwmon_device_unregister(data->hwmon_dev);
1799 	kfree(data->group.attrs);
1800 	return 0;
1801 }
1802 EXPORT_SYMBOL_GPL(pmbus_do_remove);
1803 
1804 MODULE_AUTHOR("Guenter Roeck");
1805 MODULE_DESCRIPTION("PMBus core driver");
1806 MODULE_LICENSE("GPL");
1807