msdc_io.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. *
  31. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver\'s
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. #include "msdc.h"
  36. #include "msdc_io.h"
  37. #if defined(MMC_MSDC_DRV_CTP)
  38. #include <common.h>
  39. #include "api.h" //For invocation cache_clean_invalidate()
  40. #include "cache_api.h" //For invocation cache_clean_invalidate()
  41. #endif
  42. #if defined(MMC_MSDC_DRV_LK)
  43. #include <kernel/event.h>
  44. #include <platform/mt_irq.h>
  45. #endif
  46. #if defined(MMC_MSDC_DRV_CTP)
  47. #include "gpio.h"
  48. #if defined(MSDC_USE_DCM)
  49. #include "dcm.h"
  50. #endif
  51. #if !defined(FPGA_PLATFORM)
  52. #include "pmic.h"
  53. #include "clock_manager.h"
  54. #endif
  55. #endif
  56. ////////////////////////////////////////////////////////////////////////////////
  57. //
  58. // Section 1. Power Control -- Common for ASIC and FPGA
  59. //
  60. ////////////////////////////////////////////////////////////////////////////////
  61. //Note: MTKDRV_XXX are used by CTP
  62. #if defined(MTKDRV_PMIC) && defined(MTKDRV_PMIC_WRAP) && defined(MTKDRV_I2C)
  63. #include <upmu_hw.h>
  64. #else
  65. #define pmic_config_interface(RegNum, val, MASK, SHIFT)
  66. #define pmic_read_interface(RegNum, val, MASK, SHIFT)
  67. #endif
  68. #if defined(FPGA_PLATFORM)
  69. #define PWR_GPIO (0x10001E84) //Select Power On/Off
  70. #define PWR_GPIO_EO (0x10001E88) //Select Output/Input Direction
  71. #define PWR_MASK_CARD (0x1 << 8) //Vcc
  72. #define PWR_MASK_VOL_18 (0x1 << 9) //CLK/CMD/DAT for eMMC/SD + Vccq for eMMC
  73. #define PWR_MASK_VOL_33 (0x1 << 10) //CLK/CMD/DAT for eMMC/SD + Vccq for eMMC
  74. #define PWR_MASK_L4 (0x1 << 11)
  75. #define PWR_MSDC (PWR_MASK_CARD | PWR_MASK_VOL_18 | PWR_MASK_VOL_33 | PWR_MASK_L4)
  76. //#define FPGA_GPIO_DEBUG
  77. static void msdc_clr_gpio(u32 bits)
  78. {
  79. u32 l_val = 0;
  80. char *name;
  81. switch (bits) {
  82. case PWR_MASK_CARD:
  83. name = "card pwr";
  84. break;
  85. case PWR_MASK_VOL_18:
  86. name = "SD/eMMC bus pwer 1.8V";
  87. break;
  88. case PWR_MASK_VOL_33:
  89. name = "SD/eMMC bus pwer 3.3V";
  90. break;
  91. case PWR_MASK_L4:
  92. name = "L4";
  93. break;
  94. default:
  95. msdc_pr_err("[%s:%s]invalid value: 0x%x\n", __FILE__, __func__, bits);
  96. return;
  97. }
  98. MSDC_GET_FIELD(PWR_GPIO_EO, bits, l_val);
  99. //msdc_pr_info("====%s====%d\n", name, l_val);
  100. if (0 == l_val) {
  101. msdc_pr_info("check me! gpio for %s is input\n", name);
  102. MSDC_SET_FIELD(PWR_GPIO_EO, bits, 1);
  103. }
  104. /* check for set before */
  105. if (bits & MSDC_READ32(PWR_GPIO)) {
  106. msdc_pr_info("clear %s\n", name);
  107. MSDC_SET_FIELD(PWR_GPIO, bits, 0);
  108. //l_val = MSDC_READ32(PWR_GPIO);
  109. }
  110. #ifdef FPGA_GPIO_DEBUG
  111. {
  112. u32 val = 0;
  113. val = MSDC_READ32(PWR_GPIO);
  114. msdc_pr_err("[clr]PWR_GPIO[8-11]:0x%x\n", val);
  115. val = MSDC_READ32(PWR_GPIO_EO);
  116. msdc_pr_err("[clr]GPIO_DIR[8-11] :0x%x\n", val);
  117. }
  118. #endif
  119. }
  120. static void msdc_set_gpio(u32 bits)
  121. {
  122. u32 l_val = 0;
  123. char *name;
  124. switch (bits) {
  125. case PWR_MASK_CARD:
  126. name = "card pwr";
  127. break;
  128. case PWR_MASK_VOL_18:
  129. name = "SD/eMMC bus pwer 1.8V";
  130. break;
  131. case PWR_MASK_VOL_33:
  132. name = "SD/eMMC bus pwer 3.3V";
  133. break;
  134. case PWR_MASK_L4:
  135. name = "L4";
  136. break;
  137. default:
  138. msdc_pr_err("[%s:%s]invalid value: 0x%x\n", __FILE__, __func__, bits);
  139. return;
  140. }
  141. MSDC_GET_FIELD(PWR_GPIO_EO, bits, l_val);
  142. //msdc_pr_info("====%s====%d\n", name, l_val);
  143. if (0 == l_val) {
  144. msdc_pr_info("check me! gpio for %s is input\n", name);
  145. MSDC_SET_FIELD(PWR_GPIO_EO, bits, 1);
  146. }
  147. /* check for set before */
  148. if ((bits & MSDC_READ32(PWR_GPIO))==0) {
  149. msdc_pr_info("Set %s\n", name);
  150. MSDC_SET_FIELD(PWR_GPIO, bits, 1);
  151. //l_val = MSDC_READ32(PWR_GPIO);
  152. }
  153. #ifdef FPGA_GPIO_DEBUG
  154. {
  155. u32 val = 0;
  156. val = MSDC_READ32(PWR_GPIO);
  157. msdc_pr_err("[set]PWR_GPIO[8-11]:0x%x\n", val);
  158. val = MSDC_READ32(PWR_GPIO_EO);
  159. msdc_pr_err("[set]GPIO_DIR[8-11] :0x%x\n", val);
  160. }
  161. #endif
  162. }
  163. #endif
  164. #if defined(MMC_MSDC_DRV_CTP) && !defined(FPGA_PLATFORM)
  165. u32 hwPowerOn(MSDC_POWER powerId, MSDC_POWER_VOLTAGE powerVolt)
  166. {
  167. u32 ret;
  168. switch (powerId) {
  169. case MSDC_VEMC:
  170. if (powerVolt == VOL_3000) {
  171. pmic_config_interface(REG_VEMC_VOSEL, VEMC_VOSEL_3V, MASK_VEMC_VOSEL, SHIFT_VEMC_VOSEL);
  172. if (EMMC_VOL_ACTUAL != VOL_3000) {
  173. pmic_config_interface(REG_VEMC_VOSEL_CAL,
  174. VEMC_VOSEL_CAL_mV(EMMC_VOL_ACTUAL - VOL_3000),
  175. MASK_VEMC_VOSEL_CAL, SHIFT_VEMC_VOSEL_CAL);
  176. }
  177. } else if (powerVolt == VOL_3300) {
  178. pmic_config_interface(REG_VEMC_VOSEL, VEMC_VOSEL_3V3, MASK_VEMC_VOSEL, SHIFT_VEMC_VOSEL);
  179. } else {
  180. msdc_pr_err("Not support to Set VEMC_3V3 power to %d\n", powerVolt);
  181. }
  182. pmic_config_interface(REG_VEMC_EN, 1, MASK_VEMC_EN, SHIFT_VEMC_EN);
  183. break;
  184. case MSDC_VMC:
  185. if (powerVolt == VOL_3300 || powerVolt == VOL_3000)
  186. pmic_config_interface(REG_VMC_VOSEL, VMC_VOSEL_3V, MASK_VMC_VOSEL, SHIFT_VMC_VOSEL);
  187. else if (powerVolt == VOL_1800)
  188. pmic_config_interface(REG_VMC_VOSEL, VMC_VOSEL_1V8, MASK_VMC_VOSEL, SHIFT_VMC_VOSEL);
  189. else
  190. msdc_pr_err("Not support to Set VMC power to %d\n", powerVolt);
  191. pmic_config_interface(REG_VMC_EN, 1, MASK_VMC_EN, SHIFT_VMC_EN);
  192. break;
  193. case MSDC_VMCH:
  194. if (powerVolt == VOL_3000) {
  195. pmic_config_interface(REG_VMCH_VOSEL, VMCH_VOSEL_3V, MASK_VMCH_VOSEL, SHIFT_VMCH_VOSEL);
  196. if (SD_VOL_ACTUAL != VOL_3000) {
  197. pmic_config_interface(REG_VMCH_VOSEL_CAL,
  198. VMCH_VOSEL_CAL_mV(SD_VOL_ACTUAL - VOL_3000),
  199. MASK_VMCH_VOSEL_CAL, SHIFT_VMCH_VOSEL_CAL);
  200. }
  201. } else if (powerVolt == VOL_3300) {
  202. pmic_config_interface(REG_VMCH_VOSEL, VMCH_VOSEL_3V3, MASK_VMCH_VOSEL, SHIFT_VMCH_VOSEL);
  203. } else {
  204. msdc_pr_err("Not support to Set VMCH power to %d\n", powerVolt);
  205. }
  206. pmic_config_interface(REG_VMCH_EN, 1, MASK_VMCH_EN, SHIFT_VMCH_EN);
  207. break;
  208. default:
  209. msdc_pr_err("Not support to Set %d power on\n", powerId);
  210. break;
  211. }
  212. return 0;
  213. }
  214. u32 hwPowerDown(MSDC_POWER powerId)
  215. {
  216. switch (powerId) {
  217. case MSDC_VEMC:
  218. pmic_config_interface(REG_VEMC_EN, 0, MASK_VEMC_EN, SHIFT_VEMC_EN);
  219. break;
  220. case MSDC_VMC:
  221. pmic_config_interface(REG_VMC_EN, 0, MASK_VMC_EN, SHIFT_VMC_EN);
  222. break;
  223. case MSDC_VMCH:
  224. pmic_config_interface(REG_VMCH_EN, 0, MASK_VMCH_EN, SHIFT_VMCH_EN);
  225. break;
  226. default:
  227. msdc_pr_err("Not support to Set %d power down\n", powerId);
  228. break;
  229. }
  230. return 0;
  231. }
  232. static u32 msdc_ldo_power(u32 on, MSDC_POWER powerId, MSDC_POWER_VOLTAGE powerVolt, u32 *status)
  233. {
  234. if (on) { // want to power on
  235. if (*status == 0) { // can power on
  236. msdc_pr_info("msdc LDO<%d> power on<%d>\n", powerId, powerVolt);
  237. hwPowerOn(powerId, powerVolt);
  238. *status = powerVolt;
  239. } else if (*status == powerVolt) {
  240. msdc_pr_info("msdc LDO<%d><%d> power on again!\n", powerId, powerVolt);
  241. } else { // for sd3.0 later
  242. msdc_pr_info("msdc LDO<%d> change<%d> to <%d>\n", powerId, *status, powerVolt);
  243. hwPowerDown(powerId);
  244. hwPowerOn(powerId, powerVolt);
  245. *status = powerVolt;
  246. }
  247. } else { // want to power off
  248. if (*status != 0) { // has been powerred on
  249. msdc_pr_info("msdc LDO<%d> power off\n", powerId);
  250. hwPowerDown(powerId);
  251. *status = 0;
  252. } else {
  253. msdc_pr_info("LDO<%d> not power on\n", powerId);
  254. }
  255. }
  256. return 0;
  257. }
  258. #endif /* defined(MMC_MSDC_DRV_CTP) && !defined(FPGA_PLATFORM) */
  259. #if defined(FPGA_PLATFORM)
  260. void msdc_card_power(struct mmc_host *host, u32 on)
  261. {
  262. MSG(CFG, "[SD%d] Turn %s card power \n", host->id, on ? "on" : "off");
  263. switch (host->id) {
  264. case 0:
  265. if (on) {
  266. //On V6/V7 FPGA, card power need to be on/off
  267. //On HAPS FPGA, card power maybe always on.
  268. //Left this code for safety prevent from card power not always not.
  269. msdc_set_gpio(PWR_MASK_CARD);
  270. } else {
  271. msdc_clr_gpio(PWR_MASK_CARD);
  272. }
  273. mdelay(10);
  274. break;
  275. default:
  276. //No MSDC1 in FPGA
  277. break;
  278. }
  279. //add for fpga debug
  280. msdc_set_gpio(PWR_MASK_L4);
  281. }
  282. void msdc_host_power(struct mmc_host *host, u32 on, u32 level)
  283. {
  284. MSG(CFG, "[SD%d] Turn %s host power \n", host->id, on ? "on" : "off");
  285. // GPO[3:2] = {LVL_PWR33, LVL_PWR18};
  286. msdc_clr_gpio(PWR_MASK_VOL_18);
  287. msdc_clr_gpio(PWR_MASK_VOL_33);
  288. switch (host->id) {
  289. case 0:
  290. if (on) {
  291. if (level == VOL_1800)
  292. msdc_set_gpio(PWR_MASK_VOL_18);
  293. else
  294. msdc_set_gpio(PWR_MASK_VOL_33);
  295. }
  296. mdelay(10);
  297. break;
  298. default:
  299. //No MSDC1 in FPGA
  300. break;
  301. }
  302. //add for fpga debug
  303. msdc_set_gpio(PWR_MASK_L4);
  304. }
  305. #else
  306. void msdc_card_power(struct mmc_host *host, u32 on)
  307. {
  308. //Only CTP support power on/off for verification purose.
  309. //Preload and LK need not touch power since it is default on
  310. MSG(CFG, "[SD%d] Turn %s card power \n", host->id, on ? "on" : "off");
  311. #if defined(MMC_MSDC_DRV_CTP)
  312. switch (host->id) {
  313. case 0:
  314. if (msdc_cap[0].power_flash == 1) {
  315. msdc_cap[0].power_flash = VOL_3000;
  316. } else {
  317. msdc_ldo_power(on, MSDC_VEMC, VOL_3000, &msdc_cap[0].power_flash);
  318. mdelay(10);
  319. }
  320. break;
  321. case 1:
  322. if (msdc_cap[1].power_flash == 1) {
  323. msdc_cap[1].power_flash = VOL_3000;
  324. } else {
  325. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &msdc_cap[1].power_flash);
  326. mdelay(10);
  327. }
  328. break;
  329. case 2:
  330. if (on && (host->cur_pwr < VOL_2000) ) {
  331. //For MTK SDIO device initialized at 1.8V, use external source of 1.8V
  332. //So we just turn VMCH off
  333. on = 0;
  334. }
  335. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &msdc_cap[2].power_flash);
  336. mdelay(10);
  337. break;
  338. default:
  339. break;
  340. }
  341. #endif
  342. }
  343. void msdc_host_power(struct mmc_host *host, u32 on, u32 level)
  344. {
  345. //Only CTP support power on/off for verification purose.
  346. //Preload and LK need not touch power since it is default on
  347. #if defined(MMC_MSDC_DRV_CTP)
  348. u32 card_on = on;
  349. if (host->id != 0) {
  350. host->cur_pwr = level;
  351. }
  352. msdc_set_tdsel_wrap(host);
  353. msdc_set_rdsel_wrap(host);
  354. msdc_set_driving(host, &msdc_cap[host->id], (level == VOL_1800));
  355. MSG(CFG, "[SD%d] Turn %s host power \n", host->id, on ? "on" : "off");
  356. switch (host->id) {
  357. case 0:
  358. //no need change;
  359. break;
  360. case 1:
  361. if (msdc_cap[1].power_io == 1) {
  362. msdc_cap[1].power_io = level;
  363. } else {
  364. msdc_ldo_power(on, MSDC_VMC, level, &msdc_cap[1].power_io);
  365. mdelay(10);
  366. }
  367. break;
  368. case 3:
  369. // no need change;
  370. break;
  371. default:
  372. break;
  373. }
  374. #endif
  375. }
  376. void msdc_dump_ldo_sts(struct mmc_host *host)
  377. {
  378. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  379. u32 ldo_en = 0, ldo_vol = 0;
  380. pmic_read_interface(REG_VEMC_EN, &ldo_en, MASK_VEMC_EN,
  381. SHIFT_VEMC_EN);
  382. pmic_read_interface(REG_VEMC_VOSEL, &ldo_vol, MASK_VEMC_VOSEL,
  383. SHIFT_VEMC_VOSEL);
  384. msdc_pr_err(" VEMC_EN=0x%x, should:1b'1, "
  385. "VEMC_VOL=0x%x, should:1b'0(3.0V),1b'1(3.3V)\n",
  386. ldo_en, ldo_vol);
  387. #endif
  388. }
  389. #endif
  390. void msdc_power(struct mmc_host *host, u8 mode)
  391. {
  392. if (mode == MMC_POWER_ON || mode == MMC_POWER_UP) {
  393. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  394. msdc_host_power(host, 1, host->cur_pwr);
  395. msdc_card_power(host, 1);
  396. msdc_clock(host, 1);
  397. } else {
  398. msdc_clock(host, 0);
  399. msdc_host_power(host, 0, host->cur_pwr);
  400. msdc_card_power(host, 0);
  401. msdc_pin_config(host, MSDC_PIN_PULL_DOWN);
  402. }
  403. }
  404. /**************************************************************/
  405. /* Section 2: Clock */
  406. /**************************************************************/
  407. #if !defined(FPGA_PLATFORM)
  408. u32 hclks_msdc0[] = { MSDC0_SRC_0, MSDC0_SRC_1, MSDC0_SRC_2, MSDC0_SRC_3,
  409. MSDC0_SRC_4, MSDC0_SRC_5, MSDC0_SRC_6, MSDC0_SRC_7};
  410. /* msdc1/2 clock source reference value is 200M */
  411. u32 hclks_msdc1[] = { MSDC1_SRC_0, MSDC1_SRC_1, MSDC1_SRC_2, MSDC1_SRC_3,
  412. MSDC1_SRC_4, MSDC1_SRC_5, MSDC1_SRC_6, MSDC1_SRC_7};
  413. u32 hclks_msdc3[] = { MSDC3_SRC_0, MSDC3_SRC_1, MSDC3_SRC_2, MSDC3_SRC_3,
  414. MSDC3_SRC_4, MSDC3_SRC_5, MSDC3_SRC_6, MSDC3_SRC_7};
  415. u32 *hclks_msdc_all[] = {
  416. hclks_msdc0,
  417. hclks_msdc1,
  418. hclks_msdc3,
  419. };
  420. void msdc_dump_clock_sts(struct mmc_host *host)
  421. {
  422. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  423. msdc_pr_info(" msdcpll en[0x10212250][bit0 should be 0x1]=0x%x\n", MSDC_READ32(0x10212250));
  424. msdc_pr_info(" msdcpll on[0x1021225C][bit0~1 should be 0x1]=0x%x\n", MSDC_READ32(0x1021225C));
  425. msdc_pr_info("MSDC0 CLK_MUX[0x10210140]= 0x%x (bit 16~18), CLK_CG[0x11010290] = %d, %d (bit 0,24)\n",
  426. /* mux at bits16~18 */
  427. (MSDC_READ32(0x10210140) >> 16) & 7,
  428. /* cg at bit 0, 24 */
  429. (MSDC_READ32(0x11010290) >> 0) & 1,
  430. (MSDC_READ32(0x11010290) >> 24) & 1);
  431. msdc_pr_info("MSDC1 CLK_MUX[0x10210140]= 0x%x (bit 24~26), CLK_CG[0x11010290] = %d\n",
  432. /* mux at bits24~26 */
  433. (MSDC_READ32(0x10210140) >> 24) & 7,
  434. /* mux at bit 1 */
  435. (MSDC_READ32(0x11010290) >> 1) & 1);
  436. msdc_pr_info("MSDC3 CLK_MUX[0x10210150]= 0x%x (bit 8~10), CLK_CG[0x11010290] = %d\n",
  437. /* mux at bits8~10 */
  438. (MSDC_READ32(0x10210150) >> 8) & 7,
  439. /* mux at bit 3 */
  440. (MSDC_READ32(0x11010290) >> 3) & 1);
  441. #endif
  442. }
  443. #endif
  444. void msdc_clock(struct mmc_host *host, int on)
  445. {
  446. //Only CTP need enable/disable clock
  447. //Preloader will turn on clock with predefined clock source and module need not to touch clock setting.
  448. //LK will use preloader's setting and need not to touch clock setting.
  449. #if !defined(FPGA_PLATFORM)
  450. #if defined(MMC_MSDC_DRV_CTP)
  451. //int clk_id[MSDC_MAX_NUM] = {MT_CG_INFRA_MSDC_0, MT_CG_INFRA_MSDC_1, MT_CG_INFRA_MSDC_2, MT_CG_INFRA_MSDC_3};
  452. MSG(CFG, "[SD%d] Turn %s %s clock \n", host->id, on ? "on" : "off", "host");
  453. if (on) {
  454. //INFRA_enable_clock(clk_id[host->id]);
  455. if (host->id == 0) {
  456. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG_SECURE);
  457. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG_NORMAL);
  458. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG_MD);
  459. if (IF_CHIP_VER2())
  460. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_SRC_CG);
  461. } else if (host->id == 1) {
  462. MSDC_SET_BIT32(MSDC1_CLOCK_UNGATE_REG, MSDC1_CLOCK_CG);
  463. if (IF_CHIP_VER2())
  464. MSDC_SET_BIT32(MSDC1_CLOCK_UNGATE_REG, MSDC1_CLOCK_SRC_CG);
  465. } else if (host->id == 3) {
  466. MSDC_SET_BIT32(MSDC3_CLOCK_UNGATE_REG, MSDC3_CLOCK_CG);
  467. if (IF_CHIP_VER2())
  468. MSDC_SET_BIT32(MSDC3_CLOCK_UNGATE_REG, MSDC3_CLOCK_SRC_CG);
  469. }
  470. } else {
  471. //INFRA_disable_clock(clk_id[host->id]);
  472. if (host->id == 0) {
  473. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG_SECURE);
  474. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG_NORMAL);
  475. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG_MD);
  476. if (IF_CHIP_VER2())
  477. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_SRC_CG);
  478. } else if (host->id == 1) {
  479. MSDC_SET_BIT32(MSDC1_CLOCK_GATE_REG, MSDC1_CLOCK_CG);
  480. if (IF_CHIP_VER2())
  481. MSDC_SET_BIT32(MSDC1_CLOCK_GATE_REG, MSDC1_CLOCK_SRC_CG);
  482. } else if (host->id == 3) {
  483. MSDC_SET_BIT32(MSDC3_CLOCK_GATE_REG, MSDC3_CLOCK_CG);
  484. if (IF_CHIP_VER2())
  485. MSDC_SET_BIT32(MSDC3_CLOCK_GATE_REG, MSDC3_CLOCK_SRC_CG);
  486. }
  487. }
  488. #endif
  489. msdc_dump_clock_sts(host);
  490. #endif
  491. }
  492. /* perloader will pre-set msdc pll and the mux channel of msdc pll */
  493. /* note: pll will not changed */
  494. void msdc_config_clksrc(struct mmc_host *host, int clksrc)
  495. {
  496. #if !defined(FPGA_PLATFORM)
  497. #if defined(MMC_MSDC_DRV_PRELOADER) || defined(MMC_MSDC_DRV_LK)
  498. host->pll_mux_clk = MSDC0_CLKSRC_DEFAULT;
  499. host->src_clk = msdc_get_hclk(host->id, MSDC0_CLKSRC_DEFAULT);
  500. if (host->id == 0)
  501. host->src_clk = MSDC0_E1_CLKSRC_FREQ;
  502. else if (host->id == 1)
  503. host->src_clk = MSDC1_E1_CLKSRC_FREQ;
  504. #endif
  505. #if defined(MMC_MSDC_DRV_CTP)
  506. if (host->card && mmc_card_hs400(host->card)) {
  507. /* if card is in hs400 mode, force clk source to be 400MHz */
  508. clksrc = MSDC0_CLKSRC_400MHZ;
  509. }
  510. host->pll_mux_clk = clksrc;
  511. host->src_clk = msdc_get_hclk(host->id, clksrc);
  512. /* The following section shall be confirmed by clock owner during porting */
  513. if (host->id == 0) {
  514. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x0140), 0x7 << 16, host->pll_mux_clk);
  515. } else if (host->id == 1) {
  516. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x0140), 0x7 << 24, host->pll_mux_clk);
  517. } else if (host->id == 3) {
  518. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x0150), 0x7 << 8, host->pll_mux_clk);
  519. }
  520. MSDC_WRITE32(TOPCKGEN_BASE+0x04, 0x07FFFFFF);
  521. #endif
  522. #else
  523. host->src_clk = msdc_get_hclk(host->id, clksrc);
  524. #endif
  525. }
  526. /**************************************************************/
  527. /* Section 3: GPIO and Pad */
  528. /**************************************************************/
  529. #if !defined(FPGA_PLATFORM)
  530. void msdc_dump_padctl_by_id(u32 id)
  531. {
  532. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  533. if (id == 0) {
  534. msdc_pr_err("MSDC0 MODE16[%x] =0x%x\tshould: 0x222121?? or 0x111111??n",
  535. MSDC0_GPIO_MODE16, MSDC_READ32(MSDC0_GPIO_MODE16));
  536. msdc_pr_err("MSDC0 MODE17[%x] =0x%x\tshould: 0x??121122 or 0x??111111\n",
  537. MSDC0_GPIO_MODE17, MSDC_READ32(MSDC0_GPIO_MODE17));
  538. msdc_pr_err("MSDC0 IES [%x] =0x%x\tshould: 0x??????1f\n",
  539. MSDC0_GPIO_IES_ADDR, MSDC_READ32(MSDC0_GPIO_IES_ADDR));
  540. msdc_pr_err("MSDC0 SMT [%x] =0x%x\tshould: 0x??????1f\n",
  541. MSDC0_GPIO_SMT_ADDR, MSDC_READ32(MSDC0_GPIO_SMT_ADDR));
  542. msdc_pr_err("MSDC0 TDSEL0[%x] =0x%x\n",
  543. MSDC0_GPIO_TDSEL0_ADDR,
  544. MSDC_READ32(MSDC0_GPIO_TDSEL0_ADDR));
  545. msdc_pr_err("MSDC0 RDSEL0[%x] =0x%x\n",
  546. MSDC0_GPIO_RDSEL0_ADDR,
  547. MSDC_READ32(MSDC0_GPIO_RDSEL0_ADDR));
  548. msdc_pr_err("MSDC0 DRV0 [%x] =0x%x\n",
  549. MSDC0_GPIO_DRV0_ADDR,
  550. MSDC_READ32(MSDC0_GPIO_DRV0_ADDR));
  551. msdc_pr_err("PUPD/R1/R0: dat/cmd:0/0/1, clk/dst: 1/1/0\n");
  552. msdc_pr_err("MSDC0 PUPD0 [%x] =0x%x\tshould: 0x11111611\n",
  553. MSDC0_GPIO_PUPD0_ADDR,
  554. MSDC_READ32(MSDC0_GPIO_PUPD0_ADDR));
  555. msdc_pr_err("MSDC0 PUPD1 [%x] =0x%x\tshould: 0x????1161\n",
  556. MSDC0_GPIO_PUPD1_ADDR,
  557. MSDC_READ32(MSDC0_GPIO_PUPD1_ADDR));
  558. } else if (id == 1) {
  559. msdc_pr_err("MSDC1 MODE4 [%x] =0x%x\tshould: 0x111?????\n",
  560. MSDC1_GPIO_MODE4, MSDC_READ32(MSDC1_GPIO_MODE4));
  561. msdc_pr_err("MSDC1 MODE5 [%x] =0x%x\tshould: 0x?????111\n",
  562. MSDC1_GPIO_MODE5, MSDC_READ32(MSDC1_GPIO_MODE5));
  563. msdc_pr_err("MSDC1 IES [%x] =0x%x\tshould: 0x??????7?\n",
  564. MSDC1_GPIO_IES_ADDR, MSDC_READ32(MSDC1_GPIO_IES_ADDR));
  565. msdc_pr_err("MSDC1 SMT [%x] =0x%x\tshould: 0x??????7?\n",
  566. MSDC1_GPIO_SMT_ADDR, MSDC_READ32(MSDC1_GPIO_SMT_ADDR));
  567. msdc_pr_err("MSDC1 TDSEL0 [%x] =0x%x\n",
  568. MSDC1_GPIO_TDSEL0_ADDR,
  569. MSDC_READ32(MSDC1_GPIO_TDSEL0_ADDR));
  570. msdc_pr_err("should 1.8v: sleep: TBD, awake: TBD\n");
  571. msdc_pr_err("MSDC1 RDSEL0 [%x] =0x%x\n",
  572. MSDC1_GPIO_RDSEL0_ADDR,
  573. MSDC_READ32(MSDC1_GPIO_RDSEL0_ADDR));
  574. msdc_pr_err("1.8V: TBD, 2.9v: TBD\n");
  575. msdc_pr_err("MSDC1 DRV0 [%x] =0x%x\n",
  576. MSDC1_GPIO_DRV0_ADDR,
  577. MSDC_READ32(MSDC1_GPIO_DRV0_ADDR));
  578. msdc_pr_err("MSDC1 PUPD0 [%x] =0x%x\tshould: 0x??222226\n",
  579. MSDC1_GPIO_PUPD0_ADDR,
  580. MSDC_READ32(MSDC1_GPIO_PUPD0_ADDR));
  581. } else if (id == 3) {
  582. msdc_pr_err("MSDC3 MODE7 [%x] =0x%x\tshould: 0x11??????\n",
  583. MSDC3_GPIO_MODE7, MSDC_READ32(MSDC3_GPIO_MODE7));
  584. msdc_pr_err("MSDC3 MODE8 [%x] =0x%x\tshould: 0x???11111\n",
  585. MSDC3_GPIO_MODE8, MSDC_READ32(MSDC3_GPIO_MODE8));
  586. msdc_pr_err("MSDC3 IES [%x] =0x%x\tshould: bit3\n",
  587. MSDC3_GPIO_IES_ADDR, MSDC_READ32(MSDC3_GPIO_IES_ADDR));
  588. msdc_pr_err("MSDC3 SMT [%x] =0x%x\tshould: bit3\n",
  589. MSDC3_GPIO_SMT_ADDR, MSDC_READ32(MSDC3_GPIO_SMT_ADDR));
  590. msdc_pr_err("MSDC3 TDSEL [%x] =0x%x\tshould: bit12~15\n",
  591. MSDC3_GPIO_TDSEL_ADDR,
  592. MSDC_READ32(MSDC3_GPIO_TDSEL_ADDR));
  593. msdc_pr_err("MSDC3 RDSEL [%x] =0x%x\tshould: bit6~11\n",
  594. MSDC3_GPIO_RDSEL_ADDR,
  595. MSDC_READ32(MSDC3_GPIO_RDSEL_ADDR));
  596. msdc_pr_err("MSDC3 DRV [%x] =0x%x\tshould: bit12~15\n",
  597. MSDC3_GPIO_DRV_ADDR, MSDC_READ32(MSDC3_GPIO_DRV_ADDR));
  598. msdc_pr_err("MSDC3 PUPD0 [%x] =0x%x\n",
  599. MSDC3_GPIO_PUPD_ADDR,
  600. MSDC_READ32(MSDC3_GPIO_PUPD_ADDR));
  601. }
  602. #endif
  603. }
  604. void msdc_set_pin_mode(struct mmc_host *host)
  605. {
  606. if (host->id == 0) {
  607. #if (defined(MMC_MSDC_DRV_PRELOADER) && (CFG_BOOT_DEV == BOOTDEV_UFS)) || \
  608. (defined(MMC_MSDC_DRV_LK) && defined(MTK_UFS_SUPPORT))
  609. msdc_pr_err("bypass msdc_set_pin_mode for UFS booting\n");
  610. #else
  611. int pin_state; /* 0: Aux2, other:Aux1 */
  612. MSDC_GET_FIELD(MSDC_HW_TRAPPING_ADDR, MSDC_HW_TRAPPING_MASK, pin_state);
  613. if (pin_state == 0x0) {
  614. MSDC_SET_FIELD(MSDC0_GPIO_MODE16, 0xFFFFFF00, 0x222121);
  615. MSDC_SET_FIELD(MSDC0_GPIO_MODE17, 0x00FFFFFF, 0x121122);
  616. } else {
  617. MSDC_SET_FIELD(MSDC0_GPIO_MODE16, 0xFFFFFF00, 0x111111);
  618. MSDC_SET_FIELD(MSDC0_GPIO_MODE17, 0x00FFFFFF, 0x111111);
  619. }
  620. #endif
  621. } else if (host->id == 1) {
  622. MSDC_SET_FIELD(MSDC1_GPIO_MODE4, 0xFFF00000, 0x111);
  623. MSDC_SET_FIELD(MSDC1_GPIO_MODE5, 0x00000FFF, 0x111);
  624. } else if (host->id == 3) {
  625. MSDC_SET_FIELD(MSDC3_GPIO_MODE7, 0xFF000000, 0x11);
  626. MSDC_SET_FIELD(MSDC3_GPIO_MODE8, 0x000FFFFF, 0x11111);
  627. }
  628. }
  629. void msdc_set_ies_by_id(u32 id, int set_ies)
  630. {
  631. if (id == 0) {
  632. MSDC_SET_FIELD(MSDC0_GPIO_IES_ADDR, MSDC0_IES_ALL_MASK,
  633. (set_ies ? 0x1F : 0));
  634. } else if (id == 1) {
  635. MSDC_SET_FIELD(MSDC1_GPIO_IES_ADDR, MSDC1_IES_ALL_MASK,
  636. (set_ies ? 0x7 : 0));
  637. } else if (id == 3) {
  638. MSDC_SET_FIELD(MSDC3_GPIO_IES_ADDR, MSDC3_IES_ALL_MASK,
  639. (set_ies ? 0x1 : 0));
  640. }
  641. }
  642. void msdc_set_smt_by_id(u32 id, int set_smt)
  643. {
  644. if (id == 0) {
  645. MSDC_SET_FIELD(MSDC0_GPIO_SMT_ADDR, MSDC0_SMT_ALL_MASK,
  646. (set_smt ? 0x1F : 0));
  647. } else if (id == 1) {
  648. MSDC_SET_FIELD(MSDC1_GPIO_SMT_ADDR, MSDC1_SMT_ALL_MASK,
  649. (set_smt ? 0x7 : 0));
  650. } else if (id == 3) {
  651. MSDC_SET_FIELD(MSDC3_GPIO_SMT_ADDR, MSDC3_SMT_ALL_MASK,
  652. (set_smt ? 0x1 : 0));
  653. }
  654. }
  655. void msdc_set_tdsel_by_id(u32 id, u32 flag, u32 value)
  656. {
  657. u32 cust_val;
  658. if (id == 0) {
  659. if (flag == MSDC_TDRDSEL_CUST)
  660. cust_val = value;
  661. else
  662. cust_val = 0;
  663. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_CMD_MASK,
  664. cust_val);
  665. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_DAT_MASK,
  666. cust_val);
  667. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_CLK_MASK,
  668. cust_val);
  669. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_RSTB_MASK,
  670. cust_val);
  671. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_DSL_MASK,
  672. cust_val);
  673. } else if (id == 1) {
  674. if (flag == MSDC_TDRDSEL_CUST)
  675. cust_val = value;
  676. else
  677. cust_val = 0;
  678. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_CMD_MASK,
  679. cust_val);
  680. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_DAT_MASK,
  681. cust_val);
  682. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_CLK_MASK,
  683. cust_val);
  684. } else if (id == 3) {
  685. if (flag == MSDC_TDRDSEL_CUST)
  686. cust_val = value;
  687. else
  688. cust_val = 0;
  689. MSDC_SET_FIELD(MSDC3_GPIO_TDSEL_ADDR, MSDC3_TDSEL_ALL_MASK,
  690. cust_val);
  691. }
  692. }
  693. void msdc_set_rdsel_by_id(u32 id, u32 flag, u32 value)
  694. {
  695. u32 cust_val;
  696. if (id == 0) {
  697. if (flag == MSDC_TDRDSEL_CUST)
  698. cust_val = value;
  699. else
  700. cust_val = 0;
  701. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_CMD_MASK,
  702. cust_val);
  703. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_DAT_MASK,
  704. cust_val);
  705. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_CLK_MASK,
  706. cust_val);
  707. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_RSTB_MASK,
  708. cust_val);
  709. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_DSL_MASK,
  710. cust_val);
  711. } else if (id == 1) {
  712. if (flag == MSDC_TDRDSEL_CUST)
  713. cust_val = value;
  714. else
  715. cust_val = 0;
  716. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_CMD_MASK,
  717. cust_val);
  718. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_DAT_MASK,
  719. cust_val);
  720. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_CLK_MASK,
  721. cust_val);
  722. } else if (id == 3) {
  723. if (flag == MSDC_TDRDSEL_CUST)
  724. cust_val = value;
  725. else
  726. cust_val = 0;
  727. MSDC_SET_FIELD(MSDC3_GPIO_RDSEL_ADDR, MSDC3_RDSEL_ALL_MASK,
  728. cust_val);
  729. }
  730. }
  731. void msdc_get_tdsel_by_id(u32 id, u32 *value)
  732. {
  733. if (id == 0) {
  734. MSDC_GET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_CMD_MASK,
  735. *value);
  736. } else if (id == 1) {
  737. MSDC_GET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_CMD_MASK,
  738. *value);
  739. } else if (id == 3) {
  740. MSDC_GET_FIELD(MSDC3_GPIO_TDSEL_ADDR, MSDC3_TDSEL_ALL_MASK,
  741. *value);
  742. }
  743. }
  744. void msdc_get_rdsel_by_id(u32 id, u32 *value)
  745. {
  746. if (id == 0) {
  747. MSDC_GET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_CMD_MASK,
  748. *value);
  749. } else if (id == 1) {
  750. MSDC_GET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_CMD_MASK,
  751. *value);
  752. } else if (id == 3) {
  753. MSDC_GET_FIELD(MSDC3_GPIO_RDSEL_ADDR, MSDC3_TDSEL_ALL_MASK,
  754. *value);
  755. }
  756. }
  757. void msdc_set_sr_by_id(u32 id, int clk, int cmd, int dat, int rst, int ds)
  758. {
  759. if (id == 0) {
  760. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_CMD_MASK,
  761. (cmd != 0));
  762. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_DSL_MASK,
  763. (ds != 0));
  764. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_CLK_MASK,
  765. (clk != 0));
  766. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_DAT_MASK,
  767. (dat != 0));
  768. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_RSTB_MASK,
  769. (rst != 0));
  770. } else if (id == 1) {
  771. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_SR_CMD_MASK,
  772. (cmd != 0));
  773. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_SR_CLK_MASK,
  774. (clk != 0));
  775. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_SR_DAT_MASK,
  776. (dat != 0));
  777. } else if (id == 3) {
  778. MSDC_SET_FIELD(MSDC3_GPIO_DRV_ADDR, MSDC3_SR_ALL_MASK,
  779. (dat != 0));
  780. }
  781. }
  782. void msdc_set_driving_by_id(u32 id, struct msdc_cust *msdc_cap, bool sd_18)
  783. {
  784. if (id == 0) {
  785. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DSL_MASK,
  786. msdc_cap->ds_drv);
  787. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_RSTB_MASK,
  788. msdc_cap->rst_drv);
  789. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CMD_MASK,
  790. msdc_cap->cmd_drv);
  791. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CLK_MASK,
  792. msdc_cap->clk_drv);
  793. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DAT_MASK,
  794. msdc_cap->dat_drv);
  795. } else if (id == 1) {
  796. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CMD_MASK,
  797. msdc_cap->cmd_drv);
  798. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CLK_MASK,
  799. msdc_cap->clk_drv);
  800. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_DAT_MASK,
  801. msdc_cap->dat_drv);
  802. } else if (id == 3) {
  803. MSDC_SET_FIELD(MSDC3_GPIO_DRV_ADDR, MSDC3_DRV_ALL_MASK,
  804. msdc_cap->dat_drv);
  805. }
  806. }
  807. #if defined(MMC_MSDC_DRV_CTP)
  808. void msdc_get_driving_by_id(u32 id, struct msdc_cust *msdc_cap, bool sd_18)
  809. {
  810. if (id == 0) {
  811. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DSL_MASK,
  812. msdc_cap->ds_drv);
  813. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_RSTB_MASK,
  814. msdc_cap->rst_drv);
  815. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CMD_MASK,
  816. msdc_cap->cmd_drv);
  817. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CLK_MASK,
  818. msdc_cap->clk_drv);
  819. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DAT_MASK,
  820. msdc_cap->dat_drv);
  821. } else if (id == 1) {
  822. MSDC_GET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CMD_MASK,
  823. msdc_cap->cmd_drv);
  824. MSDC_GET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CLK_MASK,
  825. msdc_cap->clk_drv);
  826. MSDC_GET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_DAT_MASK,
  827. msdc_cap->dat_drv);
  828. } else if (id == 3) {
  829. MSDC_GET_FIELD(MSDC3_GPIO_DRV_ADDR, MSDC3_DRV_ALL_MASK,
  830. msdc_cap->dat_drv);
  831. }
  832. }
  833. #endif
  834. /* msdc pin config
  835. * MSDC0
  836. * PUPD/RO/R1
  837. * 0/0/0: High-Z
  838. * 0/0/1: Pull-up with 50Kohm
  839. * 0/1/0: Pull-up with 10Kohm
  840. * 0/1/1: Pull-up with 10Kohm//50Kohm
  841. * 1/0/0: High-Z
  842. * 1/0/1: Pull-down with 50Kohm
  843. * 1/1/0: Pull-down with 10Kohm
  844. * 1/1/1: Pull-down with 10Kohm//50Kohm
  845. */
  846. void msdc_pin_config_by_id(u32 id, u32 mode)
  847. {
  848. if (id == 0) {
  849. /* 1. don't pull CLK high;
  850. * 2. Don't toggle RST to prevent from entering boot mode
  851. */
  852. if (mode == MSDC_PIN_PULL_NONE) {
  853. /* Switch MSDC0_* to no ohm PU */
  854. MSDC_SET_FIELD(MSDC0_GPIO_PUPD0_ADDR, MSDC0_PUPD0_MASK, 0x0);
  855. MSDC_SET_FIELD(MSDC0_GPIO_PUPD1_ADDR, MSDC0_PUPD1_MASK, 0x0);
  856. } else if (mode == MSDC_PIN_PULL_DOWN) {
  857. /* Switch MSDC0_* to 50K ohm PD */
  858. MSDC_SET_FIELD(MSDC0_GPIO_PUPD0_ADDR, MSDC0_PUPD0_MASK, 0x66666666);
  859. MSDC_SET_FIELD(MSDC0_GPIO_PUPD1_ADDR, MSDC0_PUPD1_MASK, 0x6666);
  860. } else if (mode == MSDC_PIN_PULL_UP) {
  861. /* Switch MSDC0_CLK to 50K ohm PD,
  862. * MSDC0_CMD/MSDC0_DAT* to 10K ohm PU,
  863. * MSDC0_DSL to 50K ohm PD
  864. */
  865. MSDC_SET_FIELD(MSDC0_GPIO_PUPD0_ADDR, MSDC0_PUPD0_MASK, 0x11111611);
  866. MSDC_SET_FIELD(MSDC0_GPIO_PUPD1_ADDR, MSDC0_PUPD1_MASK, 0x1161);
  867. }
  868. } else if (id == 1) {
  869. if (mode == MSDC_PIN_PULL_NONE) {
  870. /* Switch MSDC1_* to no ohm PU */
  871. MSDC_SET_FIELD(MSDC1_GPIO_PUPD0_ADDR, MSDC1_PUPD0_MASK, 0x0);
  872. } else if (mode == MSDC_PIN_PULL_DOWN) {
  873. /* Switch MSDC1_* to 50K ohm PD */
  874. MSDC_SET_FIELD(MSDC1_GPIO_PUPD0_ADDR, MSDC1_PUPD0_MASK, 0x666666);
  875. } else if (mode == MSDC_PIN_PULL_UP) {
  876. /* Switch MSDC1_CLK to 50K ohm PD,
  877. * MSDC1_CMD/MSDC1_DAT* to 50K ohm PU
  878. */
  879. MSDC_SET_FIELD(MSDC1_GPIO_PUPD0_ADDR, MSDC1_PUPD0_MASK, 0x222226);
  880. }
  881. } else if (id == 3) {
  882. if (mode == MSDC_PIN_PULL_NONE) {
  883. /* Switch MSDC3_* to 0 ohm PU
  884. */
  885. MSDC_SET_FIELD(MSDC3_GPIO_PUPD_ADDR, MSDC3_PUPD_MASK, 0);
  886. } else if (mode == MSDC_PIN_PULL_DOWN) {
  887. /* Switch MSDC3_* to 50K ohm PD
  888. */
  889. MSDC_SET_FIELD(MSDC3_GPIO_PUPD_ADDR, MSDC3_PUPD_MASK, 0x6666666);
  890. } else if (mode == MSDC_PIN_PULL_UP) {
  891. /* Switch MSDC3_CLK/DSL to 50K ohm PD,
  892. * MSDC3_CMD/MSDC3_DAT* to 10K ohm PU
  893. */
  894. MSDC_SET_FIELD(MSDC3_GPIO_PUPD_ADDR, MSDC3_PUPD_MASK, 0x1111616);
  895. }
  896. }
  897. }
  898. /**************************************************************/
  899. /* Section 4: MISC */
  900. /**************************************************************/
  901. /* make sure the pad is msdc mode */
  902. void msdc_set_tdsel_wrap(struct mmc_host *host)
  903. {
  904. if (host->cur_pwr == VOL_1800)
  905. msdc_set_tdsel_by_id(host->id, MSDC_TDRDSEL_1V8, 0);
  906. else
  907. msdc_set_tdsel_by_id(host->id, MSDC_TDRDSEL_3V, 0);
  908. }
  909. void msdc_set_rdsel_wrap(struct mmc_host *host)
  910. {
  911. if (host->cur_pwr == VOL_1800)
  912. msdc_set_rdsel_by_id(host->id, MSDC_TDRDSEL_1V8, 0);
  913. else
  914. msdc_set_rdsel_by_id(host->id, MSDC_TDRDSEL_3V, 0);
  915. }
  916. void msdc_gpio_and_pad_init(struct mmc_host *host)
  917. {
  918. /* set smt enable */
  919. msdc_set_smt(host, 1);
  920. /* set pull enable */
  921. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  922. /* set gpio to msdc mode */
  923. msdc_set_pin_mode(host);
  924. /* set driving */
  925. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  926. /* set tdsel and rdsel */
  927. msdc_set_tdsel_wrap(host);
  928. msdc_set_rdsel_wrap(host);
  929. msdc_dump_padctl_by_id(host->id);
  930. }
  931. void msdc_gpio_and_pad_init_by_id(int id)
  932. {
  933. struct mmc_host *host = mmc_get_host(id);
  934. msdc_set_smt(host, 1);
  935. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  936. msdc_set_pin_mode(host);
  937. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  938. msdc_set_tdsel_wrap(host);
  939. msdc_set_rdsel_wrap(host);
  940. }
  941. #endif