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