bpp.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:31k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/sbus/char/bpp.c
  3.  *
  4.  * Copyright (c) 1995 Picture Elements
  5.  *      Stephen Williams (steve@icarus.com)
  6.  *      Gus Baldauf (gbaldauf@ix.netcom.com)
  7.  *
  8.  * Linux/SPARC port by Peter Zaitcev.
  9.  * Integration into SPARC tree by Tom Dyas.
  10.  */
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/version.h>
  14. #include <linux/fs.h>
  15. #include <linux/errno.h>
  16. #include <linux/sched.h>
  17. #include <linux/smp_lock.h>
  18. #include <linux/spinlock.h>
  19. #include <linux/timer.h>
  20. #include <linux/ioport.h>
  21. #include <linux/major.h>
  22. #include <linux/devfs_fs_kernel.h>
  23. #include <asm/uaccess.h>
  24. #include <asm/io.h>
  25. #if defined(__i386__)
  26. # include <asm/system.h>
  27. # include <asm/segment.h>
  28. #endif
  29. #if defined(__sparc__)
  30. # include <linux/init.h>
  31. # include <linux/delay.h>         /* udelay() */
  32. # include <asm/oplib.h>           /* OpenProm Library */
  33. # include <asm/sbus.h>
  34. #endif
  35. #include <asm/bpp.h>
  36. #define BPP_PROBE_CODE 0x55
  37. #define BPP_DELAY 100
  38. static const unsigned  BPP_MAJOR = LP_MAJOR;
  39. static const char* dev_name = "bpp";
  40. /* When switching from compatibility to a mode where I can read, try
  41.    the following mode first. */
  42. /* const unsigned char DEFAULT_ECP = 0x10; */
  43. static const unsigned char DEFAULT_ECP = 0x30;
  44. static const unsigned char DEFAULT_NIBBLE = 0x00;
  45. /*
  46.  * These are 1284 time constraints, in units of jiffies.
  47.  */
  48. static const unsigned long TIME_PSetup = 1;
  49. static const unsigned long TIME_PResponse = 6;
  50. static const unsigned long TIME_IDLE_LIMIT = 2000;
  51. /*
  52.  * One instance per supported subdevice...
  53.  */
  54. # define BPP_NO 3
  55. enum IEEE_Mode { COMPATIBILITY, NIBBLE, ECP, ECP_RLE, EPP };
  56. struct inst {
  57.       unsigned present  : 1; /* True if the hardware exists */
  58.       unsigned enhanced : 1; /* True if the hardware in "enhanced" */
  59.       unsigned opened   : 1; /* True if the device is opened already */
  60.       unsigned run_flag : 1; /* True if waiting for a repeate byte */
  61.       unsigned char direction; /* 0 --> out, 0x20 --> IN */
  62.       unsigned char pp_state; /* State of host controlled pins. */
  63.       enum IEEE_Mode mode;
  64.       unsigned char run_length;
  65.       unsigned char repeat_byte;
  66.       /* These members manage timeouts for programmed delays */
  67.       wait_queue_head_t wait_queue;
  68.       struct timer_list timer_list;
  69. };
  70. static struct inst instances[BPP_NO];
  71. #if defined(__i386__)
  72. const unsigned short base_addrs[BPP_NO] = { 0x278, 0x378, 0x3bc };
  73. /*
  74.  * These are for data access.
  75.  * Control lines accesses are hidden in set_bits() and get_bits().
  76.  * The exeption is the probe procedure, which is system-dependent.
  77.  */
  78. #define bpp_outb_p(data, base)  outb_p((data), (base))
  79. #define bpp_inb(base)  inb(base)
  80. #define bpp_inb_p(base)  inb_p(base)
  81. /*
  82.  * This method takes the pin values mask and sets the hardware pins to
  83.  * the requested value: 1 == high voltage, 0 == low voltage. This
  84.  * burries the annoying PC bit inversion and preserves the direction
  85.  * flag.
  86.  */
  87. static void set_pins(unsigned short pins, unsigned minor)
  88. {
  89.       unsigned char bits = instances[minor].direction;  /* == 0x20 */
  90.       if (! (pins & BPP_PP_nStrobe))   bits |= 1;
  91.       if (! (pins & BPP_PP_nAutoFd))   bits |= 2;
  92.       if (   pins & BPP_PP_nInit)      bits |= 4;
  93.       if (! (pins & BPP_PP_nSelectIn)) bits |= 8;
  94.       instances[minor].pp_state = bits;
  95.       outb_p(bits, base_addrs[minor]+2);
  96. }
  97. static unsigned short get_pins(unsigned minor)
  98. {
  99.       unsigned short bits = 0;
  100.       unsigned value = instances[minor].pp_state;
  101.       if (! (value & 0x01)) bits |= BPP_PP_nStrobe;
  102.       if (! (value & 0x02)) bits |= BPP_PP_nAutoFd;
  103.       if (value & 0x04)     bits |= BPP_PP_nInit;
  104.       if (! (value & 0x08)) bits |= BPP_PP_nSelectIn;
  105.       value = inb_p(base_addrs[minor]+1);
  106.       if (value & 0x08)     bits |= BPP_GP_nFault;
  107.       if (value & 0x10)     bits |= BPP_GP_Select;
  108.       if (value & 0x20)     bits |= BPP_GP_PError;
  109.       if (value & 0x40)     bits |= BPP_GP_nAck;
  110.       if (! (value & 0x80)) bits |= BPP_GP_Busy;
  111.       return bits;
  112. }
  113. #endif /* __i386__ */
  114. #if defined(__sparc__)
  115. /*
  116.  * Register block
  117.  */
  118.       /* DMA registers */
  119. #define BPP_CSR      0x00
  120. #define BPP_ADDR     0x04
  121. #define BPP_BCNT     0x08
  122. #define BPP_TST_CSR  0x0C
  123.       /* Parallel Port registers */
  124. #define BPP_HCR      0x10
  125. #define BPP_OCR      0x12
  126. #define BPP_DR       0x14
  127. #define BPP_TCR      0x15
  128. #define BPP_OR       0x16
  129. #define BPP_IR       0x17
  130. #define BPP_ICR      0x18
  131. #define BPP_SIZE     0x1A
  132. /* BPP_CSR.  Bits of type RW1 are cleared with writting '1'. */
  133. #define P_DEV_ID_MASK   0xf0000000      /* R   */
  134. #define P_DEV_ID_ZEBRA  0x40000000
  135. #define P_DEV_ID_L64854 0xa0000000      /*      == NCR 89C100+89C105. Pity. */
  136. #define P_NA_LOADED     0x08000000      /* R    NA wirtten but was not used */
  137. #define P_A_LOADED      0x04000000      /* R    */
  138. #define P_DMA_ON        0x02000000      /* R    DMA is not disabled */
  139. #define P_EN_NEXT       0x01000000      /* RW   */
  140. #define P_TCI_DIS       0x00800000      /* RW   TCI forbidden from interrupts */
  141. #define P_DIAG          0x00100000      /* RW   Disables draining and resetting
  142.                                                 of P-FIFO on loading of P_ADDR*/
  143. #define P_BURST_SIZE    0x000c0000      /* RW   SBus burst size */
  144. #define P_BURST_8       0x00000000
  145. #define P_BURST_4       0x00040000
  146. #define P_BURST_1       0x00080000      /*      "No burst" write */
  147. #define P_TC            0x00004000      /* RW1  Term Count, can be cleared when
  148.                                            P_EN_NEXT=1 */
  149. #define P_EN_CNT        0x00002000      /* RW   */
  150. #define P_EN_DMA        0x00000200      /* RW   */
  151. #define P_WRITE         0x00000100      /* R    DMA dir, 1=to ram, 0=to port */
  152. #define P_RESET         0x00000080      /* RW   */
  153. #define P_SLAVE_ERR     0x00000040      /* RW1  Access size error */
  154. #define P_INVALIDATE    0x00000020      /* W    Drop P-FIFO */
  155. #define P_INT_EN        0x00000010      /* RW   OK to P_INT_PEND||P_ERR_PEND */
  156. #define P_DRAINING      0x0000000c      /* R    P-FIFO is draining to memory */
  157. #define P_ERR_PEND      0x00000002      /* R    */
  158. #define P_INT_PEND      0x00000001      /* R    */
  159. /* BPP_HCR. Time is in increments of SBus clock. */
  160. #define P_HCR_TEST      0x8000      /* Allows buried counters to be read */
  161. #define P_HCR_DSW       0x7f00      /* Data strobe width (in ticks) */
  162. #define P_HCR_DDS       0x007f      /* Data setup before strobe (in ticks) */
  163. /* BPP_OCR. */
  164. #define P_OCR_MEM_CLR   0x8000
  165. #define P_OCR_DATA_SRC  0x4000      /* )                  */
  166. #define P_OCR_DS_DSEL   0x2000      /* )  Bidirectional      */
  167. #define P_OCR_BUSY_DSEL 0x1000      /* )    selects            */
  168. #define P_OCR_ACK_DSEL  0x0800      /* )                  */
  169. #define P_OCR_EN_DIAG   0x0400
  170. #define P_OCR_BUSY_OP   0x0200      /* Busy operation */
  171. #define P_OCR_ACK_OP    0x0100      /* Ack operation */
  172. #define P_OCR_SRST      0x0080      /* Reset state machines. Not selfcleaning. */
  173. #define P_OCR_IDLE      0x0008      /* PP data transfer state machine is idle */
  174. #define P_OCR_V_ILCK    0x0002      /* Versatec faded. Zebra only. */
  175. #define P_OCR_EN_VER    0x0001      /* Enable Versatec (0 - enable). Zebra only. */
  176. /* BPP_TCR */
  177. #define P_TCR_DIR       0x08
  178. #define P_TCR_BUSY      0x04
  179. #define P_TCR_ACK       0x02
  180. #define P_TCR_DS        0x01        /* Strobe */
  181. /* BPP_OR */
  182. #define P_OR_V3         0x20        /* )                 */
  183. #define P_OR_V2         0x10        /* ) on Zebra only   */
  184. #define P_OR_V1         0x08        /* )                 */
  185. #define P_OR_INIT       0x04
  186. #define P_OR_AFXN       0x02        /* Auto Feed */
  187. #define P_OR_SLCT_IN    0x01
  188. /* BPP_IR */
  189. #define P_IR_PE         0x04
  190. #define P_IR_SLCT       0x02
  191. #define P_IR_ERR        0x01
  192. /* BPP_ICR */
  193. #define P_DS_IRQ        0x8000      /* RW1  */
  194. #define P_ACK_IRQ       0x4000      /* RW1  */
  195. #define P_BUSY_IRQ      0x2000      /* RW1  */
  196. #define P_PE_IRQ        0x1000      /* RW1  */
  197. #define P_SLCT_IRQ      0x0800      /* RW1  */
  198. #define P_ERR_IRQ       0x0400      /* RW1  */
  199. #define P_DS_IRQ_EN     0x0200      /* RW   Always on rising edge */
  200. #define P_ACK_IRQ_EN    0x0100      /* RW   Always on rising edge */
  201. #define P_BUSY_IRP      0x0080      /* RW   1= rising edge */
  202. #define P_BUSY_IRQ_EN   0x0040      /* RW   */
  203. #define P_PE_IRP        0x0020      /* RW   1= rising edge */
  204. #define P_PE_IRQ_EN     0x0010      /* RW   */
  205. #define P_SLCT_IRP      0x0008      /* RW   1= rising edge */
  206. #define P_SLCT_IRQ_EN   0x0004      /* RW   */
  207. #define P_ERR_IRP       0x0002      /* RW1  1= rising edge */
  208. #define P_ERR_IRQ_EN    0x0001      /* RW   */
  209. unsigned long base_addrs[BPP_NO];
  210. #define bpp_outb_p(data, base) sbus_writeb(data, (base) + BPP_DR)
  211. #define bpp_inb_p(base) sbus_readb((base) + BPP_DR)
  212. #define bpp_inb(base) sbus_readb((base) + BPP_DR)
  213. static void set_pins(unsigned short pins, unsigned minor)
  214. {
  215.       unsigned long base = base_addrs[minor];
  216.       unsigned char bits_tcr = 0, bits_or = 0;
  217.       if (instances[minor].direction & 0x20) bits_tcr |= P_TCR_DIR;
  218.       if (   pins & BPP_PP_nStrobe)          bits_tcr |= P_TCR_DS;
  219.       if (   pins & BPP_PP_nAutoFd)          bits_or |= P_OR_AFXN;
  220.       if (! (pins & BPP_PP_nInit))           bits_or |= P_OR_INIT;
  221.       if (! (pins & BPP_PP_nSelectIn))       bits_or |= P_OR_SLCT_IN;
  222.       sbus_writeb(bits_or, base + BPP_OR);
  223.       sbus_writeb(bits_tcr, base + BPP_TCR);
  224. }
  225. /*
  226.  * i386 people read output pins from a software image.
  227.  * We may get them back from hardware.
  228.  * Again, inversion of pins must he buried here.
  229.  */
  230. static unsigned short get_pins(unsigned minor)
  231. {
  232.       unsigned long base = base_addrs[minor];
  233.       unsigned short bits = 0;
  234.       unsigned value_tcr = sbus_readb(base + BPP_TCR);
  235.       unsigned value_ir = sbus_readb(base + BPP_IR);
  236.       unsigned value_or = sbus_readb(base + BPP_OR);
  237.       if (value_tcr & P_TCR_DS)         bits |= BPP_PP_nStrobe;
  238.       if (value_or & P_OR_AFXN)         bits |= BPP_PP_nAutoFd;
  239.       if (! (value_or & P_OR_INIT))     bits |= BPP_PP_nInit;
  240.       if (! (value_or & P_OR_SLCT_IN))  bits |= BPP_PP_nSelectIn;
  241.       if (value_ir & P_IR_ERR)          bits |= BPP_GP_nFault;
  242.       if (! (value_ir & P_IR_SLCT))     bits |= BPP_GP_Select;
  243.       if (! (value_ir & P_IR_PE))       bits |= BPP_GP_PError;
  244.       if (! (value_tcr & P_TCR_ACK))    bits |= BPP_GP_nAck;
  245.       if (value_tcr & P_TCR_BUSY)       bits |= BPP_GP_Busy;
  246.       return bits;
  247. }
  248. #endif /* __sparc__ */
  249. static void bpp_wake_up(unsigned long val)
  250. { wake_up(&instances[val].wait_queue); }
  251. static void snooze(unsigned long snooze_time, unsigned minor)
  252. {
  253.       instances[minor].timer_list.expires = jiffies + snooze_time + 1;
  254.       instances[minor].timer_list.data    = minor;
  255.       add_timer(&instances[minor].timer_list);
  256.       sleep_on (&instances[minor].wait_queue);
  257. }
  258. static int wait_for(unsigned short set, unsigned short clr,
  259.                unsigned long delay, unsigned minor)
  260. {
  261.       unsigned short pins = get_pins(minor);
  262.       unsigned long extime = 0;
  263.       /*
  264.        * Try a real fast scan for the first jiffy, in case the device
  265.        * responds real good. The first while loop guesses an expire
  266.        * time accounting for possible wraparound of jiffies.
  267.        */
  268.       while (time_after_eq(jiffies, extime)) extime = jiffies + 1;
  269.       while ( (time_before(jiffies, extime))
  270.               && (((pins & set) != set) || ((pins & clr) != 0)) ) {
  271.             pins = get_pins(minor);
  272.       }
  273.       delay -= 1;
  274.       /*
  275.        * If my delay expired or the pins are still not where I want
  276.        * them, then resort to using the timer and greatly reduce my
  277.        * sample rate. If the peripheral is going to be slow, this will
  278.        * give the CPU up to some more worthy process.
  279.        */
  280.       while ( delay && (((pins & set) != set) || ((pins & clr) != 0)) ) {
  281.             snooze(1, minor);
  282.             pins = get_pins(minor);
  283.             delay -= 1;
  284.       }
  285.       if (delay == 0) return -1;
  286.       else return pins;
  287. }
  288. /*
  289.  * Return ZERO(0) If the negotiation succeeds, an errno otherwise. An
  290.  * errno means something broke, and I do not yet know how to fix it.
  291.  */
  292. static int negotiate(unsigned char mode, unsigned minor)
  293. {
  294.       int rc;
  295.       unsigned short pins = get_pins(minor);
  296.       if (pins & BPP_PP_nSelectIn) return -EIO;
  297.         /* Event 0: Write the mode to the data lines */
  298.       bpp_outb_p(mode, base_addrs[minor]);
  299.       snooze(TIME_PSetup, minor);
  300.         /* Event 1: Strobe the mode code into the peripheral */
  301.       set_pins(BPP_PP_nSelectIn|BPP_PP_nStrobe|BPP_PP_nInit, minor);
  302.         /* Wait for Event 2: Peripheral responds as a 1284 device. */
  303.       rc = wait_for(BPP_GP_PError|BPP_GP_Select|BPP_GP_nFault,
  304.                 BPP_GP_nAck,
  305.                 TIME_PResponse,
  306.                 minor);
  307.       if (rc == -1) return -ETIMEDOUT;
  308.         /* Event 3: latch extensibility request */
  309.       set_pins(BPP_PP_nSelectIn|BPP_PP_nInit, minor);
  310.         /* ... quick nap while peripheral ponders the byte i'm sending...*/
  311.       snooze(1, minor);
  312.         /* Event 4: restore strobe, to ACK peripheral's response. */
  313.       set_pins(BPP_PP_nSelectIn|BPP_PP_nAutoFd|BPP_PP_nStrobe|BPP_PP_nInit, minor);
  314.         /* Wait for Event 6: Peripheral latches response bits */
  315.       rc = wait_for(BPP_GP_nAck, 0, TIME_PSetup+TIME_PResponse, minor);
  316.       if (rc == -1) return -EIO;
  317.         /* A 1284 device cannot refuse nibble mode */
  318.       if (mode == DEFAULT_NIBBLE) return 0;
  319.       if (pins & BPP_GP_Select) return 0;
  320.       return -EPROTONOSUPPORT;
  321. }
  322. static int terminate(unsigned minor)
  323. {
  324.       int rc;
  325.         /* Event 22: Request termination of 1284 mode */
  326.       set_pins(BPP_PP_nAutoFd|BPP_PP_nStrobe|BPP_PP_nInit, minor);
  327.         /* Wait for Events 23 and 24: ACK termination request. */
  328.       rc = wait_for(BPP_GP_Busy|BPP_GP_nFault,
  329.                 BPP_GP_nAck,
  330.                 TIME_PSetup+TIME_PResponse,
  331.                 minor);
  332.       instances[minor].direction = 0;
  333.       instances[minor].mode = COMPATIBILITY;
  334.       if (rc == -1) {
  335.           return -EIO;
  336.       }
  337.         /* Event 25: Handshake by lowering nAutoFd */
  338.       set_pins(BPP_PP_nStrobe|BPP_PP_nInit, minor);
  339.         /* Event 26: Peripheral wiggles lines... */
  340.         /* Event 27: Peripheral sets nAck HIGH to ack handshake */
  341.       rc = wait_for(BPP_GP_nAck, 0, TIME_PResponse, minor);
  342.       if (rc == -1) {
  343.           set_pins(BPP_PP_nAutoFd|BPP_PP_nStrobe|BPP_PP_nInit, minor);
  344.           return -EIO;
  345.       }
  346.         /* Event 28: Finish phase by raising nAutoFd */
  347.       set_pins(BPP_PP_nAutoFd|BPP_PP_nStrobe|BPP_PP_nInit, minor);
  348.       return 0;
  349. }
  350. static spinlock_t bpp_open_lock = SPIN_LOCK_UNLOCKED;
  351. /*
  352.  * Allow only one process to open the device at a time.
  353.  */
  354. static int bpp_open(struct inode *inode, struct file *f)
  355. {
  356.       unsigned minor = MINOR(inode->i_rdev);
  357.       int ret;
  358.       spin_lock(&bpp_open_lock);
  359.       ret = 0;
  360.       if (minor >= BPP_NO) {
  361.       ret = -ENODEV;
  362.       } else {
  363.       if (! instances[minor].present) {
  364.       ret = -ENODEV;
  365.       } else {
  366.       if (instances[minor].opened) 
  367.       ret = -EBUSY;
  368.       else
  369.       instances[minor].opened = 1;
  370.       }
  371.       }
  372.       spin_unlock(&bpp_open_lock);
  373.       return ret;
  374. }
  375. /*
  376.  * When the process closes the device, this method is called to clean
  377.  * up and reset the hardware. Always leave the device in compatibility
  378.  * mode as this is a reasonable place to clean up from messes made by
  379.  * ioctls, or other mayhem.
  380.  */
  381. static int bpp_release(struct inode *inode, struct file *f)
  382. {
  383.       unsigned minor = MINOR(inode->i_rdev);
  384.       spin_lock(&bpp_open_lock);
  385.       instances[minor].opened = 0;
  386.       if (instances[minor].mode != COMPATIBILITY)
  387.       terminate(minor);
  388.       spin_unlock(&bpp_open_lock);
  389.       return 0;
  390. }
  391. static long read_nibble(unsigned minor, char *c, unsigned long cnt)
  392. {
  393.       unsigned long remaining = cnt;
  394.       long rc;
  395.       while (remaining > 0) {
  396.           unsigned char byte = 0;
  397.           int pins;
  398.           /* Event 7: request nibble */
  399.           set_pins(BPP_PP_nSelectIn|BPP_PP_nStrobe, minor);
  400.           /* Wait for event 9: Peripher strobes first nibble */
  401.           pins = wait_for(0, BPP_GP_nAck, TIME_IDLE_LIMIT, minor);
  402.           if (pins == -1) return -ETIMEDOUT;
  403.           /* Event 10: I handshake nibble */
  404.           set_pins(BPP_PP_nSelectIn|BPP_PP_nStrobe|BPP_PP_nAutoFd, minor);
  405.           if (pins & BPP_GP_nFault) byte |= 0x01;
  406.           if (pins & BPP_GP_Select) byte |= 0x02;
  407.           if (pins & BPP_GP_PError) byte |= 0x04;
  408.           if (pins & BPP_GP_Busy)   byte |= 0x08;
  409.           /* Wait for event 11: Peripheral handshakes nibble */
  410.           rc = wait_for(BPP_GP_nAck, 0, TIME_PResponse, minor);
  411.           /* Event 7: request nibble */
  412.           set_pins(BPP_PP_nSelectIn|BPP_PP_nStrobe, minor);
  413.           /* Wait for event 9: Peripher strobes first nibble */
  414.           pins = wait_for(0, BPP_GP_nAck, TIME_PResponse, minor);
  415.           if (rc == -1) return -ETIMEDOUT;
  416.           /* Event 10: I handshake nibble */
  417.           set_pins(BPP_PP_nSelectIn|BPP_PP_nStrobe|BPP_PP_nAutoFd, minor);
  418.           if (pins & BPP_GP_nFault) byte |= 0x10;
  419.           if (pins & BPP_GP_Select) byte |= 0x20;
  420.           if (pins & BPP_GP_PError) byte |= 0x40;
  421.           if (pins & BPP_GP_Busy)   byte |= 0x80;
  422.           if (put_user(byte, c))
  423.   return -EFAULT;
  424.           c += 1;
  425.           remaining -= 1;
  426.           /* Wait for event 11: Peripheral handshakes nibble */
  427.           rc = wait_for(BPP_GP_nAck, 0, TIME_PResponse, minor);
  428.           if (rc == -1) return -EIO;
  429.       }
  430.       return cnt - remaining;
  431. }
  432. static long read_ecp(unsigned minor, char *c, unsigned long cnt)
  433. {
  434.       unsigned long remaining;
  435.       long rc;
  436.         /* Turn ECP mode from forward to reverse if needed. */
  437.       if (! instances[minor].direction) {
  438.           unsigned short pins = get_pins(minor);
  439.             /* Event 38: Turn the bus around */
  440.           instances[minor].direction = 0x20;
  441.           pins &= ~BPP_PP_nAutoFd;
  442.           set_pins(pins, minor);
  443.             /* Event 39: Set pins for reverse mode. */
  444.           snooze(TIME_PSetup, minor);
  445.           set_pins(BPP_PP_nStrobe|BPP_PP_nSelectIn, minor);
  446.             /* Wait for event 40: Peripheral ready to be strobed */
  447.           rc = wait_for(0, BPP_GP_PError, TIME_PResponse, minor);
  448.           if (rc == -1) return -ETIMEDOUT;
  449.       }
  450.       remaining = cnt;
  451.       while (remaining > 0) {
  452.             /* If there is a run length for a repeated byte, repeat */
  453.             /* that byte a few times. */
  454.           if (instances[minor].run_length && !instances[minor].run_flag) {
  455.               char buffer[128];
  456.               unsigned idx;
  457.               unsigned repeat = remaining < instances[minor].run_length
  458.                                      ? remaining
  459.                                : instances[minor].run_length;
  460.               for (idx = 0 ;  idx < repeat ;  idx += 1)
  461.                 buffer[idx] = instances[minor].repeat_byte;
  462.               if (copy_to_user(c, buffer, repeat))
  463.       return -EFAULT;
  464.               remaining -= repeat;
  465.               c += repeat;
  466.               instances[minor].run_length -= repeat;
  467.           }
  468.           if (remaining == 0) break;
  469.             /* Wait for Event 43: Data active on the bus. */
  470.           rc = wait_for(0, BPP_GP_nAck, TIME_IDLE_LIMIT, minor);
  471.           if (rc == -1) break;
  472.           if (rc & BPP_GP_Busy) {
  473.                 /* OK, this is data. read it in. */
  474.               unsigned char byte = bpp_inb(base_addrs[minor]);
  475.               if (put_user(byte, c))
  476.       return -EFAULT;
  477.               c += 1;
  478.               remaining -= 1;
  479.               if (instances[minor].run_flag) {
  480.                   instances[minor].repeat_byte = byte;
  481.                   instances[minor].run_flag = 0;
  482.               }
  483.           } else {
  484.               unsigned char byte = bpp_inb(base_addrs[minor]);
  485.               if (byte & 0x80) {
  486.                   printk("bpp%d: "
  487.                          "Ignoring ECP channel %u from device.n",
  488.                          minor, byte & 0x7f);
  489.               } else {
  490.                   instances[minor].run_length = byte;
  491.                   instances[minor].run_flag = 1;
  492.               }
  493.           }
  494.             /* Event 44: I got it. */
  495.           set_pins(BPP_PP_nStrobe|BPP_PP_nAutoFd|BPP_PP_nSelectIn, minor);
  496.             /* Wait for event 45: peripheral handshake */
  497.           rc = wait_for(BPP_GP_nAck, 0, TIME_PResponse, minor);
  498.           if (rc == -1) return -ETIMEDOUT;
  499.              /* Event 46: Finish handshake */
  500.           set_pins(BPP_PP_nStrobe|BPP_PP_nSelectIn, minor);
  501.       }
  502.       return cnt - remaining;
  503. }
  504. static ssize_t bpp_read(struct file *f, char *c, size_t cnt, loff_t * ppos)
  505. {
  506.       long rc;
  507.       const unsigned minor = MINOR(f->f_dentry->d_inode->i_rdev);
  508.       if (minor >= BPP_NO) return -ENODEV;
  509.       if (!instances[minor].present) return -ENODEV;
  510.       switch (instances[minor].mode) {
  511.         default:
  512.           if (instances[minor].mode != COMPATIBILITY)
  513.             terminate(minor);
  514.           if (instances[minor].enhanced) {
  515.               /* For now, do all reads with ECP-RLE mode */
  516.               unsigned short pins;
  517.               rc = negotiate(DEFAULT_ECP, minor);
  518.               if (rc < 0) break;
  519.               instances[minor].mode = ECP_RLE;
  520.               /* Event 30: set nAutoFd low to setup for ECP mode */
  521.               pins = get_pins(minor);
  522.               pins &= ~BPP_PP_nAutoFd;
  523.               set_pins(pins, minor);
  524.               /* Wait for Event 31: peripheral ready */
  525.               rc = wait_for(BPP_GP_PError, 0, TIME_PResponse, minor);
  526.               if (rc == -1) return -ETIMEDOUT;
  527.               rc = read_ecp(minor, c, cnt);
  528.           } else {
  529.               rc = negotiate(DEFAULT_NIBBLE, minor);
  530.               if (rc < 0) break;
  531.               instances[minor].mode = NIBBLE;
  532.               rc = read_nibble(minor, c, cnt);
  533.           }
  534.           break;
  535.         case NIBBLE:
  536.           rc = read_nibble(minor, c, cnt);
  537.           break;
  538.         case ECP:
  539.         case ECP_RLE:
  540.           rc = read_ecp(minor, c, cnt);
  541.           break;
  542.       }
  543.       return rc;
  544. }
  545. /*
  546.  * Compatibility mode handshaking is a matter of writing data,
  547.  * strobing it, and waiting for the printer to stop being busy.
  548.  */
  549. static long write_compat(unsigned minor, const char *c, unsigned long cnt)
  550. {
  551.       long rc;
  552.       unsigned short pins = get_pins(minor);
  553.       unsigned long remaining = cnt;
  554.       while (remaining > 0) {
  555.             unsigned char byte;
  556.             if (get_user(byte, c))
  557.     return -EFAULT;
  558.             c += 1;
  559.             rc = wait_for(BPP_GP_nAck, BPP_GP_Busy, TIME_IDLE_LIMIT, minor);
  560.             if (rc == -1) return -ETIMEDOUT;
  561.             bpp_outb_p(byte, base_addrs[minor]);
  562.             remaining -= 1;
  563.           /* snooze(1, minor); */
  564.           pins &= ~BPP_PP_nStrobe;
  565.           set_pins(pins, minor);
  566.           rc = wait_for(BPP_GP_Busy, 0, TIME_PResponse, minor);
  567.           pins |= BPP_PP_nStrobe;
  568.           set_pins(pins, minor);
  569.       }
  570.       return cnt - remaining;
  571. }
  572. /*
  573.  * Write data using ECP mode. Watch out that the port may be set up
  574.  * for reading. If so, turn the port around.
  575.  */
  576. static long write_ecp(unsigned minor, const char *c, unsigned long cnt)
  577. {
  578.       unsigned short pins = get_pins(minor);
  579.       unsigned long remaining = cnt;
  580.       if (instances[minor].direction) {
  581.           int rc;
  582.             /* Event 47 Request bus be turned around */
  583.           pins |= BPP_PP_nInit;
  584.           set_pins(pins, minor);
  585.             /* Wait for Event 49: Peripheral relinquished bus */
  586.           rc = wait_for(BPP_GP_PError, 0, TIME_PResponse, minor);
  587.           pins |= BPP_PP_nAutoFd;
  588.           instances[minor].direction = 0;
  589.           set_pins(pins, minor);
  590.       }
  591.       while (remaining > 0) {
  592.           unsigned char byte;
  593.           int rc;
  594.           if (get_user(byte, c))
  595.   return -EFAULT;
  596.           rc = wait_for(0, BPP_GP_Busy, TIME_PResponse, minor);
  597.           if (rc == -1) return -ETIMEDOUT;
  598.           c += 1;
  599.           bpp_outb_p(byte, base_addrs[minor]);
  600.           pins &= ~BPP_PP_nStrobe;
  601.           set_pins(pins, minor);
  602.           pins |= BPP_PP_nStrobe;
  603.           rc = wait_for(BPP_GP_Busy, 0, TIME_PResponse, minor);
  604.           if (rc == -1) return -EIO;
  605.           set_pins(pins, minor);
  606.       }
  607.       return cnt - remaining;
  608. }
  609. /*
  610.  * Write to the peripheral. Be sensitive of the current mode. If I'm
  611.  * in a mode that can be turned around (ECP) then just do
  612.  * that. Otherwise, terminate and do my writing in compat mode. This
  613.  * is the safest course as any device can handle it.
  614.  */
  615. static ssize_t bpp_write(struct file *f, const char *c, size_t cnt, loff_t * ppos)
  616. {
  617.       long errno = 0;
  618.       const unsigned minor = MINOR(f->f_dentry->d_inode->i_rdev);
  619.       if (minor >= BPP_NO) return -ENODEV;
  620.       if (!instances[minor].present) return -ENODEV;
  621.       switch (instances[minor].mode) {
  622.         case ECP:
  623.         case ECP_RLE:
  624.           errno = write_ecp(minor, c, cnt);
  625.           break;
  626.         case COMPATIBILITY:
  627.           errno = write_compat(minor, c, cnt);
  628.           break;
  629.         default:
  630.           terminate(minor);
  631.           errno = write_compat(minor, c, cnt);
  632.       }
  633.       return errno;
  634. }
  635. static int bpp_ioctl(struct inode *inode, struct file *f, unsigned int cmd,
  636.  unsigned long arg)
  637. {
  638.       int errno = 0;
  639.       unsigned minor = MINOR(inode->i_rdev);
  640.       if (minor >= BPP_NO) return -ENODEV;
  641.       if (!instances[minor].present) return -ENODEV;
  642.       switch (cmd) {
  643.         case BPP_PUT_PINS:
  644.           set_pins(arg, minor);
  645.           break;
  646.         case BPP_GET_PINS:
  647.           errno = get_pins(minor);
  648.           break;
  649.         case BPP_PUT_DATA:
  650.           bpp_outb_p(arg, base_addrs[minor]);
  651.           break;
  652.         case BPP_GET_DATA:
  653.           errno = bpp_inb_p(base_addrs[minor]);
  654.           break;
  655.         case BPP_SET_INPUT:
  656.           if (arg)
  657.             if (instances[minor].enhanced) {
  658.                 unsigned short bits = get_pins(minor);
  659.                 instances[minor].direction = 0x20;
  660.                 set_pins(bits, minor);
  661.             } else {
  662.                 errno = -ENOTTY;
  663.             }
  664.           else {
  665.               unsigned short bits = get_pins(minor);
  666.               instances[minor].direction = 0x00;
  667.               set_pins(bits, minor);
  668.           }
  669.           break;
  670.         default:
  671.             errno = -EINVAL;
  672.       }
  673.       return errno;
  674. }
  675. static struct file_operations bpp_fops = {
  676. owner: THIS_MODULE,
  677. read: bpp_read,
  678. write: bpp_write,
  679. ioctl: bpp_ioctl,
  680. open: bpp_open,
  681. release: bpp_release,
  682. };
  683. #if defined(__i386__)
  684. #define collectLptPorts()  {}
  685. static void probeLptPort(unsigned idx)
  686. {
  687.       unsigned int testvalue;
  688.       const unsigned short lpAddr = base_addrs[idx];
  689.       instances[idx].present = 0;
  690.       instances[idx].enhanced = 0;
  691.       instances[idx].direction = 0;
  692.       instances[idx].mode = COMPATIBILITY;
  693.       instances[idx].wait_queue = 0;
  694.       instances[idx].run_length = 0;
  695.       instances[idx].run_flag = 0;
  696.       init_timer(&instances[idx].timer_list);
  697.       instances[idx].timer_list.function = bpp_wake_up;
  698.       if (check_region(lpAddr,3)) return;
  699.       /*
  700.        * First, make sure the instance exists. Do this by writing to
  701.        * the data latch and reading the value back. If the port *is*
  702.        * present, test to see if it supports extended-mode
  703.        * operation. This will be required for IEEE1284 reverse
  704.        * transfers.
  705.        */
  706.       outb_p(BPP_PROBE_CODE, lpAddr);
  707.       for (testvalue=0; testvalue<BPP_DELAY; testvalue++)
  708.             ;
  709.       testvalue = inb_p(lpAddr);
  710.       if (testvalue == BPP_PROBE_CODE) {
  711.             unsigned save;
  712.             instances[idx].present = 1;
  713.             request_region(lpAddr,3, dev_name);
  714.             save = inb_p(lpAddr+2);
  715.             for (testvalue=0; testvalue<BPP_DELAY; testvalue++)
  716.                   ;
  717.             outb_p(save|0x20, lpAddr+2);
  718.             for (testvalue=0; testvalue<BPP_DELAY; testvalue++)
  719.                   ;
  720.             outb_p(~BPP_PROBE_CODE, lpAddr);
  721.             for (testvalue=0; testvalue<BPP_DELAY; testvalue++)
  722.                   ;
  723.             testvalue = inb_p(lpAddr);
  724.             if ((testvalue&0xff) == (0xff&~BPP_PROBE_CODE))
  725.                   instances[idx].enhanced = 0;
  726.             else
  727.                   instances[idx].enhanced = 1;
  728.             outb_p(save, lpAddr+2);
  729.       }
  730.       /*
  731.        * Leave the port in compat idle mode.
  732.        */
  733.       set_pins(BPP_PP_nAutoFd|BPP_PP_nStrobe|BPP_PP_nInit, idx);
  734.       printk("bpp%d: Port at 0x%03x: Enhanced mode %sn", idx, base_addrs[idx],
  735.             instances[idx].enhanced? "SUPPORTED" : "UNAVAILABLE");
  736. }
  737. static inline void freeLptPort(int idx)
  738. {
  739.       release_region(base_addrs[idx], 3);
  740. }
  741. #endif
  742. #if defined(__sparc__)
  743. static unsigned long map_bpp(struct sbus_dev *dev, int idx)
  744. {
  745.       return sbus_ioremap(&dev->resource[0], 0, BPP_SIZE, "bpp");
  746. }
  747. static int collectLptPorts(void)
  748. {
  749. struct sbus_bus *bus;
  750. struct sbus_dev *dev;
  751. int count;
  752. count = 0;
  753. for_all_sbusdev(dev, bus) {
  754. if (strcmp(dev->prom_name, "SUNW,bpp") == 0) {
  755. if (count >= BPP_NO) {
  756. printk(KERN_NOTICE
  757.        "bpp: More than %d bpp ports,"
  758.        " rest is ignoredn", BPP_NO);
  759. return count;
  760. }
  761. base_addrs[count] = map_bpp(dev, count);
  762. count++;
  763. }
  764. }
  765. return count;
  766. }
  767. static void probeLptPort(unsigned idx)
  768. {
  769.       unsigned long rp = base_addrs[idx];
  770.       __u32 csr;
  771.       char *brand;
  772.       instances[idx].present = 0;
  773.       instances[idx].enhanced = 0;
  774.       instances[idx].direction = 0;
  775.       instances[idx].mode = COMPATIBILITY;
  776.       init_waitqueue_head(&instances[idx].wait_queue);
  777.       instances[idx].run_length = 0;
  778.       instances[idx].run_flag = 0;
  779.       init_timer(&instances[idx].timer_list);
  780.       instances[idx].timer_list.function = bpp_wake_up;
  781.       if (rp == 0) return;
  782.       instances[idx].present = 1;
  783.       instances[idx].enhanced = 1;   /* Sure */
  784.       csr = sbus_readl(rp + BPP_CSR);
  785.       if ((csr & P_DRAINING) != 0 && (csr & P_ERR_PEND) == 0) {
  786.             udelay(20);
  787.             csr = sbus_readl(rp + BPP_CSR);
  788.             if ((csr & P_DRAINING) != 0 && (csr & P_ERR_PEND) == 0) {
  789.                   printk("bpp%d: DRAINING still active (0x%08x)n", idx, csr);
  790.             }
  791.       }
  792.       printk("bpp%d: reset with 0x%08x ..", idx, csr);
  793.       sbus_writel((csr | P_RESET) & ~P_INT_EN, rp + BPP_CSR);
  794.       udelay(500);
  795.       sbus_writel(sbus_readl(rp + BPP_CSR) & ~P_RESET, rp + BPP_CSR);
  796.       csr = sbus_readl(rp + BPP_CSR);
  797.       printk(" done with csr=0x%08x ocr=0x%04xn",
  798.          csr, sbus_readw(rp + BPP_OCR));
  799.       switch (csr & P_DEV_ID_MASK) {
  800.       case P_DEV_ID_ZEBRA:
  801.             brand = "Zebra";
  802.             break;
  803.       case P_DEV_ID_L64854:
  804.             brand = "DMA2";
  805.             break;
  806.       default:
  807.             brand = "Unknown";
  808.       }
  809.       printk("bpp%d: %s at 0x%lxn", idx, brand, rp);
  810.       /*
  811.        * Leave the port in compat idle mode.
  812.        */
  813.       set_pins(BPP_PP_nAutoFd|BPP_PP_nStrobe|BPP_PP_nInit, idx);
  814.       return;
  815. }
  816. static inline void freeLptPort(int idx)
  817. {
  818.       sbus_iounmap(base_addrs[idx], BPP_SIZE);
  819. }
  820. #endif
  821. static devfs_handle_t devfs_handle;
  822. static int __init bpp_init(void)
  823. {
  824. int rc;
  825. unsigned idx;
  826. rc = collectLptPorts();
  827. if (rc == 0)
  828. return -ENODEV;
  829. rc = devfs_register_chrdev(BPP_MAJOR, dev_name, &bpp_fops);
  830. if (rc < 0)
  831. return rc;
  832. for (idx = 0; idx < BPP_NO; idx += 1) {
  833. instances[idx].opened = 0;
  834. probeLptPort(idx);
  835. }
  836. devfs_handle = devfs_mk_dir (NULL, "bpp", NULL);
  837. devfs_register_series (devfs_handle, "%u", BPP_NO, DEVFS_FL_DEFAULT,
  838.        BPP_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR,
  839.        &bpp_fops, NULL);
  840. return 0;
  841. }
  842. static void __exit bpp_cleanup(void)
  843. {
  844. unsigned idx;
  845. devfs_unregister (devfs_handle);
  846. devfs_unregister_chrdev(BPP_MAJOR, dev_name);
  847. for (idx = 0 ;  idx < BPP_NO ;  idx += 1) {
  848. if (instances[idx].present)
  849. freeLptPort(idx);
  850. }
  851. }
  852. module_init(bpp_init);
  853. module_exit(bpp_cleanup);