cldma_platform.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. #include <linux/platform_device.h>
  2. #include <linux/interrupt.h>
  3. #include <linux/irq.h>
  4. #include "ccci_config.h"
  5. #if defined(CONFIG_MTK_CLKMGR)
  6. #include <mach/mt_clkmgr.h>
  7. #else
  8. #include <linux/clk.h>
  9. #endif /*CONFIG_MTK_CLKMGR */
  10. #ifdef FEATURE_RF_CLK_BUF
  11. #include <mt_clkbuf_ctl.h>
  12. #endif
  13. #ifdef FEATURE_INFORM_NFC_VSIM_CHANGE
  14. #include <mach/mt6605.h>
  15. #endif
  16. #include <mt-plat/upmu_common.h>
  17. #include <mach/mt_pbm.h>
  18. #include <mt_spm_sleep.h>
  19. #include "ccci_core.h"
  20. #include "ccci_platform.h"
  21. #include "modem_cldma.h"
  22. #include "cldma_platform.h"
  23. #include "cldma_reg.h"
  24. #include "modem_reg_base.h"
  25. #ifdef CONFIG_OF
  26. #include <linux/of.h>
  27. #include <linux/of_fdt.h>
  28. #include <linux/of_irq.h>
  29. #include <linux/of_address.h>
  30. #endif
  31. #include "ccci_core.h"
  32. #if !defined(CONFIG_MTK_CLKMGR)
  33. static struct clk *clk_scp_sys_md1_main;
  34. #endif
  35. static struct pinctrl *mdcldma_pinctrl;
  36. #define TAG "mcd"
  37. void md_cldma_hw_reset(struct ccci_modem *md)
  38. {
  39. unsigned int reg_value;
  40. CCCI_DBG_MSG(md->index, TAG, "md_cldma_hw_reset:rst cldma\n");
  41. /* reset cldma hw */
  42. reg_value = ccci_read32(infra_ao_base, INFRA_RST0_REG);
  43. reg_value &= ~(CLDMA_AO_RST_MASK | CLDMA_PD_RST_MASK);
  44. reg_value |= (CLDMA_AO_RST_MASK | CLDMA_PD_RST_MASK);
  45. ccci_write32(infra_ao_base, INFRA_RST0_REG, reg_value);
  46. CCCI_DBG_MSG(md->index, TAG, "md_cldma_hw_reset:clear reset\n");
  47. /* reset cldma clr */
  48. reg_value = ccci_read32(infra_ao_base, INFRA_RST1_REG);
  49. reg_value &= ~(CLDMA_AO_RST_MASK | CLDMA_PD_RST_MASK);
  50. reg_value |= (CLDMA_AO_RST_MASK | CLDMA_PD_RST_MASK);
  51. ccci_write32(infra_ao_base, INFRA_RST1_REG, reg_value);
  52. CCCI_DBG_MSG(md->index, TAG, "md_cldma_hw_reset:done\n");
  53. }
  54. int md_cd_get_modem_hw_info(struct platform_device *dev_ptr, struct ccci_dev_cfg *dev_cfg, struct md_hw_info *hw_info)
  55. {
  56. memset(dev_cfg, 0, sizeof(struct ccci_dev_cfg));
  57. memset(hw_info, 0, sizeof(struct md_hw_info));
  58. if (dev_ptr->dev.of_node == NULL) {
  59. CCCI_ERR_MSG(dev_cfg->index, TAG, "modem OF node NULL\n");
  60. return -1;
  61. }
  62. of_property_read_u32(dev_ptr->dev.of_node, "mediatek,md_id", &dev_cfg->index);
  63. CCCI_DBG_MSG(dev_cfg->index, TAG, "modem hw info get idx:%d\n", dev_cfg->index);
  64. if (!get_modem_is_enabled(dev_cfg->index)) {
  65. CCCI_ERR_MSG(dev_cfg->index, TAG, "modem %d not enable, exit\n", dev_cfg->index + 1);
  66. return -1;
  67. }
  68. switch (dev_cfg->index) {
  69. case 0: /* MD_SYS1 */
  70. dev_cfg->major = 0;
  71. dev_cfg->minor_base = 0;
  72. of_property_read_u32(dev_ptr->dev.of_node, "mediatek,cldma_capability", &dev_cfg->capability);
  73. hw_info->cldma_ap_ao_base = (unsigned long)of_iomap(dev_ptr->dev.of_node, 0);
  74. hw_info->cldma_md_ao_base = (unsigned long)of_iomap(dev_ptr->dev.of_node, 1);
  75. hw_info->cldma_ap_pdn_base = (unsigned long)of_iomap(dev_ptr->dev.of_node, 2);
  76. hw_info->cldma_md_pdn_base = (unsigned long)of_iomap(dev_ptr->dev.of_node, 3);
  77. hw_info->ap_ccif_base = (unsigned long)of_iomap(dev_ptr->dev.of_node, 4);
  78. hw_info->md_ccif_base = (unsigned long)of_iomap(dev_ptr->dev.of_node, 5);
  79. hw_info->cldma_irq_id = irq_of_parse_and_map(dev_ptr->dev.of_node, 0);
  80. hw_info->ap_ccif_irq_id = irq_of_parse_and_map(dev_ptr->dev.of_node, 1);
  81. hw_info->md_wdt_irq_id = irq_of_parse_and_map(dev_ptr->dev.of_node, 2);
  82. /* Device tree using none flag to register irq, sensitivity has set at "irq_of_parse_and_map" */
  83. hw_info->cldma_irq_flags = IRQF_TRIGGER_NONE;
  84. hw_info->ap_ccif_irq_flags = IRQF_TRIGGER_NONE;
  85. hw_info->md_wdt_irq_flags = IRQF_TRIGGER_NONE;
  86. hw_info->ap2md_bus_timeout_irq_flags = IRQF_TRIGGER_NONE;
  87. hw_info->sram_size = CCIF_SRAM_SIZE;
  88. hw_info->md_rgu_base = MD_RGU_BASE;
  89. hw_info->md_boot_slave_Vector = MD_BOOT_VECTOR;
  90. hw_info->md_boot_slave_Key = MD_BOOT_VECTOR_KEY;
  91. hw_info->md_boot_slave_En = MD_BOOT_VECTOR_EN;
  92. mdcldma_pinctrl = devm_pinctrl_get(&dev_ptr->dev);
  93. if (IS_ERR(mdcldma_pinctrl)) {
  94. CCCI_ERR_MSG(dev_cfg->index, TAG, "modem %d get mdcldma_pinctrl failed\n", dev_cfg->index + 1);
  95. return -1;
  96. }
  97. #if !defined(CONFIG_MTK_CLKMGR)
  98. clk_scp_sys_md1_main = devm_clk_get(&dev_ptr->dev, "scp-sys-md1-main");
  99. if (IS_ERR(clk_scp_sys_md1_main)) {
  100. CCCI_ERR_MSG(dev_cfg->index, TAG, "modem %d get scp-sys-md1-main failed\n", dev_cfg->index + 1);
  101. return -1;
  102. }
  103. #endif
  104. break;
  105. default:
  106. return -1;
  107. }
  108. CCCI_DBG_MSG(dev_cfg->index, TAG, "dev_major:%d,minor_base:%d,capability:%d\n",
  109. dev_cfg->major, dev_cfg->minor_base, dev_cfg->capability);
  110. CCCI_DBG_MSG(dev_cfg->index, TAG,
  111. "ap_cldma: ao_base=0x%p, pdn_base=0x%p,md_cldma: ao_base=0x%p, pdn_base=0x%p\n",
  112. (void *)hw_info->cldma_ap_ao_base, (void *)hw_info->cldma_ap_pdn_base,
  113. (void *)hw_info->cldma_md_ao_base, (void *)hw_info->cldma_md_pdn_base);
  114. CCCI_DBG_MSG(dev_cfg->index, TAG, "ap_ccif_base:0x%p, md_ccif_base:0x%p\n", (void *)hw_info->ap_ccif_base,
  115. (void *)hw_info->md_ccif_base);
  116. CCCI_DBG_MSG(dev_cfg->index, TAG, "cldma_irq:%d,ccif_irq:%d,md_wdt_irq:%d\n", hw_info->cldma_irq_id,
  117. hw_info->ap_ccif_irq_id, hw_info->md_wdt_irq_id);
  118. return 0;
  119. }
  120. int md_cd_io_remap_md_side_register(struct ccci_modem *md)
  121. {
  122. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  123. md_ctrl->cldma_ap_pdn_base = (void __iomem *)(md_ctrl->hw_info->cldma_ap_pdn_base);
  124. md_ctrl->cldma_ap_ao_base = (void __iomem *)(md_ctrl->hw_info->cldma_ap_ao_base);
  125. md_ctrl->cldma_md_pdn_base = (void __iomem *)(md_ctrl->hw_info->cldma_md_pdn_base);
  126. md_ctrl->cldma_md_ao_base = (void __iomem *)(md_ctrl->hw_info->cldma_md_ao_base);
  127. md_ctrl->md_boot_slave_Vector = ioremap_nocache(md_ctrl->hw_info->md_boot_slave_Vector, 0x4);
  128. md_ctrl->md_boot_slave_Key = ioremap_nocache(md_ctrl->hw_info->md_boot_slave_Key, 0x4);
  129. md_ctrl->md_boot_slave_En = ioremap_nocache(md_ctrl->hw_info->md_boot_slave_En, 0x4);
  130. md_ctrl->md_rgu_base = ioremap_nocache(md_ctrl->hw_info->md_rgu_base, 0x40);
  131. md_ctrl->md_global_con0 = ioremap_nocache(MD_GLOBAL_CON0, 0x4);
  132. md_ctrl->md_bus_status = ioremap_nocache(MD_BUS_STATUS_BASE, MD_BUS_STATUS_LENGTH);
  133. md_ctrl->md_pc_monitor = ioremap_nocache(MD_PC_MONITOR_BASE, MD_PC_MONITOR_LENGTH);
  134. md_ctrl->md_topsm_status = ioremap_nocache(MD_TOPSM_STATUS_BASE, MD_TOPSM_STATUS_LENGTH);
  135. md_ctrl->md_ost_status = ioremap_nocache(MD_OST_STATUS_BASE, MD_OST_STATUS_LENGTH);
  136. md_ctrl->md_pll = ioremap_nocache(MD_PLL_BASE, MD_PLL_LENGTH);
  137. #ifdef MD_PEER_WAKEUP
  138. md_ctrl->md_peer_wakeup = ioremap_nocache(MD_PEER_WAKEUP, 0x4);
  139. #endif
  140. return 0;
  141. }
  142. void md_cd_lock_cldma_clock_src(int locked)
  143. {
  144. /* spm_ap_mdsrc_req(locked); */
  145. }
  146. void md_cd_lock_modem_clock_src(int locked)
  147. {
  148. spm_ap_mdsrc_req(locked);
  149. }
  150. void md_cd_dump_debug_register(struct ccci_modem *md)
  151. {
  152. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  153. unsigned int reg_value;
  154. md_cd_lock_modem_clock_src(1);
  155. CCCI_INF_MSG(md->index, TAG, "Dump MD Bus status %x\n", MD_BUS_STATUS_BASE);
  156. ccci_mem_dump(md->index, md_ctrl->md_bus_status, MD_BUS_STATUS_LENGTH);
  157. CCCI_INF_MSG(md->index, TAG, "Dump MD PC monitor %x\n", MD_PC_MONITOR_BASE);
  158. /* stop MD PCMon */
  159. reg_value = ccci_read32(md_ctrl->md_pc_monitor, 0);
  160. reg_value &= ~(0x1 << 21);
  161. ccci_write32(md_ctrl->md_pc_monitor, 0, reg_value); /* clear bit[21] */
  162. ccci_write32((md_ctrl->md_pc_monitor + 4), 0, 0x80000000); /* stop MD PCMon */
  163. ccci_mem_dump(md->index, md_ctrl->md_pc_monitor, MD_PC_MONITOR_LENGTH);
  164. ccci_write32(md_ctrl->md_pc_monitor + 4, 0, 0x1); /* restart MD PCMon */
  165. CCCI_INF_MSG(md->index, TAG, "Dump MD TOPSM status %x\n", MD_TOPSM_STATUS_BASE);
  166. ccci_mem_dump(md->index, md_ctrl->md_topsm_status, MD_TOPSM_STATUS_LENGTH);
  167. CCCI_INF_MSG(md->index, TAG, "Dump MD OST status %x\n", MD_OST_STATUS_BASE);
  168. ccci_mem_dump(md->index, md_ctrl->md_ost_status, MD_OST_STATUS_LENGTH);
  169. CCCI_INF_MSG(md->index, TAG, "Dump MD PLL %x\n", MD_PLL_BASE);
  170. ccci_mem_dump(md->index, md_ctrl->md_pll, MD_PLL_LENGTH);
  171. md_cd_lock_modem_clock_src(0);
  172. }
  173. void md_cd_check_md_DCM(struct ccci_modem *md)
  174. {
  175. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  176. md_cd_lock_modem_clock_src(1);
  177. CCCI_INF_MSG(md->index, TAG, "MD DCM: 0x%X\n", *(unsigned int *)(md_ctrl->md_bus_status + 0x45C));
  178. md_cd_lock_modem_clock_src(0);
  179. }
  180. void md_cd_check_emi_state(struct ccci_modem *md, int polling)
  181. {
  182. }
  183. /* callback for system power off*/
  184. void ccci_power_off(void)
  185. {
  186. /*ALPS02057700 workaround:
  187. * Power on VLTE for system power off backlight work normal
  188. */
  189. CCCI_INF_MSG(-1, CORE, "ccci_power_off:set VLTE on,bit0,1\n");
  190. pmic_config_interface(0x04D6, 0x1, 0x1, 0); /* bit[0] =>1'b1 */
  191. udelay(200);
  192. }
  193. int md_cd_power_on(struct ccci_modem *md)
  194. {
  195. int ret = 0;
  196. unsigned int reg_value;
  197. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  198. #if defined(FEATURE_RF_CLK_BUF)
  199. struct pinctrl_state *RFIC0_01_mode;
  200. #endif
  201. /* turn on VLTE */
  202. #ifdef FEATURE_VLTE_SUPPORT
  203. struct pinctrl_state *vsram_output_high;
  204. if (NULL != mdcldma_pinctrl) {
  205. vsram_output_high = pinctrl_lookup_state(mdcldma_pinctrl, "vsram_output_high");
  206. if (IS_ERR(vsram_output_high)) {
  207. CCCI_INF_MSG(md->index, CORE, "cannot find vsram_output_high pintrl. ret=%ld\n",
  208. PTR_ERR(vsram_output_high));
  209. }
  210. pinctrl_select_state(mdcldma_pinctrl, vsram_output_high);
  211. } else {
  212. CCCI_INF_MSG(md->index, CORE, "mdcldma_pinctrl is NULL, some error happend.\n");
  213. }
  214. CCCI_INF_MSG(md->index, CORE, "md_cd_power_on:mt_set_gpio_out(GPIO_LTE_VSRAM_EXT_POWER_EN_PIN,1)\n");
  215. /* if(!(mt6325_upmu_get_swcid()==PMIC6325_E1_CID_CODE || */
  216. /* mt6325_upmu_get_swcid()==PMIC6325_E2_CID_CODE)) */
  217. {
  218. CCCI_INF_MSG(md->index, CORE, "md_cd_power_on:set VLTE on,bit0,1\n");
  219. pmic_config_interface(0x04D6, 0x1, 0x1, 0); /* bit[0] =>1'b1 */
  220. udelay(200);
  221. /*
  222. *[Notes] move into md cmos flow, for hardwareissue, so disable on denlai.
  223. * bring up need confirm with MD DE & SPM
  224. */
  225. /* reg_value = ccci_read32(infra_ao_base,0x338); */
  226. /* reg_value &= ~(0x40); //bit[6] =>1'b0 */
  227. /* ccci_write32(infra_ao_base,0x338,reg_value); */
  228. /* CCCI_INF_MSG(md->index, CORE, "md_cd_power_on: set infra_misc VLTE bit(0x1000_0338)=0x%x,
  229. bit[6]=0x%x\n",ccci_read32(infra_ao_base,0x338),(ccci_read32(infra_ao_base,0x338)&0x40)); */
  230. }
  231. #endif
  232. reg_value = ccci_read32(infra_ao_base, 0x338);
  233. reg_value &= ~(0x3 << 2); /* md1_srcclkena */
  234. reg_value |= (0x1 << 2);
  235. ccci_write32(infra_ao_base, 0x338, reg_value);
  236. CCCI_INF_MSG(md->index, CORE, "md_cd_power_on: set md1_srcclkena bit(0x1000_0338)=0x%x\n",
  237. ccci_read32(infra_ao_base, 0x338));
  238. #ifdef FEATURE_RF_CLK_BUF
  239. /* config RFICx as BSI */
  240. mutex_lock(&clk_buf_ctrl_lock); /* fixme,clkbuf, ->down(&clk_buf_ctrl_lock_2); */
  241. CCCI_INF_MSG(md->index, TAG, "clock buffer, BSI ignore mode\n");
  242. if (NULL != mdcldma_pinctrl) {
  243. RFIC0_01_mode = pinctrl_lookup_state(mdcldma_pinctrl, "RFIC0_01_mode");
  244. pinctrl_select_state(mdcldma_pinctrl, RFIC0_01_mode);
  245. }
  246. #endif
  247. /* power on MD_INFRA and MODEM_TOP */
  248. switch (md->index) {
  249. case MD_SYS1:
  250. #if defined(CONFIG_MTK_CLKMGR)
  251. CCCI_INF_MSG(md->index, TAG, "Call start md_power_on()\n");
  252. ret = md_power_on(SYS_MD1);
  253. CCCI_INF_MSG(md->index, TAG, "Call end md_power_on() ret=%d\n", ret);
  254. #else
  255. CCCI_INF_MSG(md->index, TAG, "Call start clk_prepare_enable()\n");
  256. ret = clk_prepare_enable(clk_scp_sys_md1_main);
  257. CCCI_INF_MSG(md->index, TAG, "Call end clk_prepare_enable()ret=%d\n", ret);
  258. #endif
  259. kicker_pbm_by_md(MD1, true);
  260. CCCI_INF_MSG(md->index, TAG, "Call end kicker_pbm_by_md(0,true)\n");
  261. break;
  262. }
  263. #ifdef FEATURE_RF_CLK_BUF
  264. mutex_unlock(&clk_buf_ctrl_lock); /* fixme,clkbuf, ->delete */
  265. #endif
  266. #ifdef FEATURE_INFORM_NFC_VSIM_CHANGE
  267. /* notify NFC */
  268. inform_nfc_vsim_change(md->index, 1, 0);
  269. #endif
  270. /* disable MD WDT */
  271. cldma_write32(md_ctrl->md_rgu_base, WDT_MD_MODE, WDT_MD_MODE_KEY);
  272. return ret;
  273. }
  274. int md_cd_bootup_cleanup(struct ccci_modem *md, int success)
  275. {
  276. return 0;
  277. }
  278. int md_cd_let_md_go(struct ccci_modem *md)
  279. {
  280. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  281. if (MD_IN_DEBUG(md))
  282. return -1;
  283. CCCI_INF_MSG(md->index, TAG, "set MD boot slave\n");
  284. /* set the start address to let modem to run */
  285. cldma_write32(md_ctrl->md_boot_slave_Key, 0, 0x3567C766); /* make boot vector programmable */
  286. cldma_write32(md_ctrl->md_boot_slave_Vector, 0, 0x00000000);
  287. /* after remap, MD ROM address is 0 from MD's view */
  288. cldma_write32(md_ctrl->md_boot_slave_En, 0, 0xA3B66175); /* make boot vector take effect */
  289. return 0;
  290. }
  291. int md_cd_power_off(struct ccci_modem *md, unsigned int timeout)
  292. {
  293. int ret = 0;
  294. int count = 50;
  295. unsigned int reg_value;
  296. #if defined(FEATURE_RF_CLK_BUF)
  297. struct pinctrl_state *RFIC0_04_mode;
  298. #endif
  299. #if defined(FEATURE_VLTE_SUPPORT)
  300. struct pinctrl_state *vsram_output_low;
  301. #endif
  302. #ifdef FEATURE_INFORM_NFC_VSIM_CHANGE
  303. /* notify NFC */
  304. inform_nfc_vsim_change(md->index, 0, 0);
  305. #endif
  306. while (spm_is_md1_sleep() == 0) {
  307. msleep(20);
  308. count--;
  309. if (count == 0) {
  310. CCCI_INF_MSG(md->index, TAG, "%s:poll md sleep timeout: %d",
  311. __func__, spm_is_md1_sleep());
  312. break;
  313. }
  314. }
  315. #ifdef FEATURE_RF_CLK_BUF
  316. mutex_lock(&clk_buf_ctrl_lock);
  317. #endif
  318. /* power off MD_INFRA and MODEM_TOP */
  319. switch (md->index) {
  320. case MD_SYS1:
  321. #if defined(CONFIG_MTK_CLKMGR)
  322. ret = md_power_off(SYS_MD1, timeout);
  323. #else
  324. clk_disable(clk_scp_sys_md1_main);
  325. #ifdef FEATURE_RF_CLK_BUF
  326. mutex_unlock(&clk_buf_ctrl_lock);
  327. #endif
  328. clk_unprepare(clk_scp_sys_md1_main); /* cannot be called in mutex context */
  329. #ifdef FEATURE_RF_CLK_BUF
  330. mutex_lock(&clk_buf_ctrl_lock);
  331. #endif
  332. #endif
  333. kicker_pbm_by_md(MD1, false);
  334. CCCI_INF_MSG(md->index, TAG, "Call end kicker_pbm_by_md(0,false)\n");
  335. break;
  336. }
  337. #ifdef FEATURE_RF_CLK_BUF
  338. /* config RFICx as AP SPM control */
  339. CCCI_INF_MSG(md->index, TAG, "clock buffer, AP SPM control mode\n");
  340. RFIC0_04_mode = pinctrl_lookup_state(mdcldma_pinctrl, "RFIC0_04_mode");
  341. pinctrl_select_state(mdcldma_pinctrl, RFIC0_04_mode);
  342. mutex_unlock(&clk_buf_ctrl_lock);
  343. #endif
  344. reg_value = ccci_read32(infra_ao_base, 0x338);
  345. reg_value &= ~(0x3 << 2); /* md1_srcclkena */
  346. ccci_write32(infra_ao_base, 0x338, reg_value);
  347. CCCI_INF_MSG(md->index, CORE, "md_cd_power_off: set md1_srcclkena bit(0x1000_0338)=0x%x\n",
  348. ccci_read32(infra_ao_base, 0x338));
  349. #ifdef FEATURE_VLTE_SUPPORT
  350. /* Turn off VLTE */
  351. /* if(!(mt6325_upmu_get_swcid()==PMIC6325_E1_CID_CODE || */
  352. /* mt6325_upmu_get_swcid()==PMIC6325_E2_CID_CODE)) */
  353. {
  354. /*
  355. *[Notes] move into md cmos flow, for hardwareissue, so disable on denlai.
  356. * bring up need confirm with MD DE & SPM
  357. */
  358. /* reg_value = ccci_read32(infra_ao_base,0x338); */
  359. /* reg_value &= ~(0x40); //bit[6] =>1'b0 */
  360. /* reg_value |= 0x40;//bit[6] =>1'b1 */
  361. /* ccci_write32(infra_ao_base,0x338,reg_value); */
  362. /* CCCI_INF_MSG(md->index, CORE, "md_cd_power_off: set SRCLKEN infra_misc(0x1000_0338)=0x%x,
  363. bit[6]=0x%x\n", ccci_read32(infra_ao_base, 0x338), (ccci_read32(infra_ao_base,0x338)&0x40)); */
  364. CCCI_INF_MSG(md->index, CORE, "md_cd_power_off:set VLTE on,bit0=0\n");
  365. pmic_config_interface(0x04D6, 0x0, 0x1, 0); /* bit[0] =>1'b0 */
  366. }
  367. if (NULL != mdcldma_pinctrl) {
  368. vsram_output_low = pinctrl_lookup_state(mdcldma_pinctrl, "vsram_output_low");
  369. if (IS_ERR(vsram_output_low)) {
  370. CCCI_INF_MSG(md->index, CORE, "cannot find vsram_output_low pintrl. ret=%ld\n",
  371. PTR_ERR(vsram_output_low));
  372. }
  373. pinctrl_select_state(mdcldma_pinctrl, vsram_output_low);
  374. } else {
  375. CCCI_INF_MSG(md->index, CORE, "mdcldma_pinctrl is NULL, some error happend.\n");
  376. }
  377. CCCI_INF_MSG(md->index, CORE, "md_cd_power_off:mt_set_gpio_out(GPIO_LTE_VSRAM_EXT_POWER_EN_PIN,0)\n");
  378. #endif
  379. return ret;
  380. }
  381. void cldma_dump_register(struct ccci_modem *md)
  382. {
  383. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  384. CCCI_INF_MSG(md->index, TAG, "dump AP CLDMA Tx pdn register, active=%x\n", md_ctrl->txq_active);
  385. ccci_mem_dump(md->index, md_ctrl->cldma_ap_pdn_base + CLDMA_AP_UL_START_ADDR_0,
  386. CLDMA_AP_UL_CHECKSUM_CHANNEL_ENABLE - CLDMA_AP_UL_START_ADDR_0 + 4);
  387. CCCI_INF_MSG(md->index, TAG, "dump AP CLDMA Tx ao register, active=%x\n", md_ctrl->txq_active);
  388. ccci_mem_dump(md->index, md_ctrl->cldma_ap_ao_base + CLDMA_AP_UL_START_ADDR_BK_0,
  389. CLDMA_AP_UL_CURRENT_ADDR_BK_7 - CLDMA_AP_UL_START_ADDR_BK_0 + 4);
  390. CCCI_INF_MSG(md->index, TAG, "dump AP CLDMA Rx pdn register, active=%x\n", md_ctrl->rxq_active);
  391. ccci_mem_dump(md->index, md_ctrl->cldma_ap_pdn_base + CLDMA_AP_SO_ERROR,
  392. CLDMA_AP_SO_STOP_CMD - CLDMA_AP_SO_ERROR + 4);
  393. CCCI_INF_MSG(md->index, TAG, "dump AP CLDMA Rx ao register, active=%x\n", md_ctrl->rxq_active);
  394. ccci_mem_dump(md->index, md_ctrl->cldma_ap_ao_base + CLDMA_AP_SO_CFG,
  395. CLDMA_AP_DEBUG_ID_EN - CLDMA_AP_SO_CFG + 4);
  396. CCCI_INF_MSG(md->index, TAG, "dump AP CLDMA MISC pdn register\n");
  397. ccci_mem_dump(md->index, md_ctrl->cldma_ap_pdn_base + CLDMA_AP_L2TISAR0,
  398. CLDMA_AP_CLDMA_IP_BUSY - CLDMA_AP_L2TISAR0 + 4);
  399. CCCI_INF_MSG(md->index, TAG, "dump AP CLDMA MISC ao register\n");
  400. ccci_mem_dump(md->index, md_ctrl->cldma_ap_ao_base + CLDMA_AP_L2RIMR0, CLDMA_AP_DUMMY - CLDMA_AP_L2RIMR0 + 4);
  401. CCCI_INF_MSG(md->index, TAG, "dump MD CLDMA Tx pdn register, active=%x\n", md_ctrl->txq_active);
  402. ccci_mem_dump(md->index, md_ctrl->cldma_md_pdn_base + CLDMA_AP_UL_START_ADDR_0,
  403. CLDMA_AP_UL_CHECKSUM_CHANNEL_ENABLE - CLDMA_AP_UL_START_ADDR_0 + 4);
  404. CCCI_INF_MSG(md->index, TAG, "dump MD CLDMA Tx ao register, active=%x\n", md_ctrl->txq_active);
  405. ccci_mem_dump(md->index, md_ctrl->cldma_md_ao_base + CLDMA_AP_UL_START_ADDR_BK_0,
  406. CLDMA_AP_UL_CURRENT_ADDR_BK_7 - CLDMA_AP_UL_START_ADDR_BK_0 + 4);
  407. CCCI_INF_MSG(md->index, TAG, "dump MD CLDMA Rx pdn register, active=%x\n", md_ctrl->rxq_active);
  408. ccci_mem_dump(md->index, md_ctrl->cldma_md_pdn_base + CLDMA_AP_SO_ERROR,
  409. CLDMA_AP_SO_STOP_CMD - CLDMA_AP_SO_ERROR + 4);
  410. CCCI_INF_MSG(md->index, TAG, "dump MD CLDMA Rx ao register, active=%x\n", md_ctrl->rxq_active);
  411. ccci_mem_dump(md->index, md_ctrl->cldma_md_ao_base + CLDMA_AP_SO_CFG,
  412. CLDMA_AP_DEBUG_ID_EN - CLDMA_AP_SO_CFG + 4);
  413. CCCI_INF_MSG(md->index, TAG, "dump MD CLDMA MISC pdn register\n");
  414. ccci_mem_dump(md->index, md_ctrl->cldma_md_pdn_base + CLDMA_AP_L2TISAR0,
  415. CLDMA_AP_CLDMA_IP_BUSY - CLDMA_AP_L2TISAR0 + 4);
  416. CCCI_INF_MSG(md->index, TAG, "dump MD CLDMA MISC ao register\n");
  417. ccci_mem_dump(md->index, md_ctrl->cldma_md_ao_base + CLDMA_AP_L2RIMR0, CLDMA_AP_DUMMY - CLDMA_AP_L2RIMR0 + 4);
  418. }
  419. int ccci_modem_remove(struct platform_device *dev)
  420. {
  421. return 0;
  422. }
  423. void ccci_modem_shutdown(struct platform_device *dev)
  424. {
  425. }
  426. int ccci_modem_suspend(struct platform_device *dev, pm_message_t state)
  427. {
  428. struct ccci_modem *md = (struct ccci_modem *)dev->dev.platform_data;
  429. CCCI_DBG_MSG(md->index, TAG, "ccci_modem_suspend\n");
  430. return 0;
  431. }
  432. int ccci_modem_resume(struct platform_device *dev)
  433. {
  434. struct ccci_modem *md = (struct ccci_modem *)dev->dev.platform_data;
  435. CCCI_DBG_MSG(md->index, TAG, "ccci_modem_resume\n");
  436. return 0;
  437. }
  438. int ccci_modem_pm_suspend(struct device *device)
  439. {
  440. struct platform_device *pdev = to_platform_device(device);
  441. BUG_ON(pdev == NULL);
  442. return ccci_modem_suspend(pdev, PMSG_SUSPEND);
  443. }
  444. int ccci_modem_pm_resume(struct device *device)
  445. {
  446. struct platform_device *pdev = to_platform_device(device);
  447. BUG_ON(pdev == NULL);
  448. return ccci_modem_resume(pdev);
  449. }
  450. int ccci_modem_pm_restore_noirq(struct device *device)
  451. {
  452. struct ccci_modem *md = (struct ccci_modem *)device->platform_data;
  453. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  454. /* set flag for next md_start */
  455. md->config.setting |= MD_SETTING_RELOAD;
  456. md->config.setting |= MD_SETTING_FIRST_BOOT;
  457. /* restore IRQ */
  458. #ifdef FEATURE_PM_IPO_H
  459. irq_set_irq_type(md_ctrl->cldma_irq_id, IRQF_TRIGGER_HIGH);
  460. irq_set_irq_type(md_ctrl->md_wdt_irq_id, IRQF_TRIGGER_FALLING);
  461. #endif
  462. return 0;
  463. }
  464. void ccci_modem_restore_reg(struct ccci_modem *md)
  465. {
  466. struct md_cd_ctrl *md_ctrl = (struct md_cd_ctrl *)md->private_data;
  467. int i;
  468. unsigned long flags;
  469. if (md->md_state == GATED || md->md_state == RESET || md->md_state == INVALID) {
  470. CCCI_DBG_MSG(md->index, TAG, "Resume no need reset cldma for md_state=%d\n", md->md_state);
  471. return;
  472. }
  473. cldma_write32(md_ctrl->ap_ccif_base, APCCIF_CON, 0x01); /* arbitration */
  474. if (cldma_read32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_TQSAR(0))) {
  475. CCCI_DBG_MSG(md->index, TAG, "Resume cldma pdn register: No need ...\n");
  476. } else {
  477. CCCI_DBG_MSG(md->index, TAG, "Resume cldma pdn register ...11\n");
  478. spin_lock_irqsave(&md_ctrl->cldma_timeout_lock, flags);
  479. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_HPQR, 0x00);
  480. /* set checksum */
  481. switch (CHECKSUM_SIZE) {
  482. case 0:
  483. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CHECKSUM_CHANNEL_ENABLE, 0);
  484. break;
  485. case 12:
  486. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CHECKSUM_CHANNEL_ENABLE,
  487. CLDMA_BM_ALL_QUEUE);
  488. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CFG,
  489. cldma_read32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CFG) & ~0x10);
  490. break;
  491. case 16:
  492. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CHECKSUM_CHANNEL_ENABLE,
  493. CLDMA_BM_ALL_QUEUE);
  494. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CFG,
  495. cldma_read32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_CFG) | 0x10);
  496. break;
  497. }
  498. /* set start address */
  499. for (i = 0; i < QUEUE_LEN(md_ctrl->txq); i++) {
  500. if (cldma_read32(md_ctrl->cldma_ap_ao_base, CLDMA_AP_TQCPBAK(md_ctrl->txq[i].index)) == 0) {
  501. CCCI_DBG_MSG(md->index, TAG, "Resume CH(%d) current bak:== 0\n", i);
  502. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_TQSAR(md_ctrl->txq[i].index),
  503. md_ctrl->txq[i].tr_done->gpd_addr);
  504. cldma_write32(md_ctrl->cldma_ap_ao_base, CLDMA_AP_TQSABAK(md_ctrl->txq[i].index),
  505. md_ctrl->txq[i].tr_done->gpd_addr);
  506. } else {
  507. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_TQSAR(md_ctrl->txq[i].index),
  508. cldma_read32(md_ctrl->cldma_ap_ao_base,
  509. CLDMA_AP_TQCPBAK(md_ctrl->txq[i].index)));
  510. cldma_write32(md_ctrl->cldma_ap_ao_base, CLDMA_AP_TQSABAK(md_ctrl->txq[i].index),
  511. cldma_read32(md_ctrl->cldma_ap_ao_base,
  512. CLDMA_AP_TQCPBAK(md_ctrl->txq[i].index)));
  513. }
  514. }
  515. /* wait write done*/
  516. wmb();
  517. /* start all Tx and Rx queues */
  518. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_START_CMD, CLDMA_BM_ALL_QUEUE);
  519. cldma_read32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_UL_START_CMD); /* dummy read */
  520. md_ctrl->txq_active |= CLDMA_BM_ALL_QUEUE;
  521. /* cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_SO_START_CMD, CLDMA_BM_ALL_QUEUE); */
  522. /* cldma_read32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_SO_START_CMD); // dummy read */
  523. /* md_ctrl->rxq_active |= CLDMA_BM_ALL_QUEUE; */
  524. /* enable L2 DONE and ERROR interrupts */
  525. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_L2TIMCR0, CLDMA_BM_INT_DONE | CLDMA_BM_INT_ERROR);
  526. /* enable all L3 interrupts */
  527. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_L3TIMCR0, CLDMA_BM_INT_ALL);
  528. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_L3TIMCR1, CLDMA_BM_INT_ALL);
  529. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_L3RIMCR0, CLDMA_BM_INT_ALL);
  530. cldma_write32(md_ctrl->cldma_ap_pdn_base, CLDMA_AP_L3RIMCR1, CLDMA_BM_INT_ALL);
  531. spin_unlock_irqrestore(&md_ctrl->cldma_timeout_lock, flags);
  532. CCCI_DBG_MSG(md->index, TAG, "Resume cldma pdn register done\n");
  533. }
  534. }
  535. int ccci_modem_syssuspend(void)
  536. {
  537. CCCI_DBG_MSG(0, TAG, "ccci_modem_syssuspend\n");
  538. return 0;
  539. }
  540. void ccci_modem_sysresume(void)
  541. {
  542. struct ccci_modem *md;
  543. CCCI_DBG_MSG(0, TAG, "ccci_modem_sysresume\n");
  544. md = ccci_get_modem_by_id(0);
  545. if (md != NULL)
  546. ccci_modem_restore_reg(md);
  547. }