osutil.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "ibsys.h"
  2. #include <asm/io.h>
  3. #include <linux/sched.h>
  4. void writeb_wrapper(unsigned int value, void *address)
  5. {
  6. writeb(value, address);
  7. };
  8. void writew_wrapper(unsigned int value, void *address)
  9. {
  10. writew(value, address);
  11. };
  12. unsigned int readb_wrapper(void *address)
  13. {
  14. return readb(address);
  15. };
  16. unsigned int readw_wrapper(void *address)
  17. {
  18. return readw(address);
  19. };
  20. void outb_wrapper(unsigned int value, void *address)
  21. {
  22. outb(value, (unsigned long)(address));
  23. };
  24. void outw_wrapper(unsigned int value, void *address)
  25. {
  26. outw(value, (unsigned long)(address));
  27. };
  28. unsigned int inb_wrapper(void *address)
  29. {
  30. return inb((unsigned long)(address));
  31. };
  32. unsigned int inw_wrapper(void *address)
  33. {
  34. return inw((unsigned long)(address));
  35. };
  36. /* this is a function instead of a constant because of Suse
  37. * defining HZ to be a function call to get_hz() */
  38. static inline int pseudo_irq_period(void)
  39. {
  40. return (HZ + 99) / 100;
  41. }
  42. void pseudo_irq_handler(unsigned long arg)
  43. {
  44. gpib_board_t *board = (gpib_board_t*) arg;
  45. if(board->pseudo_irq.handler)
  46. board->pseudo_irq.handler(0, board
  47. #ifdef HAVE_PT_REGS
  48. , NULL
  49. #endif
  50. );
  51. else
  52. printk("gpib: bug! pseudo_irq.handler is NULL\n");
  53. if(board->pseudo_irq.active)
  54. mod_timer(&board->pseudo_irq.timer, jiffies + pseudo_irq_period());
  55. }
  56. int gpib_request_pseudo_irq(gpib_board_t *board, irqreturn_t (*handler)(int, void * PT_REGS_ARG))
  57. {
  58. if(timer_pending(&board->pseudo_irq.timer) || board->pseudo_irq.handler)
  59. {
  60. printk("gpib: only one psuedo interrupt per board allowed\n");
  61. return -1;
  62. }
  63. board->pseudo_irq.handler = handler;
  64. board->pseudo_irq.timer.expires = jiffies + pseudo_irq_period();
  65. board->pseudo_irq.timer.function = pseudo_irq_handler;
  66. board->pseudo_irq.timer.data = (unsigned long) board;
  67. board->pseudo_irq.active = 1;
  68. add_timer(&board->pseudo_irq.timer);
  69. return 0;
  70. }
  71. void gpib_free_pseudo_irq(gpib_board_t *board)
  72. {
  73. board->pseudo_irq.active = 0;
  74. del_timer_sync(&board->pseudo_irq.timer);
  75. board->pseudo_irq.handler = NULL;
  76. }
  77. EXPORT_SYMBOL( writeb_wrapper );
  78. EXPORT_SYMBOL( readb_wrapper );
  79. EXPORT_SYMBOL( outb_wrapper );
  80. EXPORT_SYMBOL( inb_wrapper );
  81. EXPORT_SYMBOL( writew_wrapper );
  82. EXPORT_SYMBOL( readw_wrapper );
  83. EXPORT_SYMBOL( outw_wrapper );
  84. EXPORT_SYMBOL( inw_wrapper );
  85. EXPORT_SYMBOL(gpib_request_pseudo_irq);
  86. EXPORT_SYMBOL(gpib_free_pseudo_irq);