Blame src/parport.h

Packit d36e9b
/* $Id: parport.h,v 1.1 2002/04/24 14:39:38 twaugh Exp $ */
Packit d36e9b
Packit d36e9b
/*
Packit d36e9b
 * Any part of this program may be used in documents licensed under
Packit d36e9b
 * the GNU Free Documentation License, Version 1.1 or any later version
Packit d36e9b
 * published by the Free Software Foundation.
Packit d36e9b
 */
Packit d36e9b
Packit d36e9b
#ifndef _PARPORT_H_
Packit d36e9b
#define _PARPORT_H_
Packit d36e9b
Packit d36e9b
/* Start off with user-visible constants */
Packit d36e9b
Packit d36e9b
/* Maximum of 8 ports per machine */
Packit d36e9b
#define PARPORT_MAX  8 
Packit d36e9b
Packit d36e9b
/* Magic numbers */
Packit d36e9b
#define PARPORT_IRQ_NONE  -1
Packit d36e9b
#define PARPORT_DMA_NONE  -1
Packit d36e9b
#define PARPORT_IRQ_AUTO  -2
Packit d36e9b
#define PARPORT_DMA_AUTO  -2
Packit d36e9b
#define PARPORT_DMA_NOFIFO -3
Packit d36e9b
#define PARPORT_DISABLE   -2
Packit d36e9b
#define PARPORT_IRQ_PROBEONLY -3
Packit d36e9b
Packit d36e9b
#define PARPORT_CONTROL_STROBE    0x1
Packit d36e9b
#define PARPORT_CONTROL_AUTOFD    0x2
Packit d36e9b
#define PARPORT_CONTROL_INIT      0x4
Packit d36e9b
#define PARPORT_CONTROL_SELECT    0x8
Packit d36e9b
Packit d36e9b
#define PARPORT_STATUS_ERROR      0x8
Packit d36e9b
#define PARPORT_STATUS_SELECT     0x10
Packit d36e9b
#define PARPORT_STATUS_PAPEROUT   0x20
Packit d36e9b
#define PARPORT_STATUS_ACK        0x40
Packit d36e9b
#define PARPORT_STATUS_BUSY       0x80
Packit d36e9b
Packit d36e9b
/* Type classes for Plug-and-Play probe.  */
Packit d36e9b
typedef enum {
Packit d36e9b
	PARPORT_CLASS_LEGACY = 0,       /* Non-IEEE1284 device */
Packit d36e9b
	PARPORT_CLASS_PRINTER,
Packit d36e9b
	PARPORT_CLASS_MODEM,
Packit d36e9b
	PARPORT_CLASS_NET,
Packit d36e9b
	PARPORT_CLASS_HDC,              /* Hard disk controller */
Packit d36e9b
	PARPORT_CLASS_PCMCIA,
Packit d36e9b
	PARPORT_CLASS_MEDIA,            /* Multimedia device */
Packit d36e9b
	PARPORT_CLASS_FDC,              /* Floppy disk controller */
Packit d36e9b
	PARPORT_CLASS_PORTS,
Packit d36e9b
	PARPORT_CLASS_SCANNER,
Packit d36e9b
	PARPORT_CLASS_DIGCAM,
Packit d36e9b
	PARPORT_CLASS_OTHER,            /* Anything else */
Packit d36e9b
	PARPORT_CLASS_UNSPEC,           /* No CLS field in ID */
Packit d36e9b
	PARPORT_CLASS_SCSIADAPTER
Packit d36e9b
} parport_device_class;
Packit d36e9b
Packit d36e9b
/* The "modes" entry in parport is a bit field representing the
Packit d36e9b
   capabilities of the hardware. */
Packit d36e9b
#define PARPORT_MODE_PCSPP	(1<<0) /* IBM PC registers available. */
Packit d36e9b
#define PARPORT_MODE_TRISTATE	(1<<1) /* Can tristate. */
Packit d36e9b
#define PARPORT_MODE_EPP	(1<<2) /* Hardware EPP. */
Packit d36e9b
#define PARPORT_MODE_ECP	(1<<3) /* Hardware ECP. */
Packit d36e9b
#define PARPORT_MODE_COMPAT	(1<<4) /* Hardware 'printer protocol'. */
Packit d36e9b
#define PARPORT_MODE_DMA	(1<<5) /* Hardware can DMA. */
Packit d36e9b
#define PARPORT_MODE_SAFEININT	(1<<6) /* SPP registers accessible in IRQ. */
Packit d36e9b
Packit d36e9b
/* IEEE1284 modes: 
Packit d36e9b
   Nibble mode, byte mode, ECP, ECPRLE and EPP are their own
Packit d36e9b
   'extensibility request' values.  Others are special.
Packit d36e9b
   'Real' ECP modes must have the IEEE1284_MODE_ECP bit set.  */
Packit d36e9b
#define IEEE1284_MODE_NIBBLE             0
Packit d36e9b
#define IEEE1284_MODE_BYTE              (1<<0)
Packit d36e9b
#define IEEE1284_MODE_COMPAT            (1<<8)
Packit d36e9b
#define IEEE1284_MODE_BECP              (1<<9) /* Bounded ECP mode */
Packit d36e9b
#define IEEE1284_MODE_ECP               (1<<4)
Packit d36e9b
#define IEEE1284_MODE_ECPRLE            (IEEE1284_MODE_ECP | (1<<5))
Packit d36e9b
#define IEEE1284_MODE_ECPSWE            (1<<10) /* Software-emulated */
Packit d36e9b
#define IEEE1284_MODE_EPP               (1<<6)
Packit d36e9b
#define IEEE1284_MODE_EPPSL             (1<<11) /* EPP 1.7 */
Packit d36e9b
#define IEEE1284_MODE_EPPSWE            (1<<12) /* Software-emulated */
Packit d36e9b
#define IEEE1284_DEVICEID               (1<<2)  /* This is a flag */
Packit d36e9b
#define IEEE1284_EXT_LINK               (1<<14) /* This flag causes the
Packit d36e9b
						 * extensibility link to
Packit d36e9b
						 * be requested, using
Packit d36e9b
						 * bits 0-6. */
Packit d36e9b
Packit d36e9b
/* For the benefit of parport_read/write, you can use these with
Packit d36e9b
 * parport_negotiate to use address operations.  They have no effect
Packit d36e9b
 * other than to make parport_read/write use address transfers. */
Packit d36e9b
#define IEEE1284_ADDR			(1<<13)	/* This is a flag */
Packit d36e9b
#define IEEE1284_DATA			 0	/* So is this */
Packit d36e9b
Packit d36e9b
/* Flags for block transfer operations. */
Packit d36e9b
#define PARPORT_EPP_FAST		(1<<0) /* Unreliable counts. */
Packit d36e9b
#define PARPORT_W91284PIC		(1<<1) /* have a Warp9 w91284pic in the device */
Packit d36e9b
Packit d36e9b
/* The rest is for the kernel only */
Packit d36e9b
#ifdef __KERNEL__
Packit d36e9b
Packit d36e9b
#include <linux/wait.h>
Packit d36e9b
#include <linux/spinlock.h>
Packit d36e9b
#include <asm/system.h>
Packit d36e9b
#include <asm/ptrace.h>
Packit d36e9b
#include <asm/semaphore.h>
Packit d36e9b
#include <linux/proc_fs.h>
Packit d36e9b
#include <linux/config.h>
Packit d36e9b
Packit d36e9b
#define PARPORT_NEED_GENERIC_OPS
Packit d36e9b
Packit d36e9b
/* Define this later. */
Packit d36e9b
struct parport;
Packit d36e9b
struct pardevice;
Packit d36e9b
Packit d36e9b
struct pc_parport_state {
Packit d36e9b
	unsigned int ctr;
Packit d36e9b
	unsigned int ecr;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
struct ax_parport_state {
Packit d36e9b
	unsigned int ctr;
Packit d36e9b
	unsigned int ecr;
Packit d36e9b
	unsigned int dcsr;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/* used by both parport_amiga and parport_mfc3 */
Packit d36e9b
struct amiga_parport_state {
Packit d36e9b
       unsigned char data;     /* ciaa.prb */
Packit d36e9b
       unsigned char datadir;  /* ciaa.ddrb */
Packit d36e9b
       unsigned char status;   /* ciab.pra & 7 */
Packit d36e9b
       unsigned char statusdir;/* ciab.ddrb & 7 */
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
struct parport_state {
Packit d36e9b
	union {
Packit d36e9b
		struct pc_parport_state pc;
Packit d36e9b
		/* ARC has no state. */
Packit d36e9b
		struct ax_parport_state ax;
Packit d36e9b
		struct amiga_parport_state amiga;
Packit d36e9b
		/* Atari has not state. */
Packit d36e9b
		void *misc; 
Packit d36e9b
	} u;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
struct parport_operations {
Packit d36e9b
	/* IBM PC-style virtual registers. */
Packit d36e9b
	void (*write_data)(struct parport *, unsigned char);
Packit d36e9b
	unsigned char (*read_data)(struct parport *);
Packit d36e9b
Packit d36e9b
	void (*write_control)(struct parport *, unsigned char);
Packit d36e9b
	unsigned char (*read_control)(struct parport *);
Packit d36e9b
	unsigned char (*frob_control)(struct parport *, unsigned char mask,
Packit d36e9b
				      unsigned char val);
Packit d36e9b
Packit d36e9b
	unsigned char (*read_status)(struct parport *);
Packit d36e9b
Packit d36e9b
	/* IRQs. */
Packit d36e9b
	void (*enable_irq)(struct parport *);
Packit d36e9b
	void (*disable_irq)(struct parport *);
Packit d36e9b
Packit d36e9b
	/* Data direction. */
Packit d36e9b
	void (*data_forward) (struct parport *);
Packit d36e9b
	void (*data_reverse) (struct parport *);
Packit d36e9b
Packit d36e9b
	/* For core parport code. */
Packit d36e9b
	void (*init_state)(struct pardevice *, struct parport_state *);
Packit d36e9b
	void (*save_state)(struct parport *, struct parport_state *);
Packit d36e9b
	void (*restore_state)(struct parport *, struct parport_state *);
Packit d36e9b
Packit d36e9b
	void (*inc_use_count)(void);
Packit d36e9b
	void (*dec_use_count)(void);
Packit d36e9b
Packit d36e9b
	/* Block read/write */
Packit d36e9b
	size_t (*epp_write_data) (struct parport *port, const void *buf,
Packit d36e9b
				  size_t len, int flags);
Packit d36e9b
	size_t (*epp_read_data) (struct parport *port, void *buf, size_t len,
Packit d36e9b
				 int flags);
Packit d36e9b
	size_t (*epp_write_addr) (struct parport *port, const void *buf,
Packit d36e9b
				  size_t len, int flags);
Packit d36e9b
	size_t (*epp_read_addr) (struct parport *port, void *buf, size_t len,
Packit d36e9b
				 int flags);
Packit d36e9b
Packit d36e9b
	size_t (*ecp_write_data) (struct parport *port, const void *buf,
Packit d36e9b
				  size_t len, int flags);
Packit d36e9b
	size_t (*ecp_read_data) (struct parport *port, void *buf, size_t len,
Packit d36e9b
				 int flags);
Packit d36e9b
	size_t (*ecp_write_addr) (struct parport *port, const void *buf,
Packit d36e9b
				  size_t len, int flags);
Packit d36e9b
Packit d36e9b
	size_t (*compat_write_data) (struct parport *port, const void *buf,
Packit d36e9b
				     size_t len, int flags);
Packit d36e9b
	size_t (*nibble_read_data) (struct parport *port, void *buf,
Packit d36e9b
				    size_t len, int flags);
Packit d36e9b
	size_t (*byte_read_data) (struct parport *port, void *buf,
Packit d36e9b
				  size_t len, int flags);
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
struct parport_device_info {
Packit d36e9b
	parport_device_class class;
Packit d36e9b
	const char *class_name;
Packit d36e9b
	const char *mfr;
Packit d36e9b
	const char *model;
Packit d36e9b
	const char *cmdset;
Packit d36e9b
	const char *description;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/* Each device can have two callback functions:
Packit d36e9b
 *  1) a preemption function, called by the resource manager to request
Packit d36e9b
 *     that the driver relinquish control of the port.  The driver should
Packit d36e9b
 *     return zero if it agrees to release the port, and nonzero if it 
Packit d36e9b
 *     refuses.  Do not call parport_release() - the kernel will do this
Packit d36e9b
 *     implicitly.
Packit d36e9b
 *
Packit d36e9b
 *  2) a wake-up function, called by the resource manager to tell drivers
Packit d36e9b
 *     that the port is available to be claimed.  If a driver wants to use
Packit d36e9b
 *     the port, it should call parport_claim() here.
Packit d36e9b
 */
Packit d36e9b
Packit d36e9b
/* A parallel port device */
Packit d36e9b
struct pardevice {
Packit d36e9b
	const char *name;
Packit d36e9b
	struct parport *port;
Packit d36e9b
	int daisy;
Packit d36e9b
	int (*preempt)(void *);
Packit d36e9b
	void (*wakeup)(void *);
Packit d36e9b
	void *private;
Packit d36e9b
	void (*irq_func)(int, void *, struct pt_regs *);
Packit d36e9b
	unsigned int flags;
Packit d36e9b
	struct pardevice *next;
Packit d36e9b
	struct pardevice *prev;
Packit d36e9b
	struct parport_state *state;     /* saved status over preemption */
Packit d36e9b
	wait_queue_head_t wait_q;
Packit d36e9b
	unsigned long int time;
Packit d36e9b
	unsigned long int timeslice;
Packit d36e9b
	volatile long int timeout;
Packit d36e9b
	unsigned long waiting;		 /* long req'd for set_bit --RR */
Packit d36e9b
	struct pardevice *waitprev;
Packit d36e9b
	struct pardevice *waitnext;
Packit d36e9b
	void * sysctl_table;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/* IEEE1284 information */
Packit d36e9b
Packit d36e9b
/* IEEE1284 phases */
Packit d36e9b
enum ieee1284_phase {
Packit d36e9b
	IEEE1284_PH_FWD_DATA,
Packit d36e9b
	IEEE1284_PH_FWD_IDLE,
Packit d36e9b
	IEEE1284_PH_TERMINATE,
Packit d36e9b
	IEEE1284_PH_NEGOTIATION,
Packit d36e9b
	IEEE1284_PH_HBUSY_DNA,
Packit d36e9b
	IEEE1284_PH_REV_IDLE,
Packit d36e9b
	IEEE1284_PH_HBUSY_DAVAIL,
Packit d36e9b
	IEEE1284_PH_REV_DATA,
Packit d36e9b
	IEEE1284_PH_ECP_SETUP,
Packit d36e9b
	IEEE1284_PH_ECP_FWD_TO_REV,
Packit d36e9b
	IEEE1284_PH_ECP_REV_TO_FWD
Packit d36e9b
};
Packit d36e9b
struct ieee1284_info {
Packit d36e9b
	int mode;
Packit d36e9b
	volatile enum ieee1284_phase phase;
Packit d36e9b
	struct semaphore irq;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/* A parallel port */
Packit d36e9b
struct parport {
Packit d36e9b
	unsigned long base;	/* base address */
Packit d36e9b
	unsigned long base_hi;  /* base address (hi - ECR) */
Packit d36e9b
	unsigned int size;	/* IO extent */
Packit d36e9b
	const char *name;
Packit d36e9b
	unsigned int modes;
Packit d36e9b
	int irq;		/* interrupt (or -1 for none) */
Packit d36e9b
	int dma;
Packit d36e9b
	int muxport;		/* which muxport (if any) this is */
Packit d36e9b
	int portnum;		/* which physical parallel port (not mux) */
Packit d36e9b
Packit d36e9b
	struct parport *physport;
Packit d36e9b
				/* If this is a non-default mux
Packit d36e9b
				   parport, i.e. we're a clone of a real
Packit d36e9b
				   physical port, this is a pointer to that
Packit d36e9b
				   port. The locking is only done in the
Packit d36e9b
				   real port.  For a clone port, the
Packit d36e9b
				   following structure members are
Packit d36e9b
				   meaningless: devices, cad, muxsel,
Packit d36e9b
				   waithead, waittail, flags, pdir,
Packit d36e9b
				   ieee1284, *_lock.
Packit d36e9b
Packit d36e9b
				   It this is a default mux parport, or
Packit d36e9b
				   there is no mux involved, this points to
Packit d36e9b
				   ourself. */
Packit d36e9b
Packit d36e9b
	struct pardevice *devices;
Packit d36e9b
	struct pardevice *cad;	/* port owner */
Packit d36e9b
	int daisy;		/* currently selected daisy addr */
Packit d36e9b
	int muxsel;		/* currently selected mux port */
Packit d36e9b
Packit d36e9b
	struct pardevice *waithead;
Packit d36e9b
	struct pardevice *waittail;
Packit d36e9b
	
Packit d36e9b
	struct parport *next;
Packit d36e9b
	unsigned int flags;
Packit d36e9b
Packit d36e9b
	void *sysctl_table;
Packit d36e9b
	struct parport_device_info probe_info[5]; /* 0-3 + non-IEEE1284.3 */
Packit d36e9b
	struct ieee1284_info ieee1284;
Packit d36e9b
Packit d36e9b
	struct parport_operations *ops;
Packit d36e9b
	void *private_data;     /* for lowlevel driver */
Packit d36e9b
Packit d36e9b
	int number;		/* port index - the `n' in `parportn' */
Packit d36e9b
	spinlock_t pardevice_lock;
Packit d36e9b
	spinlock_t waitlist_lock;
Packit d36e9b
	rwlock_t cad_lock;
Packit d36e9b
Packit d36e9b
	int spintime;
Packit d36e9b
	atomic_t ref_count;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
#define DEFAULT_SPIN_TIME 500 /* us */
Packit d36e9b
Packit d36e9b
struct parport_driver {
Packit d36e9b
	const char *name;
Packit d36e9b
	void (*attach) (struct parport *);
Packit d36e9b
	void (*detach) (struct parport *);
Packit d36e9b
	struct parport_driver *next;
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/* parport_register_port registers a new parallel port at the given
Packit d36e9b
   address (if one does not already exist) and returns a pointer to it.
Packit d36e9b
   This entails claiming the I/O region, IRQ and DMA.  NULL is returned
Packit d36e9b
   if initialisation fails. */
Packit d36e9b
struct parport *parport_register_port(unsigned long base, int irq, int dma,
Packit d36e9b
				      struct parport_operations *ops);
Packit d36e9b
Packit d36e9b
/* Once a registered port is ready for high-level drivers to use, the
Packit d36e9b
   low-level driver that registered it should announce it.  This will
Packit d36e9b
   call the high-level drivers' attach() functions (after things like
Packit d36e9b
   determining the IEEE 1284.3 topology of the port and collecting
Packit d36e9b
   DeviceIDs). */
Packit d36e9b
void parport_announce_port (struct parport *port);
Packit d36e9b
Packit d36e9b
/* Unregister a port. */
Packit d36e9b
extern void parport_unregister_port(struct parport *port);
Packit d36e9b
Packit d36e9b
/* parport_enumerate returns a pointer to the linked list of all the
Packit d36e9b
   ports in this machine.  DON'T USE THIS.  Use
Packit d36e9b
   parport_register_driver instead. */
Packit d36e9b
struct parport *parport_enumerate(void);
Packit d36e9b
Packit d36e9b
/* Register a new high-level driver. */
Packit d36e9b
extern int parport_register_driver (struct parport_driver *);
Packit d36e9b
Packit d36e9b
/* Unregister a high-level driver. */
Packit d36e9b
extern void parport_unregister_driver (struct parport_driver *);
Packit d36e9b
Packit d36e9b
/* If parport_register_driver doesn't fit your needs, perhaps
Packit d36e9b
 * parport_find_xxx does. */
Packit d36e9b
extern struct parport *parport_find_number (int);
Packit d36e9b
extern struct parport *parport_find_base (unsigned long);
Packit d36e9b
Packit d36e9b
/* Reference counting for ports. */
Packit d36e9b
extern struct parport *parport_get_port (struct parport *);
Packit d36e9b
extern void parport_put_port (struct parport *);
Packit d36e9b
Packit d36e9b
/* parport_register_device declares that a device is connected to a
Packit d36e9b
   port, and tells the kernel all it needs to know.
Packit d36e9b
   - pf is the preemption function (may be NULL for no callback)
Packit d36e9b
   - kf is the wake-up function (may be NULL for no callback)
Packit d36e9b
   - irq_func is the interrupt handler (may be NULL for no interrupts)
Packit d36e9b
   - handle is a user pointer that gets handed to callback functions.  */
Packit d36e9b
struct pardevice *parport_register_device(struct parport *port, 
Packit d36e9b
			  const char *name,
Packit d36e9b
			  int (*pf)(void *), void (*kf)(void *),
Packit d36e9b
			  void (*irq_func)(int, void *, struct pt_regs *), 
Packit d36e9b
			  int flags, void *handle);
Packit d36e9b
Packit d36e9b
/* parport_unregister unlinks a device from the chain. */
Packit d36e9b
extern void parport_unregister_device(struct pardevice *dev);
Packit d36e9b
Packit d36e9b
/* parport_claim tries to gain ownership of the port for a particular
Packit d36e9b
   driver.  This may fail (return non-zero) if another driver is busy.
Packit d36e9b
   If this driver has registered an interrupt handler, it will be
Packit d36e9b
   enabled.  */
Packit d36e9b
extern int parport_claim(struct pardevice *dev);
Packit d36e9b
Packit d36e9b
/* parport_claim_or_block is the same, but sleeps if the port cannot
Packit d36e9b
   be claimed.  Return value is 1 if it slept, 0 normally and -errno
Packit d36e9b
   on error.  */
Packit d36e9b
extern int parport_claim_or_block(struct pardevice *dev);
Packit d36e9b
Packit d36e9b
/* parport_release reverses a previous parport_claim.  This can never
Packit d36e9b
   fail, though the effects are undefined (except that they are bad)
Packit d36e9b
   if you didn't previously own the port.  Once you have released the
Packit d36e9b
   port you should make sure that neither your code nor the hardware
Packit d36e9b
   on the port tries to initiate any communication without first
Packit d36e9b
   re-claiming the port.  If you mess with the port state (enabling
Packit d36e9b
   ECP for example) you should clean up before releasing the port. */
Packit d36e9b
Packit d36e9b
extern void parport_release(struct pardevice *dev);
Packit d36e9b
Packit d36e9b
/**
Packit d36e9b
 * parport_yield - relinquish a parallel port temporarily
Packit d36e9b
 * @dev: a device on the parallel port
Packit d36e9b
 *
Packit d36e9b
 * This function relinquishes the port if it would be helpful to other
Packit d36e9b
 * drivers to do so.  Afterwards it tries to reclaim the port using
Packit d36e9b
 * parport_claim(), and the return value is the same as for
Packit d36e9b
 * parport_claim().  If it fails, the port is left unclaimed and it is
Packit d36e9b
 * the driver's responsibility to reclaim the port.
Packit d36e9b
 *
Packit d36e9b
 * The parport_yield() and parport_yield_blocking() functions are for
Packit d36e9b
 * marking points in the driver at which other drivers may claim the
Packit d36e9b
 * port and use their devices.  Yielding the port is similar to
Packit d36e9b
 * releasing it and reclaiming it, but is more efficient because no
Packit d36e9b
 * action is taken if there are no other devices needing the port.  In
Packit d36e9b
 * fact, nothing is done even if there are other devices waiting but
Packit d36e9b
 * the current device is still within its "timeslice".  The default
Packit d36e9b
 * timeslice is half a second, but it can be adjusted via the /proc
Packit d36e9b
 * interface.
Packit d36e9b
 **/
Packit d36e9b
extern __inline__ int parport_yield(struct pardevice *dev)
Packit d36e9b
{
Packit d36e9b
	unsigned long int timeslip = (jiffies - dev->time);
Packit d36e9b
	if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
Packit d36e9b
		return 0;
Packit d36e9b
	parport_release(dev);
Packit d36e9b
	return parport_claim(dev);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
/**
Packit d36e9b
 * parport_yield_blocking - relinquish a parallel port temporarily
Packit d36e9b
 * @dev: a device on the parallel port
Packit d36e9b
 *
Packit d36e9b
 * This function relinquishes the port if it would be helpful to other
Packit d36e9b
 * drivers to do so.  Afterwards it tries to reclaim the port using
Packit d36e9b
 * parport_claim_or_block(), and the return value is the same as for
Packit d36e9b
 * parport_claim_or_block().
Packit d36e9b
 **/
Packit d36e9b
extern __inline__ int parport_yield_blocking(struct pardevice *dev)
Packit d36e9b
{
Packit d36e9b
	unsigned long int timeslip = (jiffies - dev->time);
Packit d36e9b
	if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
Packit d36e9b
		return 0;
Packit d36e9b
	parport_release(dev);
Packit d36e9b
	return parport_claim_or_block(dev);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
/* Flags used to identify what a device does. */
Packit d36e9b
#define PARPORT_DEV_TRAN		0	/* WARNING !! DEPRECATED !! */
Packit d36e9b
#define PARPORT_DEV_LURK		(1<<0)	/* WARNING !! DEPRECATED !! */
Packit d36e9b
#define PARPORT_DEV_EXCL		(1<<1)	/* Need exclusive access. */
Packit d36e9b
Packit d36e9b
#define PARPORT_FLAG_EXCL		(1<<1)	/* EXCL driver registered. */
Packit d36e9b
Packit d36e9b
extern int parport_parse_irqs(int, const char *[], int irqval[]);
Packit d36e9b
extern int parport_parse_dmas(int, const char *[], int dmaval[]);
Packit d36e9b
Packit d36e9b
/* IEEE1284 functions */
Packit d36e9b
extern void parport_ieee1284_interrupt (int, void *, struct pt_regs *);
Packit d36e9b
extern int parport_negotiate (struct parport *, int mode);
Packit d36e9b
extern ssize_t parport_write (struct parport *, const void *buf, size_t len);
Packit d36e9b
extern ssize_t parport_read (struct parport *, void *buf, size_t len);
Packit d36e9b
extern long parport_set_timeout (struct pardevice *, long inactivity);
Packit d36e9b
extern int parport_wait_event (struct parport *, long timeout);
Packit d36e9b
extern int parport_wait_peripheral (struct parport *port,
Packit d36e9b
				    unsigned char mask,
Packit d36e9b
				    unsigned char val);
Packit d36e9b
extern int parport_poll_peripheral (struct parport *port,
Packit d36e9b
				    unsigned char mask,
Packit d36e9b
				    unsigned char val,
Packit d36e9b
				    int usec);
Packit d36e9b
Packit d36e9b
/* For architectural drivers */
Packit d36e9b
extern void parport_ieee1284_wakeup (struct parport *port);
Packit d36e9b
extern size_t parport_ieee1284_write_compat (struct parport *,
Packit d36e9b
					     const void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_read_nibble (struct parport *,
Packit d36e9b
					    void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_read_byte (struct parport *,
Packit d36e9b
					  void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_ecp_read_data (struct parport *,
Packit d36e9b
					      void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_ecp_write_data (struct parport *,
Packit d36e9b
					       const void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_ecp_write_addr (struct parport *,
Packit d36e9b
					       const void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_epp_write_data (struct parport *,
Packit d36e9b
					       const void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_epp_read_data (struct parport *,
Packit d36e9b
					      void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_epp_write_addr (struct parport *,
Packit d36e9b
					       const void *, size_t, int);
Packit d36e9b
extern size_t parport_ieee1284_epp_read_addr (struct parport *,
Packit d36e9b
					      void *, size_t, int);
Packit d36e9b
Packit d36e9b
/* IEEE1284.3 functions */
Packit d36e9b
extern int parport_daisy_init (struct parport *port);
Packit d36e9b
extern void parport_daisy_fini (struct parport *port);
Packit d36e9b
extern struct pardevice *parport_open (int devnum, const char *name,
Packit d36e9b
				       int (*pf) (void *),
Packit d36e9b
				       void (*kf) (void *),
Packit d36e9b
				       void (*irqf) (int, void *,
Packit d36e9b
						     struct pt_regs *),
Packit d36e9b
				       int flags, void *handle);
Packit d36e9b
extern void parport_close (struct pardevice *dev);
Packit d36e9b
extern ssize_t parport_device_id (int devnum, char *buffer, size_t len);
Packit d36e9b
extern int parport_device_num (int parport, int mux, int daisy);
Packit d36e9b
extern int parport_device_coords (int devnum, int *parport, int *mux,
Packit d36e9b
				  int *daisy);
Packit d36e9b
extern void parport_daisy_deselect_all (struct parport *port);
Packit d36e9b
extern int parport_daisy_select (struct parport *port, int daisy, int mode);
Packit d36e9b
Packit d36e9b
/* For finding devices based on their device ID.  Example usage:
Packit d36e9b
   int devnum = -1;
Packit d36e9b
   while ((devnum = parport_find_class (PARPORT_CLASS_DIGCAM, devnum)) != -1) {
Packit d36e9b
       struct pardevice *dev = parport_open (devnum, ...);
Packit d36e9b
       ...
Packit d36e9b
   }
Packit d36e9b
*/
Packit d36e9b
extern int parport_find_device (const char *mfg, const char *mdl, int from);
Packit d36e9b
extern int parport_find_class (parport_device_class cls, int from);
Packit d36e9b
Packit d36e9b
/* Lowlevel drivers _can_ call this support function to handle irqs.  */
Packit d36e9b
extern __inline__ void parport_generic_irq(int irq, struct parport *port,
Packit d36e9b
					   struct pt_regs *regs)
Packit d36e9b
{
Packit d36e9b
	parport_ieee1284_interrupt (irq, port, regs);
Packit d36e9b
	read_lock(&port->cad_lock);
Packit d36e9b
	if (port->cad && port->cad->irq_func)
Packit d36e9b
		port->cad->irq_func(irq, port->cad->private, regs);
Packit d36e9b
	read_unlock(&port->cad_lock);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
/* Prototypes from parport_procfs */
Packit d36e9b
extern int parport_proc_register(struct parport *pp);
Packit d36e9b
extern int parport_proc_unregister(struct parport *pp);
Packit d36e9b
extern int parport_device_proc_register(struct pardevice *device);
Packit d36e9b
extern int parport_device_proc_unregister(struct pardevice *device);
Packit d36e9b
extern int parport_default_proc_register(void);
Packit d36e9b
extern int parport_default_proc_unregister(void);
Packit d36e9b
Packit d36e9b
extern void dec_parport_count(void);
Packit d36e9b
extern void inc_parport_count(void);
Packit d36e9b
Packit d36e9b
/* If PC hardware is the only type supported, we can optimise a bit.  */
Packit d36e9b
#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_OTHER)
Packit d36e9b
Packit d36e9b
#undef PARPORT_NEED_GENERIC_OPS
Packit d36e9b
#include <linux/parport_pc.h>
Packit d36e9b
#define parport_write_data(p,x)            parport_pc_write_data(p,x)
Packit d36e9b
#define parport_read_data(p)               parport_pc_read_data(p)
Packit d36e9b
#define parport_write_control(p,x)         parport_pc_write_control(p,x)
Packit d36e9b
#define parport_read_control(p)            parport_pc_read_control(p)
Packit d36e9b
#define parport_frob_control(p,m,v)        parport_pc_frob_control(p,m,v)
Packit d36e9b
#define parport_read_status(p)             parport_pc_read_status(p)
Packit d36e9b
#define parport_enable_irq(p)              parport_pc_enable_irq(p)
Packit d36e9b
#define parport_disable_irq(p)             parport_pc_disable_irq(p)
Packit d36e9b
#define parport_data_forward(p)            parport_pc_data_forward(p)
Packit d36e9b
#define parport_data_reverse(p)            parport_pc_data_reverse(p)
Packit d36e9b
#endif
Packit d36e9b
Packit d36e9b
#ifdef PARPORT_NEED_GENERIC_OPS
Packit d36e9b
/* Generic operations vector through the dispatch table. */
Packit d36e9b
#define parport_write_data(p,x)            (p)->ops->write_data(p,x)
Packit d36e9b
#define parport_read_data(p)               (p)->ops->read_data(p)
Packit d36e9b
#define parport_write_control(p,x)         (p)->ops->write_control(p,x)
Packit d36e9b
#define parport_read_control(p)            (p)->ops->read_control(p)
Packit d36e9b
#define parport_frob_control(p,m,v)        (p)->ops->frob_control(p,m,v)
Packit d36e9b
#define parport_read_status(p)             (p)->ops->read_status(p)
Packit d36e9b
#define parport_enable_irq(p)              (p)->ops->enable_irq(p)
Packit d36e9b
#define parport_disable_irq(p)             (p)->ops->disable_irq(p)
Packit d36e9b
#define parport_data_forward(p)            (p)->ops->data_forward(p)
Packit d36e9b
#define parport_data_reverse(p)            (p)->ops->data_reverse(p)
Packit d36e9b
#endif
Packit d36e9b
Packit d36e9b
#endif /* __KERNEL__ */
Packit d36e9b
#endif /* _PARPORT_H_ */