ide.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * This file contains the MIPS architecture specific IDE code.
  7.  *
  8.  * Copyright (C) 1994-1996  Linus Torvalds & authors
  9.  */
  10. /*
  11.  *  This file contains the MIPS architecture specific IDE code.
  12.  */
  13. #ifndef __ASM_IDE_H
  14. #define __ASM_IDE_H
  15. #ifdef __KERNEL__
  16. #include <linux/config.h>
  17. #ifndef MAX_HWIFS
  18. # ifdef CONFIG_BLK_DEV_IDEPCI
  19. #define MAX_HWIFS 10
  20. # else
  21. #define MAX_HWIFS 6
  22. # endif
  23. #endif
  24. #define ide__sti() __sti()
  25. struct ide_ops {
  26. int (*ide_default_irq)(ide_ioreg_t base);
  27. ide_ioreg_t (*ide_default_io_base)(int index);
  28. void (*ide_init_hwif_ports)(hw_regs_t *hw, ide_ioreg_t data_port,
  29.                             ide_ioreg_t ctrl_port, int *irq);
  30. int (*ide_request_irq)(unsigned int irq, void (*handler)(int, void *,
  31.                        struct pt_regs *), unsigned long flags,
  32.                        const char *device, void *dev_id);
  33. void (*ide_free_irq)(unsigned int irq, void *dev_id);
  34. int (*ide_check_region) (ide_ioreg_t from, unsigned int extent);
  35. void (*ide_request_region)(ide_ioreg_t from, unsigned int extent,
  36.                         const char *name);
  37. void (*ide_release_region)(ide_ioreg_t from, unsigned int extent);
  38. };
  39. extern struct ide_ops *ide_ops;
  40. static __inline__ int ide_default_irq(ide_ioreg_t base)
  41. {
  42. return ide_ops->ide_default_irq(base);
  43. }
  44. static __inline__ ide_ioreg_t ide_default_io_base(int index)
  45. {
  46. return ide_ops->ide_default_io_base(index);
  47. }
  48. static inline void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port,
  49.                                        ide_ioreg_t ctrl_port, int *irq)
  50. {
  51. ide_ops->ide_init_hwif_ports(hw, data_port, ctrl_port, irq);
  52. }
  53. static __inline__ void ide_init_default_hwifs(void)
  54. {
  55. #ifndef CONFIG_BLK_DEV_IDEPCI
  56. hw_regs_t hw;
  57. int index;
  58. for(index = 0; index < MAX_HWIFS; index++) {
  59. ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
  60. hw.irq = ide_default_irq(ide_default_io_base(index));
  61. ide_register_hw(&hw, NULL);
  62. }
  63. #endif /* CONFIG_BLK_DEV_IDEPCI */
  64. }
  65. typedef union {
  66. unsigned all : 8; /* all of the bits together */
  67. struct {
  68. unsigned head : 4; /* always zeros here */
  69. unsigned unit : 1; /* drive select number, 0 or 1 */
  70. unsigned bit5 : 1; /* always 1 */
  71. unsigned lba : 1; /* using LBA instead of CHS */
  72. unsigned bit7 : 1; /* always 1 */
  73. } b;
  74. } select_t;
  75. static __inline__ int ide_request_irq(unsigned int irq, void (*handler)(int,void *, struct pt_regs *),
  76. unsigned long flags, const char *device, void *dev_id)
  77. {
  78. return ide_ops->ide_request_irq(irq, handler, flags, device, dev_id);
  79. }
  80. static __inline__ void ide_free_irq(unsigned int irq, void *dev_id)
  81. {
  82. ide_ops->ide_free_irq(irq, dev_id);
  83. }
  84. static __inline__ int ide_check_region (ide_ioreg_t from, unsigned int extent)
  85. {
  86. return ide_ops->ide_check_region(from, extent);
  87. }
  88. static __inline__ void ide_request_region(ide_ioreg_t from,
  89.                                           unsigned int extent, const char *name)
  90. {
  91. ide_ops->ide_request_region(from, extent, name);
  92. }
  93. static __inline__ void ide_release_region(ide_ioreg_t from,
  94.                                           unsigned int extent)
  95. {
  96. ide_ops->ide_release_region(from, extent);
  97. }
  98. #if defined(CONFIG_SWAP_IO_SPACE) && defined(__MIPSEB__)
  99. #ifdef insl
  100. #undef insl
  101. #endif
  102. #ifdef outsl
  103. #undef outsl
  104. #endif
  105. #ifdef insw
  106. #undef insw
  107. #endif
  108. #ifdef outsw
  109. #undef outsw
  110. #endif
  111. #define insw(p,a,c)
  112. do {
  113. unsigned short *ptr = (unsigned short *)(a);
  114. unsigned int i = (c);
  115. while (i--)
  116. *ptr++ = inw(p);
  117. } while (0)
  118. #define insl(p,a,c)
  119. do {
  120. unsigned long *ptr = (unsigned long *)(a);
  121. unsigned int i = (c);
  122. while (i--)
  123. *ptr++ = inl(p);
  124. } while (0)
  125. #define outsw(p,a,c)
  126. do {
  127. unsigned short *ptr = (unsigned short *)(a);
  128. unsigned int i = (c);
  129. while (i--)
  130. outw(*ptr++, (p));
  131. } while (0)
  132. #define outsl(p,a,c) {
  133. unsigned long *ptr = (unsigned long *)(a);
  134. unsigned int i = (c);
  135. while (i--)
  136. outl(*ptr++, (p));
  137. } while (0)
  138. #endif /* defined(CONFIG_SWAP_IO_SPACE) && defined(__MIPSEB__)  */
  139. /*
  140.  * The following are not needed for the non-m68k ports
  141.  */
  142. #define ide_ack_intr(hwif) (1)
  143. #define ide_fix_driveid(id) do {} while (0)
  144. #define ide_release_lock(lock) do {} while (0)
  145. #define ide_get_lock(lock, hdlr, data) do {} while (0)
  146. #endif /* __KERNEL__ */
  147. #endif /* __ASM_IDE_H */