emcfan.c revision 1.1 1 /* $NetBSD: emcfan.c,v 1.1 2025/03/11 13:56:46 brad Exp $ */
2
3 /*
4 * Copyright (c) 2025 Brad Spencer <brad (at) anduin.eldar.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <sys/cdefs.h>
20 __KERNEL_RCSID(0, "$NetBSD: emcfan.c,v 1.1 2025/03/11 13:56:46 brad Exp $");
21
22 /*
23 * Driver for the EMC-210x and EMC-230x fan controllers on a
24 * I2C bus.
25 */
26
27 #include <sys/param.h>
28 #include <sys/systm.h>
29 #include <sys/kernel.h>
30 #include <sys/device.h>
31 #include <sys/module.h>
32 #include <sys/conf.h>
33 #include <sys/sysctl.h>
34 #include <sys/mutex.h>
35 #include <sys/condvar.h>
36 #include <sys/kthread.h>
37 #include <sys/pool.h>
38 #include <sys/kmem.h>
39
40 #include <dev/sysmon/sysmonvar.h>
41 #include <dev/i2c/i2cvar.h>
42 #include <dev/i2c/emcfanreg.h>
43 #include <dev/i2c/emcfanvar.h>
44 #include <dev/i2c/emcfaninfo.h>
45
46 static int emcfan_poke(i2c_tag_t, i2c_addr_t, bool);
47 static int emcfan_match(device_t, cfdata_t, void *);
48 static void emcfan_attach(device_t, device_t, void *);
49 static int emcfan_detach(device_t, int);
50 static void emcfan_refresh(struct sysmon_envsys *, envsys_data_t *);
51 static int emcfan_activate(device_t, enum devact);
52 static int emcfan_verify_sysctl(SYSCTLFN_ARGS);
53 static void emcfan_attach_gpio(struct emcfan_sc *, uint8_t);
54
55 #define EMCFAN_DEBUG
56 #ifdef EMCFAN_DEBUG
57 #define DPRINTF(s, l, x) \
58 do { \
59 if (l <= s->sc_emcfandebug) \
60 printf x; \
61 } while (/*CONSTCOND*/0)
62 #else
63 #define DPRINTF(s, l, x)
64 #endif
65
66 CFATTACH_DECL_NEW(emcfan, sizeof(struct emcfan_sc),
67 emcfan_match, emcfan_attach, emcfan_detach, emcfan_activate);
68
69 extern struct cfdriver emcfan_cd;
70
71 static dev_type_open(emcfanopen);
72 static dev_type_read(emcfanread);
73 static dev_type_write(emcfanwrite);
74 static dev_type_close(emcfanclose);
75 const struct cdevsw emcfan_cdevsw = {
76 .d_open = emcfanopen,
77 .d_close = emcfanclose,
78 .d_read = emcfanread,
79 .d_write = emcfanwrite,
80 .d_ioctl = noioctl,
81 .d_stop = nostop,
82 .d_tty = notty,
83 .d_poll = nopoll,
84 .d_mmap = nommap,
85 .d_kqfilter = nokqfilter,
86 .d_discard = nodiscard,
87 .d_flag = D_OTHER
88 };
89
90 static bool
91 emcfan_reg_is_real(struct emcfan_sc *sc, uint8_t reg)
92 {
93 int segment;
94 uint64_t index;
95
96 segment = reg / 64;
97 index = reg % 64;
98
99 DPRINTF(sc, 10, ("%s: void check 1: reg=%02x, segment=%d, index=%jd, sc_info_info=%d\n", __func__, reg,
100 segment, index, sc->sc_info_index));
101 DPRINTF(sc, 10, ("%s: void check 2: register_void=%jx, shift=%jx\n", __func__,
102 emcfan_chip_infos[sc->sc_info_index].register_void[segment], ((uint64_t)1 << index)));
103
104 return(emcfan_chip_infos[sc->sc_info_index].register_void[segment] & ((uint64_t)1 << index));
105 }
106
107 static int
108 emcfan_read_registerr(i2c_tag_t tag, i2c_addr_t addr, uint8_t reg,
109 uint8_t *res)
110 {
111 int error = 0;
112
113 error = iic_exec(tag, I2C_OP_READ_WITH_STOP, addr, ®, 1, res, 1, 0);
114
115 return error;
116 }
117
118 static int
119 emcfan_read_register(struct emcfan_sc *sc, uint8_t reg, uint8_t *res)
120 {
121 if (emcfan_reg_is_real(sc,reg))
122 return(emcfan_read_registerr(sc->sc_tag, sc->sc_addr, reg, res));
123 else
124 *res = EMCFAN_VOID_READ;
125 return 0;
126 }
127
128 static int
129 emcfan_write_registerr(i2c_tag_t tag, i2c_addr_t addr, uint8_t reg,
130 uint8_t value)
131 {
132 int error = 0;
133
134 error = iic_exec(tag, I2C_OP_WRITE_WITH_STOP, addr, ®, 1, &value, 1, 0);
135
136 return error;
137 }
138
139 static int
140 emcfan_write_register(struct emcfan_sc *sc, uint8_t reg, uint8_t value)
141 {
142 if (emcfan_reg_is_real(sc,reg))
143 return(emcfan_write_registerr(sc->sc_tag, sc->sc_addr, reg, value));
144 else
145 return EACCES;
146 }
147
148 static int
149 emcfan_poke(i2c_tag_t tag, i2c_addr_t addr, bool matchdebug)
150 {
151 int error;
152 uint8_t res;
153
154 error = emcfan_read_registerr(tag, addr, EMCFAN_MANUFACTURER_ID, &res);
155 if (matchdebug) {
156 printf("poke X 1: %d %d\n", addr, error);
157 }
158
159 /* Ok.. something was there, but the ID did not match what was expected.
160 * We get away with doing this because the poke is just getting the Manufacturer
161 * ID, which is a fixed value.
162 */
163
164 if (!error) {
165 if (res != EMCFAN_VALID_MANUFACTURER_ID)
166 error = EIO;
167 }
168
169 return error;
170 }
171
172 static bool
173 emcfan_check_i2c_addr(i2c_addr_t addr)
174 {
175 bool r = false;
176
177 for(int i = 0;i < __arraycount(emcfan_typical_addrs); i++)
178 if (addr == emcfan_typical_addrs[i]) {
179 r = true;
180 break;
181 }
182
183 return(r);
184 }
185
186 static int
187 emcfan_match(device_t parent, cfdata_t match, void *aux)
188 {
189 struct i2c_attach_args *ia = aux;
190 int error, match_result;
191 const bool matchdebug = false;
192
193 if (iic_use_direct_match(ia, match, NULL, &match_result))
194 return match_result;
195
196 if (matchdebug) {
197 printf("Looking at ia_addr: %x\n",ia->ia_addr);
198 }
199
200 /* Look to see if there is a device indirectly */
201
202 if (! emcfan_check_i2c_addr(ia->ia_addr))
203 return 0;
204
205 /*
206 * Check to see if something is really at this i2c address.
207 * This will keep phantom devices from appearing
208 */
209 if (iic_acquire_bus(ia->ia_tag, 0) != 0) {
210 if (matchdebug)
211 printf("in match acquire bus failed\n");
212 return 0;
213 }
214
215 error = emcfan_poke(ia->ia_tag, ia->ia_addr, matchdebug);
216 iic_release_bus(ia->ia_tag, 0);
217
218 return error == 0 ? I2C_MATCH_ADDRESS_AND_PROBE : 0;
219 }
220
221 static int
222 emcfan_find_info(uint8_t product)
223 {
224 for(int i = 0;i < __arraycount(emcfan_chip_infos); i++)
225 if (product == emcfan_chip_infos[i].product_id)
226 return(i);
227
228 return(-1);
229 }
230
231 static const char *
232 emcfan_product_to_name(uint8_t info_index)
233 {
234 KASSERT(info_index >= 0);
235
236 return(emcfan_chip_infos[info_index].name);
237 }
238
239 int
240 emcfan_verify_sysctl(SYSCTLFN_ARGS)
241 {
242 int error, t;
243 struct sysctlnode node;
244
245 node = *rnode;
246 t = *(int *)rnode->sysctl_data;
247 node.sysctl_data = &t;
248 error = sysctl_lookup(SYSCTLFN_CALL(&node));
249 if (error || newp == NULL)
250 return error;
251
252 if (t < 0)
253 return EINVAL;
254
255 *(int *)rnode->sysctl_data = t;
256
257 return 0;
258 }
259
260 static int
261 emcfan_sysctl_init(struct emcfan_sc *sc)
262 {
263 int error;
264 const struct sysctlnode *cnode;
265 int sysctlroot_num;
266 char pole_name[8];
267
268 if ((error = sysctl_createv(&sc->sc_emcfanlog, 0, NULL, &cnode,
269 0, CTLTYPE_NODE, device_xname(sc->sc_dev),
270 SYSCTL_DESCR("emcfan controls"), NULL, 0, NULL, 0, CTL_HW,
271 CTL_CREATE, CTL_EOL)) != 0)
272 return error;
273
274 sysctlroot_num = cnode->sysctl_num;
275
276 #ifdef EMCFAN_DEBUG
277 if ((error = sysctl_createv(&sc->sc_emcfanlog, 0, NULL, &cnode,
278 CTLFLAG_READWRITE, CTLTYPE_INT, "debug",
279 SYSCTL_DESCR("Debug level"), emcfan_verify_sysctl, 0,
280 &sc->sc_emcfandebug, 0, CTL_HW, sysctlroot_num, CTL_CREATE,
281 CTL_EOL)) != 0)
282 return error;
283
284 #endif
285
286 if (emcfan_chip_infos[sc->sc_info_index].family == EMCFAN_FAMILY_230X ||
287 emcfan_chip_infos[sc->sc_info_index].product_id == EMCFAN_PRODUCT_2103_1 ||
288 emcfan_chip_infos[sc->sc_info_index].product_id == EMCFAN_PRODUCT_2103_24 ||
289 emcfan_chip_infos[sc->sc_info_index].product_id == EMCFAN_PRODUCT_2104 ||
290 emcfan_chip_infos[sc->sc_info_index].product_id == EMCFAN_PRODUCT_2106) {
291 for(int i=0;i < emcfan_chip_infos[sc->sc_info_index].num_tachs;i++) {
292 snprintf(pole_name,sizeof(pole_name),"poles%d",i+1);
293 if ((error = sysctl_createv(&sc->sc_emcfanlog, 0, NULL, &cnode,
294 CTLFLAG_READWRITE, CTLTYPE_INT, pole_name,
295 SYSCTL_DESCR("Number of poles"), emcfan_verify_sysctl, 0,
296 &sc->sc_num_poles[i], 0, CTL_HW, sysctlroot_num, CTL_CREATE,
297 CTL_EOL)) != 0)
298 return error;
299 }
300 }
301 if (emcfan_chip_infos[sc->sc_info_index].product_id == EMCFAN_PRODUCT_2103_1 ||
302 emcfan_chip_infos[sc->sc_info_index].product_id == EMCFAN_PRODUCT_2103_24) {
303 if ((error = sysctl_createv(&sc->sc_emcfanlog, 0, NULL, &cnode,
304 CTLFLAG_READWRITE, CTLTYPE_INT, "ftach",
305 SYSCTL_DESCR("ftach frequency"), emcfan_verify_sysctl, 0,
306 &sc->sc_ftach, 0, CTL_HW, sysctlroot_num, CTL_CREATE,
307 CTL_EOL)) != 0)
308 return error;
309 }
310 if (emcfan_chip_infos[sc->sc_info_index].vin4_temp_zone) {
311 if ((error = sysctl_createv(&sc->sc_emcfanlog, 0, NULL, &cnode,
312 CTLFLAG_READWRITE, CTLTYPE_BOOL, "vin4",
313 SYSCTL_DESCR("Use VIN4 pin as a temperature sensor input"), NULL, 0,
314 &sc->sc_vin4_temp, 0, CTL_HW, sysctlroot_num, CTL_CREATE,
315 CTL_EOL)) != 0)
316 return error;
317 }
318
319 return 0;
320 }
321
322 static void
323 emcfan_attach(device_t parent, device_t self, void *aux)
324 {
325 struct emcfan_sc *sc;
326 struct i2c_attach_args *ia;
327 uint8_t product_id, revision;
328 int error;
329
330 ia = aux;
331 sc = device_private(self);
332
333 sc->sc_dev = self;
334 sc->sc_tag = ia->ia_tag;
335 sc->sc_addr = ia->ia_addr;
336 sc->sc_opened = false;
337 sc->sc_dying = false;
338 sc->sc_ftach = 32000;
339 sc->sc_vin4_temp = false;
340 for(int i=0;i < EMCFAN_NUM_FANS;i++)
341 sc->sc_num_poles[i] = 2;
342 sc->sc_emcfandebug = 0;
343
344 mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE);
345
346 aprint_normal("\n");
347
348 if ((sc->sc_sme = sysmon_envsys_create()) == NULL) {
349 aprint_error_dev(self,
350 "Unable to create sysmon structure\n");
351 sc->sc_sme = NULL;
352 return;
353 }
354
355 error = iic_acquire_bus(sc->sc_tag, 0);
356 if (error) {
357 aprint_error_dev(self, "Could not acquire iic bus: %d\n",
358 error);
359 goto out;
360 }
361
362 error = emcfan_read_registerr(sc->sc_tag, sc->sc_addr, EMCFAN_PRODUCT_ID, &product_id);
363 if (error != 0) {
364 aprint_error_dev(self, "Could not get the product id\n");
365 } else {
366 error = emcfan_read_registerr(sc->sc_tag, sc->sc_addr, EMCFAN_REVISION, &revision);
367 if (error != 0) {
368 aprint_error_dev(self, "Could not get the revision of the chip\n");
369 }
370 }
371
372 iic_release_bus(sc->sc_tag, 0);
373 if (error != 0) {
374 aprint_error_dev(self, "Unable to setup device\n");
375 goto out;
376 }
377
378 sc->sc_info_index = emcfan_find_info(product_id);
379 if (sc->sc_info_index < 0) {
380 aprint_error_dev(self, "Unknown product id: %02x\n",product_id);
381 goto out;
382 }
383
384 if ((error = emcfan_sysctl_init(sc)) != 0) {
385 sc->sc_emcfanlog = NULL;
386 aprint_error_dev(self, "Can't setup sysctl tree (%d)\n", error);
387 goto out;
388 }
389
390 for(int i=0;i < EMCFAN_NUM_SENSORS;i++)
391 sc->sc_sensor_instances[i].sc_i_member = -1;
392
393 int sensor_instance = 0;
394 /* Set up the tachs */
395 for(int i = 0;i < emcfan_chip_infos[sc->sc_info_index].num_tachs &&
396 sensor_instance < EMCFAN_NUM_SENSORS;
397 i++) {
398 snprintf(sc->sc_sensors[sensor_instance].desc,
399 sizeof(sc->sc_sensors[sensor_instance].desc),
400 "FAN %d",i+1);
401
402 DPRINTF(sc, 2, ("%s: TACH registering fan sensor %d (%s)\n", __func__,
403 sensor_instance, sc->sc_sensors[sensor_instance].desc));
404
405 sc->sc_sensor_instances[sensor_instance].sc_i_flags = 0;
406 sc->sc_sensor_instances[sensor_instance].sc_i_member = i + 1;
407 sc->sc_sensors[sensor_instance].units = ENVSYS_SFANRPM;
408 sc->sc_sensors[sensor_instance].state = ENVSYS_SINVALID;
409
410 error = sysmon_envsys_sensor_attach(sc->sc_sme,
411 &sc->sc_sensors[sensor_instance]);
412 if (error) {
413 aprint_error_dev(self,
414 "Unable to attach sensor %d: %d\n", i, error);
415 goto out;
416 }
417
418 sc->sc_sensor_instances[sensor_instance].sc_i_envnum =
419 sc->sc_sensors[sensor_instance].sensor;
420
421 DPRINTF(sc, 2, ("%s: TACH recorded sensor instance number %d->%d\n", __func__,
422 sensor_instance, sc->sc_sensor_instances[sensor_instance].sc_i_envnum));
423
424 sensor_instance++;
425 }
426
427 /* Set up internal temperature sensor */
428 if (emcfan_chip_infos[sc->sc_info_index].internal_temp_zone) {
429 snprintf(sc->sc_sensors[sensor_instance].desc,
430 sizeof(sc->sc_sensors[sensor_instance].desc),
431 "internal temperature");
432
433 DPRINTF(sc, 2, ("%s: IT registering internal temperature sensor %d (%s)\n", __func__,
434 sensor_instance, sc->sc_sensors[sensor_instance].desc));
435
436 sc->sc_sensor_instances[sensor_instance].sc_i_flags = EMCFAN_INTERNAL_TEMP;
437 sc->sc_sensor_instances[sensor_instance].sc_i_member = 1;
438 sc->sc_sensors[sensor_instance].units = ENVSYS_STEMP;
439 sc->sc_sensors[sensor_instance].state = ENVSYS_SINVALID;
440
441 error = sysmon_envsys_sensor_attach(sc->sc_sme,
442 &sc->sc_sensors[sensor_instance]);
443 if (error) {
444 aprint_error_dev(self,
445 "Unable to attach internal sensor: %d\n", error);
446 goto out;
447 }
448
449 sc->sc_sensor_instances[sensor_instance].sc_i_envnum =
450 sc->sc_sensors[sensor_instance].sensor;
451
452 DPRINTF(sc, 2, ("%s: IT recorded sensor instance number %d->%d\n", __func__,
453 sensor_instance, sc->sc_sensor_instances[sensor_instance].sc_i_envnum));
454
455 sensor_instance++;
456 }
457
458 /* Set up VIN4 temperature sensor */
459 if (emcfan_chip_infos[sc->sc_info_index].vin4_temp_zone) {
460 snprintf(sc->sc_sensors[sensor_instance].desc,
461 sizeof(sc->sc_sensors[sensor_instance].desc),
462 "VIN4 temperature");
463
464 DPRINTF(sc, 2, ("%s: registering VIN4 temperature sensor %d (%s)\n", __func__,
465 sensor_instance, sc->sc_sensors[sensor_instance].desc));
466
467 sc->sc_sensor_instances[sensor_instance].sc_i_flags = EMCFAN_VIN4_TEMP;
468 sc->sc_sensor_instances[sensor_instance].sc_i_member = 1;
469 sc->sc_sensors[sensor_instance].units = ENVSYS_STEMP;
470 sc->sc_sensors[sensor_instance].state = ENVSYS_SINVALID;
471
472 error = sysmon_envsys_sensor_attach(sc->sc_sme,
473 &sc->sc_sensors[sensor_instance]);
474 if (error) {
475 aprint_error_dev(self,
476 "Unable to attach VIN4 sensor: %d\n", error);
477 goto out;
478 }
479
480 sc->sc_sensor_instances[sensor_instance].sc_i_envnum =
481 sc->sc_sensors[sensor_instance].sensor;
482
483 DPRINTF(sc, 2, ("%s: VIN4 recorded sensor instance number %d->%d\n", __func__,
484 sensor_instance, sc->sc_sensor_instances[sensor_instance].sc_i_envnum));
485
486 sensor_instance++;
487 }
488
489 /* Set up external temperature sensors */
490 for(int i = 0;i < emcfan_chip_infos[sc->sc_info_index].num_external_temp_zones &&
491 sensor_instance < EMCFAN_NUM_SENSORS;
492 i++) {
493 snprintf(sc->sc_sensors[sensor_instance].desc,
494 sizeof(sc->sc_sensors[sensor_instance].desc),
495 "temperature zone %d",i+1);
496
497 DPRINTF(sc, 2, ("%s: ET registering fan sensor %d (%s)\n", __func__,
498 sensor_instance, sc->sc_sensors[sensor_instance].desc));
499
500 sc->sc_sensor_instances[sensor_instance].sc_i_flags = 0;
501 sc->sc_sensor_instances[sensor_instance].sc_i_member = i + 1;
502 sc->sc_sensors[sensor_instance].units = ENVSYS_STEMP;
503 sc->sc_sensors[sensor_instance].state = ENVSYS_SINVALID;
504
505 error = sysmon_envsys_sensor_attach(sc->sc_sme,
506 &sc->sc_sensors[sensor_instance]);
507 if (error) {
508 aprint_error_dev(self,
509 "Unable to attach sensor %d: %d\n", i, error);
510 goto out;
511 }
512
513 sc->sc_sensor_instances[sensor_instance].sc_i_envnum =
514 sc->sc_sensors[sensor_instance].sensor;
515
516 DPRINTF(sc, 2, ("%s: ET recorded sensor instance number %d->%d\n", __func__,
517 sensor_instance, sc->sc_sensor_instances[sensor_instance].sc_i_envnum));
518
519 sensor_instance++;
520 }
521
522 sc->sc_sme->sme_name = device_xname(sc->sc_dev);
523 sc->sc_sme->sme_cookie = sc;
524 sc->sc_sme->sme_refresh = emcfan_refresh;
525
526 if (sysmon_envsys_register(sc->sc_sme)) {
527 aprint_error_dev(self, "unable to register with sysmon\n");
528 sysmon_envsys_destroy(sc->sc_sme);
529 sc->sc_sme = NULL;
530 return;
531 }
532
533 aprint_normal_dev(self, "Microchip Technology %s fan controller, "
534 "Revision: %02x\n",
535 emcfan_product_to_name(sc->sc_info_index),
536 revision);
537 int e = emcfan_chip_infos[sc->sc_info_index].num_external_temp_zones;
538 if (emcfan_chip_infos[sc->sc_info_index].vin4_temp_zone)
539 e++;
540 aprint_normal_dev(self, "Fans: %d, Tachometers: %d, Internal Temperature: %s, External Sensors: %d, GPIO: %s\n",
541 emcfan_chip_infos[sc->sc_info_index].num_fans,
542 emcfan_chip_infos[sc->sc_info_index].num_tachs,
543 (emcfan_chip_infos[sc->sc_info_index].internal_temp_zone) ? "Yes" : "No",
544 e,
545 (emcfan_chip_infos[sc->sc_info_index].num_gpio_pins > 0) ? "Yes" : "No");
546
547 if (emcfan_chip_infos[sc->sc_info_index].num_gpio_pins > 0)
548 emcfan_attach_gpio(sc, product_id);
549 return;
550 out:
551 sysmon_envsys_destroy(sc->sc_sme);
552 sc->sc_sme = NULL;
553 }
554
555 /* The EMC-2101 is quite a bit different than the other EMC fan controllers.
556 * Handle it differently.
557 */
558
559 static void
560 emcfan_refresh_2101_tach(struct sysmon_envsys *sme, envsys_data_t *edata, int instance)
561 {
562 struct emcfan_sc *sc = sme->sme_cookie;
563
564 int error;
565 uint8_t tach_high_reg;
566 uint8_t tach_low_reg;
567 uint8_t tach_high;
568 uint8_t tach_low;
569
570 switch(sc->sc_sensor_instances[instance].sc_i_member) {
571 case 1:
572 tach_high_reg = EMCFAN_2101_TACH_HIGH;
573 tach_low_reg = EMCFAN_2101_TACH_LOW;
574 break;
575 default:
576 panic("A 2101 can not have more than one tach\n");
577 break;
578 };
579
580 DPRINTF(sc, 2, ("%s: dev=%s, instance=%d, sc_i_member=%d, tach_high_reg=0x%02X, tach_low_reg=0x%02X\n", __func__,
581 device_xname(sc->sc_dev), instance,
582 sc->sc_sensor_instances[instance].sc_i_member,
583 tach_high_reg, tach_low_reg));
584
585 error = iic_acquire_bus(sc->sc_tag, 0);
586 if (error) {
587 device_printf(sc->sc_dev,"%s: could not acquire I2C bus: %d\n",__func__, error);
588 return;
589 }
590
591 /* There is a interlock thing with the low and high bytes. Read the
592 * low byte first.
593 */
594
595 error = emcfan_read_register(sc, tach_low_reg, &tach_low);
596 if (error) {
597 device_printf(sc->sc_dev,"%s: could not read tach low register: %d\n",__func__, error);
598 iic_release_bus(sc->sc_tag, 0);
599 return;
600 }
601 error = emcfan_read_register(sc, tach_high_reg, &tach_high);
602 if (error) {
603 device_printf(sc->sc_dev,"%s: could not read tach high register: %d\n",__func__, error);
604 iic_release_bus(sc->sc_tag, 0);
605 return;
606 }
607
608 iic_release_bus(sc->sc_tag, 0);
609
610 uint16_t count;
611 count = tach_high << 8;
612 count |= tach_low;
613
614 DPRINTF(sc, 2, ("%s: instance=%d, tach_high=%d 0x%02X, tach_low=%d 0x%02X, count=%d\n", __func__,
615 instance, tach_high, tach_high, tach_low, tach_low, count));
616
617 /* 0xffff indicates that the fan is not present, stopped / stalled
618 * or below the RPM that can be measured or the chip is not configured
619 * to read tach signals on the pin, but is being used for an alert
620 */
621
622 if (count == 0xffff)
623 return;
624
625 /* The formula is:
626 *
627 * rpm = 5400000 / count
628 *
629 */
630
631 uint64_t irpm;
632
633 irpm = 5400000 / count;
634
635 edata->value_cur = (uint32_t) irpm;
636 edata->state = ENVSYS_SVALID;
637 }
638
639 static void
640 emcfan_refresh_210_346_230x_tach(int product_family, uint8_t product_id,
641 struct sysmon_envsys *sme, envsys_data_t *edata, int instance)
642 {
643 struct emcfan_sc *sc = sme->sme_cookie;
644
645 int error;
646 uint8_t tach_high_reg;
647 uint8_t tach_low_reg;
648 uint8_t fan_config_reg;
649 uint8_t chip_config;
650 uint8_t fan_config;
651 uint8_t tach_high;
652 uint8_t tach_low;
653 int ftach = 32000;
654 int edges;
655 int poles;
656 int m;
657
658 if (product_family == EMCFAN_FAMILY_210X) {
659 switch(sc->sc_sensor_instances[instance].sc_i_member) {
660 case 1:
661 fan_config_reg = EMCFAN_210_346_CONFIG_1;
662 tach_high_reg = EMCFAN_210_346_TACH_1_HIGH;
663 tach_low_reg = EMCFAN_210_346_TACH_1_LOW;
664 break;
665 case 2:
666 fan_config_reg = EMCFAN_210_346_CONFIG_2;
667 tach_high_reg = EMCFAN_210_346_TACH_2_HIGH;
668 tach_low_reg = EMCFAN_210_346_TACH_2_LOW;
669 break;
670 default:
671 panic("210X family do not know how to deal with member: %d\n",
672 sc->sc_sensor_instances[instance].sc_i_member);
673 break;
674 };
675 } else {
676 switch(sc->sc_sensor_instances[instance].sc_i_member) {
677 case 1:
678 fan_config_reg = EMCFAN_230X_CONFIG_1;
679 tach_high_reg = EMCFAN_230X_TACH_1_HIGH;
680 tach_low_reg = EMCFAN_230X_TACH_1_LOW;
681 break;
682 case 2:
683 fan_config_reg = EMCFAN_230X_CONFIG_2;
684 tach_high_reg = EMCFAN_230X_TACH_2_HIGH;
685 tach_low_reg = EMCFAN_230X_TACH_2_LOW;
686 break;
687 case 3:
688 fan_config_reg = EMCFAN_230X_CONFIG_3;
689 tach_high_reg = EMCFAN_230X_TACH_3_HIGH;
690 tach_low_reg = EMCFAN_230X_TACH_3_LOW;
691 break;
692 case 4:
693 fan_config_reg = EMCFAN_230X_CONFIG_4;
694 tach_high_reg = EMCFAN_230X_TACH_4_HIGH;
695 tach_low_reg = EMCFAN_230X_TACH_4_LOW;
696 break;
697 case 5:
698 fan_config_reg = EMCFAN_230X_CONFIG_5;
699 tach_high_reg = EMCFAN_230X_TACH_5_HIGH;
700 tach_low_reg = EMCFAN_230X_TACH_5_LOW;
701 break;
702 default:
703 panic("230X family do not know how to deal with member: %d\n",
704 sc->sc_sensor_instances[instance].sc_i_member);
705 break;
706 };
707 }
708
709 DPRINTF(sc, 2, ("%s: dev=%s, instance=%d, sc_i_member=%d, fan_config_reg=0x%02X, tach_high_reg=0x%02X, tach_low_reg=0x%02X\n", __func__,
710 device_xname(sc->sc_dev), instance,
711 sc->sc_sensor_instances[instance].sc_i_member,
712 fan_config_reg, tach_high_reg, tach_low_reg));
713
714 error = iic_acquire_bus(sc->sc_tag, 0);
715 if (error) {
716 device_printf(sc->sc_dev,"%s: could not acquire I2C bus: %d\n",__func__, error);
717 return;
718 }
719
720 if (product_id == EMCFAN_PRODUCT_2103_1 ||
721 product_id == EMCFAN_PRODUCT_2103_24) {
722 ftach = sc->sc_ftach;
723 } else {
724 chip_config = 0x00;
725 if (product_family == EMCFAN_FAMILY_230X) {
726 error = emcfan_read_register(sc, EMCFAN_CHIP_CONFIG, &chip_config);
727 } else {
728 if (product_id == EMCFAN_PRODUCT_2104 ||
729 product_id == EMCFAN_PRODUCT_2106) {
730 error = emcfan_read_register(sc, EMCFAN_MUX_PINS, &chip_config);
731 }
732 }
733 if (error) {
734 device_printf(sc->sc_dev,"%s: could not read chip config: %d\n",__func__, error);
735 iic_release_bus(sc->sc_tag, 0);
736 return;
737 }
738
739 /* Figure out if there is an external clock involved */
740 if (product_family == EMCFAN_FAMILY_230X) {
741 if (chip_config & 0x02)
742 ftach = 32000;
743 else
744 if (chip_config & 0x01)
745 ftach = 32768;
746 else
747 ftach = 32000;
748 } else {
749 if (product_id == EMCFAN_PRODUCT_2104 ||
750 product_id == EMCFAN_PRODUCT_2106) {
751 if (chip_config & 0x01)
752 ftach = 32768;
753 else
754 ftach = 32000;
755 }
756 }
757
758 }
759
760 error = emcfan_read_register(sc, fan_config_reg, &fan_config);
761 if (error) {
762 device_printf(sc->sc_dev,"%s: could not read fan config: %d\n",__func__, error);
763 iic_release_bus(sc->sc_tag, 0);
764 return;
765 }
766
767 /* There is a interlock thing with the low and high bytes. Read the
768 * low byte first.
769 */
770
771 error = emcfan_read_register(sc, tach_low_reg, &tach_low);
772 if (error) {
773 device_printf(sc->sc_dev,"%s: could not read tach low register: %d\n",__func__, error);
774 iic_release_bus(sc->sc_tag, 0);
775 return;
776 }
777 error = emcfan_read_register(sc, tach_high_reg, &tach_high);
778 if (error) {
779 device_printf(sc->sc_dev,"%s: could not read tach high register: %d\n",__func__, error);
780 iic_release_bus(sc->sc_tag, 0);
781 return;
782 }
783
784 iic_release_bus(sc->sc_tag, 0);
785
786 /* Return early if the fan is stalled or not hooked up. It might be better to look at
787 * the stalled fan status register, but that works differently depending on which chip
788 * you are looking at.
789 */
790
791 if (product_family == EMCFAN_FAMILY_210X) {
792 /* The datasheet is not at all clear as to what will be set in the low byte of the tach
793 * 0xc0, 0xe0 and 0xf0 all seem to depend on the minimum expected rpm and 0xf8 appears
794 * to mean that the fan is stalled in some way.
795 *
796 * Further to confuse matters, some chips may be able to adjust what invalid means.
797 * See the fan config register (0x4A) on the EMC2101 for an example of that. We check
798 * tach_low here just in case these chips can do that too.
799 */
800 if (tach_high == 0xff &&
801 (tach_low == 0xc0 || tach_low == 0xe0 ||
802 tach_low == 0xf0 || tach_low == 0xf8 ||
803 tach_low == 0xff))
804 return;
805 } else {
806 /* The datasheet for the 230X family was a little clearer. In that one, if the high byte is
807 * 0xff the tach reading is invalid.
808 */
809 if (tach_high == 0xff)
810 return;
811 }
812
813 /* Extract the M value, also known as the tach multiplier */
814 m = fan_config & 0b01100000;
815 m = m >> 5;
816
817 DPRINTF(sc, 2, ("%s: fan_config=%d 0x%02X, raw m=%d 0x%02X\n",
818 __func__, fan_config, fan_config, m, m));
819
820 m = (1 << m);
821
822 /* Extract the number of configured edges */
823 edges = fan_config & 0b00011000;
824 edges = edges >> 3;
825
826 DPRINTF(sc, 2, ("%s: fan_config=%d 0x%02X, raw edges=%d 0x%02X\n",
827 __func__, fan_config, fan_config, edges, edges));
828
829 edges = ((edges + 1) * 2) + 1;
830
831 /* Calculate the tach count, which needs to use bit weights */
832 int count = 0;
833 count = (tach_high << 5) | tach_low;
834
835 /* The number of poles is a sysctl setting */
836 poles = sc->sc_num_poles[sc->sc_sensor_instances[instance].sc_i_member - 1];
837
838 DPRINTF(sc, 2, ("%s: instance=%d, ftach=%d, m=%d, edges=%d, poles=%d, tach_high=%d 0x%02X, tach_low=%d 0x%02X, count=%d\n", __func__,
839 instance, ftach, m, edges, poles, tach_high, tach_high, tach_low, tach_low, count));
840
841 /* The formula is:
842 *
843 * rpm = 1/poles * ((edges - 1) / count * 1/m) * ftach * 60
844 *
845 * ftach is either 32.000khz or 32.768khz
846 *
847 */
848
849 int64_t irpm;
850 int ip1, ip2;
851 int64_t ip3;
852
853 ip1 = 10000 / poles;
854 /*
855 printf("poles: %d ; ip1: %d\n",poles,ip1);
856 */
857 ip2 = 10000 / m;
858 /*
859 printf("m: %d ; ip2: %d\n",m,ip2);
860 */
861 ip2 = count * ip2;
862 /*
863 printf("count: %d ; ip2: %d\n",count,ip2);
864 */
865 ip3 = (int64_t)((edges - 1) * (int64_t)100000000000) / (int64_t)ip2;
866 /*
867 printf("edges: %d ; ip3: %d\n",edges,ip3);
868 */
869
870 irpm = (ip1 * ip3 * ftach * 60) / 100000000000;
871
872 edata->value_cur = (uint32_t) irpm;
873 edata->state = ENVSYS_SVALID;
874 }
875
876 /* These two tables are taken from Appendix A in the 2104 and 2106 datasheet.
877 * The index into the array is the ADC value and the value of the array is a
878 * precomputed kelvin1000 (i.e celcius to kelvin * 1000) temperature.
879 *
880 * There are unusual holes as not all of the ADC values are present in the
881 * *center* of the table these were made into xx.5 temperature values.
882 *
883 * Another quirk is that the table in the datasheets have multiple temperatures
884 * for a particular ADC. This behavior seems more common on the edges of the
885 * table and may make sense. What these tables do, is just take the first
886 * temperature for any ADC value.
887 *
888 */
889
890 #define EMCFAN_VIN_NO_TEMP -1
891
892 static const int32_t emcfan_vin_temps[] = {
893 EMCFAN_VIN_NO_TEMP,
894 EMCFAN_VIN_NO_TEMP,
895 EMCFAN_VIN_NO_TEMP,
896 EMCFAN_VIN_NO_TEMP,
897 EMCFAN_VIN_NO_TEMP,
898 EMCFAN_VIN_NO_TEMP,
899 EMCFAN_VIN_NO_TEMP,
900 EMCFAN_VIN_NO_TEMP,
901 EMCFAN_VIN_NO_TEMP,
902 EMCFAN_VIN_NO_TEMP,
903 EMCFAN_VIN_NO_TEMP,
904 EMCFAN_VIN_NO_TEMP,
905 EMCFAN_VIN_NO_TEMP,
906 EMCFAN_VIN_NO_TEMP,
907 EMCFAN_VIN_NO_TEMP,
908 EMCFAN_VIN_NO_TEMP,
909 EMCFAN_VIN_NO_TEMP,
910 EMCFAN_VIN_NO_TEMP,
911 EMCFAN_VIN_NO_TEMP,
912 EMCFAN_VIN_NO_TEMP,
913 EMCFAN_VIN_NO_TEMP,
914 EMCFAN_VIN_NO_TEMP,
915 EMCFAN_VIN_NO_TEMP,
916 EMCFAN_VIN_NO_TEMP,
917 EMCFAN_VIN_NO_TEMP,
918 EMCFAN_VIN_NO_TEMP,
919 EMCFAN_VIN_NO_TEMP,
920 EMCFAN_VIN_NO_TEMP,
921 EMCFAN_VIN_NO_TEMP,
922 EMCFAN_VIN_NO_TEMP,
923 EMCFAN_VIN_NO_TEMP,
924 EMCFAN_VIN_NO_TEMP,
925 463150,
926 461150,
927 459150,
928 457150,
929 455150,
930 453150,
931 451150,
932 450150,
933 448150,
934 446150,
935 445150,
936 443150,
937 441150,
938 440150,
939 438150,
940 437150,
941 435150,
942 434150,
943 433150,
944 431150,
945 430150,
946 429150,
947 427150,
948 426150,
949 425150,
950 424150,
951 423150,
952 421150,
953 420150,
954 419150,
955 418150,
956 417150,
957 416150,
958 415150,
959 414150,
960 413150,
961 412150,
962 411150,
963 410150,
964 409150,
965 408150,
966 407150,
967 406150,
968 405150,
969 404150,
970 403150,
971 402150,
972 398150,
973 397150,
974 396150,
975 395150,
976 394650,
977 394150,
978 393150,
979 392150,
980 391650,
981 391150,
982 390150,
983 389150,
984 388650,
985 388150,
986 387150,
987 386650,
988 386150,
989 385150,
990 384150,
991 383650,
992 383150,
993 382150,
994 381650,
995 381150,
996 380150,
997 379650,
998 379150,
999 378150,
1000 377650,
1001 377150,
1002 376650,
1003 376150,
1004 375150,
1005 374650,
1006 374150,
1007 373150,
1008 372650,
1009 372150,
1010 371650,
1011 371150,
1012 370150,
1013 369650,
1014 369150,
1015 368650,
1016 368150,
1017 367150,
1018 366650,
1019 366150,
1020 365650,
1021 365150,
1022 364150,
1023 363650,
1024 363150,
1025 362650,
1026 362150,
1027 361650,
1028 361150,
1029 360150,
1030 359650,
1031 359150,
1032 358150,
1033 357650,
1034 357150,
1035 356650,
1036 356150,
1037 355650,
1038 355150,
1039 354150,
1040 353650,
1041 353150,
1042 352650,
1043 352150,
1044 351650,
1045 351150,
1046 350650,
1047 350150,
1048 349150,
1049 348650,
1050 348150,
1051 347650,
1052 347150,
1053 346150,
1054 345650,
1055 345150,
1056 344650,
1057 344150,
1058 343650,
1059 343150,
1060 342150,
1061 341650,
1062 341150,
1063 340650,
1064 340150,
1065 339150,
1066 338650,
1067 338150,
1068 337650,
1069 337150,
1070 336150,
1071 335650,
1072 335150,
1073 334650,
1074 334150,
1075 333150,
1076 332650,
1077 332150,
1078 331150,
1079 330650,
1080 330150,
1081 329650,
1082 329150,
1083 328150,
1084 327650,
1085 327150,
1086 326150,
1087 325650,
1088 325150,
1089 324150,
1090 323650,
1091 323150,
1092 322150,
1093 321150,
1094 320650,
1095 320150,
1096 319150,
1097 318650,
1098 318150,
1099 317150,
1100 316150,
1101 315150,
1102 314650,
1103 314150,
1104 313150,
1105 312150,
1106 311150,
1107 310650,
1108 310150,
1109 309150,
1110 308150,
1111 307150,
1112 306150,
1113 305150,
1114 304150,
1115 303150,
1116 302150,
1117 301150,
1118 300150,
1119 299150,
1120 298150,
1121 297150,
1122 296150,
1123 295150,
1124 293150,
1125 292150,
1126 291150,
1127 290150,
1128 288150,
1129 287150,
1130 285150,
1131 283150,
1132 282150,
1133 280150,
1134 278150,
1135 276150,
1136 273150,
1137 271150,
1138 268150,
1139 265150,
1140 262150,
1141 259150,
1142 255150,
1143 250150,
1144 244150,
1145 236150,
1146 229150,
1147 228150,
1148 EMCFAN_VIN_NO_TEMP
1149 };
1150
1151 static const int32_t emcfan_vin_temps_i[] = {
1152 228150,
1153 229150,
1154 236150,
1155 244150,
1156 250150,
1157 255150,
1158 259150,
1159 262150,
1160 265150,
1161 268150,
1162 271150,
1163 273150,
1164 276150,
1165 278150,
1166 280150,
1167 281150,
1168 283150,
1169 285150,
1170 286150,
1171 288150,
1172 289150,
1173 291150,
1174 292150,
1175 293150,
1176 295150,
1177 296150,
1178 297150,
1179 298150,
1180 299150,
1181 300150,
1182 301150,
1183 302150,
1184 303150,
1185 304150,
1186 305150,
1187 306150,
1188 307150,
1189 308150,
1190 309150,
1191 310150,
1192 310650,
1193 311150,
1194 312150,
1195 313150,
1196 314150,
1197 314650,
1198 315150,
1199 316150,
1200 317150,
1201 317650,
1202 318150,
1203 319150,
1204 320150,
1205 320650,
1206 321150,
1207 322150,
1208 323150,
1209 323650,
1210 324150,
1211 325150,
1212 325650,
1213 326150,
1214 327150,
1215 327650,
1216 328150,
1217 329150,
1218 329650,
1219 330150,
1220 330650,
1221 331150,
1222 332150,
1223 332650,
1224 333150,
1225 334150,
1226 334650,
1227 335150,
1228 335650,
1229 336150,
1230 337150,
1231 337650,
1232 338150,
1233 338650,
1234 339150,
1235 340150,
1236 340650,
1237 341150,
1238 341650,
1239 342150,
1240 343150,
1241 343650,
1242 344150,
1243 344650,
1244 345150,
1245 345650,
1246 346150,
1247 347150,
1248 347650,
1249 348150,
1250 348650,
1251 349150,
1252 350150,
1253 350650,
1254 351150,
1255 351650,
1256 352150,
1257 352650,
1258 353150,
1259 353650,
1260 354150,
1261 355150,
1262 355650,
1263 356150,
1264 356650,
1265 357150,
1266 357650,
1267 358150,
1268 359150,
1269 359650,
1270 360150,
1271 360650,
1272 361150,
1273 362150,
1274 362650,
1275 363150,
1276 363650,
1277 364150,
1278 365150,
1279 365650,
1280 366150,
1281 366650,
1282 367150,
1283 368150,
1284 368650,
1285 369150,
1286 369650,
1287 370150,
1288 371150,
1289 371650,
1290 372150,
1291 372650,
1292 373150,
1293 374150,
1294 374650,
1295 375150,
1296 376150,
1297 376650,
1298 377150,
1299 377650,
1300 378150,
1301 379150,
1302 379650,
1303 380150,
1304 381150,
1305 381650,
1306 382150,
1307 383150,
1308 383650,
1309 384150,
1310 385150,
1311 386150,
1312 386650,
1313 387150,
1314 388150,
1315 388650,
1316 389150,
1317 390150,
1318 391150,
1319 391650,
1320 392150,
1321 393150,
1322 394150,
1323 394650,
1324 395150,
1325 396150,
1326 397150,
1327 398150,
1328 402150,
1329 403150,
1330 404150,
1331 405150,
1332 406150,
1333 407150,
1334 408150,
1335 409150,
1336 410150,
1337 411150,
1338 412150,
1339 413150,
1340 414150,
1341 415150,
1342 416150,
1343 417150,
1344 418150,
1345 419150,
1346 420150,
1347 421150,
1348 423150,
1349 424150,
1350 425150,
1351 426150,
1352 427150,
1353 429150,
1354 430150,
1355 431150,
1356 433150,
1357 434150,
1358 435150,
1359 437150,
1360 438150,
1361 440150,
1362 441150,
1363 443150,
1364 445150,
1365 446150,
1366 448150,
1367 450150,
1368 451150,
1369 453150,
1370 455150,
1371 457150,
1372 459150,
1373 461150,
1374 463150,
1375 EMCFAN_VIN_NO_TEMP,
1376 EMCFAN_VIN_NO_TEMP,
1377 EMCFAN_VIN_NO_TEMP,
1378 EMCFAN_VIN_NO_TEMP,
1379 EMCFAN_VIN_NO_TEMP,
1380 EMCFAN_VIN_NO_TEMP,
1381 EMCFAN_VIN_NO_TEMP,
1382 EMCFAN_VIN_NO_TEMP,
1383 EMCFAN_VIN_NO_TEMP,
1384 EMCFAN_VIN_NO_TEMP,
1385 EMCFAN_VIN_NO_TEMP,
1386 EMCFAN_VIN_NO_TEMP,
1387 EMCFAN_VIN_NO_TEMP,
1388 EMCFAN_VIN_NO_TEMP,
1389 EMCFAN_VIN_NO_TEMP,
1390 EMCFAN_VIN_NO_TEMP,
1391 EMCFAN_VIN_NO_TEMP,
1392 EMCFAN_VIN_NO_TEMP,
1393 EMCFAN_VIN_NO_TEMP,
1394 EMCFAN_VIN_NO_TEMP,
1395 EMCFAN_VIN_NO_TEMP,
1396 EMCFAN_VIN_NO_TEMP,
1397 EMCFAN_VIN_NO_TEMP,
1398 EMCFAN_VIN_NO_TEMP,
1399 EMCFAN_VIN_NO_TEMP,
1400 EMCFAN_VIN_NO_TEMP,
1401 EMCFAN_VIN_NO_TEMP,
1402 EMCFAN_VIN_NO_TEMP,
1403 EMCFAN_VIN_NO_TEMP,
1404 EMCFAN_VIN_NO_TEMP,
1405 EMCFAN_VIN_NO_TEMP,
1406 EMCFAN_VIN_NO_TEMP,
1407 EMCFAN_VIN_NO_TEMP
1408 };
1409
1410 static void
1411 emcfan_refresh_temp(int product_family, uint8_t product_id,
1412 struct sysmon_envsys *sme, envsys_data_t *edata, int instance)
1413 {
1414 struct emcfan_sc *sc = sme->sme_cookie;
1415
1416 int error;
1417 uint8_t temp_config;
1418 uint8_t raw_temp_config_3;
1419 uint8_t temp_config_3;
1420 uint8_t temp_high;
1421 uint8_t temp_low;
1422 uint8_t external_temp_high_reg;
1423 uint8_t external_temp_low_reg;
1424 bool is_internal = false;
1425 bool is_vin4 = false;
1426 bool using_apd = false;
1427 bool using_vin = false;
1428 bool inverted = false;
1429
1430 is_internal = sc->sc_sensor_instances[instance].sc_i_flags & EMCFAN_INTERNAL_TEMP;
1431 is_vin4 = sc->sc_sensor_instances[instance].sc_i_flags & EMCFAN_VIN4_TEMP;
1432
1433 error = iic_acquire_bus(sc->sc_tag, 0);
1434 if (error) {
1435 device_printf(sc->sc_dev,"%s: could not acquire I2C bus: %d\n",__func__, error);
1436 return;
1437 }
1438
1439 if (is_internal) {
1440 /* There might be a data interlock thing going on with the high and low
1441 * registers, to make sure, read the high one first. This works in the
1442 * opposite of the tach.
1443 */
1444 error = emcfan_read_register(sc, EMCFAN_INTERNAL_TEMP_HIGH, &temp_high);
1445 if (error) {
1446 device_printf(sc->sc_dev,"%s: could not read internal temp high: %d\n",__func__, error);
1447 iic_release_bus(sc->sc_tag, 0);
1448 return;
1449 }
1450 /* The 2101 does not have fractions on the internal temperature sensor */
1451 if (product_id == EMCFAN_PRODUCT_2101) {
1452 temp_low = 0;
1453 } else {
1454 error = emcfan_read_register(sc, EMCFAN_INTERNAL_TEMP_LOW, &temp_low);
1455 if (error) {
1456 device_printf(sc->sc_dev,"%s: could not read internal temp low: %d\n",__func__, error);
1457 iic_release_bus(sc->sc_tag, 0);
1458 return;
1459 }
1460 }
1461 } else {
1462 if (is_vin4) {
1463 if (sc->sc_vin4_temp) {
1464 using_vin = true;
1465
1466 error = emcfan_read_register(sc, EMCFAN_CHIP_CONFIG, &temp_config);
1467 if (error) {
1468 device_printf(sc->sc_dev,"%s: could not read chip config register: %d\n",__func__, error);
1469 iic_release_bus(sc->sc_tag, 0);
1470 return;
1471 }
1472 inverted = temp_config & 0x80;
1473
1474 error = emcfan_read_register(sc, EMCFAN_VIN4_VOLTAGE, &temp_high);
1475 if (error) {
1476 device_printf(sc->sc_dev,"%s: could not read external temp high: %d\n",__func__, error);
1477 iic_release_bus(sc->sc_tag, 0);
1478 return;
1479 }
1480 } else {
1481 iic_release_bus(sc->sc_tag, 0);
1482 return;
1483 }
1484 } else {
1485 /* The 2101 has its external sensor on a different set of registers
1486 * than the rest.
1487 */
1488 if (product_id == EMCFAN_PRODUCT_2101) {
1489 error = emcfan_read_register(sc, EMCFAN_2101_EXTERNAL_TEMP_LOW, &temp_low);
1490 if (error) {
1491 device_printf(sc->sc_dev,"%s: could not read external temp low: %d\n",__func__, error);
1492 iic_release_bus(sc->sc_tag, 0);
1493 return;
1494 }
1495 error = emcfan_read_register(sc, EMCFAN_2101_EXTERNAL_TEMP_HIGH, &temp_high);
1496 if (error) {
1497 device_printf(sc->sc_dev,"%s: could not read external temp high: %d\n",__func__, error);
1498 iic_release_bus(sc->sc_tag, 0);
1499 return;
1500 }
1501 } else {
1502 switch(sc->sc_sensor_instances[instance].sc_i_member) {
1503 case 1:
1504 external_temp_high_reg = EMCFAN_EXTERNAL_1_TEMP_HIGH;
1505 external_temp_low_reg = EMCFAN_EXTERNAL_1_TEMP_LOW;
1506 break;
1507 case 2:
1508 external_temp_high_reg = EMCFAN_EXTERNAL_2_TEMP_HIGH;
1509 external_temp_low_reg = EMCFAN_EXTERNAL_2_TEMP_LOW;
1510 break;
1511 case 3:
1512 external_temp_high_reg = EMCFAN_EXTERNAL_3_TEMP_HIGH;
1513 external_temp_low_reg = EMCFAN_EXTERNAL_3_TEMP_LOW;
1514 break;
1515 case 4:
1516 external_temp_high_reg = EMCFAN_EXTERNAL_4_TEMP_HIGH;
1517 external_temp_low_reg = EMCFAN_EXTERNAL_4_TEMP_LOW;
1518 break;
1519 default:
1520 panic("Unknown member: %d\n",
1521 sc->sc_sensor_instances[instance].sc_i_member);
1522 break;
1523 };
1524
1525 /* The 2103-2, 2103-4, 2104 and 2106 can use APD mode. This is a method
1526 * of using two sensors in parallel on a single set of pins. The way one
1527 * wires this up is in the datasheets for the chip.
1528 */
1529
1530 if (product_id == EMCFAN_PRODUCT_2103_24 ||
1531 product_id == EMCFAN_PRODUCT_2104 ||
1532 product_id == EMCFAN_PRODUCT_2106) {
1533 error = emcfan_read_register(sc, EMCFAN_CHIP_CONFIG, &temp_config);
1534 if (error) {
1535 device_printf(sc->sc_dev,"%s: could not read chip config register: %d\n",__func__, error);
1536 iic_release_bus(sc->sc_tag, 0);
1537 return;
1538 }
1539
1540 using_apd = temp_config & 0x01;
1541 }
1542
1543 /* The 2104, 2105 and 2106 has some other special abilities, such as being
1544 * able to use thermistors.
1545 */
1546
1547 if (product_id == EMCFAN_PRODUCT_2104 ||
1548 product_id == EMCFAN_PRODUCT_2106) {
1549 error = emcfan_read_register(sc, EMCFAN_TEMP_CONFIG_3, &raw_temp_config_3);
1550 if (error) {
1551 device_printf(sc->sc_dev,"%s: could not read temperature config register: %d\n",__func__, error);
1552 iic_release_bus(sc->sc_tag, 0);
1553 return;
1554 }
1555 switch(sc->sc_sensor_instances[instance].sc_i_member) {
1556 case 1:
1557 temp_config_3 = raw_temp_config_3 & 0x03;
1558 break;
1559 case 2:
1560 temp_config_3 = raw_temp_config_3 >> 2;
1561 temp_config_3 = temp_config_3 & 0x03;
1562 break;
1563 case 3:
1564 temp_config_3 = raw_temp_config_3 >> 4;
1565 temp_config_3 = temp_config_3 & 0x03;
1566 break;
1567 default:
1568 temp_config_3 = 0;
1569 break;
1570 };
1571
1572 using_vin = temp_config_3 & 0x02;
1573 inverted = temp_config_3 & 0x01;
1574
1575
1576 /* there is a strange situation if sensor 3 is being used as a VIN
1577 * sensor, then sensor 4 is not available at all. Note that this
1578 * sensor 4 is *NOT* the sensor that might be attached to the VIN4
1579 * pin.
1580 */
1581
1582 if (sc->sc_sensor_instances[instance].sc_i_member == 4 &&
1583 raw_temp_config_3 & 0x20) {
1584 iic_release_bus(sc->sc_tag, 0);
1585 return;
1586 }
1587 }
1588
1589 if (product_id == EMCFAN_PRODUCT_2103_24) {
1590 /* The anti-parallel mode, apd, must be enabled before sensor 3 will
1591 * be available.
1592 */
1593 if (!using_apd &&
1594 sc->sc_sensor_instances[instance].sc_i_member == 3) {
1595 iic_release_bus(sc->sc_tag, 0);
1596 return;
1597 }
1598 }
1599
1600 if (product_id == EMCFAN_PRODUCT_2104 ||
1601 product_id == EMCFAN_PRODUCT_2106) {
1602 /* The anti-parallel mode, apd, must be enabled before sensor 4 will
1603 * be available. This, of course, might conflict if sensor 3 is a VIN
1604 * sensor. Don't do that....
1605 */
1606 if (!using_apd &&
1607 sc->sc_sensor_instances[instance].sc_i_member == 4) {
1608 iic_release_bus(sc->sc_tag, 0);
1609 return;
1610 }
1611 }
1612
1613 /* There is a data interlock thing going on with the high and low
1614 * registers, but it works the opposite from the tach.
1615 */
1616
1617 error = emcfan_read_register(sc, external_temp_high_reg, &temp_high);
1618 if (error) {
1619 device_printf(sc->sc_dev,"%s: could not read external temp high: %d\n",__func__, error);
1620 iic_release_bus(sc->sc_tag, 0);
1621 return;
1622 }
1623 if (using_vin) {
1624 temp_low = 0;
1625 } else {
1626 error = emcfan_read_register(sc, external_temp_low_reg, &temp_low);
1627 if (error) {
1628 device_printf(sc->sc_dev,"%s: could not read external temp low: %d\n",__func__, error);
1629 iic_release_bus(sc->sc_tag, 0);
1630 return;
1631 }
1632 }
1633 }
1634 }
1635 }
1636
1637 iic_release_bus(sc->sc_tag, 0);
1638
1639 /* It appears that on the 2101, if the high byte is 0x7f and the low byte is 0,\
1640 * then there is a fault or no sensor.
1641 */
1642
1643 if (product_id == EMCFAN_PRODUCT_2101 &&
1644 !is_internal) {
1645 if (temp_high == 0x7f &&
1646 temp_low == 0) {
1647 return;
1648 }
1649 }
1650
1651 /* For everyone else, if the external sensor read 0x80 on the high byte and
1652 * the fraction is 0, then there is a fault or no sensor.
1653 */
1654
1655 if (!is_internal && !using_vin) {
1656 if (temp_high == 0x80 &&
1657 (temp_low >> 5) == 0x00) {
1658 return;
1659 }
1660 }
1661
1662 int32_t kelvin1000 = 0;
1663 int32_t frac = 0;
1664 uint8_t tl;
1665
1666 if (!using_vin) {
1667 kelvin1000 = (int8_t)temp_high * 1000;
1668 tl = temp_low >> 5;
1669 if (temp_high & 0x80) {
1670 tl = (~tl) & 0x07;
1671 tl++;
1672 }
1673 frac = 125 * tl;
1674 if (temp_high & 0x80) {
1675 kelvin1000 -= frac;
1676 } else {
1677 kelvin1000 += frac;
1678 }
1679 kelvin1000 += 273150;
1680 } else {
1681 int32_t vin1000 = EMCFAN_VIN_NO_TEMP;
1682
1683 if (inverted) {
1684 if (emcfan_vin_temps_i[temp_high] != EMCFAN_VIN_NO_TEMP) {
1685 vin1000 = emcfan_vin_temps_i[temp_high];
1686 }
1687 } else {
1688 if (emcfan_vin_temps[temp_high] != EMCFAN_VIN_NO_TEMP) {
1689 vin1000 = emcfan_vin_temps[temp_high];
1690 }
1691 }
1692
1693 if (vin1000 != EMCFAN_VIN_NO_TEMP)
1694 kelvin1000 = vin1000;
1695 else
1696 return;
1697 }
1698
1699 edata->value_cur = (uint32_t) kelvin1000 * 1000;
1700 edata->state = ENVSYS_SVALID;
1701 }
1702
1703 static void
1704 emcfan_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
1705 {
1706 struct emcfan_sc *sc = sme->sme_cookie;
1707 int instance = -1;
1708
1709 /* Hunt down the instance for this sensor.
1710 *
1711 * The type is held in sc_sensors, but the actual hardware
1712 * instance is held in sc_sensor_instances in the member
1713 * field. It would be nice if the edata structure had a
1714 * field that could be used as an opaque value.
1715 */
1716 for(int i = 0;i < EMCFAN_NUM_SENSORS;i++)
1717 if (sc->sc_sensor_instances[i].sc_i_envnum == edata->sensor) {
1718 instance = i;
1719 break;
1720 }
1721
1722 KASSERT(instance > -1);
1723
1724 DPRINTF(sc, 2, ("%s: using sensor instance %d\n", __func__,
1725 instance));
1726
1727 edata->state = ENVSYS_SINVALID;
1728
1729 /* Unlike manor of the refresh functions in other drivers, this
1730 * one will select the sensor based upon the type and instance.
1731 *
1732 * Due to the fact that the order will vary depending on which
1733 * chip you are using.
1734 */
1735
1736 switch(edata->units) {
1737 case ENVSYS_SFANRPM:
1738 switch(emcfan_chip_infos[sc->sc_info_index].family) {
1739 case EMCFAN_FAMILY_210X:
1740 switch(emcfan_chip_infos[sc->sc_info_index].product_id) {
1741 case EMCFAN_PRODUCT_2101:
1742 emcfan_refresh_2101_tach(sme, edata, instance);
1743 break;
1744 /* 2103, 2104 and 2106 use nearly the same algorithm as the 230x family */
1745 default:
1746 emcfan_refresh_210_346_230x_tach(emcfan_chip_infos[sc->sc_info_index].family,
1747 emcfan_chip_infos[sc->sc_info_index].product_id,
1748 sme, edata, instance);
1749 break;
1750 };
1751 break;
1752 case EMCFAN_FAMILY_230X:
1753 emcfan_refresh_210_346_230x_tach(emcfan_chip_infos[sc->sc_info_index].family,
1754 emcfan_chip_infos[sc->sc_info_index].product_id,
1755 sme, edata, instance);
1756 break;
1757 default:
1758 panic("Unknown family: %d\n",emcfan_chip_infos[sc->sc_info_index].family);
1759 break;
1760 }
1761 break;
1762 case ENVSYS_STEMP:
1763 emcfan_refresh_temp(emcfan_chip_infos[sc->sc_info_index].family,
1764 emcfan_chip_infos[sc->sc_info_index].product_id,
1765 sme, edata, instance);
1766 break;
1767 default:
1768 panic("Unknown edata units value: %d\n",edata->units);
1769 break;
1770 };
1771 }
1772
1773 static int
1774 emcfanopen(dev_t dev, int flags, int fmt, struct lwp *l)
1775 {
1776 struct emcfan_sc *sc;
1777
1778 sc = device_lookup_private(&emcfan_cd, minor(dev));
1779 if (!sc)
1780 return ENXIO;
1781
1782 if (sc->sc_opened)
1783 return EBUSY;
1784
1785 mutex_enter(&sc->sc_mutex);
1786 sc->sc_opened = true;
1787 mutex_exit(&sc->sc_mutex);
1788
1789 return 0;
1790 }
1791
1792 static int
1793 emcfanread(dev_t dev, struct uio *uio, int flags)
1794 {
1795 struct emcfan_sc *sc;
1796 int error;
1797
1798 if ((sc = device_lookup_private(&emcfan_cd, minor(dev))) == NULL)
1799 return ENXIO;
1800
1801 /* We do not make this an error. There is nothing wrong with running
1802 * off the end here, just return EOF.
1803 */
1804 if (uio->uio_offset > 0xff)
1805 return 0;
1806
1807 if ((error = iic_acquire_bus(sc->sc_tag, 0)) != 0)
1808 return error;
1809
1810 while (uio->uio_resid &&
1811 uio->uio_offset <= 0xff &&
1812 !sc->sc_dying) {
1813 uint8_t buf;
1814 int reg_addr = uio->uio_offset;
1815
1816 if ((error = emcfan_read_register(sc, reg_addr, &buf)) != 0) {
1817 iic_release_bus(sc->sc_tag, 0);
1818 aprint_error_dev(sc->sc_dev,
1819 "%s: read failed at 0x%02x: %d\n",
1820 __func__, reg_addr, error);
1821 return error;
1822 }
1823
1824 if (sc->sc_dying)
1825 break;
1826
1827 if ((error = uiomove(&buf, 1, uio)) != 0) {
1828 iic_release_bus(sc->sc_tag, 0);
1829 return error;
1830 }
1831 }
1832
1833 iic_release_bus(sc->sc_tag, 0);
1834
1835 if (sc->sc_dying) {
1836 return EIO;
1837 }
1838
1839 return 0;
1840 }
1841
1842 static int
1843 emcfanwrite(dev_t dev, struct uio *uio, int flags)
1844 {
1845 struct emcfan_sc *sc;
1846 int error;
1847
1848 if ((sc = device_lookup_private(&emcfan_cd, minor(dev))) == NULL)
1849 return ENXIO;
1850
1851 /* Same thing as read, this is not considered an error */
1852 if (uio->uio_offset > 0xff)
1853 return 0;
1854
1855 if ((error = iic_acquire_bus(sc->sc_tag, 0)) != 0)
1856 return error;
1857
1858 while (uio->uio_resid &&
1859 uio->uio_offset <= 0xff &&
1860 !sc->sc_dying) {
1861 uint8_t buf;
1862 int reg_addr = uio->uio_offset;
1863
1864 if ((error = uiomove(&buf, 1, uio)) != 0)
1865 break;
1866
1867 if (sc->sc_dying)
1868 break;
1869
1870 if ((error = emcfan_write_register(sc, (uint8_t)reg_addr, buf)) != 0) {
1871 iic_release_bus(sc->sc_tag, 0);
1872 aprint_error_dev(sc->sc_dev,
1873 "%s: write failed at 0x%02x: %d\n",
1874 __func__, reg_addr, error);
1875 return error;
1876 }
1877 }
1878
1879 iic_release_bus(sc->sc_tag, 0);
1880
1881 if (sc->sc_dying) {
1882 return EIO;
1883 }
1884
1885 return error;
1886 }
1887
1888 static int
1889 emcfanclose(dev_t dev, int flags, int fmt, struct lwp *l)
1890 {
1891 struct emcfan_sc *sc;
1892
1893 sc = device_lookup_private(&emcfan_cd, minor(dev));
1894
1895 mutex_enter(&sc->sc_mutex);
1896 sc->sc_opened = false;
1897 mutex_exit(&sc->sc_mutex);
1898
1899 return(0);
1900 }
1901
1902 static int
1903 emcfan_detach(device_t self, int flags)
1904 {
1905 int err;
1906 struct emcfan_sc *sc;
1907
1908 sc = device_private(self);
1909
1910 mutex_enter(&sc->sc_mutex);
1911 sc->sc_dying = true;
1912
1913 err = config_detach_children(self, flags);
1914 if (err)
1915 return err;
1916
1917 /* Remove the sysctl tree */
1918 if (sc->sc_emcfanlog != NULL)
1919 sysctl_teardown(&sc->sc_emcfanlog);
1920
1921 /* Remove the sensors */
1922 if (sc->sc_sme != NULL) {
1923 sysmon_envsys_unregister(sc->sc_sme);
1924 sc->sc_sme = NULL;
1925 }
1926
1927 mutex_exit(&sc->sc_mutex);
1928
1929 mutex_destroy(&sc->sc_mutex);
1930
1931 return 0;
1932 }
1933
1934 int
1935 emcfan_activate(device_t self, enum devact act)
1936 {
1937 struct emcfan_sc *sc = device_private(self);
1938
1939 switch (act) {
1940 case DVACT_DEACTIVATE:
1941 sc->sc_dying = true;
1942 return 0;
1943 default:
1944 return EOPNOTSUPP;
1945 }
1946 }
1947
1948 /* --- GPIO --- */
1949
1950 static int
1951 emcfan_current_gpio_flags(struct emcfan_sc *sc,
1952 uint8_t product_id,
1953 int pin)
1954 {
1955 int error = 0;
1956 int f = 0;
1957 uint8_t mux_reg = 0;
1958 uint8_t dir_reg;
1959 uint8_t out_config;
1960 uint8_t pin_mask;
1961 uint8_t pin_maska1;
1962 uint8_t pin_maska2;
1963
1964 error = iic_acquire_bus(sc->sc_tag, 0);
1965 if (error) {
1966 return 0;
1967 }
1968
1969 if (product_id != EMCFAN_PRODUCT_2103_24) {
1970 error = emcfan_read_register(sc, EMCFAN_MUX_PINS, &mux_reg);
1971 if (error != 0) {
1972 return 0;
1973 }
1974 }
1975 error = emcfan_read_register(sc, EMCFAN_DIR_PINS, &dir_reg);
1976 if (error != 0) {
1977 return 0;
1978 }
1979 error = emcfan_read_register(sc, EMCFAN_OUTPUT_PIN_CONFIG, &out_config);
1980 if (error != 0) {
1981 return 0;
1982 }
1983 iic_release_bus(sc->sc_tag, 0);
1984
1985 pin_mask = 1 << pin;
1986
1987 if (product_id != EMCFAN_PRODUCT_2103_24) {
1988 if (pin <= 4) {
1989 if (pin <= 2) {
1990 if ((mux_reg & pin_mask) == 0)
1991 f = GPIO_PIN_ALT0;
1992 } else {
1993 if (pin == 3) {
1994 pin_maska1 = 0x08;
1995 pin_maska2 = 0x10;
1996 } else {
1997 pin_maska1 = 0x20;
1998 pin_maska2 = 0x40;
1999 }
2000 if (mux_reg & pin_maska1 &&
2001 mux_reg & pin_maska2) {
2002 f = GPIO_PIN_ALT1;
2003 } else {
2004 if (((mux_reg & pin_maska1) == 0) &&
2005 ((mux_reg & pin_maska2) == 0)) {
2006 f = GPIO_PIN_ALT0;
2007 }
2008 }
2009 }
2010 }
2011 }
2012
2013 if (f == 0) {
2014 if (dir_reg & pin_mask) {
2015 f = GPIO_PIN_OUTPUT;
2016 } else {
2017 f = GPIO_PIN_INPUT;
2018 }
2019
2020 if (out_config & pin_mask) {
2021 f |= GPIO_PIN_PUSHPULL;
2022 } else {
2023 f |= GPIO_PIN_OPENDRAIN;
2024 }
2025 }
2026
2027 return f;
2028 }
2029
2030 static int
2031 emcfan_gpio_pin_read(void *arg, int pin)
2032 {
2033 struct emcfan_sc *sc = arg;
2034 int error = 0;
2035 int r = GPIO_PIN_LOW;
2036 uint8_t input_reg;
2037 uint8_t pin_mask;
2038
2039 error = iic_acquire_bus(sc->sc_tag, 0);
2040 if (!error) {
2041 error = emcfan_read_register(sc, EMCFAN_PINS_INPUT, &input_reg);
2042 if (!error) {
2043 pin_mask = 1 << pin;
2044 if (input_reg & pin_mask)
2045 r = GPIO_PIN_HIGH;
2046 }
2047
2048 }
2049 iic_release_bus(sc->sc_tag, 0);
2050
2051 return r;
2052 }
2053
2054 static void
2055 emcfan_gpio_pin_write(void *arg, int pin, int value)
2056 {
2057 struct emcfan_sc *sc = arg;
2058 int error = 0;
2059 uint8_t output_reg;
2060 uint8_t pin_mask;
2061
2062 error = iic_acquire_bus(sc->sc_tag, 0);
2063 if (!error) {
2064 error = emcfan_read_register(sc, EMCFAN_PINS_OUTPUT, &output_reg);
2065 if (!error) {
2066 pin_mask = 1 << pin;
2067
2068 if (value == 0) {
2069 pin_mask = ~pin_mask;
2070 output_reg &= pin_mask;
2071 } else {
2072 output_reg |= pin_mask;
2073 }
2074 emcfan_write_register(sc, EMCFAN_PINS_OUTPUT, output_reg);
2075 }
2076
2077 }
2078 iic_release_bus(sc->sc_tag, 0);
2079 }
2080
2081 static void
2082 emcfan_gpio_pin_ctl(void *arg, int pin, int flags)
2083 {
2084 struct emcfan_sc *sc = arg;
2085 int error = 0;
2086 uint8_t product_id = emcfan_chip_infos[sc->sc_info_index].product_id;
2087 uint8_t pin_mask = 1 << pin;
2088 uint8_t pin_maska1;
2089 uint8_t pin_maska2;
2090 uint8_t mux_reg = 0;
2091 uint8_t dir_reg;
2092 uint8_t out_config;
2093
2094 error = iic_acquire_bus(sc->sc_tag, 0);
2095 if (error) {
2096 return;
2097 }
2098
2099 if (product_id != EMCFAN_PRODUCT_2103_24) {
2100 error = emcfan_read_register(sc, EMCFAN_MUX_PINS, &mux_reg);
2101 if (error != 0) {
2102 return;
2103 }
2104 }
2105 error = emcfan_read_register(sc, EMCFAN_DIR_PINS, &dir_reg);
2106 if (error != 0) {
2107 return;
2108 }
2109 error = emcfan_read_register(sc, EMCFAN_OUTPUT_PIN_CONFIG, &out_config);
2110 if (error != 0) {
2111 return;
2112 }
2113 iic_release_bus(sc->sc_tag, 0);
2114
2115 if (flags & GPIO_PIN_ALT0 ||
2116 flags & GPIO_PIN_ALT1) {
2117 if (product_id != EMCFAN_PRODUCT_2103_24) {
2118 if (pin <= 4) {
2119 if (pin <= 2) {
2120 mux_reg &= ~pin_mask;
2121 } else {
2122 if (pin == 3) {
2123 pin_maska2 = 0x18;
2124 } else {
2125 pin_maska2 = 0x60;
2126 }
2127 if (flags & GPIO_PIN_ALT0) {
2128 mux_reg &= ~pin_maska2;
2129 } else {
2130 if (flags & GPIO_PIN_ALT1) {
2131 mux_reg |= pin_maska2;
2132 }
2133 }
2134 }
2135 emcfan_write_register(sc, EMCFAN_MUX_PINS, mux_reg);
2136 }
2137 }
2138 } else {
2139 if (product_id != EMCFAN_PRODUCT_2103_24) {
2140 if (pin <= 4) {
2141 if (pin <= 2) {
2142 mux_reg |= pin_mask;
2143 } else {
2144 if (pin == 3) {
2145 pin_maska1 = 0x08;
2146 pin_maska2 = 0x18;
2147 } else {
2148 pin_maska1 = 0x20;
2149 pin_maska2 = 0x60;
2150 }
2151 mux_reg &= ~pin_maska2;
2152 mux_reg |= pin_maska1;
2153 }
2154 emcfan_write_register(sc, EMCFAN_MUX_PINS, mux_reg);
2155 }
2156 }
2157
2158 if (flags & GPIO_PIN_OPENDRAIN) {
2159 out_config &= ~pin_mask;
2160 } else {
2161 if (flags & GPIO_PIN_PUSHPULL)
2162 out_config |= pin_mask;
2163 }
2164 emcfan_write_register(sc, EMCFAN_OUTPUT_PIN_CONFIG, out_config);
2165
2166 if (flags & GPIO_PIN_INPUT) {
2167 dir_reg &= ~pin_mask;
2168 } else {
2169 if (flags & GPIO_PIN_OUTPUT)
2170 dir_reg |= pin_mask;
2171 }
2172 emcfan_write_register(sc, EMCFAN_DIR_PINS, dir_reg);
2173 }
2174 }
2175
2176 static void
2177 emcfan_attach_gpio(struct emcfan_sc *sc, uint8_t product_id)
2178 {
2179 struct gpiobus_attach_args gba;
2180
2181 for(int i = 0; i < emcfan_chip_infos[sc->sc_info_index].num_gpio_pins;i++) {
2182 sc->sc_gpio_pins[i].pin_num = i;
2183 sc->sc_gpio_pins[i].pin_caps = emcfan_chip_infos[sc->sc_info_index].gpio_pin_ability[i];
2184 sc->sc_gpio_pins[i].pin_flags = emcfan_current_gpio_flags(sc, emcfan_chip_infos[sc->sc_info_index].product_id, i);
2185 sc->sc_gpio_pins[i].pin_intrcaps = 0;
2186 strncpy(sc->sc_gpio_pins[i].pin_defname,
2187 emcfan_chip_infos[sc->sc_info_index].gpio_names[i],
2188 strlen(emcfan_chip_infos[sc->sc_info_index].gpio_names[i]) + 1);
2189 }
2190
2191 sc->sc_gpio_gc.gp_cookie = sc;
2192 sc->sc_gpio_gc.gp_pin_read = emcfan_gpio_pin_read;
2193 sc->sc_gpio_gc.gp_pin_write = emcfan_gpio_pin_write;
2194 sc->sc_gpio_gc.gp_pin_ctl = emcfan_gpio_pin_ctl;
2195
2196 gba.gba_gc = &sc->sc_gpio_gc;
2197 gba.gba_pins = sc->sc_gpio_pins;
2198 gba.gba_npins = emcfan_chip_infos[sc->sc_info_index].num_gpio_pins;
2199
2200 sc->sc_gpio_dev = config_found(sc->sc_dev, &gba, gpiobus_print, CFARGS(.iattr = "gpiobus"));
2201
2202 return;
2203 }
2204
2205 MODULE(MODULE_CLASS_DRIVER, emcfan, "iic,sysmon_envsys,gpio");
2206
2207 #ifdef _MODULE
2208 #include "ioconf.c"
2209 #endif
2210
2211 static int
2212 emcfan_modcmd(modcmd_t cmd, void *opaque)
2213 {
2214 int error;
2215 #ifdef _MODULE
2216 int bmaj = -1, cmaj = -1;
2217 #endif
2218
2219 switch (cmd) {
2220 case MODULE_CMD_INIT:
2221 #ifdef _MODULE
2222 error = devsw_attach("emcfan", NULL, &bmaj,
2223 &emcfan_cdevsw, &cmaj);
2224 if (error) {
2225 aprint_error("%s: unable to attach devsw\n",
2226 emcfan_cd.cd_name);
2227 return error;
2228 }
2229
2230 error = config_init_component(cfdriver_ioconf_emcfan,
2231 cfattach_ioconf_emcfan, cfdata_ioconf_emcfan);
2232 if (error) {
2233 aprint_error("%s: unable to init component\n",
2234 emcfan_cd.cd_name);
2235 devsw_detach(NULL, &emcfan_cdevsw);
2236 }
2237 return error;
2238 #else
2239 return 0;
2240 #endif
2241 case MODULE_CMD_FINI:
2242 #ifdef _MODULE
2243 error = config_fini_component(cfdriver_ioconf_emcfan,
2244 cfattach_ioconf_emcfan, cfdata_ioconf_emcfan);
2245 devsw_detach(NULL, &emcfan_cdevsw);
2246 return error;
2247 #else
2248 return 0;
2249 #endif
2250 default:
2251 return ENOTTY;
2252 }
2253 }
2254