init.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /***************************************************************************
  2. nec7210/init.c - description
  3. -------------------
  4. board specific initialization stuff
  5. begin : Dec 2001
  6. copyright : (C) 2001, 2002 by Frank Mori Hess
  7. email : fmhess@users.sourceforge.net
  8. ***************************************************************************/
  9. /***************************************************************************
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. ***************************************************************************/
  17. #include "board.h"
  18. #include <linux/ioport.h>
  19. #include <linux/sched.h>
  20. #include <linux/module.h>
  21. #include <linux/slab.h>
  22. #include <asm/dma.h>
  23. #include <linux/pci.h>
  24. #include <linux/pci_ids.h>
  25. #include <linux/string.h>
  26. #include <linux/init.h>
  27. MODULE_LICENSE("GPL");
  28. void nec7210_board_reset( nec7210_private_t *priv, const gpib_board_t *board )
  29. {
  30. /* 7210 chip reset */
  31. write_byte(priv, AUX_CR, AUXMR);
  32. /* disable all interrupts */
  33. priv->reg_bits[ IMR1 ] = 0;
  34. write_byte(priv, priv->reg_bits[ IMR1 ], IMR1);
  35. priv->reg_bits[ IMR2 ] = 0;
  36. write_byte(priv, priv->reg_bits[ IMR2 ], IMR2);
  37. write_byte(priv, 0, SPMR);
  38. /* clear registers by reading */
  39. read_byte(priv, CPTR);
  40. read_byte(priv, ISR1);
  41. read_byte(priv, ISR2);
  42. /* parallel poll unconfigure */
  43. write_byte(priv, PPR | HR_PPU, AUXMR);
  44. priv->reg_bits[ ADMR ] = HR_TRM0 | HR_TRM1;
  45. priv->auxa_bits = AUXRA | HR_HLDA;
  46. write_byte(priv, priv->auxa_bits, AUXMR);
  47. write_byte( priv, AUXRE | 0, AUXMR );
  48. /* set INT pin to active high, enable command pass through of unknown commands */
  49. priv->auxb_bits = AUXRB | HR_CPTE;
  50. write_byte(priv, priv->auxb_bits, AUXMR);
  51. write_byte(priv, AUXRE, AUXMR);
  52. }
  53. void nec7210_board_online( nec7210_private_t *priv, const gpib_board_t *board )
  54. {
  55. /* set GPIB address */
  56. nec7210_primary_address( board, priv, board->pad );
  57. nec7210_secondary_address( board, priv, board->sad, board->sad >= 0 );
  58. // enable interrupts
  59. priv->reg_bits[ IMR1 ] = HR_ERRIE | HR_DECIE | HR_ENDIE |
  60. HR_DETIE | HR_CPTIE | HR_DOIE | HR_DIIE;
  61. priv->reg_bits[ IMR2 ] = IMR2_ENABLE_INTR_MASK;
  62. write_byte( priv, priv->reg_bits[ IMR1 ], IMR1);
  63. write_byte( priv, priv->reg_bits[ IMR2 ], IMR2);
  64. write_byte( priv, AUX_PON, AUXMR);
  65. }
  66. /* wrappers for io */
  67. uint8_t nec7210_ioport_read_byte(nec7210_private_t *priv, unsigned int register_num)
  68. {
  69. return inb((unsigned long)(priv->iobase) + register_num * priv->offset);
  70. }
  71. void nec7210_ioport_write_byte(nec7210_private_t *priv, uint8_t data, unsigned int register_num)
  72. {
  73. if(register_num == AUXMR)
  74. {
  75. /* locking makes absolutely sure noone accesses the
  76. * AUXMR register faster than once per microsecond */
  77. nec7210_locking_ioport_write_byte( priv, data, register_num );
  78. }else
  79. outb(data, (unsigned long)(priv->iobase) + register_num * priv->offset);
  80. }
  81. uint8_t nec7210_iomem_read_byte(nec7210_private_t *priv, unsigned int register_num)
  82. {
  83. return readb(priv->iobase + register_num * priv->offset);
  84. }
  85. void nec7210_iomem_write_byte(nec7210_private_t *priv, uint8_t data, unsigned int register_num)
  86. {
  87. if(register_num == AUXMR)
  88. {
  89. /* locking makes absolutely sure noone accesses the
  90. * AUXMR register faster than once per microsecond */
  91. nec7210_locking_iomem_write_byte( priv, data, register_num );
  92. }else
  93. writeb(data, priv->iobase + register_num * priv->offset);
  94. }
  95. /* locking variants of io wrappers, for chips that page-in registers */
  96. uint8_t nec7210_locking_ioport_read_byte(nec7210_private_t *priv, unsigned int register_num)
  97. {
  98. uint8_t retval;
  99. unsigned long flags;
  100. spin_lock_irqsave( &priv->register_page_lock, flags );
  101. retval = inb((unsigned long)(priv->iobase) + register_num * priv->offset);
  102. spin_unlock_irqrestore( &priv->register_page_lock, flags );
  103. return retval;
  104. }
  105. void nec7210_locking_ioport_write_byte(nec7210_private_t *priv, uint8_t data, unsigned int register_num)
  106. {
  107. unsigned long flags;
  108. spin_lock_irqsave( &priv->register_page_lock, flags );
  109. if(register_num == AUXMR)
  110. udelay(1);
  111. outb(data, (unsigned long)(priv->iobase) + register_num * priv->offset);
  112. spin_unlock_irqrestore( &priv->register_page_lock, flags );
  113. }
  114. uint8_t nec7210_locking_iomem_read_byte(nec7210_private_t *priv, unsigned int register_num)
  115. {
  116. uint8_t retval;
  117. unsigned long flags;
  118. spin_lock_irqsave( &priv->register_page_lock, flags );
  119. retval = readb(priv->iobase + register_num * priv->offset);
  120. spin_unlock_irqrestore( &priv->register_page_lock, flags );
  121. return retval;
  122. }
  123. void nec7210_locking_iomem_write_byte(nec7210_private_t *priv, uint8_t data, unsigned int register_num)
  124. {
  125. unsigned long flags;
  126. spin_lock_irqsave( &priv->register_page_lock, flags );
  127. if(register_num == AUXMR)
  128. udelay(1);
  129. writeb(data, priv->iobase + register_num * priv->offset);
  130. spin_unlock_irqrestore( &priv->register_page_lock, flags );
  131. }
  132. static int __init nec7210_init_module( void )
  133. {
  134. return 0;
  135. }
  136. static void __exit nec7210_exit_module( void )
  137. {
  138. }
  139. module_init( nec7210_init_module );
  140. module_exit( nec7210_exit_module );
  141. EXPORT_SYMBOL(nec7210_board_reset);
  142. EXPORT_SYMBOL(nec7210_board_online);
  143. EXPORT_SYMBOL(nec7210_ioport_read_byte);
  144. EXPORT_SYMBOL(nec7210_ioport_write_byte);
  145. EXPORT_SYMBOL(nec7210_iomem_read_byte);
  146. EXPORT_SYMBOL(nec7210_iomem_write_byte);
  147. EXPORT_SYMBOL(nec7210_locking_ioport_read_byte);
  148. EXPORT_SYMBOL(nec7210_locking_ioport_write_byte);
  149. EXPORT_SYMBOL(nec7210_locking_iomem_read_byte);
  150. EXPORT_SYMBOL(nec7210_locking_iomem_write_byte);