irq.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * arch/sh/boards/landisk/irq.c
  3. *
  4. * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
  5. * Based largely on io_se.c.
  6. *
  7. * I/O routine for I-O Data Device, Inc. LANDISK.
  8. *
  9. * Initial version only to support LAN access; some
  10. * placeholder code from io_landisk.c left in with the
  11. * expectation of later SuperIO and PCMCIA access.
  12. */
  13. /*
  14. * modified by kogiidena
  15. * 2005.03.03
  16. */
  17. #include <linux/init.h>
  18. #include <linux/irq.h>
  19. #include <asm/io.h>
  20. #include <asm/irq.h>
  21. #include <asm/landisk/iodata_landisk.h>
  22. static void enable_landisk_irq(unsigned int irq);
  23. static void disable_landisk_irq(unsigned int irq);
  24. /* shutdown is same as "disable" */
  25. #define shutdown_landisk_irq disable_landisk_irq
  26. static void ack_landisk_irq(unsigned int irq);
  27. static void end_landisk_irq(unsigned int irq);
  28. static unsigned int startup_landisk_irq(unsigned int irq)
  29. {
  30. enable_landisk_irq(irq);
  31. return 0; /* never anything pending */
  32. }
  33. static void disable_landisk_irq(unsigned int irq)
  34. {
  35. unsigned char val;
  36. unsigned char mask = 0xff ^ (0x01 << (irq - 5));
  37. /* Set the priority in IPR to 0 */
  38. val = ctrl_inb(PA_IMASK);
  39. val &= mask;
  40. ctrl_outb(val, PA_IMASK);
  41. }
  42. static void enable_landisk_irq(unsigned int irq)
  43. {
  44. unsigned char val;
  45. unsigned char value = (0x01 << (irq - 5));
  46. /* Set priority in IPR back to original value */
  47. val = ctrl_inb(PA_IMASK);
  48. val |= value;
  49. ctrl_outb(val, PA_IMASK);
  50. }
  51. static void ack_landisk_irq(unsigned int irq)
  52. {
  53. disable_landisk_irq(irq);
  54. }
  55. static void end_landisk_irq(unsigned int irq)
  56. {
  57. if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
  58. enable_landisk_irq(irq);
  59. }
  60. static struct hw_interrupt_type landisk_irq_type = {
  61. .typename = "LANDISK IRQ",
  62. .startup = startup_landisk_irq,
  63. .shutdown = shutdown_landisk_irq,
  64. .enable = enable_landisk_irq,
  65. .disable = disable_landisk_irq,
  66. .ack = ack_landisk_irq,
  67. .end = end_landisk_irq
  68. };
  69. static void make_landisk_irq(unsigned int irq)
  70. {
  71. disable_irq_nosync(irq);
  72. irq_desc[irq].chip = &landisk_irq_type;
  73. disable_landisk_irq(irq);
  74. }
  75. /*
  76. * Initialize IRQ setting
  77. */
  78. void __init init_landisk_IRQ(void)
  79. {
  80. int i;
  81. for (i = 5; i < 14; i++)
  82. make_landisk_irq(i);
  83. }