msdc_io.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212
  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) 2018. 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_info("[%s]invalid parm: 0x%x\n", __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. msdc_set_gpio(PWR_MASK_L4);
  303. }
  304. #else
  305. void msdc_card_power(struct mmc_host *host, u32 on)
  306. {
  307. //Only CTP support power on/off for verification purose.
  308. //Preload and LK need not touch power since it is default on
  309. MSG(CFG, "[SD%d] Turn %s card power\n", host->id, on ? "on" : "off");
  310. #if defined(MMC_MSDC_DRV_CTP)
  311. switch (host->id) {
  312. case 0:
  313. if (msdc_cap[0].power_flash == 1) {
  314. msdc_cap[0].power_flash = VOL_3000;
  315. } else {
  316. msdc_ldo_power(on, MSDC_VEMC, VOL_3000, &msdc_cap[0].power_flash);
  317. mdelay(10);
  318. }
  319. break;
  320. case 1:
  321. if (msdc_cap[1].power_flash == 1) {
  322. msdc_cap[1].power_flash = VOL_3000;
  323. } else {
  324. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &msdc_cap[1].power_flash);
  325. mdelay(10);
  326. }
  327. break;
  328. case 2:
  329. if (on && (host->cur_pwr < VOL_2000)) {
  330. //For MTK SDIO device initialized at 1.8V, use external source of 1.8V
  331. //So we just turn VMCH off
  332. on = 0;
  333. }
  334. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &msdc_cap[2].power_flash);
  335. mdelay(10);
  336. break;
  337. default:
  338. break;
  339. }
  340. #endif
  341. }
  342. void msdc_host_power(struct mmc_host *host, u32 on, u32 level)
  343. {
  344. //Only CTP support power on/off for verification purose.
  345. //Preload and LK need not touch power since it is default on
  346. #if defined(MMC_MSDC_DRV_CTP)
  347. u32 card_on = on;
  348. if (host->id != 0) {
  349. host->cur_pwr = level;
  350. }
  351. msdc_set_tdsel_wrap(host);
  352. msdc_set_rdsel_wrap(host);
  353. msdc_set_driving(host, &msdc_cap[host->id], (level == VOL_1800));
  354. MSG(CFG, "[SD%d] Turn %s host power\n", host->id, on ? "on" : "off");
  355. switch (host->id) {
  356. case 0:
  357. //no need change;
  358. break;
  359. case 1:
  360. if (msdc_cap[1].power_io == 1) {
  361. msdc_cap[1].power_io = level;
  362. } else {
  363. msdc_ldo_power(on, MSDC_VMC, level, &msdc_cap[1].power_io);
  364. mdelay(10);
  365. }
  366. break;
  367. default:
  368. break;
  369. }
  370. #endif
  371. }
  372. void msdc_dump_ldo_sts(struct mmc_host *host)
  373. {
  374. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  375. u32 ldo_en = 0, ldo_vol = 0;
  376. pmic_read_interface(REG_VEMC_EN, &ldo_en, MASK_VEMC_EN,
  377. SHIFT_VEMC_EN);
  378. pmic_read_interface(REG_VEMC_VOSEL, &ldo_vol, MASK_VEMC_VOSEL,
  379. SHIFT_VEMC_VOSEL);
  380. msdc_pr_err(" VEMC_EN=0x%x, should:1b'1, "
  381. "VEMC_VOL=0x%x [0x2(2V9),0x3(3V),0x5(3V3)]\n",
  382. ldo_en, ldo_vol);
  383. #endif
  384. }
  385. #endif
  386. void msdc_power(struct mmc_host *host, u8 mode)
  387. {
  388. if (mode == MMC_POWER_ON || mode == MMC_POWER_UP) {
  389. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  390. msdc_host_power(host, 1, host->cur_pwr);
  391. msdc_card_power(host, 1);
  392. msdc_clock(host, 1);
  393. } else {
  394. msdc_clock(host, 0);
  395. msdc_host_power(host, 0, host->cur_pwr);
  396. msdc_card_power(host, 0);
  397. msdc_pin_config(host, MSDC_PIN_PULL_DOWN);
  398. }
  399. }
  400. /**************************************************************/
  401. /* Section 2: Clock */
  402. /**************************************************************/
  403. #if !defined(FPGA_PLATFORM)
  404. u32 hclks_msdc0[] = { MSDC0_SRC_0, MSDC0_SRC_1, MSDC0_SRC_2, MSDC0_SRC_3,
  405. MSDC0_SRC_4, MSDC0_SRC_5, MSDC0_SRC_6, MSDC0_SRC_7};
  406. /* msdc1/2 clock source reference value is 200M */
  407. u32 hclks_msdc1[] = { MSDC1_SRC_0, MSDC1_SRC_1, MSDC1_SRC_2, MSDC1_SRC_3,
  408. MSDC1_SRC_4, MSDC1_SRC_5, MSDC1_SRC_6, MSDC1_SRC_7};
  409. u32 *hclks_msdc_all[] = {
  410. hclks_msdc0,
  411. hclks_msdc1,
  412. };
  413. void msdc_dump_clock_sts(struct mmc_host *host)
  414. {
  415. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  416. msdc_pr_info(" msdcpll en[0x10212250][bit0 should be 0x1]=0x%x\n", MSDC_READ32(0x10212250));
  417. msdc_pr_info(" msdcpll on[0x1021225C][bit0~1 should be 0x1]=0x%x\n", MSDC_READ32(0x1021225C));
  418. msdc_pr_info("MSDC0 CLK_MUX[0x10000070][18:16]= 0x%x, CLK_CG[0x100010C8][9~7] = 0x%x\n",
  419. (MSDC_READ32(0x10000070) >> 16) & 7,
  420. (MSDC_READ32(0x100010C8) >> 7) & 0x7);
  421. msdc_pr_info("MSDC1 CLK_MUX[0x10000070][26:24]= 0x%x, CLK_CG[0x100010C8][1] = 0x%x\n",
  422. (MSDC_READ32(0x10000070) >> 24) & 7,
  423. (MSDC_READ32(0x100010C8) >> 10) & 1);
  424. #endif
  425. }
  426. #endif
  427. void msdc_clock(struct mmc_host *host, int on)
  428. {
  429. //Only CTP need enable/disable clock
  430. //Preloader will turn on clock with predefined clock source and module need not to touch clock setting.
  431. //LK will use preloader's setting and need not to touch clock setting.
  432. #if !defined(FPGA_PLATFORM)
  433. #if defined(MMC_MSDC_DRV_CTP)
  434. MSG(CFG, "[SD%d] Turn %s clock\n", host->id, on ? "on" : "off");
  435. if (on) {
  436. if (host->id == 0) {
  437. //MSDC_SET_BIT32(MSDC0_HCLOCK_UNGATE_REG, MSDC0_HCLOCK_CG);
  438. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG_AP);
  439. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG_MD);
  440. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG_SRC);
  441. } else if (host->id == 1) {
  442. MSDC_SET_BIT32(MSDC1_CLOCK_UNGATE_REG, MSDC1_CLOCK_CG);
  443. }
  444. } else {
  445. if (host->id == 0) {
  446. //MSDC_SET_BIT32(MSDC0_HCLOCK_GATE_REG, MSDC0_HCLOCK_CG);
  447. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG_AP);
  448. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG_MD);
  449. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG_SRC);
  450. } else if (host->id == 1) {
  451. MSDC_SET_BIT32(MSDC1_CLOCK_GATE_REG, MSDC1_CLOCK_CG);
  452. }
  453. }
  454. #endif
  455. msdc_dump_clock_sts(host);
  456. #endif
  457. }
  458. /* perloader will pre-set msdc pll and the mux channel of msdc pll */
  459. /* note: pll will not changed */
  460. void msdc_config_clksrc(struct mmc_host *host, int clksrc)
  461. {
  462. #if !defined(FPGA_PLATFORM)
  463. #if defined(MMC_MSDC_DRV_PRELOADER) || defined(MMC_MSDC_DRV_LK)
  464. host->pll_mux_clk = MSDC0_CLKSRC_DEFAULT;
  465. host->src_clk = msdc_get_hclk(host->id, MSDC0_CLKSRC_DEFAULT);
  466. #endif
  467. #if defined(MMC_MSDC_DRV_CTP)
  468. if (host->card && mmc_card_hs400(host->card)) {
  469. /* if card is in hs400 mode, force clk source to be 400MHz */
  470. clksrc = MSDC0_CLKSRC_400MHZ;
  471. }
  472. host->pll_mux_clk = clksrc;
  473. host->src_clk = msdc_get_hclk(host->id, clksrc);
  474. /* The following section shall be confirmed by clock owner during porting */
  475. if (host->id == 0) {
  476. MSDC_SET_FIELD(MSDC0_CLOCK_MUX_REG, MSDC0_CLOCK_MUX, host->pll_mux_clk);
  477. } else if (host->id == 1) {
  478. MSDC_SET_FIELD(MSDC1_CLOCK_MUX_REG, MSDC1_CLOCK_MUX, host->pll_mux_clk);
  479. }
  480. MSDC_WRITE32(TOPCKGEN_BASE+0x04, 0x07FFFFFF);
  481. #endif
  482. #else
  483. host->src_clk = msdc_get_hclk(host->id, clksrc);
  484. #endif
  485. }
  486. /**************************************************************/
  487. /* Section 3: GPIO and Pad */
  488. /**************************************************************/
  489. #if !defined(FPGA_PLATFORM)
  490. void msdc_dump_padctl_by_id(u32 id)
  491. {
  492. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  493. u32 val;
  494. if (id == 0) {
  495. msdc_pr_err("MSDC0 MODE4 [0x%x] =0x%8x\tshould: 0x11??????\n",
  496. MSDC0_GPIO_MODE4, MSDC_READ32(MSDC0_GPIO_MODE4));
  497. msdc_pr_err("MSDC0 MODE5 [0x%x] =0x%8x\tshould: 0x11111111\n",
  498. MSDC0_GPIO_MODE5, MSDC_READ32(MSDC0_GPIO_MODE5));
  499. msdc_pr_err("MSDC0 MODE6 [0x%x] =0x%8x\tshould: 0x??????11\n",
  500. MSDC0_GPIO_MODE6, MSDC_READ32(MSDC0_GPIO_MODE6));
  501. MSDC_GET_FIELD(MSDC0_GPIO_IES_ADDR, MSDC0_IES_ALL_MASK, val);
  502. msdc_pr_err("MSDC0 IES [0x%x] =0x%8x\tshould: 0xfff\n",
  503. MSDC0_GPIO_IES_ADDR, val);
  504. MSDC_GET_FIELD(MSDC0_GPIO_SMT_ADDR, MSDC0_SMT_ALL_MASK, val);
  505. msdc_pr_err("MSDC0 SMT [0x%x] =0x%8x\tshould: 0x1f\n",
  506. MSDC0_GPIO_SMT_ADDR, val);
  507. MSDC_GET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_ALL_MASK, val);
  508. msdc_pr_err("MSDC0 TDSEL [0x%x] =0x%8x\tshould: 0x0\n",
  509. MSDC0_GPIO_TDSEL_ADDR, val);
  510. MSDC_GET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_ALL_MASK, val);
  511. msdc_pr_err("MSDC0 RDSEL [0x%x] =0x%8x\tshould: 0x0\n",
  512. MSDC0_GPIO_RDSEL0_ADDR, val);
  513. MSDC_GET_FIELD(MSDC0_GPIO_RDSEL1_ADDR, MSDC0_RDSEL1_ALL_MASK, val);
  514. msdc_pr_err("MSDC0 RDSE1 [0x%x] =0x%8x\tshould: 0x0\n",
  515. MSDC0_GPIO_RDSEL1_ADDR, val);
  516. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_ALL_MASK, val);
  517. msdc_pr_err("MSDC0 DRV [0x%x] =0x%8x\tshould: 0x249\n",
  518. MSDC0_GPIO_DRV0_ADDR, val);
  519. MSDC_GET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV1_ALL_MASK, val);
  520. msdc_pr_err("MSDC0 DRV1 [0x%x] =0x%8x\tshould: 0x249249\n",
  521. MSDC0_GPIO_DRV1_ADDR, val);
  522. MSDC_GET_FIELD(MSDC0_GPIO_SR_ADDR, MSDC0_SR_ALL_MASK, val);
  523. msdc_pr_err("MSDC0 SR [0x%x] =0x%8x\tshould: 0xTTT\n",
  524. MSDC0_GPIO_SR_ADDR, val);
  525. msdc_pr_err("PUPD/R1/R0: dat/cmd:0/0/1, clk/dst: 1/1/0\n");
  526. MSDC_GET_FIELD(MSDC0_GPIO_PUPD_ADDR, MSDC0_PUPD_ALL_MASK, val);
  527. msdc_pr_err("MSDC0 PUPD0 [0x%x] =0x%8x\tshould: 0x401\n",
  528. MSDC0_GPIO_PUPD_ADDR, val);
  529. MSDC_GET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, val);
  530. msdc_pr_err("MSDC0 R0 [0x%x] =0x%8x\tshould: 0x3FE\n",
  531. MSDC0_GPIO_R0_ADDR, val);
  532. MSDC_GET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, val);
  533. msdc_pr_err("MSDC0 R1 [0x%x] =0x%8x\tshould: 0x401\n",
  534. MSDC0_GPIO_R1_ADDR, val);
  535. } else if (id == 1) {
  536. msdc_pr_err("MSDC1 MODE8 [0x%x] =0x%8x\tshould: 0x1???????\n",
  537. MSDC1_GPIO_MODE8, MSDC_READ32(MSDC1_GPIO_MODE8));
  538. msdc_pr_err("MSDC1 MODE9 [0x%x] =0x%8x\tshould: 0x???11111\n",
  539. MSDC1_GPIO_MODE9, MSDC_READ32(MSDC1_GPIO_MODE9));
  540. MSDC_GET_FIELD(MSDC1_GPIO_IES_ADDR, MSDC1_IES_ALL_MASK, val);
  541. msdc_pr_err("MSDC1 IES [0x%x] =0x%8x\tshould: 0x3f\n",
  542. MSDC1_GPIO_IES_ADDR, val);
  543. MSDC_GET_FIELD(MSDC1_GPIO_SMT_ADDR, MSDC1_SMT_ALL_MASK, val);
  544. msdc_pr_err("MSDC1 SMT [0x%x] =0x%8x\tshould: 0x3f\n",
  545. MSDC1_GPIO_SMT_ADDR, val);
  546. MSDC_GET_FIELD(MSDC1_GPIO_TDSEL_ADDR, MSDC1_TDSEL_ALL_MASK, val);
  547. msdc_pr_err("MSDC1 TDSEL [0x%x] =0x%8x\n",
  548. MSDC1_GPIO_TDSEL_ADDR, val);
  549. msdc_pr_err("should 1.8v: sleep: TBD, awake: 0xaaa\n");
  550. MSDC_GET_FIELD(MSDC1_GPIO_RDSEL_ADDR, MSDC1_RDSEL_ALL_MASK, val);
  551. msdc_pr_err("MSDC1 RDSEL0 [0x%x] =0x%8x\n",
  552. MSDC1_GPIO_RDSEL_ADDR, val);
  553. msdc_pr_err("1.8V: TBD, 2.9v: 0xc30c\n");
  554. MSDC_GET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_ALL_MASK, val);
  555. msdc_pr_err("MSDC1 DRV [0x%x] =0x%8x\tshould: TBD\n",
  556. MSDC1_GPIO_DRV_ADDR, val);
  557. MSDC_GET_FIELD(MSDC1_GPIO_SR_ADDR, MSDC1_SR_ALL_MASK, val);
  558. msdc_pr_err("MSDC1 SR [0x%x] =0x%8x\tshould: 0x0\n",
  559. MSDC1_GPIO_SR_ADDR, val);
  560. MSDC_GET_FIELD(MSDC1_GPIO_PUPD_ADDR, MSDC1_PUPD_ALL_MASK, val);
  561. msdc_pr_err("MSDC1 PUPD [0x%x] =0x%8x\tshould: 0x1\n",
  562. MSDC1_GPIO_PUPD_ADDR, val);
  563. MSDC_GET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, val);
  564. msdc_pr_err("MSDC1 R0 [0x%x] =0x%8x\tshould: 0x0\n",
  565. MSDC1_GPIO_R0_ADDR, val);
  566. MSDC_GET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, val);
  567. msdc_pr_err("MSDC1 R1 [0x%x] =0x%8x\tshould: 0x3F\n",
  568. MSDC1_GPIO_R1_ADDR, val);
  569. }
  570. #endif
  571. }
  572. void msdc_set_pin_mode(struct mmc_host *host)
  573. {
  574. if (host->id == 0) {
  575. MSDC_SET_FIELD(MSDC0_GPIO_MODE4, 0xFF000000, 0x11);
  576. MSDC_SET_FIELD(MSDC0_GPIO_MODE5, 0xFFFFFFFF, 0x11111111);
  577. MSDC_SET_FIELD(MSDC0_GPIO_MODE6, 0x000000FF, 0x11);
  578. } else if (host->id == 1) {
  579. MSDC_SET_FIELD(MSDC1_GPIO_MODE8, 0xF0000000, 0x1);
  580. MSDC_SET_FIELD(MSDC1_GPIO_MODE9, 0x000FFFFF, 0x11111);
  581. }
  582. }
  583. void msdc_set_ies_by_id(u32 id, int set_ies)
  584. {
  585. if (id == 0) {
  586. MSDC_SET_FIELD(MSDC0_GPIO_IES_ADDR, MSDC0_IES_ALL_MASK,
  587. (set_ies ? 0xFFF : 0));
  588. } else if (id == 1) {
  589. MSDC_SET_FIELD(MSDC1_GPIO_IES_ADDR, MSDC1_IES_ALL_MASK,
  590. (set_ies ? 0x3F : 0));
  591. }
  592. }
  593. void msdc_set_smt_by_id(u32 id, int set_smt)
  594. {
  595. if (id == 0) {
  596. MSDC_SET_FIELD(MSDC0_GPIO_SMT_ADDR, MSDC0_SMT_ALL_MASK,
  597. (set_smt ? 0x1F : 0));
  598. } else if (id == 1) {
  599. MSDC_SET_FIELD(MSDC1_GPIO_SMT_ADDR, MSDC1_SMT_ALL_MASK,
  600. (set_smt ? 0x3F : 0));
  601. }
  602. }
  603. void msdc_set_tdsel_by_id(u32 id, u32 flag, u32 value)
  604. {
  605. u32 cust_val;
  606. if (id == 0) {
  607. if (flag == MSDC_TDRDSEL_CUST)
  608. cust_val = value;
  609. else
  610. cust_val = 0;
  611. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_CMD_MASK,
  612. cust_val);
  613. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_DAT_MASK,
  614. cust_val);
  615. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_CLK_MASK,
  616. cust_val);
  617. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_RSTB_MASK,
  618. cust_val);
  619. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_DSL_MASK,
  620. cust_val);
  621. } else if (id == 1) {
  622. if (flag == MSDC_TDRDSEL_CUST)
  623. cust_val = value;
  624. else
  625. cust_val = 0;
  626. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL_ADDR, MSDC1_TDSEL_CMD_MASK,
  627. cust_val);
  628. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL_ADDR, MSDC1_TDSEL_DAT_MASK,
  629. cust_val);
  630. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL_ADDR, MSDC1_TDSEL_CLK_MASK,
  631. cust_val);
  632. }
  633. }
  634. void msdc_set_rdsel_by_id(u32 id, u32 flag, u32 value)
  635. {
  636. u32 cust_val;
  637. if (id == 0) {
  638. if (flag == MSDC_TDRDSEL_CUST)
  639. cust_val = value;
  640. else
  641. cust_val = 0;
  642. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL_CMD_MASK,
  643. cust_val);
  644. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL_DAT_MASK,
  645. cust_val);
  646. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL_CLK_MASK,
  647. cust_val);
  648. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL_DSL_MASK,
  649. cust_val);
  650. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL1_ADDR, MSDC0_RDSEL_RSTB_MASK,
  651. cust_val);
  652. } else if (id == 1) {
  653. if (flag == MSDC_TDRDSEL_CUST)
  654. cust_val = value;
  655. else
  656. cust_val = 0;
  657. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL_ADDR, MSDC1_RDSEL_CMD_MASK,
  658. cust_val);
  659. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL_ADDR, MSDC1_RDSEL_DAT_MASK,
  660. cust_val);
  661. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL_ADDR, MSDC1_RDSEL_CLK_MASK,
  662. cust_val);
  663. }
  664. }
  665. void msdc_get_tdsel_by_id(u32 id, u32 *value)
  666. {
  667. if (id == 0) {
  668. MSDC_GET_FIELD(MSDC0_GPIO_TDSEL_ADDR, MSDC0_TDSEL_CMD_MASK,
  669. *value);
  670. } else if (id == 1) {
  671. MSDC_GET_FIELD(MSDC1_GPIO_TDSEL_ADDR, MSDC1_TDSEL_CMD_MASK,
  672. *value);
  673. }
  674. }
  675. void msdc_get_rdsel_by_id(u32 id, u32 *value)
  676. {
  677. if (id == 0) {
  678. MSDC_GET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL_CMD_MASK,
  679. *value);
  680. } else if (id == 1) {
  681. MSDC_GET_FIELD(MSDC1_GPIO_RDSEL_ADDR, MSDC1_RDSEL_CMD_MASK,
  682. *value);
  683. }
  684. }
  685. void msdc_set_sr_by_id(u32 id, int clk, int cmd, int dat, int rst, int ds)
  686. {
  687. if (id == 0) {
  688. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_CMD_MASK,
  689. (cmd != 0));
  690. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_DSL_MASK,
  691. (ds != 0));
  692. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_CLK_MASK,
  693. (clk != 0));
  694. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_DAT_MASK,
  695. ((dat != 0) ? 0xFF : 0));
  696. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_SR_RSTB_MASK,
  697. (rst != 0));
  698. } else if (id == 1) {
  699. MSDC_SET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_SR_CMD_MASK,
  700. (cmd != 0));
  701. MSDC_SET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_SR_CLK_MASK,
  702. (clk != 0));
  703. MSDC_SET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_SR_DAT_MASK,
  704. (dat != 0));
  705. }
  706. }
  707. void msdc_set_driving_by_id(u32 id, struct msdc_cust *msdc_cap, bool sd_18)
  708. {
  709. if (id == 0) {
  710. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_CMD_MASK,
  711. msdc_cap->cmd_drv);
  712. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_CLK_MASK,
  713. msdc_cap->clk_drv);
  714. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_DAT0_MASK,
  715. msdc_cap->dat_drv);
  716. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_DAT1_MASK,
  717. msdc_cap->dat_drv);
  718. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DAT2_MASK,
  719. msdc_cap->dat_drv);
  720. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DAT3_MASK,
  721. msdc_cap->dat_drv);
  722. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DAT4_MASK,
  723. msdc_cap->dat_drv);
  724. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DAT5_MASK,
  725. msdc_cap->dat_drv);
  726. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DAT6_MASK,
  727. msdc_cap->dat_drv);
  728. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DAT7_MASK,
  729. msdc_cap->dat_drv);
  730. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DSL_MASK,
  731. msdc_cap->ds_drv);
  732. MSDC_SET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_RSTB_MASK,
  733. msdc_cap->rst_drv);
  734. } else if (id == 1) {
  735. MSDC_SET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_CMD_MASK,
  736. msdc_cap->cmd_drv);
  737. MSDC_SET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_CLK_MASK,
  738. msdc_cap->clk_drv);
  739. MSDC_SET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_DAT_MASK,
  740. msdc_cap->dat_drv);
  741. }
  742. }
  743. #if defined(MMC_MSDC_DRV_CTP)
  744. void msdc_get_driving_by_id(u32 id, struct msdc_cust *msdc_cap, bool sd_18)
  745. {
  746. if (id == 0) {
  747. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_CMD_MASK,
  748. msdc_cap->cmd_drv);
  749. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_CLK_MASK,
  750. msdc_cap->clk_drv);
  751. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV_DAT0_MASK,
  752. msdc_cap->dat_drv);
  753. MSDC_GET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_DSL_MASK,
  754. msdc_cap->ds_drv);
  755. MSDC_GET_FIELD(MSDC0_GPIO_DRV1_ADDR, MSDC0_DRV_RSTB_MASK,
  756. msdc_cap->rst_drv);
  757. } else if (id == 1) {
  758. MSDC_GET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_CMD_MASK,
  759. msdc_cap->cmd_drv);
  760. MSDC_GET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_CLK_MASK,
  761. msdc_cap->clk_drv);
  762. MSDC_GET_FIELD(MSDC1_GPIO_DRV_ADDR, MSDC1_DRV_DAT_MASK,
  763. msdc_cap->dat_drv);
  764. }
  765. }
  766. #endif
  767. /* msdc pin config
  768. * MSDC0
  769. * PUPD/R1/R0
  770. * 0/0/0: High-Z
  771. * 0/0/1: Pull-up with 10Kohm
  772. * 0/1/0: Pull-up with 50Kohm
  773. * 0/1/1: Pull-up with 10Kohm//50Kohm
  774. * 1/0/0: High-Z
  775. * 1/0/1: Pull-down with 10Kohm
  776. * 1/1/0: Pull-down with 50Kohm
  777. * 1/1/1: Pull-down with 10Kohm//50Kohm
  778. */
  779. void msdc_pin_config_by_id(u32 id, u32 mode)
  780. {
  781. if (id == 0) {
  782. /* 1. don't pull CLK high;
  783. * 2. Don't toggle RST to prevent from entering boot mode
  784. */
  785. if (mode == MSDC_PIN_PULL_NONE) {
  786. /* Switch MSDC0_* to no ohm PU */
  787. MSDC_SET_FIELD(MSDC0_GPIO_PUPD_ADDR, MSDC0_PUPD_ALL_MASK, 0x0);
  788. MSDC_SET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, 0x0);
  789. MSDC_SET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, 0x0);
  790. } else if (mode == MSDC_PIN_PULL_DOWN) {
  791. /* Switch MSDC0_* to 50K ohm PD */
  792. MSDC_SET_FIELD(MSDC0_GPIO_PUPD_ADDR, MSDC0_PUPD_ALL_MASK, 0x7FF);
  793. MSDC_SET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, 0x0);
  794. MSDC_SET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, 0x7FF);
  795. } else if (mode == MSDC_PIN_PULL_UP) {
  796. /* Switch MSDC0_CLK to 50K ohm PD,
  797. * MSDC0_CMD/MSDC0_DAT* to 10K ohm PU,
  798. * MSDC0_DSL to 50K ohm PD
  799. */
  800. MSDC_SET_FIELD(MSDC0_GPIO_PUPD_ADDR, MSDC0_PUPD_ALL_MASK, 0x401);
  801. MSDC_SET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, 0x3FE);
  802. MSDC_SET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, 0x401);
  803. }
  804. } else if (id == 1) {
  805. if (mode == MSDC_PIN_PULL_NONE) {
  806. /* Switch MSDC1_* to no ohm PU */
  807. MSDC_SET_FIELD(MSDC1_GPIO_PUPD_ADDR, MSDC1_PUPD_ALL_MASK, 0x0);
  808. MSDC_SET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, 0x0);
  809. MSDC_SET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, 0x0);
  810. } else if (mode == MSDC_PIN_PULL_DOWN) {
  811. /* Switch MSDC1_* to 50K ohm PD */
  812. MSDC_SET_FIELD(MSDC1_GPIO_PUPD_ADDR, MSDC1_PUPD_ALL_MASK, 0x3F);
  813. MSDC_SET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, 0x0);
  814. MSDC_SET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, 0x3F);
  815. } else if (mode == MSDC_PIN_PULL_UP) {
  816. /* Switch MSDC1_CLK to 50K ohm PD,
  817. * MSDC1_CMD/MSDC1_DAT* to 50K ohm PU
  818. */
  819. MSDC_SET_FIELD(MSDC1_GPIO_PUPD_ADDR, MSDC1_PUPD_ALL_MASK, 0x1);
  820. MSDC_SET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, 0x0);
  821. MSDC_SET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, 0x3F);
  822. }
  823. }
  824. }
  825. /**************************************************************/
  826. /* Section 4: MISC */
  827. /**************************************************************/
  828. /* make sure the pad is msdc mode */
  829. #if !defined(FPGA_PLATFORM)
  830. void msdc_set_tdsel_wrap(struct mmc_host *host)
  831. {
  832. if (host->cur_pwr == VOL_1800)
  833. msdc_set_tdsel_by_id(host->id, MSDC_TDRDSEL_1V8, 0);
  834. else
  835. msdc_set_tdsel_by_id(host->id, MSDC_TDRDSEL_3V, 0);
  836. }
  837. void msdc_set_rdsel_wrap(struct mmc_host *host)
  838. {
  839. if (host->cur_pwr == VOL_1800)
  840. msdc_set_rdsel_by_id(host->id, MSDC_TDRDSEL_1V8, 0);
  841. else
  842. msdc_set_rdsel_by_id(host->id, MSDC_TDRDSEL_3V, 0);
  843. }
  844. void msdc_gpio_and_pad_init(struct mmc_host *host)
  845. {
  846. /* set smt enable */
  847. msdc_set_smt(host, 1);
  848. /* set pull enable */
  849. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  850. /* set gpio to msdc mode */
  851. msdc_set_pin_mode(host);
  852. /* set driving */
  853. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  854. /* set tdsel and rdsel */
  855. msdc_set_tdsel_wrap(host);
  856. msdc_set_rdsel_wrap(host);
  857. msdc_dump_padctl_by_id(host->id);
  858. }
  859. #endif
  860. #endif
  861. /**************************************************************/
  862. /* Section 5: Hard-code timing */
  863. /**************************************************************/
  864. #if defined(SLT) || defined(MMC_MSDC_DRV_CTP)
  865. /* copy from autok.c */
  866. #define AUTOK_CKGEN_VALUE (0)
  867. #define AUTOK_CMD_LATCH_EN_HS400_PORT0_VALUE (2)
  868. #define AUTOK_CRC_LATCH_EN_HS400_PORT0_VALUE (2)
  869. #define AUTOK_CMD_LATCH_EN_DDR208_PORT3_VALUE (2)
  870. #define AUTOK_CRC_LATCH_EN_DDR208_PORT3_VALUE (2)
  871. #define AUTOK_CMD_LATCH_EN_HS200_PORT0_VALUE (1)
  872. #define AUTOK_CRC_LATCH_EN_HS200_PORT0_VALUE (1)
  873. #define AUTOK_CMD_LATCH_EN_SDR104_PORT1_VALUE (1)
  874. #define AUTOK_CRC_LATCH_EN_SDR104_PORT1_VALUE (1)
  875. #define AUTOK_CMD_LATCH_EN_HS_VALUE (1)
  876. #define AUTOK_CRC_LATCH_EN_HS_VALUE (1)
  877. void msdc_apply_timing(unsigned int id)
  878. {
  879. struct mmc_host *host;
  880. msdc_priv_t *priv;
  881. int mode;
  882. u32 base;
  883. u32 hz, div;
  884. host = mmc_get_host(id);
  885. priv = host->priv;
  886. base = host->base;
  887. hz = host->cur_bus_clk;
  888. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, mode);
  889. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKDIV, div);
  890. if ((id == 0) && (mode == 3)) {
  891. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 1), 0); /* MSDC_IOCON[MSDC_IOCON_RSPL] */
  892. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 2), 0); /* MSDC_IOCON[MSDC_IOCON_R_D_SMPL] */
  893. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  894. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  895. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  896. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  897. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), 0); /* MSDC_PB2_CRCSTSENSEL*/
  898. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), 0); /* MSDC_PB2_CFG_CRCSTS_SEL*/
  899. //MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), AUTOK_CRC_LATCH_EN_HS400_PORT0_VALUE);
  900. //MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), AUTOK_CMD_LATCH_EN_HS400_PORT0_VALUE);
  901. MSDC_SET_FIELD(host->base + 0x208, (0x1 << 3), 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */
  902. MSDC_SET_FIELD(host->base + 0x208, (0x7 << 21), 1); /* MSDC_EMMC50_CFG_READ_DAT_CNT */
  903. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  904. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  905. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1 << 13), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY_SEL] */
  906. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1f << 7), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY] */
  907. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1 << 12), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2_SEL] */
  908. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1f << 2), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2] */
  909. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1 << 15), 0x1); /* EMMC_TOP_CONTROL[SDC_RX_ENH_EN] */
  910. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1 << 11), 0x1); /* EMMC_TOP_CMD[PAD_CMD_RXDLY] */
  911. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1f << 5), 0x9); /* EMMC_TOP_CMD[PAD_CMD_RXDLY_SEL] */
  912. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1 << 10), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2] */
  913. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1f << 0), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2_SEL] */
  914. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1f << 12), 0x0); /* EMMC_TOP_CMD_LEVEL1[PAD_CMD_TX_DLY] */
  915. MSDC_WRITE32(MSDC0_TOP_BASE + 0x8, 0x3); /* EMMC50_PAD_CTL0 */
  916. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0xC, (0x1 << 16), 0x1); /* EMMC50_PAD_DS_TUNE[PAD_DS_DLY_SEL] */
  917. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0xC, (0x1f << 10), 0xA); /* EMMC50_PAD_DS_TUNE[PAD_DS_DLY1] */
  918. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0xC, (0x1 << 15), 0x0); /* EMMC50_PAD_DS_TUNE[PAD_DS_DLY2_SEL] */
  919. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0xC, (0x1 << 5), 0x0); /* EMMC50_PAD_DS_TUNE[PAD_DS_DLY2] */
  920. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0xC, (0x1f << 0), 0xC); /* EMMC50_PAD_DS_TUNE[PAD_DS_DLY3] */
  921. } else if ((id == 0) && (div == 0)) {
  922. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 1), 0x0); /* MSDC_IOCON[MSDC_IOCON_RSPL] */
  923. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 2), 0x0); /* MSDC_IOCON[MSDC_IOCON_R_D_SMPL] */
  924. MSDC_SET_FIELD(host->base + 0xb0, (0x1 << 3), 0); /* MSDC_PB1_STOP_DLY_SEL */
  925. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  926. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  927. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  928. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  929. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), 0);
  930. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), 0);
  931. //MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), AUTOK_CRC_LATCH_EN_HS200_PORT0_VALUE);
  932. //MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), AUTOK_CMD_LATCH_EN_HS200_PORT0_VALUE);
  933. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 28), 1);
  934. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */
  935. MSDC_SET_FIELD(host->base + 0x208, (0x1 << 3), 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */
  936. MSDC_SET_FIELD(host->base + 0x208, (0x7 << 21), 7); /* MSDC_EMMC50_CFG_READ_DAT_CNT */
  937. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  938. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  939. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1 << 13), 0x1); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY_SEL] */
  940. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1f << 7), 0x4); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY] */
  941. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1 << 12), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2_SEL] */
  942. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1f << 2), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2] */
  943. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x0, (0x1 << 15), 0x1); /* EMMC_TOP_CONTROL[SDC_RX_ENH_EN] */
  944. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1 << 11), 0x1); /* EMMC_TOP_CMD[PAD_CMD_RXDLY] */
  945. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1f << 5), 0x7); /* EMMC_TOP_CMD[PAD_CMD_RXDLY_SEL] */
  946. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1 << 10), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2] */
  947. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1f << 0), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2_SEL] */
  948. MSDC_SET_FIELD(MSDC0_TOP_BASE + 0x4, (0x1f << 12), 0x0); /* EMMC_TOP_CMD_LEVEL1[PAD_CMD_TX_DLY] */
  949. MSDC_WRITE32(MSDC0_TOP_BASE + 0x8, 0x3); /* EMMC50_PAD_CTL0 */
  950. MSDC_WRITE32(MSDC0_TOP_BASE + 0xC, 0x0); /* EMMC50_PAD_DS_TUNE */
  951. } else if ((id == 0) && (mode == 2)) {
  952. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 4), 0x1); /* MSDC_IOCON[MSDC_IOCON_RSPL] */
  953. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  954. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  955. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  956. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  957. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), AUTOK_CRC_LATCH_EN_HS_VALUE);
  958. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), AUTOK_CMD_LATCH_EN_HS_VALUE);
  959. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 28), 1);
  960. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */
  961. MSDC_SET_FIELD(host->base + 0x208, (0x1 << 3), 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */
  962. MSDC_SET_FIELD(host->base + 0x208, (0x7 << 21), 7); /* MSDC_EMMC50_CFG_READ_DAT_CNT */
  963. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  964. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  965. MSDC_WRITE32(MSDC0_TOP_BASE + 0x0, 0x0); /* EMMC50_PAD_DS_TUNE */
  966. MSDC_WRITE32(MSDC0_TOP_BASE + 0x4, 0x0); /* EMMC50_PAD_DS_TUNE */
  967. MSDC_WRITE32(MSDC0_TOP_BASE + 0x8, 0x0); /* EMMC50_PAD_DS_TUNE */
  968. MSDC_WRITE32(MSDC0_TOP_BASE + 0xC, 0x0); /* EMMC50_PAD_DS_TUNE */
  969. } else if (id == 0) {
  970. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 4), 0x0); /* MSDC_IOCON[MSDC_IOCON_RSPL] */
  971. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  972. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  973. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  974. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  975. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  976. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  977. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), AUTOK_CRC_LATCH_EN_HS_VALUE);
  978. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), AUTOK_CMD_LATCH_EN_HS_VALUE);
  979. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 28), 1);
  980. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */
  981. MSDC_WRITE32(MSDC0_TOP_BASE + 0x0, 0x0); /* EMMC50_PAD_DS_TUNE */
  982. MSDC_WRITE32(MSDC0_TOP_BASE + 0x4, 0x0); /* EMMC50_PAD_DS_TUNE */
  983. MSDC_WRITE32(MSDC0_TOP_BASE + 0x8, 0x0); /* EMMC50_PAD_DS_TUNE */
  984. MSDC_WRITE32(MSDC0_TOP_BASE + 0xC, 0x0); /* EMMC50_PAD_DS_TUNE */
  985. } else if ((id == 1) && (mode == 1)) {
  986. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 1), 0x0); /*MSDC_IOCON[MSDC_IOCON_RSPL] */
  987. MSDC_SET_FIELD(host->base + 0xb0, (0x1 << 3), 0x0);
  988. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  989. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  990. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  991. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  992. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), 0);
  993. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), 0);
  994. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 28), 1);
  995. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0x0);
  996. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  997. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  998. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1 << 13), 0x1); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY_SEL] */
  999. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1f << 7), 0x6); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY] */
  1000. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1 << 12), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2_SEL] */
  1001. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1f << 2), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2] */
  1002. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1 << 15), 0x1); /* EMMC_TOP_CONTROL[SDC_RX_ENH_EN] */
  1003. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1 << 11), 0x1); /* EMMC_TOP_CMD[PAD_CMD_RXDLY] */
  1004. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1f << 5), 0x5); /* EMMC_TOP_CMD[PAD_CMD_RXDLY_SEL] */
  1005. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1 << 10), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2] */
  1006. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1f << 0), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2_SEL] */
  1007. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1f << 12), 0x0); /* EMMC_TOP_CMD_LEVEL1[PAD_CMD_TX_DLY] */
  1008. MSDC_WRITE32(MSDC0_TOP_BASE + 0x8, 0x3); /* EMMC50_PAD_CTL0 */
  1009. MSDC_WRITE32(MSDC0_TOP_BASE + 0xC, 0x0); /* EMMC50_PAD_CTL0 */
  1010. } else if ((id == 1) && (mode == 0) && (div == 0)) {
  1011. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 1), 0x1); /*MSDC_IOCON[MSDC_IOCON_RSPL] */
  1012. MSDC_SET_FIELD(host->base + 0xb0, (0x1 << 3), 0x1);
  1013. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  1014. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  1015. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  1016. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  1017. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), 0);
  1018. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), 0);
  1019. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 28), 1);
  1020. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0x1);
  1021. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  1022. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  1023. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1 << 13), 0x1); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY_SEL] */
  1024. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1f << 7), 0x16); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY] */
  1025. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1 << 12), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2_SEL] */
  1026. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1f << 2), 0x0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY2] */
  1027. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x0, (0x1 << 15), 0x1); /* EMMC_TOP_CONTROL[SDC_RX_ENH_EN] */
  1028. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1 << 11), 0x1); /* EMMC_TOP_CMD[PAD_CMD_RXDLY] */
  1029. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1f << 5), 0x16); /* EMMC_TOP_CMD[PAD_CMD_RXDLY_SEL] */
  1030. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1 << 10), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2] */
  1031. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1f << 0), 0x0); /* EMMC_TOP_CMD[PAD_CMD_RXDLY2_SEL] */
  1032. MSDC_SET_FIELD(MSDC1_TOP_BASE + 0x4, (0x1f << 12), 0x0); /* EMMC_TOP_CMD_LEVEL1[PAD_CMD_TX_DLY] */
  1033. MSDC_WRITE32(MSDC0_TOP_BASE + 0x8, 0x3); /* EMMC50_PAD_CTL0 */
  1034. MSDC_WRITE32(MSDC0_TOP_BASE + 0xC, 0x0); /* EMMC50_PAD_CTL0 */
  1035. } else if ((id == 1) && (mode == 0)) {
  1036. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 1), 0x0); /*MSDC_IOCON[MSDC_IOCON_RSPL] */
  1037. MSDC_SET_FIELD(host->base + 0xb0, (0x1 << 3), 0x0);
  1038. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  1039. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  1040. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  1041. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  1042. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), 0);
  1043. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), 0);
  1044. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 28), 1);
  1045. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0x0);
  1046. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  1047. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  1048. MSDC_WRITE32(MSDC1_TOP_BASE + 0x0, 0x0);
  1049. MSDC_WRITE32(MSDC1_TOP_BASE + 0x4, 0x0);
  1050. MSDC_WRITE32(MSDC1_TOP_BASE + 0x8, 0x3); /* EMMC50_PAD_CTL0 */
  1051. MSDC_WRITE32(MSDC1_TOP_BASE + 0xC, 0x18000); /* EMMC50_PAD_CTL0 */
  1052. } else if ((id == 1) && (mode == 2)) {
  1053. MSDC_SET_FIELD(host->base + 0x4, (0x1 << 1), 0x0); /*MSDC_IOCON[MSDC_IOCON_RSPL] */
  1054. MSDC_SET_FIELD(host->base + 0xb0, (0x1 << 3), 0x0);
  1055. MSDC_SET_FIELD(host->base + 0xb4, (0xf << 8), 3); /* MSDC_PB1_STOP_DLY_SEL */
  1056. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 20), 1); /* MSDC_PB1_POP_MARK_WATER */
  1057. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 19), 1); /* MSDC_PB1_STATE_CLR */
  1058. MSDC_SET_FIELD(host->base + 0xb4, (0x1 << 18), 1); /* Reserved bit */
  1059. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 29), 1);
  1060. MSDC_SET_FIELD(host->base + 0xb8, (0x7 << 16), 1);
  1061. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 28), 1);
  1062. MSDC_SET_FIELD(host->base + 0xb8, (0x1 << 25), 0x0);
  1063. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 24), 0); /* SDC_FIFO_CFG_WR_VALID_SEL */
  1064. MSDC_SET_FIELD(host->base + 0x228, (0x1 << 25), 0); /* SDC_FIFO_CFG_RD_VALID_SEL */
  1065. MSDC_WRITE32(MSDC1_TOP_BASE + 0x0, 0x2000); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY_SEL] */
  1066. MSDC_WRITE32(MSDC1_TOP_BASE + 0x4, 0); /* EMMC_TOP_CONTROL[PAD_DAT_RD_RXDLY_SEL] */
  1067. MSDC_WRITE32(MSDC1_TOP_BASE + 0x8, 0x3); /* EMMC50_PAD_CTL0 */
  1068. MSDC_WRITE32(MSDC1_TOP_BASE + 0xC, 0x18000); /* EMMC50_PAD_CTL0 */
  1069. }
  1070. }
  1071. #endif