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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __LINUX_PARPORT_GSC_H
  2. #define __LINUX_PARPORT_GSC_H
  3. #include <asm/io.h>
  4. #include <linux/delay.h>
  5. #undef DEBUG_PARPORT /* undefine for production */
  6. #define DELAY_TIME  0
  7. #if DELAY_TIME == 0
  8. #define parport_readb gsc_readb
  9. #define parport_writeb gsc_writeb
  10. #else
  11. static __inline__ unsigned char parport_readb( unsigned long port )
  12. {
  13.     udelay(DELAY_TIME);
  14.     return gsc_readb(port);
  15. }
  16. static __inline__ void parport_writeb( unsigned char value, unsigned long port )
  17. {
  18.     gsc_writeb(value,port);
  19.     udelay(DELAY_TIME);
  20. }
  21. #endif
  22. /* --- register definitions ------------------------------- */
  23. #define EPPDATA(p)  ((p)->base    + 0x4)
  24. #define EPPADDR(p)  ((p)->base    + 0x3)
  25. #define CONTROL(p)  ((p)->base    + 0x2)
  26. #define STATUS(p)   ((p)->base    + 0x1)
  27. #define DATA(p)     ((p)->base    + 0x0)
  28. struct parport_gsc_private {
  29. /* Contents of CTR. */
  30. unsigned char ctr;
  31. /* Bitmask of writable CTR bits. */
  32. unsigned char ctr_writable;
  33. /* Number of bytes per portword. */
  34. int pword;
  35. /* Not used yet. */
  36. int readIntrThreshold;
  37. int writeIntrThreshold;
  38. /* buffer suitable for DMA, if DMA enabled */
  39. char *dma_buf;
  40. dma_addr_t dma_handle;
  41. struct pci_dev *dev;
  42. };
  43. extern __inline__ void parport_gsc_write_data(struct parport *p, unsigned char d)
  44. {
  45. #ifdef DEBUG_PARPORT
  46. printk (KERN_DEBUG "parport_gsc_write_data(%p,0x%02x)n", p, d);
  47. #endif
  48. parport_writeb(d, DATA(p));
  49. }
  50. extern __inline__ unsigned char parport_gsc_read_data(struct parport *p)
  51. {
  52. unsigned char val = parport_readb (DATA (p));
  53. #ifdef DEBUG_PARPORT
  54. printk (KERN_DEBUG "parport_gsc_read_data(%p) = 0x%02xn",
  55. p, val);
  56. #endif
  57. return val;
  58. }
  59. /* __parport_gsc_frob_control differs from parport_gsc_frob_control in that
  60.  * it doesn't do any extra masking. */
  61. static __inline__ unsigned char __parport_gsc_frob_control (struct parport *p,
  62.    unsigned char mask,
  63.    unsigned char val)
  64. {
  65. struct parport_gsc_private *priv = p->physport->private_data;
  66. unsigned char ctr = priv->ctr;
  67. #ifdef DEBUG_PARPORT
  68. printk (KERN_DEBUG
  69. "__parport_gsc_frob_control(%02x,%02x): %02x -> %02xn",
  70. mask, val, ctr, ((ctr & ~mask) ^ val) & priv->ctr_writable);
  71. #endif
  72. ctr = (ctr & ~mask) ^ val;
  73. ctr &= priv->ctr_writable; /* only write writable bits. */
  74. parport_writeb (ctr, CONTROL (p));
  75. priv->ctr = ctr; /* Update soft copy */
  76. return ctr;
  77. }
  78. extern __inline__ void parport_gsc_data_reverse (struct parport *p)
  79. {
  80. __parport_gsc_frob_control (p, 0x20, 0x20);
  81. }
  82. extern __inline__ void parport_gsc_data_forward (struct parport *p)
  83. {
  84. __parport_gsc_frob_control (p, 0x20, 0x00);
  85. }
  86. extern __inline__ void parport_gsc_write_control (struct parport *p,
  87.  unsigned char d)
  88. {
  89. const unsigned char wm = (PARPORT_CONTROL_STROBE |
  90.   PARPORT_CONTROL_AUTOFD |
  91.   PARPORT_CONTROL_INIT |
  92.   PARPORT_CONTROL_SELECT);
  93. /* Take this out when drivers have adapted to newer interface. */
  94. if (d & 0x20) {
  95. printk (KERN_DEBUG "%s (%s): use data_reverse for this!n",
  96. p->name, p->cad->name);
  97. parport_gsc_data_reverse (p);
  98. }
  99. __parport_gsc_frob_control (p, wm, d & wm);
  100. }
  101. extern __inline__ unsigned char parport_gsc_read_control(struct parport *p)
  102. {
  103. const unsigned char rm = (PARPORT_CONTROL_STROBE |
  104.   PARPORT_CONTROL_AUTOFD |
  105.   PARPORT_CONTROL_INIT |
  106.   PARPORT_CONTROL_SELECT);
  107. const struct parport_gsc_private *priv = p->physport->private_data;
  108. return priv->ctr & rm; /* Use soft copy */
  109. }
  110. extern __inline__ unsigned char parport_gsc_frob_control (struct parport *p,
  111.  unsigned char mask,
  112.  unsigned char val)
  113. {
  114. const unsigned char wm = (PARPORT_CONTROL_STROBE |
  115.   PARPORT_CONTROL_AUTOFD |
  116.   PARPORT_CONTROL_INIT |
  117.   PARPORT_CONTROL_SELECT);
  118. /* Take this out when drivers have adapted to newer interface. */
  119. if (mask & 0x20) {
  120. printk (KERN_DEBUG "%s (%s): use data_%s for this!n",
  121. p->name, p->cad->name,
  122. (val & 0x20) ? "reverse" : "forward");
  123. if (val & 0x20)
  124. parport_gsc_data_reverse (p);
  125. else
  126. parport_gsc_data_forward (p);
  127. }
  128. /* Restrict mask and val to control lines. */
  129. mask &= wm;
  130. val &= wm;
  131. return __parport_gsc_frob_control (p, mask, val);
  132. }
  133. extern __inline__ unsigned char parport_gsc_read_status(struct parport *p)
  134. {
  135. return parport_readb (STATUS(p));
  136. }
  137. extern __inline__ void parport_gsc_disable_irq(struct parport *p)
  138. {
  139. __parport_gsc_frob_control (p, 0x10, 0x00);
  140. }
  141. extern __inline__ void parport_gsc_enable_irq(struct parport *p)
  142. {
  143. __parport_gsc_frob_control (p, 0x10, 0x10);
  144. }
  145. extern void parport_gsc_release_resources(struct parport *p);
  146. extern int parport_gsc_claim_resources(struct parport *p);
  147. extern void parport_gsc_init_state(struct pardevice *, struct parport_state *s);
  148. extern void parport_gsc_save_state(struct parport *p, struct parport_state *s);
  149. extern void parport_gsc_restore_state(struct parport *p, struct parport_state *s);
  150. extern void parport_gsc_inc_use_count(void);
  151. extern void parport_gsc_dec_use_count(void);
  152. extern struct parport *parport_gsc_probe_port (unsigned long base,
  153.       unsigned long base_hi,
  154.       int irq, int dma,
  155.       struct pci_dev *dev);
  156. #endif