ipr.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Interrupt handling for IPR-based IRQ.
  3. *
  4. * Copyright (C) 1999 Niibe Yutaka & Takeshi Yaegashi
  5. * Copyright (C) 2000 Kazumoto Kojima
  6. * Copyright (C) 2003 Takashi Kusuda <kusuda-takashi@hitachi-ul.co.jp>
  7. * Copyright (C) 2006 Paul Mundt
  8. *
  9. * Supported system:
  10. * On-chip supporting modules (TMU, RTC, etc.).
  11. * On-chip supporting modules for SH7709/SH7709A/SH7729/SH7300.
  12. * Hitachi SolutionEngine external I/O:
  13. * MS7709SE01, MS7709ASE01, and MS7750SE01
  14. *
  15. * This file is subject to the terms and conditions of the GNU General Public
  16. * License. See the file "COPYING" in the main directory of this archive
  17. * for more details.
  18. */
  19. #include <linux/init.h>
  20. #include <linux/irq.h>
  21. #include <linux/module.h>
  22. #include <linux/io.h>
  23. #include <linux/interrupt.h>
  24. static void disable_ipr_irq(unsigned int irq)
  25. {
  26. struct ipr_data *p = get_irq_chip_data(irq);
  27. /* Set the priority in IPR to 0 */
  28. ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << p->shift)), p->addr);
  29. }
  30. static void enable_ipr_irq(unsigned int irq)
  31. {
  32. struct ipr_data *p = get_irq_chip_data(irq);
  33. /* Set priority in IPR back to original value */
  34. ctrl_outw(ctrl_inw(p->addr) | (p->priority << p->shift), p->addr);
  35. }
  36. static struct irq_chip ipr_irq_chip = {
  37. .name = "IPR",
  38. .mask = disable_ipr_irq,
  39. .unmask = enable_ipr_irq,
  40. .mask_ack = disable_ipr_irq,
  41. };
  42. void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs)
  43. {
  44. int i;
  45. for (i = 0; i < nr_irqs; i++) {
  46. unsigned int irq = table[i].irq;
  47. table[i].addr = map_ipridx_to_addr(table[i].ipr_idx);
  48. /* could the IPR index be mapped, if not we ignore this */
  49. if (table[i].addr == 0)
  50. continue;
  51. disable_irq_nosync(irq);
  52. set_irq_chip_and_handler_name(irq, &ipr_irq_chip,
  53. handle_level_irq, "level");
  54. set_irq_chip_data(irq, &table[i]);
  55. enable_ipr_irq(irq);
  56. }
  57. }
  58. EXPORT_SYMBOL(make_ipr_irq);
  59. #if !defined(CONFIG_CPU_HAS_PINT_IRQ)
  60. int ipr_irq_demux(int irq)
  61. {
  62. return irq;
  63. }
  64. #endif