1176868Srink/*-
2176868Srink * Copyright (c) 2006-2007 Daniel Roethlisberger <daniel@roe.ch>
3176868Srink * All rights reserved.
4176868Srink *
5176868Srink * Redistribution and use in source and binary forms, with or without
6176868Srink * modification, are permitted provided that the following conditions
7176868Srink * are met:
8176868Srink * 1. Redistributions of source code must retain the above copyright
9176868Srink *    notice, this list of conditions and the following disclaimer.
10176868Srink * 2. Redistributions in binary form must reproduce the above copyright
11176868Srink *    notice, this list of conditions and the following disclaimer in the
12176868Srink *    documentation and/or other materials provided with the distribution.
13176868Srink *
14176868Srink * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15176868Srink * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16176868Srink * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17176868Srink * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18176868Srink * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19176868Srink * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20176868Srink * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21176868Srink * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22176868Srink * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23176868Srink * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24176868Srink * SUCH DAMAGE.
25176868Srink *
26176868Srink * $FreeBSD: releng/10.3/sys/dev/cmx/cmxvar.h 176868 2008-03-06 08:09:45Z rink $
27176868Srink */
28176868Srink
29176868Srink/*#define	CMX_DEBUG*/
30176868Srink/*#define	CMX_INTR*/
31176868Srink
32176868Srink#define	CMX_MIN_RDLEN	10		/* min read length */
33176868Srink#define	CMX_MIN_WRLEN	5		/* min write length */
34176868Srink#define	CMX_BUFSZ	512		/* I/O block size */
35176868Srink
36176868Srinkstruct cmx_softc {
37176868Srink	device_t dev;			/* pccard device */
38176868Srink	struct cdev *cdev;		/* character device */
39176868Srink
40176868Srink	struct resource *ioport;	/* io port resource descriptor */
41176868Srink	int ioport_rid;			/* io port resource identification */
42176868Srink
43176868Srink	bus_space_tag_t bst;		/* bus space tag */
44176868Srink	bus_space_handle_t bsh;		/* bus space handle */
45176868Srink
46176868Srink#ifdef CMX_INTR
47176868Srink	struct resource* irq;		/* irq resource descriptor */
48176868Srink	int irq_rid;			/* irq resource identification */
49176868Srink	void *ih;			/* intr handle */
50176868Srink#endif
51176868Srink
52176868Srink	struct mtx mtx;			/* per-unit lock */
53176868Srink	struct callout ch;		/* callout handle */
54176868Srink	struct selinfo sel;		/* select/poll queue handle */
55176868Srink
56176868Srink	int open;			/* is chardev open? */
57176868Srink	int polling;			/* are we polling? */
58176868Srink	int dying;			/* are we detaching? */
59176868Srink
60176868Srink	unsigned long timeout;		/* response timeout */
61176868Srink
62176868Srink	uint8_t buf[CMX_BUFSZ];		/* read/write buffer */
63176868Srink};
64176868Srink
65176868Srinkextern devclass_t cmx_devclass;
66176868Srink
67176868Srinkvoid	cmx_init_softc(device_t);
68176868Srinkint	cmx_alloc_resources(device_t);
69176868Srinkvoid	cmx_release_resources(device_t);
70176868Srinkint	cmx_attach(device_t);
71176868Srinkint	cmx_detach(device_t);
72176868Srink
73176868Srink#define	CMX_READ_1(sc, off)						\
74176868Srink	(bus_space_read_1((sc)->bst, (sc)->bsh, off))
75176868Srink#define	CMX_WRITE_1(sc, off, val)					\
76176868Srink	(bus_space_write_1((sc)->bst, (sc)->bsh, off, val))
77176868Srink
78176868Srink#define	cmx_read_BSR(sc)						\
79176868Srink	CMX_READ_1(sc, REG_OFFSET_BSR)
80176868Srink#define	cmx_write_BSR(sc, val)						\
81176868Srink	CMX_WRITE_1(sc, REG_OFFSET_BSR, val)
82176868Srink#define	cmx_read_SCR(sc)						\
83176868Srink	CMX_READ_1(sc, REG_OFFSET_SCR)
84176868Srink#define	cmx_write_SCR(sc, val)						\
85176868Srink	CMX_WRITE_1(sc, REG_OFFSET_SCR, val)
86176868Srink#define	cmx_read_DTR(sc)						\
87176868Srink	CMX_READ_1(sc, REG_OFFSET_DTR)
88176868Srink#define	cmx_write_DTR(sc, val)						\
89176868Srink	CMX_WRITE_1(sc, REG_OFFSET_DTR, val)
90176868Srink
91176868Srink#define	cmx_test(byte, flags, test)					\
92176868Srink	(((byte) & (flags)) == ((test) ? (flags) : 0))
93176868Srink
94176868Srink#define	cmx_test_BSR(sc, flags, test)					\
95176868Srink	cmx_test(cmx_read_BSR(sc), flags, test)
96176868Srink
97176868Srink#define	CMX_LOCK(sc)			mtx_lock(&(sc)->mtx)
98176868Srink#define	CMX_UNLOCK(sc)			mtx_unlock(&(sc)->mtx)
99176868Srink#define	CMX_LOCK_ASSERT(sc, what)	mtx_assert(&(sc)->mtx, (what))
100