irq.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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/config.h>
  18. #include <linux/init.h>
  19. #include <linux/irq.h>
  20. #include <asm/io.h>
  21. #include <asm/irq.h>
  22. #include <asm/landisk/iodata_landisk.h>
  23. static void enable_landisk_irq(unsigned int irq);
  24. static void disable_landisk_irq(unsigned int irq);
  25. /* shutdown is same as "disable" */
  26. #define shutdown_landisk_irq disable_landisk_irq
  27. static void ack_landisk_irq(unsigned int irq);
  28. static void end_landisk_irq(unsigned int irq);
  29. static unsigned int startup_landisk_irq(unsigned int irq)
  30. {
  31. enable_landisk_irq(irq);
  32. return 0; /* never anything pending */
  33. }
  34. static void disable_landisk_irq(unsigned int irq)
  35. {
  36. unsigned char val;
  37. unsigned char mask = 0xff ^ (0x01 << (irq - 5));
  38. /* Set the priority in IPR to 0 */
  39. val = ctrl_inb(PA_IMASK);
  40. val &= mask;
  41. ctrl_outb(val, PA_IMASK);
  42. }
  43. static void enable_landisk_irq(unsigned int irq)
  44. {
  45. unsigned char val;
  46. unsigned char value = (0x01 << (irq - 5));
  47. /* Set priority in IPR back to original value */
  48. val = ctrl_inb(PA_IMASK);
  49. val |= value;
  50. ctrl_outb(val, PA_IMASK);
  51. }
  52. static void ack_landisk_irq(unsigned int irq)
  53. {
  54. disable_landisk_irq(irq);
  55. }
  56. static void end_landisk_irq(unsigned int irq)
  57. {
  58. if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
  59. enable_landisk_irq(irq);
  60. }
  61. static struct hw_interrupt_type landisk_irq_type = {
  62. .typename = "LANDISK IRQ",
  63. .startup = startup_landisk_irq,
  64. .shutdown = shutdown_landisk_irq,
  65. .enable = enable_landisk_irq,
  66. .disable = disable_landisk_irq,
  67. .ack = ack_landisk_irq,
  68. .end = end_landisk_irq
  69. };
  70. static void make_landisk_irq(unsigned int irq)
  71. {
  72. disable_irq_nosync(irq);
  73. irq_desc[irq].handler = &landisk_irq_type;
  74. disable_landisk_irq(irq);
  75. }
  76. /*
  77. * Initialize IRQ setting
  78. */
  79. void __init init_landisk_IRQ(void)
  80. {
  81. int i;
  82. for (i = 5; i < 14; i++)
  83. make_landisk_irq(i);
  84. }