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

嵌入式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.  * IDE routines for typical pc-like standard configurations.
  7.  *
  8.  * Copyright (C) 1998, 1999, 2001 by Ralf Baechle
  9.  */
  10. #include <linux/sched.h>
  11. #include <linux/ide.h>
  12. #include <linux/ioport.h>
  13. #include <linux/hdreg.h>
  14. #include <asm/ptrace.h>
  15. #include <asm/hdreg.h>
  16. static int std_ide_default_irq(ide_ioreg_t base)
  17. {
  18. switch (base) {
  19. case 0x1f0: return 14;
  20. case 0x170: return 15;
  21. case 0x1e8: return 11;
  22. case 0x168: return 10;
  23. case 0x1e0: return 8;
  24. case 0x160: return 12;
  25. default:
  26. return 0;
  27. }
  28. }
  29. static ide_ioreg_t std_ide_default_io_base(int index)
  30. {
  31. switch (index) {
  32. case 0: return 0x1f0;
  33. case 1: return 0x170;
  34. case 2: return 0x1e8;
  35. case 3: return 0x168;
  36. case 4: return 0x1e0;
  37. case 5: return 0x160;
  38. default:
  39. return 0;
  40. }
  41. }
  42. static void std_ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port,
  43.                                      ide_ioreg_t ctrl_port, int *irq)
  44. {
  45. ide_ioreg_t reg = data_port;
  46. int i;
  47. for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
  48. hw->io_ports[i] = reg;
  49. reg += 1;
  50. }
  51. if (ctrl_port) {
  52. hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
  53. } else {
  54. hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
  55. }
  56. if (irq != NULL)
  57. *irq = 0;
  58. hw->io_ports[IDE_IRQ_OFFSET] = 0;
  59. }
  60. static int std_ide_request_irq(unsigned int irq,
  61.                                 void (*handler)(int,void *, struct pt_regs *),
  62.                                 unsigned long flags, const char *device,
  63.                                 void *dev_id)
  64. {
  65. return request_irq(irq, handler, flags, device, dev_id);
  66. }
  67. static void std_ide_free_irq(unsigned int irq, void *dev_id)
  68. {
  69. free_irq(irq, dev_id);
  70. }
  71. static int std_ide_check_region(ide_ioreg_t from, unsigned int extent)
  72. {
  73. return check_region(from, extent);
  74. }
  75. static void std_ide_request_region(ide_ioreg_t from, unsigned int extent,
  76.                                     const char *name)
  77. {
  78. request_region(from, extent, name);
  79. }
  80. static void std_ide_release_region(ide_ioreg_t from, unsigned int extent)
  81. {
  82. release_region(from, extent);
  83. }
  84. struct ide_ops std_ide_ops = {
  85. &std_ide_default_irq,
  86. &std_ide_default_io_base,
  87. &std_ide_init_hwif_ports,
  88. &std_ide_request_irq,
  89. &std_ide_free_irq,
  90. &std_ide_check_region,
  91. &std_ide_request_region,
  92. &std_ide_release_region
  93. };