home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / Lib32 / lxirq.c < prev    next >
C/C++ Source or Header  |  2002-04-26  |  3KB  |  146 lines

  1. /* $Id: lxirq.c,v 1.2 2002/04/26 23:09:23 smilcke Exp $ */
  2.  
  3. /*
  4.  * irq.c
  5.  * Autor:               Stefan Milcke
  6.  * Erstellt am:         10.11.2001
  7.  * Letzte Aenderung am: 19.03.2002
  8.  *
  9. */
  10. #define INCL_NOPMAPI
  11. #define INCL_DOSERRORS           // for ERROR_INVALID_FUNCTION
  12. #include <os2.h>
  13. #include <ldefos2.h>
  14. #include "irqos2.h"
  15.  
  16. #include <linux/kernel.h>
  17. #include <linux/slab.h>
  18. #include <linux/mm.h>
  19. #include <linux/version.h>
  20. #include <linux/module.h>
  21. #include <linux/delay.h>
  22. #include <linux/types.h>
  23. #include <linux/timer.h>
  24. //#include <linux/irq.h>
  25. #include <linux/signal.h>
  26.  
  27. struct irq_handler
  28. {
  29.  char name[32];
  30.  int irq;
  31.  unsigned long flags;
  32.  void *data;
  33.  struct pt_regs *regs;
  34.  
  35.  void (*fn)(int,void *,struct pt_regs*);
  36. };
  37.  
  38. #define MAX_IRQ_HANDLERS      20
  39.  
  40. spinlock_t irqlist_lock=SPIN_LOCK_UNLOCKED;
  41.  
  42. struct irq_handler irq_handlers[MAX_IRQ_HANDLERS]={0};
  43.  
  44. void EoiIrq(int irq);
  45. int RequestIrq(int irq,int flags);
  46. void FreeIrq(int irq);
  47.  
  48. extern unsigned long OS2_request_irq(struct lxrm_resource* rm_resource
  49.                                      ,unsigned int irq,unsigned long flags);
  50. extern unsigned long OS2_free_irq(struct lxrm_resource* rm_resource
  51.                                   ,unsigned int irq);
  52. //-------------------------------- request_irq ---------------------------------
  53. int request_irq(unsigned int irq
  54.                 ,void (*handler)(int, void *, struct pt_regs *regs)
  55.                 ,unsigned long flags,const char *name, void *data
  56.                 ,struct lxrm_resource* rm_resource)
  57. {
  58.  int i,ret=0,rc;
  59.  unsigned long f;
  60.  int used=0;
  61.  ret=OS2_request_irq(rm_resource,irq,flags);
  62.  if(ret)
  63.   return ret;
  64.  spin_lock_irqsave(&irqlist_lock,f);
  65.  for(i=0;i<MAX_IRQ_HANDLERS;i++)
  66.  {
  67.   if(0==irq_handlers[i].irq)
  68.   {
  69.    struct irq_handler *p=&(irq_handlers[i]);
  70.    strcpy(p->name,name);
  71.    p->irq=irq;
  72.    p->flags=flags;
  73.    p->data=data;
  74.    p->regs=NULL;
  75.    p->fn=handler;
  76.    break;
  77.   }
  78.  }
  79.  if(i>=MAX_IRQ_HANDLERS)
  80.   ret=-1;
  81.  else
  82.  {
  83.   for(i=0;i<MAX_IRQ_HANDLERS;i++)
  84.    if(irq_handlers[i].irq==irq)
  85.     used++;
  86.  }
  87.  spin_unlock_irqrestore(&irqlist_lock,f);
  88.  if(1==used)
  89.  {
  90.   if(flags&SA_SHIRQ)
  91.    rc=RequestIrq(irq,1);
  92.   else
  93.    rc=RequestIrq(irq,0);
  94.  }
  95.  return ret;
  96. }
  97.  
  98. //---------------------------------- free_irq ----------------------------------
  99. void free_irq(unsigned int irq, void *data
  100.               ,struct lxrm_resource* rm_resource)
  101. {
  102.  int i;
  103.  unsigned long f;
  104.  int used=0;
  105.  spin_lock_irqsave(&irqlist_lock,f);
  106.  for(i=0;i<MAX_IRQ_HANDLERS;i++)
  107.  {
  108.   if(irq_handlers[i].irq==irq)
  109.   {
  110.    used++;
  111.    if(irq_handlers[i].data==data)
  112.     irq_handlers[i].irq=0;
  113.   }
  114.  }
  115.  if(used>1)
  116.   FreeIrq(irq);
  117.  spin_unlock_irqrestore(&irqlist_lock,f);
  118.  OS2_free_irq(rm_resource,irq);
  119. }
  120.  
  121. //---------------------------------- eoi_irq -----------------------------------
  122. void eoi_irq(unsigned int irq)
  123. {
  124.  EoiIrq(irq);
  125. }
  126.  
  127. extern unsigned long *IRQLevelPtr;
  128.  
  129. //-------------------------------- irq_handler ---------------------------------
  130. void __far irq_handler(int irq);
  131. #pragma aux irq_handler "irq_handler"
  132. void __far irq_handler(int irq)
  133. {
  134.  int i;
  135.  for(i=0;i<MAX_IRQ_HANDLERS;i++)
  136.  {
  137.   if(irq_handlers[i].irq==irq)
  138.   {
  139.    struct irq_handler *p=&(irq_handlers[i]);
  140.    p->fn(irq,p->data,p->regs);
  141.    if(0==(p->flags&SA_SHIRQ))
  142.     eoi_irq(irq);
  143.   }
  144.  }
  145. }
  146.