1 /*        $NetBSD: sl811hsvar.h,v 1.12 2016/04/23 10:15:31 skrll Exp $          */
2 
3 /*
4  * Not (c) 2007 Matthew Orgass
5  * This file is public domain, meaning anyone can make any use of part or all
6  * of this file including copying into other works without credit.  Any use,
7  * modified or not, is solely the responsibility of the user.  If this file is
8  * part of a collection then use in the collection is governed by the terms of
9  * the collection.
10  */
11 
12 /*
13  * Cypress/ScanLogic SL811HS USB Host Controller
14  */
15 
16 #include <sys/gcq.h>
17 
18 #define SC_DEV(sc)  ((sc)->sc_dev)
19 #define SC_NAME(sc) (device_xname(SC_DEV(sc)))
20 
21 typedef unsigned int Frame;
22 struct slhci_pipe;
23 
24 /* Generally transfer related items. */
25 struct slhci_transfers {
26           struct usbd_xfer *rootintr;
27           struct slhci_pipe *spipe[2];  /* current transfer (unless canceled) */
28           struct gcq_head q[3];                   /* transfer queues, Q_* index */
29           struct gcq_head timed;                  /* intr transfer multi-frame wait */
30           struct gcq_head to;           /* timeout list */
31           struct gcq_head ap;           /* all pipes */
32           Frame frame;                            /* current frame */
33           unsigned int flags;           /* F_* flags */
34           int pend;                     /* pending for waitintr */
35           int reserved_bustime;
36           int16_t len[2];                         /* length of transfer or -1 if none */
37           uint8_t current_tregs[2][4];  /* ab, ADR, LEN, PID, DEV */
38           uint8_t copyin[2];            /* copyin ADR, LEN */
39           uint8_t max_current;                    /* max current / 2 */
40           uint8_t sltype;                         /* revision */
41 };
42 
43 enum power_change {
44           POWER_OFF,
45           POWER_ON,
46 };
47 
48 typedef void (*PowerFunc)(void *, enum power_change);
49 
50 /* Attachment code must call slhci_preinit before registering the ISR */
51 struct slhci_softc {
52           device_t            sc_dev;
53           struct usbd_bus               sc_bus;
54 
55           kmutex_t            sc_lock;
56           kmutex_t            sc_intr_lock;
57 
58           struct slhci_transfers        sc_transfers;       /* Info useful in transfers. */
59 
60           struct gcq_head               sc_waitq;
61 
62           bus_space_tag_t               sc_iot;
63           bus_space_handle_t  sc_ioh;
64 
65           struct callout                sc_timer;           /* for reset */
66 
67           PowerFunc           sc_enable_power;
68 
69           device_t            sc_child;
70 
71           struct timeval                sc_reserved_warn_rate;
72           struct timeval                sc_overflow_warn_rate;
73 
74           void                          *sc_cb_softintr;
75 
76           unsigned int                  sc_ier_check;
77 
78           int                           sc_mem_use; /* XXX SLHCI_MEM_ACCOUNTING */
79 
80           uint8_t                       sc_ier;   /* enabled interrupts */
81           uint32_t            sc_stride;          /* port stride */
82 };
83 
84 /* last preinit arguments are: max current (in mA, not mA/2), port stride */
85 /* register access uses byte access, but stride offsets the data port */
86 int  slhci_supported_rev(uint8_t);
87 void slhci_preinit(struct slhci_softc *, PowerFunc, bus_space_tag_t,
88     bus_space_handle_t, uint16_t, uint32_t);
89 int  slhci_attach(struct slhci_softc *);
90 int  slhci_detach(struct slhci_softc *, int);
91 int  slhci_activate(device_t, enum devact);
92 int  slhci_intr(void *);
93 
94