ip2base.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // ip2.c
  2. // This is a dummy module to make the firmware available when needed
  3. // and allows it to be unloaded when not. Rumor is the __initdata
  4. // macro doesn't always works on all platforms so we use this kludge.
  5. // If not compiled as a module it just makes fip_firm avaliable then
  6. // __initdata should work as advertized
  7. //
  8. #include <linux/module.h>
  9. #include <linux/init.h>
  10. #include <linux/wait.h>
  11. #ifndef __init
  12. #define __init
  13. #endif
  14. #ifndef __initfunc
  15. #define __initfunc(a) a
  16. #endif
  17. #ifndef __initdata
  18. #define __initdata
  19. #endif
  20. #include "ip2types.h"
  21. int
  22. ip2_loadmain(int *, int *); // ref into ip2main.c
  23. /* Note: Add compiled in defaults to these arrays, not to the structure
  24. in ip2.h any longer. That structure WILL get overridden
  25. by these values, or command line values, or insmod values!!! =mhw=
  26. */
  27. static int io[IP2_MAX_BOARDS]= { 0, 0, 0, 0 };
  28. static int irq[IP2_MAX_BOARDS] = { -1, -1, -1, -1 };
  29. static int poll_only = 0;
  30. MODULE_AUTHOR("Doug McNash");
  31. MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
  32. module_param_array(irq, int, NULL, 0);
  33. MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards");
  34. module_param_array(io, int, NULL, 0);
  35. MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards");
  36. module_param(poll_only, bool, 0);
  37. MODULE_PARM_DESC(poll_only,"Do not use card interrupts");
  38. static int __init ip2_init(void)
  39. {
  40. if( poll_only ) {
  41. /* Hard lock the interrupts to zero */
  42. irq[0] = irq[1] = irq[2] = irq[3] = 0;
  43. }
  44. return ip2_loadmain(io, irq);
  45. }
  46. module_init(ip2_init);
  47. MODULE_LICENSE("GPL");
  48. #ifndef MODULE
  49. /******************************************************************************
  50. * ip2_setup:
  51. * str: kernel command line string
  52. *
  53. * Can't autoprobe the boards so user must specify configuration on
  54. * kernel command line. Sane people build it modular but the others
  55. * come here.
  56. *
  57. * Alternating pairs of io,irq for up to 4 boards.
  58. * ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3
  59. *
  60. * io=0 => No board
  61. * io=1 => PCI
  62. * io=2 => EISA
  63. * else => ISA I/O address
  64. *
  65. * irq=0 or invalid for ISA will revert to polling mode
  66. *
  67. * Any value = -1, do not overwrite compiled in value.
  68. *
  69. ******************************************************************************/
  70. static int __init ip2_setup(char *str)
  71. {
  72. int ints[10]; /* 4 boards, 2 parameters + 2 */
  73. int i, j;
  74. str = get_options (str, ARRAY_SIZE(ints), ints);
  75. for( i = 0, j = 1; i < 4; i++ ) {
  76. if( j > ints[0] ) {
  77. break;
  78. }
  79. if( ints[j] >= 0 ) {
  80. io[i] = ints[j];
  81. }
  82. j++;
  83. if( j > ints[0] ) {
  84. break;
  85. }
  86. if( ints[j] >= 0 ) {
  87. irq[i] = ints[j];
  88. }
  89. j++;
  90. }
  91. return 1;
  92. }
  93. __setup("ip2=", ip2_setup);
  94. #endif /* !MODULE */