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