irq.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * arch/arm/plat-orion/irq.c
  3. *
  4. * Marvell Orion SoC IRQ handling.
  5. *
  6. * This file is licensed under the terms of the GNU General Public
  7. * License version 2. This program is licensed "as is" without any
  8. * warranty of any kind, whether express or implied.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/irq.h>
  13. #include <linux/io.h>
  14. #include <plat/irq.h>
  15. static void orion_irq_mask(u32 irq)
  16. {
  17. void __iomem *maskaddr = get_irq_chip_data(irq);
  18. u32 mask;
  19. mask = readl(maskaddr);
  20. mask &= ~(1 << (irq & 31));
  21. writel(mask, maskaddr);
  22. }
  23. static void orion_irq_unmask(u32 irq)
  24. {
  25. void __iomem *maskaddr = get_irq_chip_data(irq);
  26. u32 mask;
  27. mask = readl(maskaddr);
  28. mask |= 1 << (irq & 31);
  29. writel(mask, maskaddr);
  30. }
  31. static struct irq_chip orion_irq_chip = {
  32. .name = "orion_irq",
  33. .mask = orion_irq_mask,
  34. .mask_ack = orion_irq_mask,
  35. .unmask = orion_irq_unmask,
  36. };
  37. void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr)
  38. {
  39. unsigned int i;
  40. /*
  41. * Mask all interrupts initially.
  42. */
  43. writel(0, maskaddr);
  44. /*
  45. * Register IRQ sources.
  46. */
  47. for (i = 0; i < 32; i++) {
  48. unsigned int irq = irq_start + i;
  49. set_irq_chip(irq, &orion_irq_chip);
  50. set_irq_chip_data(irq, maskaddr);
  51. set_irq_handler(irq, handle_level_irq);
  52. irq_desc[irq].status |= IRQ_LEVEL;
  53. set_irq_flags(irq, IRQF_VALID);
  54. }
  55. }