irq.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2013 Altera Corporation
  4. * Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch>
  5. * Copyright (C) 2008 Thomas Chou <thomas@wytron.com.tw>
  6. *
  7. * based on irq.c from m68k which is:
  8. *
  9. * Copyright (C) 2007 Greg Ungerer <gerg@snapgear.com>
  10. */
  11. #include <linux/init.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/of.h>
  14. static u32 ienable;
  15. asmlinkage void do_IRQ(int hwirq, struct pt_regs *regs)
  16. {
  17. struct pt_regs *oldregs = set_irq_regs(regs);
  18. int irq;
  19. irq_enter();
  20. irq = irq_find_mapping(NULL, hwirq);
  21. generic_handle_irq(irq);
  22. irq_exit();
  23. set_irq_regs(oldregs);
  24. }
  25. static void chip_unmask(struct irq_data *d)
  26. {
  27. ienable |= (1 << d->hwirq);
  28. WRCTL(CTL_IENABLE, ienable);
  29. }
  30. static void chip_mask(struct irq_data *d)
  31. {
  32. ienable &= ~(1 << d->hwirq);
  33. WRCTL(CTL_IENABLE, ienable);
  34. }
  35. static struct irq_chip m_irq_chip = {
  36. .name = "NIOS2-INTC",
  37. .irq_unmask = chip_unmask,
  38. .irq_mask = chip_mask,
  39. };
  40. static int irq_map(struct irq_domain *h, unsigned int virq,
  41. irq_hw_number_t hw_irq_num)
  42. {
  43. irq_set_chip_and_handler(virq, &m_irq_chip, handle_level_irq);
  44. return 0;
  45. }
  46. static const struct irq_domain_ops irq_ops = {
  47. .map = irq_map,
  48. .xlate = irq_domain_xlate_onecell,
  49. };
  50. void __init init_IRQ(void)
  51. {
  52. struct irq_domain *domain;
  53. struct device_node *node;
  54. node = of_find_compatible_node(NULL, NULL, "altr,nios2-1.0");
  55. if (!node)
  56. node = of_find_compatible_node(NULL, NULL, "altr,nios2-1.1");
  57. BUG_ON(!node);
  58. domain = irq_domain_add_linear(node, NIOS2_CPU_NR_IRQS, &irq_ops, NULL);
  59. BUG_ON(!domain);
  60. irq_set_default_host(domain);
  61. of_node_put(node);
  62. /* Load the initial ienable value */
  63. ienable = RDCTL(CTL_IENABLE);
  64. }