nec7210.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /***************************************************************************
  3. * copyright : (C) 2002 by Frank Mori Hess
  4. ***************************************************************************/
  5. #ifndef _NEC7210_H
  6. #define _NEC7210_H
  7. #include "gpib_state_machines.h"
  8. #include <linux/types.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/string.h>
  11. #include <linux/interrupt.h>
  12. #include "gpib_types.h"
  13. #include "nec7210_registers.h"
  14. /* struct used to provide variables local to a nec7210 chip */
  15. struct nec7210_priv {
  16. #ifdef CONFIG_HAS_IOPORT
  17. u32 iobase;
  18. #endif
  19. void __iomem *mmiobase;
  20. unsigned int offset; // offset between successive nec7210 io addresses
  21. unsigned int dma_channel;
  22. u8 *dma_buffer;
  23. unsigned int dma_buffer_length; // length of dma buffer
  24. dma_addr_t dma_buffer_addr; // bus address of board->buffer for use with dma
  25. // software copy of bits written to registers
  26. u8 reg_bits[8];
  27. u8 auxa_bits; // bits written to auxiliary register A
  28. u8 auxb_bits; // bits written to auxiliary register B
  29. // used to keep track of board's state, bit definitions given below
  30. unsigned long state;
  31. // lock for chips that extend the nec7210 registers by paging in alternate regs
  32. spinlock_t register_page_lock;
  33. // wrappers for outb, inb, readb, or writeb
  34. u8 (*read_byte)(struct nec7210_priv *priv, unsigned int register_number);
  35. void (*write_byte)(struct nec7210_priv *priv, u8 byte, unsigned int register_number);
  36. enum nec7210_chipset type;
  37. enum talker_function_state talker_state;
  38. enum listener_function_state listener_state;
  39. void *private;
  40. unsigned srq_pending : 1;
  41. };
  42. static inline void init_nec7210_private(struct nec7210_priv *priv)
  43. {
  44. memset(priv, 0, sizeof(struct nec7210_priv));
  45. spin_lock_init(&priv->register_page_lock);
  46. }
  47. // slightly shorter way to access read_byte and write_byte
  48. static inline u8 read_byte(struct nec7210_priv *priv, unsigned int register_number)
  49. {
  50. return priv->read_byte(priv, register_number);
  51. }
  52. static inline void write_byte(struct nec7210_priv *priv, u8 byte, unsigned int register_number)
  53. {
  54. priv->write_byte(priv, byte, register_number);
  55. }
  56. // struct nec7210_priv.state bit numbers
  57. enum {
  58. PIO_IN_PROGRESS_BN, // pio transfer in progress
  59. DMA_READ_IN_PROGRESS_BN, // dma read transfer in progress
  60. DMA_WRITE_IN_PROGRESS_BN, // dma write transfer in progress
  61. READ_READY_BN, // board has data byte available to read
  62. WRITE_READY_BN, // board is ready to send a data byte
  63. COMMAND_READY_BN, // board is ready to send a command byte
  64. RECEIVED_END_BN, // received END
  65. BUS_ERROR_BN, // output error has occurred
  66. RFD_HOLDOFF_BN, // rfd holdoff in effect
  67. DEV_CLEAR_BN, // device clear received
  68. ADR_CHANGE_BN, // address state change occurred
  69. };
  70. // interface functions
  71. int nec7210_read(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
  72. size_t length, int *end, size_t *bytes_read);
  73. int nec7210_write(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
  74. size_t length, int send_eoi, size_t *bytes_written);
  75. int nec7210_command(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
  76. size_t length, size_t *bytes_written);
  77. int nec7210_take_control(struct gpib_board *board, struct nec7210_priv *priv, int syncronous);
  78. int nec7210_go_to_standby(struct gpib_board *board, struct nec7210_priv *priv);
  79. int nec7210_request_system_control(struct gpib_board *board,
  80. struct nec7210_priv *priv, int request_control);
  81. void nec7210_interface_clear(struct gpib_board *board, struct nec7210_priv *priv, int assert);
  82. void nec7210_remote_enable(struct gpib_board *board, struct nec7210_priv *priv, int enable);
  83. int nec7210_enable_eos(struct gpib_board *board, struct nec7210_priv *priv, u8 eos_bytes,
  84. int compare_8_bits);
  85. void nec7210_disable_eos(struct gpib_board *board, struct nec7210_priv *priv);
  86. unsigned int nec7210_update_status(struct gpib_board *board, struct nec7210_priv *priv,
  87. unsigned int clear_mask);
  88. unsigned int nec7210_update_status_nolock(struct gpib_board *board, struct nec7210_priv *priv);
  89. int nec7210_primary_address(const struct gpib_board *board,
  90. struct nec7210_priv *priv, unsigned int address);
  91. int nec7210_secondary_address(const struct gpib_board *board, struct nec7210_priv *priv,
  92. unsigned int address, int enable);
  93. int nec7210_parallel_poll(struct gpib_board *board, struct nec7210_priv *priv, u8 *result);
  94. void nec7210_serial_poll_response(struct gpib_board *board,
  95. struct nec7210_priv *priv, u8 status);
  96. void nec7210_parallel_poll_configure(struct gpib_board *board,
  97. struct nec7210_priv *priv, unsigned int configuration);
  98. void nec7210_parallel_poll_response(struct gpib_board *board,
  99. struct nec7210_priv *priv, int ist);
  100. u8 nec7210_serial_poll_status(struct gpib_board *board, struct nec7210_priv *priv);
  101. int nec7210_t1_delay(struct gpib_board *board,
  102. struct nec7210_priv *priv, unsigned int nano_sec);
  103. void nec7210_return_to_local(const struct gpib_board *board, struct nec7210_priv *priv);
  104. // utility functions
  105. void nec7210_board_reset(struct nec7210_priv *priv, const struct gpib_board *board);
  106. void nec7210_board_online(struct nec7210_priv *priv, const struct gpib_board *board);
  107. unsigned int nec7210_set_reg_bits(struct nec7210_priv *priv, unsigned int reg,
  108. unsigned int mask, unsigned int bits);
  109. void nec7210_set_handshake_mode(struct gpib_board *board, struct nec7210_priv *priv, int mode);
  110. void nec7210_release_rfd_holdoff(struct gpib_board *board, struct nec7210_priv *priv);
  111. u8 nec7210_read_data_in(struct gpib_board *board, struct nec7210_priv *priv, int *end);
  112. // wrappers for io functions
  113. u8 nec7210_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num);
  114. void nec7210_ioport_write_byte(struct nec7210_priv *priv, u8 data, unsigned int register_num);
  115. u8 nec7210_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num);
  116. void nec7210_iomem_write_byte(struct nec7210_priv *priv, u8 data, unsigned int register_num);
  117. u8 nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num);
  118. void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, u8 data,
  119. unsigned int register_num);
  120. u8 nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num);
  121. void nec7210_locking_iomem_write_byte(struct nec7210_priv *priv, u8 data,
  122. unsigned int register_num);
  123. // interrupt service routine
  124. irqreturn_t nec7210_interrupt(struct gpib_board *board, struct nec7210_priv *priv);
  125. irqreturn_t nec7210_interrupt_have_status(struct gpib_board *board,
  126. struct nec7210_priv *priv, int status1, int status2);
  127. #endif //_NEC7210_H