ppbconf.h revision 28257
1178476Sjb/*-
2178476Sjb * Copyright (c) 1997 Nicolas Souchu
3178476Sjb * All rights reserved.
4178476Sjb *
5178476Sjb * Redistribution and use in source and binary forms, with or without
6178476Sjb * modification, are permitted provided that the following conditions
7178476Sjb * are met:
8178476Sjb * 1. Redistributions of source code must retain the above copyright
9178476Sjb *    notice, this list of conditions and the following disclaimer.
10178476Sjb * 2. Redistributions in binary form must reproduce the above copyright
11178476Sjb *    notice, this list of conditions and the following disclaimer in the
12178476Sjb *    documentation and/or other materials provided with the distribution.
13178476Sjb *
14178476Sjb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15178476Sjb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16178476Sjb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17178476Sjb * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18178476Sjb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19178476Sjb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20178476Sjb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21178476Sjb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22178476Sjb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23178476Sjb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24178476Sjb * SUCH DAMAGE.
25178476Sjb *
26178476Sjb *	$Id: ppbconf.h,v 1.1 1997/08/14 13:57:42 msmith Exp $
27178476Sjb *
28178476Sjb */
29178476Sjb#ifndef __PPBCONF_H
30178476Sjb#define __PPBCONF_H
31178476Sjb
32178476Sjb/*
33178476Sjb * Parallel Port Bus sleep/wakeup queue.
34178476Sjb */
35178476Sjb#define PPBPRI	PZERO+8
36178476Sjb
37178476Sjb/*
38178476Sjb * Parallel Port Chipset modes.
39178476Sjb */
40178476Sjb#define PPB_AUTODETECT	0x0	/* autodetect */
41178476Sjb#define PPB_NIBBLE	0x1	/* standard 4 bit mode */
42178476Sjb#define PPB_PS2		0x2	/* PS/2 byte mode */
43178476Sjb#define PPB_EPP		0x3	/* EPP mode, 32 bit */
44178476Sjb#define PPB_ECP_EPP	0x4	/* ECP in EPP mode */
45178476Sjb#define PPB_ECP_PS2	0x5	/* ECP in PS/2 mode */
46178476Sjb#define PPB_ECP		0x6	/* ECP mode */
47178476Sjb#define PPB_UNKNOWN	0x7	/* the last one */
48178476Sjb
49178476Sjb#define PPB_IS_EPP(mode) (mode == PPB_EPP || mode == PPB_ECP_EPP)
50178476Sjb
51178476Sjb#define PPB_IN_EPP_MODE(dev) (PPB_IS_EPP (ppb_get_mode (dev)))
52178476Sjb
53178476Sjb/*
54178476Sjb * Parallel Port Chipset control bits.
55178476Sjb */
56178476Sjb#define STROBE		0x01
57178476Sjb#define AUTOFEED	0x02
58178476Sjb#define nINIT		0x04
59178476Sjb#define SELECTIN	0x08
60178476Sjb#define PCD		0x20
61178476Sjb
62178476Sjb/*
63178476Sjb * Parallel Port Chipset status bits.
64178476Sjb */
65178476Sjb#define TIMEOUT		0x01
66178476Sjb#define nFAULT		0x08
67178476Sjb#define SELECT		0x10
68178476Sjb#define ERROR		0x20
69178476Sjb#define nACK		0x40
70178476Sjb#define nBUSY		0x80
71178476Sjb
72178476Sjb/*
73178476Sjb * Structure to store status information.
74178476Sjb */
75178476Sjbstruct ppb_status {
76178476Sjb	unsigned char status;
77178476Sjb
78178476Sjb	unsigned int timeout:1;
79178476Sjb	unsigned int error:1;
80178476Sjb	unsigned int select:1;
81178476Sjb	unsigned int paper_end:1;
82178476Sjb	unsigned int ack:1;
83178476Sjb	unsigned int busy:1;
84178476Sjb};
85178476Sjb
86178476Sjb/*
87178476Sjb * How tsleep () is called in ppb_request_bus ().
88178476Sjb */
89178476Sjb#define PPB_DONTWAIT	0
90178476Sjb#define PPB_NOINTR	0
91178476Sjb#define PPB_WAIT	0x1
92178476Sjb#define PPB_INTR	0x2
93178476Sjb
94178476Sjbstruct ppb_data;	/* see below */
95178476Sjb
96178476Sjb/*
97178476Sjb * Parallel Port Bus Device structure.
98178476Sjb */
99178476Sjbstruct ppb_device {
100178476Sjb
101178476Sjb	int id_unit;			/* unit of the device */
102178476Sjb
103178476Sjb	void (*intr)(int);		/* interrupt handler */
104178476Sjb
105178476Sjb	struct ppb_data *ppb;		/* link to the ppbus */
106178476Sjb
107178476Sjb	LIST_ENTRY(ppb_device)	chain;	/* list of devices on the bus */
108178476Sjb};
109178476Sjb
110178476Sjb/*
111178476Sjb * Parallel Port Bus Adapter structure.
112178476Sjb */
113178476Sjbstruct ppb_adapter {
114178476Sjb
115178476Sjb	void (*intr_handler)(int);
116178476Sjb	void (*reset_epp_timeout)(int);
117178476Sjb	void (*ecp_sync)(int);
118178476Sjb
119178476Sjb	void (*outsb_epp)(int, char *, int);
120178476Sjb	void (*outsw_epp)(int, char *, int);
121178476Sjb	void (*outsl_epp)(int, char *, int);
122178476Sjb	void (*insb_epp)(int, char *, int);
123178476Sjb	void (*insw_epp)(int, char *, int);
124178476Sjb	void (*insl_epp)(int, char *, int);
125178476Sjb
126178476Sjb	char (*r_dtr)(int);
127178476Sjb	char (*r_str)(int);
128178476Sjb	char (*r_ctr)(int);
129178476Sjb	char (*r_epp)(int);
130178476Sjb	char (*r_ecr)(int);
131178476Sjb	char (*r_fifo)(int);
132178476Sjb
133178476Sjb	void (*w_dtr)(int, char);
134178476Sjb	void (*w_str)(int, char);
135178476Sjb	void (*w_ctr)(int, char);
136178476Sjb	void (*w_epp)(int, char);
137178476Sjb	void (*w_ecr)(int, char);
138178476Sjb	void (*w_fifo)(int, char);
139178476Sjb};
140178476Sjb
141178476Sjb/*
142178476Sjb * ppb_link structure.
143178476Sjb */
144178476Sjbstruct ppb_link {
145178476Sjb
146178476Sjb	int adapter_unit;			/* unit of the adapter */
147178476Sjb
148178476Sjb	int base;				/* base address of the port */
149178476Sjb	int id_irq;				/* != 0 if irq enabled */
150178476Sjb	int mode;				/* NIBBLE, PS2, EPP, ECP */
151178476Sjb
152178476Sjb#define EPP_1_9		0x0			/* default */
153178476Sjb#define EPP_1_7		0x1
154178476Sjb
155178476Sjb	int epp_protocol;			/* EPP protocol: 0=1.9, 1=1.7 */
156178476Sjb
157178476Sjb	struct ppb_adapter *adapter;		/* link to the ppc adapter */
158178476Sjb	struct ppb_data *ppbus;			/* link to the ppbus */
159178476Sjb};
160178476Sjb
161178476Sjb/*
162178476Sjb * Maximum size of the PnP info string
163178476Sjb */
164178476Sjb#define PPB_PnP_STRING_SIZE	160			/* XXX */
165178476Sjb
166178476Sjb/*
167178476Sjb * Parallel Port Bus structure.
168178476Sjb */
169178476Sjbstruct ppb_data {
170178476Sjb
171178476Sjb#define PPB_PnP_PRINTER	0
172178476Sjb#define PPB_PnP_MODEM	1
173178476Sjb#define PPB_PnP_NET	2
174178476Sjb#define PPB_PnP_HDC	3
175178476Sjb#define PPB_PnP_PCMCIA	4
176178476Sjb#define PPB_PnP_MEDIA	5
177178476Sjb#define PPB_PnP_FDC	6
178178476Sjb#define PPB_PnP_PORTS	7
179178476Sjb#define PPB_PnP_SCANNER	8
180178476Sjb#define PPB_PnP_DIGICAM	9
181178476Sjb#define PPB_PnP_UNKNOWN	10
182178476Sjb	int	class_id;	/* not a PnP device if class_id < 0 */
183178476Sjb
184178476Sjb	struct ppb_link *ppb_link;		/* link to the adapter */
185178476Sjb	struct ppb_device *ppb_owner;		/* device which owns the bus */
186178476Sjb	LIST_HEAD(, ppb_device)	ppb_devs;	/* list of devices on the bus */
187178476Sjb	LIST_ENTRY(ppb_data)	ppb_chain;	/* list of busses */
188178476Sjb};
189178476Sjb
190178476Sjb/*
191178476Sjb * Parallel Port Bus driver structure.
192178476Sjb */
193178476Sjbstruct ppb_driver
194178476Sjb{
195178476Sjb    struct ppb_device	*(*probe)(struct ppb_data *ppb);
196178476Sjb    int			(*attach)(struct ppb_device *pdp);
197178476Sjb    char		*name;
198178476Sjb};
199178476Sjb
200178476Sjbextern struct linker_set ppbdriver_set;
201178476Sjb
202178476Sjbextern struct ppb_data *ppb_alloc_bus(void);
203178476Sjbextern struct ppb_data *ppb_next_bus(struct ppb_data *);
204178476Sjbextern struct ppb_data *ppb_lookup_bus(int);
205178476Sjb
206178476Sjbextern int ppb_attach_device(struct ppb_device *);
207178476Sjbextern void ppb_remove_device(struct ppb_device *);
208178476Sjbextern int ppb_attachdevs(struct ppb_data *);
209178476Sjb
210178476Sjbextern int ppb_request_bus(struct ppb_device *, int);
211178476Sjbextern int ppb_release_bus(struct ppb_device *);
212178476Sjb
213178476Sjbextern void ppb_intr(struct ppb_link *);
214178476Sjb
215178476Sjbextern int ppb_poll_device(struct ppb_device *, int, char, char, int);
216178476Sjb
217178476Sjbextern int ppb_reset_epp_timeout(struct ppb_device *);
218178476Sjbextern int ppb_ecp_sync(struct ppb_device *);
219178476Sjbextern int ppb_get_status(struct ppb_device *, struct ppb_status *);
220178476Sjbextern int ppb_get_mode(struct ppb_device *);
221178476Sjbextern int ppb_get_epp_protocol(struct ppb_device *);
222178476Sjbextern int ppb_get_irq(struct ppb_device *);
223178476Sjb
224178476Sjb/*
225178476Sjb * These are defined as macros for speedup.
226178476Sjb */
227178476Sjb#define ppb_outsb_epp(dev,buf,cnt) \
228178476Sjb			(*(dev)->ppb->ppb_link->adapter->outsb_epp) \
229178476Sjb			((dev)->ppb->ppb_link->adapter_unit, buf, cnt)
230178476Sjb#define ppb_outsw_epp(dev,buf,cnt) \
231178476Sjb			(*(dev)->ppb->ppb_link->adapter->outsw_epp) \
232178476Sjb			((dev)->ppb->ppb_link->adapter_unit, buf, cnt)
233178476Sjb#define ppb_outsl_epp(dev,buf,cnt) \
234178476Sjb			(*(dev)->ppb->ppb_link->adapter->outsl_epp) \
235178476Sjb			((dev)->ppb->ppb_link->adapter_unit, buf, cnt)
236178476Sjb#define ppb_insb_epp(dev,buf,cnt) \
237178476Sjb			(*(dev)->ppb->ppb_link->adapter->insb_epp) \
238178476Sjb			((dev)->ppb->ppb_link->adapter_unit, buf, cnt)
239178476Sjb#define ppb_insw_epp(dev,buf,cnt) \
240178476Sjb			(*(dev)->ppb->ppb_link->adapter->insw_epp) \
241178476Sjb			((dev)->ppb->ppb_link->adapter_unit, buf, cnt)
242178476Sjb#define ppb_insl_epp(dev,buf,cnt) \
243178476Sjb			(*(dev)->ppb->ppb_link->adapter->insl_epp) \
244178476Sjb			((dev)->ppb->ppb_link->adapter_unit, buf, cnt)
245178476Sjb
246178476Sjb#define ppb_rdtr(dev) (*(dev)->ppb->ppb_link->adapter->r_dtr) \
247178476Sjb				((dev)->ppb->ppb_link->adapter_unit)
248178476Sjb#define ppb_rstr(dev) (*(dev)->ppb->ppb_link->adapter->r_str) \
249178476Sjb				((dev)->ppb->ppb_link->adapter_unit)
250178476Sjb#define ppb_rctr(dev) (*(dev)->ppb->ppb_link->adapter->r_ctr) \
251178476Sjb				((dev)->ppb->ppb_link->adapter_unit)
252178476Sjb#define ppb_repp(dev) (*(dev)->ppb->ppb_link->adapter->r_epp) \
253178476Sjb				((dev)->ppb->ppb_link->adapter_unit)
254178476Sjb#define ppb_recr(dev) (*(dev)->ppb->ppb_link->adapter->r_ecr) \
255178476Sjb				((dev)->ppb->ppb_link->adapter_unit)
256178476Sjb#define ppb_rfifo(dev) (*(dev)->ppb->ppb_link->adapter->r_fifo) \
257178476Sjb				((dev)->ppb->ppb_link->adapter_unit)
258178476Sjb
259178476Sjb#define ppb_wdtr(dev,byte) (*(dev)->ppb->ppb_link->adapter->w_dtr) \
260178476Sjb				((dev)->ppb->ppb_link->adapter_unit, byte)
261178476Sjb#define ppb_wstr(dev,byte) (*(dev)->ppb->ppb_link->adapter->w_str) \
262178476Sjb				((dev)->ppb->ppb_link->adapter_unit, byte)
263178476Sjb#define ppb_wctr(dev,byte) (*(dev)->ppb->ppb_link->adapter->w_ctr) \
264178476Sjb				((dev)->ppb->ppb_link->adapter_unit, byte)
265178476Sjb#define ppb_wepp(dev,byte) (*(dev)->ppb->ppb_link->adapter->w_epp) \
266178476Sjb				((dev)->ppb->ppb_link->adapter_unit, byte)
267178476Sjb#define ppb_wecr(dev,byte) (*(dev)->ppb->ppb_link->adapter->w_ecr) \
268178476Sjb				((dev)->ppb->ppb_link->adapter_unit, byte)
269178476Sjb#define ppb_wfifo(dev,byte) (*(dev)->ppb->ppb_link->adapter->w_fifo) \
270178476Sjb				((dev)->ppb->ppb_link->adapter_unit, byte)
271178476Sjb
272178476Sjb#endif
273178476Sjb