msdc.c 110 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include "msdc.h"
  32. #if defined(MMC_MSDC_DRV_CTP)
  33. #include <common.h>
  34. #include "api.h" //For invocation cache_clean_invalidate()
  35. #include "cache_api.h" //For invocation cache_clean_invalidate()
  36. #endif
  37. #if defined(MMC_MSDC_DRV_LK)
  38. #include <kernel/event.h>
  39. #include <platform/mt_irq.h>
  40. #endif
  41. #if defined(MMC_MSDC_DRV_CTP)
  42. #include "gpio.h"
  43. #if defined(MSDC_USE_DCM)
  44. #include "dcm.h"
  45. #endif
  46. #if !defined(FPGA_PLATFORM)
  47. #include "pmic.h"
  48. #include "clock_manager.h"
  49. #endif
  50. #endif
  51. static int msdc_rsp[] = {
  52. 0, /* RESP_NONE */
  53. 1, /* RESP_R1 */
  54. 2, /* RESP_R2 */
  55. 3, /* RESP_R3 */
  56. 4, /* RESP_R4 */
  57. 1, /* RESP_R5 */
  58. 1, /* RESP_R6 */
  59. 1, /* RESP_R7 */
  60. 7, /* RESP_R1b */
  61. };
  62. static msdc_priv_t msdc_priv[MSDC_MAX_NUM];
  63. void msdc_dump_card_status(u32 card_status)
  64. {
  65. #if MSDC_DEBUG
  66. static char *state[] = {
  67. "Idle", /* 0 */
  68. "Ready", /* 1 */
  69. "Ident", /* 2 */
  70. "Stby", /* 3 */
  71. "Tran", /* 4 */
  72. "Data", /* 5 */
  73. "Rcv", /* 6 */
  74. "Prg", /* 7 */
  75. "Dis", /* 8 */
  76. "Ina", /* 9 */
  77. "Sleep", /* 10 */
  78. "Reserved", /* 11 */
  79. "Reserved", /* 12 */
  80. "Reserved", /* 13 */
  81. "Reserved", /* 14 */
  82. "I/O mode", /* 15 */
  83. };
  84. if (card_status & R1_OUT_OF_RANGE)
  85. MSG(INF, "\t[CARD_STATUS] Out of Range\n");
  86. if (card_status & R1_ADDRESS_ERROR)
  87. MSG(INF, "\t[CARD_STATUS] Address Error\n");
  88. if (card_status & R1_BLOCK_LEN_ERROR)
  89. MSG(INF, "\t[CARD_STATUS] Block Len Error\n");
  90. if (card_status & R1_ERASE_SEQ_ERROR)
  91. MSG(INF, "\t[CARD_STATUS] Erase Seq Error\n");
  92. if (card_status & R1_ERASE_PARAM)
  93. MSG(INF, "\t[CARD_STATUS] Erase Param\n");
  94. if (card_status & R1_WP_VIOLATION)
  95. MSG(INF, "\t[CARD_STATUS] WP Violation\n");
  96. if (card_status & R1_CARD_IS_LOCKED)
  97. MSG(INF, "\t[CARD_STATUS] Card is Locked\n");
  98. if (card_status & R1_LOCK_UNLOCK_FAILED)
  99. MSG(INF, "\t[CARD_STATUS] Lock/Unlock Failed\n");
  100. if (card_status & R1_COM_CRC_ERROR)
  101. MSG(INF, "\t[CARD_STATUS] Command CRC Error\n");
  102. if (card_status & R1_ILLEGAL_COMMAND)
  103. MSG(INF, "\t[CARD_STATUS] Illegal Command\n");
  104. if (card_status & R1_CARD_ECC_FAILED)
  105. MSG(INF, "\t[CARD_STATUS] Card ECC Failed\n");
  106. if (card_status & R1_CC_ERROR)
  107. MSG(INF, "\t[CARD_STATUS] CC Error\n");
  108. if (card_status & R1_ERROR)
  109. MSG(INF, "\t[CARD_STATUS] Error\n");
  110. if (card_status & R1_UNDERRUN)
  111. MSG(INF, "\t[CARD_STATUS] Underrun\n");
  112. if (card_status & R1_OVERRUN)
  113. MSG(INF, "\t[CARD_STATUS] Overrun\n");
  114. if (card_status & R1_CID_CSD_OVERWRITE)
  115. MSG(INF, "\t[CARD_STATUS] CID/CSD Overwrite\n");
  116. if (card_status & R1_WP_ERASE_SKIP)
  117. MSG(INF, "\t[CARD_STATUS] WP Eraser Skip\n");
  118. if (card_status & R1_CARD_ECC_DISABLED)
  119. MSG(INF, "\t[CARD_STATUS] Card ECC Disabled\n");
  120. if (card_status & R1_ERASE_RESET)
  121. MSG(INF, "\t[CARD_STATUS] Erase Reset\n");
  122. if (card_status & R1_READY_FOR_DATA)
  123. MSG(INF, "\t[CARD_STATUS] Ready for Data\n");
  124. if (card_status & R1_SWITCH_ERROR)
  125. MSG(INF, "\t[CARD_STATUS] Switch error\n");
  126. if (card_status & R1_URGENT_BKOPS)
  127. MSG(INF, "\t[CARD_STATUS] Urgent background operations\n");
  128. if (card_status & R1_APP_CMD)
  129. MSG(INF, "\t[CARD_STATUS] App Command\n");
  130. MSG(INF, "\t[CARD_STATUS] '%s' State\n",
  131. state[R1_CURRENT_STATE(card_status)]);
  132. #endif
  133. }
  134. void msdc_dump_ocr_reg(u32 resp)
  135. {
  136. #if MSDC_DEBUG
  137. if (resp & (1 << 7))
  138. msdc_printf("\t[OCR] Low Voltage Range\n");
  139. if (resp & (1 << 15))
  140. msdc_printf("\t[OCR] 2.7-2.8 volt\n");
  141. if (resp & (1 << 16))
  142. msdc_printf("\t[OCR] 2.8-2.9 volt\n");
  143. if (resp & (1 << 17))
  144. msdc_printf("\t[OCR] 2.9-3.0 volt\n");
  145. if (resp & (1 << 18))
  146. msdc_printf("\t[OCR] 3.0-3.1 volt\n");
  147. if (resp & (1 << 19))
  148. msdc_printf("\t[OCR] 3.1-3.2 volt\n");
  149. if (resp & (1 << 20))
  150. msdc_printf("\t[OCR] 3.2-3.3 volt\n");
  151. if (resp & (1 << 21))
  152. msdc_printf("\t[OCR] 3.3-3.4 volt\n");
  153. if (resp & (1 << 22))
  154. msdc_printf("\t[OCR] 3.4-3.5 volt\n");
  155. if (resp & (1 << 23))
  156. msdc_printf("\t[OCR] 3.5-3.6 volt\n");
  157. if (resp & (1 << 24))
  158. msdc_printf("\t[OCR] Switching to 1.8V Accepted (S18A)\n");
  159. if (resp & (1 << 30))
  160. msdc_printf("\t[OCR] Card Capacity Status (CCS)\n");
  161. if (resp & (1UL << 31))
  162. msdc_printf("\t[OCR] Card Power Up Status (Idle)\n");
  163. else
  164. msdc_printf("\t[OCR] Card Power Up Status (Busy)\n");
  165. #endif
  166. }
  167. void msdc_dump_io_resp(u32 resp)
  168. {
  169. #if MSDC_DEBUG
  170. u32 flags = (resp >> 8) & 0xFF;
  171. char *state[] = {"DIS", "CMD", "TRN", "RFU"};
  172. if (flags & (1 << 7))
  173. msdc_printf("\t[IO] COM_CRC_ERR\n");
  174. if (flags & (1 << 6))
  175. msdc_printf("\t[IO] Illgal command\n");
  176. if (flags & (1 << 3))
  177. msdc_printf("\t[IO] Error\n");
  178. if (flags & (1 << 2))
  179. msdc_printf("\t[IO] RFU\n");
  180. if (flags & (1 << 1))
  181. msdc_printf("\t[IO] Function number error\n");
  182. if (flags & (1 << 0))
  183. msdc_printf("\t[IO] Out of range\n");
  184. msdc_printf("[IO] State: %s, Data:0x%x\n", state[(resp >> 12) & 0x3], resp & 0xFF);
  185. #endif
  186. }
  187. void msdc_dump_rca_resp(u32 resp)
  188. {
  189. #if MSDC_DEBUG
  190. u32 card_status = (((resp >> 15) & 0x1) << 23) |
  191. (((resp >> 14) & 0x1) << 22) |
  192. (((resp >> 13) & 0x1) << 19) |
  193. (resp & 0x1fff);
  194. msdc_printf("\t[RCA] 0x%x\n", resp >> 16);
  195. msdc_dump_card_status(card_status);
  196. #endif
  197. }
  198. static void msdc_dump_dbg_register(struct mmc_host *host)
  199. {
  200. u32 base = host->base;
  201. u32 i;
  202. for (i = 0; i <= 0x3c; i++) {
  203. MSDC_WRITE32(MSDC_DBG_SEL, i);
  204. msdc_printf("[SD%d]SW_DBG_SEL: write reg[%x] to 0x%x\n", host->id, OFFSET_MSDC_DBG_SEL, i);
  205. msdc_printf("[SD%d]SW_DBG_OUT: read reg[%x] to 0x%x\n", host->id, OFFSET_MSDC_DBG_OUT, MSDC_READ32(MSDC_DBG_OUT));
  206. }
  207. MSDC_WRITE32(MSDC_DBG_SEL, 0);
  208. }
  209. void msdc_dump_register(struct mmc_host *host)
  210. {
  211. u32 base = host->base;
  212. msdc_printf("[SD%d] Reg[%x] MSDC_CFG = 0x%x\n", host->id, OFFSET_MSDC_CFG, MSDC_READ32(MSDC_CFG));
  213. msdc_printf("[SD%d] Reg[%x] MSDC_IOCON = 0x%x\n", host->id, OFFSET_MSDC_IOCON, MSDC_READ32(MSDC_IOCON));
  214. msdc_printf("[SD%d] Reg[%x] MSDC_PS = 0x%x\n", host->id, OFFSET_MSDC_PS, MSDC_READ32(MSDC_PS));
  215. msdc_printf("[SD%d] Reg[%x] MSDC_INT = 0x%x\n", host->id, OFFSET_MSDC_INT, MSDC_READ32(MSDC_INT));
  216. msdc_printf("[SD%d] Reg[%x] MSDC_INTEN = 0x%x\n", host->id, OFFSET_MSDC_INTEN, MSDC_READ32(MSDC_INTEN));
  217. msdc_printf("[SD%d] Reg[%x] MSDC_FIFOCS = 0x%x\n", host->id, OFFSET_MSDC_FIFOCS, MSDC_READ32(MSDC_FIFOCS));
  218. msdc_printf("[SD%d] Reg[%x] MSDC_TXDATA = not read\n", host->id, OFFSET_MSDC_TXDATA);
  219. msdc_printf("[SD%d] Reg[%x] MSDC_RXDATA = not read\n", host->id, OFFSET_MSDC_RXDATA);
  220. msdc_printf("[SD%d] Reg[%x] SDC_CFG = 0x%x\n", host->id, OFFSET_SDC_CFG, MSDC_READ32(SDC_CFG));
  221. msdc_printf("[SD%d] Reg[%x] SDC_CMD = 0x%x\n", host->id, OFFSET_SDC_CMD, MSDC_READ32(SDC_CMD));
  222. msdc_printf("[SD%d] Reg[%x] SDC_ARG = 0x%x\n", host->id, OFFSET_SDC_ARG, MSDC_READ32(SDC_ARG));
  223. msdc_printf("[SD%d] Reg[%x] SDC_STS = 0x%x\n", host->id, OFFSET_SDC_STS, MSDC_READ32(SDC_STS));
  224. msdc_printf("[SD%d] Reg[%x] SDC_RESP0 = 0x%x\n", host->id, OFFSET_SDC_RESP0, MSDC_READ32(SDC_RESP0));
  225. msdc_printf("[SD%d] Reg[%x] SDC_RESP1 = 0x%x\n", host->id, OFFSET_SDC_RESP1, MSDC_READ32(SDC_RESP1));
  226. msdc_printf("[SD%d] Reg[%x] SDC_RESP2 = 0x%x\n", host->id, OFFSET_SDC_RESP2, MSDC_READ32(SDC_RESP2));
  227. msdc_printf("[SD%d] Reg[%x] SDC_RESP3 = 0x%x\n", host->id, OFFSET_SDC_RESP3, MSDC_READ32(SDC_RESP3));
  228. msdc_printf("[SD%d] Reg[%x] SDC_BLK_NUM = 0x%x\n", host->id, OFFSET_SDC_BLK_NUM, MSDC_READ32(SDC_BLK_NUM));
  229. msdc_printf("[SD%d] Reg[%x] SDC_VOL_CHG = 0x%x\n", host->id, OFFSET_SDC_VOL_CHG, MSDC_READ32(SDC_VOL_CHG));
  230. msdc_printf("[SD%d] Reg[%x] SDC_CSTS = 0x%x\n", host->id, OFFSET_SDC_CSTS, MSDC_READ32(SDC_CSTS));
  231. msdc_printf("[SD%d] Reg[%x] SDC_CSTS_EN = 0x%x\n", host->id, OFFSET_SDC_CSTS_EN, MSDC_READ32(SDC_CSTS_EN));
  232. msdc_printf("[SD%d] Reg[%x] SDC_DATCRC_STS = 0x%x\n", host->id, OFFSET_SDC_DCRC_STS, MSDC_READ32(SDC_DCRC_STS));
  233. msdc_printf("[SD%d] Reg[%x] EMMC_CFG0 = 0x%x\n", host->id, OFFSET_EMMC_CFG0, MSDC_READ32(EMMC_CFG0));
  234. msdc_printf("[SD%d] Reg[%x] EMMC_CFG1 = 0x%x\n", host->id, OFFSET_EMMC_CFG1, MSDC_READ32(EMMC_CFG1));
  235. msdc_printf("[SD%d] Reg[%x] EMMC_STS = 0x%x\n", host->id, OFFSET_EMMC_STS, MSDC_READ32(EMMC_STS));
  236. msdc_printf("[SD%d] Reg[%x] EMMC_IOCON = 0x%x\n", host->id, OFFSET_EMMC_IOCON, MSDC_READ32(EMMC_IOCON));
  237. msdc_printf("[SD%d] Reg[%x] SDC_ACMD_RESP = 0x%x\n", host->id, OFFSET_SDC_ACMD_RESP, MSDC_READ32(SDC_ACMD_RESP));
  238. msdc_printf("[SD%d] Reg[%x] SDC_ACMD19_TRG = 0x%x\n", host->id, OFFSET_SDC_ACMD19_TRG, MSDC_READ32(SDC_ACMD19_TRG));
  239. msdc_printf("[SD%d] Reg[%x] SDC_ACMD19_STS = 0x%x\n", host->id, OFFSET_SDC_ACMD19_STS, MSDC_READ32(SDC_ACMD19_STS));
  240. /* Cooment out reading this register since it cause system hang in CTP
  241. msdc_printf("[SD%d] Reg[%x] DMA_SA_HIGH4BIT= 0x%x\n", host->id, OFFSET_MSDC_DMA_SA_HIGH, MSDC_READ32(OFFSET_MSDC_DMA_SA_HIGH));
  242. */
  243. msdc_printf("[SD%d] Reg[%x] DMA_SA = 0x%x\n", host->id, OFFSET_MSDC_DMA_SA, MSDC_READ32(MSDC_DMA_SA));
  244. msdc_printf("[SD%d] Reg[%x] DMA_CA = 0x%x\n", host->id, OFFSET_MSDC_DMA_CA, MSDC_READ32(MSDC_DMA_CA));
  245. msdc_printf("[SD%d] Reg[%x] DMA_CTRL = 0x%x\n", host->id, OFFSET_MSDC_DMA_CTRL, MSDC_READ32(MSDC_DMA_CTRL));
  246. msdc_printf("[SD%d] Reg[%x] DMA_CFG = 0x%x\n", host->id, OFFSET_MSDC_DMA_CFG, MSDC_READ32(MSDC_DMA_CFG));
  247. msdc_printf("[SD%d] Reg[%x] SW_DBG_SEL = 0x%x\n", host->id, OFFSET_MSDC_DBG_SEL, MSDC_READ32(MSDC_DBG_SEL));
  248. msdc_printf("[SD%d] Reg[%x] SW_DBG_OUT = 0x%x\n", host->id, OFFSET_MSDC_DBG_OUT, MSDC_READ32(MSDC_DBG_OUT));
  249. msdc_printf("[SD%d] Reg[%x] PATCH_BIT0 = 0x%x\n", host->id, OFFSET_MSDC_PATCH_BIT0,MSDC_READ32(MSDC_PATCH_BIT0));
  250. msdc_printf("[SD%d] Reg[%x] PATCH_BIT1 = 0x%x\n", host->id, OFFSET_MSDC_PATCH_BIT1,MSDC_READ32(MSDC_PATCH_BIT1));
  251. msdc_printf("[SD%d] Reg[%x] PATCH_BIT2 = 0x%x\n", host->id, OFFSET_MSDC_PATCH_BIT2,MSDC_READ32(MSDC_PATCH_BIT2));
  252. msdc_printf("[SD%d] Reg[%x] PAD_TUNE0 = 0x%x\n", host->id, OFFSET_MSDC_PAD_TUNE0, MSDC_READ32(MSDC_PAD_TUNE0));
  253. msdc_printf("[SD%d] Reg[%x] PAD_TUNE1 = 0x%x\n", host->id, OFFSET_MSDC_PAD_TUNE1, MSDC_READ32(MSDC_PAD_TUNE1));
  254. msdc_printf("[SD%d] Reg[%x] DAT_RD_DLY0 = 0x%x\n", host->id, OFFSET_MSDC_DAT_RDDLY0,MSDC_READ32(MSDC_DAT_RDDLY0));
  255. msdc_printf("[SD%d] Reg[%x] DAT_RD_DLY1 = 0x%x\n", host->id, OFFSET_MSDC_DAT_RDDLY1,MSDC_READ32(MSDC_DAT_RDDLY1));
  256. msdc_printf("[SD%d] Reg[%x] HW_DBG_SEL = 0x%x\n", host->id, OFFSET_MSDC_HW_DBG, MSDC_READ32(MSDC_HW_DBG));
  257. msdc_printf("[SD%d] Reg[%x] MAIN_VER = 0x%x\n", host->id, OFFSET_MSDC_VERSION, MSDC_READ32(MSDC_VERSION));
  258. if (host->id == 0) {
  259. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_CTL0 = 0x%x\n", host->id, OFFSET_EMMC50_PAD_CTL0, MSDC_READ32(EMMC50_PAD_CTL0));
  260. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_DS_CTL0 = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DS_CTL0, MSDC_READ32(EMMC50_PAD_DS_CTL0));
  261. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_DS_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DS_TUNE, MSDC_READ32(EMMC50_PAD_DS_TUNE));
  262. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_CMD_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_CMD_TUNE, MSDC_READ32(EMMC50_PAD_CMD_TUNE));
  263. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_DAT01_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT01_TUNE, MSDC_READ32(EMMC50_PAD_DAT01_TUNE));
  264. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_DAT23_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT23_TUNE, MSDC_READ32(EMMC50_PAD_DAT23_TUNE));
  265. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_DAT45_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT45_TUNE, MSDC_READ32(EMMC50_PAD_DAT45_TUNE));
  266. msdc_printf("[SD%d] Reg[%x] EMMC50_PAD_DAT67_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT67_TUNE, MSDC_READ32(EMMC50_PAD_DAT67_TUNE));
  267. msdc_printf("[SD%d] Reg[%x] EMMC51_CFG0 = 0x%x\n", host->id, OFFSET_EMMC51_CFG0, MSDC_READ32(EMMC51_CFG0));
  268. msdc_printf("[SD%d] Reg[%x] EMMC50_CFG0 = 0x%x\n", host->id, OFFSET_EMMC50_CFG0, MSDC_READ32(EMMC50_CFG0));
  269. msdc_printf("[SD%d] Reg[%x] EMMC50_CFG1 = 0x%x\n", host->id, OFFSET_EMMC50_CFG1, MSDC_READ32(EMMC50_CFG1));
  270. msdc_printf("[SD%d] Reg[%x] EMMC50_CFG2 = 0x%x\n", host->id, OFFSET_EMMC50_CFG2, MSDC_READ32(EMMC50_CFG2));
  271. msdc_printf("[SD%d] Reg[%x] EMMC50_CFG3 = 0x%x\n", host->id, OFFSET_EMMC50_CFG3, MSDC_READ32(EMMC50_CFG3));
  272. msdc_printf("[SD%d] Reg[%x] EMMC50_CFG4 = 0x%x\n", host->id, OFFSET_EMMC50_CFG4, MSDC_READ32(EMMC50_CFG4));
  273. }
  274. msdc_dump_dbg_register(host);
  275. }
  276. #if defined(MMC_MSDC_DRV_CTP)
  277. #define HS400_BACKUP_REG_NUM (42)
  278. static struct msdc_reg_control hs400_backup_reg_list[HS400_BACKUP_REG_NUM] = {
  279. //{addr, mask, value, default value, func},
  280. {(MSDC0_BASE + OFFSET_MSDC_PATCH_BIT1), (MSDC_PB1_WRDAT_CRCS_TA_CNTR), 0x0, 0x1, NULL},//0xB4[2:0],
  281. {(MSDC0_BASE + OFFSET_MSDC_PATCH_BIT0), (MSDC_PB0_INT_DAT_LATCH_CK_SEL), 0x0, 0x0, NULL},//0xB0[9:7]
  282. {(MSDC0_BASE + OFFSET_MSDC_IOCON), (MSDC_IOCON_R_D_SMPL), 0x0, 0x0, NULL},//0x04[2:2]
  283. {(MSDC0_BASE + OFFSET_MSDC_PAD_TUNE0), (MSDC_PAD_TUNE0_DATRRDLY), 0x0, 0x0, NULL},//0xEC[12:8]
  284. {(MSDC0_BASE + OFFSET_MSDC_IOCON), (MSDC_IOCON_DDLSEL), 0x0, 0x0, NULL},//0x04[3:3]
  285. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY0), (MSDC_DAT_RDDLY0_D3), 0x0, 0x0, NULL},//0xF0[4:0]
  286. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY0), (MSDC_DAT_RDDLY0_D2), 0x0, 0x0, NULL},//0xF0[12:8]
  287. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY0), (MSDC_DAT_RDDLY0_D1), 0x0, 0x0, NULL},//0xF0[20:16]
  288. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY0), (MSDC_DAT_RDDLY0_D0), 0x0, 0x0, NULL},//0xF0[28:24]
  289. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY1), (MSDC_DAT_RDDLY1_D7), 0x0, 0x0, NULL},//0xF4[4:0]
  290. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY1), (MSDC_DAT_RDDLY1_D6), 0x0, 0x0, NULL},//0xF4[12:8]
  291. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY1), (MSDC_DAT_RDDLY1_D5), 0x0, 0x0, NULL},//0xF4[20:16]
  292. {(MSDC0_BASE + OFFSET_MSDC_DAT_RDDLY1), (MSDC_DAT_RDDLY1_D4), 0x0, 0x0, NULL},//0xF4[28:24]
  293. {(MSDC0_BASE + OFFSET_MSDC_IOCON), (MSDC_IOCON_R_D_SMPL_SEL), 0x0, 0x0, NULL},//0x04[5:5]
  294. {(MSDC0_BASE + OFFSET_MSDC_IOCON), (MSDC_IOCON_R_D0SPL), 0x0, 0x0, NULL},//0x04[16:16]
  295. {(MSDC0_BASE + OFFSET_MSDC_IOCON), (MSDC_IOCON_W_D_SMPL), 0x0, 0x0, NULL},//0x04[8:8]
  296. {(MSDC0_BASE + OFFSET_MSDC_PAD_TUNE0), (MSDC_PAD_TUNE0_DATWRDLY), 0x0, 0x0, NULL},//0xEC[4:0]
  297. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT01_TUNE), (MSDC_EMMC50_PAD_DAT0_RXDLY3SEL), 0x0, 0x0, NULL},//0x190[0:0]
  298. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT01_TUNE), (MSDC_EMMC50_PAD_DAT1_RXDLY3SEL), 0x0, 0x0, NULL},//0x190[16:16]
  299. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT23_TUNE), (MSDC_EMMC50_PAD_DAT2_RXDLY3SEL), 0x0, 0x0, NULL},//0x194[0:0]
  300. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT23_TUNE), (MSDC_EMMC50_PAD_DAT3_RXDLY3SEL), 0x0, 0x0, NULL},//0x194[16:16]
  301. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT45_TUNE), (MSDC_EMMC50_PAD_DAT4_RXDLY3SEL), 0x0, 0x0, NULL},//0x198[0:0]
  302. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT45_TUNE), (MSDC_EMMC50_PAD_DAT5_RXDLY3SEL), 0x0, 0x0, NULL},//0x198[16:16]
  303. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT67_TUNE), (MSDC_EMMC50_PAD_DAT6_RXDLY3SEL), 0x0, 0x0, NULL},//0x19C[0:0]
  304. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT67_TUNE), (MSDC_EMMC50_PAD_DAT7_RXDLY3SEL), 0x0, 0x0, NULL},//0x19C[16:16]
  305. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT01_TUNE), (MSDC_EMMC50_PAD_DAT0_RXDLY3), 0x0, 0x0, NULL},//0x190[5:1]
  306. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT01_TUNE), (MSDC_EMMC50_PAD_DAT1_RXDLY3), 0x0, 0x0, NULL},//0x190[21:17]
  307. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT23_TUNE), (MSDC_EMMC50_PAD_DAT2_RXDLY3), 0x0, 0x0, NULL},//0x194[5:1]
  308. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT23_TUNE), (MSDC_EMMC50_PAD_DAT3_RXDLY3), 0x0, 0x0, NULL},//0x194[21:17]
  309. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT45_TUNE), (MSDC_EMMC50_PAD_DAT4_RXDLY3), 0x0, 0x0, NULL},//0x198[5:1]
  310. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT45_TUNE), (MSDC_EMMC50_PAD_DAT5_RXDLY3), 0x0, 0x0, NULL},//0x198[21:17]
  311. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT67_TUNE), (MSDC_EMMC50_PAD_DAT6_RXDLY3), 0x0, 0x0, NULL},//0x19C[5:1]
  312. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT67_TUNE), (MSDC_EMMC50_PAD_DAT7_RXDLY3), 0x0, 0x0, NULL},//0x19C[21:17]
  313. /* _HQA asked cmd line delay 8 and dat line delay 4 under hs400 mode */
  314. {(MSDC0_BASE + OFFSET_EMMC50_PAD_CMD_TUNE), (MSDC_EMMC50_PAD_CMD_TUNE_TXDLY), 0x0, 0x8, NULL},//0x190[5:1]
  315. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT01_TUNE), (MSDC_EMMC50_PAD_DAT0_TXDLY), 0x0, 0x4, NULL},//0x190[5:1]
  316. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT01_TUNE), (MSDC_EMMC50_PAD_DAT1_TXDLY), 0x0, 0x4, NULL},//0x190[21:17]
  317. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT23_TUNE), (MSDC_EMMC50_PAD_DAT2_TXDLY), 0x0, 0x4, NULL},//0x194[5:1]
  318. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT23_TUNE), (MSDC_EMMC50_PAD_DAT3_TXDLY), 0x0, 0x4, NULL},//0x194[21:17]
  319. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT45_TUNE), (MSDC_EMMC50_PAD_DAT4_TXDLY), 0x0, 0x4, NULL},//0x198[5:1]
  320. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT45_TUNE), (MSDC_EMMC50_PAD_DAT5_TXDLY), 0x0, 0x4, NULL},//0x198[21:17]
  321. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT67_TUNE), (MSDC_EMMC50_PAD_DAT6_TXDLY), 0x0, 0x4, NULL},//0x19C[5:1]
  322. {(MSDC0_BASE + OFFSET_EMMC50_PAD_DAT67_TUNE), (MSDC_EMMC50_PAD_DAT7_TXDLY), 0x0, 0x4, NULL},//0x19C[21:17]
  323. };
  324. /* need reset some register while switch to hs400 mode with emmc50
  325. * do stress test need change mode from hs400 to others, so need backup if switched */
  326. int msdc_register_partial_backup_and_reset(struct mmc_host* host)
  327. {
  328. int i = 0, err = 0;
  329. for (i = 0; i < HS400_BACKUP_REG_NUM; i++) {
  330. MSDC_GET_FIELD(hs400_backup_reg_list[i].addr, hs400_backup_reg_list[i].mask, hs400_backup_reg_list[i].value);
  331. MSDC_SET_FIELD(hs400_backup_reg_list[i].addr, hs400_backup_reg_list[i].mask, hs400_backup_reg_list[i].default_value);
  332. if (hs400_backup_reg_list[i].restore_func) {
  333. err = hs400_backup_reg_list[i].restore_func(0);
  334. if (err) {
  335. msdc_printf("[%s]: failed to restore reg[0x%x][0x%x], expected value[0x%x], actual value[0x%x] err=0x%x",
  336. __func__, hs400_backup_reg_list[i].addr, hs400_backup_reg_list[i].mask, hs400_backup_reg_list[i].default_value, MSDC_READ32(hs400_backup_reg_list[i].addr), err);
  337. }
  338. }
  339. }
  340. return 0;
  341. }
  342. int msdc_register_partial_restore(struct mmc_host* host)
  343. {
  344. int i = 0, err = 0;
  345. for (i = 0; i < HS400_BACKUP_REG_NUM; i++) {
  346. MSDC_SET_FIELD(hs400_backup_reg_list[i].addr, hs400_backup_reg_list[i].mask, hs400_backup_reg_list[i].value);
  347. if (hs400_backup_reg_list[i].restore_func) {
  348. err = hs400_backup_reg_list[i].restore_func(1);
  349. if (err) {
  350. msdc_printf("[%s]:failed to restore reg[0x%x][0x%x], expected value[0x%x], actual value[0x%x] err=0x%x",
  351. __func__, hs400_backup_reg_list[i].addr, hs400_backup_reg_list[i].mask, hs400_backup_reg_list[i].value, MSDC_READ32(hs400_backup_reg_list[i].addr), err);
  352. }
  353. }
  354. }
  355. return 0;
  356. }
  357. #endif
  358. static void msdc_dump_info(struct mmc_host *host)
  359. {
  360. // 1: dump msdc hw register
  361. msdc_dump_register(host);
  362. // 2: For designer
  363. msdc_dump_dbg_register(host);
  364. #if !defined(FPGA_PLATFORM)
  365. // 3: check msdc clock gate and clock source
  366. msdc_dump_clock_sts(host);
  367. // 4: check msdc pmic ldo
  368. msdc_dump_ldo_sts(host);
  369. // 5: check msdc gpio
  370. msdc_dump_padctl_by_id(host->id);
  371. #endif
  372. }
  373. void msdc_clr_fifo(struct mmc_host *host)
  374. {
  375. u32 base = host->base;
  376. MSDC_CLR_FIFO();
  377. }
  378. void msdc_reset(struct mmc_host *host)
  379. {
  380. u32 base = host->base;
  381. MSDC_RESET();
  382. }
  383. void msdc_abort(struct mmc_host *host)
  384. {
  385. u32 base = host->base;
  386. MSG(INF, "[SD%d] Abort: MSDC_FIFOCS=%xh MSDC_PS=%xh SDC_STS=%xh\n",
  387. host->id, MSDC_READ32(MSDC_FIFOCS), MSDC_READ32(MSDC_PS), MSDC_READ32(SDC_STS));
  388. /* reset controller */
  389. msdc_reset(host);
  390. /* clear fifo */
  391. msdc_clr_fifo(host);
  392. /* make sure txfifo and rxfifo are empty */
  393. if (MSDC_TXFIFOCNT() != 0 || MSDC_RXFIFOCNT() != 0) {
  394. MSG(INF, "[SD%d] Abort: TXFIFO(%d), RXFIFO(%d) != 0\n",
  395. host->id, MSDC_TXFIFOCNT(), MSDC_RXFIFOCNT());
  396. }
  397. /* clear all interrupts */
  398. MSDC_WRITE32(MSDC_INT, MSDC_READ32(MSDC_INT));
  399. }
  400. void msdc_set_signal_burst(struct mmc_host *host, int on)
  401. {
  402. u32 base = host->base;
  403. if (on)
  404. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_SINGLE_BURST, 1);
  405. else
  406. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_SINGLE_BURST, 0);
  407. }
  408. void msdc_enable_dcm(struct mmc_host *host, int on, u8 div1, u8 div2)
  409. {
  410. u32 base = host->base;
  411. u32 mode;
  412. if (on) {
  413. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, mode);
  414. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_EN, MSDC_DCM_EN);
  415. if (host->id == 0) {
  416. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_DEV_SEL1, div1);
  417. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_DEV_SEL2, div2);
  418. } else {
  419. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_DEV_SEL1, div1);
  420. }
  421. } else {
  422. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_EN, MSDC_DCM_DIS);
  423. }
  424. }
  425. void msdc_set_axi_burst_len(struct mmc_host *host, u8 len)
  426. {
  427. u32 base = host->base;
  428. /* set axi burst len */
  429. MSDC_SET_FIELD(EMMC50_CFG2, MSDC_EMMC50_CFG2_AXI_SET_LEN, len);
  430. }
  431. void msdc_set_axi_outstanding(struct mmc_host *host, u8 rw, u8 num)
  432. {
  433. u32 base = host->base;
  434. /* set axi outstanding num */
  435. if (rw == 0) /* read */
  436. MSDC_SET_FIELD(EMMC50_CFG2, MSDC_EMMC50_CFG2_AXI_RD_OUTS_NUM, num);
  437. else /* write */
  438. MSDC_SET_FIELD(EMMC50_CFG3, MSDC_EMMC50_CFG3_OUTS_WR, num);
  439. }
  440. void msdc_set_startbit(struct mmc_host *host, u8 start_bit)
  441. {
  442. u32 base = host->base;
  443. u32 l_start_bit;
  444. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  445. if (host->id != 0) {
  446. return;
  447. }
  448. /* set start bit */
  449. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_START_BIT, start_bit);
  450. priv->start_bit = start_bit;
  451. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_START_BIT, l_start_bit);
  452. #if 1
  453. switch (l_start_bit) {
  454. case 0:
  455. msdc_printf("[info][%s %d] read data start bit at rising edge\n", __func__, __LINE__);
  456. break;
  457. case 1:
  458. msdc_printf("[info][%s %d] read data start bit at falling edge\n", __func__, __LINE__);
  459. break;
  460. case 2:
  461. msdc_printf("[info][%s %d] read data start bit at rising & falling edge\n", __func__, __LINE__);
  462. break;
  463. case 3:
  464. msdc_printf("[info][%s %d] read data start bit at rising | falling edge\n", __func__, __LINE__);
  465. break;
  466. default:
  467. break;
  468. }
  469. #endif
  470. }
  471. void msdc_set_smpl(struct mmc_host *host, u8 HS400, u8 mode, u8 type)
  472. {
  473. u32 base = host->base;
  474. int i=0;
  475. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  476. static u8 read_data_edge[8] = {MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING,
  477. MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING
  478. };
  479. static u8 write_data_edge[4] = {MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING};
  480. switch (type) {
  481. case TYPE_CMD_RESP_EDGE:
  482. if (HS400) {
  483. // eMMC5.0 only output resp at CLK pin, so no need to select DS pin
  484. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_PADCMD_LATCHCK, 0); //latch cmd resp at CLK pin
  485. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CMD_RESP_SEL, 0);//latch cmd resp
  486. // 0: from delay path for eMMC4.5
  487. // 1: from FIFO path for eMMC5.0
  488. }
  489. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  490. #if 0 // HS400 tune MSDC_EMMC50_CFG_CMD_EDGE_SEL use DS latch, but now no DS latch
  491. if (HS400) {
  492. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CMD_EDGE_SEL, mode);
  493. } else {
  494. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, mode);
  495. }
  496. #else
  497. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, mode);
  498. #endif
  499. priv->rsmpl = mode;
  500. } else {
  501. msdc_printf("[%s]: SD%d invalid resp parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  502. }
  503. break;
  504. case TYPE_WRITE_CRC_EDGE:
  505. if (HS400) {
  506. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_SEL, 1);//latch write crc status at DS pin
  507. } else {
  508. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_SEL, 0);//latch write crc status at CLK pin
  509. }
  510. if (priv->tuning_mode == MSDC_PATH_USE_ASYNC_FIFO) {
  511. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  512. if (HS400) {
  513. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_EDGE, mode);
  514. } else {
  515. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTSEDGE, mode);
  516. }
  517. } else {
  518. msdc_printf("[%s]: SD%d invalid read parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  519. }
  520. } else {
  521. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  522. if (HS400) {
  523. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_EDGE, mode);
  524. } else {
  525. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL, 0);
  526. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, mode);
  527. }
  528. priv->wdsmpl = mode;
  529. } else if (mode == MSDC_SMPL_SEPERATE && !HS400) {
  530. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D0SPL, write_data_edge[0]); //only dat0 is for write crc status.
  531. priv->wdsmpl = mode;
  532. } else {
  533. msdc_printf("[%s]: SD%d invalid crc parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  534. }
  535. }
  536. break;
  537. case TYPE_READ_DATA_EDGE:
  538. if (HS400) {
  539. msdc_set_startbit(host, START_AT_RISING_AND_FALLING); //for HS400, start bit is output both on rising and falling edge
  540. priv->start_bit = START_AT_RISING_AND_FALLING;
  541. } else {
  542. msdc_set_startbit(host, START_AT_RISING); //for the other mode, start bit is only output on rising edge. but DDR50 can try falling edge if error casued by pad delay
  543. priv->start_bit = START_AT_RISING;
  544. }
  545. if (priv->tuning_mode == MSDC_PATH_USE_ASYNC_FIFO) {
  546. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  547. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL_SEL, 0);
  548. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, mode);
  549. } else {
  550. msdc_printf("[%s]: SD%d invalid read parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  551. }
  552. } else {
  553. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  554. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL_SEL, 0);
  555. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, mode);
  556. priv->rdsmpl = mode;
  557. } else if (mode == MSDC_SMPL_SEPERATE) {
  558. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL_SEL, 1);
  559. for (i=0; i<8; i++) {
  560. MSDC_SET_FIELD(MSDC_IOCON, (MSDC_IOCON_R_D0SPL << i), read_data_edge[i]);
  561. }
  562. priv->rdsmpl = mode;
  563. } else {
  564. msdc_printf("[%s]: SD%d invalid read parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  565. }
  566. }
  567. break;
  568. case TYPE_WRITE_DATA_EDGE:
  569. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_SEL, 0);//latch write crc status at CLK pin
  570. if (mode == MSDC_SMPL_RISING|| mode == MSDC_SMPL_FALLING) {
  571. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL, 0);
  572. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, mode);
  573. priv->wdsmpl = mode;
  574. } else if (mode == MSDC_SMPL_SEPERATE) {
  575. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL, 1);
  576. for (i=0; i<4; i++) {
  577. MSDC_SET_FIELD(MSDC_IOCON, (MSDC_IOCON_W_D0SPL << i), write_data_edge[i]);//dat0~4 is for SDIO card.
  578. }
  579. priv->wdsmpl = mode;
  580. } else {
  581. msdc_printf("[%s]: SD%d invalid write parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  582. }
  583. break;
  584. default:
  585. msdc_printf("[%s]: SD%d invalid parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  586. break;
  587. }
  588. }
  589. static u32 msdc_cal_timeout(struct mmc_host *host, u64 ns, u32 clks, u32 clkunit)
  590. {
  591. u32 timeout, clk_ns;
  592. clk_ns = 1000000000UL / host->cur_bus_clk;
  593. timeout = ns / clk_ns + clks;
  594. timeout = timeout / clkunit;
  595. return timeout;
  596. }
  597. void msdc_set_timeout(struct mmc_host *host, u64 ns, u32 clks)
  598. {
  599. u32 base = host->base;
  600. u32 timeout, clk_ns;
  601. u32 mode = 0;
  602. if (host->cur_bus_clk == 0) {
  603. timeout = 0;
  604. } else {
  605. clk_ns = 1000000000UL / host->cur_bus_clk;
  606. timeout = (ns + clk_ns - 1) / clk_ns + clks;
  607. timeout = (timeout + (1 << TMO_IN_CLK_2POWER) - 1) >> TMO_IN_CLK_2POWER; /* in 1048576 sclk cycle unit */
  608. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, mode);
  609. timeout = mode >= 2 ? timeout * 2 : timeout; //DDR mode will double the clk cycles for data timeout
  610. timeout = timeout > 1 ? timeout - 1 : 0;
  611. timeout = timeout > 255 ? 255 : timeout;
  612. }
  613. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_DTOC, timeout);
  614. MSG(OPS, "[SD%d] Set read data timeout: %dus %dclks -> %d x 1048576 cycles, mode:%d, clk_freq=%dKHz\n",
  615. host->id, (u32)(ns/1000), clks, timeout + 1, mode, (host->cur_bus_clk / 1000));
  616. }
  617. void msdc_set_blklen(struct mmc_host *host, u32 blklen)
  618. {
  619. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  620. host->blklen = blklen;
  621. priv->cfg.blklen = blklen;
  622. msdc_clr_fifo(host);
  623. }
  624. void msdc_set_blknum(struct mmc_host *host, u32 blknum)
  625. {
  626. u32 base = host->base;
  627. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  628. MSDC_WRITE32(SDC_BLK_NUM, blknum);
  629. }
  630. void msdc_set_dmode(struct mmc_host *host, int mode)
  631. {
  632. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  633. #if defined(MSDC_ENABLE_DMA_MODE)
  634. priv->cfg.mode = mode;
  635. #endif
  636. if (mode == MSDC_MODE_PIO) {
  637. host->blk_read = msdc_pio_bread;
  638. host->blk_write = msdc_pio_bwrite;
  639. #if defined(MSDC_ENABLE_DMA_MODE)
  640. } else {
  641. host->blk_read = msdc_dma_bread;
  642. host->blk_write = msdc_dma_bwrite;
  643. #endif
  644. }
  645. }
  646. int msdc_get_dmode(struct mmc_host *host)
  647. {
  648. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  649. int mode = priv->cfg.mode;
  650. return mode;
  651. }
  652. void msdc_set_pio_bits(struct mmc_host *host, int bits)
  653. {
  654. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  655. priv->pio_bits = bits;
  656. }
  657. void msdc_set_autocmd(struct mmc_host *host, int cmd, int on)
  658. {
  659. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  660. if (on) {
  661. priv->autocmd |= cmd;
  662. } else {
  663. priv->autocmd &= ~cmd;
  664. }
  665. }
  666. void msdc_set_reliable_write(struct mmc_host *host, int on)
  667. {
  668. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  669. if (on) {
  670. priv->cmd23_flags |= MSDC_RELIABLE_WRITE;
  671. } else {
  672. priv->cmd23_flags &= ~MSDC_RELIABLE_WRITE;
  673. }
  674. }
  675. void msdc_set_autocmd23_feature(struct mmc_host *host, int on)
  676. {
  677. u32 base = host->base;
  678. if (on) {
  679. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 0);
  680. } else {
  681. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 1);
  682. }
  683. }
  684. int msdc_send_cmd(struct mmc_host *host, struct mmc_command *cmd)
  685. {
  686. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  687. u32 base = host->base;
  688. u32 opcode = cmd->opcode;
  689. u32 rsptyp;
  690. u32 rawcmd;
  691. u32 timeout = cmd->timeout;
  692. u32 error = MMC_ERR_NONE;
  693. u32 blknum;
  694. #ifdef FEATURE_MMC_CMDQ
  695. u32 cmdq_reg_setting = 0;
  696. if (opcode == MMC_SET_QUEUE_CONTEXT) {
  697. cmd->rsptyp = RESP_R1;
  698. cmdq_reg_setting=(MMC_SET_QUEUE_CONTEXT<<1)|1;
  699. } else if (opcode == MMC_SET_QUEUE_ADDRESS) {
  700. cmd->rsptyp = RESP_R1;
  701. cmdq_reg_setting=(MMC_SET_QUEUE_ADDRESS<<1)|1;
  702. } else if (opcode == MMC_WRITE_REQUESTED_QUEUE || opcode == MMC_READ_REQUESTED_QUEUE) {
  703. cmd->rsptyp = RESP_R1;
  704. } else if ( opcode==MMC_CMD_SEND_STATUS ) {
  705. cmd->rsptyp = RESP_R1;
  706. if ( MSDC_READ32(EMMC51_CFG0)&0x1 ) {
  707. cmdq_reg_setting=(MMC_CMD_SEND_STATUS<<1)|1;
  708. }
  709. }
  710. //Chiachun: for SS vendor command
  711. else if (opcode == 62) { //Light: To be clarified
  712. cmd->rsptyp = RESP_R1;
  713. }
  714. #if !defined(FEATURE_MMC_USE_EMMC51_CFG0_FOR_CMD44_45)
  715. cmdq_reg_setting=0;
  716. #endif
  717. #endif
  718. rsptyp=cmd->rsptyp;
  719. /* rawcmd :
  720. * vol_swt << 30 | auto_cmd << 28 | blklen << 16 | go_irq << 15 |
  721. * stop << 14 | rw << 13 | dtype << 11 | rsptyp << 7 | brk << 6 | opcode
  722. */
  723. rawcmd = (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)) |
  724. msdc_rsp[rsptyp] << 7 | host->blklen << 16;
  725. if (opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK) {
  726. rawcmd |= ((2 << 11) | (1 << 13));
  727. if (priv->autocmd & MSDC_AUTOCMD12) {
  728. rawcmd |= (1 << 28);
  729. } else if (priv->autocmd & MSDC_AUTOCMD23) {
  730. rawcmd |= (2 << 28);
  731. }
  732. } else if (opcode == MMC_CMD_WRITE_BLOCK || opcode == MMC_CMD50) {
  733. rawcmd |= ((1 << 11) | (1 << 13));
  734. } else if (opcode == MMC_CMD_READ_MULTIPLE_BLOCK) {
  735. rawcmd |= (2 << 11);
  736. if (priv->autocmd & MSDC_AUTOCMD12) {
  737. rawcmd |= (1 << 28);
  738. } else if (priv->autocmd & MSDC_AUTOCMD23) {
  739. rawcmd |= (2 << 28);
  740. }
  741. } else if (opcode == MMC_CMD_READ_SINGLE_BLOCK ||
  742. opcode == SD_ACMD_SEND_SCR ||
  743. opcode == SD_CMD_SWITCH ||
  744. opcode == MMC_CMD_SEND_EXT_CSD ||
  745. opcode == MMC_CMD_SEND_WRITE_PROT ||
  746. opcode == MMC_CMD_SEND_WRITE_PROT_TYPE ||
  747. opcode == MMC_CMD21) {
  748. rawcmd |= (1 << 11);
  749. } else if (opcode == MMC_CMD_STOP_TRANSMISSION) {
  750. rawcmd |= (1 << 14);
  751. rawcmd &= ~(0x0FFF << 16);
  752. } else if (opcode == SD_IO_RW_EXTENDED) {
  753. if (cmd->arg & 0x80000000) /* R/W flag */
  754. rawcmd |= (1 << 13);
  755. if ((cmd->arg & 0x08000000) && ((cmd->arg & 0x1FF) > 1))
  756. rawcmd |= (2 << 11); /* multiple block mode */
  757. else
  758. rawcmd |= (1 << 11);
  759. } else if (opcode == SD_IO_RW_DIRECT) {
  760. if ((cmd->arg & 0x80000000) && ((cmd->arg >> 9) & 0x1FFFF))/* I/O abt */
  761. rawcmd |= (1 << 14);
  762. } else if (opcode == SD_CMD_VOL_SWITCH) {
  763. rawcmd |= (1 << 30);
  764. } else if (opcode == SD_CMD_SEND_TUNING_BLOCK) {
  765. rawcmd |= (1 << 11); /* CHECKME */
  766. if (priv->autocmd & MSDC_AUTOCMD19)
  767. rawcmd |= (3 << 28);
  768. } else if (opcode == MMC_CMD_GO_IRQ_STATE) {
  769. rawcmd |= (1 << 15);
  770. } else if (opcode == MMC_CMD_WRITE_DAT_UNTIL_STOP) {
  771. rawcmd |= ((1<< 13) | (3 << 11));
  772. } else if (opcode == MMC_CMD_READ_DAT_UNTIL_STOP) {
  773. rawcmd |= (3 << 11);
  774. }
  775. #ifdef FEATURE_MMC_CMDQ
  776. else if (opcode == MMC_READ_REQUESTED_QUEUE) {
  777. rawcmd |= (2 << 11);
  778. } else if (opcode == MMC_WRITE_REQUESTED_QUEUE) {
  779. rawcmd |= ((2 << 11) | (1 << 13));
  780. //} else if ( (opcode==MMC_CMD_SEND_STATUS) && (cmd->arg&SEND_QUEUE_STATUS_SQS_BIT_SHIFT) ) {
  781. }
  782. #endif
  783. /* autocmd23 with packed cmd, this feature is conflict with data tag, reliable write, and force flush cache */
  784. if (host->card && mmc_card_mmc(host->card)) {
  785. blknum = MSDC_READ32(SDC_BLK_NUM);
  786. if (priv->autocmd & MSDC_AUTOCMD23) {
  787. #if MSDC_USE_DATA_TAG
  788. blknum |= (1 << 29);
  789. blknum &= ~(1 << 30);
  790. #endif
  791. #if MSDC_USE_RELIABLE_WRITE
  792. if (opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK) {
  793. blknum |= (1 << 31);
  794. blknum &= ~(1 << 30);
  795. } else {
  796. blknum &= ~(1 << 31);
  797. }
  798. #endif
  799. #if MSDC_USE_FORCE_FLUSH
  800. blknum |= (1 << 24);
  801. blknum &= ~(1 << 30);
  802. #endif
  803. #if MSDC_USE_PACKED_CMD
  804. blknum &= ~0xffff;
  805. blknum |= (1 << 30);
  806. #endif
  807. }
  808. if (priv->cmd23_flags & MSDC_RELIABLE_WRITE) {
  809. blknum |= (1 << 31);
  810. blknum &= ~(1 << 30);
  811. }
  812. MSDC_WRITE32(SDC_BLK_NUM, blknum);
  813. }
  814. MSG(CMD, "[SD%d] CMD(%d): ARG(0x%x), RAW(0x%x), BLK_NUM(0x%x) RSP(%d)\n",
  815. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)), cmd->arg, rawcmd, MSDC_READ32(SDC_BLK_NUM), rsptyp);
  816. #ifdef FEATURE_MMC_CMDQ
  817. if ( cmdq_reg_setting ) {
  818. //cmdq_reg_setting|=(0x6a<<22)|(0x6a<<12)|(msdc_rsp[rsptyp]<<7);
  819. cmdq_reg_setting|=(msdc_rsp[rsptyp]<<7);
  820. msdc_printf("busy status: %x\n", MSDC_READ32(SDC_STS));
  821. if (SDC_IS_CMD_BUSY()) {
  822. WAIT_COND(!SDC_IS_CMD_BUSY(), cmd->timeout, timeout);
  823. if (timeout == 0) {
  824. error = MMC_ERR_TIMEOUT;
  825. msdc_printf("[SD%d] CMD(%d): SDC_IS_CMD_BUSY timeout\n",
  826. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)));
  827. goto end;
  828. }
  829. }
  830. MSDC_SET_FIELD(EMMC51_CFG0, 0xfff, (cmdq_reg_setting));
  831. SDC_SEND_CMD(0, cmd->arg);
  832. goto end;
  833. }
  834. #endif
  835. if (opcode == MMC_CMD_SEND_STATUS) {
  836. if (SDC_IS_CMD_BUSY()) {
  837. WAIT_COND(!SDC_IS_CMD_BUSY(), cmd->timeout, timeout);
  838. if (timeout == 0) {
  839. error = MMC_ERR_TIMEOUT;
  840. msdc_printf("[SD%d] CMD(%d): SDC_IS_CMD_BUSY timeout\n",
  841. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)));
  842. goto end;
  843. }
  844. }
  845. } else {
  846. if (SDC_IS_BUSY()) {
  847. WAIT_COND(!SDC_IS_BUSY(), 1000, timeout);
  848. if (timeout == 0) {
  849. error = MMC_ERR_TIMEOUT;
  850. msdc_printf("[SD%d] CMD(%d): SDC_IS_BUSY timeout\n",
  851. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)));
  852. goto end;
  853. }
  854. }
  855. }
  856. #ifdef FEATURE_MMC_CMDQ
  857. MSDC_SET_FIELD(EMMC51_CFG0, 0xfff, 0);
  858. #endif
  859. SDC_SEND_CMD(rawcmd, cmd->arg);
  860. end:
  861. cmd->error = error;
  862. return error;
  863. }
  864. int msdc_wait_rsp(struct mmc_host *host, struct mmc_command *cmd)
  865. {
  866. u32 base = host->base;
  867. u32 rsptyp = cmd->rsptyp;
  868. u32 status;
  869. u32 opcode = (cmd->opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT));
  870. u32 error = MMC_ERR_NONE;
  871. u32 wints = MSDC_INT_CMDTMO | MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR |
  872. MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO |
  873. MSDC_INT_ACMD19_DONE;
  874. #if defined(FEATURE_MMC_SDIO)
  875. wints |= MSDC_INT_SDIOIRQ;
  876. #endif
  877. if (cmd->opcode == MMC_CMD_GO_IRQ_STATE)
  878. wints |= MSDC_INT_MMCIRQ;
  879. status = msdc_intr_wait(host, wints);
  880. #if defined(FEATURE_MMC_SDIO)
  881. if (status & MSDC_INT_SDIOIRQ) {
  882. if (mmc_card_sdio(host->card)) {
  883. struct sdio_func *func = host->card->io_func[0];
  884. if (func->irq_handler)
  885. func->irq_handler(func);
  886. }
  887. }
  888. #endif
  889. if (status == 0) {
  890. error = MMC_ERR_TIMEOUT;
  891. goto end;
  892. }
  893. if ((status & MSDC_INT_RSPCRCERR) || (status & MSDC_INT_ACMDCRCERR)) {
  894. error = MMC_ERR_BADCRC;
  895. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) ERR(BADCRC)\n",
  896. host->id, opcode, cmd->rsptyp);
  897. } else if ((status & MSDC_INT_CMDTMO) || (status & MSDC_INT_ACMDTMO)) {
  898. error = MMC_ERR_TIMEOUT;
  899. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) ERR(CMDTO) AUTO(%d)\n",
  900. host->id, opcode, cmd->rsptyp, status & MSDC_INT_ACMDTMO ? 1: 0);
  901. } else if ((status & MSDC_INT_CMDRDY) || (status & MSDC_INT_ACMDRDY) ||
  902. (status & MSDC_INT_ACMD19_DONE)) {
  903. switch (rsptyp) {
  904. case RESP_NONE:
  905. MSG(RSP, "[SD%d] CMD(%d): RSP(%d)\n", host->id, opcode, rsptyp);
  906. break;
  907. case RESP_R2: {
  908. u32 *resp = &cmd->resp[0];
  909. *resp++ = MSDC_READ32(SDC_RESP3);
  910. *resp++ = MSDC_READ32(SDC_RESP2);
  911. *resp++ = MSDC_READ32(SDC_RESP1);
  912. *resp++ = MSDC_READ32(SDC_RESP0);
  913. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) = 0x%x 0x%x 0x%x 0x%x\n",
  914. host->id, opcode, cmd->rsptyp, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
  915. break;
  916. }
  917. default: /* Response types 1, 3, 4, 5, 6, 7(1b) */
  918. if ((status & MSDC_INT_ACMDRDY) || (status & MSDC_INT_ACMD19_DONE))
  919. cmd->resp[0] = MSDC_READ32(SDC_ACMD_RESP);
  920. else
  921. cmd->resp[0] = MSDC_READ32(SDC_RESP0);
  922. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) = 0x%x AUTO(%d)\n", host->id, opcode,
  923. cmd->rsptyp, cmd->resp[0],
  924. ((status & MSDC_INT_ACMDRDY) || (status & MSDC_INT_ACMD19_DONE)) ? 1 : 0);
  925. break;
  926. }
  927. } else {
  928. error = MMC_ERR_INVALID;
  929. msdc_printf("[SD%d] CMD(%d): RSP(%d) ERR(INVALID), Status:%x\n",
  930. host->id, opcode, cmd->rsptyp, status);
  931. }
  932. end:
  933. if (rsptyp == RESP_R1B) {
  934. while ((MSDC_READ32(MSDC_PS) & 0x10000) != 0x10000);
  935. }
  936. #if MSDC_DEBUG
  937. if ((error == MMC_ERR_NONE) && (MSG_EVT_MASK & MSG_EVT_RSP)) {
  938. switch (cmd->rsptyp) {
  939. case RESP_R1:
  940. case RESP_R1B:
  941. msdc_dump_card_status(cmd->resp[0]);
  942. break;
  943. case RESP_R3:
  944. msdc_dump_ocr_reg(cmd->resp[0]);
  945. break;
  946. case RESP_R5:
  947. msdc_dump_io_resp(cmd->resp[0]);
  948. break;
  949. case RESP_R6:
  950. msdc_dump_rca_resp(cmd->resp[0]);
  951. break;
  952. }
  953. }
  954. #endif
  955. cmd->error = error;
  956. if (cmd->opcode == MMC_CMD_APP_CMD && error == MMC_ERR_NONE) {
  957. host->app_cmd = 1;
  958. host->app_cmd_arg = cmd->arg;
  959. } else {
  960. host->app_cmd = 0;
  961. }
  962. #ifdef FEATURE_MMC_CMDQ
  963. if ( (opcode == MMC_SET_QUEUE_CONTEXT) ||
  964. (opcode == MMC_SET_QUEUE_ADDRESS) ||
  965. (opcode == MMC_CMD_SEND_STATUS) ) {
  966. //MSDC_WRITE32(EMMC51_CFG0, 0);
  967. }
  968. #endif
  969. #ifdef FEATURE_MMC_CMDQ
  970. //MSDC_SET_FIELD(EMMC51_CFG0, 0xfff, 0);
  971. #endif
  972. return error;
  973. }
  974. int msdc_cmd(struct mmc_host *host, struct mmc_command *cmd)
  975. {
  976. int err;
  977. err = msdc_send_cmd(host, cmd);
  978. if (err != MMC_ERR_NONE)
  979. return err;
  980. err = msdc_wait_rsp(host, cmd);
  981. if (err == MMC_ERR_BADCRC) {
  982. u32 base = host->base;
  983. u32 tmp = MSDC_READ32(SDC_CMD);
  984. /* check if data is used by the command or not */
  985. if (tmp & SDC_CMD_DTYP) {
  986. msdc_abort_handler(host, 1);
  987. }
  988. #if defined(FEATURE_MMC_CM_TUNING)
  989. //Light: For CMD17/18/24/25, tuning may have been done by
  990. // msdc_abort_handler()->msdc_get_card_status()->msdc_cmd() for CMD13->msdc_tune_cmdrsp().
  991. // This means that 2nd invocation of msdc_tune_cmdrsp() occurs here!
  992. //--> To Do: consider if 2nd invocation can be avoid
  993. if ( host->app_cmd!=2 ) { //Light 20121225, to prevent recursive call path: msdc_tune_cmdrsp->msdc_app_cmd->msdc_cmd->msdc_tune_cmdrsp
  994. err = msdc_tune_cmdrsp(host, cmd);
  995. if (err != MMC_ERR_NONE) {
  996. msdc_printf("[Err handle][%s:%d]tune cmd fail\n", __func__, __LINE__);
  997. }
  998. }
  999. /* After tuning, erase sequence will error */
  1000. if ((cmd->opcode == MMC_CMD_ERASE_GROUP_START) || (cmd->opcode == MMC_CMD_ERASE_GROUP_END) ||
  1001. (cmd->opcode == MMC_CMD_ERASE_WR_BLK_START) || (cmd->opcode == MMC_CMD_ERASE_WR_BLK_END)) {
  1002. err = MMC_ERR_ERASE_SEQ;
  1003. }
  1004. #endif
  1005. }
  1006. return err;
  1007. }
  1008. int msdc_cmd_stop(struct mmc_host *host, struct mmc_command *cmd)
  1009. {
  1010. struct mmc_command stop;
  1011. u32 err;
  1012. if (mmc_card_mmc(host->card) && (cmd) && (cmd->opcode == 18))
  1013. stop.rsptyp = RESP_R1;
  1014. else
  1015. stop.rsptyp = RESP_R1B;
  1016. stop.opcode = MMC_CMD_STOP_TRANSMISSION;
  1017. stop.arg = 0;
  1018. stop.retries = CMD_RETRIES;
  1019. stop.timeout = CMD_TIMEOUT;
  1020. err = msdc_cmd(host, &stop);
  1021. #ifdef MTK_EMMC_POWER_ON_WP
  1022. if ((err == MMC_ERR_NONE) && (stop.resp[0] & R1_WP_VIOLATION)) {
  1023. err = MMC_ERR_WP_VIOLATION;
  1024. }
  1025. #endif
  1026. return err;
  1027. }
  1028. #if defined(FEATURE_MMC_SDIO)
  1029. int msdc_cmd_io_abort(struct mmc_host *host)
  1030. {
  1031. struct mmc_command abort;
  1032. memset(&abort, 0, sizeof(struct mmc_command));
  1033. abort.opcode = SD_IO_RW_DIRECT;
  1034. abort.arg = 0x80000000; /* write */
  1035. abort.arg |= 0 << 28; /* function 0 */
  1036. abort.arg |= SDIO_CCCR_ABORT << 9; /* address */
  1037. abort.arg |= 0; /* abort function 0 */
  1038. abort.rsptyp = RESP_R1B;
  1039. abort.retries = CMD_RETRIES;
  1040. abort.timeout = CMD_TIMEOUT;
  1041. return msdc_cmd(host, &abort);
  1042. }
  1043. #endif
  1044. static int msdc_get_card_status(struct mmc_host *host, u32 *status)
  1045. {
  1046. int err;
  1047. struct mmc_command cmd;
  1048. cmd.opcode = MMC_CMD_SEND_STATUS;
  1049. cmd.arg = host->card->rca << 16;
  1050. cmd.rsptyp = RESP_R1;
  1051. cmd.retries = CMD_RETRIES;
  1052. cmd.timeout = CMD_TIMEOUT;
  1053. err = msdc_cmd(host, &cmd);
  1054. if (err == MMC_ERR_NONE) {
  1055. *status = cmd.resp[0];
  1056. }
  1057. return err;
  1058. }
  1059. #ifdef MTK_EMMC_POWER_ON_WP
  1060. int msdc_get_err_from_card_status(struct mmc_host *host)
  1061. {
  1062. u32 status;
  1063. int err = msdc_get_card_status(host, &status);
  1064. if (err == MMC_ERR_NONE) {
  1065. //*status = cmd.resp[0];
  1066. if (status & R1_WP_VIOLATION)
  1067. err = MMC_ERR_WP_VIOLATION;
  1068. }
  1069. return err;
  1070. }
  1071. #endif
  1072. int msdc_abort_handler(struct mmc_host *host, int abort_card)
  1073. {
  1074. u32 status = 0;
  1075. u32 state = 0;
  1076. u32 err;
  1077. if ( !host->card ) return 0;
  1078. while (state != 4) { // until status to "tran"; //20130125 Comment out by Light
  1079. //while ( abort_card ) { //20130125 Light
  1080. msdc_abort(host);
  1081. err=msdc_get_card_status(host, &status);
  1082. //To do: move the following 2 if clause into msdc_get_card_status() or write as a function
  1083. #if 0 //Light: turn if off before I verify it
  1084. //#if defined(MMC_MSDC_DRV_CTP)
  1085. if (err == MMC_ERR_BADCRC) {
  1086. msdc_printf("[Err handle][%s:%d]cmd13 crc error\n", __func__, __LINE__);
  1087. msdc_tune_update_cmdrsp(host, count++);
  1088. if (count >= 512)
  1089. count = 0;
  1090. }
  1091. if (err == MMC_ERR_TIMEOUT) {
  1092. msdc_printf("[Err handle][%s:%d]cmd13 timeout\n", __func__, __LINE__);
  1093. msdc_tune_update_cmdrsp(host, count++);
  1094. if (count >= 512)
  1095. count = 0;
  1096. }
  1097. #else
  1098. if (err != MMC_ERR_NONE) {
  1099. msdc_printf("[Err handle][%s:%d]cmd13 fail\n", __func__, __LINE__);
  1100. goto out;
  1101. }
  1102. #endif
  1103. state = R1_CURRENT_STATE(status);
  1104. #if MMC_DEBUG
  1105. mmc_dump_card_status(status);
  1106. #endif
  1107. msdc_printf("check card state<%d>\n", state);
  1108. if (state == 5 || state == 6) {
  1109. if (abort_card) {
  1110. msdc_printf("state<%d> need cmd12 to stop\n", state);
  1111. err=msdc_cmd_stop(host, NULL);
  1112. //To do: move the following 2 if clause into msdc_cmd_stop() or write as a function
  1113. #if 0 //Light: turn if off before I verify it
  1114. //#if defined(MMC_MSDC_DRV_CTP)
  1115. if (err == MMC_ERR_BADCRC) {
  1116. msdc_printf("[Err handle][%s:%d]cmd12 crc error\n", __func__, __LINE__);
  1117. msdc_tune_update_cmdrsp(host, count++);
  1118. if (count >= 512)
  1119. count = 0;
  1120. continue;
  1121. }
  1122. if (err == MMC_ERR_TIMEOUT) {
  1123. msdc_printf("[Err handle][%s:%d]cmd12 timeout\n", __func__, __LINE__);
  1124. msdc_tune_update_cmdrsp(host, count++);
  1125. if (count >= 512)
  1126. count = 0;
  1127. continue;
  1128. }
  1129. #else
  1130. if (err != MMC_ERR_NONE) {
  1131. msdc_printf("[Err handle][%s:%d]cmd12 fail\n", __func__, __LINE__);
  1132. goto out;
  1133. }
  1134. #endif
  1135. }
  1136. //break; //20130125 Light
  1137. } else if (state == 7) { // busy in programing
  1138. msdc_printf("state<%d> card is busy\n", state);
  1139. mdelay(100);
  1140. } else if (state != 4) {
  1141. msdc_printf("state<%d> ??? \n", state);
  1142. goto out;
  1143. }
  1144. }
  1145. msdc_abort(host);
  1146. return 0;
  1147. out:
  1148. msdc_printf("[SD%d] data abort failed\n",host->id);
  1149. return 1;
  1150. }
  1151. void msdc_intr_unmask(struct mmc_host *host, u32 bits)
  1152. {
  1153. u32 base = host->base;
  1154. u32 val;
  1155. val = MSDC_READ32(MSDC_INTEN);
  1156. val |= bits;
  1157. MSDC_WRITE32(MSDC_INTEN, val);
  1158. }
  1159. void msdc_intr_mask(struct mmc_host *host, u32 bits)
  1160. {
  1161. u32 base = host->base;
  1162. u32 val;
  1163. val = MSDC_READ32(MSDC_INTEN);
  1164. val &= ~bits;
  1165. MSDC_WRITE32(MSDC_INTEN, val);
  1166. }
  1167. static int msdc_app_cmd(struct mmc_host *host)
  1168. {
  1169. struct mmc_command appcmd;
  1170. int err = MMC_ERR_NONE;
  1171. int retries = 10;
  1172. appcmd.opcode = MMC_CMD_APP_CMD;
  1173. appcmd.arg = host->app_cmd_arg;
  1174. appcmd.rsptyp = RESP_R1;
  1175. appcmd.retries = CMD_RETRIES;
  1176. appcmd.timeout = CMD_TIMEOUT;
  1177. do {
  1178. err = msdc_cmd(host, &appcmd);
  1179. if (err == MMC_ERR_NONE)
  1180. break;
  1181. } while (retries--);
  1182. return err;
  1183. }
  1184. #if defined(MSDC_ENABLE_DMA_MODE)
  1185. int msdc_dma_send_sandisk_fwid(struct mmc_host *host, uchar *buf,u32 opcode, ulong nblks)
  1186. {
  1187. struct mmc_command cmd;
  1188. struct mmc_data data;
  1189. BUG_ON(nblks > host->max_phys_segs);
  1190. //MSG(OPS, "[SD%d] Read data %d blks from 0x%x\n", host->id, nblks, src);
  1191. /* send read command */
  1192. cmd.opcode = opcode;
  1193. cmd.rsptyp = RESP_R1;
  1194. cmd.arg = 0; //src;
  1195. cmd.retries = 0;
  1196. cmd.timeout = CMD_TIMEOUT;
  1197. data.blks = nblks;
  1198. data.buf = (u8*)buf;
  1199. data.timeout = 100; /* 100ms */
  1200. return msdc_dma_transfer(host, &cmd, &data);
  1201. }
  1202. #endif
  1203. void msdc_brk_cmd(struct mmc_host *host)
  1204. {
  1205. u32 base = host->base;
  1206. u32 tmo =0;
  1207. WAIT_COND(SDC_IS_BUSY() == 0, tmo, tmo);
  1208. if (tmo == 0)
  1209. msdc_printf("[%s]: SDC BUSY timeout happend, before send break cmd\n", __func__);
  1210. SDC_SEND_CMD(0x000000e8, 0);
  1211. }
  1212. int msdc_pio_read(struct mmc_host *host, u32 *ptr, u32 size)
  1213. {
  1214. int err = MMC_ERR_NONE;
  1215. #if defined(MMC_MSDC_DRV_CTP)
  1216. u8 *ptr8;
  1217. u16 *ptr16;
  1218. u32 pio_bits = ((msdc_priv_t*)host->priv)->pio_bits;
  1219. #else
  1220. u32 pio_bits = 32;
  1221. #endif
  1222. u32 base = host->base;
  1223. u32 ints = MSDC_INT_DATCRCERR | MSDC_INT_DATTMO | MSDC_INT_XFER_COMPL;
  1224. //u32 timeout = 100000;
  1225. u32 status;
  1226. u32 totalsz = size;
  1227. u8 done = 0;
  1228. u32 size_per_round;
  1229. u32 dcrc;
  1230. u8* u8ptr;
  1231. #if defined(FEATURE_MMC_SDIO)
  1232. ints |= MSDC_INT_SDIOIRQ;
  1233. #endif
  1234. #if defined(MMC_MSDC_DRV_CTP)
  1235. if (pio_bits == 16)
  1236. ptr16 = (u16 *) ptr;
  1237. else if (pio_bits == 8)
  1238. ptr8 = (u8 *) ptr;
  1239. #endif
  1240. while (1) {
  1241. #if defined(MSDC_USE_IRQ)
  1242. //For CTP only
  1243. DisableIRQ();
  1244. status = msdc_irq_sts[host->id];
  1245. msdc_irq_sts[host->id] &= ~ints;
  1246. EnableIRQ();
  1247. #else
  1248. status = MSDC_READ32(MSDC_INT);
  1249. MSDC_WRITE32(MSDC_INT, status);
  1250. #if defined(FEATURE_MMC_SDIO)
  1251. if (status & MSDC_INT_SDIOIRQ) {
  1252. msdc_printf("(%s)INT status:0x%x\n", __func__, status);
  1253. if ( (host->id == 2) || (host->id == 3) ) {
  1254. mmc_sdio_proc_pending_irqs(host->card);
  1255. //sdio_read_pending_irq(host->card->io_func[0]);
  1256. }
  1257. }
  1258. #endif
  1259. #endif
  1260. if (status & ~ints) {
  1261. MSG(WRN, "[SD%d]<CHECKME> Unexpected INT(0x%x)\n",
  1262. host->id, status);
  1263. }
  1264. if (status & MSDC_INT_DATCRCERR) {
  1265. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  1266. msdc_printf("[SD%d] DAT CRC error (0x%x), Left:%d/%d bytes, RXFIFO:%d,dcrc:0x%x\n",
  1267. host->id, status, size, totalsz, MSDC_RXFIFOCNT(),dcrc);
  1268. err = MMC_ERR_BADCRC;
  1269. break;
  1270. } else if (status & MSDC_INT_DATTMO) {
  1271. msdc_printf("[SD%d] DAT TMO error (0x%x), Left: %d/%d bytes, RXFIFO:%d\n",
  1272. host->id, status, size, totalsz, MSDC_RXFIFOCNT());
  1273. err = MMC_ERR_TIMEOUT;
  1274. break;
  1275. } else if (status & MSDC_INT_ACMDCRCERR) {
  1276. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  1277. msdc_printf("[SD%d] AUTOCMD CRC error (0x%x), Left:%d/%d bytes, RXFIFO:%d,dcrc:0x%x\n",
  1278. host->id, status, size, totalsz, MSDC_RXFIFOCNT(),dcrc);
  1279. err = MMC_ERR_ACMD_RSPCRC;
  1280. break;
  1281. } else if (status & MSDC_INT_XFER_COMPL) {
  1282. done = 1;
  1283. }
  1284. if (size == 0 && done)
  1285. break;
  1286. /* Note. RXFIFO count would be aligned to 4-bytes alignment size */
  1287. //if ((size >= MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= MSDC_FIFO_THD))
  1288. if (size > 0) {
  1289. int left;
  1290. if ( (size >= MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= MSDC_FIFO_THD) )
  1291. left = MSDC_FIFO_THD;
  1292. else if ( (size < MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= size) )
  1293. left = size;
  1294. else
  1295. continue;
  1296. size_per_round = left;
  1297. #if defined(MMC_MSDC_DRV_CTP)
  1298. if (pio_bits == 8) {
  1299. do {
  1300. #ifdef MTK_MSDC_DUMP_FIFO
  1301. msdc_printf("0x%x ",MSDC_FIFO_READ8());
  1302. #else
  1303. *ptr8++ = MSDC_FIFO_READ8();
  1304. #endif
  1305. left--;
  1306. } while (left);
  1307. } else if (pio_bits == 16) {
  1308. do {
  1309. if (left> 1) {
  1310. #ifdef MTK_MSDC_DUMP_FIFO
  1311. msdc_printf("0x%x ",MSDC_FIFO_READ16());
  1312. #else
  1313. *ptr16++ = MSDC_FIFO_READ16();
  1314. #endif
  1315. left-=2;
  1316. } else {
  1317. u8ptr = (u8*)ptr;
  1318. while (left--) {
  1319. #ifdef MTK_MSDC_DUMP_FIFO
  1320. msdc_printf("0x%x ",MSDC_FIFO_READ8());
  1321. #else
  1322. *u8ptr++ = MSDC_FIFO_READ8();
  1323. #endif
  1324. }
  1325. }
  1326. } while (left);
  1327. } else
  1328. #endif
  1329. {
  1330. //if (pio_bits==32 )
  1331. do {
  1332. if (left> 3) {
  1333. #ifdef MTK_MSDC_DUMP_FIFO
  1334. msdc_printf("0x%x ",MSDC_FIFO_READ32());
  1335. #else
  1336. *ptr++ = MSDC_FIFO_READ32();
  1337. #endif
  1338. left-=4;
  1339. } else {
  1340. u8ptr = (u8*)ptr;
  1341. while (left--) {
  1342. #ifdef MTK_MSDC_DUMP_FIFO
  1343. msdc_printf("0x%x ",MSDC_FIFO_READ8());
  1344. #else
  1345. *u8ptr++ = MSDC_FIFO_READ8();
  1346. #endif
  1347. }
  1348. }
  1349. } while (left);
  1350. }
  1351. size -= size_per_round;
  1352. //MSG(FIO, "[SD%d] Read %d bytes, RXFIFOCNT: %d, Left: %d/%d\n",
  1353. // host->id, size_per_round, MSDC_RXFIFOCNT(), size, totalsz);
  1354. }
  1355. }
  1356. if (err != MMC_ERR_NONE) {
  1357. msdc_abort(host); /* reset internal fifo and state machine */
  1358. msdc_printf("[SD%d] %d-bit PIO Read Error (%d)\n", host->id,
  1359. pio_bits, err);
  1360. }
  1361. return err;
  1362. }
  1363. int msdc_pio_write(struct mmc_host *host, u32 *ptr, u32 size)
  1364. {
  1365. int err = MMC_ERR_NONE;
  1366. u8 *ptr8=(u8 *)ptr;
  1367. u32 base = host->base;
  1368. u32 ints = MSDC_INT_DATCRCERR | MSDC_INT_DATTMO | MSDC_INT_XFER_COMPL;
  1369. //u32 timeout = 250000;
  1370. u32 status;
  1371. #if defined(MMC_MSDC_DRV_CTP)
  1372. u32 pio_bits = ((msdc_priv_t*)host->priv)->pio_bits;
  1373. #else
  1374. u32 pio_bits = 32;
  1375. #endif
  1376. u32 size_per_round;
  1377. #if defined(FEATURE_MMC_SDIO)
  1378. ints |= MSDC_INT_SDIOIRQ;
  1379. #endif
  1380. while (1) {
  1381. #if defined(MSDC_USE_IRQ)
  1382. //For CTP only
  1383. DisableIRQ();
  1384. status = msdc_irq_sts[host->id];
  1385. msdc_irq_sts[host->id] &= ~ints;
  1386. EnableIRQ();
  1387. #else
  1388. status = MSDC_READ32(MSDC_INT);
  1389. MSDC_WRITE32(MSDC_INT, status);
  1390. #if defined(FEATURE_MMC_SDIO)
  1391. if (status & MSDC_INT_SDIOIRQ) {
  1392. msdc_printf("(%s)INT status:0x%x\n", __func__, status);
  1393. if ( (host->id == 2) || (host->id == 3) ) {
  1394. mmc_sdio_proc_pending_irqs(host->card);
  1395. //sdio_read_pending_irq(host->card->io_func[0]);
  1396. }
  1397. }
  1398. #endif
  1399. #endif
  1400. if (status & ~ints) {
  1401. MSG(WRN, "[SD%d]<CHECKME> Unexpected INT(0x%x)\n",
  1402. host->id, status);
  1403. }
  1404. if (status & MSDC_INT_DATCRCERR) {
  1405. msdc_printf("[SD%d] DAT CRC error (0x%x), Left DAT: %d bytes\n",
  1406. host->id, status, size);
  1407. err = MMC_ERR_BADCRC;
  1408. break;
  1409. } else if (status & MSDC_INT_DATTMO) {
  1410. msdc_printf("[SD%d] DAT TMO error (0x%x), Left DAT: %d bytes, MSDC_FIFOCS=%xh\n",
  1411. host->id, status, size, MSDC_READ32(MSDC_FIFOCS));
  1412. err = MMC_ERR_TIMEOUT;
  1413. break;
  1414. } else if (status & MSDC_INT_ACMDCRCERR) {
  1415. msdc_printf("[SD%d] AUTO CMD CRC error (0x%x), Left DAT: %d bytes\n",
  1416. host->id, status, size);
  1417. err = MMC_ERR_ACMD_RSPCRC;
  1418. break;
  1419. } else if (status & MSDC_INT_XFER_COMPL) {
  1420. if (size == 0) {
  1421. MSG(OPS, "[SD%d] all data flushed to card\n", host->id);
  1422. break;
  1423. } else {
  1424. MSG(WRN, "[SD%d]<CHECKME> XFER_COMPL before all data written\n",
  1425. host->id);
  1426. }
  1427. }
  1428. if (size == 0)
  1429. continue;
  1430. if (MSDC_TXFIFOCNT() == 0) {
  1431. int left;
  1432. #if defined(MMC_MSDC_DRV_CTP)
  1433. if ( pio_bits==32 ) {
  1434. if ( size >= MSDC_FIFO_THD )
  1435. left = MSDC_FIFO_THD;
  1436. else
  1437. left = size;
  1438. } else
  1439. #endif
  1440. {
  1441. if ( size >= MSDC_FIFO_SZ )
  1442. left = MSDC_FIFO_SZ;
  1443. else
  1444. left = size;
  1445. }
  1446. size_per_round = left;
  1447. #if defined(MMC_MSDC_DRV_CTP)
  1448. if (pio_bits == 8) {
  1449. do {
  1450. MSDC_FIFO_WRITE8(*ptr8);
  1451. ptr8++;
  1452. left--;
  1453. } while (left);
  1454. } else if (pio_bits == 16) {
  1455. do {
  1456. if (left > 1) {
  1457. MSDC_FIFO_WRITE16(*(u16*)ptr8);
  1458. ptr8+=2;
  1459. left-=2;
  1460. } else {
  1461. while (left--) {
  1462. MSDC_FIFO_WRITE8(*ptr8);
  1463. ptr8++;
  1464. }
  1465. }
  1466. } while (left);
  1467. } else
  1468. #endif
  1469. {
  1470. //if ( write_unit==4 )
  1471. do {
  1472. if (left > 3) {
  1473. MSDC_FIFO_WRITE32(*(u32*)ptr8);
  1474. ptr8+=4;
  1475. left-=4;
  1476. } else {
  1477. while (left--) {
  1478. MSDC_FIFO_WRITE8(*ptr8);
  1479. ptr8++;
  1480. }
  1481. }
  1482. } while (left);
  1483. }
  1484. size -= size_per_round;
  1485. }
  1486. }
  1487. if (err != MMC_ERR_NONE) {
  1488. msdc_abort(host); /* reset internal fifo and state machine */
  1489. MSG(OPS, "[SD%d] %d-bit PIO Write Error (%d)\n", host->id,
  1490. pio_bits, err);
  1491. }
  1492. return err;
  1493. }
  1494. int msdc_pio_get_sandisk_fwid(struct mmc_host *host, uchar *dst)
  1495. {
  1496. u32 blksz = host->blklen;
  1497. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE;
  1498. struct mmc_command cmd;
  1499. ulong *ptr = (ulong *)dst;
  1500. //MSG(OPS, "[SD%d] Read data %d bytes from 0x%x\n", host->id, nblks * blksz, src);
  1501. msdc_clr_fifo(host);
  1502. msdc_set_blknum(host, 1);
  1503. msdc_set_blklen(host, blksz);
  1504. msdc_set_timeout(host, 100000000, 0);
  1505. /* send read command */
  1506. cmd.opcode = MMC_CMD21;
  1507. cmd.rsptyp = RESP_R1;
  1508. cmd.arg = 0;
  1509. cmd.retries = 0;
  1510. cmd.timeout = CMD_TIMEOUT;
  1511. err = msdc_cmd(host, &cmd);
  1512. if (err != MMC_ERR_NONE)
  1513. goto done;
  1514. err = derr = msdc_pio_read(host, (u32*)ptr, 1 * blksz);
  1515. done:
  1516. if (err != MMC_ERR_NONE) {
  1517. if (derr != MMC_ERR_NONE) {
  1518. msdc_printf("[SD%d] Read data error (%d)\n", host->id, derr);
  1519. msdc_abort_handler(host, 1);
  1520. } else {
  1521. msdc_printf("[SD%d] Read error (%d)\n", host->id, err);
  1522. }
  1523. }
  1524. return (derr == MMC_ERR_NONE) ? err : derr;
  1525. }
  1526. int msdc_pio_send_sandisk_fwid(struct mmc_host *host,uchar *src)
  1527. {
  1528. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE;
  1529. u32 blksz = host->blklen;
  1530. struct mmc_command cmd;
  1531. ulong *ptr = (ulong *)src;
  1532. //MSG(OPS, "[SD%d] Write data %d bytes to 0x%x\n", host->id, nblks * blksz, dst);
  1533. msdc_clr_fifo(host);
  1534. msdc_set_blknum(host, 1);
  1535. msdc_set_blklen(host, blksz);
  1536. /* No need since MSDC always waits 8 cycles for write data timeout */
  1537. /* send write command */
  1538. cmd.opcode = MMC_CMD50;
  1539. cmd.rsptyp = RESP_R1;
  1540. cmd.arg = 0;
  1541. cmd.retries = 0;
  1542. cmd.timeout = CMD_TIMEOUT;
  1543. err = msdc_cmd(host, &cmd);
  1544. if (err != MMC_ERR_NONE)
  1545. goto done;
  1546. err = derr = msdc_pio_write(host, (u32*)ptr, 1 * blksz);
  1547. done:
  1548. if (err != MMC_ERR_NONE) {
  1549. if (derr != MMC_ERR_NONE) {
  1550. msdc_printf("[SD%d] Write data error (%d)\n", host->id, derr);
  1551. msdc_abort_handler(host, 1);
  1552. } else {
  1553. msdc_printf("[SD%d] Write error (%d)\n", host->id, err);
  1554. }
  1555. }
  1556. return (derr == MMC_ERR_NONE) ? err : derr;
  1557. }
  1558. int msdc_pio_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks)
  1559. {
  1560. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1561. u32 blksz = host->blklen;
  1562. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE, cmd_err = MMC_ERR_NONE;
  1563. int multi;
  1564. struct mmc_command cmd;
  1565. ulong *ptr = (ulong *)dst;
  1566. MSG(OPS, "[SD%d] Read data %d bytes from 0x%x\n", host->id, (unsigned int)nblks * blksz, src);
  1567. multi = nblks > 1 ? 1 : 0;
  1568. msdc_clr_fifo(host);
  1569. msdc_set_blknum(host, nblks);
  1570. msdc_set_blklen(host, blksz);
  1571. msdc_set_timeout(host, 100000000, 0);
  1572. /* send read command */
  1573. cmd.opcode = multi ? MMC_CMD_READ_MULTIPLE_BLOCK : MMC_CMD_READ_SINGLE_BLOCK;
  1574. /* CMD23 with length only 1 */
  1575. if (priv->autocmd & MSDC_AUTOCMD23)
  1576. cmd.opcode = MMC_CMD_READ_MULTIPLE_BLOCK;
  1577. cmd.rsptyp = RESP_R1;
  1578. cmd.arg = src;
  1579. cmd.retries = 0;
  1580. cmd.timeout = CMD_TIMEOUT;
  1581. host->cmd = &cmd;
  1582. err = msdc_cmd(host, &cmd);
  1583. if (err != MMC_ERR_NONE)
  1584. goto done;
  1585. derr = msdc_pio_read(host, (u32*)ptr, nblks * blksz);
  1586. if (derr != MMC_ERR_NONE)
  1587. goto done;
  1588. if (multi && (priv->autocmd == 0)) {
  1589. cmd_err = msdc_cmd_stop(host, &cmd);
  1590. }
  1591. done:
  1592. if (err != MMC_ERR_NONE) {
  1593. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout.
  1594. * need reset host */
  1595. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  1596. // so call msdc_abort() directly
  1597. //msdc_abort_handler(host, 0);
  1598. msdc_abort(host);
  1599. return err; // high level will retry
  1600. }
  1601. if (derr != MMC_ERR_NONE) {
  1602. /* crc error find in data transfer. need reset host & send cmd12 */
  1603. /* if autocmd crc occur, will enter here too */
  1604. msdc_abort_handler(host, 1);
  1605. return derr;
  1606. }
  1607. if (cmd_err != MMC_ERR_NONE) {
  1608. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout
  1609. * need reset host */
  1610. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  1611. // so call msdc_abort() directly
  1612. //msdc_abort_handler(host, 0);
  1613. msdc_abort(host);
  1614. }
  1615. return MMC_ERR_NONE;
  1616. }
  1617. int msdc_pio_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks)
  1618. {
  1619. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1620. u32 base = host->base;
  1621. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE, cmd_err = MMC_ERR_NONE;
  1622. int multi;
  1623. u32 blksz = host->blklen;
  1624. struct mmc_command cmd;
  1625. ulong *ptr = (ulong *)src;
  1626. MSG(OPS, "[SD%d] Write data %d bytes to 0x%x\n", host->id, (unsigned int)nblks * blksz, dst);
  1627. multi = nblks > 1 ? 1 : 0;
  1628. msdc_clr_fifo(host);
  1629. msdc_set_blknum(host, nblks);
  1630. msdc_set_blklen(host, blksz);
  1631. /* send write command */
  1632. cmd.opcode = multi ? MMC_CMD_WRITE_MULTIPLE_BLOCK : MMC_CMD_WRITE_BLOCK;
  1633. /* CMD23 with length only 1 */
  1634. if (priv->autocmd & MSDC_AUTOCMD23)
  1635. cmd.opcode = MMC_CMD_WRITE_MULTIPLE_BLOCK;
  1636. cmd.rsptyp = RESP_R1;
  1637. cmd.arg = dst;
  1638. cmd.retries = 0;
  1639. cmd.timeout = CMD_TIMEOUT;
  1640. err = msdc_cmd(host, &cmd);
  1641. if (err != MMC_ERR_NONE)
  1642. goto done;
  1643. host->cmd = &cmd;
  1644. derr = msdc_pio_write(host, (u32*)ptr, nblks * blksz);
  1645. if (multi && (priv->autocmd == 0)) {
  1646. cmd_err = msdc_cmd_stop(host, &cmd);
  1647. }
  1648. #ifdef MTK_EMMC_POWER_ON_WP
  1649. else if (multi && (priv->autocmd & MSDC_AUTOCMD12)) {
  1650. if (MSDC_READ32(SDC_ACMD_RESP) & R1_WP_VIOLATION) {
  1651. err = MMC_ERR_WP_VIOLATION;
  1652. goto done;
  1653. }
  1654. }
  1655. err = msdc_get_err_from_card_status(host);
  1656. #endif
  1657. done:
  1658. if (err != MMC_ERR_NONE) {
  1659. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout.
  1660. * need reset host */
  1661. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  1662. // so call msdc_abort() directly
  1663. //msdc_abort_handler(host, 0);
  1664. msdc_abort(host);
  1665. return err; // high level will retry
  1666. }
  1667. if (derr != MMC_ERR_NONE) {
  1668. /* crc error find in data transfer. need reset host & send cmd12 */
  1669. /* if autocmd crc occur, will enter here too */
  1670. msdc_abort_handler(host, 1);
  1671. return derr;
  1672. }
  1673. if (cmd_err != MMC_ERR_NONE) {
  1674. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout
  1675. * need reset host */
  1676. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  1677. // so call msdc_abort() directly
  1678. //msdc_abort_handler(host, 0);
  1679. msdc_abort(host);
  1680. return MMC_ERR_FAILED; // high level will retry
  1681. }
  1682. return MMC_ERR_NONE;
  1683. }
  1684. void msdc_reset_timing_register(struct mmc_host *host)
  1685. {
  1686. u32 base = host->base;
  1687. MSDC_WRITE32(MSDC_IOCON, 0x00000000);
  1688. MSDC_WRITE32(MSDC_DAT_RDDLY0, 0x00000000);
  1689. MSDC_WRITE32(MSDC_DAT_RDDLY1, 0x00000000);
  1690. MSDC_WRITE32(MSDC_DAT_RDDLY2, 0x00000000);
  1691. MSDC_WRITE32(MSDC_DAT_RDDLY3, 0x00000000);
  1692. MSDC_WRITE32(MSDC_PATCH_BIT0, 0x403C000F);
  1693. MSDC_WRITE32(MSDC_PATCH_BIT1, 0xFFFE00C9);
  1694. MSDC_WRITE32(MSDC_PATCH_BIT2, 0x14801803);
  1695. MSDC_WRITE32(MSDC_PAD_TUNE0, 0);
  1696. MSDC_WRITE32(MSDC_PAD_TUNE1, 0);
  1697. }
  1698. void msdc_init_tune_path(struct mmc_host *host, unsigned int path, int hs400)
  1699. {
  1700. u32 base = host->base;
  1701. msdc_priv_t *priv = host->priv;
  1702. priv->tuning_mode = path;
  1703. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_RESPWAITCNT, 3);
  1704. if (path==MSDC_PATH_USE_ASYNC_FIFO) {
  1705. MSDC_CLR_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_RXDLYSEL);
  1706. MSDC_CLR_BIT32(MSDC_IOCON, MSDC_IOCON_DDLSEL);
  1707. MSDC_CLR_BIT32(MSDC_IOCON, MSDC_IOCON_R_D_SMPL_SEL);
  1708. MSDC_CLR_BIT32(MSDC_IOCON, MSDC_IOCON_R_D_SMPL);
  1709. if (hs400) {
  1710. MSDC_CLR_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATRRDLYSEL);
  1711. MSDC_CLR_BIT32(MSDC_PAD_TUNE1, MSDC_PAD_TUNE1_DATRRDLY2SEL);
  1712. } else {
  1713. MSDC_SET_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATRRDLYSEL);
  1714. MSDC_CLR_BIT32(MSDC_PAD_TUNE1, MSDC_PAD_TUNE1_DATRRDLY2SEL);
  1715. }
  1716. if (hs400)
  1717. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTS);
  1718. else
  1719. MSDC_SET_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTS);
  1720. MSDC_CLR_BIT32(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL);
  1721. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGRESP);
  1722. MSDC_SET_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLYSEL);
  1723. MSDC_CLR_BIT32(MSDC_PAD_TUNE1, MSDC_PAD_TUNE1_CMDRRDLY2SEL);
  1724. MSDC_CLR_BIT32(EMMC50_CFG0, MSDC_EMMC50_CFG_CMD_RESP_SEL);
  1725. if (hs400) {
  1726. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_CRCSTSENSEL, 0);
  1727. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_RESPSTENSEL, 0);
  1728. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, 0);
  1729. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, 0);
  1730. } else {
  1731. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_CRCSTSENSEL, 2);
  1732. MSDC_SET_FIELD(MSDC_PATCH_BIT2, MSDC_PB2_RESPSTENSEL, 2);
  1733. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, 0);
  1734. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, 0);
  1735. }
  1736. } else {
  1737. /* disable async fifo use interl delay*/
  1738. MSDC_SET_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_RXDLYSEL);
  1739. MSDC_CLR_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATRRDLYSEL);
  1740. MSDC_CLR_BIT32(MSDC_PAD_TUNE1, MSDC_PAD_TUNE1_DATRRDLY2SEL);
  1741. MSDC_CLR_BIT32(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLYSEL);
  1742. MSDC_CLR_BIT32(MSDC_PAD_TUNE1, MSDC_PAD_TUNE1_CMDRRDLY2SEL);
  1743. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTS);
  1744. MSDC_SET_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGRESP);
  1745. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  1746. }
  1747. }
  1748. void msdc_config_clock(struct mmc_host *host, int ddr, u32 hz, u32 hs_timing)
  1749. {
  1750. msdc_priv_t *priv = host->priv;
  1751. u32 base = host->base;
  1752. u32 mode, hs400_div_dis = 0;
  1753. u32 div;
  1754. u32 sclk;
  1755. u32 orig_clksrc = host->pll_mux_clk;
  1756. if (hz >= host->f_max) {
  1757. hz = host->f_max;
  1758. } else if (hz < host->f_min) {
  1759. hz = host->f_min;
  1760. }
  1761. if (hs_timing & EXT_CSD_HS_TIMEING_HS400) {
  1762. mode = 0x3; /* HS400 mode */
  1763. host->pll_mux_clk = MSDC50_CLKSRC_DEFAULT;
  1764. host->src_clk = msdc_src_clks[host->pll_mux_clk];
  1765. if (hz >= host->src_clk / 2) {
  1766. hs400_div_dis = 1;
  1767. div = 0;
  1768. sclk = host->src_clk >> 1; // use 400Mhz source
  1769. } else {
  1770. hs400_div_dis = 0;
  1771. if (hz >= (host->src_clk >> 2)) {
  1772. div = 0; /* mean div = 1/2 */
  1773. sclk = host->src_clk >> 2; /* sclk = clk/div/2. 2: internal divisor */
  1774. } else {
  1775. div = (host->src_clk + ((hz << 2) - 1)) / (hz << 2);
  1776. sclk = (host->src_clk >> 2) / div;
  1777. div = (div >> 1); /* since there is 1/2 internal divisor */
  1778. }
  1779. }
  1780. } else if (ddr) {
  1781. mode = 0x2; /* ddr mode and use divisor */
  1782. if (hz >= (host->src_clk >> 2)) {
  1783. div = 0; /* mean div = 1/2 */
  1784. sclk = host->src_clk >> 2; /* sclk = clk/div/2. 2: internal divisor */
  1785. } else {
  1786. div = (host->src_clk + ((hz << 2) - 1)) / (hz << 2);
  1787. sclk = (host->src_clk >> 2) / div;
  1788. div = (div >> 1); /* since there is 1/2 internal divisor */
  1789. }
  1790. #if !defined(FPGA_PLATFORM)
  1791. } else if (hz >= host->src_clk) {
  1792. mode = 0x1; /* no divisor and divisor is ignored */
  1793. div = 0;
  1794. sclk = host->src_clk;
  1795. #endif
  1796. } else {
  1797. mode = 0x0; /* use divisor */
  1798. if (hz >= (host->src_clk >> 1)) {
  1799. div = 0; /* mean div = 1/2 */
  1800. sclk = host->src_clk >> 1; /* sclk = clk / 2 */
  1801. } else {
  1802. div = (host->src_clk + ((hz << 2) - 1)) / (hz << 2);
  1803. sclk = (host->src_clk >> 2) / div;
  1804. }
  1805. }
  1806. host->cur_bus_clk = sclk;
  1807. //msdc_config_clksrc(host, MSDC_CLKSRC_NONE);
  1808. /* set clock mode and divisor */
  1809. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD_HS400 | MSDC_CFG_CKMOD |
  1810. MSDC_CFG_CKDIV,
  1811. (hs400_div_dis << (MSDC_CFG_CKMOD_BITS+MSDC_CFG_CKDIV_BITS)) |
  1812. (mode << MSDC_CFG_CKDIV_BITS) | div);
  1813. msdc_config_clksrc(host, orig_clksrc);
  1814. /* wait clock stable */
  1815. while (!(MSDC_READ32(MSDC_CFG) & MSDC_CFG_CKSTB));
  1816. if (hs_timing & EXT_CSD_HS_TIMEING_HS400) {
  1817. msdc_set_smpl(host, 1, priv->rsmpl, TYPE_CMD_RESP_EDGE);
  1818. msdc_set_smpl(host, 1, priv->rdsmpl, TYPE_READ_DATA_EDGE);
  1819. msdc_set_smpl(host, 1, priv->wdsmpl, TYPE_WRITE_CRC_EDGE);
  1820. } else {
  1821. msdc_set_smpl(host, 0, priv->rsmpl, TYPE_CMD_RESP_EDGE);
  1822. #if !defined(FPGA_PLATFORM)
  1823. msdc_set_smpl(host, 0, priv->rdsmpl, TYPE_READ_DATA_EDGE);
  1824. #else
  1825. msdc_set_smpl(host, 0, MSDC_SMPL_FALLING, TYPE_READ_DATA_EDGE);
  1826. #endif
  1827. msdc_set_smpl(host, 0, priv->wdsmpl, TYPE_WRITE_CRC_EDGE);
  1828. }
  1829. if ( mode==2 || mode==3 ) {
  1830. MSDC_CLR_BIT32(MSDC_PATCH_BIT0, (1<<3));
  1831. } else {
  1832. MSDC_SET_BIT32(MSDC_PATCH_BIT0, (1<<3));
  1833. }
  1834. msdc_init_tune_path(host, priv->tuning_mode, (mode ==3) ? 1 : 0);
  1835. msdc_printf("[SD%d] SET_CLK(%dkHz): SCLK(%dkHz) MODE(%d) DDR(%d) DIV(%d) DS(%d) RS(%d)\n",
  1836. host->id, hz/1000, sclk/1000, mode, ddr > 0 ? 1 : 0, div,
  1837. msdc_cap[host->id].data_edge, msdc_cap[host->id].cmd_edge);
  1838. }
  1839. void msdc_config_bus(struct mmc_host *host, u32 width)
  1840. {
  1841. u32 base = host->base;
  1842. u32 val = MSDC_READ32(SDC_CFG);
  1843. val &= ~SDC_CFG_BUSWIDTH;
  1844. switch (width) {
  1845. case HOST_BUS_WIDTH_1:
  1846. val |= (MSDC_BUS_1BITS << 16);
  1847. break;
  1848. case HOST_BUS_WIDTH_4:
  1849. val |= (MSDC_BUS_4BITS << 16);
  1850. break;
  1851. case HOST_BUS_WIDTH_8:
  1852. val |= (MSDC_BUS_8BITS << 16);
  1853. break;
  1854. default:
  1855. val |= (MSDC_BUS_1BITS << 16);
  1856. break;
  1857. }
  1858. MSDC_WRITE32(SDC_CFG, val);
  1859. msdc_printf("[SD%d] Bus Width: %d\n", host->id, width);
  1860. }
  1861. #if defined(FEATURE_MMC_UHS1)
  1862. int msdc_switch_volt(struct mmc_host *host, int volt)
  1863. {
  1864. u32 base = host->base;
  1865. int err = MMC_ERR_FAILED;
  1866. u32 timeout = 1000;
  1867. u32 status;
  1868. u32 bus_clk = host->cur_bus_clk;
  1869. /* make sure SDC is not busy (TBC) */
  1870. WAIT_COND(!SDC_IS_BUSY(), timeout, timeout);
  1871. if (timeout == 0) {
  1872. err = MMC_ERR_TIMEOUT;
  1873. goto out;
  1874. }
  1875. /* check if CMD/DATA lines both 0 */
  1876. if ((MSDC_READ32(MSDC_PS) & ((1 << 24) | (0xF << 16))) == 0) {
  1877. /* pull up disabled in CMD and DAT[3:0] */
  1878. msdc_pin_config(host, MSDC_PIN_PULL_NONE);
  1879. /* change signal from 3.3v to 1.8v */
  1880. msdc_host_power(host, 1, VOL_1800);
  1881. /* wait at least 5ms for 1.8v signal switching in card */
  1882. mdelay(10);
  1883. /* config clock to 10~12MHz mode for volt switch detection by host. */
  1884. msdc_config_clock(host, 0, 260000, 0);
  1885. /* pull up enabled in CMD and DAT[3:0] */
  1886. msdc_pin_config(host, MSDC_PIN_PULL_UP);
  1887. mdelay(5);
  1888. /* start to detect volt change by providing 1.8v signal to card */
  1889. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_BV18SDT);
  1890. /* wait at max. 1ms */
  1891. mdelay(1);
  1892. while ((status = MSDC_READ32(MSDC_CFG)) & MSDC_CFG_BV18SDT);
  1893. if (status & MSDC_CFG_BV18PSS)
  1894. err = MMC_ERR_NONE;
  1895. else
  1896. msdc_printf("[%s] sd%d v18 switch failed, MSDC_CFG=0x%x\n", __func__, host->id, status);
  1897. /* config clock back to init clk freq. */
  1898. msdc_config_clock(host, 0, bus_clk, 0);
  1899. }
  1900. out:
  1901. return err;
  1902. }
  1903. #endif
  1904. void msdc_reset_tune_counter(struct mmc_host *host)
  1905. {
  1906. host->time_read = 0;
  1907. }
  1908. #if defined(FEATURE_ASYNC_PATH_ENABLE)
  1909. #include "msdc_tune_async.c"
  1910. #endif
  1911. #if defined(FEATURE_MMC_CM_TUNING)
  1912. #if defined(FEATURE_ASYNC_PATH_ENABLE)
  1913. int msdc_tune_cmdrsp(struct mmc_host *host, struct mmc_command *cmd)
  1914. {
  1915. return msdc_async_tune_cmd(host, cmd);
  1916. }
  1917. #else //else part for if defined(FEATURE_ASYNC_PATH_ENABLE)
  1918. int msdc_tune_cmdrsp(struct mmc_host *host, struct mmc_command *cmd)
  1919. {
  1920. u32 base = host->base;
  1921. u32 sel = 0;
  1922. u32 rsmpl,cur_rsmpl, orig_rsmpl;
  1923. u32 rrdly,cur_rrdly, orig_rrdly;
  1924. u32 cntr,cur_cntr,orig_cmdrtc;
  1925. u32 dl_cksel, cur_dl_cksel, orig_dl_cksel;
  1926. u32 times = 0;
  1927. int result = MMC_ERR_CMDTUNEFAIL;
  1928. u8 hs400 = 0, orig_clkmode;
  1929. if (host->cur_bus_clk > 100000000) {
  1930. sel = 1;
  1931. }
  1932. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, orig_rsmpl);
  1933. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, orig_rrdly);
  1934. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, orig_cmdrtc);
  1935. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  1936. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, orig_clkmode);
  1937. hs400 = (orig_clkmode == 3) ? 1 : 0;
  1938. dl_cksel = 0;
  1939. do {
  1940. cntr = 0;
  1941. do {
  1942. rrdly = 0;
  1943. do {
  1944. for (rsmpl = 0; rsmpl < 2; rsmpl++) {
  1945. cur_rsmpl = (orig_rsmpl + rsmpl) % 2;
  1946. msdc_set_smpl(host, hs400, cur_rsmpl, TYPE_CMD_RESP_EDGE);
  1947. if (host->cur_bus_clk <= 400000) {
  1948. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, 0);
  1949. }
  1950. if (cmd->opcode != MMC_CMD_STOP_TRANSMISSION) {
  1951. if (host->app_cmd) {
  1952. host->app_cmd = false;
  1953. result = msdc_app_cmd(host);
  1954. host->app_cmd = true;
  1955. if (result != MMC_ERR_NONE)
  1956. return MMC_ERR_CMDTUNEFAIL;
  1957. }
  1958. result = msdc_send_cmd(host, cmd);
  1959. if (result == MMC_ERR_TIMEOUT)
  1960. rsmpl--;
  1961. if (result != MMC_ERR_NONE && cmd->opcode != MMC_CMD_STOP_TRANSMISSION) {
  1962. if (cmd->opcode == MMC_CMD_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK ||
  1963. cmd->opcode == MMC_CMD_READ_SINGLE_BLOCK ||cmd->opcode == MMC_CMD_WRITE_BLOCK ||
  1964. cmd->opcode == MMC_CMD_SEND_WRITE_PROT_TYPE)
  1965. msdc_abort_handler(host,1);
  1966. continue;
  1967. }
  1968. result = msdc_wait_rsp(host, cmd);
  1969. } else if (cmd->opcode == MMC_CMD_STOP_TRANSMISSION) {
  1970. result = MMC_ERR_NONE;
  1971. goto done;
  1972. } else
  1973. result = MMC_ERR_BADCRC;
  1974. #if MSDC_TUNE_LOG
  1975. /* for debugging */
  1976. {
  1977. u32 t_rrdly, t_rsmpl, t_dl_cksel, t_cmdrtc;
  1978. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, t_rsmpl);
  1979. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, t_rrdly);
  1980. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, t_cmdrtc);
  1981. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, t_dl_cksel);
  1982. times++;
  1983. msdc_printf("[SD%d] <TUNE_CMD%d><%d><%s> CMDRRDLY=%d, RSPL=%dh\n",
  1984. host->id, (cmd->opcode & (~(SD_CMD_BIT | SD_CMD_APP_BIT))), times, (result == MMC_ERR_NONE) ?
  1985. "PASS" : "FAIL", t_rrdly, t_rsmpl);
  1986. msdc_printf("[SD%d] <TUNE_CMD><%d><%s> CMD_RSP_TA_CNTR=%xh\n",
  1987. host->id, times, (result == MMC_ERR_NONE) ?
  1988. "PASS" : "FAIL", t_cmdrtc);
  1989. if (host->cur_bus_clk > 100000000) {
  1990. msdc_printf("[SD%d] <TUNE_CMD%d><%d><%s> CMD_RSP_TA_CNTR=%xh, INT_DAT_LATCH_CK_SEL=%xh\n",
  1991. host->id, (cmd->opcode & (~(SD_CMD_BIT | SD_CMD_APP_BIT))), times, (result == MMC_ERR_NONE) ?
  1992. "PASS" : "FAIL", t_cmdrtc, t_dl_cksel);
  1993. }
  1994. }
  1995. #endif
  1996. if (result == MMC_ERR_NONE) {
  1997. host->app_cmd = false;
  1998. goto done;
  1999. }
  2000. if (cmd->opcode == MMC_CMD_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK || cmd->opcode == MMC_CMD_READ_SINGLE_BLOCK ||cmd->opcode == MMC_CMD_WRITE_BLOCK)
  2001. msdc_abort_handler(host,1);
  2002. }
  2003. cur_rrdly = (orig_rrdly + rrdly + 1) % 32;
  2004. MSDC_SET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, cur_rrdly);
  2005. } while (++rrdly < 32);
  2006. if (!sel)
  2007. break;
  2008. cur_cntr = (orig_cmdrtc + cntr + 1) % 8;
  2009. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, cur_cntr);
  2010. } while (++cntr < 8);
  2011. /* no need to update data ck sel */
  2012. if (!sel)
  2013. break;
  2014. cur_dl_cksel = (orig_dl_cksel +dl_cksel+1) % 8;
  2015. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel);
  2016. dl_cksel++;
  2017. } while (dl_cksel < 8);
  2018. /* no need to update ck sel */
  2019. if (result != MMC_ERR_NONE)
  2020. result = MMC_ERR_CMDTUNEFAIL;
  2021. done:
  2022. return result;
  2023. }
  2024. #endif
  2025. #endif
  2026. #if defined(MMC_MSDC_DRV_CTP)
  2027. void msdc_tune_update_cmdrsp(struct mmc_host *host, u32 count)
  2028. {
  2029. u32 base = host->base;
  2030. u32 sel = 0;
  2031. u32 rsmpl,cur_rsmpl, orig_rsmpl;
  2032. u32 rrdly,cur_rrdly, orig_rrdly;
  2033. u32 cntr,cur_cntr,orig_cmdrtc;
  2034. u32 dl_cksel, cur_dl_cksel, orig_dl_cksel;
  2035. u32 times = 0;
  2036. u8 hs400 = 0, orig_clkmode;
  2037. msdc_printf("cur_bus_clk = %d\n", host->cur_bus_clk);
  2038. if (host->cur_bus_clk > 100000000) {
  2039. sel = 1;
  2040. }
  2041. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, orig_rsmpl);
  2042. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, orig_rrdly);
  2043. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, orig_cmdrtc);
  2044. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2045. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, orig_clkmode);
  2046. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2047. dl_cksel = 0;
  2048. cntr = 0;
  2049. rrdly = 0;
  2050. if (sel == 1) {
  2051. if (count >= 8 * 64 && count < 8 * 8 * 64) {
  2052. dl_cksel = count % 8;
  2053. cur_dl_cksel = (orig_dl_cksel + dl_cksel + 1) % 8;
  2054. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel);
  2055. count = count % (8 * 64);
  2056. }
  2057. if (count >= 64 && count < 8 * 64) {
  2058. cntr = count % 8;
  2059. cur_cntr = (orig_cmdrtc + cntr + 1) % 8;
  2060. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, cur_cntr);
  2061. count = count % 64;
  2062. }
  2063. }
  2064. if (count >= 2 && count < 64) {
  2065. rrdly = count % 32;
  2066. cur_rrdly = (orig_rrdly + rrdly + 1) % 32;
  2067. MSDC_SET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, cur_rrdly);
  2068. count = (count > 32 ? 1 : 0);
  2069. }
  2070. if (count >= 0 && count < 2) {
  2071. cur_rsmpl = (orig_rsmpl + count) % 2;
  2072. msdc_set_smpl(host, hs400, cur_rsmpl, TYPE_CMD_RESP_EDGE);
  2073. }
  2074. }
  2075. #endif
  2076. #if defined(FEATURE_MMC_RD_TUNING)
  2077. #if defined(FEATURE_ASYNC_PATH_ENABLE)
  2078. int msdc_tune_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks)
  2079. {
  2080. //Let mmc_core to invoke tuning function by using old name - msdc_tune_bread
  2081. return msdc_async_tune_bread(host, dst, src ,nblks);
  2082. }
  2083. int msdc_tune_read(struct mmc_host *host)
  2084. {
  2085. return msdc_async_tune_read(host);
  2086. }
  2087. #else //else part for if defined(FEATURE_ASYNC_PATH_ENABLE)
  2088. int msdc_tune_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks)
  2089. {
  2090. u32 base = host->base;
  2091. u32 dcrc, ddr = 0, sel = 0;
  2092. u32 cur_rxdly0, cur_rxdly1;
  2093. u32 rdsmpl, cur_rdsmpl, orig_rdsmpl;
  2094. u32 dsel,cur_dsel,orig_dsel;
  2095. u32 dl_cksel,cur_dl_cksel,orig_dl_cksel;
  2096. u32 rxdly;
  2097. u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3, cur_dat4, cur_dat5,
  2098. cur_dat6, cur_dat7;
  2099. u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3, orig_dat4, orig_dat5,
  2100. orig_dat6, orig_dat7;
  2101. u32 orig_clkmode;
  2102. u32 times = 0;
  2103. int result = MMC_ERR_READTUNEFAIL;
  2104. u8 hs400 = 0;
  2105. if (host->cur_bus_clk > 100000000)
  2106. sel = 1;
  2107. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, orig_clkmode);
  2108. ddr = (orig_clkmode == 2) ? 1 : 0;
  2109. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2110. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, orig_dsel);
  2111. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2112. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, orig_rdsmpl);
  2113. /* Tune Method 2. delay each data line */
  2114. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  2115. dl_cksel = 0;
  2116. do {
  2117. dsel = 0;
  2118. do {
  2119. rxdly = 0;
  2120. do {
  2121. for (rdsmpl = 0; rdsmpl < 2; rdsmpl++) {
  2122. cur_rdsmpl = (orig_rdsmpl + rdsmpl) % 2;
  2123. msdc_set_smpl(host, hs400, cur_rdsmpl, TYPE_READ_DATA_EDGE);
  2124. result = host->blk_read(host, dst, src, nblks);
  2125. if (result == MMC_ERR_CMDTUNEFAIL || result == MMC_ERR_CMD_RSPCRC || result == MMC_ERR_ACMD_RSPCRC)
  2126. goto done;
  2127. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  2128. if (!ddr) dcrc &= ~SDC_DCRC_STS_NEG;
  2129. #if MSDC_TUNE_LOG
  2130. /* for debugging */
  2131. {
  2132. u32 t_dspl, t_ckgen_dsel, t_int_cksel;
  2133. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, t_dspl);
  2134. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, t_ckgen_dsel);
  2135. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, t_int_cksel);
  2136. times++;
  2137. msdc_printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> DCRC=%xh, ret=%d\n",
  2138. host->id, times, (result == MMC_ERR_NONE && dcrc == 0) ?
  2139. "PASS" : "FAIL", (nblks == 1 ? 17 : 18), src, dcrc, result);
  2140. msdc_printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> DATRDDLY0=%xh, DATRDDLY1=%xh, DSMPL=%xh\n",
  2141. host->id, times, (result == MMC_ERR_NONE && dcrc == 0) ?
  2142. "PASS" : "FAIL", (nblks == 1 ? 17 : 18), src, MSDC_READ32(MSDC_DAT_RDDLY0), MSDC_READ32(MSDC_DAT_RDDLY1), t_dspl);
  2143. if (host->cur_bus_clk >= 100000000) {
  2144. msdc_printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> CKGEN_MSDC_DLY_SEL=%xh, INT_DAT_LATCH_CK_SEL=%xh\n",
  2145. host->id, times, (result == MMC_ERR_NONE && dcrc == 0) ?
  2146. "PASS" : "FAIL", (nblks == 1 ? 17 : 18), src, t_ckgen_dsel, t_int_cksel);
  2147. }
  2148. }
  2149. #endif
  2150. /* no crc error in this data line */
  2151. if (result == MMC_ERR_NONE && dcrc == 0) {
  2152. goto done;
  2153. } else {
  2154. result = MMC_ERR_BADCRC;
  2155. }
  2156. }
  2157. cur_rxdly0 = MSDC_READ32(MSDC_DAT_RDDLY0);
  2158. cur_rxdly1 = MSDC_READ32(MSDC_DAT_RDDLY1);
  2159. orig_dat0 = (cur_rxdly0 >> 24) & 0x1F;
  2160. orig_dat1 = (cur_rxdly0 >> 16) & 0x1F;
  2161. orig_dat2 = (cur_rxdly0 >> 8) & 0x1F;
  2162. orig_dat3 = (cur_rxdly0 >> 0) & 0x1F;
  2163. orig_dat4 = (cur_rxdly1 >> 24) & 0x1F;
  2164. orig_dat5 = (cur_rxdly1 >> 16) & 0x1F;
  2165. orig_dat6 = (cur_rxdly1 >> 8) & 0x1F;
  2166. orig_dat7 = (cur_rxdly1 >> 0) & 0x1F;
  2167. // Bits8~15 of dcrc have been masked for non-ddr case,
  2168. // so we can process ddr and non-ddr cases with the same code
  2169. cur_dat0 = (dcrc & ((1 << 0) | (1 << 8)) ) ? (orig_dat0 + 1) : orig_dat0;
  2170. cur_dat1 = (dcrc & ((1 << 1) | (1 << 9)) ) ? (orig_dat1 + 1) : orig_dat1;
  2171. cur_dat2 = (dcrc & ((1 << 2) | (1 << 10)) ) ? (orig_dat2 + 1) : orig_dat2;
  2172. cur_dat3 = (dcrc & ((1 << 3) | (1 << 11)) ) ? (orig_dat3 + 1) : orig_dat3;
  2173. cur_dat4 = (dcrc & ((1 << 4) | (1 << 12)) ) ? (orig_dat4 + 1) : orig_dat4;
  2174. cur_dat5 = (dcrc & ((1 << 5) | (1 << 13)) ) ? (orig_dat5 + 1) : orig_dat5;
  2175. cur_dat6 = (dcrc & ((1 << 6) | (1 << 14)) ) ? (orig_dat6 + 1) : orig_dat6;
  2176. cur_dat7 = (dcrc & ((1 << 7) | (1 << 15)) ) ? (orig_dat7 + 1) : orig_dat7;
  2177. cur_rxdly0 = ((cur_dat0 & 0x1F) << 24) | ((cur_dat1 & 0x1F) << 16) |
  2178. ((cur_dat2 & 0x1F)<< 8) | ((cur_dat3 & 0x1F) << 0);
  2179. cur_rxdly1 = ((cur_dat4 & 0x1F) << 24) | ((cur_dat5 & 0x1F) << 16) |
  2180. ((cur_dat6 & 0x1F) << 8) | ((cur_dat7 & 0x1F) << 0);
  2181. MSDC_WRITE32(MSDC_DAT_RDDLY0, cur_rxdly0);
  2182. MSDC_WRITE32(MSDC_DAT_RDDLY1, cur_rxdly1);
  2183. } while (++rxdly < 32);
  2184. if (!sel)
  2185. break;
  2186. cur_dsel = (orig_dsel + dsel + 1) % 32;
  2187. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, cur_dsel);
  2188. } while (++dsel < 32);
  2189. /* no need to update data ck sel */
  2190. if (orig_clkmode != 1)
  2191. break;
  2192. cur_dl_cksel = (orig_dl_cksel + dl_cksel + 1) % 8;
  2193. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel);
  2194. dl_cksel++;
  2195. } while (dl_cksel < 8);
  2196. done:
  2197. return result;
  2198. }
  2199. #define READ_TUNING_MAX_HS (2 * 32)
  2200. #define READ_TUNING_MAX_UHS (2 * 32 * 32)
  2201. #define READ_TUNING_MAX_UHS_CLKMOD1 (2 * 32 * 32 *8)
  2202. int msdc_tune_read(struct mmc_host *host)
  2203. {
  2204. u32 base = host->base;
  2205. u32 dcrc, ddr = 0, sel = 0;
  2206. u32 cur_rxdly0 = 0 , cur_rxdly1 = 0;
  2207. u32 cur_dsmpl = 0, orig_dsmpl;
  2208. u32 cur_dsel = 0,orig_dsel;
  2209. u32 cur_dl_cksel = 0,orig_dl_cksel;
  2210. u32 cur_dat0 = 0, cur_dat1 = 0, cur_dat2 = 0, cur_dat3 = 0, cur_dat4 = 0, cur_dat5 = 0,
  2211. cur_dat6 = 0, cur_dat7 = 0;
  2212. u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3, orig_dat4, orig_dat5,
  2213. orig_dat6, orig_dat7;
  2214. u32 orig_clkmode;
  2215. int result = MMC_ERR_NONE;
  2216. u8 hs400 = 0;
  2217. if (host->cur_bus_clk > 100000000)
  2218. sel = 1;
  2219. if (host->card) {
  2220. ddr = mmc_card_ddr(host->card);
  2221. }
  2222. MSDC_GET_FIELD(MSDC_CFG,MSDC_CFG_CKMOD,orig_clkmode);
  2223. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2224. //if(orig_clkmode == 1)
  2225. //MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_RX_SDCLKO_SEL, 0);
  2226. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, orig_dsel);
  2227. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2228. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, orig_dsmpl);
  2229. /* Tune Method 2. delay each data line */
  2230. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  2231. cur_dsmpl = (orig_dsmpl + 1) ;
  2232. msdc_set_smpl(host, hs400, (cur_dsmpl % 2), TYPE_READ_DATA_EDGE);
  2233. if (cur_dsmpl >= 2) {
  2234. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  2235. if (!ddr) dcrc &= ~SDC_DCRC_STS_NEG;
  2236. cur_rxdly0 = MSDC_READ32(MSDC_DAT_RDDLY0);
  2237. cur_rxdly1 = MSDC_READ32(MSDC_DAT_RDDLY1);
  2238. orig_dat0 = (cur_rxdly0 >> 24) & 0x1F;
  2239. orig_dat1 = (cur_rxdly0 >> 16) & 0x1F;
  2240. orig_dat2 = (cur_rxdly0 >> 8) & 0x1F;
  2241. orig_dat3 = (cur_rxdly0 >> 0) & 0x1F;
  2242. orig_dat4 = (cur_rxdly1 >> 24) & 0x1F;
  2243. orig_dat5 = (cur_rxdly1 >> 16) & 0x1F;
  2244. orig_dat6 = (cur_rxdly1 >> 8) & 0x1F;
  2245. orig_dat7 = (cur_rxdly1 >> 0) & 0x1F;
  2246. // Bits8~15 of dcrc have been masked for non-ddr case,
  2247. // so we can process ddr and non-ddr cases with the same code
  2248. cur_dat0 = (dcrc & ((1 << 0) | (1 << 8)) ) ? (orig_dat0 + 1) : orig_dat0;
  2249. cur_dat1 = (dcrc & ((1 << 1) | (1 << 9)) ) ? (orig_dat1 + 1) : orig_dat1;
  2250. cur_dat2 = (dcrc & ((1 << 2) | (1 << 10)) ) ? (orig_dat2 + 1) : orig_dat2;
  2251. cur_dat3 = (dcrc & ((1 << 3) | (1 << 11)) ) ? (orig_dat3 + 1) : orig_dat3;
  2252. cur_dat4 = (dcrc & ((1 << 4) | (1 << 12)) ) ? (orig_dat4 + 1) : orig_dat4;
  2253. cur_dat5 = (dcrc & ((1 << 5) | (1 << 13)) ) ? (orig_dat5 + 1) : orig_dat5;
  2254. cur_dat6 = (dcrc & ((1 << 6) | (1 << 14)) ) ? (orig_dat6 + 1) : orig_dat6;
  2255. cur_dat7 = (dcrc & ((1 << 7) | (1 << 15)) ) ? (orig_dat7 + 1) : orig_dat7;
  2256. cur_rxdly0 = ((cur_dat0 & 0x1F) << 24) | ((cur_dat1 & 0x1F) << 16) |
  2257. ((cur_dat2 & 0x1F) << 8) | ((cur_dat3 & 0x1F) << 0);
  2258. cur_rxdly1 = ((cur_dat4 & 0x1F) << 24) | ((cur_dat5 & 0x1F)<< 16) |
  2259. ((cur_dat6 & 0x1F) << 8) | ((cur_dat7 & 0x1F) << 0);
  2260. MSDC_WRITE32(MSDC_DAT_RDDLY0, cur_rxdly0);
  2261. MSDC_WRITE32(MSDC_DAT_RDDLY1, cur_rxdly1);
  2262. }
  2263. if (cur_dat0 >= 32 || cur_dat1 >= 32 || cur_dat2 >= 32 || cur_dat3 >= 32 ||
  2264. cur_dat4 >= 32 || cur_dat5 >= 32 || cur_dat6 >= 32 || cur_dat7 >= 32) {
  2265. if (sel) {
  2266. cur_dsel = (orig_dsel + 1);
  2267. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, cur_dsel % 32);
  2268. }
  2269. }
  2270. if (cur_dsel >= 32) {
  2271. if (orig_clkmode == 1 && sel) {
  2272. cur_dl_cksel = (orig_dl_cksel + 1);
  2273. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel % 8);
  2274. }
  2275. }
  2276. ++(host->time_read);
  2277. if ((sel == 1 && orig_clkmode == 1 && host->time_read == READ_TUNING_MAX_UHS_CLKMOD1)||
  2278. (sel == 1 && orig_clkmode != 1 && host->time_read == READ_TUNING_MAX_UHS)||
  2279. (sel == 0 && orig_clkmode != 1 && host->time_read == READ_TUNING_MAX_HS)) {
  2280. result = MMC_ERR_READTUNEFAIL;
  2281. }
  2282. return result;
  2283. }
  2284. #endif
  2285. #endif /* end of FEATURE_MMC_RD_TUNING */
  2286. int msdc_tune_rw_hs400(struct mmc_host *host, uchar *dst, ulong src, ulong nblks, unsigned int rw)
  2287. {
  2288. u32 ds_dly1 = 0, ds_dly3 = 0, orig_ds_dly1 = 0, orig_ds_dly3 = 0;
  2289. u32 ds_dly1_count, ds_dly3_count = 0;
  2290. int result = MMC_ERR_READTUNEFAIL;
  2291. #if MSDC_TUNE_LOG
  2292. u32 times = 0;
  2293. #endif
  2294. u32 base = host->base;
  2295. if (host->id != 0) {
  2296. return result;
  2297. }
  2298. msdc_printf("[tune][%s:%d] start hs400 read tune\n", __func__, __LINE__);
  2299. MSDC_GET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY1, orig_ds_dly1);
  2300. MSDC_GET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY3, orig_ds_dly3);
  2301. ds_dly3 = orig_ds_dly3;
  2302. ds_dly1 = orig_ds_dly1;
  2303. do {
  2304. if (ds_dly3 >= 31) {
  2305. ds_dly3 = 0;
  2306. } else {
  2307. ds_dly3 += 1;
  2308. }
  2309. MSDC_SET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY3, ds_dly3);
  2310. ds_dly1_count = 0;
  2311. do {
  2312. if (ds_dly1 == 0) {
  2313. ds_dly1 = 31;
  2314. } else {
  2315. ds_dly1 -= 1;
  2316. }
  2317. MSDC_SET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY1, ds_dly1);
  2318. /* resend the r/w command */
  2319. if (rw == 0) {
  2320. result = host->blk_read(host, dst, src, nblks);
  2321. } else if (rw == 1) {
  2322. result = host->blk_write(host, (ulong) dst, (uchar *) src, nblks);
  2323. }
  2324. #if MSDC_TUNE_LOG
  2325. /* for debugging */
  2326. {
  2327. times++;
  2328. if (rw == 0) {
  2329. msdc_printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> ret=%d, DS_DLY1=%d, DS_DLY3=%d\n",
  2330. host->id, times, result == MMC_ERR_NONE ? "PASS" : "FAIL", (nblks == 1 ? 17 : 18), (unsigned int)dst,
  2331. result, ds_dly1, ds_dly3);
  2332. } else if (rw == 1) {
  2333. msdc_printf("[SD%d] <TUNE_BEWRITE_%d><%s><cmd%d:0x%x> ret=%d, DS_DLY1=%d, DS_DLY3=%d\n",
  2334. host->id, times, result == MMC_ERR_NONE ? "PASS" : "FAIL", (nblks == 1 ? 24 : 25), (unsigned int)dst,
  2335. result, ds_dly1, ds_dly3);
  2336. }
  2337. }
  2338. #endif
  2339. if (result == MMC_ERR_CMDTUNEFAIL || result == MMC_ERR_CMD_RSPCRC)
  2340. goto done;
  2341. if (result == MMC_ERR_NONE) {
  2342. goto done;
  2343. }
  2344. } while (++ds_dly1_count < 32);
  2345. } while (++ds_dly3_count < 32);
  2346. done:
  2347. return result;
  2348. }
  2349. #if defined(FEATURE_MMC_WR_TUNING)
  2350. #if defined(FEATURE_ASYNC_PATH_ENABLE)
  2351. int msdc_tune_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks)
  2352. {
  2353. return msdc_async_tune_bwrite(host, dst, src, nblks);
  2354. }
  2355. #else //else part for if defined(FEATURE_ASYNC_PATH_ENABLE)
  2356. int msdc_tune_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks)
  2357. {
  2358. u32 base = host->base;
  2359. u32 orig_clkmode;
  2360. u32 sel = 0;
  2361. //u32 ddrckdly = 0;
  2362. u32 wrrdly, cur_wrrdly, orig_wrrdly;
  2363. u32 wdsmpl, cur_wdsmpl, orig_wdsmpl;
  2364. u32 d_cntr,orig_d_cntr,cur_d_cntr;
  2365. u32 rxdly, cur_rxdly0;
  2366. u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3;
  2367. u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3;
  2368. #if MSDC_TUNE_LOG
  2369. u32 times = 0;
  2370. #endif
  2371. //u32 status;
  2372. int result = MMC_ERR_WRITETUNEFAIL;
  2373. u8 hs400 = 0;
  2374. if (host->cur_bus_clk > 100000000)
  2375. sel = 1;
  2376. //if (mmc_card_ddr(host->card)) ddrckdly = 1;
  2377. MSDC_GET_FIELD(MSDC_CFG,MSDC_CFG_CKMOD,orig_clkmode);
  2378. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2379. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATWRDLY, orig_wrrdly);
  2380. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, orig_wdsmpl);
  2381. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, orig_d_cntr);
  2382. /* Tune Method 2. delay data0 line */
  2383. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  2384. cur_rxdly0 = MSDC_READ32(MSDC_DAT_RDDLY0);
  2385. orig_dat0 = (cur_rxdly0 >> 24) & 0x1F;
  2386. orig_dat1 = (cur_rxdly0 >> 16) & 0x1F;
  2387. orig_dat2 = (cur_rxdly0 >> 8) & 0x1F;
  2388. orig_dat3 = (cur_rxdly0 >> 0) & 0x1F;
  2389. d_cntr = 0;
  2390. do {
  2391. rxdly = 0;
  2392. do {
  2393. wrrdly = 0;
  2394. do {
  2395. for (wdsmpl = 0; wdsmpl < 2; wdsmpl++) {
  2396. cur_wdsmpl = (orig_wdsmpl + wdsmpl) % 2;
  2397. msdc_set_smpl(host, hs400, cur_wdsmpl, TYPE_WRITE_CRC_EDGE);
  2398. result = host->blk_write(host, dst, src, nblks);
  2399. if (result == MMC_ERR_CMDTUNEFAIL || result == MMC_ERR_CMD_RSPCRC || result == MMC_ERR_ACMD_RSPCRC)
  2400. goto done;
  2401. #if MSDC_TUNE_LOG
  2402. /* for debugging */
  2403. {
  2404. u32 t_dspl, t_wrrdly, t_d_cntr;// t_dl_cksel, t_ddrdly, t_cksel;
  2405. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATWRDLY, t_wrrdly);
  2406. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, t_dspl);
  2407. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, t_d_cntr);
  2408. times++;
  2409. msdc_printf("[SD%d] <TUNE_BWRITE_%d><%s><cmd%d:0x%x> ret=%d, DSPL=%d, WRRDLY=%d, MSDC_DAT_RDDLY0=%xh\n",
  2410. host->id, times, result == MMC_ERR_NONE ? "PASS" : "FAIL", (nblks == 1 ? 24 : 25), (unsigned int)dst,
  2411. result, t_dspl, t_wrrdly, MSDC_READ32(MSDC_DAT_RDDLY0));
  2412. if (host->cur_bus_clk >= 100000000) {
  2413. msdc_printf("[SD%d] <TUNE_BWRITE_%d><%s><cmd%d:0x%x> MSDC_PB1_WRDAT_CRCS_TA_CNTR=%xh\n",
  2414. host->id, times, (result == MMC_ERR_NONE) ? "PASS" : "FAIL", (nblks == 1 ? 24 : 25), (unsigned int)dst,
  2415. t_d_cntr);
  2416. }
  2417. }
  2418. #endif
  2419. if (result == MMC_ERR_NONE) {
  2420. goto done;
  2421. }
  2422. }
  2423. cur_wrrdly = ++orig_wrrdly % 32;
  2424. MSDC_SET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATWRDLY, cur_wrrdly);
  2425. } while (++wrrdly < 32);
  2426. cur_dat0 = ++orig_dat0 % 32; /* only adjust bit-1 for crc */
  2427. cur_dat1 = orig_dat1;
  2428. cur_dat2 = orig_dat2;
  2429. cur_dat3 = orig_dat3;
  2430. cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0);
  2431. MSDC_WRITE32(MSDC_DAT_RDDLY0, cur_rxdly0);
  2432. } while (++rxdly < 32);
  2433. /* no need to update data ck sel */
  2434. if (!sel)
  2435. break;
  2436. cur_d_cntr= (orig_d_cntr + d_cntr +1 )% 8;
  2437. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, cur_d_cntr);
  2438. d_cntr++;
  2439. } while (d_cntr < 8);
  2440. done:
  2441. return result;
  2442. }
  2443. #endif
  2444. #endif /* end of FEATURE_MMC_WR_TUNING */
  2445. #if defined(FEATURE_MMC_UHS1)
  2446. int msdc_tune_uhs1(struct mmc_host *host, struct mmc_card *card)
  2447. {
  2448. u32 base = host->base;
  2449. u32 status;
  2450. int i;
  2451. int err = MMC_ERR_FAILED;
  2452. struct mmc_command cmd;
  2453. cmd.opcode = SD_CMD_SEND_TUNING_BLOCK;
  2454. cmd.arg = 0;
  2455. cmd.rsptyp = RESP_R1;
  2456. cmd.retries = CMD_RETRIES;
  2457. cmd.timeout = 0xFFFFFFFF;
  2458. msdc_set_timeout(host, 100000000, 0);
  2459. msdc_set_autocmd(host, MSDC_AUTOCMD19, 1);
  2460. for (i = 0; i < 13; i++) {
  2461. /* Note. select a pad to be tuned. msdc only tries 32 times to tune the
  2462. * pad since there is only 32 tuning steps for a pad.
  2463. */
  2464. MSDC_SET_FIELD(SDC_ACMD19_TRG, SDC_ACMD19_TRG_TUNESEL, i);
  2465. /* Note. autocmd19 will only trigger done interrupt and won't trigger
  2466. * autocmd timeout and crc error interrupt. (autocmd19 is a special command
  2467. * and is different from autocmd12 and autocmd23.
  2468. */
  2469. err = msdc_cmd(host, &cmd);
  2470. if (err != MMC_ERR_NONE)
  2471. goto out;
  2472. /* read and check acmd19 sts. bit-1: success, bit-0: fail */
  2473. status = MSDC_READ32(SDC_ACMD19_STS);
  2474. if (!status) {
  2475. msdc_printf("[SD%d] ACMD19_TRG(%d), STS(0x%x) Failed\n", host->id, i,
  2476. status);
  2477. err = MMC_ERR_FAILED;
  2478. goto out;
  2479. }
  2480. }
  2481. err = MMC_ERR_NONE;
  2482. out:
  2483. msdc_set_autocmd(host, MSDC_AUTOCMD19, 0);
  2484. return err;
  2485. }
  2486. int msdc_tune_hs200(struct mmc_host *host, struct mmc_card *card)
  2487. {
  2488. return 0;
  2489. }
  2490. int msdc_tune_hs400(struct mmc_host *host, struct mmc_card *card)
  2491. {
  2492. return 0;
  2493. }
  2494. #endif
  2495. #if defined(FEATURE_MMC_CARD_DETECT)
  2496. void msdc_card_detect(struct mmc_host *host, int on)
  2497. {
  2498. u32 base = host->base;
  2499. if ((msdc_cap[host->id].flags & MSDC_CD_PIN_EN) == 0) {
  2500. MSDC_CARD_DETECTION_OFF();
  2501. return;
  2502. }
  2503. if (on) {
  2504. MSDC_SET_FIELD(MSDC_PS, MSDC_PS_CDDEBOUNCE, DEFAULT_DEBOUNCE);
  2505. MSDC_CARD_DETECTION_ON();
  2506. } else {
  2507. MSDC_CARD_DETECTION_OFF();
  2508. MSDC_SET_FIELD(MSDC_PS, MSDC_PS_CDDEBOUNCE, 0);
  2509. }
  2510. }
  2511. int msdc_card_avail(struct mmc_host *host)
  2512. {
  2513. u32 base = host->base;
  2514. u32 sts, avail = 0;
  2515. if ((msdc_cap[host->id].flags & MSDC_REMOVABLE) == 0)
  2516. return 1;
  2517. if (msdc_cap[host->id].flags & MSDC_CD_PIN_EN) {
  2518. MSDC_GET_FIELD(MSDC_PS, MSDC_PS_CDSTS, sts);
  2519. avail = sts == 0 ? 1 : 0;
  2520. }
  2521. return avail;
  2522. }
  2523. #endif
  2524. #if defined(MMC_MSDC_DRV_CTP)
  2525. int msdc_card_protected(struct mmc_host *host)
  2526. {
  2527. u32 base = host->base;
  2528. u32 prot;
  2529. if (msdc_cap[host->id].flags & MSDC_WP_PIN_EN) {
  2530. MSDC_GET_FIELD(MSDC_PS, MSDC_PS_WP, prot);
  2531. } else {
  2532. prot = 0;
  2533. }
  2534. return prot;
  2535. }
  2536. #endif
  2537. #if defined(MMC_MSDC_DRV_CTP) || defined(MMC_MSDC_DRV_LK)
  2538. void msdc_hard_reset(struct mmc_host *host)
  2539. {
  2540. msdc_card_power(host, 0);
  2541. mdelay(10);
  2542. msdc_card_power(host, 1);
  2543. mdelay(10);
  2544. }
  2545. void msdc_soft_reset(struct mmc_host *host)
  2546. {
  2547. u32 base = host->base;
  2548. u32 tmo = 0x0000ffff;
  2549. MSDC_RESET();
  2550. MSDC_SET_FIELD(MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1);
  2551. WAIT_COND((MSDC_READ32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS) == 0, 0xFFFF, tmo);
  2552. if (tmo == 0) {
  2553. MSG(DMA, "[SD%d] MSDC_DMA_CFG_STS != inactive\n", host->id);
  2554. }
  2555. MSDC_CLR_FIFO();
  2556. }
  2557. #endif
  2558. #if defined(MMC_MSDC_DRV_CTP) || defined(MMC_MSDC_DRV_LK)
  2559. void msdc_emmc_hard_reset(struct mmc_host *host)
  2560. {
  2561. u32 base = host->base;
  2562. MSDC_SET_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  2563. //mt_set_gpio_out(PAD_MSDC0_RSTB,GPIO_OUT_ZERO);
  2564. mdelay(10);
  2565. MSDC_CLR_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  2566. //mt_set_gpio_out(PAD_MSDC0_RSTB,GPIO_OUT_ONE);
  2567. }
  2568. #endif
  2569. #ifdef FEATURE_MMC_BOOT_MODE
  2570. int msdc_emmc_boot_start(struct mmc_host *host, u32 hz, int ddr, int mode, int ackdis, u8 hostbuswidth, u64 size)
  2571. {
  2572. int err = MMC_ERR_NONE;
  2573. u32 sts;
  2574. u32 base = host->base;
  2575. u32 tmo = 0xFFFFFFFF;
  2576. u32 acktmo, dattmo;
  2577. u64 acktime, dattime;
  2578. u64 expect_dattime;
  2579. u32 test_timer1;
  2580. u32 test_timer2;
  2581. MSDC_RESET();
  2582. MSDC_CLR_FIFO();
  2583. msdc_set_blklen(host, 512);
  2584. msdc_set_blknum(host, size/512);
  2585. msdc_config_bus(host, hostbuswidth);
  2586. msdc_config_clksrc(host, MSDC50_CLKSRC_26MHZ);
  2587. msdc_config_clock(host, (ddr ? MMC_STATE_DDR : 0), hz, 0);
  2588. //MSDC_SET_FIELD(MSDC_DMA_CFG,3 << 12,0x2);
  2589. //MSDC_SET_FIELD(MSDC_DMA_CFG,3 << 8,0x1);
  2590. /* requires 74 clocks/1ms before CMD0 */
  2591. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  2592. mdelay(2);
  2593. MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  2594. /* configure boot timeout value */
  2595. WAIT_COND(SDC_IS_BUSY() == 0, tmo, tmo);
  2596. acktime = 50 * 1000 * 1000ULL;
  2597. dattime = 1000 * 1000 * 1000ULL;
  2598. acktmo = msdc_cal_timeout(host, acktime, 0, 1<<EMMC_BOOT_TMO_IN_CLK_2POWER); /* 50ms MT6583 MSDC IP eMMC boot timeout unit change to 2^16*/
  2599. expect_dattime = size * 8 / hostbuswidth;
  2600. if (ddr)
  2601. expect_dattime /= 2;
  2602. expect_dattime *= (1000 * 1000 * 1000ULL) / hz;
  2603. if (expect_dattime > dattime)
  2604. dattime = expect_dattime * 2;
  2605. dattmo = msdc_cal_timeout(host, dattime, 0, 1<<EMMC_BOOT_TMO_IN_CLK_2POWER); /* 1sec */
  2606. if (acktmo == 0) acktmo = 1;
  2607. if (dattmo == 0) dattmo = 1;
  2608. acktmo = acktmo > 0xFFE ? 0xFFE : acktmo;
  2609. dattmo = dattmo > 0xFFFFE ? 0xFFFFE : dattmo;
  2610. msdc_printf("[SD%d] EMMC BOOT ACK timeout: %d ms (clkcnt: %d)(host->cur_bus_clk = %d)\n", host->id,
  2611. (acktmo * 65536) / (host->cur_bus_clk / 1000), acktmo, host->cur_bus_clk);
  2612. msdc_printf("[SD%d] EMMC BOOT DAT timeout: %d ms (clkcnt: %d)\n", host->id,
  2613. (dattmo * 65536) / (host->cur_bus_clk / 1000), dattmo);
  2614. msdc_printf("[SD%d] EMMC BOOT ACK %s on host\n", host->id, (ackdis ? "disabled" : "enabled"));
  2615. MSDC_SET_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSUPP);
  2616. MSDC_SET_FIELD(EMMC_CFG0, EMMC_CFG0_BOOTACKDIS, ackdis);
  2617. MSDC_SET_FIELD(EMMC_CFG0, EMMC_CFG0_BOOTMODE, mode);
  2618. MSDC_SET_FIELD(EMMC_CFG1, EMMC_CFG1_BOOTACKTMC, acktmo);
  2619. MSDC_SET_FIELD(EMMC_CFG1, EMMC_CFG1_BOOTDATTMC, dattmo);
  2620. if (mode == EMMC_BOOT_RST_CMD_MODE) {
  2621. MSDC_WRITE32(SDC_ARG, 0xFFFFFFFA);
  2622. } else {
  2623. MSDC_WRITE32(SDC_ARG, 0);
  2624. }
  2625. MSDC_WRITE32(SDC_CMD, 0x02001000); /* bit[12]: 1 multiple block read, 0: single block read */
  2626. #if 0 //init timer to test MT6583 ACK/DAT timeour modification test case
  2627. MSDC_WRITE32(0x10008040,0x31);
  2628. MSDC_WRITE32(0x10008044,0x0);
  2629. test_timer1 = MSDC_READ32(0x10008048);//init timer to test MT6583 ACK/DAT timeour modification test case
  2630. #endif
  2631. MSDC_SET_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSTART);
  2632. WAIT_COND((MSDC_READ32(EMMC_STS) & EMMC_STS_BOOTUPSTATE) == EMMC_STS_BOOTUPSTATE, tmo, tmo);
  2633. if (!ackdis) {
  2634. do {
  2635. sts = MSDC_READ32(EMMC_STS);
  2636. if (sts == 0)
  2637. continue;
  2638. MSDC_WRITE32(EMMC_STS, sts); /* write 1 to clear */
  2639. /* if ack is error, hw will first set bootackrcv bit, then set bootackerr bit
  2640. * so the best way is check EMMC_STS_BOOTACKERR bit after EMMC_STS_BOOTACKRCV bit set*/
  2641. if (sts & EMMC_STS_BOOTACKERR) {
  2642. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up ack error\n", __func__, host->id, sts);
  2643. err = MMC_ERR_BADCRC;
  2644. goto out;
  2645. } else if (sts & EMMC_STS_BOOTACKRCV) {
  2646. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot ack received\n", __func__,host->id, sts);
  2647. break;
  2648. } else if (sts & EMMC_STS_BOOTACKTMO) {
  2649. #if 0
  2650. test_timer2 = MSDC_READ32(0x10008048);
  2651. test_timer1 = (test_timer2 - test_timer1) /6000;
  2652. msdc_printf("[SD%d] EMMC_STS(%x): boot up ack timeout(%d ms)\n", host->id, sts,test_timer1);
  2653. //test MT6583 ACK/DAT timeour modification test case
  2654. #endif
  2655. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up ack timeout\n", __func__,host->id, sts);
  2656. err = MMC_ERR_TIMEOUT;
  2657. goto out;
  2658. } else if (sts & EMMC_STS_BOOTUPSTATE) {
  2659. //msdc_printf("[%s]: [SD%d] EMMC_STS(%x): boot up mode state\n", __func__, host->id, sts);
  2660. } else {
  2661. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up unexpected\n", __func__,host->id, sts);
  2662. }
  2663. } while (1);
  2664. }
  2665. //msdc_printf("ackdis(%d) err(%d)\n",ackdis,err);
  2666. /* check if data received */
  2667. do {
  2668. sts = MSDC_READ32(EMMC_STS);
  2669. if (sts == 0)
  2670. continue;
  2671. if (sts & EMMC_STS_BOOTDATRCV) {
  2672. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot dat received\n", __func__,host->id, sts);
  2673. break;
  2674. }
  2675. if (sts & EMMC_STS_BOOTCRCERR) {
  2676. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up data crc error\n", __func__,host->id, sts);
  2677. err = MMC_ERR_BADCRC;
  2678. goto out;
  2679. } else if (sts & EMMC_STS_BOOTDATTMO) {
  2680. #if 0
  2681. test_timer2 = MSDC_READ32(0x10008048);
  2682. test_timer1 = (test_timer2 - test_timer1) /6000;
  2683. msdc_printf("[%s]: [SD%d] EMMC_STS(%x): boot up data timeout(%d s)\n", __func__,host->id, sts,test_timer1);
  2684. //test MT6583 ACK/DAT timeour modification test case
  2685. #endif
  2686. msdc_printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up data timeout\n", __func__,host->id, sts);
  2687. err = MMC_ERR_TIMEOUT;
  2688. goto out;
  2689. }
  2690. } while (1);
  2691. out:
  2692. return err;
  2693. }
  2694. void msdc_emmc_boot_stop(struct mmc_host *host)
  2695. {
  2696. u32 base = host->base;
  2697. u32 tmo = 0xFFFFFFFF;
  2698. /* Step5. stop the boot mode */
  2699. MSDC_WRITE32(SDC_ARG, 0x00000000);
  2700. MSDC_WRITE32(SDC_CMD, 0x00001000);
  2701. MSDC_SET_FIELD(EMMC_CFG0, EMMC_CFG0_BOOTWDLY, 2);
  2702. MSDC_SET_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSTOP);
  2703. WAIT_COND((MSDC_READ32(EMMC_STS) & EMMC_STS_BOOTUPSTATE) == 0, tmo, tmo);
  2704. /* Step6. */
  2705. MSDC_CLR_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSUPP);
  2706. /* Step7. clear EMMC_STS bits */
  2707. MSDC_WRITE32(EMMC_STS, MSDC_READ32(EMMC_STS));
  2708. }
  2709. int msdc_emmc_boot_read(struct mmc_host *host, u64 size, u32 *to, int read_mode)
  2710. {
  2711. int err = MMC_ERR_NONE;
  2712. int derr = MMC_ERR_NONE;
  2713. u32 sts;
  2714. u64 totalsz = size;
  2715. u32 base = host->base;
  2716. u64 left_sz, xfer_sz;
  2717. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  2718. struct dma_config *cfg = &priv->cfg;
  2719. BUG_ON((read_mode < MSDC_MODE_PIO) && (read_mode > MSDC_MODE_DMA_DESC));
  2720. if (read_mode == MSDC_MODE_PIO) {
  2721. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  2722. while (size) {
  2723. sts = MSDC_READ32(EMMC_STS);
  2724. if (sts & EMMC_STS_BOOTCRCERR) {
  2725. msdc_printf("[SD%d] EMMC_STS(0x%x): boot up data crc error\n", host->id, sts);
  2726. err = MMC_ERR_BADCRC;
  2727. goto out;
  2728. } else if (sts & EMMC_STS_BOOTDATTMO) {
  2729. msdc_printf("[SD%d] EMMC_STS(0x%x): boot up data timeout error\n", host->id, sts);
  2730. err = MMC_ERR_TIMEOUT;
  2731. goto out;
  2732. }
  2733. /* Note. RXFIFO count would be aligned to 4-bytes alignment size */
  2734. if ((size >= MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= MSDC_FIFO_THD)) {
  2735. int left = MSDC_FIFO_THD >> 2;
  2736. do {
  2737. #ifdef MTK_MSDC_DUMP_FIFO
  2738. MSDC_EMMC50_CFG_CRC_STS_SELmsdc_printf("0x%x ",MSDC_FIFO_READ32());
  2739. #else
  2740. *to++ = MSDC_FIFO_READ32();
  2741. #endif
  2742. } while (--left);
  2743. size -= MSDC_FIFO_THD;
  2744. MSG(FIO, "[SD%d] Read %d bytes, RXFIFOCNT: %d, Left: %d/%d\n",
  2745. host->id, MSDC_FIFO_THD, MSDC_RXFIFOCNT(), size, totalsz);
  2746. } else if ((size < MSDC_FIFO_THD) && MSDC_RXFIFOCNT() >= size) {
  2747. while (size) {
  2748. if (size > 3) {
  2749. #ifdef MTK_MSDC_DUMP_FIFO
  2750. msdc_printf("0x%x ",MSDC_FIFO_READ32());
  2751. #else
  2752. *to++ = MSDC_FIFO_READ32();
  2753. #endif
  2754. size -= 4;
  2755. } else {
  2756. #ifdef MTK_MSDC_DUMP_FIFO
  2757. msdc_printf("0x%x ",MSDC_FIFO_READ32());
  2758. #else
  2759. u32 val = MSDC_FIFO_READ32();
  2760. memcpy(to, &val, size);
  2761. #endif
  2762. size = 0;
  2763. }
  2764. }
  2765. MSG(FIO, "[SD%d] Read left bytes, RXFIFOCNT: %d, Left: %d/%d\n",
  2766. host->id, MSDC_RXFIFOCNT(), (u32)size, totalsz);
  2767. }
  2768. }
  2769. out:
  2770. if (err) {
  2771. msdc_printf("[SD%d] EMMC_BOOT: read boot code fail(%d), FIFOCNT=%d\n",
  2772. host->id, err, MSDC_RXFIFOCNT());
  2773. }
  2774. } else {
  2775. //MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  2776. cfg->mode = read_mode;
  2777. left_sz = size;
  2778. if (read_mode == MSDC_MODE_DMA_BASIC) {
  2779. cfg->inboot = 1;
  2780. xfer_sz = left_sz > MAX_DMA_CNT ? MAX_DMA_CNT : left_sz;
  2781. //msdc_set_blknum(host, xfer_sz/512);
  2782. } else {
  2783. xfer_sz = left_sz;
  2784. }
  2785. while (left_sz) {
  2786. u32 base = host->base;
  2787. cfg->xfersz = xfer_sz;
  2788. //msdc_printf("to (0x%x) xfer_sz(0x%x)\n",to,xfer_sz);
  2789. if (cfg->mode == MSDC_MODE_DMA_BASIC) {
  2790. cfg->sglen = 1;
  2791. cfg->sg[0].addr = (u32)to;
  2792. cfg->sg[0].len = xfer_sz;
  2793. msdc_flush_membuf(to, xfer_sz);
  2794. } else {
  2795. cfg->sglen = msdc_sg_init(cfg->sg, to, xfer_sz);
  2796. cfg->flags |= DMA_FLAG_EN_CHKSUM;
  2797. }
  2798. MSDC_DMA_ON();
  2799. /*msdc_printf("xfer_sz(%d),left_sz(%d)\n", (u32)xfer_sz, (u32)left_sz);*/
  2800. msdc_dma_config(host, cfg);
  2801. if (left_sz - xfer_sz != 0)
  2802. MSDC_SET_FIELD(MSDC_DMA_CTRL, MSDC_DMA_CTRL_LASTBUF, 0);
  2803. msdc_dma_start(host);
  2804. err = derr = msdc_dma_wait_done(host, 0xFFFFFFFF);
  2805. msdc_dma_stop(host);
  2806. msdc_flush_membuf(to, xfer_sz);
  2807. if (err != MMC_ERR_NONE)
  2808. goto done;
  2809. to =(u8*)to + xfer_sz;
  2810. left_sz -= xfer_sz;
  2811. /* left_sz > 0 only when in basic dma mode */
  2812. if (left_sz) {
  2813. xfer_sz = (xfer_sz > left_sz) ? left_sz : xfer_sz;
  2814. }
  2815. }
  2816. done:
  2817. if (derr != MMC_ERR_NONE) {
  2818. msdc_printf("[SD%d] EMMC boot read error(%d)\n", host->id,derr);
  2819. msdc_abort_handler(host, 1);
  2820. }
  2821. }
  2822. return err;
  2823. }
  2824. void msdc_emmc_boot_reset(struct mmc_host *host, int reset)
  2825. {
  2826. u32 base = host->base;
  2827. u32 wints = MSDC_INT_CMDRDY | MSDC_INT_CMDTMO;
  2828. u32 l_arg, l_cmd, status;
  2829. u32 tmo=0xffffffff;
  2830. switch (reset) {
  2831. case EMMC_BOOT_PWR_RESET:
  2832. msdc_hard_reset(host);
  2833. break;
  2834. case EMMC_BOOT_RST_N_SIG:
  2835. if (msdc_cap[host->id].flags & MSDC_RST_PIN_EN) {
  2836. /* set n_reset pin to low */
  2837. MSDC_SET_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  2838. /* tRSTW (RST_n pulse width) at least 1us */
  2839. mdelay(1);
  2840. /* set n_reset pin to high, mark this line if do boot ACK & boot DAT timeout test */
  2841. MSDC_CLR_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  2842. /* tRSCA (RST_n to command time) at least 200us,
  2843. tRSTH (RST_n high period) at least 1us */
  2844. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  2845. mdelay(1);
  2846. MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  2847. }
  2848. break;
  2849. case EMMC_BOOT_PRE_IDLE_CMD:
  2850. /* bring emmc to pre-idle mode by software reset command. (MMCv4.41)*/
  2851. SDC_SEND_CMD(0x0, 0xF0F0F0F0);
  2852. /* read SDC_ARG & SDC_CMD for avoid buffered register */
  2853. l_arg = MSDC_READ32(SDC_ARG);
  2854. l_cmd = MSDC_READ32(SDC_CMD);
  2855. /* check cmd0 is send */
  2856. status = msdc_intr_wait(host, wints);
  2857. if (status & MSDC_INT_CMDTMO) {
  2858. msdc_printf("[SD%d] CMD0:ERR(CMDTO)\n", host->id);
  2859. }
  2860. mdelay(1); //need delay to make sure pre-idle
  2861. break;
  2862. }
  2863. }
  2864. #endif
  2865. int msdc_init(int id, struct mmc_host *host, int clksrc, int mode)
  2866. {
  2867. u32 baddr[] = {MSDC0_BASE, MSDC1_BASE, MSDC2_BASE, MSDC3_BASE};
  2868. u32 base = baddr[id];
  2869. msdc_priv_t *priv;
  2870. struct dma_config *cfg;
  2871. msdc_printf("[%s]: msdc%d Host controller intialization start \n", __func__, id);
  2872. clksrc = (clksrc == -1) ? msdc_cap[id].clk_src : clksrc;
  2873. priv = &msdc_priv[id];
  2874. cfg = &priv->cfg;
  2875. memset(priv, 0, sizeof(msdc_priv_t));
  2876. host->id = id;
  2877. host->base = base;
  2878. #if defined(MMC_MSDC_DRV_CTP)
  2879. #if !defined(FPGA_PLATFORM)
  2880. if (host->id == 0) {
  2881. msdc_src_clks = hclks_msdc50;
  2882. } else {
  2883. msdc_src_clks = hclks_msdc30;
  2884. }
  2885. host->f_max = msdc_src_clks[clksrc];
  2886. #else
  2887. host->f_max = msdc_src_clks[clksrc];
  2888. #endif
  2889. #else
  2890. #if !defined(FPGA_PLATFORM)
  2891. host->f_max = MSDC_MAX_SCLK;
  2892. #else
  2893. host->f_max = MSDC_MAX_SCLK>>1;
  2894. #endif
  2895. #endif
  2896. host->f_min = MSDC_MIN_SCLK;
  2897. host->blkbits= MMC_BLOCK_BITS;
  2898. host->blklen = 0;
  2899. host->priv = (void*)priv;
  2900. host->caps = MMC_CAP_MULTIWRITE;
  2901. if (msdc_cap[id].flags & MSDC_HIGHSPEED)
  2902. host->caps |= (MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED);
  2903. #if defined(FEATURE_MMC_UHS1)
  2904. if (msdc_cap[id].flags & MSDC_UHS1)
  2905. host->caps |= MMC_CAP_SD_UHS1;
  2906. #endif
  2907. if (msdc_cap[id].flags & MSDC_DDR)
  2908. host->caps |= MMC_CAP_DDR;
  2909. if (msdc_cap[id].data_pins == 4)
  2910. host->caps |= MMC_CAP_4_BIT_DATA;
  2911. if (msdc_cap[id].data_pins == 8)
  2912. host->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA;
  2913. if (msdc_cap[id].flags & MSDC_HS200)
  2914. host->caps |= MMC_CAP_EMMC_HS200;
  2915. if (msdc_cap[id].flags & MSDC_HS400)
  2916. host->caps |= MMC_CAP_EMMC_HS400;
  2917. host->ocr_avail = MMC_VDD_27_36;
  2918. /* msdc0 only support 1.8 IO */
  2919. if (host->caps & (MMC_CAP_EMMC_HS200 | MMC_CAP_EMMC_HS400))
  2920. host->ocr_avail |= MMC_VDD_165_195;
  2921. host->max_hw_segs = MAX_DMA_TRAN_SIZE/512;
  2922. host->max_phys_segs = MAX_DMA_TRAN_SIZE/512;
  2923. host->max_seg_size = MAX_DMA_TRAN_SIZE;
  2924. host->max_blk_size = 2048;
  2925. host->max_blk_count = 65535;
  2926. host->app_cmd = 0;
  2927. host->app_cmd_arg = 0;
  2928. priv->rdsmpl = msdc_cap[id].data_edge;
  2929. priv->wdsmpl = msdc_cap[id].data_edge;
  2930. priv->rsmpl = msdc_cap[id].cmd_edge;
  2931. #if defined(MSDC_ENABLE_DMA_MODE)
  2932. cfg->sg = &priv->sg[0];
  2933. cfg->burstsz = MSDC_BRUST_64B;
  2934. cfg->flags = DMA_FLAG_NONE;
  2935. cfg->mode = mode;
  2936. cfg->inboot = 0;
  2937. msdc_init_gpd_bd(host);
  2938. priv->alloc_bd = 0;
  2939. priv->alloc_gpd = 0;
  2940. priv->active_head = NULL;
  2941. priv->active_tail = NULL;
  2942. #endif
  2943. #if defined(FPGA_PLATFORM)
  2944. //MSDC_WRITE32(PWR_GPIO_EO, PWR_MSDC); //setup GPIO mode (GPO or GPI)
  2945. //msdc_printf("set up PWR GPIO for MSDC\n");
  2946. #endif
  2947. // set current power level: VOL_1800 or VOL_3300
  2948. #if defined(USE_SDIO_1V8)
  2949. if ( host->id!=0 ) {
  2950. host->cur_pwr = VOL_1800;
  2951. } else
  2952. #endif
  2953. {
  2954. #if defined(FPGA_PLATFORM)
  2955. #if MSDC_USE_EMMC45_POWER
  2956. host->cur_pwr = VOL_1800;
  2957. #else
  2958. host->cur_pwr = VOL_3300;
  2959. #endif
  2960. #else
  2961. if ( host->id==0 )
  2962. host->cur_pwr = VOL_1800;
  2963. else
  2964. host->cur_pwr = VOL_3300;
  2965. #endif
  2966. }
  2967. msdc_clock(host, 1);
  2968. /* Turn on to match sw status and hw status
  2969. since VEMC/VMC/VMCH are default on */
  2970. msdc_power(host, MMC_POWER_ON);
  2971. msdc_power(host, MMC_POWER_OFF);
  2972. msdc_power(host, MMC_POWER_ON);
  2973. /* set to SD/MMC mode */
  2974. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC);
  2975. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  2976. MSDC_RESET();
  2977. MSDC_CLR_FIFO();
  2978. MSDC_CLR_INT();
  2979. /* Disable async fifo use internal delay*/
  2980. /* Commentted out and-then moved into msdc_init_tune_path
  2981. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTS);
  2982. MSDC_SET_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGRESP);
  2983. */
  2984. /* enable SDIO mode. it's must otherwise sdio command failed */
  2985. MSDC_SET_BIT32(SDC_CFG, SDC_CFG_SDIO);
  2986. /* disable detect SDIO device interupt function */
  2987. MSDC_CLR_BIT32(SDC_CFG, SDC_CFG_SDIOIDE);
  2988. /* enable wake up events */
  2989. #if defined(MMC_MSDC_DRV_CTP)
  2990. MSDC_SET_BIT32(SDC_CFG, SDC_CFG_INSWKUP);
  2991. #endif
  2992. /* reset tuning parameter */
  2993. msdc_reset_timing_register(host);
  2994. #if defined(FEATURE_ASYNC_PATH_ENABLE)
  2995. msdc_init_tune_path(host, MSDC_PATH_USE_ASYNC_FIFO, 0);
  2996. #else
  2997. msdc_init_tune_path(host, MSDC_PATH_USE_DELAY_LINE, 0);
  2998. #endif
  2999. /* Disable support 64G */
  3000. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_SUPPORT64G);
  3001. #if !defined(FPGA_PLATFORM)
  3002. msdc_gpio_and_pad_init(host);
  3003. #endif
  3004. /* disable boot function, else eMMC intialization may be failed after BROM ops. */
  3005. MSDC_CLR_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSUPP);
  3006. /* set sampling edge */
  3007. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, msdc_cap[host->id].cmd_edge);
  3008. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, msdc_cap[host->id].data_edge);
  3009. /* write crc timeout detection */
  3010. MSDC_SET_FIELD(MSDC_PATCH_BIT0, 1 << 30, 1);
  3011. #if defined(MMC_MSDC_DRV_CTP)
  3012. #if (MSDC_USE_FORCE_FLUSH || MSDC_USE_RELIABLE_WRITE || MSDC_USE_DATA_TAG || MSDC_USE_PACKED_CMD)
  3013. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 0);
  3014. #else
  3015. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 1);
  3016. #endif
  3017. #endif
  3018. msdc_set_startbit(host, START_AT_RISING);
  3019. msdc_config_clksrc(host, clksrc);
  3020. msdc_config_bus(host, HOST_BUS_WIDTH_1);
  3021. msdc_config_clock(host, 0, MSDC_MIN_SCLK, 0);
  3022. msdc_set_dmode(host, mode);
  3023. msdc_set_pio_bits(host, 32);
  3024. /* disable sdio interrupt by default. sdio interrupt enable upon request */
  3025. msdc_intr_unmask(host, 0x0001FF7B);
  3026. msdc_irq_init(host);
  3027. msdc_set_timeout(host, 100000000, 0);
  3028. #if defined(FEATURE_MMC_CARD_DETECT)
  3029. msdc_card_detect(host, 1);
  3030. #endif
  3031. #if defined(MSDC_USE_DCM) && defined(MMC_MSDC_DRV_CTP)
  3032. #if !defined(MTKDRV_DCM)
  3033. #error please turn on DCM driver before enable MSDC DCM
  3034. #endif
  3035. dcm_disable(ALL_DCM);
  3036. dcm_enable(MSDC_DCM);
  3037. #endif
  3038. if ((host->id == 0) || (host->id == 1)) {
  3039. /* disable SDIO func */
  3040. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_SDIO, 0);
  3041. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_SDIOIDE, 0);
  3042. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_INSWKUP, 0);
  3043. }
  3044. msdc_printf("[%s]: msdc%d Host controller intialization done\n", __func__, id);
  3045. return 0;
  3046. }
  3047. #if defined(MSDC_WITH_DEINIT)
  3048. int msdc_deinit(struct mmc_host *host)
  3049. {
  3050. u32 base = host->base;
  3051. #if defined(FEATURE_MMC_CARD_DETECT)
  3052. msdc_card_detect(host, 0);
  3053. #endif
  3054. msdc_intr_mask(host, 0x0001FFFB);
  3055. msdc_irq_deinit(host);
  3056. MSDC_RESET();
  3057. MSDC_CLR_FIFO();
  3058. MSDC_CLR_INT();
  3059. msdc_power(host, MMC_POWER_OFF);
  3060. return 0;
  3061. }
  3062. #endif
  3063. int msdc_polling_CD_interrupt(struct mmc_host *host)
  3064. {
  3065. u32 base = host->base;
  3066. u32 intsts;
  3067. intsts = MSDC_READ32(MSDC_INT);
  3068. MSDC_WRITE32(MSDC_INT, intsts);
  3069. //msdc_printf("SDIO INT(0x%x)\n",intsts);
  3070. if (intsts & MSDC_INT_CDSC)
  3071. return 1;
  3072. else
  3073. return 0;
  3074. }