irqflags.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #ifndef __ASM_SH_IRQFLAGS_H
  2. #define __ASM_SH_IRQFLAGS_H
  3. static inline void raw_local_irq_enable(void)
  4. {
  5. unsigned long __dummy0, __dummy1;
  6. __asm__ __volatile__ (
  7. "stc sr, %0\n\t"
  8. "and %1, %0\n\t"
  9. #ifdef CONFIG_CPU_HAS_SR_RB
  10. "stc r6_bank, %1\n\t"
  11. "or %1, %0\n\t"
  12. #endif
  13. "ldc %0, sr\n\t"
  14. : "=&r" (__dummy0), "=r" (__dummy1)
  15. : "1" (~0x000000f0)
  16. : "memory"
  17. );
  18. }
  19. static inline void raw_local_irq_disable(void)
  20. {
  21. unsigned long flags;
  22. __asm__ __volatile__ (
  23. "stc sr, %0\n\t"
  24. "or #0xf0, %0\n\t"
  25. "ldc %0, sr\n\t"
  26. : "=&z" (flags)
  27. : /* no inputs */
  28. : "memory"
  29. );
  30. }
  31. static inline void set_bl_bit(void)
  32. {
  33. unsigned long __dummy0, __dummy1;
  34. __asm__ __volatile__ (
  35. "stc sr, %0\n\t"
  36. "or %2, %0\n\t"
  37. "and %3, %0\n\t"
  38. "ldc %0, sr\n\t"
  39. : "=&r" (__dummy0), "=r" (__dummy1)
  40. : "r" (0x10000000), "r" (0xffffff0f)
  41. : "memory"
  42. );
  43. }
  44. static inline void clear_bl_bit(void)
  45. {
  46. unsigned long __dummy0, __dummy1;
  47. __asm__ __volatile__ (
  48. "stc sr, %0\n\t"
  49. "and %2, %0\n\t"
  50. "ldc %0, sr\n\t"
  51. : "=&r" (__dummy0), "=r" (__dummy1)
  52. : "1" (~0x10000000)
  53. : "memory"
  54. );
  55. }
  56. static inline unsigned long __raw_local_save_flags(void)
  57. {
  58. unsigned long flags;
  59. __asm__ __volatile__ (
  60. "stc sr, %0\n\t"
  61. "and #0xf0, %0\n\t"
  62. : "=&z" (flags)
  63. : /* no inputs */
  64. : "memory"
  65. );
  66. return flags;
  67. }
  68. #define raw_local_save_flags(flags) \
  69. do { (flags) = __raw_local_save_flags(); } while (0)
  70. static inline int raw_irqs_disabled_flags(unsigned long flags)
  71. {
  72. return (flags != 0);
  73. }
  74. static inline int raw_irqs_disabled(void)
  75. {
  76. unsigned long flags = __raw_local_save_flags();
  77. return raw_irqs_disabled_flags(flags);
  78. }
  79. static inline unsigned long __raw_local_irq_save(void)
  80. {
  81. unsigned long flags, __dummy;
  82. __asm__ __volatile__ (
  83. "stc sr, %1\n\t"
  84. "mov %1, %0\n\t"
  85. "or #0xf0, %0\n\t"
  86. "ldc %0, sr\n\t"
  87. "mov %1, %0\n\t"
  88. "and #0xf0, %0\n\t"
  89. : "=&z" (flags), "=&r" (__dummy)
  90. : /* no inputs */
  91. : "memory"
  92. );
  93. return flags;
  94. }
  95. #define raw_local_irq_save(flags) \
  96. do { (flags) = __raw_local_irq_save(); } while (0)
  97. #define local_irq_save raw_local_irq_save
  98. static inline void raw_local_irq_restore(unsigned long flags)
  99. {
  100. if ((flags & 0xf0) != 0xf0)
  101. raw_local_irq_enable();
  102. }
  103. #define local_irq_restore raw_local_irq_restore
  104. #endif /* __ASM_SH_IRQFLAGS_H */