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
21typedef unsigned int Frame;
22struct slhci_pipe;
23
24/* Generally transfer related items. */
25struct 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
43enum power_change {
44	POWER_OFF,
45	POWER_ON,
46};
47
48typedef void (*PowerFunc)(void *, enum power_change);
49
50/* Attachment code must call slhci_preinit before registering the ISR */
51struct 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 */
86int  slhci_supported_rev(uint8_t);
87void slhci_preinit(struct slhci_softc *, PowerFunc, bus_space_tag_t,
88    bus_space_handle_t, uint16_t, uint32_t);
89int  slhci_attach(struct slhci_softc *);
90int  slhci_detach(struct slhci_softc *, int);
91int  slhci_activate(device_t, enum devact);
92int  slhci_intr(void *);
93
94