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