msdc.c 106 KB

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