PARPORT interface documentation
-------------------------------

Time-stamp: <2000-02-24 13:30:20 twaugh>

Described here are the following functions:

Global functions:
  parport_register_driver
  parport_unregister_driver
  parport_enumerate
  parport_register_device
  parport_unregister_device
  parport_claim
  parport_claim_or_block
  parport_release
  parport_yield
  parport_yield_blocking
  parport_wait_peripheral
  parport_poll_peripheral
  parport_wait_event
  parport_negotiate
  parport_read
  parport_write
  parport_open
  parport_close
  parport_device_id
  parport_device_num
  parport_device_coords
  parport_find_class
  parport_find_device
  parport_set_timeout

Port functions (can be overridden by low-level drivers):
  SPP:
    port->ops->read_data
    port->ops->write_data
    port->ops->read_status
    port->ops->read_control
    port->ops->write_control
    port->ops->frob_control
    port->ops->enable_irq
    port->ops->disable_irq
    port->ops->data_forward
    port->ops->data_reverse

  EPP:
    port->ops->epp_write_data
    port->ops->epp_read_data
    port->ops->epp_write_addr
    port->ops->epp_read_addr

  ECP:
    port->ops->ecp_write_data
    port->ops->ecp_read_data
    port->ops->ecp_write_addr

  Other:
    port->ops->nibble_read_data
    port->ops->byte_read_data
    port->ops->compat_write_data

The parport subsystem comprises 'parport' (the core port-sharing
code), and a variety of low-level drivers that actually do the port
accesses.  Each low-level driver handles a particular style of port
(PC, Amiga, and so on).

The parport interface to the device driver author can be broken down
into global functions and port functions.

The global functions are mostly for communicating between the device
driver and the parport subsystem: acquiring a list of available ports,
claiming a port for exclusive use, and so on.  They also include
'generic' functions for doing standard things that will work on any
IEEE 1284-capable architecture.

The port functions are provided by the low-level drivers, although the
core parport module provides generic 'defaults' for some routines.
The port functions can be split into three groups: SPP, EPP, and ECP.

SPP (Standard Parallel Port) functions modify so-called 'SPP'
registers: data, status, and control.  The hardware may not actually
have registers exactly like that, but the PC does and this interface is
modelled after common PC implementations.  Other low-level drivers may
be able to emulate most of the functionality.

EPP (Enhanced Parallel Port) functions are provided for reading and
writing in IEEE 1284 EPP mode, and ECP (Extended Capabilities Port)
functions are used for IEEE 1284 ECP mode. (What about BECP? Does
anyone care?)

Hardware assistance for EPP and/or ECP transfers may or may not be
available, and if it is available it may or may not be used.  If
hardware is not used, the transfer will be software-driven.  In order
to cope with peripherals that only tenuously support IEEE 1284, a
low-level driver specific function is provided, for altering 'fudge
factors'.

GLOBAL FUNCTIONS
----------------

parport_register_driver - register a device driver with parport
-----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_driver {
	const char *name;
	void (*attach) (struct parport *);
	void (*detach) (struct parport *);
	struct parport_driver *next;
};
int parport_register_driver (struct parport_driver *driver);

DESCRIPTION

In order to be notified about parallel ports when they are detected,
parport_register_driver should be called.  Your driver will
immediately be notified of all ports that have already been detected,
and of each new port as low-level drivers are loaded.

A 'struct parport_driver' contains the textual name of your driver,
a pointer to a function to handle new ports, and a pointer to a
function to handle ports going away due to a low-level driver
unloading.  Ports will only be detached if they are not being used
(i.e. there are no devices registered on them).

The visible parts of the 'struct parport *' argument given to
attach/detach are:

struct parport
{
	struct parport *next; /* next parport in list */
	const char *name;     /* port's name */
	unsigned int modes;   /* bitfield of hardware modes */
	struct parport_device_info probe_info;
			      /* IEEE1284 info */
	int number;           /* parport index */
	struct parport_operations *ops;
	...
};

There are other members of the structure, but they should not be
touched.

The 'modes' member summarises the capabilities of the underlying
hardware.  It consists of flags which may be bitwise-ored together:

  PARPORT_MODE_PCSPP		IBM PC registers are available,
				i.e. functions that act on data,
				control and status registers are
				probably writing directly to the
				hardware.
  PARPORT_MODE_TRISTATE		The data drivers may be turned off.
				This allows the data lines to be used
				for reverse (peripheral to host)
				transfers.
  PARPORT_MODE_COMPAT		The hardware can assist with
				compatibility-mode (printer)
				transfers, i.e. compat_write_block.
  PARPORT_MODE_EPP		The hardware can assist with EPP
				transfers.
  PARPORT_MODE_ECP		The hardware can assist with ECP
				transfers.
  PARPORT_MODE_DMA		The hardware can use DMA, so you might
				want to pass ISA DMA-able memory
				(i.e. memory allocated using the
				GFP_DMA flag with kmalloc) to the
				low-level driver in order to take
				advantage of it.

There may be other flags in 'modes' as well.

The contents of 'modes' is advisory only.  For example, if the
hardware is capable of DMA, and PARPORT_MODE_DMA is in 'modes', it
doesn't necessarily mean that DMA will always be used when possible.
Similarly, hardware that is capable of assisting ECP transfers won't
necessarily be used.

RETURN VALUE

Zero on success, otherwise an error code.

ERRORS

None. (Can it fail? Why return int?)

EXAMPLE

static void lp_attach (struct parport *port)
{
	...
	private = kmalloc (...);
	dev[count++] = parport_register_device (...);
	...
}

static void lp_detach (struct parport *port)
{
	...
}

static struct parport_driver lp_driver = {
	"lp",
	lp_attach,
	lp_detach,
	NULL /* always put NULL here */
};

int lp_init (void)
{
	...
	if (parport_register_driver (&lp_driver)) {
		/* Failed; nothing we can do. */
		return -EIO;
	}
	...
}

SEE ALSO

parport_unregister_driver, parport_register_device, parport_enumerate

parport_unregister_driver - tell parport to forget about this driver
-------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_driver {
	const char *name;
	void (*attach) (struct parport *);
	void (*detach) (struct parport *);
	struct parport_driver *next;
};
void parport_unregister_driver (struct parport_driver *driver);

DESCRIPTION

This tells parport not to notify the device driver of new ports or of
ports going away.  Registered devices belonging to that driver are NOT
unregistered: parport_unregister_device must be used for each one.

EXAMPLE

void cleanup_module (void)
{
	...
	/* Stop notifications. */
	parport_unregister_driver (&lp_driver);

	/* Unregister devices. */
	for (i = 0; i < NUM_DEVS; i++)
		parport_unregister_device (dev[i]);
	...
}

SEE ALSO

parport_register_driver, parport_enumerate

parport_enumerate - retrieve a list of parallel ports (DEPRECATED)
-----------------

SYNOPSIS

#include <linux/parport.h>

struct parport *parport_enumerate (void);

DESCRIPTION

Retrieve the first of a list of valid parallel ports for this machine.
Successive parallel ports can be found using the 'struct parport
*next' element of the 'struct parport *' that is returned.  If 'next'
is NULL, there are no more parallel ports in the list.  The number of
ports in the list will not exceed PARPORT_MAX.

RETURN VALUE

A 'struct parport *' describing a valid parallel port for the machine,
or NULL if there are none.

ERRORS

This function can return NULL to indicate that there are no parallel
ports to use.

EXAMPLE

int detect_device (void)
{
	struct parport *port;

	for (port = parport_enumerate ();
	     port != NULL;
	     port = port->next) {
		/* Try to detect a device on the port... */
		...
             }
	}

	...
}

NOTES

parport_enumerate is deprecated; parport_register_driver should be
used instead.

SEE ALSO

parport_register_driver, parport_unregister_driver

parport_register_device - register to use a port
-----------------------

SYNOPSIS

#include <linux/parport.h>

typedef int (*preempt_func) (void *handle);
typedef void (*wakeup_func) (void *handle);
typedef int (*irq_func) (int irq, void *handle, struct pt_regs *);

struct pardevice *parport_register_device(struct parport *port,
                                          const char *name,
                                          preempt_func preempt,
                                          wakeup_func wakeup,
                                          irq_func irq,
                                          int flags,
                                          void *handle);

DESCRIPTION

Use this function to register your device driver on a parallel port
('port').  Once you have done that, you will be able to use
parport_claim and parport_release in order to use the port.

This function will register three callbacks into your driver:
'preempt', 'wakeup' and 'irq'.  Each of these may be NULL in order to
indicate that you do not want a callback.

When the 'preempt' function is called, it is because another driver
wishes to use the parallel port.  The 'preempt' function should return
non-zero if the parallel port cannot be released yet -- if zero is
returned, the port is lost to another driver and the port must be
re-claimed before use.

The 'wakeup' function is called once another driver has released the
port and no other driver has yet claimed it.  You can claim the
parallel port from within the 'wakeup' function (in which case the
claim is guaranteed to succeed), or choose not to if you don't need it
now.

If an interrupt occurs on the parallel port your driver has claimed,
the 'irq' function will be called. (Write something about shared
interrupts here.)

The 'handle' is a pointer to driver-specific data, and is passed to
the callback functions.

'flags' may be a bitwise combination of the following flags:

        Flag            Meaning
  PARPORT_DEV_EXCL	The device cannot share the parallel port at all.
			Use this only when absolutely necessary.

The typedefs are not actually defined -- they are only shown in order
to make the function prototype more readable.

The visible parts of the returned 'struct pardevice' are:

struct pardevice {
	struct parport *port;	/* Associated port */
	void *private;		/* Device driver's 'handle' */
	...
};

RETURN VALUE

A 'struct pardevice *': a handle to the registered parallel port
device that can be used for parport_claim, parport_release, etc.

ERRORS

A return value of NULL indicates that there was a problem registering
a device on that port.

EXAMPLE

static int preempt (void *handle)
{
	if (busy_right_now)
		return 1;

	must_reclaim_port = 1;
	return 0;
}

static void wakeup (void *handle)
{
	struct toaster *private = handle;
	struct pardevice *dev = private->dev;
	if (!dev) return; /* avoid races */

	if (want_port)
		parport_claim (dev);
}

static int toaster_detect (struct toaster *private, struct parport *port)
{
	private->dev = parport_register_device (port, "toaster", preempt,
					        wakeup, NULL, 0,
						private);
	if (!private->dev)
		/* Couldn't register with parport. */
		return -EIO;

	must_reclaim_port = 0;
	busy_right_now = 1;
	parport_claim_or_block (private->dev);
	...
	/* Don't need the port while the toaster warms up. */
	busy_right_now = 0;
	...
	busy_right_now = 1;
	if (must_reclaim_port) {
		parport_claim_or_block (private->dev);
		must_reclaim_port = 0;
	}
	...
}

SEE ALSO

parport_unregister_device, parport_claim

parport_unregister_device - finish using a port
-------------------------

SYNPOPSIS

#include <linux/parport.h>

void parport_unregister_device (struct pardevice *dev);

DESCRIPTION

This function is the opposite of parport_register_device.  After using
parport_unregister_device, 'dev' is no longer a valid device handle.

You should not unregister a device that is currently claimed, although
if you do it will be released automatically.

EXAMPLE

	...
	kfree (dev->private); /* before we lose the pointer */
	parport_unregister_device (dev);
	...

SEE ALSO

parport_unregister_driver

parport_claim, parport_claim_or_block - claim the parallel port for a device
-------------------------------------

SYNOPSIS

#include <linux/parport.h>

int parport_claim (struct pardevice *dev);
int parport_claim_or_block (struct pardevice *dev);

DESCRIPTION

These functions attempt to gain control of the parallel port on which
'dev' is registered.  'parport_claim' does not block, but
'parport_claim_or_block' may do. (Put something here about blocking
interruptibly or non-interruptibly.)

You should not try to claim a port that you have already claimed.

RETURN VALUE

A return value of zero indicates that the port was successfully
claimed, and the caller now has possession of the parallel port.

If 'parport_claim_or_block' blocks before returning successfully, the
return value is positive.

ERRORS

  -EAGAIN  The port is unavailable at the moment, but another attempt
           to claim it may succeed.

SEE ALSO

parport_release

parport_release - release the parallel port
---------------

SYNOPSIS

#include <linux/parport.h>

void parport_release (struct pardevice *dev);

DESCRIPTION

Once a parallel port device has been claimed, it can be released using
'parport_release'.  It cannot fail, but you should not release a
device that you do not have possession of.

EXAMPLE

static size_t write (struct pardevice *dev, const void *buf,
		     size_t len)
{
	...
	written = dev->port->ops->write_ecp_data (dev->port, buf,
						  len);
	parport_release (dev);
	...
}


SEE ALSO

change_mode, parport_claim, parport_claim_or_block, parport_yield

parport_yield, parport_yield_blocking - temporarily release a parallel port
-------------------------------------

SYNOPSIS

#include <linux/parport.h>

int parport_yield (struct pardevice *dev)
int parport_yield_blocking (struct pardevice *dev);

DESCRIPTION

When a driver has control of a parallel port, it may allow another
driver to temporarily 'borrow' it.  'parport_yield' does not block;
'parport_yield_blocking' may do.

RETURN VALUE

A return value of zero indicates that the caller still owns the port
and the call did not block.

A positive return value from 'parport_yield_blocking' indicates that
the caller still owns the port and the call blocked.

A return value of -EAGAIN indicates that the caller no longer owns the
port, and it must be re-claimed before use.

ERRORS

  -EAGAIN  Ownership of the parallel port was given away.

SEE ALSO

parport_release

parport_wait_peripheral - wait for status lines, up to 35ms
-----------------------

SYNOPSIS

#include <linux/parport.h>

int parport_wait_peripheral (struct parport *port,
			     unsigned char mask,
			     unsigned char val);

DESCRIPTION

Wait for the status lines in mask to match the values in val.

RETURN VALUE

 -EINTR  a signal is pending
      0  the status lines in mask have values in val
      1  timed out while waiting (35ms elapsed)

SEE ALSO

parport_poll_peripheral

parport_poll_peripheral - wait for status lines, in usec
-----------------------

SYNOPSIS

#include <linux/parport.h>

int parport_poll_peripheral (struct parport *port,
			     unsigned char mask,
			     unsigned char val,
			     int usec);

DESCRIPTION

Wait for the status lines in mask to match the values in val.

RETURN VALUE

 -EINTR  a signal is pending
      0  the status lines in mask have values in val
      1  timed out while waiting (usec microseconds have elapsed)

SEE ALSO

parport_wait_peripheral

parport_wait_event - wait for an event on a port
------------------

SYNOPSIS

#include <linux/parport.h>

int parport_wait_event (struct parport *port, signed long timeout)

DESCRIPTION

Wait for an event (e.g. interrupt) on a port.  The timeout is in
jiffies.

RETURN VALUE

      0  success
     <0  error (exit as soon as possible)
     >0  timed out

parport_negotiate - perform IEEE 1284 negotiation
-----------------

SYNOPSIS

#include <linux/parport.h>

int parport_negotiate (struct parport *, int mode);

DESCRIPTION

Perform IEEE 1284 negotiation.

RETURN VALUE

     0  handshake OK; IEEE 1284 peripheral and mode available
    -1  handshake failed; peripheral not compliant (or none present)
     1  handshake OK; IEEE 1284 peripheral present but mode not
        available

SEE ALSO

parport_read, parport_write

parport_read - read data from device
------------

SYNOPSIS

#include <linux/parport.h>

ssize_t parport_read (struct parport *, void *buf, size_t len);

DESCRIPTION

Read data from device in current IEEE 1284 transfer mode.  This only
works for modes that support reverse data transfer.

RETURN VALUE

If negative, an error code; otherwise the number of bytes transferred.

SEE ALSO

parport_write, parport_negotiate

parport_write - write data to device
-------------

SYNOPSIS

#include <linux/parport.h>

ssize_t parport_write (struct parport *, const void *buf, size_t len);

DESCRIPTION

Write data to device in current IEEE 1284 transfer mode.  This only
works for modes that support forward data transfer.

RETURN VALUE

If negative, an error code; otherwise the number of bytes transferred.

SEE ALSO

parport_read, parport_negotiate

parport_open - register device for particular device number
------------

SYNOPSIS

#include <linux/parport.h>

struct pardevice *parport_open (int devnum, const char *name,
			        int (*pf) (void *),
				void (*kf) (void *),
				void (*irqf) (int, void *,
					      struct pt_regs *),
				int flags, void *handle);

DESCRIPTION

This is like parport_register_device but takes a device number instead
of a pointer to a struct parport.

RETURN VALUE

See parport_register_device.  If no device is associated with devnum,
NULL is returned.

SEE ALSO

parport_register_device, parport_device_num

parport_close - unregister device for particular device number
-------------

SYNOPSIS

#include <linux/parport.h>

void parport_close (struct pardevice *dev);

DESCRIPTION

This is the equivalent of parport_unregister_device for parport_open.

SEE ALSO

parport_unregister_device, parport_open

parport_device_id - obtain IEEE 1284 Device ID
-----------------

SYNOPSIS

#include <linux/parport.h>

ssize_t parport_device_id (int devnum, char *buffer, size_t len);

DESCRIPTION

Obtains the IEEE 1284 Device ID associated with a given device.

RETURN VALUE

If negative, an error code; otherwise, the number of bytes of buffer
that contain the device ID.  The format of the device ID is as
follows:

[length][ID]

The first two bytes indicate the inclusive length of the entire Device
ID, and are in big-endian order.  The ID is a sequence of pairs of the
form:

key:value;

NOTES

Many devices have ill-formed IEEE 1284 Device IDs.

SEE ALSO

parport_find_class, parport_find_device, parport_device_num

parport_device_num - convert device coordinates to device number
------------------

SYNOPSIS

#include <linux/parport.h>

int parport_device_num (int parport, int mux, int daisy);

DESCRIPTION

Convert between device coordinates (port, multiplexor, daisy chain
address) and device number (zero-based).

RETURN VALUE

Device number, or -1 if no device at given coordinates.

SEE ALSO

parport_device_coords, parport_open, parport_device_id

parport_device_coords - convert device number to device coordinates
------------------

SYNOPSIS

#include <linux/parport.h>

int parport_device_coords (int devnum, int *parport, int *mux,
			   int *daisy);

DESCRIPTION

Convert between device number (zero-based) and device coordinates
(port, multiplexor, daisy chain address).

RETURN VALUE

Zero on success, in which case the coordinates are (*parport, *mux,
*daisy).

SEE ALSO

parport_device_num, parport_open, parport_device_id

parport_find_class - find a device by its class
------------------

SYNOPSIS

#include <linux/parport.h>

typedef enum {
	PARPORT_CLASS_LEGACY = 0,       /* Non-IEEE1284 device */
	PARPORT_CLASS_PRINTER,
	PARPORT_CLASS_MODEM,
	PARPORT_CLASS_NET,
	PARPORT_CLASS_HDC,              /* Hard disk controller */
	PARPORT_CLASS_PCMCIA,
	PARPORT_CLASS_MEDIA,            /* Multimedia device */
	PARPORT_CLASS_FDC,              /* Floppy disk controller */
	PARPORT_CLASS_PORTS,
	PARPORT_CLASS_SCANNER,
	PARPORT_CLASS_DIGCAM,
	PARPORT_CLASS_OTHER,            /* Anything else */
	PARPORT_CLASS_UNSPEC,           /* No CLS field in ID */
	PARPORT_CLASS_SCSIADAPTER
} parport_device_class;

int parport_find_class (parport_device_class cls, int from);

DESCRIPTION

Find a device by class.  The search starts from device number from+1.

RETURN VALUE

The device number of the next device in that class, or -1 if no such
device exists.

NOTES

Example usage:

int devnum = -1;
while ((devnum = parport_find_class (PARPORT_CLASS_DIGCAM, devnum)) != -1) {
    struct pardevice *dev = parport_open (devnum, ...);
    ...
}

SEE ALSO

parport_find_device, parport_open, parport_device_id

parport_find_device - find a device by its class
------------------

SYNOPSIS

#include <linux/parport.h>

int parport_find_device (const char *mfg, const char *mdl, int from);

DESCRIPTION

Find a device by vendor and model.  The search starts from device
number from+1.

RETURN VALUE

The device number of the next device matching the specifications, or
-1 if no such device exists.

NOTES

Example usage:

int devnum = -1;
while ((devnum = parport_find_device ("IOMEGA", "ZIP+", devnum)) != -1) {
    struct pardevice *dev = parport_open (devnum, ...);
    ...
}

SEE ALSO

parport_find_class, parport_open, parport_device_id

parport_set_timeout - set the inactivity timeout
-------------------

SYNOPSIS

#include <linux/parport.h>

long parport_set_timeout (struct pardevice *dev, long inactivity);

DESCRIPTION

Set the inactivity timeout, in jiffies, for a registered device.  The
previous timeout is returned.

RETURN VALUE

The previous timeout, in jiffies.

NOTES

Some of the port->ops functions for a parport may take time, owing to
delays at the peripheral.  After the peripheral has not responded for
'inactivity' jiffies, a timeout will occur and the blocking function
will return.

A timeout of 0 jiffies is a special case: the function must do as much
as it can without blocking or leaving the hardware in an unknown
state.  If port operations are performed from within an interrupt
handler, for instance, a timeout of 0 jiffies should be used.

Once set for a registered device, the timeout will remain at the set
value until set again.

SEE ALSO

port->ops->xxx_read/write_yyy

PORT FUNCTIONS
--------------

The functions in the port->ops structure (struct parport_operations)
are provided by the low-level driver responsible for that port.

port->ops->read_data - read the data register
--------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	unsigned char (*read_data) (struct parport *port);
	...
};

DESCRIPTION

If port->modes contains the PARPORT_MODE_TRISTATE flag and the
PARPORT_CONTROL_DIRECTION bit in the control register is set, this
returns the value on the data pins.  If port->modes contains the
PARPORT_MODE_TRISTATE flag and the PARPORT_CONTROL_DIRECTION bit is
not set, the return value _may_ be the last value written to the data
register.  Otherwise the return value is undefined.

SEE ALSO

write_data, read_status, write_control

port->ops->write_data - write the data register
---------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	void (*write_data) (struct parport *port, unsigned char d);
	...
};

DESCRIPTION

Writes to the data register.  May have side-effects (a STROBE pulse,
for instance).

SEE ALSO

read_data, read_status, write_control

port->ops->read_status - read the status register
----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	unsigned char (*read_status) (struct parport *port);
	...
};

DESCRIPTION

Reads from the status register.  This is a bitmask:

- PARPORT_STATUS_ERROR (printer fault, "nFault")
- PARPORT_STATUS_SELECT (on-line, "Select")
- PARPORT_STATUS_PAPEROUT (no paper, "PError")
- PARPORT_STATUS_ACK (handshake, "nAck")
- PARPORT_STATUS_BUSY (busy, "Busy")

There may be other bits set.

SEE ALSO

read_data, write_data, write_control

port->ops->read_control - read the control register
-----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	unsigned char (*read_control) (struct parport *port);
	...
};

DESCRIPTION

Returns the last value written to the control register (either from
write_control or frob_control).  No port access is performed.

SEE ALSO

read_data, write_data, read_status, write_control

port->ops->write_control - write the control register
------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	void (*write_control) (struct parport *port, unsigned char s);
	...
};

DESCRIPTION

Writes to the control register. This is a bitmask:
                          _______
- PARPORT_CONTROL_STROBE (nStrobe)
                          _______
- PARPORT_CONTROL_AUTOFD (nAutoFd)
                        _____
- PARPORT_CONTROL_INIT (nInit)
                          _________
- PARPORT_CONTROL_SELECT (nSelectIn)

SEE ALSO

read_data, write_data, read_status, frob_control

port->ops->frob_control - write control register bits
-----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	unsigned char (*frob_control) (struct parport *port,
				       unsigned char mask,
				       unsigned char val);
	...
};

DESCRIPTION

This is equivalent to reading from the control register, masking out
the bits in mask, exclusive-or'ing with the bits in val, and writing
the result to the control register.

As some ports don't allow reads from the control port, a software copy
of its contents is maintained, so frob_control is in fact only one
port access.

SEE ALSO

read_data, write_data, read_status, write_control

port->ops->enable_irq - enable interrupt generation
---------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	void (*enable_irq) (struct parport *port);
	...
};

DESCRIPTION

The parallel port hardware is instructed to generate interrupts at
appropriate moments, although those moments are
architecture-specific.  For the PC architecture, interrupts are
commonly generated on the rising edge of nAck.

SEE ALSO

disable_irq

port->ops->disable_irq - disable interrupt generation
----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	void (*disable_irq) (struct parport *port);
	...
};

DESCRIPTION

The parallel port hardware is instructed not to generate interrupts.
The interrupt itself is not masked.

SEE ALSO

enable_irq

port->ops->data_forward - enable data drivers
-----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	void (*data_forward) (struct parport *port);
	...
};

DESCRIPTION

Enables the data line drivers, for 8-bit host-to-peripheral
communications.

SEE ALSO

data_reverse

port->ops->data_reverse - tristate the buffer
-----------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	void (*data_reverse) (struct parport *port);
	...
};

DESCRIPTION

Places the data bus in a high impedance state, if port->modes has the
PARPORT_MODE_TRISTATE bit set.

SEE ALSO

data_forward

port->ops->epp_write_data - write EPP data
-------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*epp_write_data) (struct parport *port, const void *buf,
				  size_t len, int flags);
	...
};

DESCRIPTION

Writes data in EPP mode, and returns the number of bytes written.

The 'flags' parameter may be one or more of the following,
bitwise-or'ed together:

PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
			32-bit registers.  However, if a transfer
			times out, the return value may be unreliable.

SEE ALSO

epp_read_data, epp_write_addr, epp_read_addr

port->ops->epp_read_data - read EPP data
------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*epp_read_data) (struct parport *port, void *buf,
				 size_t len, int flags);
	...
};

DESCRIPTION

Reads data in EPP mode, and returns the number of bytes read.

The 'flags' parameter may be one or more of the following,
bitwise-or'ed together:

PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
			32-bit registers.  However, if a transfer
			times out, the return value may be unreliable.

SEE ALSO

epp_write_data, epp_write_addr, epp_read_addr

port->ops->epp_write_addr - write EPP address
-------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*epp_write_addr) (struct parport *port,
				  const void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Writes EPP addresses (8 bits each), and returns the number written.

The 'flags' parameter may be one or more of the following,
bitwise-or'ed together:

PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
			32-bit registers.  However, if a transfer
			times out, the return value may be unreliable.

(Does PARPORT_EPP_FAST make sense for this function?)

SEE ALSO

epp_write_data, epp_read_data, epp_read_addr

port->ops->epp_read_addr - read EPP address
------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*epp_read_addr) (struct parport *port, void *buf,
				 size_t len, int flags);
	...
};

DESCRIPTION

Reads EPP addresses (8 bits each), and returns the number read.

The 'flags' parameter may be one or more of the following,
bitwise-or'ed together:

PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
			32-bit registers.  However, if a transfer
			times out, the return value may be unreliable.

(Does PARPORT_EPP_FAST make sense for this function?)

SEE ALSO

epp_write_data, epp_read_data, epp_write_addr

port->ops->ecp_write_data - write a block of ECP data
-------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*ecp_write_data) (struct parport *port,
				  const void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Writes a block of ECP data.  The 'flags' parameter is ignored.

RETURN VALUE

The number of bytes written.

SEE ALSO

ecp_read_data, ecp_write_addr

port->ops->ecp_read_data - read a block of ECP data
------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*ecp_read_data) (struct parport *port,
				 void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Reads a block of ECP data.  The 'flags' parameter is ignored.

RETURN VALUE

The number of bytes read.  NB. There may be more unread data in a
FIFO.  Is there a way of stunning the FIFO to prevent this?

SEE ALSO

ecp_write_block, ecp_write_addr

port->ops->ecp_write_addr - write a block of ECP addresses
-------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*ecp_write_addr) (struct parport *port,
				  const void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Writes a block of ECP addresses.  The 'flags' parameter is ignored.

RETURN VALUE

The number of bytes written.

NOTES

This may use a FIFO, and if so shall not return until the FIFO is empty.

SEE ALSO

ecp_read_data, ecp_write_data

port->ops->nibble_read_data - read a block of data in nibble mode
---------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*nibble_read_data) (struct parport *port,
				    void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Reads a block of data in nibble mode.  The 'flags' parameter is ignored.

RETURN VALUE

The number of whole bytes read.

SEE ALSO

byte_read_data, compat_write_data

port->ops->byte_read_data - read a block of data in byte mode
-------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*byte_read_data) (struct parport *port,
				  void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Reads a block of data in byte mode.  The 'flags' parameter is ignored.

RETURN VALUE

The number of bytes read.

SEE ALSO

nibble_read_data, compat_write_data

port->ops->compat_write_data - write a block of data in compatibility mode
----------------------------

SYNOPSIS

#include <linux/parport.h>

struct parport_operations {
	...
	size_t (*compat_write_data) (struct parport *port,
				     const void *buf, size_t len, int flags);
	...
};

DESCRIPTION

Writes a block of data in compatibility mode.  The 'flags' parameter
is ignored.

RETURN VALUE

The number of bytes written.

SEE ALSO

nibble_read_data, byte_read_data
