ccci_init.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <mach/irqs.h>
  5. #include <ccif.h>
  6. #include <ccif.h>
  7. #include <ccci.h>
  8. unsigned long long lg_ch_rx_debug_enable[MAX_MD_NUM];
  9. unsigned long long lg_ch_tx_debug_enable[MAX_MD_NUM];
  10. static int __init ccci_init(void)
  11. {
  12. int ret = CCCI_ERR_MODULE_INIT_OK;
  13. unsigned int md_num = 1;
  14. int i = 0;
  15. int md_en[MAX_MD_NUM] = { 0 };
  16. /* 1. Get and set Support MD nmmber */
  17. md_num = get_md_sys_max_num();
  18. set_md_sys_max_num(md_num);
  19. /* 2. Get and set MD enable table */
  20. for (i = 0; i < md_num; i++) {
  21. if (get_modem_is_enabled(i)) {
  22. md_en[i] = 1;
  23. set_md_enable(i, 1);
  24. } else {
  25. md_en[i] = 0;
  26. set_md_enable(i, 0);
  27. }
  28. }
  29. #ifdef ENABLE_CCCI_DRV_BUILDIN
  30. CCCI_MSG("ccci_init: device_initcall_sync\n");
  31. #else /* MODULE */
  32. CCCI_MSG("ccci_init: module_init\n");
  33. #endif
  34. /* 3. Init ccci device table */
  35. ret = init_ccci_dev_node();
  36. if (ret) {
  37. CCCI_MSG("init_ccci_dev_node fail: %d\n", ret);
  38. ret = -CCCI_ERR_INIT_DEV_NODE_FAIL;
  39. goto out;
  40. }
  41. /* 4. Init ccci driver for each modem */
  42. for (i = 0; i < md_num; i++) {
  43. if (md_en[i] == 0) {
  44. CCCI_MSG_INF(i, "cci",
  45. "md initial fail: md%d is not enabled\n",
  46. i + 1);
  47. continue;
  48. }
  49. /* 4.0 Init platform support function */
  50. ret = platform_init(i, !md_en[i]);
  51. if (ret) {
  52. CCCI_MSG_INF(i, "cci", "platform_init fail: %d\n", ret);
  53. ret = -CCCI_ERR_INIT_PLATFORM_FAIL;
  54. goto platform_out;
  55. } else {
  56. CCCI_DBG_MSG(i, "cci", "platform_init OK!\n");
  57. }
  58. /* Make ccci device node */
  59. ret = mk_ccci_dev_node(i);
  60. if (ret) {
  61. CCCI_MSG_INF(i, "cci", "mk_ccci_dev_node fail: %d\n",
  62. ret);
  63. ret = -CCCI_ERR_MK_DEV_NODE_FAIL;
  64. goto mk_node_out;
  65. } else {
  66. CCCI_DBG_MSG(i, "cci", "mk_ccci_dev_node OK!\n");
  67. }
  68. /* Statistics init */
  69. statistics_init(i);
  70. /* 4.1 Init ccci logical layer */
  71. ret = ccci_logic_layer_init(i);
  72. if (ret) {
  73. CCCI_MSG_INF(i, "cci",
  74. "ccci logical layer init fail: %d\n", ret);
  75. ret = -CCCI_ERR_INIT_LOGIC_LAYER_FAIL;
  76. goto logic_out;
  77. } else {
  78. CCCI_DBG_MSG(i, "cci", "ccci_logic_layer_init OK!\n");
  79. }
  80. /* 4.2 Init md ctrl */
  81. ret = ccci_md_ctrl_init(i);
  82. if (ret) {
  83. CCCI_MSG_INF(i, "cci", "ccci md ctrl init fail: %d\n",
  84. ret);
  85. ret = -CCCI_ERR_INIT_MD_CTRL_FAIL;
  86. goto mdctl_out;
  87. } else {
  88. CCCI_DBG_MSG(i, "cci", "ccci_md_ctrl_init OK!\n");
  89. }
  90. /* 4.3 Init char dev */
  91. ret = ccci_chrdev_init(i);
  92. if (ret) {
  93. CCCI_MSG_INF(i, "cci", "ccci_chrdev_init fail: %d\n",
  94. ret);
  95. ret = -CCCI_ERR_INIT_CHAR_DEV_FAIL;
  96. goto char_out;
  97. } else {
  98. CCCI_DBG_MSG(i, "cci", "ccci_chrdev_init OK!\n");
  99. }
  100. /* 4.4 Init tty dev */
  101. ret = ccci_tty_init(i);
  102. if (ret) {
  103. CCCI_MSG_INF(i, "cci", "ccci_tty_init fail: %d\n", ret);
  104. ret = -CCCI_ERR_INIT_TTY_FAIL;
  105. goto tty_out;
  106. } else {
  107. CCCI_DBG_MSG(i, "cci", "ccci_tty_init OK!\n");
  108. }
  109. /* 4.5 Init ipc dev */
  110. ret = ccci_ipc_init(i);
  111. if (ret) {
  112. CCCI_MSG_INF(i, "cci", "ccci_ipc_init fail: %d\n", ret);
  113. ret = -CCCI_ERR_INIT_IPC_FAIL;
  114. goto ipc_out;
  115. } else {
  116. CCCI_DBG_MSG(i, "cci", "ccci_ipc_init OK!\n");
  117. }
  118. /* 4.6 Init rpc dev */
  119. ret = ccci_rpc_init(i);
  120. if (ret) {
  121. CCCI_MSG_INF(i, "cci", "ccci_rpc_init fail: %d\n", ret);
  122. ret = -CCCI_ERR_INIT_RPC_FAIL;
  123. goto rpc_out;
  124. } else {
  125. CCCI_DBG_MSG(i, "cci", "ccci_rpc_init OK!\n");
  126. }
  127. /* 4.7 Init fs dev */
  128. ret = ccci_fs_init(i);
  129. if (ret) {
  130. CCCI_MSG_INF(i, "cci", "ccci_fs_init fail: %d\n", ret);
  131. ret = -CCCI_ERR_INIT_FS_FAIL;
  132. goto fs_out;
  133. } else {
  134. CCCI_DBG_MSG(i, "cci", "ccci_fs_init OK!\n");
  135. }
  136. /* 4.8 Init ccmni dev */
  137. ret = ccmni_init(i);
  138. if (ret) {
  139. CCCI_MSG_INF(i, "cci", "ccmni_init fail: %d\n", ret);
  140. ret = -CCCI_ERR_INIT_CCMNI_FAIL;
  141. goto ccmni_out;
  142. } else {
  143. CCCI_DBG_MSG(i, "cci", "ccmni_init OK!\n");
  144. }
  145. /* 4.9 Init pmic dev */
  146. /* .... */
  147. /* 4.10 Init vir char dev */
  148. ret = ccci_vir_chrdev_init(i);
  149. if (ret) {
  150. CCCI_MSG_INF(i, "cci",
  151. "ccci_vir_chrdev_init fail: %d\n", ret);
  152. ret = -CCCI_ERR_INIT_VIR_CHAR_FAIL;
  153. goto virchar_out;
  154. } else {
  155. CCCI_DBG_MSG(i, "cci", "ccci_vir_chrdev_init OK!\n");
  156. }
  157. CCCI_MSG_INF(i, "cci", "md initial OK!\n");
  158. }
  159. /* 5. Init common section */
  160. ret = ccci_md_ctrl_common_init();
  161. if (ret == 0)
  162. goto out;
  163. else {
  164. i = md_num - 1;
  165. CCCI_MSG_INF(i, "cci", "ccci_md_ctrl_common_init fail: %d\n",
  166. ret);
  167. }
  168. virchar_out:
  169. ccci_vir_chrdev_exit(i);
  170. ccmni_out:
  171. ccmni_exit(i);
  172. fs_out:
  173. ccci_fs_exit(i);
  174. rpc_out:
  175. ccci_rpc_exit(i);
  176. ipc_out:
  177. ccci_ipc_exit(i);
  178. tty_out:
  179. ccci_tty_exit(i);
  180. char_out:
  181. ccci_chrdev_exit(i);
  182. mdctl_out:
  183. ccci_md_ctrl_exit(i);
  184. logic_out:
  185. ccci_logic_layer_exit(i);
  186. platform_out:
  187. platform_deinit(i);
  188. mk_node_out:
  189. ccci_dev_node_exit(i);
  190. out:
  191. if ((i == MD_SYS2) && (md_num > MD_SYS2)) {
  192. ccci_vir_chrdev_exit(MD_SYS1);
  193. ccmni_exit(MD_SYS1);
  194. ccci_fs_exit(MD_SYS1);
  195. ccci_rpc_exit(MD_SYS1);
  196. ccci_ipc_exit(MD_SYS1);
  197. ccci_tty_exit(MD_SYS1);
  198. ccci_chrdev_exit(MD_SYS1);
  199. ccci_md_ctrl_exit(MD_SYS1);
  200. ccci_logic_layer_exit(MD_SYS1);
  201. platform_deinit(MD_SYS1);
  202. ccci_dev_node_exit(MD_SYS1);
  203. }
  204. if (ret == CCCI_ERR_MODULE_INIT_OK)
  205. CCCI_MSG("ccci module init OK\n");
  206. else {
  207. release_ccci_dev_node();
  208. ccci_helper_exit();
  209. CCCI_MSG("ccci module init fail: %d\n", ret);
  210. }
  211. return ret;
  212. }
  213. static void __exit ccci_exit(void)
  214. {
  215. unsigned int md_num = 1, i;
  216. /* 1. Get Support MD nmmber */
  217. md_num = get_md_sys_max_num();
  218. /* 2. Init ccci driver for each modem */
  219. for (i = 0; i < md_num; i++) {
  220. /* 3.1 de-Init virtual char dev */
  221. ccci_vir_chrdev_exit(i);
  222. /* 3.2 de-Init ccmni dev */
  223. ccmni_exit(i);
  224. /* 3.3 de-Init fs dev */
  225. ccci_fs_exit(i);
  226. /* 3.4 de-Init rpc dev */
  227. ccci_rpc_exit(i);
  228. /* 3.5 de-Init ipc dev */
  229. ccci_ipc_exit(i);
  230. /* 3.6 de-Init tty dev */
  231. ccci_tty_exit(i);
  232. /* 3.7 de-Init char dev */
  233. ccci_chrdev_exit(i);
  234. /* 3.8 De-Init md ctrl */
  235. ccci_md_ctrl_exit(i);
  236. /* 3.9 de-Init ccci logical layer */
  237. ccci_logic_layer_exit(i);
  238. /* 3.10 de-Init ccci platform layer */
  239. platform_deinit(i);
  240. /* 3.11 de-Init ccci device node */
  241. ccci_dev_node_exit(i);
  242. }
  243. /* 3.12 release ccci class */
  244. release_ccci_dev_node();
  245. /* 3.13 de-Init ccci helper grobal data */
  246. ccci_helper_exit();
  247. }
  248. /* Build-in Modified - S */
  249. #ifdef ENABLE_CCCI_DRV_BUILDIN
  250. device_initcall_sync(ccci_init);
  251. #else /* MODULE */
  252. module_init(ccci_init);
  253. #endif
  254. /* Build-in Modified - E */
  255. module_exit(ccci_exit);
  256. MODULE_DESCRIPTION("CCIF Driver");
  257. MODULE_LICENSE("GPL");
  258. MODULE_AUTHOR("MTK");