===============================
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_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.

The (``name``) argument is the name of the device that appears in /proc
filesystem. The string must be valid for the whole lifetime of the
device (until parport_unregister_device is called).

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_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_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_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
