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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/drivers/ide/rapide.c
  3.  *
  4.  * Copyright (c) 1996-1998 Russell King.
  5.  *
  6.  * Changelog:
  7.  *  08-06-1996 RMK Created
  8.  *  13-04-1998 RMK Added manufacturer and product IDs
  9.  */
  10. #include <linux/module.h>
  11. #include <linux/slab.h>
  12. #include <linux/blkdev.h>
  13. #include <linux/errno.h>
  14. #include <linux/ide.h>
  15. #include <linux/init.h>
  16. #include <asm/ecard.h>
  17. static card_ids __init rapide_cids[] = {
  18. { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 },
  19. { 0xffff, 0xffff }
  20. };
  21. static struct expansion_card *ec[MAX_ECARDS];
  22. static int result[MAX_ECARDS];
  23. static inline int rapide_register(struct expansion_card *ec)
  24. {
  25. unsigned long port = ecard_address (ec, ECARD_MEMC, 0);
  26. hw_regs_t hw;
  27. int i;
  28. memset(&hw, 0, sizeof(hw));
  29. for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
  30. hw.io_ports[i] = (ide_ioreg_t)port;
  31. port += 1 << 4;
  32. }
  33. hw.io_ports[IDE_CONTROL_OFFSET] = port + 0x206;
  34. hw.irq = ec->irq;
  35. return ide_register_hw(&hw, NULL);
  36. }
  37. int __init rapide_init(void)
  38. {
  39. int i;
  40. for (i = 0; i < MAX_ECARDS; i++)
  41. ec[i] = NULL;
  42. ecard_startfind();
  43. for (i = 0; ; i++) {
  44. if ((ec[i] = ecard_find(0, rapide_cids)) == NULL)
  45. break;
  46. ecard_claim(ec[i]);
  47. result[i] = rapide_register(ec[i]);
  48. }
  49. for (i = 0; i < MAX_ECARDS; i++)
  50. if (ec[i] && result[i] < 0) {
  51. ecard_release(ec[i]);
  52. ec[i] = NULL;
  53. }
  54. return 0;
  55. }
  56. #ifdef MODULE
  57. MODULE_LICENSE("GPL");
  58. int init_module (void)
  59. {
  60. return rapide_init();
  61. }
  62. void cleanup_module (void)
  63. {
  64. int i;
  65. for (i = 0; i < MAX_ECARDS; i++)
  66. if (ec[i]) {
  67. unsigned long port;
  68. port = ecard_address(ec[i], ECARD_MEMC, 0);
  69. ide_unregister_port(port, ec[i]->irq, 16);
  70. ecard_release(ec[i]);
  71. ec[i] = NULL;
  72. }
  73. }
  74. #endif