1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * usr/include/linux/lp.h c.1991-1992 James Wiegand 41da177e4SLinus Torvalds * many modifications copyright (C) 1992 Michael K. Johnson 51da177e4SLinus Torvalds * Interrupt support added 1993 Nigel Gamble 61da177e4SLinus Torvalds * Removed 8255 status defines from inside __KERNEL__ Marcelo Tosatti 71da177e4SLinus Torvalds */ 8607ca46eSDavid Howells #ifndef _LINUX_LP_H 9607ca46eSDavid Howells #define _LINUX_LP_H 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include <linux/wait.h> 130a5dcb51SMatthias Kaehlcke #include <linux/mutex.h> 14607ca46eSDavid Howells #include <uapi/linux/lp.h> 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds /* Magic numbers for defining port-device mappings */ 171da177e4SLinus Torvalds #define LP_PARPORT_UNSPEC -4 181da177e4SLinus Torvalds #define LP_PARPORT_AUTO -3 191da177e4SLinus Torvalds #define LP_PARPORT_OFF -2 201da177e4SLinus Torvalds #define LP_PARPORT_NONE -1 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds #define LP_F(minor) lp_table[(minor)].flags /* flags for busy, etc. */ 231da177e4SLinus Torvalds #define LP_CHAR(minor) lp_table[(minor)].chars /* busy timeout */ 241da177e4SLinus Torvalds #define LP_TIME(minor) lp_table[(minor)].time /* wait time */ 251da177e4SLinus Torvalds #define LP_WAIT(minor) lp_table[(minor)].wait /* strobe wait */ 261da177e4SLinus Torvalds #define LP_IRQ(minor) lp_table[(minor)].dev->port->irq /* interrupt # */ 271da177e4SLinus Torvalds /* PARPORT_IRQ_NONE means polled */ 281da177e4SLinus Torvalds #ifdef LP_STATS 291da177e4SLinus Torvalds #define LP_STAT(minor) lp_table[(minor)].stats /* statistics area */ 301da177e4SLinus Torvalds #endif 311da177e4SLinus Torvalds #define LP_BUFFER_SIZE PAGE_SIZE 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds #define LP_BASE(x) lp_table[(x)].dev->port->base 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds #ifdef LP_STATS 361da177e4SLinus Torvalds struct lp_stats { 371da177e4SLinus Torvalds unsigned long chars; 381da177e4SLinus Torvalds unsigned long sleeps; 391da177e4SLinus Torvalds unsigned int maxrun; 401da177e4SLinus Torvalds unsigned int maxwait; 411da177e4SLinus Torvalds unsigned int meanwait; 421da177e4SLinus Torvalds unsigned int mdev; 431da177e4SLinus Torvalds }; 441da177e4SLinus Torvalds #endif 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds struct lp_struct { 471da177e4SLinus Torvalds struct pardevice *dev; 481da177e4SLinus Torvalds unsigned long flags; 491da177e4SLinus Torvalds unsigned int chars; 501da177e4SLinus Torvalds unsigned int time; 511da177e4SLinus Torvalds unsigned int wait; 521da177e4SLinus Torvalds char *lp_buffer; 531da177e4SLinus Torvalds #ifdef LP_STATS 541da177e4SLinus Torvalds unsigned int lastcall; 551da177e4SLinus Torvalds unsigned int runchars; 561da177e4SLinus Torvalds struct lp_stats stats; 571da177e4SLinus Torvalds #endif 581da177e4SLinus Torvalds wait_queue_head_t waitq; 591da177e4SLinus Torvalds unsigned int last_error; 600a5dcb51SMatthias Kaehlcke struct mutex port_mutex; 611da177e4SLinus Torvalds wait_queue_head_t dataq; 621da177e4SLinus Torvalds long timeout; 631da177e4SLinus Torvalds unsigned int best_mode; 641da177e4SLinus Torvalds unsigned int current_mode; 651da177e4SLinus Torvalds unsigned long bits; 661da177e4SLinus Torvalds }; 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds /* 691da177e4SLinus Torvalds * The following constants describe the various signals of the printer port 701da177e4SLinus Torvalds * hardware. Note that the hardware inverts some signals and that some 711da177e4SLinus Torvalds * signals are active low. An example is LP_STROBE, which must be programmed 721da177e4SLinus Torvalds * with 1 for being active and 0 for being inactive, because the strobe signal 731da177e4SLinus Torvalds * gets inverted, but it is also active low. 741da177e4SLinus Torvalds */ 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds /* 781da177e4SLinus Torvalds * defines for 8255 control port 791da177e4SLinus Torvalds * base + 2 801da177e4SLinus Torvalds * accessed with LP_C(minor) 811da177e4SLinus Torvalds */ 821da177e4SLinus Torvalds #define LP_PINTEN 0x10 /* high to read data in or-ed with data out */ 831da177e4SLinus Torvalds #define LP_PSELECP 0x08 /* inverted output, active low */ 841da177e4SLinus Torvalds #define LP_PINITP 0x04 /* unchanged output, active low */ 851da177e4SLinus Torvalds #define LP_PAUTOLF 0x02 /* inverted output, active low */ 861da177e4SLinus Torvalds #define LP_PSTROBE 0x01 /* short high output on raising edge */ 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds /* 891da177e4SLinus Torvalds * the value written to ports to test existence. PC-style ports will 901da177e4SLinus Torvalds * return the value written. AT-style ports will return 0. so why not 911da177e4SLinus Torvalds * make them the same ? 921da177e4SLinus Torvalds */ 931da177e4SLinus Torvalds #define LP_DUMMY 0x00 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds /* 961da177e4SLinus Torvalds * This is the port delay time, in microseconds. 971da177e4SLinus Torvalds * It is used only in the lp_init() and lp_reset() routine. 981da177e4SLinus Torvalds */ 991da177e4SLinus Torvalds #define LP_DELAY 50 1001da177e4SLinus Torvalds 1011da177e4SLinus Torvalds #endif 102