irq-pxa168.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * linux/arch/arm/mach-mmp/irq.c
  3. *
  4. * Generic IRQ handling, GPIO IRQ demultiplexing, etc.
  5. *
  6. * Author: Bin Yang <bin.yang@marvell.com>
  7. * Created: Sep 30, 2008
  8. * Copyright: Marvell International Ltd.
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #include <linux/init.h>
  15. #include <linux/irq.h>
  16. #include <linux/io.h>
  17. #include <mach/regs-icu.h>
  18. #include "common.h"
  19. #define IRQ_ROUTE_TO_AP (ICU_INT_CONF_AP_INT | ICU_INT_CONF_IRQ)
  20. #define PRIORITY_DEFAULT 0x1
  21. #define PRIORITY_NONE 0x0 /* means IRQ disabled */
  22. static void icu_mask_irq(struct irq_data *d)
  23. {
  24. __raw_writel(PRIORITY_NONE, ICU_INT_CONF(d->irq));
  25. }
  26. static void icu_unmask_irq(struct irq_data *d)
  27. {
  28. __raw_writel(IRQ_ROUTE_TO_AP | PRIORITY_DEFAULT, ICU_INT_CONF(d->irq));
  29. }
  30. static struct irq_chip icu_irq_chip = {
  31. .name = "icu_irq",
  32. .irq_ack = icu_mask_irq,
  33. .irq_mask = icu_mask_irq,
  34. .irq_unmask = icu_unmask_irq,
  35. };
  36. void __init icu_init_irq(void)
  37. {
  38. int irq;
  39. for (irq = 0; irq < 64; irq++) {
  40. icu_mask_irq(irq_get_irq_data(irq));
  41. irq_set_chip_and_handler(irq, &icu_irq_chip, handle_level_irq);
  42. set_irq_flags(irq, IRQF_VALID);
  43. }
  44. }