aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorGuenter Roeck <guenter.roeck@ericsson.com>2011-02-02 11:49:54 -0500
committerGuenter Roeck <guenter.roeck@ericsson.com>2011-05-19 11:19:36 -0400
commitf5bae2642e3df716d2bb7bcffdf51e7a286e885e (patch)
tree0490217307f30f8d0d92dc4f004982dfaa8fbc5b /drivers/hwmon
parent82c7465b4dd013d19858bfeac084849ae17682c0 (diff)
hwmon: Driver for MAX16065 System Manager and compatibles
This patch adds hardware monitoring support for Maxim MAX16065, MAX16066, MAX16067, MAX16068, MAX16070, and MAX16071 flash-configurable system managers with nonvolatile fault registers. Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com> Reviewed-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/Kconfig16
-rw-r--r--drivers/hwmon/Makefile1
-rw-r--r--drivers/hwmon/max16065.c717
3 files changed, 734 insertions, 0 deletions
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index f2d48777c508..dff080d7a388 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -708,6 +708,22 @@ config SENSORS_MAX1111
708 This driver can also be built as a module. If so, the module 708 This driver can also be built as a module. If so, the module
709 will be called max1111. 709 will be called max1111.
710 710
711config SENSORS_MAX16065
712 tristate "Maxim MAX16065 System Manager and compatibles"
713 depends on I2C
714 help
715 If you say yes here you get support for hardware monitoring
716 capabilities of the following Maxim System Manager chips.
717 MAX16065
718 MAX16066
719 MAX16067
720 MAX16068
721 MAX16070
722 MAX16071
723
724 This driver can also be built as a module. If so, the module
725 will be called max16065.
726
711config SENSORS_MAX1619 727config SENSORS_MAX1619
712 tristate "Maxim MAX1619 sensor chip" 728 tristate "Maxim MAX1619 sensor chip"
713 depends on I2C 729 depends on I2C
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 2211752d73b6..465f1c819fd9 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -83,6 +83,7 @@ obj-$(CONFIG_SENSORS_LTC4215) += ltc4215.o
83obj-$(CONFIG_SENSORS_LTC4245) += ltc4245.o 83obj-$(CONFIG_SENSORS_LTC4245) += ltc4245.o
84obj-$(CONFIG_SENSORS_LTC4261) += ltc4261.o 84obj-$(CONFIG_SENSORS_LTC4261) += ltc4261.o
85obj-$(CONFIG_SENSORS_MAX1111) += max1111.o 85obj-$(CONFIG_SENSORS_MAX1111) += max1111.o
86obj-$(CONFIG_SENSORS_MAX16065) += max16065.o
86obj-$(CONFIG_SENSORS_MAX1619) += max1619.o 87obj-$(CONFIG_SENSORS_MAX1619) += max1619.o
87obj-$(CONFIG_SENSORS_MAX6639) += max6639.o 88obj-$(CONFIG_SENSORS_MAX6639) += max6639.o
88obj-$(CONFIG_SENSORS_MAX6642) += max6642.o 89obj-$(CONFIG_SENSORS_MAX6642) += max6642.o
diff --git a/drivers/hwmon/max16065.c b/drivers/hwmon/max16065.c
new file mode 100644
index 000000000000..d94a24fdf4ba
--- /dev/null
+++ b/drivers/hwmon/max16065.c
@@ -0,0 +1,717 @@
1/*
2 * Driver for
3 * Maxim MAX16065/MAX16066 12-Channel/8-Channel, Flash-Configurable
4 * System Managers with Nonvolatile Fault Registers
5 * Maxim MAX16067/MAX16068 6-Channel, Flash-Configurable System Managers
6 * with Nonvolatile Fault Registers
7 * Maxim MAX16070/MAX16071 12-Channel/8-Channel, Flash-Configurable System
8 * Monitors with Nonvolatile Fault Registers
9 *
10 * Copyright (C) 2011 Ericsson AB.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; version 2 of the License.
15 */
16
17#include <linux/kernel.h>
18#include <linux/module.h>
19#include <linux/init.h>
20#include <linux/err.h>
21#include <linux/slab.h>
22#include <linux/i2c.h>
23#include <linux/hwmon.h>
24#include <linux/hwmon-sysfs.h>
25#include <linux/delay.h>
26#include <linux/jiffies.h>
27
28enum chips { max16065, max16066, max16067, max16068, max16070, max16071 };
29
30/*
31 * Registers
32 */
33#define MAX16065_ADC(x) ((x) * 2)
34
35#define MAX16065_CURR_SENSE 0x18
36#define MAX16065_CSP_ADC 0x19
37#define MAX16065_FAULT(x) (0x1b + (x))
38#define MAX16065_SCALE(x) (0x43 + (x))
39#define MAX16065_CURR_CONTROL 0x47
40#define MAX16065_LIMIT(l, x) (0x48 + (l) + (x) * 3) /*
41 * l: limit
42 * 0: min/max
43 * 1: crit
44 * 2: lcrit
45 * x: ADC index
46 */
47
48#define MAX16065_SW_ENABLE 0x73
49
50#define MAX16065_WARNING_OV (1 << 3) /* Set if secondary threshold is OV
51 warning */
52
53#define MAX16065_CURR_ENABLE (1 << 0)
54
55#define MAX16065_NUM_LIMIT 3
56#define MAX16065_NUM_ADC 12 /* maximum number of ADC channels */
57
58static const int max16065_num_adc[] = {
59 [max16065] = 12,
60 [max16066] = 8,
61 [max16067] = 6,
62 [max16068] = 6,
63 [max16070] = 12,
64 [max16071] = 8,
65};
66
67static const bool max16065_have_secondary[] = {
68 [max16065] = true,
69 [max16066] = true,
70 [max16067] = false,
71 [max16068] = false,
72 [max16070] = true,
73 [max16071] = true,
74};
75
76static const bool max16065_have_current[] = {
77 [max16065] = true,
78 [max16066] = true,
79 [max16067] = false,
80 [max16068] = false,
81 [max16070] = true,
82 [max16071] = true,
83};
84
85struct max16065_data {
86 enum chips type;
87 struct device *hwmon_dev;
88 struct mutex update_lock;
89 bool valid;
90 unsigned long last_updated; /* in jiffies */
91 int num_adc;
92 bool have_current;
93 int curr_gain;
94 /* limits are in mV */
95 int limit[MAX16065_NUM_LIMIT][MAX16065_NUM_ADC];
96 int range[MAX16065_NUM_ADC + 1];/* voltage range */
97 int adc[MAX16065_NUM_ADC + 1]; /* adc values (raw) including csp_adc */
98 int curr_sense;
99 int fault[2];
100};
101
102static const int max16065_adc_range[] = { 5560, 2780, 1390, 0 };
103static const int max16065_csp_adc_range[] = { 7000, 14000 };
104
105/* ADC registers have 10 bit resolution. */
106static inline int ADC_TO_MV(int adc, int range)
107{
108 return (adc * range) / 1024;
109}
110
111/*
112 * Limit registers have 8 bit resolution and match upper 8 bits of ADC
113 * registers.
114 */
115static inline int LIMIT_TO_MV(int limit, int range)
116{
117 return limit * range / 256;
118}
119
120static inline int MV_TO_LIMIT(int mv, int range)
121{
122 return SENSORS_LIMIT(DIV_ROUND_CLOSEST(mv * 256, range), 0, 255);
123}
124
125static inline int ADC_TO_CURR(int adc, int gain)
126{
127 return adc * 1400000 / gain * 255;
128}
129
130/*
131 * max16065_read_adc()
132 *
133 * Read 16 bit value from <reg>, <reg+1>.
134 * Upper 8 bits are in <reg>, lower 2 bits are in bits 7:6 of <reg+1>.
135 */
136static int max16065_read_adc(struct i2c_client *client, int reg)
137{
138 int rv;
139
140 rv = i2c_smbus_read_word_data(client, reg);
141 if (unlikely(rv < 0))
142 return rv;
143 return ((rv & 0xff) << 2) | ((rv >> 14) & 0x03);
144}
145
146static struct max16065_data *max16065_update_device(struct device *dev)
147{
148 struct i2c_client *client = to_i2c_client(dev);
149 struct max16065_data *data = i2c_get_clientdata(client);
150
151 mutex_lock(&data->update_lock);
152 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
153 int i;
154
155 for (i = 0; i < data->num_adc; i++)
156 data->adc[i]
157 = max16065_read_adc(client, MAX16065_ADC(i));
158
159 if (data->have_current) {
160 data->adc[MAX16065_NUM_ADC]
161 = max16065_read_adc(client, MAX16065_CSP_ADC);
162 data->curr_sense
163 = i2c_smbus_read_byte_data(client,
164 MAX16065_CURR_SENSE);
165 }
166
167 for (i = 0; i < DIV_ROUND_UP(data->num_adc, 8); i++)
168 data->fault[i]
169 = i2c_smbus_read_byte_data(client, MAX16065_FAULT(i));
170
171 data->last_updated = jiffies;
172 data->valid = 1;
173 }
174 mutex_unlock(&data->update_lock);
175 return data;
176}
177
178static ssize_t max16065_show_alarm(struct device *dev,
179 struct device_attribute *da, char *buf)
180{
181 struct sensor_device_attribute_2 *attr2 = to_sensor_dev_attr_2(da);
182 struct max16065_data *data = max16065_update_device(dev);
183 int val = data->fault[attr2->nr];
184
185 if (val < 0)
186 return val;
187
188 val &= (1 << attr2->index);
189 if (val)
190 i2c_smbus_write_byte_data(to_i2c_client(dev),
191 MAX16065_FAULT(attr2->nr), val);
192
193 return snprintf(buf, PAGE_SIZE, "%d\n", !!val);
194}
195
196static ssize_t max16065_show_input(struct device *dev,
197 struct device_attribute *da, char *buf)
198{
199 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
200 struct max16065_data *data = max16065_update_device(dev);
201 int adc = data->adc[attr->index];
202
203 if (unlikely(adc < 0))
204 return adc;
205
206 return snprintf(buf, PAGE_SIZE, "%d\n",
207 ADC_TO_MV(adc, data->range[attr->index]));
208}
209
210static ssize_t max16065_show_current(struct device *dev,
211 struct device_attribute *da, char *buf)
212{
213 struct max16065_data *data = max16065_update_device(dev);
214
215 if (unlikely(data->curr_sense < 0))
216 return data->curr_sense;
217
218 return snprintf(buf, PAGE_SIZE, "%d\n",
219 ADC_TO_CURR(data->curr_sense, data->curr_gain));
220}
221
222static ssize_t max16065_set_limit(struct device *dev,
223 struct device_attribute *da,
224 const char *buf, size_t count)
225{
226 struct sensor_device_attribute_2 *attr2 = to_sensor_dev_attr_2(da);
227 struct i2c_client *client = to_i2c_client(dev);
228 struct max16065_data *data = i2c_get_clientdata(client);
229 unsigned long val;
230 int err;
231 int limit;
232
233 err = strict_strtoul(buf, 10, &val);
234 if (unlikely(err < 0))
235 return err;
236
237 limit = MV_TO_LIMIT(val, data->range[attr2->index]);
238
239 mutex_lock(&data->update_lock);
240 data->limit[attr2->nr][attr2->index]
241 = LIMIT_TO_MV(limit, data->range[attr2->index]);
242 i2c_smbus_write_byte_data(client,
243 MAX16065_LIMIT(attr2->nr, attr2->index),
244 limit);
245 mutex_unlock(&data->update_lock);
246
247 return count;
248}
249
250static ssize_t max16065_show_limit(struct device *dev,
251 struct device_attribute *da, char *buf)
252{
253 struct sensor_device_attribute_2 *attr2 = to_sensor_dev_attr_2(da);
254 struct i2c_client *client = to_i2c_client(dev);
255 struct max16065_data *data = i2c_get_clientdata(client);
256
257 return snprintf(buf, PAGE_SIZE, "%d\n",
258 data->limit[attr2->nr][attr2->index]);
259}
260
261/* Construct a sensor_device_attribute structure for each register */
262
263/* Input voltages */
264static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, max16065_show_input, NULL, 0);
265static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, max16065_show_input, NULL, 1);
266static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, max16065_show_input, NULL, 2);
267static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, max16065_show_input, NULL, 3);
268static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, max16065_show_input, NULL, 4);
269static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, max16065_show_input, NULL, 5);
270static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, max16065_show_input, NULL, 6);
271static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, max16065_show_input, NULL, 7);
272static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, max16065_show_input, NULL, 8);
273static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, max16065_show_input, NULL, 9);
274static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, max16065_show_input, NULL, 10);
275static SENSOR_DEVICE_ATTR(in11_input, S_IRUGO, max16065_show_input, NULL, 11);
276static SENSOR_DEVICE_ATTR(in12_input, S_IRUGO, max16065_show_input, NULL, 12);
277
278/* Input voltages lcrit */
279static SENSOR_DEVICE_ATTR_2(in0_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
280 max16065_set_limit, 2, 0);
281static SENSOR_DEVICE_ATTR_2(in1_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
282 max16065_set_limit, 2, 1);
283static SENSOR_DEVICE_ATTR_2(in2_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
284 max16065_set_limit, 2, 2);
285static SENSOR_DEVICE_ATTR_2(in3_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
286 max16065_set_limit, 2, 3);
287static SENSOR_DEVICE_ATTR_2(in4_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
288 max16065_set_limit, 2, 4);
289static SENSOR_DEVICE_ATTR_2(in5_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
290 max16065_set_limit, 2, 5);
291static SENSOR_DEVICE_ATTR_2(in6_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
292 max16065_set_limit, 2, 6);
293static SENSOR_DEVICE_ATTR_2(in7_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
294 max16065_set_limit, 2, 7);
295static SENSOR_DEVICE_ATTR_2(in8_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
296 max16065_set_limit, 2, 8);
297static SENSOR_DEVICE_ATTR_2(in9_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
298 max16065_set_limit, 2, 9);
299static SENSOR_DEVICE_ATTR_2(in10_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
300 max16065_set_limit, 2, 10);
301static SENSOR_DEVICE_ATTR_2(in11_lcrit, S_IWUSR | S_IRUGO, max16065_show_limit,
302 max16065_set_limit, 2, 11);
303
304/* Input voltages crit */
305static SENSOR_DEVICE_ATTR_2(in0_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
306 max16065_set_limit, 1, 0);
307static SENSOR_DEVICE_ATTR_2(in1_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
308 max16065_set_limit, 1, 1);
309static SENSOR_DEVICE_ATTR_2(in2_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
310 max16065_set_limit, 1, 2);
311static SENSOR_DEVICE_ATTR_2(in3_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
312 max16065_set_limit, 1, 3);
313static SENSOR_DEVICE_ATTR_2(in4_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
314 max16065_set_limit, 1, 4);
315static SENSOR_DEVICE_ATTR_2(in5_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
316 max16065_set_limit, 1, 5);
317static SENSOR_DEVICE_ATTR_2(in6_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
318 max16065_set_limit, 1, 6);
319static SENSOR_DEVICE_ATTR_2(in7_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
320 max16065_set_limit, 1, 7);
321static SENSOR_DEVICE_ATTR_2(in8_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
322 max16065_set_limit, 1, 8);
323static SENSOR_DEVICE_ATTR_2(in9_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
324 max16065_set_limit, 1, 9);
325static SENSOR_DEVICE_ATTR_2(in10_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
326 max16065_set_limit, 1, 10);
327static SENSOR_DEVICE_ATTR_2(in11_crit, S_IWUSR | S_IRUGO, max16065_show_limit,
328 max16065_set_limit, 1, 11);
329
330/* Input voltages min */
331static SENSOR_DEVICE_ATTR_2(in0_min, S_IWUSR | S_IRUGO, max16065_show_limit,
332 max16065_set_limit, 0, 0);
333static SENSOR_DEVICE_ATTR_2(in1_min, S_IWUSR | S_IRUGO, max16065_show_limit,
334 max16065_set_limit, 0, 1);
335static SENSOR_DEVICE_ATTR_2(in2_min, S_IWUSR | S_IRUGO, max16065_show_limit,
336 max16065_set_limit, 0, 2);
337static SENSOR_DEVICE_ATTR_2(in3_min, S_IWUSR | S_IRUGO, max16065_show_limit,
338 max16065_set_limit, 0, 3);
339static SENSOR_DEVICE_ATTR_2(in4_min, S_IWUSR | S_IRUGO, max16065_show_limit,
340 max16065_set_limit, 0, 4);
341static SENSOR_DEVICE_ATTR_2(in5_min, S_IWUSR | S_IRUGO, max16065_show_limit,
342 max16065_set_limit, 0, 5);
343static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO, max16065_show_limit,
344 max16065_set_limit, 0, 6);
345static SENSOR_DEVICE_ATTR_2(in7_min, S_IWUSR | S_IRUGO, max16065_show_limit,
346 max16065_set_limit, 0, 7);
347static SENSOR_DEVICE_ATTR_2(in8_min, S_IWUSR | S_IRUGO, max16065_show_limit,
348 max16065_set_limit, 0, 8);
349static SENSOR_DEVICE_ATTR_2(in9_min, S_IWUSR | S_IRUGO, max16065_show_limit,
350 max16065_set_limit, 0, 9);
351static SENSOR_DEVICE_ATTR_2(in10_min, S_IWUSR | S_IRUGO, max16065_show_limit,
352 max16065_set_limit, 0, 10);
353static SENSOR_DEVICE_ATTR_2(in11_min, S_IWUSR | S_IRUGO, max16065_show_limit,
354 max16065_set_limit, 0, 11);
355
356/* Input voltages max */
357static SENSOR_DEVICE_ATTR_2(in0_max, S_IWUSR | S_IRUGO, max16065_show_limit,
358 max16065_set_limit, 0, 0);
359static SENSOR_DEVICE_ATTR_2(in1_max, S_IWUSR | S_IRUGO, max16065_show_limit,
360 max16065_set_limit, 0, 1);
361static SENSOR_DEVICE_ATTR_2(in2_max, S_IWUSR | S_IRUGO, max16065_show_limit,
362 max16065_set_limit, 0, 2);
363static SENSOR_DEVICE_ATTR_2(in3_max, S_IWUSR | S_IRUGO, max16065_show_limit,
364 max16065_set_limit, 0, 3);
365static SENSOR_DEVICE_ATTR_2(in4_max, S_IWUSR | S_IRUGO, max16065_show_limit,
366 max16065_set_limit, 0, 4);
367static SENSOR_DEVICE_ATTR_2(in5_max, S_IWUSR | S_IRUGO, max16065_show_limit,
368 max16065_set_limit, 0, 5);
369static SENSOR_DEVICE_ATTR_2(in6_max, S_IWUSR | S_IRUGO, max16065_show_limit,
370 max16065_set_limit, 0, 6);
371static SENSOR_DEVICE_ATTR_2(in7_max, S_IWUSR | S_IRUGO, max16065_show_limit,
372 max16065_set_limit, 0, 7);
373static SENSOR_DEVICE_ATTR_2(in8_max, S_IWUSR | S_IRUGO, max16065_show_limit,
374 max16065_set_limit, 0, 8);
375static SENSOR_DEVICE_ATTR_2(in9_max, S_IWUSR | S_IRUGO, max16065_show_limit,
376 max16065_set_limit, 0, 9);
377static SENSOR_DEVICE_ATTR_2(in10_max, S_IWUSR | S_IRUGO, max16065_show_limit,
378 max16065_set_limit, 0, 10);
379static SENSOR_DEVICE_ATTR_2(in11_max, S_IWUSR | S_IRUGO, max16065_show_limit,
380 max16065_set_limit, 0, 11);
381
382/* alarms */
383static SENSOR_DEVICE_ATTR_2(in0_alarm, S_IRUGO, max16065_show_alarm, NULL,
384 0, 0);
385static SENSOR_DEVICE_ATTR_2(in1_alarm, S_IRUGO, max16065_show_alarm, NULL,
386 0, 1);
387static SENSOR_DEVICE_ATTR_2(in2_alarm, S_IRUGO, max16065_show_alarm, NULL,
388 0, 2);
389static SENSOR_DEVICE_ATTR_2(in3_alarm, S_IRUGO, max16065_show_alarm, NULL,
390 0, 3);
391static SENSOR_DEVICE_ATTR_2(in4_alarm, S_IRUGO, max16065_show_alarm, NULL,
392 0, 4);
393static SENSOR_DEVICE_ATTR_2(in5_alarm, S_IRUGO, max16065_show_alarm, NULL,
394 0, 5);
395static SENSOR_DEVICE_ATTR_2(in6_alarm, S_IRUGO, max16065_show_alarm, NULL,
396 0, 6);
397static SENSOR_DEVICE_ATTR_2(in7_alarm, S_IRUGO, max16065_show_alarm, NULL,
398 0, 7);
399static SENSOR_DEVICE_ATTR_2(in8_alarm, S_IRUGO, max16065_show_alarm, NULL,
400 1, 0);
401static SENSOR_DEVICE_ATTR_2(in9_alarm, S_IRUGO, max16065_show_alarm, NULL,
402 1, 1);
403static SENSOR_DEVICE_ATTR_2(in10_alarm, S_IRUGO, max16065_show_alarm, NULL,
404 1, 2);
405static SENSOR_DEVICE_ATTR_2(in11_alarm, S_IRUGO, max16065_show_alarm, NULL,
406 1, 3);
407
408/* Current and alarm */
409static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, max16065_show_current, NULL, 0);
410static SENSOR_DEVICE_ATTR_2(curr1_alarm, S_IRUGO, max16065_show_alarm, NULL,
411 1, 4);
412
413/*
414 * Finally, construct an array of pointers to members of the above objects,
415 * as required for sysfs_create_group()
416 */
417static struct attribute *max16065_basic_attributes[] = {
418 &sensor_dev_attr_in0_input.dev_attr.attr,
419 &sensor_dev_attr_in0_lcrit.dev_attr.attr,
420 &sensor_dev_attr_in0_crit.dev_attr.attr,
421 &sensor_dev_attr_in0_alarm.dev_attr.attr,
422
423 &sensor_dev_attr_in1_input.dev_attr.attr,
424 &sensor_dev_attr_in1_lcrit.dev_attr.attr,
425 &sensor_dev_attr_in1_crit.dev_attr.attr,
426 &sensor_dev_attr_in1_alarm.dev_attr.attr,
427
428 &sensor_dev_attr_in2_input.dev_attr.attr,
429 &sensor_dev_attr_in2_lcrit.dev_attr.attr,
430 &sensor_dev_attr_in2_crit.dev_attr.attr,
431 &sensor_dev_attr_in2_alarm.dev_attr.attr,
432
433 &sensor_dev_attr_in3_input.dev_attr.attr,
434 &sensor_dev_attr_in3_lcrit.dev_attr.attr,
435 &sensor_dev_attr_in3_crit.dev_attr.attr,
436 &sensor_dev_attr_in3_alarm.dev_attr.attr,
437
438 &sensor_dev_attr_in4_input.dev_attr.attr,
439 &sensor_dev_attr_in4_lcrit.dev_attr.attr,
440 &sensor_dev_attr_in4_crit.dev_attr.attr,
441 &sensor_dev_attr_in4_alarm.dev_attr.attr,
442
443 &sensor_dev_attr_in5_input.dev_attr.attr,
444 &sensor_dev_attr_in5_lcrit.dev_attr.attr,
445 &sensor_dev_attr_in5_crit.dev_attr.attr,
446 &sensor_dev_attr_in5_alarm.dev_attr.attr,
447
448 &sensor_dev_attr_in6_input.dev_attr.attr,
449 &sensor_dev_attr_in6_lcrit.dev_attr.attr,
450 &sensor_dev_attr_in6_crit.dev_attr.attr,
451 &sensor_dev_attr_in6_alarm.dev_attr.attr,
452
453 &sensor_dev_attr_in7_input.dev_attr.attr,
454 &sensor_dev_attr_in7_lcrit.dev_attr.attr,
455 &sensor_dev_attr_in7_crit.dev_attr.attr,
456 &sensor_dev_attr_in7_alarm.dev_attr.attr,
457
458 &sensor_dev_attr_in8_input.dev_attr.attr,
459 &sensor_dev_attr_in8_lcrit.dev_attr.attr,
460 &sensor_dev_attr_in8_crit.dev_attr.attr,
461 &sensor_dev_attr_in8_alarm.dev_attr.attr,
462
463 &sensor_dev_attr_in9_input.dev_attr.attr,
464 &sensor_dev_attr_in9_lcrit.dev_attr.attr,
465 &sensor_dev_attr_in9_crit.dev_attr.attr,
466 &sensor_dev_attr_in9_alarm.dev_attr.attr,
467
468 &sensor_dev_attr_in10_input.dev_attr.attr,
469 &sensor_dev_attr_in10_lcrit.dev_attr.attr,
470 &sensor_dev_attr_in10_crit.dev_attr.attr,
471 &sensor_dev_attr_in10_alarm.dev_attr.attr,
472
473 &sensor_dev_attr_in11_input.dev_attr.attr,
474 &sensor_dev_attr_in11_lcrit.dev_attr.attr,
475 &sensor_dev_attr_in11_crit.dev_attr.attr,
476 &sensor_dev_attr_in11_alarm.dev_attr.attr,
477
478 NULL
479};
480
481static struct attribute *max16065_current_attributes[] = {
482 &sensor_dev_attr_in12_input.dev_attr.attr,
483 &sensor_dev_attr_curr1_input.dev_attr.attr,
484 &sensor_dev_attr_curr1_alarm.dev_attr.attr,
485 NULL
486};
487
488static struct attribute *max16065_min_attributes[] = {
489 &sensor_dev_attr_in0_min.dev_attr.attr,
490 &sensor_dev_attr_in1_min.dev_attr.attr,
491 &sensor_dev_attr_in2_min.dev_attr.attr,
492 &sensor_dev_attr_in3_min.dev_attr.attr,
493 &sensor_dev_attr_in4_min.dev_attr.attr,
494 &sensor_dev_attr_in5_min.dev_attr.attr,
495 &sensor_dev_attr_in6_min.dev_attr.attr,
496 &sensor_dev_attr_in7_min.dev_attr.attr,
497 &sensor_dev_attr_in8_min.dev_attr.attr,
498 &sensor_dev_attr_in9_min.dev_attr.attr,
499 &sensor_dev_attr_in10_min.dev_attr.attr,
500 &sensor_dev_attr_in11_min.dev_attr.attr,
501 NULL
502};
503
504static struct attribute *max16065_max_attributes[] = {
505 &sensor_dev_attr_in0_max.dev_attr.attr,
506 &sensor_dev_attr_in1_max.dev_attr.attr,
507 &sensor_dev_attr_in2_max.dev_attr.attr,
508 &sensor_dev_attr_in3_max.dev_attr.attr,
509 &sensor_dev_attr_in4_max.dev_attr.attr,
510 &sensor_dev_attr_in5_max.dev_attr.attr,
511 &sensor_dev_attr_in6_max.dev_attr.attr,
512 &sensor_dev_attr_in7_max.dev_attr.attr,
513 &sensor_dev_attr_in8_max.dev_attr.attr,
514 &sensor_dev_attr_in9_max.dev_attr.attr,
515 &sensor_dev_attr_in10_max.dev_attr.attr,
516 &sensor_dev_attr_in11_max.dev_attr.attr,
517 NULL
518};
519
520static const struct attribute_group max16065_basic_group = {
521 .attrs = max16065_basic_attributes,
522};
523
524static const struct attribute_group max16065_current_group = {
525 .attrs = max16065_current_attributes,
526};
527
528static const struct attribute_group max16065_min_group = {
529 .attrs = max16065_min_attributes,
530};
531
532static const struct attribute_group max16065_max_group = {
533 .attrs = max16065_max_attributes,
534};
535
536static void max16065_cleanup(struct i2c_client *client)
537{
538 sysfs_remove_group(&client->dev.kobj, &max16065_max_group);
539 sysfs_remove_group(&client->dev.kobj, &max16065_min_group);
540 sysfs_remove_group(&client->dev.kobj, &max16065_current_group);
541 sysfs_remove_group(&client->dev.kobj, &max16065_basic_group);
542}
543
544static int max16065_probe(struct i2c_client *client,
545 const struct i2c_device_id *id)
546{
547 struct i2c_adapter *adapter = client->adapter;
548 struct max16065_data *data;
549 int i, j, val, ret;
550 bool have_secondary; /* true if chip has secondary limits */
551 bool secondary_is_max = false; /* secondary limits reflect max */
552
553 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
554 | I2C_FUNC_SMBUS_READ_WORD_DATA))
555 return -ENODEV;
556
557 data = kzalloc(sizeof(*data), GFP_KERNEL);
558 if (unlikely(!data))
559 return -ENOMEM;
560
561 i2c_set_clientdata(client, data);
562 mutex_init(&data->update_lock);
563
564 data->num_adc = max16065_num_adc[id->driver_data];
565 data->have_current = max16065_have_current[id->driver_data];
566 have_secondary = max16065_have_secondary[id->driver_data];
567
568 if (have_secondary) {
569 val = i2c_smbus_read_byte_data(client, MAX16065_SW_ENABLE);
570 if (unlikely(val < 0)) {
571 ret = val;
572 goto out_free;
573 }
574 secondary_is_max = val & MAX16065_WARNING_OV;
575 }
576
577 /* Read scale registers, convert to range */
578 for (i = 0; i < DIV_ROUND_UP(data->num_adc, 4); i++) {
579 val = i2c_smbus_read_byte_data(client, MAX16065_SCALE(i));
580 if (unlikely(val < 0)) {
581 ret = val;
582 goto out_free;
583 }
584 for (j = 0; j < 4 && i * 4 + j < data->num_adc; j++) {
585 data->range[i * 4 + j] =
586 max16065_adc_range[(val >> (j * 2)) & 0x3];
587 }
588 }
589
590 /* Read limits */
591 for (i = 0; i < MAX16065_NUM_LIMIT; i++) {
592 if (i == 0 && !have_secondary)
593 continue;
594
595 for (j = 0; j < data->num_adc; j++) {
596 val = i2c_smbus_read_byte_data(client,
597 MAX16065_LIMIT(i, j));
598 if (unlikely(val < 0)) {
599 ret = val;
600 goto out_free;
601 }
602 data->limit[i][j] = LIMIT_TO_MV(val, data->range[j]);
603 }
604 }
605
606 /* Register sysfs hooks */
607 for (i = 0; i < data->num_adc * 4; i++) {
608 /* Do not create sysfs entry if channel is disabled */
609 if (!data->range[i / 4])
610 continue;
611
612 ret = sysfs_create_file(&client->dev.kobj,
613 max16065_basic_attributes[i]);
614 if (unlikely(ret))
615 goto out;
616 }
617
618 if (have_secondary) {
619 struct attribute **attr = secondary_is_max ?
620 max16065_max_attributes : max16065_min_attributes;
621
622 for (i = 0; i < data->num_adc; i++) {
623 if (!data->range[i])
624 continue;
625
626 ret = sysfs_create_file(&client->dev.kobj, attr[i]);
627 if (unlikely(ret))
628 goto out;
629 }
630 }
631
632 if (data->have_current) {
633 val = i2c_smbus_read_byte_data(client, MAX16065_CURR_CONTROL);
634 if (unlikely(val < 0)) {
635 ret = val;
636 goto out;
637 }
638 if (val & MAX16065_CURR_ENABLE) {
639 /*
640 * Current gain is 6, 12, 24, 48 based on values in
641 * bit 2,3.
642 */
643 data->curr_gain = 6 << ((val >> 2) & 0x03);
644 data->range[MAX16065_NUM_ADC]
645 = max16065_csp_adc_range[(val >> 1) & 0x01];
646 ret = sysfs_create_group(&client->dev.kobj,
647 &max16065_current_group);
648 if (unlikely(ret))
649 goto out;
650 } else {
651 data->have_current = false;
652 }
653 }
654
655 data->hwmon_dev = hwmon_device_register(&client->dev);
656 if (unlikely(IS_ERR(data->hwmon_dev))) {
657 ret = PTR_ERR(data->hwmon_dev);
658 goto out;
659 }
660 return 0;
661
662out:
663 max16065_cleanup(client);
664out_free:
665 kfree(data);
666 return ret;
667}
668
669static int max16065_remove(struct i2c_client *client)
670{
671 struct max16065_data *data = i2c_get_clientdata(client);
672
673 hwmon_device_unregister(data->hwmon_dev);
674 max16065_cleanup(client);
675 kfree(data);
676
677 return 0;
678}
679
680static const struct i2c_device_id max16065_id[] = {
681 { "max16065", max16065 },
682 { "max16066", max16066 },
683 { "max16067", max16067 },
684 { "max16068", max16068 },
685 { "max16070", max16070 },
686 { "max16071", max16071 },
687 { }
688};
689
690MODULE_DEVICE_TABLE(i2c, max16065_id);
691
692/* This is the driver that will be inserted */
693static struct i2c_driver max16065_driver = {
694 .driver = {
695 .name = "max16065",
696 },
697 .probe = max16065_probe,
698 .remove = max16065_remove,
699 .id_table = max16065_id,
700};
701
702static int __init max16065_init(void)
703{
704 return i2c_add_driver(&max16065_driver);
705}
706
707static void __exit max16065_exit(void)
708{
709 i2c_del_driver(&max16065_driver);
710}
711
712MODULE_AUTHOR("Guenter Roeck <guenter.roeck@ericsson.com>");
713MODULE_DESCRIPTION("MAX16065 driver");
714MODULE_LICENSE("GPL");
715
716module_init(max16065_init);
717module_exit(max16065_exit);