irqflags.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _H8300_IRQFLAGS_H
  3. #define _H8300_IRQFLAGS_H
  4. #ifdef CONFIG_CPU_H8300H
  5. typedef unsigned char h8300flags;
  6. static inline h8300flags arch_local_save_flags(void)
  7. {
  8. h8300flags flags;
  9. __asm__ volatile ("stc ccr,%w0" : "=r" (flags));
  10. return flags;
  11. }
  12. static inline void arch_local_irq_disable(void)
  13. {
  14. __asm__ volatile ("orc #0xc0,ccr");
  15. }
  16. static inline void arch_local_irq_enable(void)
  17. {
  18. __asm__ volatile ("andc #0x3f,ccr");
  19. }
  20. static inline h8300flags arch_local_irq_save(void)
  21. {
  22. h8300flags flags;
  23. __asm__ volatile ("stc ccr,%w0\n\t"
  24. "orc #0xc0,ccr" : "=r" (flags));
  25. return flags;
  26. }
  27. static inline void arch_local_irq_restore(h8300flags flags)
  28. {
  29. __asm__ volatile ("ldc %w0,ccr" : : "r" (flags) : "cc");
  30. }
  31. static inline int arch_irqs_disabled_flags(unsigned long flags)
  32. {
  33. return (flags & 0xc0) == 0xc0;
  34. }
  35. #endif
  36. #ifdef CONFIG_CPU_H8S
  37. typedef unsigned short h8300flags;
  38. static inline h8300flags arch_local_save_flags(void)
  39. {
  40. h8300flags flags;
  41. __asm__ volatile ("stc ccr,%w0\n\tstc exr,%x0" : "=r" (flags));
  42. return flags;
  43. }
  44. static inline void arch_local_irq_disable(void)
  45. {
  46. __asm__ volatile ("orc #0x80,ccr\n\t");
  47. }
  48. static inline void arch_local_irq_enable(void)
  49. {
  50. __asm__ volatile ("andc #0x7f,ccr\n\t"
  51. "andc #0xf0,exr\n\t");
  52. }
  53. static inline h8300flags arch_local_irq_save(void)
  54. {
  55. h8300flags flags;
  56. __asm__ volatile ("stc ccr,%w0\n\t"
  57. "stc exr,%x0\n\t"
  58. "orc #0x80,ccr\n\t"
  59. : "=r" (flags));
  60. return flags;
  61. }
  62. static inline void arch_local_irq_restore(h8300flags flags)
  63. {
  64. __asm__ volatile ("ldc %w0,ccr\n\t"
  65. "ldc %x0,exr"
  66. : : "r" (flags) : "cc");
  67. }
  68. static inline int arch_irqs_disabled_flags(h8300flags flags)
  69. {
  70. return (flags & 0x0080) == 0x0080;
  71. }
  72. #endif
  73. static inline int arch_irqs_disabled(void)
  74. {
  75. return arch_irqs_disabled_flags(arch_local_save_flags());
  76. }
  77. #endif /* _H8300_IRQFLAGS_H */