irq.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * linux/arch/sh/boards/renesas/systemh/irq.c
  3. *
  4. * Copyright (C) 2000 Kazumoto Kojima
  5. *
  6. * Hitachi SystemH Support.
  7. *
  8. * Modified for 7751 SystemH by
  9. * Jonathan Short.
  10. */
  11. #include <linux/init.h>
  12. #include <linux/irq.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/io.h>
  15. #include <mach/systemh7751.h>
  16. #include <asm/smc37c93x.h>
  17. /* address of external interrupt mask register
  18. * address must be set prior to use these (maybe in init_XXX_irq())
  19. * XXX : is it better to use .config than specifying it in code? */
  20. static unsigned long *systemh_irq_mask_register = (unsigned long *)0xB3F10004;
  21. static unsigned long *systemh_irq_request_register = (unsigned long *)0xB3F10000;
  22. static void disable_systemh_irq(struct irq_data *data)
  23. {
  24. unsigned long val, mask = 0x01 << 1;
  25. /* Clear the "irq"th bit in the mask and set it in the request */
  26. val = __raw_readl((unsigned long)systemh_irq_mask_register);
  27. val &= ~mask;
  28. __raw_writel(val, (unsigned long)systemh_irq_mask_register);
  29. val = __raw_readl((unsigned long)systemh_irq_request_register);
  30. val |= mask;
  31. __raw_writel(val, (unsigned long)systemh_irq_request_register);
  32. }
  33. static void enable_systemh_irq(struct irq_data *data)
  34. {
  35. unsigned long val, mask = 0x01 << 1;
  36. /* Set "irq"th bit in the mask register */
  37. val = __raw_readl((unsigned long)systemh_irq_mask_register);
  38. val |= mask;
  39. __raw_writel(val, (unsigned long)systemh_irq_mask_register);
  40. }
  41. static struct irq_chip systemh_irq_type = {
  42. .name = "SystemH Register",
  43. .irq_unmask = enable_systemh_irq,
  44. .irq_mask = disable_systemh_irq,
  45. };
  46. void make_systemh_irq(unsigned int irq)
  47. {
  48. disable_irq_nosync(irq);
  49. set_irq_chip_and_handler(irq, &systemh_irq_type, handle_level_irq);
  50. disable_systemh_irq(irq_get_irq_data(irq));
  51. }