1
2
3
4
5
6
7
8
9#ifndef _PARPORT_H_
10#define _PARPORT_H_
11
12
13
14
15#define PARPORT_MAX 16
16
17
18#define PARPORT_IRQ_NONE -1
19#define PARPORT_DMA_NONE -1
20#define PARPORT_IRQ_AUTO -2
21#define PARPORT_DMA_AUTO -2
22#define PARPORT_DMA_NOFIFO -3
23#define PARPORT_DISABLE -2
24#define PARPORT_IRQ_PROBEONLY -3
25#define PARPORT_IOHI_AUTO -1
26
27#define PARPORT_CONTROL_STROBE 0x1
28#define PARPORT_CONTROL_AUTOFD 0x2
29#define PARPORT_CONTROL_INIT 0x4
30#define PARPORT_CONTROL_SELECT 0x8
31
32#define PARPORT_STATUS_ERROR 0x8
33#define PARPORT_STATUS_SELECT 0x10
34#define PARPORT_STATUS_PAPEROUT 0x20
35#define PARPORT_STATUS_ACK 0x40
36#define PARPORT_STATUS_BUSY 0x80
37
38
39typedef enum {
40 PARPORT_CLASS_LEGACY = 0,
41 PARPORT_CLASS_PRINTER,
42 PARPORT_CLASS_MODEM,
43 PARPORT_CLASS_NET,
44 PARPORT_CLASS_HDC,
45 PARPORT_CLASS_PCMCIA,
46 PARPORT_CLASS_MEDIA,
47 PARPORT_CLASS_FDC,
48 PARPORT_CLASS_PORTS,
49 PARPORT_CLASS_SCANNER,
50 PARPORT_CLASS_DIGCAM,
51 PARPORT_CLASS_OTHER,
52 PARPORT_CLASS_UNSPEC,
53 PARPORT_CLASS_SCSIADAPTER
54} parport_device_class;
55
56
57
58#define PARPORT_MODE_PCSPP (1<<0)
59#define PARPORT_MODE_TRISTATE (1<<1)
60#define PARPORT_MODE_EPP (1<<2)
61#define PARPORT_MODE_ECP (1<<3)
62#define PARPORT_MODE_COMPAT (1<<4)
63#define PARPORT_MODE_DMA (1<<5)
64#define PARPORT_MODE_SAFEININT (1<<6)
65
66
67
68
69
70#define IEEE1284_MODE_NIBBLE 0
71#define IEEE1284_MODE_BYTE (1<<0)
72#define IEEE1284_MODE_COMPAT (1<<8)
73#define IEEE1284_MODE_BECP (1<<9)
74#define IEEE1284_MODE_ECP (1<<4)
75#define IEEE1284_MODE_ECPRLE (IEEE1284_MODE_ECP | (1<<5))
76#define IEEE1284_MODE_ECPSWE (1<<10)
77#define IEEE1284_MODE_EPP (1<<6)
78#define IEEE1284_MODE_EPPSL (1<<11)
79#define IEEE1284_MODE_EPPSWE (1<<12)
80#define IEEE1284_DEVICEID (1<<2)
81#define IEEE1284_EXT_LINK (1<<14)
82
83
84
85
86
87
88
89#define IEEE1284_ADDR (1<<13)
90#define IEEE1284_DATA 0
91
92
93#define PARPORT_EPP_FAST (1<<0)
94#define PARPORT_W91284PIC (1<<1)
95
96
97#ifdef __KERNEL__
98
99#include <linux/wait.h>
100#include <linux/spinlock.h>
101#include <asm/system.h>
102#include <asm/ptrace.h>
103#include <asm/semaphore.h>
104#include <linux/proc_fs.h>
105#include <linux/config.h>
106
107#define PARPORT_NEED_GENERIC_OPS
108
109
110struct parport;
111struct pardevice;
112
113struct pc_parport_state {
114 unsigned int ctr;
115 unsigned int ecr;
116};
117
118struct ax_parport_state {
119 unsigned int ctr;
120 unsigned int ecr;
121 unsigned int dcsr;
122};
123
124
125struct amiga_parport_state {
126 unsigned char data;
127 unsigned char datadir;
128 unsigned char status;
129 unsigned char statusdir;
130};
131
132struct parport_state {
133 union {
134 struct pc_parport_state pc;
135
136 struct ax_parport_state ax;
137 struct amiga_parport_state amiga;
138
139 void *misc;
140 } u;
141};
142
143struct parport_operations {
144
145 void (*write_data)(struct parport *, unsigned char);
146 unsigned char (*read_data)(struct parport *);
147
148 void (*write_control)(struct parport *, unsigned char);
149 unsigned char (*read_control)(struct parport *);
150 unsigned char (*frob_control)(struct parport *, unsigned char mask,
151 unsigned char val);
152
153 unsigned char (*read_status)(struct parport *);
154
155
156 void (*enable_irq)(struct parport *);
157 void (*disable_irq)(struct parport *);
158
159
160 void (*data_forward) (struct parport *);
161 void (*data_reverse) (struct parport *);
162
163
164 void (*init_state)(struct pardevice *, struct parport_state *);
165 void (*save_state)(struct parport *, struct parport_state *);
166 void (*restore_state)(struct parport *, struct parport_state *);
167
168 void (*inc_use_count)(void);
169 void (*dec_use_count)(void);
170
171
172 size_t (*epp_write_data) (struct parport *port, const void *buf,
173 size_t len, int flags);
174 size_t (*epp_read_data) (struct parport *port, void *buf, size_t len,
175 int flags);
176 size_t (*epp_write_addr) (struct parport *port, const void *buf,
177 size_t len, int flags);
178 size_t (*epp_read_addr) (struct parport *port, void *buf, size_t len,
179 int flags);
180
181 size_t (*ecp_write_data) (struct parport *port, const void *buf,
182 size_t len, int flags);
183 size_t (*ecp_read_data) (struct parport *port, void *buf, size_t len,
184 int flags);
185 size_t (*ecp_write_addr) (struct parport *port, const void *buf,
186 size_t len, int flags);
187
188 size_t (*compat_write_data) (struct parport *port, const void *buf,
189 size_t len, int flags);
190 size_t (*nibble_read_data) (struct parport *port, void *buf,
191 size_t len, int flags);
192 size_t (*byte_read_data) (struct parport *port, void *buf,
193 size_t len, int flags);
194};
195
196struct parport_device_info {
197 parport_device_class class;
198 const char *class_name;
199 const char *mfr;
200 const char *model;
201 const char *cmdset;
202 const char *description;
203};
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218struct pardevice {
219 const char *name;
220 struct parport *port;
221 int daisy;
222 int (*preempt)(void *);
223 void (*wakeup)(void *);
224 void *private;
225 void (*irq_func)(int, void *, struct pt_regs *);
226 unsigned int flags;
227 struct pardevice *next;
228 struct pardevice *prev;
229 struct parport_state *state;
230 wait_queue_head_t wait_q;
231 unsigned long int time;
232 unsigned long int timeslice;
233 volatile long int timeout;
234 unsigned long waiting;
235 struct pardevice *waitprev;
236 struct pardevice *waitnext;
237 void * sysctl_table;
238};
239
240
241
242
243enum ieee1284_phase {
244 IEEE1284_PH_FWD_DATA,
245 IEEE1284_PH_FWD_IDLE,
246 IEEE1284_PH_TERMINATE,
247 IEEE1284_PH_NEGOTIATION,
248 IEEE1284_PH_HBUSY_DNA,
249 IEEE1284_PH_REV_IDLE,
250 IEEE1284_PH_HBUSY_DAVAIL,
251 IEEE1284_PH_REV_DATA,
252 IEEE1284_PH_ECP_SETUP,
253 IEEE1284_PH_ECP_FWD_TO_REV,
254 IEEE1284_PH_ECP_REV_TO_FWD,
255 IEEE1284_PH_ECP_DIR_UNKNOWN,
256};
257struct ieee1284_info {
258 int mode;
259 volatile enum ieee1284_phase phase;
260 struct semaphore irq;
261};
262
263
264struct parport {
265 unsigned long base;
266 unsigned long base_hi;
267 unsigned int size;
268 const char *name;
269 unsigned int modes;
270 int irq;
271 int dma;
272 int muxport;
273 int portnum;
274
275 struct parport *physport;
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290 struct pardevice *devices;
291 struct pardevice *cad;
292 int daisy;
293 int muxsel;
294
295 struct pardevice *waithead;
296 struct pardevice *waittail;
297
298 struct parport *next;
299 unsigned int flags;
300
301 void *sysctl_table;
302 struct parport_device_info probe_info[5];
303 struct ieee1284_info ieee1284;
304
305 struct parport_operations *ops;
306 void *private_data;
307
308 int number;
309 spinlock_t pardevice_lock;
310 spinlock_t waitlist_lock;
311 rwlock_t cad_lock;
312
313 int spintime;
314 atomic_t ref_count;
315};
316
317#define DEFAULT_SPIN_TIME 500
318
319struct parport_driver {
320 const char *name;
321 void (*attach) (struct parport *);
322 void (*detach) (struct parport *);
323 struct parport_driver *next;
324};
325
326
327
328
329
330struct parport *parport_register_port(unsigned long base, int irq, int dma,
331 struct parport_operations *ops);
332
333
334
335
336
337
338void parport_announce_port (struct parport *port);
339
340
341extern void parport_unregister_port(struct parport *port);
342
343
344
345
346struct parport *parport_enumerate(void);
347
348
349extern int parport_register_driver (struct parport_driver *);
350
351
352extern void parport_unregister_driver (struct parport_driver *);
353
354
355
356extern struct parport *parport_find_number (int);
357extern struct parport *parport_find_base (unsigned long);
358
359
360extern struct parport *parport_get_port (struct parport *);
361extern void parport_put_port (struct parport *);
362
363
364
365
366
367
368
369struct pardevice *parport_register_device(struct parport *port,
370 const char *name,
371 int (*pf)(void *), void (*kf)(void *),
372 void (*irq_func)(int, void *, struct pt_regs *),
373 int flags, void *handle);
374
375
376extern void parport_unregister_device(struct pardevice *dev);
377
378
379
380
381
382extern int parport_claim(struct pardevice *dev);
383
384
385
386
387extern int parport_claim_or_block(struct pardevice *dev);
388
389
390
391
392
393
394
395
396
397extern void parport_release(struct pardevice *dev);
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419static __inline__ int parport_yield(struct pardevice *dev)
420{
421 unsigned long int timeslip = (jiffies - dev->time);
422 if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
423 return 0;
424 parport_release(dev);
425 return parport_claim(dev);
426}
427
428
429
430
431
432
433
434
435
436
437static __inline__ int parport_yield_blocking(struct pardevice *dev)
438{
439 unsigned long int timeslip = (jiffies - dev->time);
440 if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
441 return 0;
442 parport_release(dev);
443 return parport_claim_or_block(dev);
444}
445
446
447#define PARPORT_DEV_TRAN 0
448#define PARPORT_DEV_LURK (1<<0)
449#define PARPORT_DEV_EXCL (1<<1)
450
451#define PARPORT_FLAG_EXCL (1<<1)
452
453extern int parport_parse_irqs(int, const char *[], int irqval[]);
454extern int parport_parse_dmas(int, const char *[], int dmaval[]);
455
456
457extern void parport_ieee1284_interrupt (int, void *, struct pt_regs *);
458extern int parport_negotiate (struct parport *, int mode);
459extern ssize_t parport_write (struct parport *, const void *buf, size_t len);
460extern ssize_t parport_read (struct parport *, void *buf, size_t len);
461
462#define PARPORT_INACTIVITY_O_NONBLOCK 1
463extern long parport_set_timeout (struct pardevice *, long inactivity);
464
465extern int parport_wait_event (struct parport *, long timeout);
466extern int parport_wait_peripheral (struct parport *port,
467 unsigned char mask,
468 unsigned char val);
469extern int parport_poll_peripheral (struct parport *port,
470 unsigned char mask,
471 unsigned char val,
472 int usec);
473
474
475extern void parport_ieee1284_wakeup (struct parport *port);
476extern size_t parport_ieee1284_write_compat (struct parport *,
477 const void *, size_t, int);
478extern size_t parport_ieee1284_read_nibble (struct parport *,
479 void *, size_t, int);
480extern size_t parport_ieee1284_read_byte (struct parport *,
481 void *, size_t, int);
482extern size_t parport_ieee1284_ecp_read_data (struct parport *,
483 void *, size_t, int);
484extern size_t parport_ieee1284_ecp_write_data (struct parport *,
485 const void *, size_t, int);
486extern size_t parport_ieee1284_ecp_write_addr (struct parport *,
487 const void *, size_t, int);
488extern size_t parport_ieee1284_epp_write_data (struct parport *,
489 const void *, size_t, int);
490extern size_t parport_ieee1284_epp_read_data (struct parport *,
491 void *, size_t, int);
492extern size_t parport_ieee1284_epp_write_addr (struct parport *,
493 const void *, size_t, int);
494extern size_t parport_ieee1284_epp_read_addr (struct parport *,
495 void *, size_t, int);
496
497
498extern int parport_daisy_init (struct parport *port);
499extern void parport_daisy_fini (struct parport *port);
500extern struct pardevice *parport_open (int devnum, const char *name,
501 int (*pf) (void *),
502 void (*kf) (void *),
503 void (*irqf) (int, void *,
504 struct pt_regs *),
505 int flags, void *handle);
506extern void parport_close (struct pardevice *dev);
507extern ssize_t parport_device_id (int devnum, char *buffer, size_t len);
508extern int parport_device_num (int parport, int mux, int daisy);
509extern int parport_device_coords (int devnum, int *parport, int *mux,
510 int *daisy);
511extern void parport_daisy_deselect_all (struct parport *port);
512extern int parport_daisy_select (struct parport *port, int daisy, int mode);
513
514
515
516
517
518
519
520
521extern int parport_find_device (const char *mfg, const char *mdl, int from);
522extern int parport_find_class (parport_device_class cls, int from);
523
524
525static __inline__ void parport_generic_irq(int irq, struct parport *port,
526 struct pt_regs *regs)
527{
528 parport_ieee1284_interrupt (irq, port, regs);
529 read_lock(&port->cad_lock);
530 if (port->cad && port->cad->irq_func)
531 port->cad->irq_func(irq, port->cad->private, regs);
532 read_unlock(&port->cad_lock);
533}
534
535
536extern int parport_proc_register(struct parport *pp);
537extern int parport_proc_unregister(struct parport *pp);
538extern int parport_device_proc_register(struct pardevice *device);
539extern int parport_device_proc_unregister(struct pardevice *device);
540extern int parport_default_proc_register(void);
541extern int parport_default_proc_unregister(void);
542
543extern void dec_parport_count(void);
544extern void inc_parport_count(void);
545
546
547#if (defined(CONFIG_PARPORT_PC) || defined(CONFIG_PARPORT_PC_MODULE)) && !(defined(CONFIG_PARPORT_ARC) || defined(CONFIG_PARPORT_ARC_MODULE)) && !(defined(CONFIG_PARPORT_AMIGA) || defined(CONFIG_PARPORT_AMIGA_MODULE)) && !(defined(CONFIG_PARPORT_MFC3) || defined(CONFIG_PARPORT_MFC3_MODULE)) && !(defined(CONFIG_PARPORT_ATARI) || defined(CONFIG_PARPORT_ATARI_MODULE)) && !(defined(CONFIG_USB_USS720) || defined(CONFIG_USB_USS720_MODULE)) && !(defined(CONFIG_PARPORT_SUNBPP) || defined(CONFIG_PARPORT_SUNBPP_MODULE)) && !(defined(CONFIG_PARPORT_GSC) || defined(CONFIG_PARPORT_GSC_MODULE)) && !defined(CONFIG_PARPORT_OTHER)
548
549#undef PARPORT_NEED_GENERIC_OPS
550#include <linux/parport_pc.h>
551#define parport_write_data(p,x) parport_pc_write_data(p,x)
552#define parport_read_data(p) parport_pc_read_data(p)
553#define parport_write_control(p,x) parport_pc_write_control(p,x)
554#define parport_read_control(p) parport_pc_read_control(p)
555#define parport_frob_control(p,m,v) parport_pc_frob_control(p,m,v)
556#define parport_read_status(p) parport_pc_read_status(p)
557#define parport_enable_irq(p) parport_pc_enable_irq(p)
558#define parport_disable_irq(p) parport_pc_disable_irq(p)
559#define parport_data_forward(p) parport_pc_data_forward(p)
560#define parport_data_reverse(p) parport_pc_data_reverse(p)
561#endif
562
563#ifdef PARPORT_NEED_GENERIC_OPS
564
565#define parport_write_data(p,x) (p)->ops->write_data(p,x)
566#define parport_read_data(p) (p)->ops->read_data(p)
567#define parport_write_control(p,x) (p)->ops->write_control(p,x)
568#define parport_read_control(p) (p)->ops->read_control(p)
569#define parport_frob_control(p,m,v) (p)->ops->frob_control(p,m,v)
570#define parport_read_status(p) (p)->ops->read_status(p)
571#define parport_enable_irq(p) (p)->ops->enable_irq(p)
572#define parport_disable_irq(p) (p)->ops->disable_irq(p)
573#define parport_data_forward(p) (p)->ops->data_forward(p)
574#define parport_data_reverse(p) (p)->ops->data_reverse(p)
575#endif
576
577#endif
578#endif
579