xref: /openbmc/linux/include/linux/parport.h (revision ce3e8ec0)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Any part of this program may be used in documents licensed under
31da177e4SLinus Torvalds  * the GNU Free Documentation License, Version 1.1 or any later version
41da177e4SLinus Torvalds  * published by the Free Software Foundation.
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #ifndef _PARPORT_H_
71da177e4SLinus Torvalds #define _PARPORT_H_
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include <linux/jiffies.h>
111da177e4SLinus Torvalds #include <linux/proc_fs.h>
121da177e4SLinus Torvalds #include <linux/spinlock.h>
131da177e4SLinus Torvalds #include <linux/wait.h>
143f2e40dfSJeff Garzik #include <linux/irqreturn.h>
156188e10dSMatthew Wilcox #include <linux/semaphore.h>
166fa45a22SSudip Mukherjee #include <linux/device.h>
171da177e4SLinus Torvalds #include <asm/ptrace.h>
18607ca46eSDavid Howells #include <uapi/linux/parport.h>
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds /* Define this later. */
211da177e4SLinus Torvalds struct parport;
221da177e4SLinus Torvalds struct pardevice;
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds struct pc_parport_state {
251da177e4SLinus Torvalds 	unsigned int ctr;
261da177e4SLinus Torvalds 	unsigned int ecr;
271da177e4SLinus Torvalds };
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds struct ax_parport_state {
301da177e4SLinus Torvalds 	unsigned int ctr;
311da177e4SLinus Torvalds 	unsigned int ecr;
321da177e4SLinus Torvalds 	unsigned int dcsr;
331da177e4SLinus Torvalds };
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds /* used by both parport_amiga and parport_mfc3 */
361da177e4SLinus Torvalds struct amiga_parport_state {
371da177e4SLinus Torvalds        unsigned char data;     /* ciaa.prb */
381da177e4SLinus Torvalds        unsigned char datadir;  /* ciaa.ddrb */
391da177e4SLinus Torvalds        unsigned char status;   /* ciab.pra & 7 */
401da177e4SLinus Torvalds        unsigned char statusdir;/* ciab.ddrb & 7 */
411da177e4SLinus Torvalds };
421da177e4SLinus Torvalds 
438e75f744SArnaud Giersch struct ip32_parport_state {
448e75f744SArnaud Giersch 	unsigned int dcr;
458e75f744SArnaud Giersch 	unsigned int ecr;
468e75f744SArnaud Giersch };
478e75f744SArnaud Giersch 
481da177e4SLinus Torvalds struct parport_state {
491da177e4SLinus Torvalds 	union {
501da177e4SLinus Torvalds 		struct pc_parport_state pc;
511da177e4SLinus Torvalds 		/* ARC has no state. */
521da177e4SLinus Torvalds 		struct ax_parport_state ax;
531da177e4SLinus Torvalds 		struct amiga_parport_state amiga;
541da177e4SLinus Torvalds 		/* Atari has not state. */
558e75f744SArnaud Giersch 		struct ip32_parport_state ip32;
561da177e4SLinus Torvalds 		void *misc;
571da177e4SLinus Torvalds 	} u;
581da177e4SLinus Torvalds };
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds struct parport_operations {
611da177e4SLinus Torvalds 	/* IBM PC-style virtual registers. */
621da177e4SLinus Torvalds 	void (*write_data)(struct parport *, unsigned char);
631da177e4SLinus Torvalds 	unsigned char (*read_data)(struct parport *);
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds 	void (*write_control)(struct parport *, unsigned char);
661da177e4SLinus Torvalds 	unsigned char (*read_control)(struct parport *);
671da177e4SLinus Torvalds 	unsigned char (*frob_control)(struct parport *, unsigned char mask,
681da177e4SLinus Torvalds 				      unsigned char val);
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds 	unsigned char (*read_status)(struct parport *);
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	/* IRQs. */
731da177e4SLinus Torvalds 	void (*enable_irq)(struct parport *);
741da177e4SLinus Torvalds 	void (*disable_irq)(struct parport *);
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds 	/* Data direction. */
771da177e4SLinus Torvalds 	void (*data_forward) (struct parport *);
781da177e4SLinus Torvalds 	void (*data_reverse) (struct parport *);
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds 	/* For core parport code. */
811da177e4SLinus Torvalds 	void (*init_state)(struct pardevice *, struct parport_state *);
821da177e4SLinus Torvalds 	void (*save_state)(struct parport *, struct parport_state *);
831da177e4SLinus Torvalds 	void (*restore_state)(struct parport *, struct parport_state *);
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds 	/* Block read/write */
861da177e4SLinus Torvalds 	size_t (*epp_write_data) (struct parport *port, const void *buf,
871da177e4SLinus Torvalds 				  size_t len, int flags);
881da177e4SLinus Torvalds 	size_t (*epp_read_data) (struct parport *port, void *buf, size_t len,
891da177e4SLinus Torvalds 				 int flags);
901da177e4SLinus Torvalds 	size_t (*epp_write_addr) (struct parport *port, const void *buf,
911da177e4SLinus Torvalds 				  size_t len, int flags);
921da177e4SLinus Torvalds 	size_t (*epp_read_addr) (struct parport *port, void *buf, size_t len,
931da177e4SLinus Torvalds 				 int flags);
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds 	size_t (*ecp_write_data) (struct parport *port, const void *buf,
961da177e4SLinus Torvalds 				  size_t len, int flags);
971da177e4SLinus Torvalds 	size_t (*ecp_read_data) (struct parport *port, void *buf, size_t len,
981da177e4SLinus Torvalds 				 int flags);
991da177e4SLinus Torvalds 	size_t (*ecp_write_addr) (struct parport *port, const void *buf,
1001da177e4SLinus Torvalds 				  size_t len, int flags);
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds 	size_t (*compat_write_data) (struct parport *port, const void *buf,
1031da177e4SLinus Torvalds 				     size_t len, int flags);
1041da177e4SLinus Torvalds 	size_t (*nibble_read_data) (struct parport *port, void *buf,
1051da177e4SLinus Torvalds 				    size_t len, int flags);
1061da177e4SLinus Torvalds 	size_t (*byte_read_data) (struct parport *port, void *buf,
1071da177e4SLinus Torvalds 				  size_t len, int flags);
1081da177e4SLinus Torvalds 	struct module *owner;
1091da177e4SLinus Torvalds };
1101da177e4SLinus Torvalds 
1111da177e4SLinus Torvalds struct parport_device_info {
1121da177e4SLinus Torvalds 	parport_device_class class;
1131da177e4SLinus Torvalds 	const char *class_name;
1141da177e4SLinus Torvalds 	const char *mfr;
1151da177e4SLinus Torvalds 	const char *model;
1161da177e4SLinus Torvalds 	const char *cmdset;
1171da177e4SLinus Torvalds 	const char *description;
1181da177e4SLinus Torvalds };
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds /* Each device can have two callback functions:
1211da177e4SLinus Torvalds  *  1) a preemption function, called by the resource manager to request
1221da177e4SLinus Torvalds  *     that the driver relinquish control of the port.  The driver should
1231da177e4SLinus Torvalds  *     return zero if it agrees to release the port, and nonzero if it
1241da177e4SLinus Torvalds  *     refuses.  Do not call parport_release() - the kernel will do this
1251da177e4SLinus Torvalds  *     implicitly.
1261da177e4SLinus Torvalds  *
1271da177e4SLinus Torvalds  *  2) a wake-up function, called by the resource manager to tell drivers
1281da177e4SLinus Torvalds  *     that the port is available to be claimed.  If a driver wants to use
1291da177e4SLinus Torvalds  *     the port, it should call parport_claim() here.
1301da177e4SLinus Torvalds  */
1311da177e4SLinus Torvalds 
1321da177e4SLinus Torvalds /* A parallel port device */
1331da177e4SLinus Torvalds struct pardevice {
1341da177e4SLinus Torvalds 	const char *name;
1351da177e4SLinus Torvalds 	struct parport *port;
1361da177e4SLinus Torvalds 	int daisy;
1371da177e4SLinus Torvalds 	int (*preempt)(void *);
1381da177e4SLinus Torvalds 	void (*wakeup)(void *);
1391da177e4SLinus Torvalds 	void *private;
1405712cb3dSJeff Garzik 	void (*irq_func)(void *);
1411da177e4SLinus Torvalds 	unsigned int flags;
1421da177e4SLinus Torvalds 	struct pardevice *next;
1431da177e4SLinus Torvalds 	struct pardevice *prev;
1446fa45a22SSudip Mukherjee 	struct device dev;
1456fa45a22SSudip Mukherjee 	bool devmodel;
1461da177e4SLinus Torvalds 	struct parport_state *state;     /* saved status over preemption */
1471da177e4SLinus Torvalds 	wait_queue_head_t wait_q;
1481da177e4SLinus Torvalds 	unsigned long int time;
1491da177e4SLinus Torvalds 	unsigned long int timeslice;
1501da177e4SLinus Torvalds 	volatile long int timeout;
1511da177e4SLinus Torvalds 	unsigned long waiting;		 /* long req'd for set_bit --RR */
1521da177e4SLinus Torvalds 	struct pardevice *waitprev;
1531da177e4SLinus Torvalds 	struct pardevice *waitnext;
1541da177e4SLinus Torvalds 	void * sysctl_table;
1551da177e4SLinus Torvalds };
1561da177e4SLinus Torvalds 
1576fa45a22SSudip Mukherjee #define to_pardevice(n) container_of(n, struct pardevice, dev)
1586fa45a22SSudip Mukherjee 
1591da177e4SLinus Torvalds /* IEEE1284 information */
1601da177e4SLinus Torvalds 
161d8a33496SMarko Kohtala /* IEEE1284 phases. These are exposed to userland through ppdev IOCTL
162d8a33496SMarko Kohtala  * PP[GS]ETPHASE, so do not change existing values. */
1631da177e4SLinus Torvalds enum ieee1284_phase {
1641da177e4SLinus Torvalds 	IEEE1284_PH_FWD_DATA,
1651da177e4SLinus Torvalds 	IEEE1284_PH_FWD_IDLE,
1661da177e4SLinus Torvalds 	IEEE1284_PH_TERMINATE,
1671da177e4SLinus Torvalds 	IEEE1284_PH_NEGOTIATION,
168d8a33496SMarko Kohtala 	IEEE1284_PH_HBUSY_DNA,
1691da177e4SLinus Torvalds 	IEEE1284_PH_REV_IDLE,
1701da177e4SLinus Torvalds 	IEEE1284_PH_HBUSY_DAVAIL,
1711da177e4SLinus Torvalds 	IEEE1284_PH_REV_DATA,
1721da177e4SLinus Torvalds 	IEEE1284_PH_ECP_SETUP,
1731da177e4SLinus Torvalds 	IEEE1284_PH_ECP_FWD_TO_REV,
1741da177e4SLinus Torvalds 	IEEE1284_PH_ECP_REV_TO_FWD,
1751da177e4SLinus Torvalds 	IEEE1284_PH_ECP_DIR_UNKNOWN,
1761da177e4SLinus Torvalds };
1771da177e4SLinus Torvalds struct ieee1284_info {
1781da177e4SLinus Torvalds 	int mode;
1791da177e4SLinus Torvalds 	volatile enum ieee1284_phase phase;
1801da177e4SLinus Torvalds 	struct semaphore irq;
1811da177e4SLinus Torvalds };
1821da177e4SLinus Torvalds 
1831da177e4SLinus Torvalds #define PARPORT_NAME_MAX_LEN 15
1841da177e4SLinus Torvalds 
1851da177e4SLinus Torvalds /* A parallel port */
1861da177e4SLinus Torvalds struct parport {
1871da177e4SLinus Torvalds 	unsigned long base;	/* base address */
1881da177e4SLinus Torvalds 	unsigned long base_hi;  /* base address (hi - ECR) */
1891da177e4SLinus Torvalds 	unsigned int size;	/* IO extent */
1901da177e4SLinus Torvalds 	const char *name;
1911da177e4SLinus Torvalds 	unsigned int modes;
1921da177e4SLinus Torvalds 	int irq;		/* interrupt (or -1 for none) */
1931da177e4SLinus Torvalds 	int dma;
194c15a3837SDavid Brownell 	int muxport;		/* which muxport (if any) this is */
195c15a3837SDavid Brownell 	int portnum;		/* which physical parallel port (not mux) */
196c15a3837SDavid Brownell 	struct device *dev;	/* Physical device associated with IO/DMA.
197c15a3837SDavid Brownell 				 * This may unfortulately be null if the
1986fa45a22SSudip Mukherjee 				 * port has a legacy driver.
1991da177e4SLinus Torvalds 				 */
2001da177e4SLinus Torvalds 	struct device bus_dev;	/* to link with the bus */
2011da177e4SLinus Torvalds 	struct parport *physport;
2021da177e4SLinus Torvalds 				/* If this is a non-default mux
2031da177e4SLinus Torvalds 				   parport, i.e. we're a clone of a real
2041da177e4SLinus Torvalds 				   physical port, this is a pointer to that
2051da177e4SLinus Torvalds 				   port. The locking is only done in the
2061da177e4SLinus Torvalds 				   real port.  For a clone port, the
2071da177e4SLinus Torvalds 				   following structure members are
208c15a3837SDavid Brownell 				   meaningless: devices, cad, muxsel,
2091da177e4SLinus Torvalds 				   waithead, waittail, flags, pdir,
2101da177e4SLinus Torvalds 				   dev, ieee1284, *_lock.
2111da177e4SLinus Torvalds 
2121da177e4SLinus Torvalds 				   It this is a default mux parport, or
2131da177e4SLinus Torvalds 				   there is no mux involved, this points to
2141da177e4SLinus Torvalds 				   ourself. */
2151da177e4SLinus Torvalds 
2161da177e4SLinus Torvalds 	struct pardevice *devices;
2171da177e4SLinus Torvalds 	struct pardevice *cad;	/* port owner */
2181da177e4SLinus Torvalds 	int daisy;		/* currently selected daisy addr */
2191da177e4SLinus Torvalds 	int muxsel;		/* currently selected mux port */
2201da177e4SLinus Torvalds 
2211da177e4SLinus Torvalds 	struct pardevice *waithead;
2221da177e4SLinus Torvalds 	struct pardevice *waittail;
2239c6c273aSKees Cook 
2241da177e4SLinus Torvalds 	struct list_head list;
2251da177e4SLinus Torvalds 	struct timer_list timer;
2261da177e4SLinus Torvalds 	unsigned int flags;
2271da177e4SLinus Torvalds 
2281da177e4SLinus Torvalds 	void *sysctl_table;
2291da177e4SLinus Torvalds 	struct parport_device_info probe_info[5]; /* 0-3 + non-IEEE1284.3 */
2301da177e4SLinus Torvalds 	struct ieee1284_info ieee1284;
2311da177e4SLinus Torvalds 
2321da177e4SLinus Torvalds 	struct parport_operations *ops;
2331da177e4SLinus Torvalds 	void *private_data;     /* for lowlevel driver */
2341da177e4SLinus Torvalds 
2351da177e4SLinus Torvalds 	int number;		/* port index - the `n' in `parportn' */
2361da177e4SLinus Torvalds 	spinlock_t pardevice_lock;
2371da177e4SLinus Torvalds 	spinlock_t waitlist_lock;
2381da177e4SLinus Torvalds 	rwlock_t cad_lock;
2391da177e4SLinus Torvalds 
2401da177e4SLinus Torvalds 	int spintime;
24105ad709dSAlan Cox 	atomic_t ref_count;
24205ad709dSAlan Cox 
24305ad709dSAlan Cox 	unsigned long devflags;
24405ad709dSAlan Cox #define PARPORT_DEVPROC_REGISTERED	0
2451da177e4SLinus Torvalds 	struct pardevice *proc_device;	/* Currently register proc device */
2461da177e4SLinus Torvalds 
2471da177e4SLinus Torvalds 	struct list_head full_list;
2481da177e4SLinus Torvalds 	struct parport *slaves[3];
2496fa45a22SSudip Mukherjee };
2506fa45a22SSudip Mukherjee 
2511da177e4SLinus Torvalds #define to_parport_dev(n) container_of(n, struct parport, bus_dev)
2521da177e4SLinus Torvalds 
2531da177e4SLinus Torvalds #define DEFAULT_SPIN_TIME 500 /* us */
2541da177e4SLinus Torvalds 
2551da177e4SLinus Torvalds struct parport_driver {
2561da177e4SLinus Torvalds 	const char *name;
2576fa45a22SSudip Mukherjee 	void (*attach) (struct parport *);
2586fa45a22SSudip Mukherjee 	void (*detach) (struct parport *);
2596fa45a22SSudip Mukherjee 	void (*match_port)(struct parport *);
2606fa45a22SSudip Mukherjee 	int (*probe)(struct pardevice *);
2611da177e4SLinus Torvalds 	struct device_driver driver;
2621da177e4SLinus Torvalds 	bool devmodel;
2631da177e4SLinus Torvalds 	struct list_head list;
2646fa45a22SSudip Mukherjee };
2656fa45a22SSudip Mukherjee 
2666fa45a22SSudip Mukherjee #define to_parport_driver(n) container_of(n, struct parport_driver, driver)
2676fa45a22SSudip Mukherjee 
2686fa45a22SSudip Mukherjee int parport_bus_init(void);
2691da177e4SLinus Torvalds void parport_bus_exit(void);
2701da177e4SLinus Torvalds 
2711da177e4SLinus Torvalds /* parport_register_port registers a new parallel port at the given
2721da177e4SLinus Torvalds    address (if one does not already exist) and returns a pointer to it.
2731da177e4SLinus Torvalds    This entails claiming the I/O region, IRQ and DMA.  NULL is returned
2741da177e4SLinus Torvalds    if initialisation fails. */
2751da177e4SLinus Torvalds struct parport *parport_register_port(unsigned long base, int irq, int dma,
2761da177e4SLinus Torvalds 				      struct parport_operations *ops);
2771da177e4SLinus Torvalds 
2781da177e4SLinus Torvalds /* Once a registered port is ready for high-level drivers to use, the
2791da177e4SLinus Torvalds    low-level driver that registered it should announce it.  This will
2801da177e4SLinus Torvalds    call the high-level drivers' attach() functions (after things like
2811da177e4SLinus Torvalds    determining the IEEE 1284.3 topology of the port and collecting
2821da177e4SLinus Torvalds    DeviceIDs). */
2831da177e4SLinus Torvalds void parport_announce_port (struct parport *port);
2841da177e4SLinus Torvalds 
2851da177e4SLinus Torvalds /* Unregister a port. */
2861da177e4SLinus Torvalds extern void parport_remove_port(struct parport *port);
2876fa45a22SSudip Mukherjee 
2886fa45a22SSudip Mukherjee /* Register a new high-level driver. */
2896fa45a22SSudip Mukherjee 
2906fa45a22SSudip Mukherjee int __must_check __parport_register_driver(struct parport_driver *,
2916fa45a22SSudip Mukherjee 					   struct module *,
2926fa45a22SSudip Mukherjee 					   const char *mod_name);
2936fa45a22SSudip Mukherjee /*
2946fa45a22SSudip Mukherjee  * parport_register_driver must be a macro so that KBUILD_MODNAME can
2954c9a3a6cSMauro Carvalho Chehab  * be expanded
2964c9a3a6cSMauro Carvalho Chehab  */
2974c9a3a6cSMauro Carvalho Chehab 
2984c9a3a6cSMauro Carvalho Chehab /**
2994c9a3a6cSMauro Carvalho Chehab  *	parport_register_driver - register a parallel port device driver
3004c9a3a6cSMauro Carvalho Chehab  *	@driver: structure describing the driver
3014c9a3a6cSMauro Carvalho Chehab  *
3024c9a3a6cSMauro Carvalho Chehab  *	This can be called by a parallel port device driver in order
3034c9a3a6cSMauro Carvalho Chehab  *	to receive notifications about ports being found in the
3044c9a3a6cSMauro Carvalho Chehab  *	system, as well as ports no longer available.
3054c9a3a6cSMauro Carvalho Chehab  *
3064c9a3a6cSMauro Carvalho Chehab  *	If devmodel is true then the new device model is used
3074c9a3a6cSMauro Carvalho Chehab  *	for registration.
3084c9a3a6cSMauro Carvalho Chehab  *
3094c9a3a6cSMauro Carvalho Chehab  *	The @driver structure is allocated by the caller and must not be
3104c9a3a6cSMauro Carvalho Chehab  *	deallocated until after calling parport_unregister_driver().
3114c9a3a6cSMauro Carvalho Chehab  *
3124c9a3a6cSMauro Carvalho Chehab  *	If using the non device model:
3134c9a3a6cSMauro Carvalho Chehab  *	The driver's attach() function may block.  The port that
3144c9a3a6cSMauro Carvalho Chehab  *	attach() is given will be valid for the duration of the
3154c9a3a6cSMauro Carvalho Chehab  *	callback, but if the driver wants to take a copy of the
3164c9a3a6cSMauro Carvalho Chehab  *	pointer it must call parport_get_port() to do so.  Calling
3174c9a3a6cSMauro Carvalho Chehab  *	parport_register_device() on that port will do this for you.
3184c9a3a6cSMauro Carvalho Chehab  *
3194c9a3a6cSMauro Carvalho Chehab  *	The driver's detach() function may block.  The port that
3204c9a3a6cSMauro Carvalho Chehab  *	detach() is given will be valid for the duration of the
3214c9a3a6cSMauro Carvalho Chehab  *	callback, but if the driver wants to take a copy of the
3224c9a3a6cSMauro Carvalho Chehab  *	pointer it must call parport_get_port() to do so.
3234c9a3a6cSMauro Carvalho Chehab  *
3244c9a3a6cSMauro Carvalho Chehab  *
3254c9a3a6cSMauro Carvalho Chehab  *	Returns 0 on success. The non device model will always succeeds.
3266fa45a22SSudip Mukherjee  *	but the new device model can fail and will return the error code.
3276fa45a22SSudip Mukherjee  **/
3281da177e4SLinus Torvalds #define parport_register_driver(driver)             \
3291da177e4SLinus Torvalds 	__parport_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
3306fa45a22SSudip Mukherjee 
3311da177e4SLinus Torvalds /* Unregister a high-level driver. */
332a0521f70SAndy Shevchenko void parport_unregister_driver(struct parport_driver *);
333a0521f70SAndy Shevchenko 
334a0521f70SAndy Shevchenko /**
335a0521f70SAndy Shevchenko  * module_parport_driver() - Helper macro for registering a modular parport driver
336a0521f70SAndy Shevchenko  * @__parport_driver: struct parport_driver to be used
337a0521f70SAndy Shevchenko  *
338a0521f70SAndy Shevchenko  * Helper macro for parport drivers which do not do anything special in module
339a0521f70SAndy Shevchenko  * init and exit. This eliminates a lot of boilerplate. Each module may only
340a0521f70SAndy Shevchenko  * use this macro once, and calling it replaces module_init() and module_exit().
341a0521f70SAndy Shevchenko  */
342a0521f70SAndy Shevchenko #define module_parport_driver(__parport_driver) \
3431da177e4SLinus Torvalds 	module_driver(__parport_driver, parport_register_driver, parport_unregister_driver)
3441da177e4SLinus Torvalds 
3451da177e4SLinus Torvalds /* If parport_register_driver doesn't fit your needs, perhaps
3461da177e4SLinus Torvalds  * parport_find_xxx does. */
3471da177e4SLinus Torvalds extern struct parport *parport_find_number (int);
3483f2e40dfSJeff Garzik extern struct parport *parport_find_base (unsigned long);
3493f2e40dfSJeff Garzik 
3503f2e40dfSJeff Garzik /* generic irq handler, if it suits your needs */
3511da177e4SLinus Torvalds extern irqreturn_t parport_irq_handler(int irq, void *dev_id);
3521da177e4SLinus Torvalds 
3531da177e4SLinus Torvalds /* Reference counting for ports. */
3546fa45a22SSudip Mukherjee extern struct parport *parport_get_port (struct parport *);
3556fa45a22SSudip Mukherjee extern void parport_put_port (struct parport *);
3566fa45a22SSudip Mukherjee void parport_del_port(struct parport *);
3576fa45a22SSudip Mukherjee 
3586fa45a22SSudip Mukherjee struct pardev_cb {
3596fa45a22SSudip Mukherjee 	int (*preempt)(void *);
3606fa45a22SSudip Mukherjee 	void (*wakeup)(void *);
3616fa45a22SSudip Mukherjee 	void *private;
3626fa45a22SSudip Mukherjee 	void (*irq_func)(void *);
3631da177e4SLinus Torvalds 	unsigned int flags;
3646824f0ceSSudip Mukherjee };
3656824f0ceSSudip Mukherjee 
3666824f0ceSSudip Mukherjee /*
3676824f0ceSSudip Mukherjee  * parport_register_dev_model declares that a device is connected to a
3686fa45a22SSudip Mukherjee  * port, and tells the kernel all it needs to know.
3696fa45a22SSudip Mukherjee  */
3706fa45a22SSudip Mukherjee struct pardevice *
3716fa45a22SSudip Mukherjee parport_register_dev_model(struct parport *port, const char *name,
3721da177e4SLinus Torvalds 			   const struct pardev_cb *par_dev_cb, int cnt);
3731da177e4SLinus Torvalds 
3741da177e4SLinus Torvalds /* parport_unregister unlinks a device from the chain. */
3751da177e4SLinus Torvalds extern void parport_unregister_device(struct pardevice *dev);
3761da177e4SLinus Torvalds 
3771da177e4SLinus Torvalds /* parport_claim tries to gain ownership of the port for a particular
3781da177e4SLinus Torvalds    driver.  This may fail (return non-zero) if another driver is busy.
3791da177e4SLinus Torvalds    If this driver has registered an interrupt handler, it will be
3801da177e4SLinus Torvalds    enabled.  */
3811da177e4SLinus Torvalds extern int parport_claim(struct pardevice *dev);
3821da177e4SLinus Torvalds 
3831da177e4SLinus Torvalds /* parport_claim_or_block is the same, but sleeps if the port cannot
3841da177e4SLinus Torvalds    be claimed.  Return value is 1 if it slept, 0 normally and -errno
3851da177e4SLinus Torvalds    on error.  */
3861da177e4SLinus Torvalds extern int parport_claim_or_block(struct pardevice *dev);
3871da177e4SLinus Torvalds 
3881da177e4SLinus Torvalds /* parport_release reverses a previous parport_claim.  This can never
3891da177e4SLinus Torvalds    fail, though the effects are undefined (except that they are bad)
3901da177e4SLinus Torvalds    if you didn't previously own the port.  Once you have released the
3911da177e4SLinus Torvalds    port you should make sure that neither your code nor the hardware
3921da177e4SLinus Torvalds    on the port tries to initiate any communication without first
3931da177e4SLinus Torvalds    re-claiming the port.  If you mess with the port state (enabling
3941da177e4SLinus Torvalds    ECP for example) you should clean up before releasing the port. */
3951da177e4SLinus Torvalds 
3961da177e4SLinus Torvalds extern void parport_release(struct pardevice *dev);
3971da177e4SLinus Torvalds 
3981da177e4SLinus Torvalds /**
3991da177e4SLinus Torvalds  * parport_yield - relinquish a parallel port temporarily
4001da177e4SLinus Torvalds  * @dev: a device on the parallel port
4011da177e4SLinus Torvalds  *
4021da177e4SLinus Torvalds  * This function relinquishes the port if it would be helpful to other
4031da177e4SLinus Torvalds  * drivers to do so.  Afterwards it tries to reclaim the port using
4041da177e4SLinus Torvalds  * parport_claim(), and the return value is the same as for
4051da177e4SLinus Torvalds  * parport_claim().  If it fails, the port is left unclaimed and it is
4061da177e4SLinus Torvalds  * the driver's responsibility to reclaim the port.
4071da177e4SLinus Torvalds  *
4081da177e4SLinus Torvalds  * The parport_yield() and parport_yield_blocking() functions are for
4091da177e4SLinus Torvalds  * marking points in the driver at which other drivers may claim the
4101da177e4SLinus Torvalds  * port and use their devices.  Yielding the port is similar to
4111da177e4SLinus Torvalds  * releasing it and reclaiming it, but is more efficient because no
4121da177e4SLinus Torvalds  * action is taken if there are no other devices needing the port.  In
4131da177e4SLinus Torvalds  * fact, nothing is done even if there are other devices waiting but
4141da177e4SLinus Torvalds  * the current device is still within its "timeslice".  The default
4151da177e4SLinus Torvalds  * timeslice is half a second, but it can be adjusted via the /proc
4161da177e4SLinus Torvalds  * interface.
4171da177e4SLinus Torvalds  **/
parport_yield(struct pardevice * dev)4181da177e4SLinus Torvalds static __inline__ int parport_yield(struct pardevice *dev)
4191da177e4SLinus Torvalds {
4201da177e4SLinus Torvalds 	unsigned long int timeslip = (jiffies - dev->time);
4211da177e4SLinus Torvalds 	if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
4221da177e4SLinus Torvalds 		return 0;
4231da177e4SLinus Torvalds 	parport_release(dev);
4241da177e4SLinus Torvalds 	return parport_claim(dev);
4251da177e4SLinus Torvalds }
4261da177e4SLinus Torvalds 
4271da177e4SLinus Torvalds /**
4281da177e4SLinus Torvalds  * parport_yield_blocking - relinquish a parallel port temporarily
4291da177e4SLinus Torvalds  * @dev: a device on the parallel port
4301da177e4SLinus Torvalds  *
4311da177e4SLinus Torvalds  * This function relinquishes the port if it would be helpful to other
4321da177e4SLinus Torvalds  * drivers to do so.  Afterwards it tries to reclaim the port using
4331da177e4SLinus Torvalds  * parport_claim_or_block(), and the return value is the same as for
4341da177e4SLinus Torvalds  * parport_claim_or_block().
4351da177e4SLinus Torvalds  **/
parport_yield_blocking(struct pardevice * dev)4361da177e4SLinus Torvalds static __inline__ int parport_yield_blocking(struct pardevice *dev)
4371da177e4SLinus Torvalds {
4381da177e4SLinus Torvalds 	unsigned long int timeslip = (jiffies - dev->time);
4391da177e4SLinus Torvalds 	if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
4401da177e4SLinus Torvalds 		return 0;
4411da177e4SLinus Torvalds 	parport_release(dev);
4421da177e4SLinus Torvalds 	return parport_claim_or_block(dev);
4431da177e4SLinus Torvalds }
4441da177e4SLinus Torvalds 
4451da177e4SLinus Torvalds /* Flags used to identify what a device does. */
4461da177e4SLinus Torvalds #define PARPORT_DEV_TRAN		0	/* WARNING !! DEPRECATED !! */
4471da177e4SLinus Torvalds #define PARPORT_DEV_LURK		(1<<0)	/* WARNING !! DEPRECATED !! */
4481da177e4SLinus Torvalds #define PARPORT_DEV_EXCL		(1<<1)	/* Need exclusive access. */
4491da177e4SLinus Torvalds 
4501da177e4SLinus Torvalds #define PARPORT_FLAG_EXCL		(1<<1)	/* EXCL driver registered. */
451f230d101SJeff Garzik 
4521da177e4SLinus Torvalds /* IEEE1284 functions */
4531da177e4SLinus Torvalds extern void parport_ieee1284_interrupt (void *);
4541da177e4SLinus Torvalds extern int parport_negotiate (struct parport *, int mode);
4551da177e4SLinus Torvalds extern ssize_t parport_write (struct parport *, const void *buf, size_t len);
4561da177e4SLinus Torvalds extern ssize_t parport_read (struct parport *, void *buf, size_t len);
4571da177e4SLinus Torvalds 
4581da177e4SLinus Torvalds #define PARPORT_INACTIVITY_O_NONBLOCK 1
4591da177e4SLinus Torvalds extern long parport_set_timeout (struct pardevice *, long inactivity);
4601da177e4SLinus Torvalds 
4611da177e4SLinus Torvalds extern int parport_wait_event (struct parport *, long timeout);
4621da177e4SLinus Torvalds extern int parport_wait_peripheral (struct parport *port,
4631da177e4SLinus Torvalds 				    unsigned char mask,
4641da177e4SLinus Torvalds 				    unsigned char val);
4651da177e4SLinus Torvalds extern int parport_poll_peripheral (struct parport *port,
4661da177e4SLinus Torvalds 				    unsigned char mask,
4671da177e4SLinus Torvalds 				    unsigned char val,
4681da177e4SLinus Torvalds 				    int usec);
4691da177e4SLinus Torvalds 
4701da177e4SLinus Torvalds /* For architectural drivers */
4711da177e4SLinus Torvalds extern size_t parport_ieee1284_write_compat (struct parport *,
4721da177e4SLinus Torvalds 					     const void *, size_t, int);
4731da177e4SLinus Torvalds extern size_t parport_ieee1284_read_nibble (struct parport *,
4741da177e4SLinus Torvalds 					    void *, size_t, int);
4751da177e4SLinus Torvalds extern size_t parport_ieee1284_read_byte (struct parport *,
4761da177e4SLinus Torvalds 					  void *, size_t, int);
4771da177e4SLinus Torvalds extern size_t parport_ieee1284_ecp_read_data (struct parport *,
4781da177e4SLinus Torvalds 					      void *, size_t, int);
4791da177e4SLinus Torvalds extern size_t parport_ieee1284_ecp_write_data (struct parport *,
4801da177e4SLinus Torvalds 					       const void *, size_t, int);
4811da177e4SLinus Torvalds extern size_t parport_ieee1284_ecp_write_addr (struct parport *,
4821da177e4SLinus Torvalds 					       const void *, size_t, int);
4831da177e4SLinus Torvalds extern size_t parport_ieee1284_epp_write_data (struct parport *,
4841da177e4SLinus Torvalds 					       const void *, size_t, int);
4851da177e4SLinus Torvalds extern size_t parport_ieee1284_epp_read_data (struct parport *,
4861da177e4SLinus Torvalds 					      void *, size_t, int);
4871da177e4SLinus Torvalds extern size_t parport_ieee1284_epp_write_addr (struct parport *,
4881da177e4SLinus Torvalds 					       const void *, size_t, int);
4891da177e4SLinus Torvalds extern size_t parport_ieee1284_epp_read_addr (struct parport *,
4901da177e4SLinus Torvalds 					      void *, size_t, int);
491c059d579SSudip Mukherjee 
4921da177e4SLinus Torvalds /* IEEE1284.3 functions */
4931da177e4SLinus Torvalds #define daisy_dev_name "Device ID probe"
4945712cb3dSJeff Garzik extern int parport_daisy_init (struct parport *port);
4951da177e4SLinus Torvalds extern void parport_daisy_fini (struct parport *port);
4961da177e4SLinus Torvalds extern struct pardevice *parport_open (int devnum, const char *name);
4971da177e4SLinus Torvalds extern void parport_close (struct pardevice *dev);
4981da177e4SLinus Torvalds extern ssize_t parport_device_id (int devnum, char *buffer, size_t len);
4991da177e4SLinus Torvalds extern void parport_daisy_deselect_all (struct parport *port);
5001da177e4SLinus Torvalds extern int parport_daisy_select (struct parport *port, int daisy, int mode);
501f230d101SJeff Garzik 
5021da177e4SLinus Torvalds /* Lowlevel drivers _can_ call this support function to handle irqs.  */
parport_generic_irq(struct parport * port)503f230d101SJeff Garzik static inline void parport_generic_irq(struct parport *port)
5041da177e4SLinus Torvalds {
5051da177e4SLinus Torvalds 	parport_ieee1284_interrupt (port);
5065712cb3dSJeff Garzik 	read_lock(&port->cad_lock);
5071da177e4SLinus Torvalds 	if (port->cad && port->cad->irq_func)
5081da177e4SLinus Torvalds 		port->cad->irq_func(port->cad->private);
5091da177e4SLinus Torvalds 	read_unlock(&port->cad_lock);
5101da177e4SLinus Torvalds }
5111da177e4SLinus Torvalds 
5121da177e4SLinus Torvalds /* Prototypes from parport_procfs */
5131da177e4SLinus Torvalds extern int parport_proc_register(struct parport *pp);
5141da177e4SLinus Torvalds extern int parport_proc_unregister(struct parport *pp);
5151da177e4SLinus Torvalds extern int parport_device_proc_register(struct pardevice *device);
5161da177e4SLinus Torvalds extern int parport_device_proc_unregister(struct pardevice *device);
517*ce3e8ec0SNiklas Schnelle 
5181da177e4SLinus Torvalds /* If PC hardware is the only type supported, we can optimise a bit.  */
5191da177e4SLinus Torvalds #if !defined(CONFIG_PARPORT_NOT_PC) && defined(CONFIG_PARPORT_PC)
5201da177e4SLinus Torvalds 
5211da177e4SLinus Torvalds #include <linux/parport_pc.h>
5221da177e4SLinus Torvalds #define parport_write_data(p,x)            parport_pc_write_data(p,x)
5231da177e4SLinus Torvalds #define parport_read_data(p)               parport_pc_read_data(p)
5241da177e4SLinus Torvalds #define parport_write_control(p,x)         parport_pc_write_control(p,x)
5251da177e4SLinus Torvalds #define parport_read_control(p)            parport_pc_read_control(p)
5261da177e4SLinus Torvalds #define parport_frob_control(p,m,v)        parport_pc_frob_control(p,m,v)
5271da177e4SLinus Torvalds #define parport_read_status(p)             parport_pc_read_status(p)
5281da177e4SLinus Torvalds #define parport_enable_irq(p)              parport_pc_enable_irq(p)
5291da177e4SLinus Torvalds #define parport_disable_irq(p)             parport_pc_disable_irq(p)
5301da177e4SLinus Torvalds #define parport_data_forward(p)            parport_pc_data_forward(p)
5311da177e4SLinus Torvalds #define parport_data_reverse(p)            parport_pc_data_reverse(p)
5321da177e4SLinus Torvalds 
5331da177e4SLinus Torvalds #else  /*  !CONFIG_PARPORT_NOT_PC  */
5341da177e4SLinus Torvalds 
5351da177e4SLinus Torvalds /* Generic operations vector through the dispatch table. */
5361da177e4SLinus Torvalds #define parport_write_data(p,x)            (p)->ops->write_data(p,x)
5371da177e4SLinus Torvalds #define parport_read_data(p)               (p)->ops->read_data(p)
5381da177e4SLinus Torvalds #define parport_write_control(p,x)         (p)->ops->write_control(p,x)
5391da177e4SLinus Torvalds #define parport_read_control(p)            (p)->ops->read_control(p)
5401da177e4SLinus Torvalds #define parport_frob_control(p,m,v)        (p)->ops->frob_control(p,m,v)
5411da177e4SLinus Torvalds #define parport_read_status(p)             (p)->ops->read_status(p)
5421da177e4SLinus Torvalds #define parport_enable_irq(p)              (p)->ops->enable_irq(p)
5431da177e4SLinus Torvalds #define parport_disable_irq(p)             (p)->ops->disable_irq(p)
5441da177e4SLinus Torvalds #define parport_data_forward(p)            (p)->ops->data_forward(p)
5451da177e4SLinus Torvalds #define parport_data_reverse(p)            (p)->ops->data_reverse(p)
5461da177e4SLinus Torvalds 
547929dfb24SAdrian Bunk #endif /*  !CONFIG_PARPORT_NOT_PC  */
548929dfb24SAdrian Bunk 
549929dfb24SAdrian Bunk extern unsigned long parport_default_timeslice;
5501da177e4SLinus Torvalds extern int parport_default_spintime;
551 
552 #endif /* _PARPORT_H_ */
553