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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Parallel-port initialisation code.
  2.  * 
  3.  * Authors: David Campbell <campbell@torque.net>
  4.  *          Tim Waugh <tim@cyberelk.demon.co.uk>
  5.  *     Jose Renau <renau@acm.org>
  6.  *
  7.  * based on work by Grant Guenther <grant@torque.net>
  8.  *              and Philip Blundell <Philip.Blundell@pobox.com>
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/module.h>
  12. #include <linux/threads.h>
  13. #include <linux/string.h>
  14. #include <linux/parport.h>
  15. #include <linux/errno.h>
  16. #include <linux/kernel.h>
  17. #include <linux/slab.h>
  18. #include <linux/init.h>
  19. #ifndef MODULE
  20. static int io[PARPORT_MAX+1] __initdata = { [0 ... PARPORT_MAX] = 0 };
  21. #ifdef CONFIG_PARPORT_PC
  22. static int io_hi[PARPORT_MAX+1] __initdata =
  23. { [0 ... PARPORT_MAX] = PARPORT_IOHI_AUTO };
  24. #endif
  25. static int irq[PARPORT_MAX] __initdata = { [0 ... PARPORT_MAX-1] = PARPORT_IRQ_PROBEONLY };
  26. static int dma[PARPORT_MAX] __initdata = { [0 ... PARPORT_MAX-1] = PARPORT_DMA_NONE };
  27. extern int parport_pc_init(int *io, int *io_hi, int *irq, int *dma);
  28. extern int parport_sunbpp_init(void);
  29. extern int parport_amiga_init(void);
  30. extern int parport_mfc3_init(void);
  31. extern int parport_atari_init(void);
  32. static int parport_setup_ptr __initdata = 0;
  33. /*
  34.  * Acceptable parameters:
  35.  *
  36.  * parport=0
  37.  * parport=auto
  38.  * parport=0xBASE[,IRQ[,DMA]]
  39.  *
  40.  * IRQ/DMA may be numeric or 'auto' or 'none'
  41.  */
  42. static int __init parport_setup (char *str)
  43. {
  44. char *endptr;
  45. char *sep;
  46. int val;
  47. if (!str || !*str || (*str == '0' && !*(str+1))) {
  48. /* Disable parport if "parport=0" in cmdline */
  49. io[0] = PARPORT_DISABLE;
  50. return 1;
  51. }
  52. if (!strncmp (str, "auto", 4)) {
  53. irq[0] = PARPORT_IRQ_AUTO;
  54. dma[0] = PARPORT_DMA_AUTO;
  55. return 1;
  56. }
  57. val = simple_strtoul (str, &endptr, 0);
  58. if (endptr == str) {
  59. printk (KERN_WARNING "parport=%s not understoodn", str);
  60. return 1;
  61. }
  62. if (parport_setup_ptr == PARPORT_MAX) {
  63. printk(KERN_ERR "parport=%s ignored, too many portsn", str);
  64. return 1;
  65. }
  66. io[parport_setup_ptr] = val;
  67. irq[parport_setup_ptr] = PARPORT_IRQ_NONE;
  68. dma[parport_setup_ptr] = PARPORT_DMA_NONE;
  69. sep = strchr (str, ',');
  70. if (sep++) {
  71. if (!strncmp (sep, "auto", 4))
  72. irq[parport_setup_ptr] = PARPORT_IRQ_AUTO;
  73. else if (strncmp (sep, "none", 4)) {
  74. val = simple_strtoul (sep, &endptr, 0);
  75. if (endptr == sep) {
  76. printk (KERN_WARNING
  77. "parport=%s: irq not understoodn",
  78. str);
  79. return 1;
  80. }
  81. irq[parport_setup_ptr] = val;
  82. }
  83. }
  84. sep = strchr (sep, ',');
  85. if (sep++) {
  86. if (!strncmp (sep, "auto", 4))
  87. dma[parport_setup_ptr] = PARPORT_DMA_AUTO;
  88. else if (!strncmp (sep, "nofifo", 6))
  89. dma[parport_setup_ptr] = PARPORT_DMA_NOFIFO;
  90. else if (strncmp (sep, "none", 4)) {
  91. val = simple_strtoul (sep, &endptr, 0);
  92. if (endptr == sep) {
  93. printk (KERN_WARNING
  94. "parport=%s: dma not understoodn",
  95. str);
  96. return 1;
  97. }
  98. dma[parport_setup_ptr] = val;
  99. }
  100. }
  101. parport_setup_ptr++;
  102. return 1;
  103. }
  104. __setup ("parport=", parport_setup);
  105. #endif
  106. #ifdef MODULE
  107. int init_module(void)
  108. {
  109. #ifdef CONFIG_SYSCTL
  110. parport_default_proc_register ();
  111. #endif
  112. return 0;
  113. }
  114. void cleanup_module(void)
  115. {
  116. #ifdef CONFIG_SYSCTL
  117. parport_default_proc_unregister ();
  118. #endif
  119. }
  120. #else
  121. int __init parport_init (void)
  122. {
  123. if (io[0] == PARPORT_DISABLE) 
  124. return 1;
  125. #ifdef CONFIG_SYSCTL
  126. parport_default_proc_register ();
  127. #endif
  128. #ifdef CONFIG_PARPORT_PC
  129. parport_pc_init(io, io_hi, irq, dma);
  130. #endif
  131. #ifdef CONFIG_PARPORT_AMIGA
  132. parport_amiga_init();
  133. #endif
  134. #ifdef CONFIG_PARPORT_MFC3
  135. parport_mfc3_init();
  136. #endif
  137. #ifdef CONFIG_PARPORT_ATARI
  138. parport_atari_init();
  139. #endif
  140. #ifdef CONFIG_PARPORT_ARC
  141. parport_arc_init();
  142. #endif
  143. #ifdef CONFIG_PARPORT_SUNBPP
  144. parport_sunbpp_init();
  145. #endif
  146. return 0;
  147. }
  148. __initcall(parport_init);
  149. #endif
  150. /* Exported symbols for modules. */
  151. EXPORT_SYMBOL(parport_claim);
  152. EXPORT_SYMBOL(parport_claim_or_block);
  153. EXPORT_SYMBOL(parport_release);
  154. EXPORT_SYMBOL(parport_register_port);
  155. EXPORT_SYMBOL(parport_announce_port);
  156. EXPORT_SYMBOL(parport_unregister_port);
  157. EXPORT_SYMBOL(parport_register_driver);
  158. EXPORT_SYMBOL(parport_unregister_driver);
  159. EXPORT_SYMBOL(parport_register_device);
  160. EXPORT_SYMBOL(parport_unregister_device);
  161. EXPORT_SYMBOL(parport_enumerate);
  162. EXPORT_SYMBOL(parport_get_port);
  163. EXPORT_SYMBOL(parport_put_port);
  164. EXPORT_SYMBOL(parport_find_number);
  165. EXPORT_SYMBOL(parport_find_base);
  166. EXPORT_SYMBOL(parport_negotiate);
  167. EXPORT_SYMBOL(parport_write);
  168. EXPORT_SYMBOL(parport_read);
  169. EXPORT_SYMBOL(parport_ieee1284_wakeup);
  170. EXPORT_SYMBOL(parport_wait_peripheral);
  171. EXPORT_SYMBOL(parport_poll_peripheral);
  172. EXPORT_SYMBOL(parport_wait_event);
  173. EXPORT_SYMBOL(parport_set_timeout);
  174. EXPORT_SYMBOL(parport_ieee1284_interrupt);
  175. EXPORT_SYMBOL(parport_ieee1284_ecp_write_data);
  176. EXPORT_SYMBOL(parport_ieee1284_ecp_read_data);
  177. EXPORT_SYMBOL(parport_ieee1284_ecp_write_addr);
  178. EXPORT_SYMBOL(parport_ieee1284_write_compat);
  179. EXPORT_SYMBOL(parport_ieee1284_read_nibble);
  180. EXPORT_SYMBOL(parport_ieee1284_read_byte);
  181. EXPORT_SYMBOL(parport_ieee1284_epp_write_data);
  182. EXPORT_SYMBOL(parport_ieee1284_epp_read_data);
  183. EXPORT_SYMBOL(parport_ieee1284_epp_write_addr);
  184. EXPORT_SYMBOL(parport_ieee1284_epp_read_addr);
  185. EXPORT_SYMBOL(parport_proc_register);
  186. EXPORT_SYMBOL(parport_proc_unregister);
  187. EXPORT_SYMBOL(parport_device_proc_register);
  188. EXPORT_SYMBOL(parport_device_proc_unregister);
  189. EXPORT_SYMBOL(parport_default_proc_register);
  190. EXPORT_SYMBOL(parport_default_proc_unregister);
  191. EXPORT_SYMBOL(parport_parse_irqs);
  192. EXPORT_SYMBOL(parport_parse_dmas);
  193. #ifdef CONFIG_PARPORT_1284
  194. EXPORT_SYMBOL(parport_open);
  195. EXPORT_SYMBOL(parport_close);
  196. EXPORT_SYMBOL(parport_device_id);
  197. EXPORT_SYMBOL(parport_device_num);
  198. EXPORT_SYMBOL(parport_device_coords);
  199. EXPORT_SYMBOL(parport_daisy_deselect_all);
  200. EXPORT_SYMBOL(parport_daisy_select);
  201. EXPORT_SYMBOL(parport_daisy_init);
  202. EXPORT_SYMBOL(parport_find_device);
  203. EXPORT_SYMBOL(parport_find_class);
  204. #endif
  205. void inc_parport_count(void)
  206. {
  207. #ifdef MODULE
  208. MOD_INC_USE_COUNT;
  209. #endif
  210. }
  211. void dec_parport_count(void)
  212. {
  213. #ifdef MODULE
  214. MOD_DEC_USE_COUNT;
  215. #endif
  216. }