irq.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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_R7780MP
  17. static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0};
  18. #else
  19. static int mask_pos[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 5, 6, 4, 0, 1, 2, 0};
  20. #endif
  21. static void enable_r7780rp_irq(unsigned int irq)
  22. {
  23. /* Set priority in IPR back to original value */
  24. ctrl_outw(ctrl_inw(IRLCNTR1) | (1 << mask_pos[irq]), IRLCNTR1);
  25. }
  26. static void disable_r7780rp_irq(unsigned int irq)
  27. {
  28. /* Set the priority in IPR to 0 */
  29. ctrl_outw(ctrl_inw(IRLCNTR1) & (0xffff ^ (1 << mask_pos[irq])),
  30. IRLCNTR1);
  31. }
  32. static struct irq_chip r7780rp_irq_chip __read_mostly = {
  33. .name = "R7780RP",
  34. .mask = disable_r7780rp_irq,
  35. .unmask = enable_r7780rp_irq,
  36. .mask_ack = disable_r7780rp_irq,
  37. };
  38. /*
  39. * Initialize IRQ setting
  40. */
  41. void __init init_r7780rp_IRQ(void)
  42. {
  43. int i;
  44. for (i = 0; i < 15; i++) {
  45. disable_irq_nosync(i);
  46. set_irq_chip_and_handler_name(i, &r7780rp_irq_chip,
  47. handle_level_irq, "level");
  48. enable_r7780rp_irq(i);
  49. }
  50. }