sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget//translations/zh_CN/driver-api/parport-lowlevelmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/zh_TW/driver-api/parport-lowlevelmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/it_IT/driver-api/parport-lowlevelmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/ja_JP/driver-api/parport-lowlevelmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/ko_KR/driver-api/parport-lowlevelmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/sp_SP/driver-api/parport-lowlevelmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hPARPORT interface documentationh]hPARPORT interface documentation}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhI/var/lib/git/docbuild/linux/Documentation/driver-api/parport-lowlevel.rsthKubh field_list)}(hhh]hfield)}(hhh](h field_name)}(h Time-stamph]h Time-stamp}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h<2000-02-24 13:30:20 twaugh> h]h paragraph)}(h<2000-02-24 13:30:20 twaugh>h]h<2000-02-24 13:30:20 twaugh>}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(h+Described here are the following functions:h]h+Described here are the following functions:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhdefinition_list)}(hhh]hdefinition_list_item)}(hXGlobal 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 h](hterm)}(hGlobal functions::h]hGlobal functions::}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK hjubh definition)}(hhh]h)}(hXparport_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_timeouth]hXparport_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}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj$ubah}(h]h ]h"]h$]h&]uh1j"hjubeh}(h]h ]h"]h$]h&]uh1j hhhK hj ubah}(h]h ]h"]h$]h&]uh1jhhhhhhhNubh)}(h8Port functions (can be overridden by low-level drivers):h]h8Port functions (can be overridden by low-level drivers):}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hhhhubh block_quote)}(hX3SPP:: 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 h]j)}(hhh](j )}(hSPP:: 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 h](j)}(hSPP::h]hSPP::}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK.hj^ubj#)}(hhh]h)}(hport->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_reverseh]hport->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}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjpubah}(h]h ]h"]h$]h&]uh1j"hj^ubeh}(h]h ]h"]h$]h&]uh1j hhhK.hj[ubj )}(hlEPP:: port->ops->epp_write_data port->ops->epp_read_data port->ops->epp_write_addr port->ops->epp_read_addr h](j)}(hEPP::h]hEPP::}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK4hjubj#)}(hhh]h)}(heport->ops->epp_write_data port->ops->epp_read_data port->ops->epp_write_addr port->ops->epp_read_addrh]heport->ops->epp_write_data port->ops->epp_read_data port->ops->epp_write_addr port->ops->epp_read_addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1j"hjubeh}(h]h ]h"]h$]h&]uh1j hhhK4hj[ubj )}(hSECP:: port->ops->ecp_write_data port->ops->ecp_read_data port->ops->ecp_write_addr h](j)}(hECP::h]hECP::}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK9hjubj#)}(hhh]h)}(hLport->ops->ecp_write_data port->ops->ecp_read_data port->ops->ecp_write_addrh]hLport->ops->ecp_write_data port->ops->ecp_read_data port->ops->ecp_write_addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubah}(h]h ]h"]h$]h&]uh1j"hjubeh}(h]h ]h"]h$]h&]uh1j hhhK9hj[ubj )}(h[Other:: port->ops->nibble_read_data port->ops->byte_read_data port->ops->compat_write_data h](j)}(hOther::h]hOther::}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK>hjubj#)}(hhh]h)}(hRport->ops->nibble_read_data port->ops->byte_read_data port->ops->compat_write_datah]hRport->ops->nibble_read_data port->ops->byte_read_data port->ops->compat_write_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ubeh}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jUhhhK$hhhhubh)}(hThe 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).h](h The parport subsystem comprises }(hj&hhhNhNubhliteral)}(h ``parport``h]hparport}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj&ubh (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).}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK@hhhhubh)}(hnThe parport interface to the device driver author can be broken down into global functions and port functions.h]hnThe parport interface to the device driver author can be broken down into global functions and port functions.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhhhhubh)}(hX2The 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.h](hThe 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 }(hjVhhhNhNubj/)}(h ``generic``h]hgeneric}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjVubhZ functions for doing standard things that will work on any IEEE 1284-capable architecture.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKHhhhhubh)}(hThe 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.h](hlThe port functions are provided by the low-level drivers, although the core parport module provides generic }(hjvhhhNhNubj/)}(h ``defaults``h]hdefaults}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjvubhY for some routines. The port functions can be split into three groups: SPP, EPP, and ECP.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKNhhhhubh)}(hXASPP (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.h](h8SPP (Standard Parallel Port) functions modify so-called }(hjhhhNhNubj/)}(h``SPP``h]hSPP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubhX 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.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKRhhhhubh)}(hEPP (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?)h]hEPP (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?)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhhhhubh)}(hXYHardware 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'.h]hX]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’.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hhhhubh)}(hhh](h)}(hGlobal functionsh]hGlobal functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKfubh)}(hhh](h)}(h?parport_register_driver - register a device driver with parporth]h?parport_register_driver - register a device driver with parport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKiubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKlubh literal_block)}(hX#include 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);h]hX#include 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);}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhKphjhhubeh}(h]synopsisah ]h"]h$]synopsisah&]uh1hhjhhhhhKl referencedKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhK{ubh)}(hIn 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.h]hIn 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.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hj hhubh)}(hX6A ``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).h](hA }(hj?hhhNhNubj/)}(h``struct parport_driver``h]hstruct parport_driver}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj?ubhX 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).}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hSThe visible parts of the ``struct parport *`` argument given to attach/detach are::h](hThe visible parts of the }(hj_hhhNhNubj/)}(h``struct parport *``h]hstruct parport *}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj_ubh% argument given to attach/detach are:}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj)}(hX|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; ... };h]hX|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; ... };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhj hhubh)}(hIThere are other members of the structure, but they should not be touched.h]hIThere are other members of the structure, but they should not be touched.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hThe ``modes`` member summarises the capabilities of the underlying hardware. It consists of flags which may be bitwise-ored together:h](hThe }(hjhhhNhNubj/)}(h ``modes``h]hmodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubhy member summarises the capabilities of the underlying hardware. It consists of flags which may be bitwise-ored together:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubjV)}(hX============================= =============================================== 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. ============================= =============================================== h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK/uh1jhjubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(hPARPORT_MODE_PCSPPh]hPARPORT_MODE_PCSPP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hIBM PC registers are available, i.e. functions that act on data, control and status registers are probably writing directly to the hardware.h]hIBM PC registers are available, i.e. functions that act on data, control and status registers are probably writing directly to the hardware.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hPARPORT_MODE_TRISTATEh]hPARPORT_MODE_TRISTATE}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj"ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(huThe data drivers may be turned off. This allows the data lines to be used for reverse (peripheral to host) transfers.h]huThe data drivers may be turned off. This allows the data lines to be used for reverse (peripheral to host) transfers.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hPARPORT_MODE_COMPATh]hPARPORT_MODE_COMPAT}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjYubah}(h]h ]h"]h$]h&]uh1jhjVubj)}(hhh]h)}(h]The hardware can assist with compatibility-mode (printer) transfers, i.e. compat_write_block.h]h]The hardware can assist with compatibility-mode (printer) transfers, i.e. compat_write_block.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjpubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hPARPORT_MODE_EPPh]hPARPORT_MODE_EPP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h+The hardware can assist with EPP transfers.h]h+The hardware can assist with EPP transfers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hPARPORT_MODE_ECPh]hPARPORT_MODE_ECP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h+The hardware can assist with ECP transfers.h]h+The hardware can assist with ECP transfers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hPARPORT_MODE_DMAh]hPARPORT_MODE_DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hThe 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.h]hThe 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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jUhhhKhj hhubh)}(h.There may be other flags in ``modes`` as well.h](hThere may be other flags in }(hjKhhhNhNubj/)}(h ``modes``h]hmodes}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjKubh as well.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hX$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.h](hThe contents of }(hjkhhhNhNubj/)}(h ``modes``h]hmodes}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjkubh_ is advisory only. For example, if the hardware is capable of DMA, and PARPORT_MODE_DMA is in }(hjkhhhNhNubj/)}(h ``modes``h]hmodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjkubh, 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.}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h] descriptionah ]h"]h$] descriptionah&]uh1hhjhhhhhK{jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h)Zero on success, otherwise an error code.h]h)Zero on success, otherwise an error code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] return-valueah ]h"]h$] return valueah&]uh1hhjhhhhhKjKubh)}(hhh](h)}(hERRORSh]hERRORS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h$None. (Can it fail? Why return int?)h]h$None. (Can it fail? Why return int?)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]errorsah ]h"]h$]errorsah&]uh1hhjhhhhhKjKubh)}(hhh](h)}(hEXAMPLEh]hEXAMPLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj)}(hX$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; } ... }h]hX$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; } ... }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]exampleah ]h"]h$]exampleah&]uh1hhjhhhhhKjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hEparport_unregister_driver, parport_register_device, parport_enumerateh]hEparport_unregister_driver, parport_register_device, parport_enumerate}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]see-alsoah ]h"]h$]see alsoah&]uh1hhjhhhhhKjKubeh}(h]=parport-register-driver-register-a-device-driver-with-parportah ]h"]?parport_register_driver - register a device driver with parportah$]h&]uh1hhjhhhhhKiubh)}(hhh](h)}(hDparport_unregister_driver - tell parport to forget about this driverh]hDparport_unregister_driver - tell parport to forget about this driver}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhhhhhKubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhhhhhKubj)}(hX #include 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);h]hX #include 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);}hjksbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjZhhubeh}(h]id1ah ]h"]h$]jah&]uh1hhjIhhhhhKjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hThis 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.h]hThis 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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id2ah ]h"]h$]jah&]uh1hhjIhhhhhMjKubh)}(hhh](h)}(hEXAMPLEh]hEXAMPLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM ubj)}(hXvoid cleanup_module (void) { ... /* Stop notifications. */ parport_unregister_driver (&lp_driver); /* Unregister devices. */ for (i = 0; i < NUM_DEVS; i++) parport_unregister_device (dev[i]); ... }h]hXvoid cleanup_module (void) { ... /* Stop notifications. */ parport_unregister_driver (&lp_driver); /* Unregister devices. */ for (i = 0; i < NUM_DEVS; i++) parport_unregister_device (dev[i]); ... }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id3ah ]h"]h$]jah&]uh1hhjIhhhhhM jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h*parport_register_driver, parport_enumerateh]h*parport_register_driver, parport_enumerate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubeh}(h]id4ah ]h"]h$]j?ah&]uh1hhjIhhhhhMjKubeh}(h]Bparport-unregister-driver-tell-parport-to-forget-about-this-driverah ]h"]Dparport_unregister_driver - tell parport to forget about this driverah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hBparport_enumerate - retrieve a list of parallel ports (DEPRECATED)h]hBparport_enumerate - retrieve a list of parallel ports (DEPRECATED)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM%ubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM(ubj)}(hE#include struct parport *parport_enumerate (void);h]hE#include struct parport *parport_enumerate (void);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM,hj hhubeh}(h]id5ah ]h"]h$]synopsisah&]uh1hhjhhhhhM(jKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhhhM1ubh)}(hXHRetrieve 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.h](hxRetrieve the first of a list of valid parallel ports for this machine. Successive parallel ports can be found using the }(hjChhhNhNubj/)}(h``struct parport *next``h]hstruct parport *next}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjCubh element of the }(hjChhhNhNubj/)}(h``struct parport *``h]hstruct parport *}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjCubh that is returned. If }(hjChhhNhNubj/)}(h``next``h]hnext}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjCubhu is NULL, there are no more parallel ports in the list. The number of ports in the list will not exceed PARPORT_MAX.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM3hj2hhubeh}(h]id6ah ]h"]h$] descriptionah&]uh1hhjhhhhhM1jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM:ubh)}(hcA ``struct parport *`` describing a valid parallel port for the machine, or NULL if there are none.h](hA }(hjhhhNhNubj/)}(h``struct parport *``h]hstruct parport *}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubhM describing a valid parallel port for the machine, or NULL if there are none.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM<hjhhubeh}(h]id7ah ]h"]h$]jah&]uh1hhjhhhhhM:jKubh)}(hhh](h)}(hERRORSh]hERRORS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM@ubh)}(hRThis function can return NULL to indicate that there are no parallel ports to use.h]hRThis function can return NULL to indicate that there are no parallel ports to use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhjhhubeh}(h]id8ah ]h"]h$]jah&]uh1hhjhhhhhM@jKubh)}(hhh](h)}(hEXAMPLEh]hEXAMPLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMFubj)}(hX int detect_device (void) { struct parport *port; for (port = parport_enumerate (); port != NULL; port = port->next) { /* Try to detect a device on the port... */ ... } } ... }h]hX int detect_device (void) { struct parport *port; for (port = parport_enumerate (); port != NULL; port = port->next) { /* Try to detect a device on the port... */ ... } } ... }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMJhjhhubeh}(h]id9ah ]h"]h$]exampleah&]uh1hhjhhhhhMFjKubh)}(hhh](h)}(hNOTESh]hNOTES}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMZubh)}(hPparport_enumerate is deprecated; parport_register_driver should be used instead.h]hPparport_enumerate is deprecated; parport_register_driver should be used instead.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hjhhubeh}(h]notesah ]h"]h$]notesah&]uh1hhjhhhhhMZjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hhhhhM`ubh)}(h2parport_register_driver, parport_unregister_driverh]h2parport_register_driver, parport_unregister_driver}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMbhj;hhubeh}(h]id10ah ]h"]h$]see alsoah&]uh1hhjhhhhhM`jKubeh}(h]>parport-enumerate-retrieve-a-list-of-parallel-ports-deprecatedah ]h"]Bparport_enumerate - retrieve a list of parallel ports (deprecated)ah$]h&]uh1hhjhhhhhM%ubh)}(hhh](h)}(h0parport_register_device - register to use a porth]h0parport_register_device - register to use a port}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhhhhhMgubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hhhhhMjubj)}(hXW#include 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);h]hXW#include 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);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMnhj{hhubeh}(h]id11ah ]h"]h$]synopsisah&]uh1hhjjhhhhhMjjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM}ubh)}(hUse 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.h](hEUse this function to register your device driver on a parallel port (}(hjhhhNhNubj/)}(h``port``h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubhp). Once you have done that, you will be able to use parport_claim and parport_release in order to use the port.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hThe (``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).h](hThe (}(hjhhhNhNubj/)}(h``name``h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubh) 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).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hThis 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.h](h>This function will register three callbacks into your driver: }(hjhhhNhNubj/)}(h ``preempt``h]hpreempt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubh, }(hjhhhNhNubj/)}(h ``wakeup``h]hwakeup}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubh and }(hjhhhNhNubj/)}(h``irq``h]hirq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubhR. Each of these may be NULL in order to indicate that you do not want a callback.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hX*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.h](h When the }(hj7 hhhNhNubj/)}(h ``preempt``h]hpreempt}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj7 ubhX function is called, it is because another driver wishes to use the parallel port. The }(hj7 hhhNhNubj/)}(h ``preempt``h]hpreempt}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj7 ubh 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.}(hj7 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXThe ``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.h](hThe }(hji hhhNhNubj/)}(h ``wakeup``h]hwakeup}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hji ubh 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 }(hji hhhNhNubj/)}(h ``wakeup``h]hwakeup}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hji ubhj function (in which case the claim is guaranteed to succeed), or choose not to if you don’t need it now.}(hji hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hIf an interrupt occurs on the parallel port your driver has claimed, the ``irq`` function will be called. (Write something about shared interrupts here.)h](hIIf an interrupt occurs on the parallel port your driver has claimed, the }(hj hhhNhNubj/)}(h``irq``h]hirq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubhI function will be called. (Write something about shared interrupts here.)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h]The ``handle`` is a pointer to driver-specific data, and is passed to the callback functions.h](hThe }(hj hhhNhNubj/)}(h ``handle``h]hhandle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubhO is a pointer to driver-specific data, and is passed to the callback functions.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h>``flags`` may be a bitwise combination of the following flags:h](j/)}(h ``flags``h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubh5 may be a bitwise combination of the following flags:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubjV)}(hX}===================== ================================================= Flag Meaning ===================== ================================================= PARPORT_DEV_EXCL The device cannot share the parallel port at all. Use this only when absolutely necessary. ===================== ================================================= h]j)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK1uh1jhj ubhthead)}(hhh]j)}(hhh](j)}(hhh]h)}(hFlagh]hFlag}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hMeaningh]hMeaning}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hPARPORT_DEV_EXCLh]hPARPORT_DEV_EXCL}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj] ubah}(h]h ]h"]h$]h&]uh1jhjZ ubj)}(hhh]h)}(hZThe device cannot share the parallel port at all. Use this only when absolutely necessary.h]hZThe device cannot share the parallel port at all. Use this only when absolutely necessary.}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjt ubah}(h]h ]h"]h$]h&]uh1jhjZ ubeh}(h]h ]h"]h$]h&]uh1jhjW ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]colsKuh1jhj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jUhhhMhjhhubh)}(hsThe typedefs are not actually defined -- they are only shown in order to make the function prototype more readable.h]hsThe typedefs are not actually defined -- they are only shown in order to make the function prototype more readable.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hdev; 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; } ... }h]hXstatic 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; } ... }}hj_ sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjN hhubeh}(h]id15ah ]h"]h$]exampleah&]uh1hhjjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1hhju hhhhhMubh)}(h(parport_unregister_device, parport_claimh]h(parport_unregister_device, parport_claim}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhju hhubeh}(h]id16ah ]h"]h$]see alsoah&]uh1hhjjhhhhhMjKubeh}(h].parport-register-device-register-to-use-a-portah ]h"]0parport_register_device - register to use a portah$]h&]uh1hhjhhhhhMgubh)}(hhh](h)}(h/parport_unregister_device - finish using a porth]h/parport_unregister_device - finish using a port}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(h SYNPOPSISh]h SYNPOPSIS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj)}(hS#include void parport_unregister_device (struct pardevice *dev);h]hS#include void parport_unregister_device (struct pardevice *dev);}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(hThis function is the opposite of parport_register_device. After using parport_unregister_device, ``dev`` is no longer a valid device handle.h](hbThis function is the opposite of parport_register_device. After using parport_unregister_device, }(hj hhhNhNubj/)}(h``dev``h]hdev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubh$ is no longer a valid device handle.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hsYou should not unregister a device that is currently claimed, although if you do it will be released automatically.h]hsYou should not unregister a device that is currently claimed, although if you do it will be released automatically.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h]id17ah ]h"]h$] descriptionah&]uh1hhj hhhhhMjKubh)}(hhh](h)}(hEXAMPLEh]hEXAMPLE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM ubj)}(h_... kfree (dev->private); /* before we lose the pointer */ parport_unregister_device (dev); ...h]h_... kfree (dev->private); /* before we lose the pointer */ parport_unregister_device (dev); ...}hj) sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubeh}(h]id18ah ]h"]h$]exampleah&]uh1hhj hhhhhM jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj? hhhhhMubh)}(hparport_unregister_driverh]hparport_unregister_driver}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj? hhubeh}(h]id19ah ]h"]h$]see alsoah&]uh1hhj hhhhhMjKubeh}(h]-parport-unregister-device-finish-using-a-portah ]h"]/parport_unregister_device - finish using a portah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hLparport_claim, parport_claim_or_block - claim the parallel port for a deviceh]hLparport_claim, parport_claim_or_block - claim the parallel port for a device}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjn hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubj)}(hz#include int parport_claim (struct pardevice *dev); int parport_claim_or_block (struct pardevice *dev);h]hz#include int parport_claim (struct pardevice *dev); int parport_claim_or_block (struct pardevice *dev);}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhM#hj hhubeh}(h]id20ah ]h"]h$]synopsisah&]uh1hhjn hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM)ubh)}(hThese 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.)h](hFThese functions attempt to gain control of the parallel port on which }(hj hhhNhNubj/)}(h``dev``h]hdev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubh is registered. }(hj hhhNhNubj/)}(h``parport_claim``h]h parport_claim}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubh does not block, but }(hj hhhNhNubj/)}(h``parport_claim_or_block``h]hparport_claim_or_block}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubhP may do. (Put something here about blocking interruptibly or non-interruptibly.)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM+hj hhubh)}(hAYou should not try to claim a port that you have already claimed.h]hAYou should not try to claim a port that you have already claimed.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hj hhubeh}(h]id21ah ]h"]h$] descriptionah&]uh1hhjn hhhhhM)jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM3ubh)}(hA return value of zero indicates that the port was successfully claimed, and the caller now has possession of the parallel port.h]hA return value of zero indicates that the port was successfully claimed, and the caller now has possession of the parallel port.}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hj hhubh)}(haIf ``parport_claim_or_block`` blocks before returning successfully, the return value is positive.h](hIf }(hj0 hhhNhNubj/)}(h``parport_claim_or_block``h]hparport_claim_or_block}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj0 ubhD blocks before returning successfully, the return value is positive.}(hj0 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM8hj hhubeh}(h]id22ah ]h"]h$] return valueah&]uh1hhjn hhhhhM3jKubh)}(hhh](h)}(hERRORSh]hERRORS}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX hhhhhM<ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1jhjl ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK:uh1jhjl ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(h-EAGAINh]h-EAGAIN}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hSThe port is unavailable at the moment, but another attempt to claim it may succeed.h]hSThe port is unavailable at the moment, but another attempt to claim it may succeed.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhjl ubeh}(h]h ]h"]h$]h&]colsKuh1jhji ubah}(h]h ]h"]h$]h&]uh1jhjX hhhhhNubeh}(h]id23ah ]h"]h$]errorsah&]uh1hhjn hhhhhM<jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMDubh)}(hparport_releaseh]hparport_release}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhj hhubeh}(h]id24ah ]h"]h$]see alsoah&]uh1hhjn hhhhhMDjKubeh}(h]Iparport-claim-parport-claim-or-block-claim-the-parallel-port-for-a-deviceah ]h"]Lparport_claim, parport_claim_or_block - claim the parallel port for a deviceah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h+parport_release - release the parallel porth]h+parport_release - release the parallel port}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMKubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMNubj)}(hI#include void parport_release (struct pardevice *dev);h]hI#include void parport_release (struct pardevice *dev);}hj)sbah}(h]h ]h"]h$]h&]jjuh1jhhhMRhjhhubeh}(h]id25ah ]h"]h$]synopsisah&]uh1hhjhhhhhMNjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hhhhhMWubh)}(hOnce 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.h](hGOnce a parallel port device has been claimed, it can be released using }(hjPhhhNhNubj/)}(h``parport_release``h]hparport_release}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjPubhZ. It cannot fail, but you should not release a device that you do not have possession of.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMYhj?hhubeh}(h]id26ah ]h"]h$] descriptionah&]uh1hhjhhhhhMWjKubh)}(hhh](h)}(hEXAMPLEh]hEXAMPLE}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhhhhhM^ubj)}(hX 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); ... }h]hX 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); ... }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMbhjxhhubeh}(h]id27ah ]h"]h$]exampleah&]uh1hhjhhhhhM^jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMnubh)}(hAchange_mode, parport_claim, parport_claim_or_block, parport_yieldh]hAchange_mode, parport_claim, parport_claim_or_block, parport_yield}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMphjhhubeh}(h]id28ah ]h"]h$]see alsoah&]uh1hhjhhhhhMnjKubeh}(h])parport-release-release-the-parallel-portah ]h"]+parport_release - release the parallel portah$]h&]uh1hhjhhhhhMKubh)}(hhh](h)}(hKparport_yield, parport_yield_blocking - temporarily release a parallel porth]hKparport_yield, parport_yield_blocking - temporarily release a parallel port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMuubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMxubj)}(hy#include int parport_yield (struct pardevice *dev) int parport_yield_blocking (struct pardevice *dev);h]hy#include int parport_yield (struct pardevice *dev) int parport_yield_blocking (struct pardevice *dev);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM|hjhhubeh}(h]id29ah ]h"]h$]synopsisah&]uh1hhjhhhhhMxjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hWhen 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.h](hYWhen a driver has control of a parallel port, it may allow another driver to temporarily }(hjhhhNhNubj/)}(h ``borrow``h]hborrow}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubh it. }(hjhhhNhNubj/)}(h``parport_yield``h]h parport_yield}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubh does not block; }(hjhhhNhNubj/)}(h``parport_yield_blocking``h]hparport_yield_blocking}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubh may do.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id30ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchhhhhMubh)}(h`A return value of zero indicates that the caller still owns the port and the call did not block.h]h`A return value of zero indicates that the caller still owns the port and the call did not block.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjchhubh)}(h{A positive return value from ``parport_yield_blocking`` indicates that the caller still owns the port and the call blocked.h](hA positive return value from }(hjhhhNhNubj/)}(h``parport_yield_blocking``h]hparport_yield_blocking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubhD indicates that the caller still owns the port and the call blocked.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjchhubh)}(hrA return value of -EAGAIN indicates that the caller no longer owns the port, and it must be re-claimed before use.h]hrA return value of -EAGAIN indicates that the caller no longer owns the port, and it must be re-claimed before use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjchhubeh}(h]id31ah ]h"]h$] return valueah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hERRORSh]hERRORS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK:uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(h-EAGAINh]h-EAGAIN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h.Ownership of the parallel port was given away.h]h.Ownership of the parallel port was given away.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]id32ah ]h"]h$]errorsah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hhhhhMubh)}(hparport_releaseh]hparport_release}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj8hhubeh}(h]id33ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h]Hparport-yield-parport-yield-blocking-temporarily-release-a-parallel-portah ]h"]Kparport_yield, parport_yield_blocking - temporarily release a parallel portah$]h&]uh1hhjhhhhhMuubh)}(hhh](h)}(h;parport_wait_peripheral - wait for status lines, up to 35msh]h;parport_wait_peripheral - wait for status lines, up to 35ms}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhhhhhMubj)}(h#include int parport_wait_peripheral (struct parport *port, unsigned char mask, unsigned char val);h]h#include int parport_wait_peripheral (struct parport *port, unsigned char mask, unsigned char val);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjxhhubeh}(h]id34ah ]h"]h$]synopsisah&]uh1hhjghhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h=Wait for the status lines in mask to match the values in val.h]h=Wait for the status lines in mask to match the values in val.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id35ah ]h"]h$] descriptionah&]uh1hhjghhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK:uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h-EINTRh]h-EINTR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(ha signal is pendingh]ha signal is pending}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0h]h0}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.ubah}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hhh]h)}(h+the status lines in mask have values in valh]h+the status lines in mask have values in val}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjEubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h1h]h1}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjeubah}(h]h ]h"]h$]h&]uh1jhjbubj)}(hhh]h)}(h&timed out while waiting (35ms elapsed)h]h&timed out while waiting (35ms elapsed)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj|ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]id36ah ]h"]h$] return valueah&]uh1hhjghhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hparport_poll_peripheralh]hparport_poll_peripheral}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id37ah ]h"]h$]see alsoah&]uh1hhjghhhhhMjKubeh}(h]8parport-wait-peripheral-wait-for-status-lines-up-to-35msah ]h"];parport_wait_peripheral - wait for status lines, up to 35msah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h8parport_poll_peripheral - wait for status lines, in usech]h8parport_poll_peripheral - wait for status lines, in usec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(h#include int parport_poll_peripheral (struct parport *port, unsigned char mask, unsigned char val, int usec);h]h#include int parport_poll_peripheral (struct parport *port, unsigned char mask, unsigned char val, int usec);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id38ah ]h"]h$]synopsisah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h=Wait for the status lines in mask to match the values in val.h]h=Wait for the status lines in mask to match the values in val.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id39ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhhhhhMubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjVubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK:uh1jhjVubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h-EINTRh]h-EINTR}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjsubah}(h]h ]h"]h$]h&]uh1jhjpubj)}(hhh]h)}(ha signal is pendingh]ha signal is pending}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhjmubj)}(hhh](j)}(hhh]h)}(hj3h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h+the status lines in mask have values in valh]h+the status lines in mask have values in val}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjmubj)}(hhh](j)}(hhh]h)}(hjjh]h1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h8timed out while waiting (usec microseconds have elapsed)h]h8timed out while waiting (usec microseconds have elapsed)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]colsKuh1jhjSubah}(h]h ]h"]h$]h&]uh1jhjBhhhhhNubeh}(h]id40ah ]h"]h$] return valueah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hhhhhMubh)}(hparport_wait_peripheralh]hparport_wait_peripheral}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubeh}(h]id41ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h]5parport-poll-peripheral-wait-for-status-lines-in-usecah ]h"]8parport_poll_peripheral - wait for status lines, in usecah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h0parport_wait_event - wait for an event on a porth]h0parport_wait_event - wait for an event on a port}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhhhhhMubj)}(h^#include int parport_wait_event (struct parport *port, signed long timeout)h]h^#include int parport_wait_event (struct parport *port, signed long timeout)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjnhhubeh}(h]id42ah ]h"]h$]synopsisah&]uh1hhj]hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hIWait for an event (e.g. interrupt) on a port. The timeout is in jiffies.h]hIWait for an event (e.g. interrupt) on a port. The timeout is in jiffies.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id43ah ]h"]h$] descriptionah&]uh1hhj]hhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK:uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hj3h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hsuccessh]hsuccess}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h<0h]h<0}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h error (exit as soon as possible)h]h error (exit as soon as possible)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h>0h]h>0}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjZubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(h timed outh]h timed out}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjqubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]id44ah ]h"]h$] return valueah&]uh1hhj]hhhhhMjKubeh}(h].parport-wait-event-wait-for-an-event-on-a-portah ]h"]0parport_wait_event - wait for an event on a portah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h1parport_negotiate - perform IEEE 1284 negotiationh]h1parport_negotiate - perform IEEE 1284 negotiation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM ubj)}(hO#include int parport_negotiate (struct parport *, int mode);h]hO#include int parport_negotiate (struct parport *, int mode);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id45ah ]h"]h$]synopsisah&]uh1hhjhhhhhM jKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hPerform IEEE 1284 negotiation.h]hPerform IEEE 1284 negotiation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id46ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj$ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKubj)}(hhh]h)}(h5handshake OK; IEEE 1284 peripheral and mode availableh]h5handshake OK; IEEE 1284 peripheral and mode available}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjWubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh](j)}(hhh]h)}(h-1h]h-1}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjwubah}(h]h ]h"]h$]h&]uh1jhjtubj)}(hhh]h)}(h ssize_t parport_read (struct parport *, void *buf, size_t len);h]h[#include ssize_t parport_read (struct parport *, void *buf, size_t len);}hjMsbah}(h]h ]h"]h$]h&]jjuh1jhhhM0hj<hhubeh}(h]id49ah ]h"]h$]synopsisah&]uh1hhj+hhhhhM,jKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchhhhhM5ubh)}(hxRead data from device in current IEEE 1284 transfer mode. This only works for modes that support reverse data transfer.h]hxRead data from device in current IEEE 1284 transfer mode. This only works for modes that support reverse data transfer.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM7hjchhubeh}(h]id50ah ]h"]h$] descriptionah&]uh1hhj+hhhhhM5jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM;ubh)}(hFIf negative, an error code; otherwise the number of bytes transferred.h]hFIf negative, an error code; otherwise the number of bytes transferred.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM=hjhhubeh}(h]id51ah ]h"]h$] return valueah&]uh1hhj+hhhhhM;jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM@ubh)}(h parport_write, parport_negotiateh]h parport_write, parport_negotiate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhjhhubeh}(h]id52ah ]h"]h$]see alsoah&]uh1hhj+hhhhhM@jKubeh}(h]"parport-read-read-data-from-deviceah ]h"]$parport_read - read data from deviceah$]h&]uh1hhjhhhhhM)ubh)}(hhh](h)}(h$parport_write - write data to deviceh]h$parport_write - write data to device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMGubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMJubj)}(hb#include ssize_t parport_write (struct parport *, const void *buf, size_t len);h]hb#include ssize_t parport_write (struct parport *, const void *buf, size_t len);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMNhjhhubeh}(h]id53ah ]h"]h$]synopsisah&]uh1hhjhhhhhMJjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMSubh)}(hwWrite data to device in current IEEE 1284 transfer mode. This only works for modes that support forward data transfer.h]hwWrite data to device in current IEEE 1284 transfer mode. This only works for modes that support forward data transfer.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMUhjhhubeh}(h]id54ah ]h"]h$] descriptionah&]uh1hhjhhhhhMSjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hhhhhMYubh)}(hFIf negative, an error code; otherwise the number of bytes transferred.h]hFIf negative, an error code; otherwise the number of bytes transferred.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hj?hhubeh}(h]id55ah ]h"]h$] return valueah&]uh1hhjhhhhhMYjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhhhhhM^ubh)}(hparport_read, parport_negotiateh]hparport_read, parport_negotiate}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM`hjfhhubeh}(h]id56ah ]h"]h$]see alsoah&]uh1hhjhhhhhM^jKubeh}(h]"parport-write-write-data-to-deviceah ]h"]$parport_write - write data to deviceah$]h&]uh1hhjhhhhhMGubh)}(hhh](h)}(h;parport_open - register device for particular device numberh]h;parport_open - register device for particular device number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMfubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMiubj)}(hXx#include 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);h]hXx#include 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);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMmhjhhubeh}(h]id57ah ]h"]h$]synopsisah&]uh1hhjhhhhhMijKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMwubh)}(hhThis is like parport_register_device but takes a device number instead of a pointer to a struct parport.h]hhThis is like parport_register_device but takes a device number instead of a pointer to a struct parport.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMyhjhhubeh}(h]id58ah ]h"]h$] descriptionah&]uh1hhjhhhhhMwjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM}ubh)}(hWSee parport_register_device. If no device is associated with devnum, NULL is returned.h]hWSee parport_register_device. If no device is associated with devnum, NULL is returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id59ah ]h"]h$] return valueah&]uh1hhjhhhhhM}jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hparport_register_deviceh]hparport_register_device}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id60ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h]9parport-open-register-device-for-particular-device-numberah ]h"];parport_open - register device for particular device numberah$]h&]uh1hhjhhhhhMfubh)}(hhh](h)}(h>parport_close - unregister device for particular device numberh]h>parport_close - unregister device for particular device number}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hhhhhMubj)}(hG#include void parport_close (struct pardevice *dev);h]hG#include void parport_close (struct pardevice *dev);}hjlsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj[hhubeh}(h]id61ah ]h"]h$]synopsisah&]uh1hhjJhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hEThis is the equivalent of parport_unregister_device for parport_open.h]hEThis is the equivalent of parport_unregister_device for parport_open.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id62ah ]h"]h$] descriptionah&]uh1hhjJhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h'parport_unregister_device, parport_openh]h'parport_unregister_device, parport_open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id63ah ]h"]h$]see alsoah&]uh1hhjJhhhhhMjKubeh}(h]parport_close - unregister device for particular device numberah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h.parport_device_id - obtain IEEE 1284 Device IDh]h.parport_device_id - obtain IEEE 1284 Device ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(h]#include ssize_t parport_device_id (int devnum, char *buffer, size_t len);h]h]#include ssize_t parport_device_id (int devnum, char *buffer, size_t len);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id64ah ]h"]h$]synopsisah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h?Obtains the IEEE 1284 Device ID associated with a given device.h]h?Obtains the IEEE 1284 Device ID associated with a given device.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id65ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hhhhhMubh)}(hIf 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::h]hIf 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:}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj7hhubj)}(h [length][ID]h]h [length][ID]}hjVsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj7hhubh)}(hThe 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::h]hThe 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:}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj7hhubj)}(h key:value;h]h key:value;}hjrsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj7hhubeh}(h]id66ah ]h"]h$] return valueah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hNOTESh]hNOTES}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h2Many devices have ill-formed IEEE 1284 Device IDs.h]h2Many devices have ill-formed IEEE 1284 Device IDs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id67ah ]h"]h$]j9ah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h'parport_find_class, parport_find_deviceh]h'parport_find_class, parport_find_device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id68ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h],parport-device-id-obtain-ieee-1284-device-idah ]h"].parport_device_id - obtain ieee 1284 device idah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hCparport_device_coords - convert device number to device coordinatesh]hCparport_device_coords - convert device number to device coordinates}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(h#include int parport_device_coords (int devnum, int *parport, int *mux, int *daisy);h]h#include int parport_device_coords (int devnum, int *parport, int *mux, int *daisy);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id69ah ]h"]h$]synopsisah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hkConvert between device number (zero-based) and device coordinates (port, multiplexor, daisy chain address).h]hkConvert between device number (zero-based) and device coordinates (port, multiplexor, daisy chain address).}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id70ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hhhhhMubh)}(hXZero on success, in which case the coordinates are (``*parport``, ``*mux``, ``*daisy``).h](h4Zero on success, in which case the coordinates are (}(hjMhhhNhNubj/)}(h ``*parport``h]h*parport}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjMubh, }(hjMhhhNhNubj/)}(h``*mux``h]h*mux}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjMubh, }(hjMhhhNhNubj/)}(h ``*daisy``h]h*daisy}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjMubh).}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj<hhubeh}(h]id71ah ]h"]h$] return valueah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hparport_open, parport_device_idh]hparport_open, parport_device_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id72ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h]Aparport-device-coords-convert-device-number-to-device-coordinatesah ]h"]Cparport_device_coords - convert device number to device coordinatesah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h/parport_find_class - find a device by its classh]h/parport_find_class - find a device by its class}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(hX#include 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);h]hX#include 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);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id73ah ]h"]h$]synopsisah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM ubh)}(hEFind a device by class. The search starts from device number from+1.h]hEFind a device by class. The search starts from device number from+1.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubeh}(h]id74ah ]h"]h$] descriptionah&]uh1hhjhhhhhM jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hhhhhMubh)}(hSThe device number of the next device in that class, or -1 if no such device exists.h]hSThe device number of the next device in that class, or -1 if no such device exists.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj'hhubeh}(h]id75ah ]h"]h$] return valueah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hNOTESh]hNOTES}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhMubh)}(hExample usage::h]hExample usage:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjNhhubj)}(hint devnum = -1; while ((devnum = parport_find_class (PARPORT_CLASS_DIGCAM, devnum)) != -1) { struct pardevice *dev = parport_open (devnum, ...); ... }h]hint devnum = -1; while ((devnum = parport_find_class (PARPORT_CLASS_DIGCAM, devnum)) != -1) { struct pardevice *dev = parport_open (devnum, ...); ... }}hjmsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjNhhubeh}(h]id76ah ]h"]h$]notesah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM!ubh)}(h4parport_find_device, parport_open, parport_device_idh]h4parport_find_device, parport_open, parport_device_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM#hjhhubeh}(h]id77ah ]h"]h$]see alsoah&]uh1hhjhhhhhM!jKubeh}(h]-parport-find-class-find-a-device-by-its-classah ]h"]/parport_find_class - find a device by its classah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h0parport_find_device - find a device by its classh]h0parport_find_device - find a device by its class}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM(ubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM+ubj)}(ha#include int parport_find_device (const char *mfg, const char *mdl, int from);h]ha#include int parport_find_device (const char *mfg, const char *mdl, int from);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM/hjhhubeh}(h]id78ah ]h"]h$]synopsisah&]uh1hhjhhhhhM+jKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM4ubh)}(hPFind a device by vendor and model. The search starts from device number from+1.h]hPFind a device by vendor and model. The search starts from device number from+1.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM6hjhhubeh}(h]id79ah ]h"]h$] descriptionah&]uh1hhjhhhhhM4jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM:ubh)}(haThe device number of the next device matching the specifications, or -1 if no such device exists.h]haThe device number of the next device matching the specifications, or -1 if no such device exists.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hjhhubeh}(h]id80ah ]h"]h$] return valueah&]uh1hhjhhhhhM:jKubh)}(hhh](h)}(hNOTESh]hNOTES}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hhhhhM@ubh)}(hExample usage::h]hExample usage:}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhj8hhubj)}(hint devnum = -1; while ((devnum = parport_find_device ("IOMEGA", "ZIP+", devnum)) != -1) { struct pardevice *dev = parport_open (devnum, ...); ... }h]hint devnum = -1; while ((devnum = parport_find_device ("IOMEGA", "ZIP+", devnum)) != -1) { struct pardevice *dev = parport_open (devnum, ...); ... }}hjWsbah}(h]h ]h"]h$]h&]jjuh1jhhhMDhj8hhubeh}(h]id81ah ]h"]h$]notesah&]uh1hhjhhhhhM@jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhhhhhMKubh)}(h3parport_find_class, parport_open, parport_device_idh]h3parport_find_class, parport_open, parport_device_id}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMMhjmhhubeh}(h]id82ah ]h"]h$]see alsoah&]uh1hhjhhhhhMKjKubeh}(h].parport-find-device-find-a-device-by-its-classah ]h"]0parport_find_device - find a device by its classah$]h&]uh1hhjhhhhhM(ubh)}(hhh](h)}(h0parport_set_timeout - set the inactivity timeouth]h0parport_set_timeout - set the inactivity timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMSubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMVubj)}(h^#include long parport_set_timeout (struct pardevice *dev, long inactivity);h]h^#include long parport_set_timeout (struct pardevice *dev, long inactivity);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMZhjhhubeh}(h]id83ah ]h"]h$]synopsisah&]uh1hhjhhhhhMVjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM_ubh)}(hcSet the inactivity timeout, in jiffies, for a registered device. The previous timeout is returned.h]hcSet the inactivity timeout, in jiffies, for a registered device. The previous timeout is returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMahjhhubeh}(h]id84ah ]h"]h$] descriptionah&]uh1hhjhhhhhM_jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMeubh)}(h!The previous timeout, in jiffies.h]h!The previous timeout, in jiffies.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghjhhubeh}(h]id85ah ]h"]h$] return valueah&]uh1hhjhhhhhMejKubh)}(hhh](h)}(hNOTESh]hNOTES}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhMjubh)}(hSome 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.h](hSome of the port->ops functions for a parport may take time, owing to delays at the peripheral. After the peripheral has not responded for }(hj3hhhNhNubj/)}(h``inactivity``h]h inactivity}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj3ubhE jiffies, a timeout will occur and the blocking function will return.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMlhj"hhubh)}(hXA 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.h]hXA 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.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMqhj"hhubh)}(h[Once set for a registered device, the timeout will remain at the set value until set again.h]h[Once set for a registered device, the timeout will remain at the set value until set again.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMvhj"hhubeh}(h]id86ah ]h"]h$]notesah&]uh1hhjhhhhhMjjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhhhhhMzubh)}(hport->ops->xxx_read/write_yyyh]hport->ops->xxx_read/write_yyy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM|hjwhhubeh}(h]id87ah ]h"]h$]see alsoah&]uh1hhjhhhhhMzjKubeh}(h].parport-set-timeout-set-the-inactivity-timeoutah ]h"]0parport_set_timeout - set the inactivity timeoutah$]h&]uh1hhjhhhhhMSubeh}(h]global-functionsah ]h"]global functionsah$]h&]uh1hhhhhhhhKfubh)}(hhh](h)}(hPORT FUNCTIONSh]hPORT FUNCTIONS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hThe functions in the port->ops structure (struct parport_operations) are provided by the low-level driver responsible for that port.h]hThe functions in the port->ops structure (struct parport_operations) are provided by the low-level driver responsible for that port.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hhh](h)}(h-port->ops->read_data - read the data registerh]h-port->ops->read_data - read the data register}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(h#include struct parport_operations { ... unsigned char (*read_data) (struct parport *port); ... };h]h#include struct parport_operations { ... unsigned char (*read_data) (struct parport *port); ... };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id88ah ]h"]h$]synopsisah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hXIf 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.h]hXIf 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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id89ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhMubh)}(h&write_data, read_status, write_controlh]h&write_data, read_status, write_control}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj,hhubeh}(h]id90ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h])port-ops-read-data-read-the-data-registerah ]h"]-port->ops->read_data - read the data registerah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h/port->ops->write_data - write the data registerh]h/port->ops->write_data - write the data register}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhhhhhMubj)}(h#include struct parport_operations { ... void (*write_data) (struct parport *port, unsigned char d); ... };h]h#include struct parport_operations { ... void (*write_data) (struct parport *port, unsigned char d); ... };}hj}sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjlhhubeh}(h]id91ah ]h"]h$]synopsisah&]uh1hhj[hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hSWrites to the data register. May have side-effects (a STROBE pulse, for instance).h]hSWrites to the data register. May have side-effects (a STROBE pulse, for instance).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id92ah ]h"]h$] descriptionah&]uh1hhj[hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h%read_data, read_status, write_controlh]h%read_data, read_status, write_control}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id93ah ]h"]h$]see alsoah&]uh1hhj[hhhhhMjKubeh}(h]+port-ops-write-data-write-the-data-registerah ]h"]/port->ops->write_data - write the data registerah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h1port->ops->read_status - read the status registerh]h1port->ops->read_status - read the status register}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubj)}(h#include struct parport_operations { ... unsigned char (*read_status) (struct parport *port); ... };h]h#include struct parport_operations { ... unsigned char (*read_status) (struct parport *port); ... };}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h]id94ah ]h"]h$]synopsisah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhMubh)}(h3Reads from the status register. This is a bitmask:h]h3Reads from the status register. This is a bitmask:}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!hhubh bullet_list)}(hhh](h list_item)}(h.PARPORT_STATUS_ERROR (printer fault, "nFault")h]h)}(hjIh]h2PARPORT_STATUS_ERROR (printer fault, “nFault”)}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjGubah}(h]h ]h"]h$]h&]uh1jEhjBhhhhhNubjF)}(h)PARPORT_STATUS_SELECT (on-line, "Select")h]h)}(hj`h]h-PARPORT_STATUS_SELECT (on-line, “Select”)}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj^ubah}(h]h ]h"]h$]h&]uh1jEhjBhhhhhNubjF)}(h,PARPORT_STATUS_PAPEROUT (no paper, "PError")h]h)}(hjwh]h0PARPORT_STATUS_PAPEROUT (no paper, “PError”)}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjuubah}(h]h ]h"]h$]h&]uh1jEhjBhhhhhNubjF)}(h&PARPORT_STATUS_ACK (handshake, "nAck")h]h)}(hjh]h*PARPORT_STATUS_ACK (handshake, “nAck”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jEhjBhhhhhNubjF)}(h#PARPORT_STATUS_BUSY (busy, "Busy") h]h)}(h"PARPORT_STATUS_BUSY (busy, "Busy")h]h&PARPORT_STATUS_BUSY (busy, “Busy”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jEhjBhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1j@hhhMhj!hhubh)}(hThere may be other bits set.h]hThere may be other bits set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!hhubeh}(h]id95ah ]h"]h$] descriptionah&]uh1hhjhhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h$read_data, write_data, write_controlh]h$read_data, write_data, write_control}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id96ah ]h"]h$]see alsoah&]uh1hhjhhhhhMjKubeh}(h]-port-ops-read-status-read-the-status-registerah ]h"]1port->ops->read_status - read the status registerah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h3port->ops->read_control - read the control registerh]h3port->ops->read_control - read the control register}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubj)}(h#include struct parport_operations { ... unsigned char (*read_control) (struct parport *port); ... };h]h#include struct parport_operations { ... unsigned char (*read_control) (struct parport *port); ... };}hj* sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubeh}(h]id97ah ]h"]h$]synopsisah&]uh1hhj hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@ hhhhhMubh)}(hReturns the last value written to the control register (either from write_control or frob_control). No port access is performed.h]hReturns the last value written to the control register (either from write_control or frob_control). No port access is performed.}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@ hhubeh}(h]id98ah ]h"]h$] descriptionah&]uh1hhj hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg hhhhhMubh)}(h1read_data, write_data, read_status, write_controlh]h1read_data, write_data, read_status, write_control}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjg hhubeh}(h]id99ah ]h"]h$]see alsoah&]uh1hhj hhhhhMjKubeh}(h]/port-ops-read-control-read-the-control-registerah ]h"]3port->ops->read_control - read the control registerah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h5port->ops->write_control - write the control registerh]h5port->ops->write_control - write the control register}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM ubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubj)}(h#include struct parport_operations { ... void (*write_control) (struct parport *port, unsigned char s); ... };h]h#include struct parport_operations { ... void (*write_control) (struct parport *port, unsigned char s); ... };}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubeh}(h]id100ah ]h"]h$]synopsisah&]uh1hhj hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(h3Writes to the control register. This is a bitmask::h]h2Writes to the control register. This is a bitmask:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj)}(hX _______ - PARPORT_CONTROL_STROBE (nStrobe) _______ - PARPORT_CONTROL_AUTOFD (nAutoFd) _____ - PARPORT_CONTROL_INIT (nInit) _________ - PARPORT_CONTROL_SELECT (nSelectIn)h]hX _______ - PARPORT_CONTROL_STROBE (nStrobe) _______ - PARPORT_CONTROL_AUTOFD (nAutoFd) _____ - PARPORT_CONTROL_INIT (nInit) _________ - PARPORT_CONTROL_SELECT (nSelectIn)}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubeh}(h]id101ah ]h"]h$] descriptionah&]uh1hhj hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhM)ubh)}(h0read_data, write_data, read_status, frob_controlh]h0read_data, write_data, read_status, frob_control}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hj!hhubeh}(h]id102ah ]h"]h$]see alsoah&]uh1hhj hhhhhM)jKubeh}(h]1port-ops-write-control-write-the-control-registerah ]h"]5port->ops->write_control - write the control registerah$]h&]uh1hhjhhhhhM ubh)}(hhh](h)}(h5port->ops->frob_control - write control register bitsh]h5port->ops->frob_control - write control register bits}(hj5!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2!hhhhhM1ubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjF!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC!hhhhhM4ubj)}(h#include struct parport_operations { ... unsigned char (*frob_control) (struct parport *port, unsigned char mask, unsigned char val); ... };h]h#include struct parport_operations { ... unsigned char (*frob_control) (struct parport *port, unsigned char mask, unsigned char val); ... };}hjT!sbah}(h]h ]h"]h$]h&]jjuh1jhhhM8hjC!hhubeh}(h]id103ah ]h"]h$]synopsisah&]uh1hhj2!hhhhhM4jKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjm!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjj!hhhhhMCubh)}(hThis 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.h]hThis 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.}(hj{!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMEhjj!hhubh)}(hAs 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.h]hAs 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.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMIhjj!hhubeh}(h]id104ah ]h"]h$] descriptionah&]uh1hhj2!hhhhhMCjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhMNubh)}(h1read_data, write_data, read_status, write_controlh]h1read_data, write_data, read_status, write_control}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhj!hhubeh}(h]id105ah ]h"]h$]see alsoah&]uh1hhj2!hhhhhMNjKubeh}(h]1port-ops-frob-control-write-control-register-bitsah ]h"]5port->ops->frob_control - write control register bitsah$]h&]uh1hhjhhhhhM1ubh)}(hhh](h)}(h3port->ops->enable_irq - enable interrupt generationh]h3port->ops->enable_irq - enable interrupt generation}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhMVubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhMYubj)}(h#include struct parport_operations { ... void (*enable_irq) (struct parport *port); ... };h]h#include struct parport_operations { ... void (*enable_irq) (struct parport *port); ... };}hj!sbah}(h]h ]h"]h$]h&]jjuh1jhhhM]hj!hhubeh}(h]id106ah ]h"]h$]synopsisah&]uh1hhj!hhhhhMYjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj "hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhMfubh)}(hThe 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.h]hThe 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.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhj"hhubeh}(h]id107ah ]h"]h$] descriptionah&]uh1hhj!hhhhhMfjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj0"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-"hhhhhMnubh)}(h disable_irqh]h disable_irq}(hj>"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMphj-"hhubeh}(h]id108ah ]h"]h$]see alsoah&]uh1hhj!hhhhhMnjKubeh}(h]/port-ops-enable-irq-enable-interrupt-generationah ]h"]3port->ops->enable_irq - enable interrupt generationah$]h&]uh1hhjhhhhhMVubh)}(hhh](h)}(h5port->ops->disable_irq - disable interrupt generationh]h5port->ops->disable_irq - disable interrupt generation}(hj_"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\"hhhhhMvubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjp"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm"hhhhhMyubj)}(h#include struct parport_operations { ... void (*disable_irq) (struct parport *port); ... };h]h#include struct parport_operations { ... void (*disable_irq) (struct parport *port); ... };}hj~"sbah}(h]h ]h"]h$]h&]jjuh1jhhhM}hjm"hhubeh}(h]id109ah ]h"]h$]synopsisah&]uh1hhj\"hhhhhMyjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhMubh)}(hhThe parallel port hardware is instructed not to generate interrupts. The interrupt itself is not masked.h]hhThe parallel port hardware is instructed not to generate interrupts. The interrupt itself is not masked.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"hhubeh}(h]id110ah ]h"]h$] descriptionah&]uh1hhj\"hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhMubh)}(h enable_irqh]h enable_irq}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"hhubeh}(h]id111ah ]h"]h$]see alsoah&]uh1hhj\"hhhhhMjKubeh}(h]1port-ops-disable-irq-disable-interrupt-generationah ]h"]5port->ops->disable_irq - disable interrupt generationah$]h&]uh1hhjhhhhhMvubh)}(hhh](h)}(h-port->ops->data_forward - enable data driversh]h-port->ops->data_forward - enable data drivers}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhMubj)}(h#include struct parport_operations { ... void (*data_forward) (struct parport *port); ... };h]h#include struct parport_operations { ... void (*data_forward) (struct parport *port); ... };}hj #sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj"hhubeh}(h]id112ah ]h"]h$]synopsisah&]uh1hhj"hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj%#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"#hhhhhMubh)}(hKEnables the data line drivers, for 8-bit host-to-peripheral communications.h]hKEnables the data line drivers, for 8-bit host-to-peripheral communications.}(hj3#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"#hhubeh}(h]id113ah ]h"]h$] descriptionah&]uh1hhj"hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjL#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjI#hhhhhMubh)}(h data_reverseh]h data_reverse}(hjZ#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjI#hhubeh}(h]id114ah ]h"]h$]see alsoah&]uh1hhj"hhhhhMjKubeh}(h])port-ops-data-forward-enable-data-driversah ]h"]-port->ops->data_forward - enable data driversah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h-port->ops->data_reverse - tristate the bufferh]h-port->ops->data_reverse - tristate the buffer}(hj{#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx#hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hhhhhMubj)}(h#include struct parport_operations { ... void (*data_reverse) (struct parport *port); ... };h]h#include struct parport_operations { ... void (*data_reverse) (struct parport *port); ... };}hj#sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj#hhubeh}(h]id115ah ]h"]h$]synopsisah&]uh1hhjx#hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hhhhhMubh)}(hdPlaces the data bus in a high impedance state, if port->modes has the PARPORT_MODE_TRISTATE bit set.h]hdPlaces the data bus in a high impedance state, if port->modes has the PARPORT_MODE_TRISTATE bit set.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubeh}(h]id116ah ]h"]h$] descriptionah&]uh1hhjx#hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hhhhhMubh)}(h data_forwardh]h data_forward}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubeh}(h]id117ah ]h"]h$]see alsoah&]uh1hhjx#hhhhhMjKubeh}(h])port-ops-data-reverse-tristate-the-bufferah ]h"]-port->ops->data_reverse - tristate the bufferah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h*port->ops->epp_write_data - write EPP datah]h*port->ops->epp_write_data - write EPP data}(hj $hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hhhhhMubj)}(h#include struct parport_operations { ... size_t (*epp_write_data) (struct parport *port, const void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*epp_write_data) (struct parport *port, const void *buf, size_t len, int flags); ... };}hj($sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj$hhubeh}(h]id118ah ]h"]h$]synopsisah&]uh1hhj$hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjA$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>$hhhhhMubh)}(hAWrites data in EPP mode, and returns the number of bytes written.h]hAWrites data in EPP mode, and returns the number of bytes written.}(hjO$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj>$hhubh)}(hTThe ``flags`` parameter may be one or more of the following, bitwise-or'ed together:h](hThe }(hj]$hhhNhNubj/)}(h ``flags``h]hflags}(hje$hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj]$ubhI parameter may be one or more of the following, bitwise-or’ed together:}(hj]$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj>$hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj$ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK1uh1jhj$ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hPARPORT_EPP_FASTh]hPARPORT_EPP_FAST}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hhh]h)}(hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.h]hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]colsKuh1jhj}$ubah}(h]h ]h"]h$]h&]uh1jhj>$hhhhhNubeh}(h]id119ah ]h"]h$] descriptionah&]uh1hhj$hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hhhhhMubh)}(h,epp_read_data, epp_write_addr, epp_read_addrh]h,epp_read_data, epp_write_addr, epp_read_addr}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$hhubeh}(h]id120ah ]h"]h$]see alsoah&]uh1hhj$hhhhhMjKubeh}(h]&port-ops-epp-write-data-write-epp-dataah ]h"]*port->ops->epp_write_data - write epp dataah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h(port->ops->epp_read_data - read EPP datah]h(port->ops->epp_read_data - read EPP data}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj/%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,%hhhhhMubj)}(h#include struct parport_operations { ... size_t (*epp_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*epp_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };}hj=%sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj,%hhubeh}(h]id121ah ]h"]h$]synopsisah&]uh1hhj%hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjV%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS%hhhhhMubh)}(h=Reads data in EPP mode, and returns the number of bytes read.h]h=Reads data in EPP mode, and returns the number of bytes read.}(hjd%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjS%hhubh)}(hTThe ``flags`` parameter may be one or more of the following, bitwise-or'ed together:h](hThe }(hjr%hhhNhNubj/)}(h ``flags``h]hflags}(hjz%hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjr%ubhI parameter may be one or more of the following, bitwise-or’ed together:}(hjr%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM hjS%hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj%ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK1uh1jhj%ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hPARPORT_EPP_FASTh]hPARPORT_EPP_FAST}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh]h)}(hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.h]hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]colsKuh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhjS%hhhhhNubeh}(h]id122ah ]h"]h$] descriptionah&]uh1hhj%hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hhhhhMubh)}(h-epp_write_data, epp_write_addr, epp_read_addrh]h-epp_write_data, epp_write_addr, epp_read_addr}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj&hhubeh}(h]id123ah ]h"]h$]see alsoah&]uh1hhj%hhhhhMjKubeh}(h]$port-ops-epp-read-data-read-epp-dataah ]h"](port->ops->epp_read_data - read epp dataah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h-port->ops->epp_write_addr - write EPP addressh]h-port->ops->epp_write_addr - write EPP address}(hj3&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0&hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjD&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjA&hhhhhMubj)}(h#include struct parport_operations { ... size_t (*epp_write_addr) (struct parport *port, const void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*epp_write_addr) (struct parport *port, const void *buf, size_t len, int flags); ... };}hjR&sbah}(h]h ]h"]h$]h&]jjuh1jhhhM#hjA&hhubeh}(h]id124ah ]h"]h$]synopsisah&]uh1hhj0&hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjk&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh&hhhhhM-ubh)}(hCWrites EPP addresses (8 bits each), and returns the number written.h]hCWrites EPP addresses (8 bits each), and returns the number written.}(hjy&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM/hjh&hhubh)}(hTThe ``flags`` parameter may be one or more of the following, bitwise-or'ed together:h](hThe }(hj&hhhNhNubj/)}(h ``flags``h]hflags}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj&ubhI parameter may be one or more of the following, bitwise-or’ed together:}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM1hjh&hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj&ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK1uh1jhj&ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hPARPORT_EPP_FASTh]hPARPORT_EPP_FAST}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.h]hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]colsKuh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhjh&hhhhhNubh)}(h5(Does PARPORT_EPP_FAST make sense for this function?)h]h5(Does PARPORT_EPP_FAST make sense for this function?)}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hjh&hhubeh}(h]id125ah ]h"]h$] descriptionah&]uh1hhj0&hhhhhM-jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj''hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$'hhhhhM=ubh)}(h,epp_write_data, epp_read_data, epp_read_addrh]h,epp_write_data, epp_read_data, epp_read_addr}(hj5'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hj$'hhubeh}(h]id126ah ]h"]h$]see alsoah&]uh1hhj0&hhhhhM=jKubeh}(h])port-ops-epp-write-addr-write-epp-addressah ]h"]-port->ops->epp_write_addr - write epp addressah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h+port->ops->epp_read_addr - read EPP addressh]h+port->ops->epp_read_addr - read EPP address}(hjV'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS'hhhhhMEubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjg'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjd'hhhhhMHubj)}(h#include struct parport_operations { ... size_t (*epp_read_addr) (struct parport *port, void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*epp_read_addr) (struct parport *port, void *buf, size_t len, int flags); ... };}hju'sbah}(h]h ]h"]h$]h&]jjuh1jhhhMLhjd'hhubeh}(h]id127ah ]h"]h$]synopsisah&]uh1hhjS'hhhhhMHjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hhhhhMVubh)}(h?Reads EPP addresses (8 bits each), and returns the number read.h]h?Reads EPP addresses (8 bits each), and returns the number read.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj'hhubh)}(hTThe ``flags`` parameter may be one or more of the following, bitwise-or'ed together:h](hThe }(hj'hhhNhNubj/)}(h ``flags``h]hflags}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj'ubhI parameter may be one or more of the following, bitwise-or’ed together:}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMZhj'hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj'ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK1uh1jhj'ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hPARPORT_EPP_FASTh]hPARPORT_EPP_FAST}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM^hj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.h]hUse fast transfers. Some chips provide 16-bit and 32-bit registers. However, if a transfer times out, the return value may be unreliable.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM^hj(ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]colsKuh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhj'hhhhhNubh)}(h5(Does PARPORT_EPP_FAST make sense for this function?)h]h5(Does PARPORT_EPP_FAST make sense for this function?)}(hj1(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMchj'hhubeh}(h]id128ah ]h"]h$] descriptionah&]uh1hhjS'hhhhhMVjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjJ(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG(hhhhhMfubh)}(h-epp_write_data, epp_read_data, epp_write_addrh]h-epp_write_data, epp_read_data, epp_write_addr}(hjX(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhjG(hhubeh}(h]id129ah ]h"]h$]see alsoah&]uh1hhjS'hhhhhMfjKubeh}(h]'port-ops-epp-read-addr-read-epp-addressah ]h"]+port->ops->epp_read_addr - read epp addressah$]h&]uh1hhjhhhhhMEubh)}(hhh](h)}(h5port->ops->ecp_write_data - write a block of ECP datah]h5port->ops->ecp_write_data - write a block of ECP data}(hjy(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv(hhhhhMnubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhMqubj)}(h#include struct parport_operations { ... size_t (*ecp_write_data) (struct parport *port, const void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*ecp_write_data) (struct parport *port, const void *buf, size_t len, int flags); ... };}hj(sbah}(h]h ]h"]h$]h&]jjuh1jhhhMuhj(hhubeh}(h]id130ah ]h"]h$]synopsisah&]uh1hhjv(hhhhhMqjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhMubh)}(h@Writes a block of ECP data. The ``flags`` parameter is ignored.h](h!Writes a block of ECP data. The }(hj(hhhNhNubj/)}(h ``flags``h]hflags}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj(ubh parameter is ignored.}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj(hhubeh}(h]id131ah ]h"]h$] descriptionah&]uh1hhjv(hhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhMubh)}(hThe number of bytes written.h]hThe number of bytes written.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(hhubeh}(h]id132ah ]h"]h$] return valueah&]uh1hhjv(hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hhhhhMubh)}(hecp_read_data, ecp_write_addrh]hecp_read_data, ecp_write_addr}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)hhubeh}(h]id133ah ]h"]h$]see alsoah&]uh1hhjv(hhhhhMjKubeh}(h]1port-ops-ecp-write-data-write-a-block-of-ecp-dataah ]h"]5port->ops->ecp_write_data - write a block of ecp dataah$]h&]uh1hhjhhhhhMnubh)}(hhh](h)}(h3port->ops->ecp_read_data - read a block of ECP datah]h3port->ops->ecp_read_data - read a block of ECP data}(hj@)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=)hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hjQ)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN)hhhhhMubj)}(h#include struct parport_operations { ... size_t (*ecp_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*ecp_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };}hj_)sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjN)hhubeh}(h]id134ah ]h"]h$]synopsisah&]uh1hhj=)hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hjx)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhju)hhhhhMubh)}(h?Reads a block of ECP data. The ``flags`` parameter is ignored.h](h Reads a block of ECP data. The }(hj)hhhNhNubj/)}(h ``flags``h]hflags}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj)ubh parameter is ignored.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhju)hhubeh}(h]id135ah ]h"]h$] descriptionah&]uh1hhj=)hhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hhhhhMubh)}(h}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?h]h}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?}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)hhubeh}(h]id136ah ]h"]h$] return valueah&]uh1hhj=)hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hhhhhMubh)}(hecp_write_block, ecp_write_addrh]hecp_write_block, ecp_write_addr}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)hhubeh}(h]id137ah ]h"]h$]see alsoah&]uh1hhj=)hhhhhMjKubeh}(h]/port-ops-ecp-read-data-read-a-block-of-ecp-dataah ]h"]3port->ops->ecp_read_data - read a block of ecp dataah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h:port->ops->ecp_write_addr - write a block of ECP addressesh]h:port->ops->ecp_write_addr - write a block of ECP addresses}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hhhhhMubj)}(h#include struct parport_operations { ... size_t (*ecp_write_addr) (struct parport *port, const void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*ecp_write_addr) (struct parport *port, const void *buf, size_t len, int flags); ... };}hj&*sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj*hhubeh}(h]id138ah ]h"]h$]synopsisah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj?*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<*hhhhhMubh)}(hEWrites a block of ECP addresses. The ``flags`` parameter is ignored.h](h&Writes a block of ECP addresses. The }(hjM*hhhNhNubj/)}(h ``flags``h]hflags}(hjU*hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjM*ubh parameter is ignored.}(hjM*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj<*hhubeh}(h]id139ah ]h"]h$] descriptionah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjx*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhju*hhhhhMubh)}(hThe number of bytes written.h]hThe number of bytes written.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhju*hhubeh}(h]id140ah ]h"]h$] return valueah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(hNOTESh]hNOTES}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hhhhhMubh)}(hHThis may use a FIFO, and if so shall not return until the FIFO is empty.h]hHThis may use a FIFO, and if so shall not return until the FIFO is empty.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj*hhubeh}(h]id141ah ]h"]h$]notesah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hhhhhMubh)}(hecp_read_data, ecp_write_datah]hecp_read_data, ecp_write_data}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj*hhubeh}(h]id142ah ]h"]h$]see alsoah&]uh1hhj*hhhhhMjKubeh}(h]6port-ops-ecp-write-addr-write-a-block-of-ecp-addressesah ]h"]:port->ops->ecp_write_addr - write a block of ecp addressesah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hAport->ops->nibble_read_data - read a block of data in nibble modeh]hAport->ops->nibble_read_data - read a block of data in nibble mode}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhMubj)}(h#include struct parport_operations { ... size_t (*nibble_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*nibble_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };}hj+sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj+hhubeh}(h]id143ah ]h"]h$]synopsisah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj-+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*+hhhhhMubh)}(hJReads a block of data in nibble mode. The ``flags`` parameter is ignored.h](h+Reads a block of data in nibble mode. The }(hj;+hhhNhNubj/)}(h ``flags``h]hflags}(hjC+hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj;+ubh parameter is ignored.}(hj;+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj*+hhubeh}(h]id144ah ]h"]h$] descriptionah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hjf+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc+hhhhhMubh)}(hThe number of whole bytes read.h]hThe number of whole bytes read.}(hjt+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjc+hhubeh}(h]id145ah ]h"]h$] return valueah&]uh1hhj*hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhMubh)}(h!byte_read_data, compat_write_datah]h!byte_read_data, compat_write_data}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj+hhubeh}(h]id146ah ]h"]h$]see alsoah&]uh1hhj*hhhhhMjKubeh}(h]=port-ops-nibble-read-data-read-a-block-of-data-in-nibble-modeah ]h"]Aport->ops->nibble_read_data - read a block of data in nibble modeah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h=port->ops->byte_read_data - read a block of data in byte modeh]h=port->ops->byte_read_data - read a block of data in byte mode}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhMubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhMubj)}(h#include struct parport_operations { ... size_t (*byte_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*byte_read_data) (struct parport *port, void *buf, size_t len, int flags); ... };}hj+sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj+hhubeh}(h]id147ah ]h"]h$]synopsisah&]uh1hhj+hhhhhMjKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhMubh)}(hHReads a block of data in byte mode. The ``flags`` parameter is ignored.h](h)Reads a block of data in byte mode. The }(hj,hhhNhNubj/)}(h ``flags``h]hflags}(hj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj,ubh parameter is ignored.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj+hhubeh}(h]id148ah ]h"]h$] descriptionah&]uh1hhj+hhhhhMjKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj-,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*,hhhhhMubh)}(hThe number of bytes read.h]hThe number of bytes read.}(hj;,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj*,hhubeh}(h]id149ah ]h"]h$] return valueah&]uh1hhj+hhhhhMjKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hjT,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ,hhhhhMubh)}(h#nibble_read_data, compat_write_datah]h#nibble_read_data, compat_write_data}(hjb,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjQ,hhubeh}(h]id150ah ]h"]h$]see alsoah&]uh1hhj+hhhhhMjKubeh}(h]9port-ops-byte-read-data-read-a-block-of-data-in-byte-modeah ]h"]=port->ops->byte_read_data - read a block of data in byte modeah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hJport->ops->compat_write_data - write a block of data in compatibility modeh]hJport->ops->compat_write_data - write a block of data in compatibility mode}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhM!ubh)}(hhh](h)}(hSYNOPSISh]hSYNOPSIS}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhM$ubj)}(h#include struct parport_operations { ... size_t (*compat_write_data) (struct parport *port, const void *buf, size_t len, int flags); ... };h]h#include struct parport_operations { ... size_t (*compat_write_data) (struct parport *port, const void *buf, size_t len, int flags); ... };}hj,sbah}(h]h ]h"]h$]h&]jjuh1jhhhM(hj,hhubeh}(h]id151ah ]h"]h$]synopsisah&]uh1hhj,hhhhhM$jKubh)}(hhh](h)}(h DESCRIPTIONh]h DESCRIPTION}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhM2ubh)}(hRWrites a block of data in compatibility mode. The ``flags`` parameter is ignored.h](h3Writes a block of data in compatibility mode. The }(hj,hhhNhNubj/)}(h ``flags``h]hflags}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj,ubh parameter is ignored.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM4hj,hhubeh}(h]id152ah ]h"]h$] descriptionah&]uh1hhj,hhhhhM2jKubh)}(hhh](h)}(h RETURN VALUEh]h RETURN VALUE}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhM8ubh)}(hThe number of bytes written.h]hThe number of bytes written.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hj,hhubeh}(h]id153ah ]h"]h$] return valueah&]uh1hhj,hhhhhM8jKubh)}(hhh](h)}(hSEE ALSOh]hSEE ALSO}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hhhhhM=ubh)}(h nibble_read_data, byte_read_datah]h nibble_read_data, byte_read_data}(hj)-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hj-hhubeh}(h]id154ah ]h"]h$]see alsoah&]uh1hhj,hhhhhM=jKubeh}(h]Fport-ops-compat-write-data-write-a-block-of-data-in-compatibility-modeah ]h"]Jport->ops->compat_write_data - write a block of data in compatibility modeah$]h&]uh1hhjhhhhhM!ubeh}(h]port-functionsah ]h"]port functionsah$]h&]uh1hhhhhhhhMubeh}(h]parport-interface-documentationah ]h"]parport interface documentationah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjy-error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jT-jQ-jjjFjCsynopsisN descriptionN return valueNerrorsNexampleNsee alsoNjjjgjdnotesNj j jk jh jjjjjdjajjjZjWjjj(j%jjjjjGjDjjjjjjjjjjjjjL-jI-jXjUjjj j j j j/!j,!j!j!jY"jV"j"j"ju#jr#j$j$j%j%j-&j*&jP'jM'js(jp(j:)j7)j*j)j*j*j+j+j},jz,jD-jA-u nametypes}(jT-jjFj-j-j-j-j-j-jjgj-j jk jjjdjjZjj(jjjGjjjjjjjL-jXjj j j/!j!jY"j"ju#j$j%j-&jP'js(j:)j*j*j+j},jD-uh}(jQ-hjjjCjjjjj jjjjjjj;jjjIj{jZjjjjjjjdjj,j jj2jjjjjjj5jj\j;j jjjj{j jj! j jH j' jo jN j ju jh j j j j9 j j` j? jjn j j j j jR j j jX j j jjj9jjrj?jjxjjjajjjj]jjjcj2jjYj8jjgjjxjjjjjjjWjjjj<jj(jBjOj.jj]jjnjjjjj%jjjj jjjjjjj+j]j<jjcjjjjjjjjj9jj`j?jjfjDjjjjjjjj<jjjJj|j[jjjjjjj jj1jjj7jjjjjjjjj6jjj<jjjjjjj!jjHj'j}jNjjjjjjj jj2jjgj8jjmjjjjjjjjjqj"jjwjI-jjUjjjj&jjMj,jj[jjljjjjj jjjjj!jjj j j: j ja j@ j jg j,!j j j j j j$!j!j!j2!jd!jC!j!jj!j!j!jV"j!j"j!j'"j"jN"j-"j"j\"j"jm"j"j"j"j"jr#j"j#j"jC#j"#jj#jI#j$jx#j#j#j#j#j#j#j%j$j8$j$j$j>$j %j$j*&j%jM%j,%j%jS%j"&j&jM'j0&jb&jA&j'jh&jE'j$'jp(jS'j'jd'jA(j'jh(jG(j7)jv(j(j(j(j(j)j(j/)j)j)j=)jo)jN)j)ju)j)j)j)j)j*j*j6*j*jo*j<*j*ju*j*j*j*j*j+j*j$+j+j]+j*+j+jc+j+j+jz,j+j+j+j$,j+jK,j*,jr,jQ,jA-j,j,j,j,j,j-j,j9-j-u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j-KsRparse_messages](hsystem_message)}(hhh]h)}(h`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.h]hdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubah}(h]h ]h"]h$]h&]levelKtypeINFOlineK!sourcehuh1j-hj$ubj-)}(hhh]h)}(h`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.h]hdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]levelKtypej-lineK/sourcehuh1j-hjpubj-)}(hhh]h)}(h`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.h]hdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]levelKtypej-lineK5sourcehuh1j-hjubj-)}(hhh]h)}(h`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.h]hdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.}(hj9.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6.ubah}(h]h ]h"]h$]h&]levelKtypej-lineK:sourcehuh1j-hjubj-)}(hhh]h)}(h`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.h]hdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.}(hjT.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ.ubah}(h]h ]h"]h$]h&]levelKtypej-lineK?sourcehuh1j-hjubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjo.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjl.ubah}(h]h ]h"]h$]h&]j{alevelKtypej-sourcehlineKuh1j-hjZhhhhhKubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h*Duplicate implicit target name: "example".h]h.Duplicate implicit target name: “example”.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM uh1j-hjhhhhhM ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]j,alevelKtypej-sourcehlineM(uh1j-hj hhhhhM(ubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM1uh1j-hj2hhhhhM1ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM:uh1j-hjhhhhhM:ubj-)}(hhh]h)}(h)Duplicate implicit target name: "errors".h]h-Duplicate implicit target name: “errors”.}(hj,/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)/ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM@uh1j-hjhhhhhM@ubj-)}(hhh]h)}(h*Duplicate implicit target name: "example".h]h.Duplicate implicit target name: “example”.}(hjG/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjD/ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMFuh1j-hjhhhhhMFubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjb/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_/ubah}(h]h ]h"]h$]h&]j\alevelKtypej-sourcehlineM`uh1j-hj;hhhhhM`ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj}/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjz/ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMjuh1j-hj{hhhhhMjubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineM}uh1j-hjhhhhhM}ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ubah}(h]h ]h"]h$]h&]j! alevelKtypej-sourcehlineMuh1j-hj hhhhhMubj-)}(hhh]h)}(h)Duplicate implicit target name: "errors".h]h-Duplicate implicit target name: “errors”.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ubah}(h]h ]h"]h$]h&]jH alevelKtypej-sourcehlineMuh1j-hj' hhhhhMubj-)}(hhh]h)}(h*Duplicate implicit target name: "example".h]h.Duplicate implicit target name: “example”.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ubah}(h]h ]h"]h$]h&]jo alevelKtypej-sourcehlineMuh1j-hjN hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hju hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hj hhhhhMubj-)}(hhh]h)}(h*Duplicate implicit target name: "example".h]h.Duplicate implicit target name: “example”.}(hj:0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj70ubah}(h]h ]h"]h$]h&]j9 alevelKtypej-sourcehlineM uh1j-hj hhhhhM ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjU0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjR0ubah}(h]h ]h"]h$]h&]j` alevelKtypej-sourcehlineMuh1j-hj? hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjp0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm0ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hj hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineM)uh1j-hj hhhhhM)ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]jR alevelKtypej-sourcehlineM3uh1j-hj hhhhhM3ubj-)}(hhh]h)}(h)Duplicate implicit target name: "errors".h]h-Duplicate implicit target name: “errors”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineM<uh1j-hjX hhhhhM<ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMDuh1j-hj hhhhhMDubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0ubah}(h]h ]h"]h$]h&]j9alevelKtypej-sourcehlineMNuh1j-hjhhhhhMNubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]jralevelKtypej-sourcehlineMWuh1j-hj?hhhhhMWubj-)}(hhh]h)}(h*Duplicate implicit target name: "example".h]h.Duplicate implicit target name: “example”.}(hj-1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*1ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM^uh1j-hjxhhhhhM^ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjH1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjE1ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMnuh1j-hjhhhhhMnubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjc1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`1ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMxuh1j-hjhhhhhMxubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj~1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{1ubah}(h]h ]h"]h$]h&]j]alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjchhhhhMubj-)}(hhh]h)}(h)Duplicate implicit target name: "errors".h]h-Duplicate implicit target name: “errors”.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]j2alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]jYalevelKtypej-sourcehlineMuh1j-hj8hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjxhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj;2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj82ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjV2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS2ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hjq2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjn2ubah}(h]h ]h"]h$]h&]j<alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]j(alevelKtypej-sourcehlineMuh1j-hjBhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jOalevelKtypej-sourcehlineMuh1j-hj.hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjnhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM uh1j-hjhhhhhM ubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj.3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+3ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hjI3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjF3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjd3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhja3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM"uh1j-hjhhhhhM"ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|3ubah}(h]h ]h"]h$]h&]j]alevelKtypej-sourcehlineM,uh1j-hj<hhhhhM,ubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM5uh1j-hjchhhhhM5ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM;uh1j-hjhhhhhM;ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM@uh1j-hjhhhhhM@ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMJuh1j-hjhhhhhMJubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]j9alevelKtypej-sourcehlineMSuh1j-hjhhhhhMSubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj!4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]j`alevelKtypej-sourcehlineMYuh1j-hj?hhhhhMYubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj<4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj94ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM^uh1j-hjfhhhhhM^ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjW4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjT4ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMiuh1j-hjhhhhhMiubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hjr4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjo4ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMwuh1j-hjhhhhhMwubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM}uh1j-hjhhhhhM}ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]j<alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]j|alevelKtypej-sourcehlineMuh1j-hj[hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj/5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,5ubah}(h]h ]h"]h$]h&]j1alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hjJ5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG5ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hj7hhhhhMubj-)}(hhh]h)}(h(Duplicate implicit target name: "notes".h]h,Duplicate implicit target name: “notes”.}(hje5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb5ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}5ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5ubah}(h]h ]h"]h$]h&]j6alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hj<hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj"6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]j!alevelKtypej-sourcehlineM uh1j-hjhhhhhM ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj=6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:6ubah}(h]h ]h"]h$]h&]jHalevelKtypej-sourcehlineMuh1j-hj'hhhhhMubj-)}(hhh]h)}(h(Duplicate implicit target name: "notes".h]h,Duplicate implicit target name: “notes”.}(hjX6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU6ubah}(h]h ]h"]h$]h&]j}alevelKtypej-sourcehlineMuh1j-hjNhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjs6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjp6ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM!uh1j-hjhhhhhM!ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM+uh1j-hjhhhhhM+ubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineM4uh1j-hjhhhhhM4ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]j2alevelKtypej-sourcehlineM:uh1j-hjhhhhhM:ubj-)}(hhh]h)}(h(Duplicate implicit target name: "notes".h]h,Duplicate implicit target name: “notes”.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]jgalevelKtypej-sourcehlineM@uh1j-hj8hhhhhM@ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMKuh1j-hjmhhhhhMKubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMVuh1j-hjhhhhhMVubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj07hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-7ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineM_uh1j-hjhhhhhM_ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hjK7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjH7ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMeuh1j-hjhhhhhMeubj-)}(hhh]h)}(h(Duplicate implicit target name: "notes".h]h,Duplicate implicit target name: “notes”.}(hjf7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc7ubah}(h]h ]h"]h$]h&]jqalevelKtypej-sourcehlineMjuh1j-hj"hhhhhMjubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~7ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMzuh1j-hjwhhhhhMzubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubah}(h]h ]h"]h$]h&]j&alevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubah}(h]h ]h"]h$]h&]jMalevelKtypej-sourcehlineMuh1j-hj,hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjlhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj#8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 8ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj>8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;8ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hjY8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV8ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hj!hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjt8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq8ubah}(h]h ]h"]h$]h&]jalevelKtypej-sourcehlineMuh1j-hjhhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8ubah}(h]h ]h"]h$]h&]j: alevelKtypej-sourcehlineMuh1j-hj )DhhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8ubah}(h]h ]h"]h$]h&]ja alevelKtypej-sourcehlineMuh1j-hj@ hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hjg hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hj hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8ubah}(h]h ]h"]h$]h&]j alevelKtypej-sourcehlineMuh1j-hj hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9ubah}(h]h ]h"]h$]h&]j$!alevelKtypej-sourcehlineM)uh1j-hj!hhhhhM)ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj19hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.9ubah}(h]h ]h"]h$]h&]jd!alevelKtypej-sourcehlineM4uh1j-hjC!hhhhhM4ubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hjL9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjI9ubah}(h]h ]h"]h$]h&]j!alevelKtypej-sourcehlineMCuh1j-hjj!hhhhhMCubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjg9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjd9ubah}(h]h ]h"]h$]h&]j!alevelKtypej-sourcehlineMNuh1j-hj!hhhhhMNubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9ubah}(h]h ]h"]h$]h&]j"alevelKtypej-sourcehlineMYuh1j-hj!hhhhhMYubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9ubah}(h]h ]h"]h$]h&]j'"alevelKtypej-sourcehlineMfuh1j-hj"hhhhhMfubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9ubah}(h]h ]h"]h$]h&]jN"alevelKtypej-sourcehlineMnuh1j-hj-"hhhhhMnubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9ubah}(h]h ]h"]h$]h&]j"alevelKtypej-sourcehlineMyuh1j-hjm"hhhhhMyubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9ubah}(h]h ]h"]h$]h&]j"alevelKtypej-sourcehlineMuh1j-hj"hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj :hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubah}(h]h ]h"]h$]h&]j"alevelKtypej-sourcehlineMuh1j-hj"hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj$:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!:ubah}(h]h ]h"]h$]h&]j#alevelKtypej-sourcehlineMuh1j-hj"hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj?:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<:ubah}(h]h ]h"]h$]h&]jC#alevelKtypej-sourcehlineMuh1j-hj"#hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjZ:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjW:ubah}(h]h ]h"]h$]h&]jj#alevelKtypej-sourcehlineMuh1j-hjI#hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hju:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjr:ubah}(h]h ]h"]h$]h&]j#alevelKtypej-sourcehlineMuh1j-hj#hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubah}(h]h ]h"]h$]h&]j#alevelKtypej-sourcehlineMuh1j-hj#hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubah}(h]h ]h"]h$]h&]j#alevelKtypej-sourcehlineMuh1j-hj#hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubah}(h]h ]h"]h$]h&]j8$alevelKtypej-sourcehlineMuh1j-hj$hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubah}(h]h ]h"]h$]h&]j$alevelKtypej-sourcehlineMuh1j-hj>$hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubah}(h]h ]h"]h$]h&]j %alevelKtypej-sourcehlineMuh1j-hj$hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;ubah}(h]h ]h"]h$]h&]jM%alevelKtypej-sourcehlineMuh1j-hj,%hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj2;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/;ubah}(h]h ]h"]h$]h&]j%alevelKtypej-sourcehlineMuh1j-hjS%hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjM;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ;ubah}(h]h ]h"]h$]h&]j"&alevelKtypej-sourcehlineMuh1j-hj&hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjh;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhje;ubah}(h]h ]h"]h$]h&]jb&alevelKtypej-sourcehlineMuh1j-hjA&hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;ubah}(h]h ]h"]h$]h&]j'alevelKtypej-sourcehlineM-uh1j-hjh&hhhhhM-ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;ubah}(h]h ]h"]h$]h&]jE'alevelKtypej-sourcehlineM=uh1j-hj$'hhhhhM=ubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;ubah}(h]h ]h"]h$]h&]j'alevelKtypej-sourcehlineMHuh1j-hjd'hhhhhMHubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;ubah}(h]h ]h"]h$]h&]jA(alevelKtypej-sourcehlineMVuh1j-hj'hhhhhMVubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;ubah}(h]h ]h"]h$]h&]jh(alevelKtypej-sourcehlineMfuh1j-hjG(hhhhhMfubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj <hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]j(alevelKtypej-sourcehlineMquh1j-hj(hhhhhMqubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj%<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"<ubah}(h]h ]h"]h$]h&]j(alevelKtypej-sourcehlineMuh1j-hj(hhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj@<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=<ubah}(h]h ]h"]h$]h&]j)alevelKtypej-sourcehlineMuh1j-hj(hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj[<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX<ubah}(h]h ]h"]h$]h&]j/)alevelKtypej-sourcehlineMuh1j-hj)hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjv<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs<ubah}(h]h ]h"]h$]h&]jo)alevelKtypej-sourcehlineMuh1j-hjN)hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]j)alevelKtypej-sourcehlineMuh1j-hju)hhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]j)alevelKtypej-sourcehlineMuh1j-hj)hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]j)alevelKtypej-sourcehlineMuh1j-hj)hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]j6*alevelKtypej-sourcehlineMuh1j-hj*hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubah}(h]h ]h"]h$]h&]jo*alevelKtypej-sourcehlineMuh1j-hj<*hhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubah}(h]h ]h"]h$]h&]j*alevelKtypej-sourcehlineMuh1j-hju*hhhhhMubj-)}(hhh]h)}(h(Duplicate implicit target name: "notes".h]h,Duplicate implicit target name: “notes”.}(hj3=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0=ubah}(h]h ]h"]h$]h&]j*alevelKtypej-sourcehlineMuh1j-hj*hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hjN=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK=ubah}(h]h ]h"]h$]h&]j*alevelKtypej-sourcehlineMuh1j-hj*hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hji=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjf=ubah}(h]h ]h"]h$]h&]j$+alevelKtypej-sourcehlineMuh1j-hj+hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubah}(h]h ]h"]h$]h&]j]+alevelKtypej-sourcehlineMuh1j-hj*+hhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubah}(h]h ]h"]h$]h&]j+alevelKtypej-sourcehlineMuh1j-hjc+hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubah}(h]h ]h"]h$]h&]j+alevelKtypej-sourcehlineMuh1j-hj+hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubah}(h]h ]h"]h$]h&]j+alevelKtypej-sourcehlineMuh1j-hj+hhhhhMubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubah}(h]h ]h"]h$]h&]j$,alevelKtypej-sourcehlineMuh1j-hj+hhhhhMubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>ubah}(h]h ]h"]h$]h&]jK,alevelKtypej-sourcehlineMuh1j-hj*,hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj&>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#>ubah}(h]h ]h"]h$]h&]jr,alevelKtypej-sourcehlineMuh1j-hjQ,hhhhhMubj-)}(hhh]h)}(h+Duplicate implicit target name: "synopsis".h]h/Duplicate implicit target name: “synopsis”.}(hjA>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>>ubah}(h]h ]h"]h$]h&]j,alevelKtypej-sourcehlineM$uh1j-hj,hhhhhM$ubj-)}(hhh]h)}(h.Duplicate implicit target name: "description".h]h2Duplicate implicit target name: “description”.}(hj\>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjY>ubah}(h]h ]h"]h$]h&]j,alevelKtypej-sourcehlineM2uh1j-hj,hhhhhM2ubj-)}(hhh]h)}(h/Duplicate implicit target name: "return value".h]h3Duplicate implicit target name: “return value”.}(hjw>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjt>ubah}(h]h ]h"]h$]h&]j-alevelKtypej-sourcehlineM8uh1j-hj,hhhhhM8ubj-)}(hhh]h)}(h+Duplicate implicit target name: "see also".h]h/Duplicate implicit target name: “see also”.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>ubah}(h]h ]h"]h$]h&]j9-alevelKtypej-sourcehlineM=uh1j-hj-hhhhhM=ubetransform_messages] transformerN include_log] decorationNhhub.