irqflags.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * interface to Blackfin CEC
  3. *
  4. * Copyright 2009 Analog Devices Inc.
  5. * Licensed under the GPL-2 or later.
  6. */
  7. #ifndef __ASM_BFIN_IRQFLAGS_H__
  8. #define __ASM_BFIN_IRQFLAGS_H__
  9. #ifdef CONFIG_SMP
  10. # include <asm/pda.h>
  11. # include <asm/processor.h>
  12. /* Forward decl needed due to cdef inter dependencies */
  13. static inline uint32_t __pure bfin_dspid(void);
  14. # define blackfin_core_id() (bfin_dspid() & 0xff)
  15. # define bfin_irq_flags cpu_pda[blackfin_core_id()].imask
  16. #else
  17. extern unsigned long bfin_irq_flags;
  18. #endif
  19. static inline void bfin_sti(unsigned long flags)
  20. {
  21. asm volatile("sti %0;" : : "d" (flags));
  22. }
  23. static inline unsigned long bfin_cli(void)
  24. {
  25. unsigned long flags;
  26. asm volatile("cli %0;" : "=d" (flags));
  27. return flags;
  28. }
  29. static inline void raw_local_irq_disable(void)
  30. {
  31. bfin_cli();
  32. }
  33. static inline void raw_local_irq_enable(void)
  34. {
  35. bfin_sti(bfin_irq_flags);
  36. }
  37. #define raw_local_save_flags(flags) do { (flags) = bfin_read_IMASK(); } while (0)
  38. #define raw_irqs_disabled_flags(flags) (((flags) & ~0x3f) == 0)
  39. static inline void raw_local_irq_restore(unsigned long flags)
  40. {
  41. if (!raw_irqs_disabled_flags(flags))
  42. raw_local_irq_enable();
  43. }
  44. static inline unsigned long __raw_local_irq_save(void)
  45. {
  46. unsigned long flags = bfin_cli();
  47. #ifdef CONFIG_DEBUG_HWERR
  48. bfin_sti(0x3f);
  49. #endif
  50. return flags;
  51. }
  52. #define raw_local_irq_save(flags) do { (flags) = __raw_local_irq_save(); } while (0)
  53. #endif