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

嵌入式Linux

开发平台:

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