module.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * PCBIT-D module support
  3. *
  4. * Copyright (C) 1996 Universidade de Lisboa
  5. *
  6. * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  7. *
  8. * This software may be used and distributed according to the terms of
  9. * the GNU General Public License, incorporated herein by reference.
  10. */
  11. #include <linux/module.h>
  12. #include <linux/init.h>
  13. #include <linux/sched.h>
  14. #include <linux/string.h>
  15. #include <linux/kernel.h>
  16. #include <linux/skbuff.h>
  17. #include <linux/isdnif.h>
  18. #include "pcbit.h"
  19. MODULE_DESCRIPTION("ISDN4Linux: Driver for PCBIT-T card");
  20. MODULE_AUTHOR("Pedro Roque Marques");
  21. MODULE_LICENSE("GPL");
  22. static int mem[MAX_PCBIT_CARDS];
  23. static int irq[MAX_PCBIT_CARDS];
  24. module_param_array(mem, int, NULL, 0);
  25. module_param_array(irq, int, NULL, 0);
  26. static int num_boards;
  27. struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
  28. extern void pcbit_terminate(int board);
  29. extern int pcbit_init_dev(int board, int mem_base, int irq);
  30. static int __init pcbit_init(void)
  31. {
  32. int board;
  33. num_boards = 0;
  34. printk(KERN_NOTICE
  35. "PCBIT-D device driver v 0.5-fjpc0 19991204 - "
  36. "Copyright (C) 1996 Universidade de Lisboa\n");
  37. if (mem[0] || irq[0])
  38. {
  39. for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++)
  40. {
  41. if (!mem[board])
  42. mem[board] = 0xD0000;
  43. if (!irq[board])
  44. irq[board] = 5;
  45. if (pcbit_init_dev(board, mem[board], irq[board]) == 0)
  46. num_boards++;
  47. else
  48. {
  49. printk(KERN_WARNING
  50. "pcbit_init failed for dev %d",
  51. board + 1);
  52. return -EIO;
  53. }
  54. }
  55. }
  56. /* Hardcoded default settings detection */
  57. if (!num_boards)
  58. {
  59. printk(KERN_INFO
  60. "Trying to detect board using default settings\n");
  61. if (pcbit_init_dev(0, 0xD0000, 5) == 0)
  62. num_boards++;
  63. else
  64. return -EIO;
  65. }
  66. return 0;
  67. }
  68. static void __exit pcbit_exit(void)
  69. {
  70. #ifdef MODULE
  71. int board;
  72. for (board = 0; board < num_boards; board++)
  73. pcbit_terminate(board);
  74. printk(KERN_NOTICE
  75. "PCBIT-D module unloaded\n");
  76. #endif
  77. }
  78. #ifndef MODULE
  79. #define MAX_PARA (MAX_PCBIT_CARDS * 2)
  80. static int __init pcbit_setup(char *line)
  81. {
  82. int i, j, argc;
  83. char *str;
  84. int ints[MAX_PARA+1];
  85. str = get_options(line, MAX_PARA, ints);
  86. argc = ints[0];
  87. i = 0;
  88. j = 1;
  89. while (argc && (i<MAX_PCBIT_CARDS)) {
  90. if (argc) {
  91. mem[i] = ints[j];
  92. j++; argc--;
  93. }
  94. if (argc) {
  95. irq[i] = ints[j];
  96. j++; argc--;
  97. }
  98. i++;
  99. }
  100. return(1);
  101. }
  102. __setup("pcbit=", pcbit_setup);
  103. #endif
  104. module_init(pcbit_init);
  105. module_exit(pcbit_exit);