]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/hwmon/asc7621.c
remoteproc: qcom: Fix potential device node leaks
[mirror_ubuntu-bionic-kernel.git] / drivers / hwmon / asc7621.c
CommitLineData
d58de038
GJ
1/*
2 * asc7621.c - Part of lm_sensors, Linux kernel modules for hardware monitoring
3 * Copyright (c) 2007, 2010 George Joseph <george.joseph@fairview5.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20#include <linux/module.h>
21#include <linux/init.h>
22#include <linux/slab.h>
23#include <linux/jiffies.h>
24#include <linux/i2c.h>
25#include <linux/hwmon.h>
26#include <linux/hwmon-sysfs.h>
27#include <linux/err.h>
28#include <linux/mutex.h>
29
30/* Addresses to scan */
918ee91c 31static const unsigned short normal_i2c[] = {
d58de038
GJ
32 0x2c, 0x2d, 0x2e, I2C_CLIENT_END
33};
34
35enum asc7621_type {
36 asc7621,
37 asc7621a
38};
39
40#define INTERVAL_HIGH (HZ + HZ / 2)
41#define INTERVAL_LOW (1 * 60 * HZ)
42#define PRI_NONE 0
43#define PRI_LOW 1
44#define PRI_HIGH 2
45#define FIRST_CHIP asc7621
46#define LAST_CHIP asc7621a
47
48struct asc7621_chip {
49 char *name;
50 enum asc7621_type chip_type;
51 u8 company_reg;
52 u8 company_id;
53 u8 verstep_reg;
54 u8 verstep_id;
918ee91c 55 const unsigned short *addresses;
d58de038
GJ
56};
57
58static struct asc7621_chip asc7621_chips[] = {
59 {
60 .name = "asc7621",
61 .chip_type = asc7621,
62 .company_reg = 0x3e,
63 .company_id = 0x61,
64 .verstep_reg = 0x3f,
65 .verstep_id = 0x6c,
66 .addresses = normal_i2c,
67 },
68 {
69 .name = "asc7621a",
70 .chip_type = asc7621a,
71 .company_reg = 0x3e,
72 .company_id = 0x61,
73 .verstep_reg = 0x3f,
74 .verstep_id = 0x6d,
75 .addresses = normal_i2c,
76 },
77};
78
79/*
80 * Defines the highest register to be used, not the count.
81 * The actual count will probably be smaller because of gaps
82 * in the implementation (unused register locations).
83 * This define will safely set the array size of both the parameter
84 * and data arrays.
85 * This comes from the data sheet register description table.
86 */
87#define LAST_REGISTER 0xff
88
89struct asc7621_data {
90 struct i2c_client client;
91 struct device *class_dev;
92 struct mutex update_lock;
93 int valid; /* !=0 if following fields are valid */
94 unsigned long last_high_reading; /* In jiffies */
95 unsigned long last_low_reading; /* In jiffies */
96 /*
97 * Registers we care about occupy the corresponding index
98 * in the array. Registers we don't care about are left
99 * at 0.
100 */
101 u8 reg[LAST_REGISTER + 1];
102};
103
104/*
105 * Macro to get the parent asc7621_param structure
106 * from a sensor_device_attribute passed into the
107 * show/store functions.
108 */
109#define to_asc7621_param(_sda) \
110 container_of(_sda, struct asc7621_param, sda)
111
112/*
113 * Each parameter to be retrieved needs an asc7621_param structure
114 * allocated. It contains the sensor_device_attribute structure
115 * and the control info needed to retrieve the value from the register map.
116 */
117struct asc7621_param {
118 struct sensor_device_attribute sda;
119 u8 priority;
120 u8 msb[3];
121 u8 lsb[3];
122 u8 mask[3];
123 u8 shift[3];
124};
125
126/*
127 * This is the map that ultimately indicates whether we'll be
128 * retrieving a register value or not, and at what frequency.
129 */
130static u8 asc7621_register_priorities[255];
131
132static struct asc7621_data *asc7621_update_device(struct device *dev);
133
134static inline u8 read_byte(struct i2c_client *client, u8 reg)
135{
136 int res = i2c_smbus_read_byte_data(client, reg);
137 if (res < 0) {
138 dev_err(&client->dev,
139 "Unable to read from register 0x%02x.\n", reg);
140 return 0;
a0393713 141 }
d58de038
GJ
142 return res & 0xff;
143}
144
145static inline int write_byte(struct i2c_client *client, u8 reg, u8 data)
146{
147 int res = i2c_smbus_write_byte_data(client, reg, data);
148 if (res < 0) {
149 dev_err(&client->dev,
150 "Unable to write value 0x%02x to register 0x%02x.\n",
151 data, reg);
a0393713 152 }
d58de038
GJ
153 return res;
154}
155
156/*
157 * Data Handlers
158 * Each function handles the formatting, storage
159 * and retrieval of like parameters.
160 */
161
088ce2ac 162#define SETUP_SHOW_DATA_PARAM(d, a) \
d58de038
GJ
163 struct sensor_device_attribute *sda = to_sensor_dev_attr(a); \
164 struct asc7621_data *data = asc7621_update_device(d); \
165 struct asc7621_param *param = to_asc7621_param(sda)
166
088ce2ac 167#define SETUP_STORE_DATA_PARAM(d, a) \
d58de038
GJ
168 struct sensor_device_attribute *sda = to_sensor_dev_attr(a); \
169 struct i2c_client *client = to_i2c_client(d); \
170 struct asc7621_data *data = i2c_get_clientdata(client); \
171 struct asc7621_param *param = to_asc7621_param(sda)
172
173/*
174 * u8 is just what it sounds like...an unsigned byte with no
175 * special formatting.
176 */
177static ssize_t show_u8(struct device *dev, struct device_attribute *attr,
178 char *buf)
179{
088ce2ac 180 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
181
182 return sprintf(buf, "%u\n", data->reg[param->msb[0]]);
183}
184
185static ssize_t store_u8(struct device *dev, struct device_attribute *attr,
186 const char *buf, size_t count)
187{
088ce2ac 188 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
189 long reqval;
190
179c4fdb 191 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
192 return -EINVAL;
193
2a844c14 194 reqval = clamp_val(reqval, 0, 255);
d58de038
GJ
195
196 mutex_lock(&data->update_lock);
197 data->reg[param->msb[0]] = reqval;
198 write_byte(client, param->msb[0], reqval);
199 mutex_unlock(&data->update_lock);
200 return count;
201}
202
203/*
204 * Many of the config values occupy only a few bits of a register.
205 */
206static ssize_t show_bitmask(struct device *dev,
207 struct device_attribute *attr, char *buf)
208{
088ce2ac 209 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
210
211 return sprintf(buf, "%u\n",
212 (data->reg[param->msb[0]] >> param->
213 shift[0]) & param->mask[0]);
214}
215
216static ssize_t store_bitmask(struct device *dev,
217 struct device_attribute *attr,
218 const char *buf, size_t count)
219{
088ce2ac 220 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
221 long reqval;
222 u8 currval;
223
179c4fdb 224 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
225 return -EINVAL;
226
2a844c14 227 reqval = clamp_val(reqval, 0, param->mask[0]);
d58de038
GJ
228
229 reqval = (reqval & param->mask[0]) << param->shift[0];
230
231 mutex_lock(&data->update_lock);
232 currval = read_byte(client, param->msb[0]);
233 reqval |= (currval & ~(param->mask[0] << param->shift[0]));
234 data->reg[param->msb[0]] = reqval;
235 write_byte(client, param->msb[0], reqval);
236 mutex_unlock(&data->update_lock);
237 return count;
238}
239
240/*
241 * 16 bit fan rpm values
242 * reported by the device as the number of 11.111us periods (90khz)
243 * between full fan rotations. Therefore...
244 * RPM = (90000 * 60) / register value
245 */
246static ssize_t show_fan16(struct device *dev,
247 struct device_attribute *attr, char *buf)
248{
088ce2ac 249 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
250 u16 regval;
251
252 mutex_lock(&data->update_lock);
253 regval = (data->reg[param->msb[0]] << 8) | data->reg[param->lsb[0]];
254 mutex_unlock(&data->update_lock);
255
256 return sprintf(buf, "%u\n",
257 (regval == 0 ? -1 : (regval) ==
258 0xffff ? 0 : 5400000 / regval));
259}
260
261static ssize_t store_fan16(struct device *dev,
262 struct device_attribute *attr, const char *buf,
263 size_t count)
264{
088ce2ac 265 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
266 long reqval;
267
179c4fdb 268 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
269 return -EINVAL;
270
3c56b066
GR
271 /*
272 * If a minimum RPM of zero is requested, then we set the register to
273 * 0xffff. This value allows the fan to be stopped completely without
274 * generating an alarm.
275 */
d58de038 276 reqval =
2a844c14 277 (reqval <= 0 ? 0xffff : clamp_val(5400000 / reqval, 0, 0xfffe));
d58de038
GJ
278
279 mutex_lock(&data->update_lock);
280 data->reg[param->msb[0]] = (reqval >> 8) & 0xff;
281 data->reg[param->lsb[0]] = reqval & 0xff;
282 write_byte(client, param->msb[0], data->reg[param->msb[0]]);
283 write_byte(client, param->lsb[0], data->reg[param->lsb[0]]);
284 mutex_unlock(&data->update_lock);
285
286 return count;
287}
288
289/*
290 * Voltages are scaled in the device so that the nominal voltage
291 * is 3/4ths of the 0-255 range (i.e. 192).
292 * If all voltages are 'normal' then all voltage registers will
d1bf8cf6
KM
293 * read 0xC0.
294 *
295 * The data sheet provides us with the 3/4 scale value for each voltage
d58de038
GJ
296 * which is stored in in_scaling. The sda->index parameter value provides
297 * the index into in_scaling.
298 *
299 * NOTE: The chip expects the first 2 inputs be 2.5 and 2.25 volts
300 * respectively. That doesn't mean that's what the motherboard provides. :)
301 */
302
7a7176aa 303static const int asc7621_in_scaling[] = {
d1bf8cf6 304 2500, 2250, 3300, 5000, 12000
d58de038
GJ
305};
306
307static ssize_t show_in10(struct device *dev, struct device_attribute *attr,
308 char *buf)
309{
088ce2ac 310 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
311 u16 regval;
312 u8 nr = sda->index;
313
314 mutex_lock(&data->update_lock);
d1bf8cf6 315 regval = (data->reg[param->msb[0]] << 8) | (data->reg[param->lsb[0]]);
d58de038
GJ
316 mutex_unlock(&data->update_lock);
317
d1bf8cf6
KM
318 /* The LSB value is a 2-bit scaling of the MSB's LSbit value. */
319 regval = (regval >> 6) * asc7621_in_scaling[nr] / (0xc0 << 2);
320
d58de038
GJ
321 return sprintf(buf, "%u\n", regval);
322}
323
324/* 8 bit voltage values (the mins and maxs) */
325static ssize_t show_in8(struct device *dev, struct device_attribute *attr,
326 char *buf)
327{
088ce2ac 328 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
329 u8 nr = sda->index;
330
331 return sprintf(buf, "%u\n",
332 ((data->reg[param->msb[0]] *
d1bf8cf6 333 asc7621_in_scaling[nr]) / 0xc0));
d58de038
GJ
334}
335
336static ssize_t store_in8(struct device *dev, struct device_attribute *attr,
337 const char *buf, size_t count)
338{
088ce2ac 339 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
340 long reqval;
341 u8 nr = sda->index;
342
179c4fdb 343 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
344 return -EINVAL;
345
2a844c14 346 reqval = clamp_val(reqval, 0, 0xffff);
d1bf8cf6
KM
347
348 reqval = reqval * 0xc0 / asc7621_in_scaling[nr];
d58de038 349
2a844c14 350 reqval = clamp_val(reqval, 0, 0xff);
d58de038
GJ
351
352 mutex_lock(&data->update_lock);
353 data->reg[param->msb[0]] = reqval;
354 write_byte(client, param->msb[0], reqval);
355 mutex_unlock(&data->update_lock);
356
357 return count;
358}
359
360static ssize_t show_temp8(struct device *dev,
361 struct device_attribute *attr, char *buf)
362{
088ce2ac 363 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
364
365 return sprintf(buf, "%d\n", ((s8) data->reg[param->msb[0]]) * 1000);
366}
367
368static ssize_t store_temp8(struct device *dev,
369 struct device_attribute *attr, const char *buf,
370 size_t count)
371{
088ce2ac 372 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
373 long reqval;
374 s8 temp;
375
179c4fdb 376 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
377 return -EINVAL;
378
2a844c14 379 reqval = clamp_val(reqval, -127000, 127000);
d58de038
GJ
380
381 temp = reqval / 1000;
382
383 mutex_lock(&data->update_lock);
384 data->reg[param->msb[0]] = temp;
385 write_byte(client, param->msb[0], temp);
386 mutex_unlock(&data->update_lock);
387 return count;
388}
389
390/*
391 * Temperatures that occupy 2 bytes always have the whole
392 * number of degrees in the MSB with some part of the LSB
393 * indicating fractional degrees.
394 */
395
396/* mmmmmmmm.llxxxxxx */
397static ssize_t show_temp10(struct device *dev,
398 struct device_attribute *attr, char *buf)
399{
088ce2ac 400 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
401 u8 msb, lsb;
402 int temp;
403
404 mutex_lock(&data->update_lock);
405 msb = data->reg[param->msb[0]];
406 lsb = (data->reg[param->lsb[0]] >> 6) & 0x03;
407 temp = (((s8) msb) * 1000) + (lsb * 250);
408 mutex_unlock(&data->update_lock);
409
410 return sprintf(buf, "%d\n", temp);
411}
412
413/* mmmmmm.ll */
414static ssize_t show_temp62(struct device *dev,
415 struct device_attribute *attr, char *buf)
416{
088ce2ac 417 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
418 u8 regval = data->reg[param->msb[0]];
419 int temp = ((s8) (regval & 0xfc) * 1000) + ((regval & 0x03) * 250);
420
421 return sprintf(buf, "%d\n", temp);
422}
423
424static ssize_t store_temp62(struct device *dev,
425 struct device_attribute *attr, const char *buf,
426 size_t count)
427{
088ce2ac 428 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
429 long reqval, i, f;
430 s8 temp;
431
179c4fdb 432 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
433 return -EINVAL;
434
2a844c14 435 reqval = clamp_val(reqval, -32000, 31750);
d58de038
GJ
436 i = reqval / 1000;
437 f = reqval - (i * 1000);
438 temp = i << 2;
439 temp |= f / 250;
440
441 mutex_lock(&data->update_lock);
442 data->reg[param->msb[0]] = temp;
443 write_byte(client, param->msb[0], temp);
444 mutex_unlock(&data->update_lock);
445 return count;
446}
447
448/*
449 * The aSC7621 doesn't provide an "auto_point2". Instead, you
450 * specify the auto_point1 and a range. To keep with the sysfs
451 * hwmon specs, we synthesize the auto_point_2 from them.
452 */
453
7a7176aa 454static const u32 asc7621_range_map[] = {
d58de038
GJ
455 2000, 2500, 3330, 4000, 5000, 6670, 8000, 10000,
456 13330, 16000, 20000, 26670, 32000, 40000, 53330, 80000,
457};
458
459static ssize_t show_ap2_temp(struct device *dev,
460 struct device_attribute *attr, char *buf)
461{
088ce2ac 462 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
463 long auto_point1;
464 u8 regval;
465 int temp;
466
467 mutex_lock(&data->update_lock);
468 auto_point1 = ((s8) data->reg[param->msb[1]]) * 1000;
469 regval =
470 ((data->reg[param->msb[0]] >> param->shift[0]) & param->mask[0]);
2a844c14 471 temp = auto_point1 + asc7621_range_map[clamp_val(regval, 0, 15)];
d58de038
GJ
472 mutex_unlock(&data->update_lock);
473
474 return sprintf(buf, "%d\n", temp);
475
476}
477
478static ssize_t store_ap2_temp(struct device *dev,
479 struct device_attribute *attr,
480 const char *buf, size_t count)
481{
088ce2ac 482 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
483 long reqval, auto_point1;
484 int i;
485 u8 currval, newval = 0;
486
179c4fdb 487 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
488 return -EINVAL;
489
490 mutex_lock(&data->update_lock);
491 auto_point1 = data->reg[param->msb[1]] * 1000;
2a844c14 492 reqval = clamp_val(reqval, auto_point1 + 2000, auto_point1 + 80000);
d58de038
GJ
493
494 for (i = ARRAY_SIZE(asc7621_range_map) - 1; i >= 0; i--) {
495 if (reqval >= auto_point1 + asc7621_range_map[i]) {
496 newval = i;
497 break;
498 }
499 }
500
501 newval = (newval & param->mask[0]) << param->shift[0];
502 currval = read_byte(client, param->msb[0]);
503 newval |= (currval & ~(param->mask[0] << param->shift[0]));
504 data->reg[param->msb[0]] = newval;
505 write_byte(client, param->msb[0], newval);
506 mutex_unlock(&data->update_lock);
507 return count;
508}
509
510static ssize_t show_pwm_ac(struct device *dev,
511 struct device_attribute *attr, char *buf)
512{
088ce2ac 513 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038 514 u8 config, altbit, regval;
69301258 515 static const u8 map[] = {
d58de038
GJ
516 0x01, 0x02, 0x04, 0x1f, 0x00, 0x06, 0x07, 0x10,
517 0x08, 0x0f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f
518 };
519
520 mutex_lock(&data->update_lock);
521 config = (data->reg[param->msb[0]] >> param->shift[0]) & param->mask[0];
522 altbit = (data->reg[param->msb[1]] >> param->shift[1]) & param->mask[1];
523 regval = config | (altbit << 3);
524 mutex_unlock(&data->update_lock);
525
2a844c14 526 return sprintf(buf, "%u\n", map[clamp_val(regval, 0, 15)]);
d58de038
GJ
527}
528
529static ssize_t store_pwm_ac(struct device *dev,
530 struct device_attribute *attr,
531 const char *buf, size_t count)
532{
088ce2ac 533 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
534 unsigned long reqval;
535 u8 currval, config, altbit, newval;
69301258 536 static const u16 map[] = {
d58de038
GJ
537 0x04, 0x00, 0x01, 0xff, 0x02, 0xff, 0x05, 0x06,
538 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
539 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
540 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
541 };
542
179c4fdb 543 if (kstrtoul(buf, 10, &reqval))
d58de038
GJ
544 return -EINVAL;
545
546 if (reqval > 31)
547 return -EINVAL;
548
549 reqval = map[reqval];
550 if (reqval == 0xff)
551 return -EINVAL;
552
553 config = reqval & 0x07;
554 altbit = (reqval >> 3) & 0x01;
555
556 config = (config & param->mask[0]) << param->shift[0];
557 altbit = (altbit & param->mask[1]) << param->shift[1];
558
559 mutex_lock(&data->update_lock);
560 currval = read_byte(client, param->msb[0]);
561 newval = config | (currval & ~(param->mask[0] << param->shift[0]));
562 newval = altbit | (newval & ~(param->mask[1] << param->shift[1]));
563 data->reg[param->msb[0]] = newval;
564 write_byte(client, param->msb[0], newval);
565 mutex_unlock(&data->update_lock);
566 return count;
567}
568
569static ssize_t show_pwm_enable(struct device *dev,
570 struct device_attribute *attr, char *buf)
571{
088ce2ac 572 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
573 u8 config, altbit, minoff, val, newval;
574
575 mutex_lock(&data->update_lock);
576 config = (data->reg[param->msb[0]] >> param->shift[0]) & param->mask[0];
577 altbit = (data->reg[param->msb[1]] >> param->shift[1]) & param->mask[1];
578 minoff = (data->reg[param->msb[2]] >> param->shift[2]) & param->mask[2];
579 mutex_unlock(&data->update_lock);
580
581 val = config | (altbit << 3);
d58de038
GJ
582
583 if (val == 3 || val >= 10)
584 newval = 255;
585 else if (val == 4)
586 newval = 0;
587 else if (val == 7)
588 newval = 1;
589 else if (minoff == 1)
590 newval = 2;
591 else
592 newval = 3;
593
594 return sprintf(buf, "%u\n", newval);
595}
596
597static ssize_t store_pwm_enable(struct device *dev,
598 struct device_attribute *attr,
599 const char *buf, size_t count)
600{
088ce2ac 601 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
602 long reqval;
603 u8 currval, config, altbit, newval, minoff = 255;
604
179c4fdb 605 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
606 return -EINVAL;
607
608 switch (reqval) {
609 case 0:
610 newval = 0x04;
611 break;
612 case 1:
613 newval = 0x07;
614 break;
615 case 2:
616 newval = 0x00;
617 minoff = 1;
618 break;
619 case 3:
620 newval = 0x00;
621 minoff = 0;
622 break;
623 case 255:
624 newval = 0x03;
625 break;
626 default:
627 return -EINVAL;
628 }
629
630 config = newval & 0x07;
631 altbit = (newval >> 3) & 0x01;
632
633 mutex_lock(&data->update_lock);
634 config = (config & param->mask[0]) << param->shift[0];
635 altbit = (altbit & param->mask[1]) << param->shift[1];
636 currval = read_byte(client, param->msb[0]);
637 newval = config | (currval & ~(param->mask[0] << param->shift[0]));
638 newval = altbit | (newval & ~(param->mask[1] << param->shift[1]));
639 data->reg[param->msb[0]] = newval;
640 write_byte(client, param->msb[0], newval);
641 if (minoff < 255) {
642 minoff = (minoff & param->mask[2]) << param->shift[2];
643 currval = read_byte(client, param->msb[2]);
644 newval =
645 minoff | (currval & ~(param->mask[2] << param->shift[2]));
646 data->reg[param->msb[2]] = newval;
647 write_byte(client, param->msb[2], newval);
648 }
649 mutex_unlock(&data->update_lock);
650 return count;
651}
652
7a7176aa 653static const u32 asc7621_pwm_freq_map[] = {
d58de038
GJ
654 10, 15, 23, 30, 38, 47, 62, 94,
655 23000, 24000, 25000, 26000, 27000, 28000, 29000, 30000
656};
657
658static ssize_t show_pwm_freq(struct device *dev,
659 struct device_attribute *attr, char *buf)
660{
088ce2ac 661 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
662 u8 regval =
663 (data->reg[param->msb[0]] >> param->shift[0]) & param->mask[0];
664
2a844c14 665 regval = clamp_val(regval, 0, 15);
d58de038
GJ
666
667 return sprintf(buf, "%u\n", asc7621_pwm_freq_map[regval]);
668}
669
670static ssize_t store_pwm_freq(struct device *dev,
671 struct device_attribute *attr,
672 const char *buf, size_t count)
673{
088ce2ac 674 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
675 unsigned long reqval;
676 u8 currval, newval = 255;
677 int i;
678
179c4fdb 679 if (kstrtoul(buf, 10, &reqval))
d58de038
GJ
680 return -EINVAL;
681
682 for (i = 0; i < ARRAY_SIZE(asc7621_pwm_freq_map); i++) {
683 if (reqval == asc7621_pwm_freq_map[i]) {
684 newval = i;
685 break;
686 }
687 }
688 if (newval == 255)
689 return -EINVAL;
690
691 newval = (newval & param->mask[0]) << param->shift[0];
692
693 mutex_lock(&data->update_lock);
694 currval = read_byte(client, param->msb[0]);
695 newval |= (currval & ~(param->mask[0] << param->shift[0]));
696 data->reg[param->msb[0]] = newval;
697 write_byte(client, param->msb[0], newval);
698 mutex_unlock(&data->update_lock);
699 return count;
700}
701
7a7176aa 702static const u32 asc7621_pwm_auto_spinup_map[] = {
d58de038
GJ
703 0, 100, 250, 400, 700, 1000, 2000, 4000
704};
705
706static ssize_t show_pwm_ast(struct device *dev,
707 struct device_attribute *attr, char *buf)
708{
088ce2ac 709 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
710 u8 regval =
711 (data->reg[param->msb[0]] >> param->shift[0]) & param->mask[0];
712
2a844c14 713 regval = clamp_val(regval, 0, 7);
d58de038
GJ
714
715 return sprintf(buf, "%u\n", asc7621_pwm_auto_spinup_map[regval]);
716
717}
718
719static ssize_t store_pwm_ast(struct device *dev,
720 struct device_attribute *attr,
721 const char *buf, size_t count)
722{
088ce2ac 723 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
724 long reqval;
725 u8 currval, newval = 255;
726 u32 i;
727
179c4fdb 728 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
729 return -EINVAL;
730
731 for (i = 0; i < ARRAY_SIZE(asc7621_pwm_auto_spinup_map); i++) {
732 if (reqval == asc7621_pwm_auto_spinup_map[i]) {
733 newval = i;
734 break;
735 }
736 }
737 if (newval == 255)
738 return -EINVAL;
739
740 newval = (newval & param->mask[0]) << param->shift[0];
741
742 mutex_lock(&data->update_lock);
743 currval = read_byte(client, param->msb[0]);
744 newval |= (currval & ~(param->mask[0] << param->shift[0]));
745 data->reg[param->msb[0]] = newval;
746 write_byte(client, param->msb[0], newval);
747 mutex_unlock(&data->update_lock);
748 return count;
749}
750
7a7176aa 751static const u32 asc7621_temp_smoothing_time_map[] = {
d58de038
GJ
752 35000, 17600, 11800, 7000, 4400, 3000, 1600, 800
753};
754
755static ssize_t show_temp_st(struct device *dev,
756 struct device_attribute *attr, char *buf)
757{
088ce2ac 758 SETUP_SHOW_DATA_PARAM(dev, attr);
d58de038
GJ
759 u8 regval =
760 (data->reg[param->msb[0]] >> param->shift[0]) & param->mask[0];
2a844c14 761 regval = clamp_val(regval, 0, 7);
d58de038
GJ
762
763 return sprintf(buf, "%u\n", asc7621_temp_smoothing_time_map[regval]);
764}
765
766static ssize_t store_temp_st(struct device *dev,
767 struct device_attribute *attr,
768 const char *buf, size_t count)
769{
088ce2ac 770 SETUP_STORE_DATA_PARAM(dev, attr);
d58de038
GJ
771 long reqval;
772 u8 currval, newval = 255;
773 u32 i;
774
179c4fdb 775 if (kstrtol(buf, 10, &reqval))
d58de038
GJ
776 return -EINVAL;
777
778 for (i = 0; i < ARRAY_SIZE(asc7621_temp_smoothing_time_map); i++) {
779 if (reqval == asc7621_temp_smoothing_time_map[i]) {
780 newval = i;
781 break;
782 }
783 }
784
785 if (newval == 255)
786 return -EINVAL;
787
788 newval = (newval & param->mask[0]) << param->shift[0];
789
790 mutex_lock(&data->update_lock);
791 currval = read_byte(client, param->msb[0]);
792 newval |= (currval & ~(param->mask[0] << param->shift[0]));
793 data->reg[param->msb[0]] = newval;
794 write_byte(client, param->msb[0], newval);
795 mutex_unlock(&data->update_lock);
796 return count;
797}
798
799/*
800 * End of data handlers
801 *
802 * These defines do nothing more than make the table easier
803 * to read when wrapped at column 80.
804 */
805
806/*
807 * Creates a variable length array inititalizer.
808 * VAA(1,3,5,7) would produce {1,3,5,7}
809 */
810#define VAA(args...) {args}
811
812#define PREAD(name, n, pri, rm, rl, m, s, r) \
813 {.sda = SENSOR_ATTR(name, S_IRUGO, show_##r, NULL, n), \
814 .priority = pri, .msb[0] = rm, .lsb[0] = rl, .mask[0] = m, \
815 .shift[0] = s,}
816
817#define PWRITE(name, n, pri, rm, rl, m, s, r) \
818 {.sda = SENSOR_ATTR(name, S_IRUGO | S_IWUSR, show_##r, store_##r, n), \
819 .priority = pri, .msb[0] = rm, .lsb[0] = rl, .mask[0] = m, \
820 .shift[0] = s,}
821
822/*
823 * PWRITEM assumes that the initializers for the .msb, .lsb, .mask and .shift
824 * were created using the VAA macro.
825 */
826#define PWRITEM(name, n, pri, rm, rl, m, s, r) \
827 {.sda = SENSOR_ATTR(name, S_IRUGO | S_IWUSR, show_##r, store_##r, n), \
828 .priority = pri, .msb = rm, .lsb = rl, .mask = m, .shift = s,}
829
830static struct asc7621_param asc7621_params[] = {
831 PREAD(in0_input, 0, PRI_HIGH, 0x20, 0x13, 0, 0, in10),
832 PREAD(in1_input, 1, PRI_HIGH, 0x21, 0x18, 0, 0, in10),
833 PREAD(in2_input, 2, PRI_HIGH, 0x22, 0x11, 0, 0, in10),
834 PREAD(in3_input, 3, PRI_HIGH, 0x23, 0x12, 0, 0, in10),
835 PREAD(in4_input, 4, PRI_HIGH, 0x24, 0x14, 0, 0, in10),
836
837 PWRITE(in0_min, 0, PRI_LOW, 0x44, 0, 0, 0, in8),
838 PWRITE(in1_min, 1, PRI_LOW, 0x46, 0, 0, 0, in8),
839 PWRITE(in2_min, 2, PRI_LOW, 0x48, 0, 0, 0, in8),
840 PWRITE(in3_min, 3, PRI_LOW, 0x4a, 0, 0, 0, in8),
841 PWRITE(in4_min, 4, PRI_LOW, 0x4c, 0, 0, 0, in8),
842
843 PWRITE(in0_max, 0, PRI_LOW, 0x45, 0, 0, 0, in8),
844 PWRITE(in1_max, 1, PRI_LOW, 0x47, 0, 0, 0, in8),
845 PWRITE(in2_max, 2, PRI_LOW, 0x49, 0, 0, 0, in8),
846 PWRITE(in3_max, 3, PRI_LOW, 0x4b, 0, 0, 0, in8),
847 PWRITE(in4_max, 4, PRI_LOW, 0x4d, 0, 0, 0, in8),
848
d1bf8cf6
KM
849 PREAD(in0_alarm, 0, PRI_HIGH, 0x41, 0, 0x01, 0, bitmask),
850 PREAD(in1_alarm, 1, PRI_HIGH, 0x41, 0, 0x01, 1, bitmask),
851 PREAD(in2_alarm, 2, PRI_HIGH, 0x41, 0, 0x01, 2, bitmask),
852 PREAD(in3_alarm, 3, PRI_HIGH, 0x41, 0, 0x01, 3, bitmask),
853 PREAD(in4_alarm, 4, PRI_HIGH, 0x42, 0, 0x01, 0, bitmask),
d58de038
GJ
854
855 PREAD(fan1_input, 0, PRI_HIGH, 0x29, 0x28, 0, 0, fan16),
856 PREAD(fan2_input, 1, PRI_HIGH, 0x2b, 0x2a, 0, 0, fan16),
857 PREAD(fan3_input, 2, PRI_HIGH, 0x2d, 0x2c, 0, 0, fan16),
858 PREAD(fan4_input, 3, PRI_HIGH, 0x2f, 0x2e, 0, 0, fan16),
859
860 PWRITE(fan1_min, 0, PRI_LOW, 0x55, 0x54, 0, 0, fan16),
861 PWRITE(fan2_min, 1, PRI_LOW, 0x57, 0x56, 0, 0, fan16),
862 PWRITE(fan3_min, 2, PRI_LOW, 0x59, 0x58, 0, 0, fan16),
863 PWRITE(fan4_min, 3, PRI_LOW, 0x5b, 0x5a, 0, 0, fan16),
864
d1bf8cf6
KM
865 PREAD(fan1_alarm, 0, PRI_HIGH, 0x42, 0, 0x01, 2, bitmask),
866 PREAD(fan2_alarm, 1, PRI_HIGH, 0x42, 0, 0x01, 3, bitmask),
867 PREAD(fan3_alarm, 2, PRI_HIGH, 0x42, 0, 0x01, 4, bitmask),
868 PREAD(fan4_alarm, 3, PRI_HIGH, 0x42, 0, 0x01, 5, bitmask),
d58de038
GJ
869
870 PREAD(temp1_input, 0, PRI_HIGH, 0x25, 0x10, 0, 0, temp10),
871 PREAD(temp2_input, 1, PRI_HIGH, 0x26, 0x15, 0, 0, temp10),
872 PREAD(temp3_input, 2, PRI_HIGH, 0x27, 0x16, 0, 0, temp10),
873 PREAD(temp4_input, 3, PRI_HIGH, 0x33, 0x17, 0, 0, temp10),
874 PREAD(temp5_input, 4, PRI_HIGH, 0xf7, 0xf6, 0, 0, temp10),
875 PREAD(temp6_input, 5, PRI_HIGH, 0xf9, 0xf8, 0, 0, temp10),
876 PREAD(temp7_input, 6, PRI_HIGH, 0xfb, 0xfa, 0, 0, temp10),
877 PREAD(temp8_input, 7, PRI_HIGH, 0xfd, 0xfc, 0, 0, temp10),
878
879 PWRITE(temp1_min, 0, PRI_LOW, 0x4e, 0, 0, 0, temp8),
880 PWRITE(temp2_min, 1, PRI_LOW, 0x50, 0, 0, 0, temp8),
881 PWRITE(temp3_min, 2, PRI_LOW, 0x52, 0, 0, 0, temp8),
882 PWRITE(temp4_min, 3, PRI_LOW, 0x34, 0, 0, 0, temp8),
883
884 PWRITE(temp1_max, 0, PRI_LOW, 0x4f, 0, 0, 0, temp8),
885 PWRITE(temp2_max, 1, PRI_LOW, 0x51, 0, 0, 0, temp8),
886 PWRITE(temp3_max, 2, PRI_LOW, 0x53, 0, 0, 0, temp8),
887 PWRITE(temp4_max, 3, PRI_LOW, 0x35, 0, 0, 0, temp8),
888
d1bf8cf6
KM
889 PREAD(temp1_alarm, 0, PRI_HIGH, 0x41, 0, 0x01, 4, bitmask),
890 PREAD(temp2_alarm, 1, PRI_HIGH, 0x41, 0, 0x01, 5, bitmask),
891 PREAD(temp3_alarm, 2, PRI_HIGH, 0x41, 0, 0x01, 6, bitmask),
892 PREAD(temp4_alarm, 3, PRI_HIGH, 0x43, 0, 0x01, 0, bitmask),
d58de038
GJ
893
894 PWRITE(temp1_source, 0, PRI_LOW, 0x02, 0, 0x07, 4, bitmask),
895 PWRITE(temp2_source, 1, PRI_LOW, 0x02, 0, 0x07, 0, bitmask),
896 PWRITE(temp3_source, 2, PRI_LOW, 0x03, 0, 0x07, 4, bitmask),
897 PWRITE(temp4_source, 3, PRI_LOW, 0x03, 0, 0x07, 0, bitmask),
898
899 PWRITE(temp1_smoothing_enable, 0, PRI_LOW, 0x62, 0, 0x01, 3, bitmask),
900 PWRITE(temp2_smoothing_enable, 1, PRI_LOW, 0x63, 0, 0x01, 7, bitmask),
d1bf8cf6 901 PWRITE(temp3_smoothing_enable, 2, PRI_LOW, 0x63, 0, 0x01, 3, bitmask),
d58de038
GJ
902 PWRITE(temp4_smoothing_enable, 3, PRI_LOW, 0x3c, 0, 0x01, 3, bitmask),
903
904 PWRITE(temp1_smoothing_time, 0, PRI_LOW, 0x62, 0, 0x07, 0, temp_st),
905 PWRITE(temp2_smoothing_time, 1, PRI_LOW, 0x63, 0, 0x07, 4, temp_st),
906 PWRITE(temp3_smoothing_time, 2, PRI_LOW, 0x63, 0, 0x07, 0, temp_st),
907 PWRITE(temp4_smoothing_time, 3, PRI_LOW, 0x3c, 0, 0x07, 0, temp_st),
908
909 PWRITE(temp1_auto_point1_temp_hyst, 0, PRI_LOW, 0x6d, 0, 0x0f, 4,
910 bitmask),
911 PWRITE(temp2_auto_point1_temp_hyst, 1, PRI_LOW, 0x6d, 0, 0x0f, 0,
912 bitmask),
913 PWRITE(temp3_auto_point1_temp_hyst, 2, PRI_LOW, 0x6e, 0, 0x0f, 4,
914 bitmask),
915 PWRITE(temp4_auto_point1_temp_hyst, 3, PRI_LOW, 0x6e, 0, 0x0f, 0,
916 bitmask),
917
918 PREAD(temp1_auto_point2_temp_hyst, 0, PRI_LOW, 0x6d, 0, 0x0f, 4,
919 bitmask),
920 PREAD(temp2_auto_point2_temp_hyst, 1, PRI_LOW, 0x6d, 0, 0x0f, 0,
921 bitmask),
922 PREAD(temp3_auto_point2_temp_hyst, 2, PRI_LOW, 0x6e, 0, 0x0f, 4,
923 bitmask),
924 PREAD(temp4_auto_point2_temp_hyst, 3, PRI_LOW, 0x6e, 0, 0x0f, 0,
925 bitmask),
926
927 PWRITE(temp1_auto_point1_temp, 0, PRI_LOW, 0x67, 0, 0, 0, temp8),
928 PWRITE(temp2_auto_point1_temp, 1, PRI_LOW, 0x68, 0, 0, 0, temp8),
929 PWRITE(temp3_auto_point1_temp, 2, PRI_LOW, 0x69, 0, 0, 0, temp8),
930 PWRITE(temp4_auto_point1_temp, 3, PRI_LOW, 0x3b, 0, 0, 0, temp8),
931
932 PWRITEM(temp1_auto_point2_temp, 0, PRI_LOW, VAA(0x5f, 0x67), VAA(0),
933 VAA(0x0f), VAA(4), ap2_temp),
934 PWRITEM(temp2_auto_point2_temp, 1, PRI_LOW, VAA(0x60, 0x68), VAA(0),
935 VAA(0x0f), VAA(4), ap2_temp),
936 PWRITEM(temp3_auto_point2_temp, 2, PRI_LOW, VAA(0x61, 0x69), VAA(0),
937 VAA(0x0f), VAA(4), ap2_temp),
938 PWRITEM(temp4_auto_point2_temp, 3, PRI_LOW, VAA(0x3c, 0x3b), VAA(0),
939 VAA(0x0f), VAA(4), ap2_temp),
940
941 PWRITE(temp1_crit, 0, PRI_LOW, 0x6a, 0, 0, 0, temp8),
942 PWRITE(temp2_crit, 1, PRI_LOW, 0x6b, 0, 0, 0, temp8),
943 PWRITE(temp3_crit, 2, PRI_LOW, 0x6c, 0, 0, 0, temp8),
944 PWRITE(temp4_crit, 3, PRI_LOW, 0x3d, 0, 0, 0, temp8),
945
946 PWRITE(temp5_enable, 4, PRI_LOW, 0x0e, 0, 0x01, 0, bitmask),
947 PWRITE(temp6_enable, 5, PRI_LOW, 0x0e, 0, 0x01, 1, bitmask),
948 PWRITE(temp7_enable, 6, PRI_LOW, 0x0e, 0, 0x01, 2, bitmask),
949 PWRITE(temp8_enable, 7, PRI_LOW, 0x0e, 0, 0x01, 3, bitmask),
950
951 PWRITE(remote1_offset, 0, PRI_LOW, 0x1c, 0, 0, 0, temp62),
952 PWRITE(remote2_offset, 1, PRI_LOW, 0x1d, 0, 0, 0, temp62),
953
954 PWRITE(pwm1, 0, PRI_HIGH, 0x30, 0, 0, 0, u8),
955 PWRITE(pwm2, 1, PRI_HIGH, 0x31, 0, 0, 0, u8),
956 PWRITE(pwm3, 2, PRI_HIGH, 0x32, 0, 0, 0, u8),
957
958 PWRITE(pwm1_invert, 0, PRI_LOW, 0x5c, 0, 0x01, 4, bitmask),
959 PWRITE(pwm2_invert, 1, PRI_LOW, 0x5d, 0, 0x01, 4, bitmask),
960 PWRITE(pwm3_invert, 2, PRI_LOW, 0x5e, 0, 0x01, 4, bitmask),
961
962 PWRITEM(pwm1_enable, 0, PRI_LOW, VAA(0x5c, 0x5c, 0x62), VAA(0, 0, 0),
963 VAA(0x07, 0x01, 0x01), VAA(5, 3, 5), pwm_enable),
964 PWRITEM(pwm2_enable, 1, PRI_LOW, VAA(0x5d, 0x5d, 0x62), VAA(0, 0, 0),
965 VAA(0x07, 0x01, 0x01), VAA(5, 3, 6), pwm_enable),
966 PWRITEM(pwm3_enable, 2, PRI_LOW, VAA(0x5e, 0x5e, 0x62), VAA(0, 0, 0),
967 VAA(0x07, 0x01, 0x01), VAA(5, 3, 7), pwm_enable),
968
969 PWRITEM(pwm1_auto_channels, 0, PRI_LOW, VAA(0x5c, 0x5c), VAA(0, 0),
970 VAA(0x07, 0x01), VAA(5, 3), pwm_ac),
971 PWRITEM(pwm2_auto_channels, 1, PRI_LOW, VAA(0x5d, 0x5d), VAA(0, 0),
972 VAA(0x07, 0x01), VAA(5, 3), pwm_ac),
973 PWRITEM(pwm3_auto_channels, 2, PRI_LOW, VAA(0x5e, 0x5e), VAA(0, 0),
974 VAA(0x07, 0x01), VAA(5, 3), pwm_ac),
975
976 PWRITE(pwm1_auto_point1_pwm, 0, PRI_LOW, 0x64, 0, 0, 0, u8),
977 PWRITE(pwm2_auto_point1_pwm, 1, PRI_LOW, 0x65, 0, 0, 0, u8),
978 PWRITE(pwm3_auto_point1_pwm, 2, PRI_LOW, 0x66, 0, 0, 0, u8),
979
980 PWRITE(pwm1_auto_point2_pwm, 0, PRI_LOW, 0x38, 0, 0, 0, u8),
981 PWRITE(pwm2_auto_point2_pwm, 1, PRI_LOW, 0x39, 0, 0, 0, u8),
982 PWRITE(pwm3_auto_point2_pwm, 2, PRI_LOW, 0x3a, 0, 0, 0, u8),
983
984 PWRITE(pwm1_freq, 0, PRI_LOW, 0x5f, 0, 0x0f, 0, pwm_freq),
985 PWRITE(pwm2_freq, 1, PRI_LOW, 0x60, 0, 0x0f, 0, pwm_freq),
986 PWRITE(pwm3_freq, 2, PRI_LOW, 0x61, 0, 0x0f, 0, pwm_freq),
987
988 PREAD(pwm1_auto_zone_assigned, 0, PRI_LOW, 0, 0, 0x03, 2, bitmask),
989 PREAD(pwm2_auto_zone_assigned, 1, PRI_LOW, 0, 0, 0x03, 4, bitmask),
990 PREAD(pwm3_auto_zone_assigned, 2, PRI_LOW, 0, 0, 0x03, 6, bitmask),
991
992 PWRITE(pwm1_auto_spinup_time, 0, PRI_LOW, 0x5c, 0, 0x07, 0, pwm_ast),
993 PWRITE(pwm2_auto_spinup_time, 1, PRI_LOW, 0x5d, 0, 0x07, 0, pwm_ast),
994 PWRITE(pwm3_auto_spinup_time, 2, PRI_LOW, 0x5e, 0, 0x07, 0, pwm_ast),
995
996 PWRITE(peci_enable, 0, PRI_LOW, 0x40, 0, 0x01, 4, bitmask),
997 PWRITE(peci_avg, 0, PRI_LOW, 0x36, 0, 0x07, 0, bitmask),
998 PWRITE(peci_domain, 0, PRI_LOW, 0x36, 0, 0x01, 3, bitmask),
999 PWRITE(peci_legacy, 0, PRI_LOW, 0x36, 0, 0x01, 4, bitmask),
1000 PWRITE(peci_diode, 0, PRI_LOW, 0x0e, 0, 0x07, 4, bitmask),
1001 PWRITE(peci_4domain, 0, PRI_LOW, 0x0e, 0, 0x01, 4, bitmask),
1002
1003};
1004
1005static struct asc7621_data *asc7621_update_device(struct device *dev)
1006{
1007 struct i2c_client *client = to_i2c_client(dev);
1008 struct asc7621_data *data = i2c_get_clientdata(client);
1009 int i;
1010
1011/*
1012 * The asc7621 chips guarantee consistent reads of multi-byte values
1013 * regardless of the order of the reads. No special logic is needed
1014 * so we can just read the registers in whatever order they appear
1015 * in the asc7621_params array.
1016 */
1017
1018 mutex_lock(&data->update_lock);
1019
1020 /* Read all the high priority registers */
1021
1022 if (!data->valid ||
1023 time_after(jiffies, data->last_high_reading + INTERVAL_HIGH)) {
1024
1025 for (i = 0; i < ARRAY_SIZE(asc7621_register_priorities); i++) {
1026 if (asc7621_register_priorities[i] == PRI_HIGH) {
1027 data->reg[i] =
1028 i2c_smbus_read_byte_data(client, i) & 0xff;
1029 }
1030 }
1031 data->last_high_reading = jiffies;
a0393713 1032 } /* last_reading */
d58de038
GJ
1033
1034 /* Read all the low priority registers. */
1035
1036 if (!data->valid ||
1037 time_after(jiffies, data->last_low_reading + INTERVAL_LOW)) {
1038
1039 for (i = 0; i < ARRAY_SIZE(asc7621_params); i++) {
1040 if (asc7621_register_priorities[i] == PRI_LOW) {
1041 data->reg[i] =
1042 i2c_smbus_read_byte_data(client, i) & 0xff;
1043 }
1044 }
1045 data->last_low_reading = jiffies;
a0393713 1046 } /* last_reading */
d58de038
GJ
1047
1048 data->valid = 1;
1049
1050 mutex_unlock(&data->update_lock);
1051
1052 return data;
1053}
1054
1055/*
1056 * Standard detection and initialization below
1057 *
1058 * Helper function that checks if an address is valid
1059 * for a particular chip.
1060 */
1061
1062static inline int valid_address_for_chip(int chip_type, int address)
1063{
1064 int i;
1065
1066 for (i = 0; asc7621_chips[chip_type].addresses[i] != I2C_CLIENT_END;
1067 i++) {
1068 if (asc7621_chips[chip_type].addresses[i] == address)
1069 return 1;
1070 }
1071 return 0;
1072}
1073
1074static void asc7621_init_client(struct i2c_client *client)
1075{
1076 int value;
1077
1078 /* Warn if part was not "READY" */
1079
1080 value = read_byte(client, 0x40);
1081
1082 if (value & 0x02) {
1083 dev_err(&client->dev,
1084 "Client (%d,0x%02x) config is locked.\n",
1085 i2c_adapter_id(client->adapter), client->addr);
a0393713 1086 }
d58de038
GJ
1087 if (!(value & 0x04)) {
1088 dev_err(&client->dev, "Client (%d,0x%02x) is not ready.\n",
1089 i2c_adapter_id(client->adapter), client->addr);
a0393713 1090 }
d58de038
GJ
1091
1092/*
1093 * Start monitoring
1094 *
1095 * Try to clear LOCK, Set START, save everything else
1096 */
1097 value = (value & ~0x02) | 0x01;
1098 write_byte(client, 0x40, value & 0xff);
1099
1100}
1101
1102static int
1103asc7621_probe(struct i2c_client *client, const struct i2c_device_id *id)
1104{
1105 struct asc7621_data *data;
1106 int i, err;
1107
1108 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1109 return -EIO;
1110
35bb95a1
GR
1111 data = devm_kzalloc(&client->dev, sizeof(struct asc7621_data),
1112 GFP_KERNEL);
d58de038
GJ
1113 if (data == NULL)
1114 return -ENOMEM;
1115
1116 i2c_set_clientdata(client, data);
d58de038
GJ
1117 mutex_init(&data->update_lock);
1118
1119 /* Initialize the asc7621 chip */
1120 asc7621_init_client(client);
1121
1122 /* Create the sysfs entries */
1123 for (i = 0; i < ARRAY_SIZE(asc7621_params); i++) {
1124 err =
1125 device_create_file(&client->dev,
1126 &(asc7621_params[i].sda.dev_attr));
1127 if (err)
1128 goto exit_remove;
1129 }
1130
1131 data->class_dev = hwmon_device_register(&client->dev);
1132 if (IS_ERR(data->class_dev)) {
1133 err = PTR_ERR(data->class_dev);
1134 goto exit_remove;
1135 }
1136
1137 return 0;
1138
1139exit_remove:
1140 for (i = 0; i < ARRAY_SIZE(asc7621_params); i++) {
1141 device_remove_file(&client->dev,
1142 &(asc7621_params[i].sda.dev_attr));
1143 }
1144
d58de038
GJ
1145 return err;
1146}
1147
1148static int asc7621_detect(struct i2c_client *client,
1149 struct i2c_board_info *info)
1150{
1151 struct i2c_adapter *adapter = client->adapter;
1152 int company, verstep, chip_index;
d58de038
GJ
1153
1154 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1155 return -ENODEV;
1156
1157 for (chip_index = FIRST_CHIP; chip_index <= LAST_CHIP; chip_index++) {
1158
1159 if (!valid_address_for_chip(chip_index, client->addr))
1160 continue;
1161
1162 company = read_byte(client,
1163 asc7621_chips[chip_index].company_reg);
1164 verstep = read_byte(client,
1165 asc7621_chips[chip_index].verstep_reg);
1166
1167 if (company == asc7621_chips[chip_index].company_id &&
1168 verstep == asc7621_chips[chip_index].verstep_id) {
d58de038
GJ
1169 strlcpy(info->type, asc7621_chips[chip_index].name,
1170 I2C_NAME_SIZE);
1171
28cbd461
JD
1172 dev_info(&adapter->dev, "Matched %s at 0x%02x\n",
1173 asc7621_chips[chip_index].name, client->addr);
d58de038
GJ
1174 return 0;
1175 }
1176 }
1177
1178 return -ENODEV;
1179}
1180
1181static int asc7621_remove(struct i2c_client *client)
1182{
1183 struct asc7621_data *data = i2c_get_clientdata(client);
1184 int i;
1185
1186 hwmon_device_unregister(data->class_dev);
1187
1188 for (i = 0; i < ARRAY_SIZE(asc7621_params); i++) {
1189 device_remove_file(&client->dev,
1190 &(asc7621_params[i].sda.dev_attr));
1191 }
1192
d58de038
GJ
1193 return 0;
1194}
1195
1196static const struct i2c_device_id asc7621_id[] = {
1197 {"asc7621", asc7621},
1198 {"asc7621a", asc7621a},
1199 {},
1200};
1201
1202MODULE_DEVICE_TABLE(i2c, asc7621_id);
1203
1204static struct i2c_driver asc7621_driver = {
1205 .class = I2C_CLASS_HWMON,
1206 .driver = {
1207 .name = "asc7621",
1208 },
1209 .probe = asc7621_probe,
1210 .remove = asc7621_remove,
1211 .id_table = asc7621_id,
1212 .detect = asc7621_detect,
1213 .address_list = normal_i2c,
1214};
1215
1216static int __init sm_asc7621_init(void)
1217{
1218 int i, j;
1219/*
1220 * Collect all the registers needed into a single array.
1221 * This way, if a register isn't actually used for anything,
1222 * we don't retrieve it.
1223 */
1224
1225 for (i = 0; i < ARRAY_SIZE(asc7621_params); i++) {
1226 for (j = 0; j < ARRAY_SIZE(asc7621_params[i].msb); j++)
1227 asc7621_register_priorities[asc7621_params[i].msb[j]] =
1228 asc7621_params[i].priority;
1229 for (j = 0; j < ARRAY_SIZE(asc7621_params[i].lsb); j++)
1230 asc7621_register_priorities[asc7621_params[i].lsb[j]] =
1231 asc7621_params[i].priority;
1232 }
1233 return i2c_add_driver(&asc7621_driver);
1234}
1235
1236static void __exit sm_asc7621_exit(void)
1237{
1238 i2c_del_driver(&asc7621_driver);
1239}
1240
1241MODULE_LICENSE("GPL");
1242MODULE_AUTHOR("George Joseph");
1243MODULE_DESCRIPTION("Andigilog aSC7621 and aSC7621a driver");
1244
1245module_init(sm_asc7621_init);
1246module_exit(sm_asc7621_exit);