umcpmio.h revision 1.2 1 /* $NetBSD: umcpmio.h,v 1.2 2025/03/17 18:24:08 riastradh Exp $ */
2
3 /*
4 * Copyright (c) 2024 Brad Spencer <brad (at) anduin.eldar.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #ifndef _UMCPMIO_H_
20 #define _UMCPMIO_H_
21
22 #include <sys/param.h>
23 #include <sys/types.h>
24
25 #include <sys/condvar.h>
26 #include <sys/conf.h>
27 #include <sys/device.h>
28 #include <sys/file.h>
29 #include <sys/gpio.h>
30 #include <sys/kauth.h>
31 #include <sys/kernel.h>
32 #include <sys/kmem.h>
33 #include <sys/lwp.h>
34 #include <sys/mutex.h>
35 #include <sys/sysctl.h>
36 #include <sys/systm.h>
37 #include <sys/tty.h>
38 #include <sys/vnode.h>
39
40 #include <dev/gpio/gpiovar.h>
41
42 #include <dev/hid/hid.h>
43
44 #include <dev/i2c/i2cvar.h>
45
46 #include <dev/usb/uhidev.h>
47 #include <dev/usb/usbdevs.h>
48 #include <dev/usb/usbdi.h>
49 #include <dev/usb/usbdi_util.h>
50
51 #define UMCPMIO_VREF_NAME 7
52 #define UMCPMIO_CD_NAME 7
53 #define UMCPMIO_DC_NAME 4
54
55 #define MCP2221_NPINS 4
56 #define UMCPMIO_NUM_DEVS 4
57
58 enum umcpmio_minor_devs {
59 CONTROL_DEV = 0,
60 GP1_DEV = 1,
61 GP2_DEV = 2,
62 GP3_DEV = 3,
63 };
64
65 struct umcpmio_irq {
66 int (*sc_gpio_irqfunc)(void *);
67 void *sc_gpio_irqarg;
68 };
69
70 struct umcpmio_softc {
71 device_t sc_dev;
72 struct uhidev *sc_hdev;
73 struct usbd_device *sc_udev;
74
75 struct sysctllog *sc_umcpmiolog;
76 bool sc_dumpbuffer;
77
78 int sc_cv_wait;
79 int sc_response_errcnt;
80 int sc_busy_delay;
81 int sc_retry_busy_read;
82 int sc_retry_busy_write;
83
84 kmutex_t sc_action_mutex;
85
86 kcondvar_t sc_res_cv;
87 kmutex_t sc_res_mutex;
88 bool sc_res_ready;
89 uint8_t *sc_res_buffer;
90
91 device_t sc_gpio_dev;
92 struct gpio_chipset_tag sc_gpio_gc;
93 gpio_pin_t sc_gpio_pins[MCP2221_NPINS];
94 struct umcpmio_irq sc_gpio_irqs[1];
95 int sc_irq_poll;
96
97 struct i2c_controller sc_i2c_tag;
98 device_t sc_i2c_dev;
99 bool sc_reportreadnostop;
100
101 bool sc_dev_open[UMCPMIO_NUM_DEVS];
102
103 char sc_dying;
104 };
105
106 struct umcpmio_sysctl_name {
107 const char *text;
108 };
109
110 #endif /* _UMCPMIO_H_ */
111