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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* tick14.c
  2.  * linux/arch/sparc/kernel/tick14.c
  3.  *
  4.  * Copyright (C) 1996 David Redman (djhr@tadpole.co.uk)
  5.  *
  6.  * This file handles the Sparc specific level14 ticker
  7.  * This is really useful for profiling OBP uses it for keyboard
  8.  * aborts and other stuff.
  9.  *
  10.  *
  11.  */
  12. #include <linux/errno.h>
  13. #include <linux/sched.h>
  14. #include <linux/kernel.h>
  15. #include <linux/param.h>
  16. #include <linux/string.h>
  17. #include <linux/mm.h>
  18. #include <linux/timex.h>
  19. #include <asm/oplib.h>
  20. #include <asm/segment.h>
  21. #include <asm/timer.h>
  22. #include <asm/mostek.h>
  23. #include <asm/system.h>
  24. #include <asm/irq.h>
  25. #include <asm/io.h>
  26. extern unsigned long lvl14_save[5];
  27. static unsigned long *linux_lvl14 = NULL;
  28. static unsigned long obp_lvl14[4];
  29.  
  30. void install_linux_ticker(void)
  31. {
  32. unsigned long flags;
  33. if (!linux_lvl14)
  34. return;
  35. save_and_cli(flags);
  36. linux_lvl14[0] =  lvl14_save[0];
  37. linux_lvl14[1] =  lvl14_save[1];
  38. linux_lvl14[2] =  lvl14_save[2];
  39. linux_lvl14[3] =  lvl14_save[3];
  40. restore_flags(flags);
  41. }
  42. void install_obp_ticker(void)
  43. {
  44. unsigned long flags;
  45.     
  46. if (!linux_lvl14)
  47. return;
  48. save_and_cli(flags);
  49. linux_lvl14[0] =  obp_lvl14[0];
  50. linux_lvl14[1] =  obp_lvl14[1];
  51. linux_lvl14[2] =  obp_lvl14[2];
  52. linux_lvl14[3] =  obp_lvl14[3]; 
  53. restore_flags(flags);
  54. }
  55. void claim_ticker14(void (*handler)(int, void *, struct pt_regs *),
  56.     int irq_nr, unsigned int timeout )
  57. {
  58. int cpu = smp_processor_id();
  59. /* first we copy the obp handler instructions
  60.  */
  61. disable_irq(irq_nr);
  62. if (!handler)
  63. return;
  64.     
  65. linux_lvl14 = (unsigned long *)lvl14_save[4];
  66. obp_lvl14[0] = linux_lvl14[0];
  67. obp_lvl14[1] = linux_lvl14[1];
  68. obp_lvl14[2] = linux_lvl14[2];
  69. obp_lvl14[3] = linux_lvl14[3];
  70. if (!request_irq(irq_nr,
  71.  handler,
  72.  (SA_INTERRUPT | SA_STATIC_ALLOC),
  73.  "counter14",
  74.  NULL)) {
  75. install_linux_ticker();
  76. load_profile_irq(cpu, timeout);
  77. enable_irq(irq_nr);
  78. }
  79. }