| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <mach/irqs.h>
- #include <ccif.h>
- #include <ccif.h>
- #include <ccci.h>
- unsigned long long lg_ch_rx_debug_enable[MAX_MD_NUM];
- unsigned long long lg_ch_tx_debug_enable[MAX_MD_NUM];
- static int __init ccci_init(void)
- {
- int ret = CCCI_ERR_MODULE_INIT_OK;
- unsigned int md_num = 1;
- int i = 0;
- int md_en[MAX_MD_NUM] = { 0 };
- /* 1. Get and set Support MD nmmber */
- md_num = get_md_sys_max_num();
- set_md_sys_max_num(md_num);
- /* 2. Get and set MD enable table */
- for (i = 0; i < md_num; i++) {
- if (get_modem_is_enabled(i)) {
- md_en[i] = 1;
- set_md_enable(i, 1);
- } else {
- md_en[i] = 0;
- set_md_enable(i, 0);
- }
- }
- #ifdef ENABLE_CCCI_DRV_BUILDIN
- CCCI_MSG("ccci_init: device_initcall_sync\n");
- #else /* MODULE */
- CCCI_MSG("ccci_init: module_init\n");
- #endif
- /* 3. Init ccci device table */
- ret = init_ccci_dev_node();
- if (ret) {
- CCCI_MSG("init_ccci_dev_node fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_DEV_NODE_FAIL;
- goto out;
- }
- /* 4. Init ccci driver for each modem */
- for (i = 0; i < md_num; i++) {
- if (md_en[i] == 0) {
- CCCI_MSG_INF(i, "cci",
- "md initial fail: md%d is not enabled\n",
- i + 1);
- continue;
- }
- /* 4.0 Init platform support function */
- ret = platform_init(i, !md_en[i]);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "platform_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_PLATFORM_FAIL;
- goto platform_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "platform_init OK!\n");
- }
- /* Make ccci device node */
- ret = mk_ccci_dev_node(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "mk_ccci_dev_node fail: %d\n",
- ret);
- ret = -CCCI_ERR_MK_DEV_NODE_FAIL;
- goto mk_node_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "mk_ccci_dev_node OK!\n");
- }
- /* Statistics init */
- statistics_init(i);
- /* 4.1 Init ccci logical layer */
- ret = ccci_logic_layer_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci",
- "ccci logical layer init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_LOGIC_LAYER_FAIL;
- goto logic_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_logic_layer_init OK!\n");
- }
- /* 4.2 Init md ctrl */
- ret = ccci_md_ctrl_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccci md ctrl init fail: %d\n",
- ret);
- ret = -CCCI_ERR_INIT_MD_CTRL_FAIL;
- goto mdctl_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_md_ctrl_init OK!\n");
- }
- /* 4.3 Init char dev */
- ret = ccci_chrdev_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccci_chrdev_init fail: %d\n",
- ret);
- ret = -CCCI_ERR_INIT_CHAR_DEV_FAIL;
- goto char_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_chrdev_init OK!\n");
- }
- /* 4.4 Init tty dev */
- ret = ccci_tty_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccci_tty_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_TTY_FAIL;
- goto tty_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_tty_init OK!\n");
- }
- /* 4.5 Init ipc dev */
- ret = ccci_ipc_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccci_ipc_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_IPC_FAIL;
- goto ipc_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_ipc_init OK!\n");
- }
- /* 4.6 Init rpc dev */
- ret = ccci_rpc_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccci_rpc_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_RPC_FAIL;
- goto rpc_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_rpc_init OK!\n");
- }
- /* 4.7 Init fs dev */
- ret = ccci_fs_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccci_fs_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_FS_FAIL;
- goto fs_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_fs_init OK!\n");
- }
- /* 4.8 Init ccmni dev */
- ret = ccmni_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci", "ccmni_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_CCMNI_FAIL;
- goto ccmni_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccmni_init OK!\n");
- }
- /* 4.9 Init pmic dev */
- /* .... */
- /* 4.10 Init vir char dev */
- ret = ccci_vir_chrdev_init(i);
- if (ret) {
- CCCI_MSG_INF(i, "cci",
- "ccci_vir_chrdev_init fail: %d\n", ret);
- ret = -CCCI_ERR_INIT_VIR_CHAR_FAIL;
- goto virchar_out;
- } else {
- CCCI_DBG_MSG(i, "cci", "ccci_vir_chrdev_init OK!\n");
- }
- CCCI_MSG_INF(i, "cci", "md initial OK!\n");
- }
- /* 5. Init common section */
- ret = ccci_md_ctrl_common_init();
- if (ret == 0)
- goto out;
- else {
- i = md_num - 1;
- CCCI_MSG_INF(i, "cci", "ccci_md_ctrl_common_init fail: %d\n",
- ret);
- }
- virchar_out:
- ccci_vir_chrdev_exit(i);
- ccmni_out:
- ccmni_exit(i);
- fs_out:
- ccci_fs_exit(i);
- rpc_out:
- ccci_rpc_exit(i);
- ipc_out:
- ccci_ipc_exit(i);
- tty_out:
- ccci_tty_exit(i);
- char_out:
- ccci_chrdev_exit(i);
- mdctl_out:
- ccci_md_ctrl_exit(i);
- logic_out:
- ccci_logic_layer_exit(i);
- platform_out:
- platform_deinit(i);
- mk_node_out:
- ccci_dev_node_exit(i);
- out:
- if ((i == MD_SYS2) && (md_num > MD_SYS2)) {
- ccci_vir_chrdev_exit(MD_SYS1);
- ccmni_exit(MD_SYS1);
- ccci_fs_exit(MD_SYS1);
- ccci_rpc_exit(MD_SYS1);
- ccci_ipc_exit(MD_SYS1);
- ccci_tty_exit(MD_SYS1);
- ccci_chrdev_exit(MD_SYS1);
- ccci_md_ctrl_exit(MD_SYS1);
- ccci_logic_layer_exit(MD_SYS1);
- platform_deinit(MD_SYS1);
- ccci_dev_node_exit(MD_SYS1);
- }
- if (ret == CCCI_ERR_MODULE_INIT_OK)
- CCCI_MSG("ccci module init OK\n");
- else {
- release_ccci_dev_node();
- ccci_helper_exit();
- CCCI_MSG("ccci module init fail: %d\n", ret);
- }
- return ret;
- }
- static void __exit ccci_exit(void)
- {
- unsigned int md_num = 1, i;
- /* 1. Get Support MD nmmber */
- md_num = get_md_sys_max_num();
- /* 2. Init ccci driver for each modem */
- for (i = 0; i < md_num; i++) {
- /* 3.1 de-Init virtual char dev */
- ccci_vir_chrdev_exit(i);
- /* 3.2 de-Init ccmni dev */
- ccmni_exit(i);
- /* 3.3 de-Init fs dev */
- ccci_fs_exit(i);
- /* 3.4 de-Init rpc dev */
- ccci_rpc_exit(i);
- /* 3.5 de-Init ipc dev */
- ccci_ipc_exit(i);
- /* 3.6 de-Init tty dev */
- ccci_tty_exit(i);
- /* 3.7 de-Init char dev */
- ccci_chrdev_exit(i);
- /* 3.8 De-Init md ctrl */
- ccci_md_ctrl_exit(i);
- /* 3.9 de-Init ccci logical layer */
- ccci_logic_layer_exit(i);
- /* 3.10 de-Init ccci platform layer */
- platform_deinit(i);
- /* 3.11 de-Init ccci device node */
- ccci_dev_node_exit(i);
- }
- /* 3.12 release ccci class */
- release_ccci_dev_node();
- /* 3.13 de-Init ccci helper grobal data */
- ccci_helper_exit();
- }
- /* Build-in Modified - S */
- #ifdef ENABLE_CCCI_DRV_BUILDIN
- device_initcall_sync(ccci_init);
- #else /* MODULE */
- module_init(ccci_init);
- #endif
- /* Build-in Modified - E */
- module_exit(ccci_exit);
- MODULE_DESCRIPTION("CCIF Driver");
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("MTK");
|