ide.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.ide.h 1.16 09/28/01 07:54:24 trini
  3.  */
  4. /*
  5.  *  linux/include/asm-ppc/ide.h
  6.  *
  7.  *  Copyright (C) 1994-1996 Linus Torvalds & authors */
  8. /*
  9.  *  This file contains the ppc architecture specific IDE code.
  10.  */
  11. #ifndef __ASMPPC_IDE_H
  12. #define __ASMPPC_IDE_H
  13. #ifdef __KERNEL__
  14. #include <linux/sched.h>
  15. #include <asm/processor.h>
  16. #include <asm/mpc8xx.h>
  17. #ifndef MAX_HWIFS
  18. #define MAX_HWIFS 8
  19. #endif
  20. #include <asm/hdreg.h>
  21. #include <linux/config.h>
  22. #include <linux/hdreg.h>
  23. #include <linux/ioport.h>
  24. #include <asm/io.h>
  25. extern void ppc_generic_ide_fix_driveid(struct hd_driveid *id);
  26. struct ide_machdep_calls {
  27.         int         (*default_irq)(ide_ioreg_t base);
  28.         ide_ioreg_t (*default_io_base)(int index);
  29.         int         (*ide_check_region)(ide_ioreg_t from, unsigned int extent);
  30.         void        (*ide_request_region)(ide_ioreg_t from,
  31.                                       unsigned int extent,
  32.                                       const char *name);
  33.         void        (*ide_release_region)(ide_ioreg_t from,
  34.                                       unsigned int extent);
  35.         void        (*ide_init_hwif)(hw_regs_t *hw,
  36.                                      ide_ioreg_t data_port,
  37.                                      ide_ioreg_t ctrl_port,
  38.                                      int *irq);
  39. };
  40. extern struct ide_machdep_calls ppc_ide_md;
  41. void ppc_generic_ide_fix_driveid(struct hd_driveid *id);
  42. #define ide_fix_driveid(id) ppc_generic_ide_fix_driveid((id))
  43. #undef SUPPORT_SLOW_DATA_PORTS
  44. #define SUPPORT_SLOW_DATA_PORTS 0
  45. #undef SUPPORT_VLB_SYNC
  46. #define SUPPORT_VLB_SYNC 0
  47. #define ide__sti() __sti()
  48. static __inline__ int ide_default_irq(ide_ioreg_t base)
  49. {
  50. if (ppc_ide_md.default_irq)
  51. return ppc_ide_md.default_irq(base);
  52. return 0;
  53. }
  54. static __inline__ ide_ioreg_t ide_default_io_base(int index)
  55. {
  56. if (ppc_ide_md.default_io_base)
  57. return ppc_ide_md.default_io_base(index);
  58. return 0;
  59. }
  60. static __inline__ void ide_init_hwif_ports(hw_regs_t *hw,
  61.    ide_ioreg_t data_port,
  62.    ide_ioreg_t ctrl_port, int *irq)
  63. {
  64. if (ppc_ide_md.ide_init_hwif != NULL)
  65. ppc_ide_md.ide_init_hwif(hw, data_port, ctrl_port, irq);
  66. }
  67. static __inline__ void ide_init_default_hwifs(void)
  68. {
  69. #ifndef CONFIG_BLK_DEV_IDEPCI
  70. hw_regs_t hw;
  71. int index;
  72. ide_ioreg_t base;
  73. for (index = 0; index < MAX_HWIFS; index++) {
  74. base = ide_default_io_base(index);
  75. if (base == 0)
  76. continue;
  77. ide_init_hwif_ports(&hw, base, 0, NULL);
  78. hw.irq = ide_default_irq(base);
  79. ide_register_hw(&hw, NULL);
  80. }
  81. #endif /* CONFIG_BLK_DEV_IDEPCI */
  82. }
  83. static __inline__ int ide_check_region (ide_ioreg_t from, unsigned int extent)
  84. {
  85. if (ppc_ide_md.ide_check_region)
  86. return ppc_ide_md.ide_check_region(from, extent);
  87. return 0;
  88. }
  89. static __inline__ void ide_request_region (ide_ioreg_t from, unsigned int extent, const char *name)
  90. {
  91. if (ppc_ide_md.ide_request_region)
  92. ppc_ide_md.ide_request_region(from, extent, name);
  93. }
  94. static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent)
  95. {
  96. if (ppc_ide_md.ide_release_region)
  97. ppc_ide_md.ide_release_region(from, extent);
  98. }
  99. typedef union {
  100. unsigned all : 8; /* all of the bits together */
  101. struct {
  102. unsigned bit7 : 1; /* always 1 */
  103. unsigned lba : 1; /* using LBA instead of CHS */
  104. unsigned bit5 : 1; /* always 1 */
  105. unsigned unit : 1; /* drive select number, 0/1 */
  106. unsigned head : 4; /* always zeros here */
  107. } b;
  108. } select_t;
  109. typedef union {
  110. unsigned all : 8; /* all of the bits together */
  111. struct {
  112. unsigned HOB : 1; /* 48-bit address ordering */
  113. unsigned reserved456 : 3;
  114. unsigned bit3 : 1; /* ATA-2 thingy */
  115. unsigned SRST : 1; /* host soft reset bit */
  116. unsigned nIEN : 1; /* device INTRQ to host */
  117. unsigned bit0 : 1;
  118. } b;
  119. } control_t;
  120. #if !defined(ide_request_irq)
  121. #define ide_request_irq(irq,hand,flg,dev,id) request_irq((irq),(hand),(flg),(dev),(id))
  122. #endif
  123. #if !defined(ide_free_irq)
  124. #define ide_free_irq(irq,dev_id) free_irq((irq), (dev_id))
  125. #endif
  126. /*
  127.  * The following are not needed for the non-m68k ports
  128.  * unless direct IDE on 8xx
  129.  */
  130. #if (defined CONFIG_APUS || defined CONFIG_BLK_DEV_MPC8xx_IDE )
  131. #define ide_ack_intr(hwif) (hwif->hw.ack_intr ? hwif->hw.ack_intr(hwif) : 1)
  132. #else
  133. #define ide_ack_intr(hwif) (1)
  134. #endif
  135. #define ide_release_lock(lock) do {} while (0)
  136. #define ide_get_lock(lock, hdlr, data) do {} while (0)
  137. #endif /* __KERNEL__ */
  138. #endif /* __ASMPPC_IDE_H */