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