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, ®, 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, ®, 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