irq.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Renesas Solutions Highlander R7780RP-1 Support.
  3. *
  4. * Copyright (C) 2002 Atom Create Engineering Co., Ltd.
  5. * Copyright (C) 2006 Paul Mundt
  6. *
  7. * This file is subject to the terms and conditions of the GNU General Public
  8. * License. See the file "COPYING" in the main directory of this archive
  9. * for more details.
  10. */
  11. #include <linux/init.h>
  12. #include <linux/irq.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/io.h>
  15. #include <asm/r7780rp.h>
  16. #ifdef CONFIG_SH_R7780RP
  17. static int mask_pos[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 5, 6, 4, 0, 1, 2, 0};
  18. #elif defined(CONFIG_SH_R7780MP)
  19. static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0};
  20. #elif defined(CONFIG_SH_R7785RP)
  21. static int mask_pos[] = {2, 11, 2, 2, 2, 2, 9, 8, 7, 5, 10, 2, 2, 2, 2, 2};
  22. #endif
  23. static void enable_r7780rp_irq(unsigned int irq)
  24. {
  25. /* Set priority in IPR back to original value */
  26. ctrl_outw(ctrl_inw(IRLCNTR1) | (1 << mask_pos[irq]), IRLCNTR1);
  27. }
  28. static void disable_r7780rp_irq(unsigned int irq)
  29. {
  30. /* Set the priority in IPR to 0 */
  31. ctrl_outw(ctrl_inw(IRLCNTR1) & (0xffff ^ (1 << mask_pos[irq])),
  32. IRLCNTR1);
  33. }
  34. static struct irq_chip r7780rp_irq_chip __read_mostly = {
  35. .name = "R7780RP",
  36. .mask = disable_r7780rp_irq,
  37. .unmask = enable_r7780rp_irq,
  38. .mask_ack = disable_r7780rp_irq,
  39. };
  40. void make_r7780rp_irq(unsigned int irq)
  41. {
  42. disable_irq_nosync(irq);
  43. set_irq_chip_and_handler_name(irq, &r7780rp_irq_chip,
  44. handle_level_irq, "level");
  45. enable_r7780rp_irq(irq);
  46. }