msdc_io.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  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 (0x10000E84) //Select Power On/Off
  70. #define PWR_GPIO_EO (0x10000E88) //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. mdelay(10);
  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. default:
  369. break;
  370. }
  371. #endif
  372. }
  373. void msdc_dump_ldo_sts(struct mmc_host *host)
  374. {
  375. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  376. u32 ldo_en = 0, ldo_vol = 0;
  377. pmic_read_interface(REG_VEMC_EN, &ldo_en, MASK_VEMC_EN,
  378. SHIFT_VEMC_EN);
  379. pmic_read_interface(REG_VEMC_VOSEL, &ldo_vol, MASK_VEMC_VOSEL,
  380. SHIFT_VEMC_VOSEL);
  381. msdc_pr_err(" VEMC_EN=0x%x, should:1b'1, "
  382. "VEMC_VOL=0x%x, should:1b'0(3.0V),1b'1(3.3V)\n",
  383. ldo_en, ldo_vol);
  384. #endif
  385. }
  386. #endif
  387. void msdc_power(struct mmc_host *host, u8 mode)
  388. {
  389. if (mode == MMC_POWER_ON || mode == MMC_POWER_UP) {
  390. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  391. msdc_host_power(host, 1, host->cur_pwr);
  392. msdc_card_power(host, 1);
  393. msdc_clock(host, 1);
  394. } else {
  395. msdc_clock(host, 0);
  396. msdc_host_power(host, 0, host->cur_pwr);
  397. msdc_card_power(host, 0);
  398. msdc_pin_config(host, MSDC_PIN_PULL_DOWN);
  399. }
  400. }
  401. /**************************************************************/
  402. /* Section 2: Clock */
  403. /**************************************************************/
  404. #if !defined(FPGA_PLATFORM)
  405. u32 hclks_msdc0[] = { MSDC0_SRC_0, MSDC0_SRC_1, MSDC0_SRC_2, MSDC0_SRC_3,
  406. MSDC0_SRC_4, MSDC0_SRC_5};
  407. /* msdc1/2 clock source reference value is 200M */
  408. u32 hclks_msdc1[] = { MSDC1_SRC_0, MSDC1_SRC_1, MSDC1_SRC_2, MSDC1_SRC_3,
  409. MSDC1_SRC_4};
  410. u32 *hclks_msdc_all[] = {
  411. hclks_msdc0,
  412. hclks_msdc1,
  413. };
  414. void msdc_dump_clock_sts(struct mmc_host *host)
  415. {
  416. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  417. msdc_pr_info("MSDC0 HCLK_MUX[0x1000_0080][1:0] = %d, pdn = %d, "
  418. "CLK_MUX[0x1000_0080][10:8] = %d, pdn = %d, "
  419. "CLK_CG[0x1000_1094] bit2 = %d, bit6 %d\n",
  420. /* mux at bits 1~0 */
  421. (MSDC_READ32(0x10000080) >> 0) & 3,
  422. /* pdn at bit 7 */
  423. (MSDC_READ32(0x10000080) >> 7) & 1,
  424. /* mux at bits 8~10 */
  425. (MSDC_READ32(0x10000080) >> 8) & 7,
  426. /* pdn at bit 15 */
  427. (MSDC_READ32(0x10000080) >> 15) & 1,
  428. /* cg at bit 2, 6 */
  429. (MSDC_READ32(0x10001094) >> 2) & 1,
  430. (MSDC_READ32(0x10001094) >> 6) & 1);
  431. msdc_pr_info("MSDC1 CLK_MUX[0x1000_0080][18:16] = %d, pdn = %d, "
  432. "CLK_CG[0x1000_1094] bit4 = %d, bit16 %d\n",
  433. /* mux at bits 16~18 */
  434. (MSDC_READ32(0x10000080) >> 16) & 7,
  435. /* pdn at bit 23 */
  436. (MSDC_READ32(0x10000080) >> 23) & 1,
  437. /* cg at bit 4, 16 */
  438. (MSDC_READ32(0x10001094) >> 4) & 1,
  439. (MSDC_READ32(0x10001094) >> 16) & 1);
  440. #endif
  441. }
  442. #endif
  443. void msdc_clock(struct mmc_host *host, int on)
  444. {
  445. //Only CTP need enable/disable clock
  446. //Preloader will turn on clock with predefined clock source and module need not to touch clock setting.
  447. //LK will use preloader's setting and need not to touch clock setting.
  448. #if !defined(FPGA_PLATFORM)
  449. #if defined(MMC_MSDC_DRV_CTP)
  450. MSG(CFG, "[SD%d] Turn %s %s clock \n", host->id, on ? "on" : "off", "host");
  451. if (on) {
  452. if (host->id == 0) {
  453. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_CG);
  454. MSDC_SET_BIT32(MSDC0_CLOCK_UNGATE_REG, MSDC0_CLOCK_SRC_CG);
  455. } else if (host->id == 1) {
  456. MSDC_SET_BIT32(MSDC1_CLOCK_UNGATE_REG, MSDC1_CLOCK_CG);
  457. MSDC_SET_BIT32(MSDC1_CLOCK_UNGATE_REG, MSDC1_CLOCK_SRC_CG);
  458. }
  459. } else {
  460. if (host->id == 0) {
  461. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_CG);
  462. MSDC_SET_BIT32(MSDC0_CLOCK_GATE_REG, MSDC0_CLOCK_SRC_CG);
  463. } else if (host->id == 1) {
  464. MSDC_SET_BIT32(MSDC1_CLOCK_GATE_REG, MSDC1_CLOCK_CG);
  465. MSDC_SET_BIT32(MSDC1_CLOCK_GATE_REG, MSDC1_CLOCK_SRC_CG);
  466. }
  467. }
  468. #endif
  469. msdc_dump_clock_sts(host);
  470. #endif
  471. }
  472. /* perloader will pre-set msdc pll and the mux channel of msdc pll */
  473. /* note: pll will not changed */
  474. void msdc_config_clksrc(struct mmc_host *host, int clksrc)
  475. {
  476. #if !defined(FPGA_PLATFORM)
  477. #if defined(MMC_MSDC_DRV_PRELOADER) || defined(MMC_MSDC_DRV_LK)
  478. host->pll_mux_clk = MSDC0_CLKSRC_DEFAULT;
  479. host->src_clk = msdc_get_hclk(host->id, MSDC0_CLKSRC_DEFAULT);
  480. #endif
  481. #if defined(MMC_MSDC_DRV_CTP)
  482. if (host->card && mmc_card_hs400(host->card)) {
  483. /* if card is in hs400 mode, force clk source to be 400MHz */
  484. clksrc = MSDC0_CLKSRC_400MHZ;
  485. }
  486. host->pll_mux_clk = clksrc;
  487. host->src_clk = msdc_get_hclk(host->id, clksrc);
  488. /* The following section shall be confirmed by clock owner during porting */
  489. if (host->id == 0) {
  490. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x080), 0x7 << 8, host->pll_mux_clk);
  491. } else if (host->id == 1) {
  492. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x080), 0x7 << 16, host->pll_mux_clk);
  493. }
  494. /* Beware!, may hang if update others */
  495. MSDC_WRITE32(TOPCKGEN_BASE + 0x04, 0x07FFFFFF);
  496. #endif
  497. #else
  498. host->src_clk = msdc_get_hclk(host->id, clksrc);
  499. #endif
  500. }
  501. /**************************************************************/
  502. /* Section 3: GPIO and Pad */
  503. /**************************************************************/
  504. #if !defined(FPGA_PLATFORM)
  505. void msdc_dump_padctl_by_id(u32 id)
  506. {
  507. #if defined(MTK_MSDC_BRINGUP_DEBUG)
  508. if (id == 0) {
  509. msdc_pr_err("MSDC0 MODE20[%x] = 0x%X\tshould: 0x1???????\n",
  510. MSDC0_GPIO_MODE20, MSDC_READ32(MSDC0_GPIO_MODE20));
  511. msdc_pr_err("MSDC0 MODE21[%x] = 0x%X\tshould: 0x11111111\n",
  512. MSDC0_GPIO_MODE21, MSDC_READ32(MSDC0_GPIO_MODE21));
  513. msdc_pr_err("MSDC0 MODE22[%x] = 0x%X\tshould: 0x?????111\n",
  514. MSDC0_GPIO_MODE22, MSDC_READ32(MSDC0_GPIO_MODE22));
  515. msdc_pr_err("MSDC0 IES [%x] = 0x%X\tshould: 0x?????FFF\n",
  516. MSDC0_GPIO_IES_ADDR, MSDC_READ32(MSDC0_GPIO_IES_ADDR));
  517. msdc_pr_err("MSDC0 SMT [%x] = 0x%X\tshould: 0x???????F\n",
  518. MSDC0_GPIO_SMT_ADDR, MSDC_READ32(MSDC0_GPIO_SMT_ADDR));
  519. msdc_pr_err("MSDC0 TDSEL0[%x] = 0x%X\tshould: 0x????0000\n",
  520. MSDC0_GPIO_TDSEL0_ADDR,
  521. MSDC_READ32(MSDC0_GPIO_TDSEL0_ADDR));
  522. msdc_pr_err("MSDC0 RDSEL0[%x] = 0x%X\tshould: 0x00000000\n",
  523. MSDC0_GPIO_RDSEL0_ADDR,
  524. MSDC_READ32(MSDC0_GPIO_RDSEL0_ADDR));
  525. msdc_pr_err("MSDC0 DRV0 [%x] = 0x%X\tshould: 0x?????249\n",
  526. MSDC0_GPIO_DRV0_ADDR,
  527. MSDC_READ32(MSDC0_GPIO_DRV0_ADDR));
  528. msdc_pr_err("PUPD/R1/R0: dat/cmd:0/0/1, clk/dst: 1/1/0\n");
  529. msdc_pr_err("MSDC0 PUPD0 [%x] = 0x%X\tshould: 0x?????401\n",
  530. MSDC0_GPIO_PUPD0_ADDR,
  531. MSDC_READ32(MSDC0_GPIO_PUPD0_ADDR));
  532. msdc_pr_err("MSDC0 R0 [%x] = 0x%X\tshould: 0x?????3FE\n",
  533. MSDC0_GPIO_R0_ADDR,
  534. MSDC_READ32(MSDC0_GPIO_R0_ADDR));
  535. msdc_pr_err("MSDC0 R1 [%x] = 0x%X\tshould: 0x?????401\n",
  536. MSDC0_GPIO_R1_ADDR,
  537. MSDC_READ32(MSDC0_GPIO_R1_ADDR));
  538. #if (MSDC_MAX_NUM > 1)
  539. } else if (id == 1) {
  540. msdc_pr_err("MSDC1 MODE16 [%x] = 0x%X\tshould: 0x11??????\n",
  541. MSDC1_GPIO_MODE16, MSDC_READ32(MSDC1_GPIO_MODE16));
  542. msdc_pr_err("MSDC1 MODE17 [%x] = 0x%X\tshould: 0x????1111\n",
  543. MSDC1_GPIO_MODE17, MSDC_READ32(MSDC1_GPIO_MODE17));
  544. msdc_pr_err("MSDC1 IES [%x] = 0x%X\tshould: 0x??????FC\n",
  545. MSDC1_GPIO_IES_ADDR, MSDC_READ32(MSDC1_GPIO_IES_ADDR));
  546. msdc_pr_err("MSDC1 SMT [%x] = 0x%X\tshould: 0x??????1C\n",
  547. MSDC1_GPIO_SMT_ADDR, MSDC_READ32(MSDC1_GPIO_SMT_ADDR));
  548. msdc_pr_err("MSDC1 TDSEL0 [%x] = 0x%X\tshould: 0x????000?\n",
  549. MSDC1_GPIO_TDSEL0_ADDR,
  550. MSDC_READ32(MSDC1_GPIO_TDSEL0_ADDR));
  551. msdc_pr_err("should 1.8v: sleep: TBD, awake: TBD\n");
  552. msdc_pr_err("MSDC1 RDSEL0 [%x] = 0x%X\tshould: 0x???0000?\n",
  553. MSDC1_GPIO_RDSEL0_ADDR,
  554. MSDC_READ32(MSDC1_GPIO_RDSEL0_ADDR));
  555. msdc_pr_err("1.8V: TBD, 2.9v: TBD\n");
  556. msdc_pr_err("MSDC1 DRV0 [%x] = 0x%X\tshould: 0x?????92?\n",
  557. MSDC1_GPIO_DRV0_ADDR,
  558. MSDC_READ32(MSDC1_GPIO_DRV0_ADDR));
  559. msdc_pr_err("MSDC1 PUPD0 [%x] = 0x%X\tshould: 0x??????01\n",
  560. MSDC1_GPIO_PUPD0_ADDR,
  561. MSDC_READ32(MSDC1_GPIO_PUPD0_ADDR));
  562. msdc_pr_err("MSDC1 R0 [%x] = 0x%X\tshould: 0x??????00\n",
  563. MSDC1_GPIO_R0_ADDR,
  564. MSDC_READ32(MSDC1_GPIO_R0_ADDR));
  565. msdc_pr_err("MSDC1 R1 [%x] = 0x%X\tshould: 0x??????3F\n",
  566. MSDC1_GPIO_R1_ADDR,
  567. MSDC_READ32(MSDC1_GPIO_R1_ADDR));
  568. #endif
  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_MODE20, 0xF0000000, 0x1);
  576. MSDC_SET_FIELD(MSDC0_GPIO_MODE21, 0xFFFFFFFF, 0x11111111);
  577. MSDC_SET_FIELD(MSDC0_GPIO_MODE22, 0x00000FFF, 0x111);
  578. #if (MSDC_MAX_NUM > 1)
  579. } else if (host->id == 1) {
  580. MSDC_SET_FIELD(MSDC1_GPIO_MODE16, 0xFF000000, 0x11);
  581. MSDC_SET_FIELD(MSDC1_GPIO_MODE17, 0x0000FFFF, 0x1111);
  582. #endif
  583. }
  584. }
  585. void msdc_set_ies_by_id(u32 id, int set_ies)
  586. {
  587. if (id == 0) {
  588. MSDC_SET_FIELD(MSDC0_GPIO_IES_ADDR, MSDC0_IES_ALL_MASK,
  589. (set_ies ? 0xFFF : 0));
  590. #if (MSDC_MAX_NUM > 1)
  591. } else if (id == 1) {
  592. MSDC_SET_FIELD(MSDC1_GPIO_IES_ADDR, MSDC1_IES_ALL_MASK,
  593. (set_ies ? 0x3F : 0));
  594. #endif
  595. }
  596. }
  597. void msdc_set_smt_by_id(u32 id, int set_smt)
  598. {
  599. if (id == 0) {
  600. MSDC_SET_FIELD(MSDC0_GPIO_SMT_ADDR, MSDC0_SMT_ALL_MASK,
  601. (set_smt ? 0xF : 0));
  602. #if (MSDC_MAX_NUM > 1)
  603. } else if (id == 1) {
  604. MSDC_SET_FIELD(MSDC1_GPIO_SMT_ADDR, MSDC1_SMT_ALL_MASK,
  605. (set_smt ? 0x7 : 0));
  606. #endif
  607. }
  608. }
  609. void msdc_set_tdsel_by_id(u32 id, u32 flag, u32 value)
  610. {
  611. u32 cust_val;
  612. if (id == 0) {
  613. if (flag == MSDC_TDRDSEL_CUST)
  614. cust_val = value;
  615. else
  616. cust_val = 0;
  617. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_CMD_MASK,
  618. cust_val);
  619. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_DAT_MASK,
  620. cust_val);
  621. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_CLK_MASK,
  622. cust_val);
  623. MSDC_SET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_DSL_MASK,
  624. cust_val);
  625. #if (MSDC_MAX_NUM > 1)
  626. } else if (id == 1) {
  627. if (flag == MSDC_TDRDSEL_CUST)
  628. cust_val = value;
  629. else
  630. cust_val = 0;
  631. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_DAT_MASK,
  632. cust_val);
  633. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_CMD_MASK,
  634. cust_val);
  635. MSDC_SET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_CLK_MASK,
  636. cust_val);
  637. #endif
  638. }
  639. }
  640. void msdc_set_rdsel_by_id(u32 id, u32 flag, u32 value)
  641. {
  642. u32 cust_val;
  643. if (id == 0) {
  644. if (flag == MSDC_TDRDSEL_CUST)
  645. cust_val = value;
  646. else
  647. cust_val = 0;
  648. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_CMD_MASK,
  649. cust_val);
  650. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_DAT_MASK,
  651. cust_val);
  652. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_CLK_MASK,
  653. cust_val);
  654. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_DSL_MASK,
  655. cust_val);
  656. MSDC_SET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_RSTB_MASK,
  657. cust_val);
  658. #if (MSDC_MAX_NUM > 1)
  659. } else if (id == 1) {
  660. if (flag == MSDC_TDRDSEL_CUST)
  661. cust_val = value;
  662. else
  663. cust_val = 0;
  664. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_CMD_MASK,
  665. cust_val);
  666. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_DAT_MASK,
  667. cust_val);
  668. MSDC_SET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_CLK_MASK,
  669. cust_val);
  670. #endif
  671. }
  672. }
  673. void msdc_get_tdsel_by_id(u32 id, u32 *value)
  674. {
  675. if (id == 0) {
  676. MSDC_GET_FIELD(MSDC0_GPIO_TDSEL0_ADDR, MSDC0_TDSEL0_CMD_MASK,
  677. *value);
  678. #if (MSDC_MAX_NUM > 1)
  679. } else if (id == 1) {
  680. MSDC_GET_FIELD(MSDC1_GPIO_TDSEL0_ADDR, MSDC1_TDSEL0_CMD_MASK,
  681. *value);
  682. #endif
  683. }
  684. }
  685. void msdc_get_rdsel_by_id(u32 id, u32 *value)
  686. {
  687. if (id == 0) {
  688. MSDC_GET_FIELD(MSDC0_GPIO_RDSEL0_ADDR, MSDC0_RDSEL0_CMD_MASK,
  689. *value);
  690. #if (MSDC_MAX_NUM > 1)
  691. } else if (id == 1) {
  692. MSDC_GET_FIELD(MSDC1_GPIO_RDSEL0_ADDR, MSDC1_RDSEL0_CMD_MASK,
  693. *value);
  694. #endif
  695. }
  696. }
  697. void msdc_set_sr_by_id(u32 id, int clk, int cmd, int dat, int rst, int ds)
  698. {
  699. /*SR not supported*/
  700. return;
  701. }
  702. void msdc_set_driving_by_id(u32 id, struct msdc_cust *msdc_cap, bool sd_18)
  703. {
  704. if (id == 0) {
  705. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DSL_MASK,
  706. msdc_cap->ds_drv);
  707. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DAT_MASK,
  708. msdc_cap->dat_drv);
  709. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CMD_MASK,
  710. msdc_cap->cmd_drv);
  711. MSDC_SET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CLK_MASK,
  712. msdc_cap->clk_drv);
  713. #if (MSDC_MAX_NUM > 1)
  714. } else if (id == 1) {
  715. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CMD_MASK,
  716. msdc_cap->cmd_drv);
  717. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CLK_MASK,
  718. msdc_cap->clk_drv);
  719. MSDC_SET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_DAT_MASK,
  720. msdc_cap->dat_drv);
  721. #endif
  722. }
  723. }
  724. #if defined(MMC_MSDC_DRV_CTP)
  725. void msdc_get_driving_by_id(u32 id, struct msdc_cust *msdc_cap, bool sd_18)
  726. {
  727. if (id == 0) {
  728. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DSL_MASK,
  729. msdc_cap->ds_drv);
  730. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DAT_MASK,
  731. msdc_cap->rst_drv);
  732. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CMD_MASK,
  733. msdc_cap->cmd_drv);
  734. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_CLK_MASK,
  735. msdc_cap->clk_drv);
  736. MSDC_GET_FIELD(MSDC0_GPIO_DRV0_ADDR, MSDC0_DRV0_DAT_MASK,
  737. msdc_cap->dat_drv);
  738. #if (MSDC_MAX_NUM > 1)
  739. } else if (id == 1) {
  740. MSDC_GET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CMD_MASK,
  741. msdc_cap->cmd_drv);
  742. MSDC_GET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_CLK_MASK,
  743. msdc_cap->clk_drv);
  744. MSDC_GET_FIELD(MSDC1_GPIO_DRV0_ADDR, MSDC1_DRV0_DAT_MASK,
  745. msdc_cap->dat_drv);
  746. #endif
  747. }
  748. }
  749. #endif
  750. /* msdc pin config
  751. * MSDC0
  752. * PUPD/R1/R0
  753. * 0/0/0: High-Z
  754. * 0/0/1: Pull-up with 10Kohm
  755. * 0/1/0: Pull-up with 50Kohm
  756. * 0/1/1: Pull-up with 10Kohm//50Kohm
  757. * 1/0/0: High-Z
  758. * 1/0/1: Pull-down with 10Kohm
  759. * 1/1/0: Pull-down with 50Kohm
  760. * 1/1/1: Pull-down with 10Kohm//50Kohm
  761. */
  762. void msdc_pin_config_by_id(u32 id, u32 mode)
  763. {
  764. if (id == 0) {
  765. /* 1. don't pull CLK high;
  766. * 2. Don't toggle RST to prevent from entering boot mode
  767. */
  768. if (mode == MSDC_PIN_PULL_NONE) {
  769. /* Switch MSDC0_* to no ohm PU */
  770. MSDC_SET_FIELD(MSDC0_GPIO_PUPD0_ADDR, MSDC0_PUPD_ALL_MASK, 0x0);
  771. MSDC_SET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, 0x0);
  772. MSDC_SET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, 0x0);
  773. } else if (mode == MSDC_PIN_PULL_DOWN) {
  774. /* Switch MSDC0_* to 50K ohm PD */
  775. MSDC_SET_FIELD(MSDC0_GPIO_PUPD0_ADDR, MSDC0_PUPD_ALL_MASK, 0x7FF);
  776. MSDC_SET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, 0x0);
  777. MSDC_SET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, 0x7FF);
  778. } else if (mode == MSDC_PIN_PULL_UP) {
  779. /* Switch MSDC0_CLK to 50K ohm PD,
  780. * MSDC0_CMD/MSDC0_DAT* to 10K ohm PU,
  781. * MSDC0_DSL to 50K ohm PD
  782. */
  783. MSDC_SET_FIELD(MSDC0_GPIO_PUPD0_ADDR, MSDC0_PUPD_ALL_MASK, 0x401);
  784. MSDC_SET_FIELD(MSDC0_GPIO_R0_ADDR, MSDC0_R0_ALL_MASK, 0x3FE);
  785. MSDC_SET_FIELD(MSDC0_GPIO_R1_ADDR, MSDC0_R1_ALL_MASK, 0x401);
  786. }
  787. #if (MSDC_MAX_NUM > 1)
  788. } else if (id == 1) {
  789. if (mode == MSDC_PIN_PULL_NONE) {
  790. /* Switch MSDC1_* to no ohm PU */
  791. MSDC_SET_FIELD(MSDC1_GPIO_PUPD0_ADDR, MSDC1_PUPD_ALL_MASK, 0x0);
  792. MSDC_SET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, 0x0);
  793. MSDC_SET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, 0x0);
  794. } else if (mode == MSDC_PIN_PULL_DOWN) {
  795. /* Switch MSDC1_* to 50K ohm PD */
  796. MSDC_SET_FIELD(MSDC1_GPIO_PUPD0_ADDR, MSDC1_PUPD_ALL_MASK, 0x3F);
  797. MSDC_SET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, 0x0);
  798. MSDC_SET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, 0x3F);
  799. } else if (mode == MSDC_PIN_PULL_UP) {
  800. /* Switch MSDC1_CLK to 50K ohm PD,
  801. * MSDC1_CMD/MSDC1_DAT* to 50K ohm PU
  802. */
  803. MSDC_SET_FIELD(MSDC1_GPIO_PUPD0_ADDR, MSDC1_PUPD_ALL_MASK, 0x1);
  804. MSDC_SET_FIELD(MSDC1_GPIO_R0_ADDR, MSDC1_R0_ALL_MASK, 0x0);
  805. MSDC_SET_FIELD(MSDC1_GPIO_R1_ADDR, MSDC1_R1_ALL_MASK, 0x3F);
  806. }
  807. #endif
  808. }
  809. }
  810. /**************************************************************/
  811. /* Section 4: MISC */
  812. /**************************************************************/
  813. /* make sure the pad is msdc mode */
  814. #if !defined(FPGA_PLATFORM)
  815. void msdc_set_tdsel_wrap(struct mmc_host *host)
  816. {
  817. if (host->cur_pwr == VOL_1800)
  818. msdc_set_tdsel_by_id(host->id, MSDC_TDRDSEL_1V8, 0);
  819. else
  820. msdc_set_tdsel_by_id(host->id, MSDC_TDRDSEL_3V, 0);
  821. }
  822. void msdc_set_rdsel_wrap(struct mmc_host *host)
  823. {
  824. if (host->cur_pwr == VOL_1800)
  825. msdc_set_rdsel_by_id(host->id, MSDC_TDRDSEL_1V8, 0);
  826. else
  827. msdc_set_rdsel_by_id(host->id, MSDC_TDRDSEL_3V, 0);
  828. }
  829. void msdc_gpio_and_pad_init(struct mmc_host *host)
  830. {
  831. /* set smt enable */
  832. msdc_set_smt(host, 1);
  833. /* set pull enable */
  834. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  835. /* set gpio to msdc mode */
  836. msdc_set_pin_mode(host);
  837. /* set driving */
  838. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  839. /* set tdsel and rdsel */
  840. msdc_set_tdsel_wrap(host);
  841. msdc_set_rdsel_wrap(host);
  842. msdc_dump_padctl_by_id(host->id);
  843. }
  844. #endif
  845. #endif
  846. #define MSDC0_SDC_ADV_CFG0 (MSDC0_BASE + 0x64)
  847. #define MSDC1_SDC_ADV_CFG0 (MSDC1_BASE + 0x64)
  848. #define MSDC_SPM_REQ_EN (7U << 22) /* bit 22:24 msdc spm req enable bits */
  849. /* Enable msdc HW SPM resource request, otherwise SPM always see msdc res req siganl busy */
  850. void msdc_spm_hw_res_req_en(void)
  851. {
  852. MSDC_SET_FIELD(MSDC0_SDC_ADV_CFG0, MSDC_SPM_REQ_EN, 0x7);
  853. MSDC_SET_FIELD(MSDC1_SDC_ADV_CFG0, MSDC_SPM_REQ_EN, 0x7);
  854. }
  855. /**************************************************************/
  856. /* Section 5: Hard-code timing */
  857. /**************************************************************/
  858. #if defined(SLT) || defined(MMC_MSDC_DRV_CTP)
  859. /* copy from autok.c */
  860. #define AUTOK_CKGEN_VALUE (0)
  861. #define AUTOK_CMD_LATCH_EN_HS400_PORT0_VALUE (3)
  862. #define AUTOK_CRC_LATCH_EN_HS400_PORT0_VALUE (3)
  863. #define AUTOK_CMD_LATCH_EN_DDR208_PORT3_VALUE (3)
  864. #define AUTOK_CRC_LATCH_EN_DDR208_PORT3_VALUE (3)
  865. #define AUTOK_CMD_LATCH_EN_HS200_PORT0_VALUE (2)
  866. #define AUTOK_CRC_LATCH_EN_HS200_PORT0_VALUE (2)
  867. #define AUTOK_CMD_LATCH_EN_SDR104_PORT1_VALUE (2)
  868. #define AUTOK_CRC_LATCH_EN_SDR104_PORT1_VALUE (2)
  869. #define AUTOK_CMD_LATCH_EN_HS_VALUE (1)
  870. #define AUTOK_CRC_LATCH_EN_HS_VALUE (1)
  871. void msdc_apply_timing(unsigned int id)
  872. {
  873. struct mmc_host *host;
  874. msdc_priv_t *priv;
  875. int mode;
  876. u32 base;
  877. u32 base_top;
  878. u32 hz, div;
  879. host = mmc_get_host(id);
  880. priv = host->priv;
  881. base = host->base;
  882. base_top = host->base_top;
  883. hz = host->cur_bus_clk;
  884. MSDC_SET_FIELD(host->base + 0x208, (0x1 << 9), 0);
  885. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, mode);
  886. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKDIV, div);
  887. if ((id == 0) && (mode == 3)) {
  888. /*eMMC HS400*/
  889. msdc_pr_err("[SD%d] %s %d: HS400\n", id, __func__, __LINE__);
  890. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, 0); /* MSDC_IOCON[MSDC_IOCON_RSPL] 0x4 bit1 */
  891. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, 0); /* MSDC_IOCON[MSDC_IOCON_R_D_SMPL] 0x4 bit2 */
  892. MSDC_SET_FIELD(MSDC_PATCH_BIT1 , MSDC_PB1_STOP_DLY_SEL, 3); /* MSDC_PB1_STOP_DLY_SEL 0xb4[11:8] */
  893. MSDC_SET_FIELD(MSDC_PATCH_BIT2 , MSDC_PB2_CRCSTSENSEL, 0); /* 0xb8[31:29] */
  894. MSDC_SET_FIELD(MSDC_PATCH_BIT2 , MSDC_PB2_RESPSTENSEL, 0); /* 0xb8[18:16] */
  895. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_EDGE, 0); /* 0x208 bit3 */
  896. /*top reg*/
  897. MSDC_WRITE32(EMMC_TOP_CONTROL, 0xa080); /* EMMC_TOP_CONTROL 0x0 */
  898. MSDC_WRITE32(EMMC_TOP_CMD, 0xac0); /* EMMC_TOP_CMD 0x4 */
  899. MSDC_WRITE32(TOP_EMMC50_PAD_CTL0, 0x0); /* TOP_EMMC50_PAD_CTL0 0x8 */
  900. MSDC_WRITE32(TOP_EMMC50_PAD_DS_TUNE, 0x12c14); /* TOP_EMMC50_PAD_DS_TUNE 0xc */
  901. } else if ((id == 0) && (div == 0)) {
  902. /*eMMC HS200*/
  903. msdc_pr_err("[SD%d] %s %d: HS200\n", id, __func__, __LINE__);
  904. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, 0); /*MSDC_IOCON[MSDC_IOCON_RSPL] 0x4 bit1 */
  905. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, 0); /* MSDC_IOCON[MSDC_IOCON_R_D_SMPL] 0x4 bit2 */
  906. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, 0); /* PATCH_BIT0[MSDC_PB0_INT_DAT_LATCH_CK_SEL] 0xb0[9:7] */
  907. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, 0); /* 0xb0 bit3 */
  908. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_STOP_DLY_SEL, 3); /* MSDC_PB1_STOP_DLY_SEL 0xb4[11:8] */
  909. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_CRCSTSENSEL, 0); /* 0xb8[31:29] */
  910. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_RESPSTENSEL, 0); /* 0xb8[18:16] */
  911. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTSEDGE, 0); /* MSDC_PB2_CFGCRCSTSEDGE, write crc stage edge */ /* 0xb8 bit25 */
  912. /*top reg*/
  913. MSDC_WRITE32(EMMC_TOP_CONTROL, 0xaa80); /* EMMC_TOP_CONTROL 0x0 */
  914. MSDC_WRITE32(EMMC_TOP_CMD, 0xac0); /* EMMC_TOP_CMD 0x4 */
  915. MSDC_WRITE32(TOP_EMMC50_PAD_CTL0, 0x0); /* TOP_EMMC50_PAD_CTL0 0x8 */
  916. MSDC_WRITE32(TOP_EMMC50_PAD_DS_TUNE, 0x0); /* TOP_EMMC50_PAD_DS_TUNE 0xc */
  917. }
  918. }
  919. #endif