irq_32.c 1008 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * SHcompact irqflags support
  4. *
  5. * Copyright (C) 2006 - 2009 Paul Mundt
  6. */
  7. #include <linux/irqflags.h>
  8. #include <linux/module.h>
  9. void notrace arch_local_irq_restore(unsigned long flags)
  10. {
  11. unsigned long __dummy0, __dummy1;
  12. if (flags == ARCH_IRQ_DISABLED) {
  13. __asm__ __volatile__ (
  14. "stc sr, %0\n\t"
  15. "or #0xf0, %0\n\t"
  16. "ldc %0, sr\n\t"
  17. : "=&z" (__dummy0)
  18. : /* no inputs */
  19. : "memory"
  20. );
  21. } else {
  22. __asm__ __volatile__ (
  23. "stc sr, %0\n\t"
  24. "and %1, %0\n\t"
  25. #ifdef CONFIG_CPU_HAS_SR_RB
  26. "stc r6_bank, %1\n\t"
  27. "or %1, %0\n\t"
  28. #endif
  29. "ldc %0, sr\n\t"
  30. : "=&r" (__dummy0), "=r" (__dummy1)
  31. : "1" (~ARCH_IRQ_DISABLED)
  32. : "memory"
  33. );
  34. }
  35. }
  36. EXPORT_SYMBOL(arch_local_irq_restore);
  37. unsigned long notrace arch_local_save_flags(void)
  38. {
  39. unsigned long flags;
  40. __asm__ __volatile__ (
  41. "stc sr, %0\n\t"
  42. "and #0xf0, %0\n\t"
  43. : "=&z" (flags)
  44. : /* no inputs */
  45. : "memory"
  46. );
  47. return flags;
  48. }
  49. EXPORT_SYMBOL(arch_local_save_flags);