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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/ide/q40ide.c -- Q40 I/O port IDE Driver
  3.  *
  4.  *     (c) Richard Zidlicky
  5.  *
  6.  *  This file is subject to the terms and conditions of the GNU General Public
  7.  *  License.  See the file COPYING in the main directory of this archive for
  8.  *  more details.
  9.  *
  10.  *
  11.  */
  12. #include <linux/types.h>
  13. #include <linux/mm.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/blkdev.h>
  16. #include <linux/hdreg.h>
  17. #include <linux/ide.h>
  18.     /*
  19.      *  Bases of the IDE interfaces
  20.      */
  21. #define Q40IDE_NUM_HWIFS 2
  22. #define PCIDE_BASE1 0x1f0
  23. #define PCIDE_BASE2 0x170
  24. #define PCIDE_BASE3 0x1e8
  25. #define PCIDE_BASE4 0x168
  26. #define PCIDE_BASE5 0x1e0
  27. #define PCIDE_BASE6 0x160
  28. static const q40ide_ioreg_t pcide_bases[Q40IDE_NUM_HWIFS] = {
  29.     PCIDE_BASE1, PCIDE_BASE2, /* PCIDE_BASE3, PCIDE_BASE4  , PCIDE_BASE5,
  30.     PCIDE_BASE6 */
  31. };
  32.     /*
  33.      *  Offsets from one of the above bases
  34.      */
  35. /* HD_DATA was redefined in asm-m68k/ide.h */
  36. #undef HD_DATA
  37. #define HD_DATA  0x1f0
  38. #define PCIDE_REG(x) ((q40ide_ioreg_t)(HD_##x-PCIDE_BASE1))
  39. static const int pcide_offsets[IDE_NR_PORTS] = {
  40.     PCIDE_REG(DATA), PCIDE_REG(ERROR), PCIDE_REG(NSECTOR), PCIDE_REG(SECTOR),
  41.     PCIDE_REG(LCYL), PCIDE_REG(HCYL), PCIDE_REG(CURRENT), PCIDE_REG(STATUS),
  42.     PCIDE_REG(CMD)
  43. };
  44. static int q40ide_default_irq(q40ide_ioreg_t base)
  45. {
  46.            switch (base) { 
  47.             case 0x1f0: return 14;
  48.     case 0x170: return 15;
  49.     case 0x1e8: return 11;
  50.     default:
  51. return 0;
  52.    }
  53. }
  54.     /*
  55.      *  Probe for Q40 IDE interfaces
  56.      */
  57. void q40ide_init(void)
  58. {
  59.     int i;
  60.     if (!MACH_IS_Q40)
  61.       return ;
  62.     for (i = 0; i < Q40IDE_NUM_HWIFS; i++) {
  63. hw_regs_t hw;
  64. ide_setup_ports(&hw,(ide_ioreg_t) pcide_bases[i], (int *)pcide_offsets, 
  65. pcide_bases[i]+0x206, 
  66. 0, NULL, q40ide_default_irq(pcide_bases[i]));
  67. ide_register_hw(&hw, NULL);
  68.     }
  69. }