irq.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. /* forward declaration */
  23. static void enable_systemh_irq(unsigned int irq);
  24. static void disable_systemh_irq(unsigned int irq);
  25. static void mask_and_ack_systemh(unsigned int);
  26. static struct irq_chip systemh_irq_type = {
  27. .name = " SystemH Register",
  28. .unmask = enable_systemh_irq,
  29. .mask = disable_systemh_irq,
  30. .ack = mask_and_ack_systemh,
  31. };
  32. static void disable_systemh_irq(unsigned int irq)
  33. {
  34. if (systemh_irq_mask_register) {
  35. unsigned long val, mask = 0x01 << 1;
  36. /* Clear the "irq"th bit in the mask and set it in the request */
  37. val = ctrl_inl((unsigned long)systemh_irq_mask_register);
  38. val &= ~mask;
  39. ctrl_outl(val, (unsigned long)systemh_irq_mask_register);
  40. val = ctrl_inl((unsigned long)systemh_irq_request_register);
  41. val |= mask;
  42. ctrl_outl(val, (unsigned long)systemh_irq_request_register);
  43. }
  44. }
  45. static void enable_systemh_irq(unsigned int irq)
  46. {
  47. if (systemh_irq_mask_register) {
  48. unsigned long val, mask = 0x01 << 1;
  49. /* Set "irq"th bit in the mask register */
  50. val = ctrl_inl((unsigned long)systemh_irq_mask_register);
  51. val |= mask;
  52. ctrl_outl(val, (unsigned long)systemh_irq_mask_register);
  53. }
  54. }
  55. static void mask_and_ack_systemh(unsigned int irq)
  56. {
  57. disable_systemh_irq(irq);
  58. }
  59. void make_systemh_irq(unsigned int irq)
  60. {
  61. disable_irq_nosync(irq);
  62. set_irq_chip_and_handler(irq, &systemh_irq_type, handle_level_irq);
  63. disable_systemh_irq(irq);
  64. }