mmc_core.c 108 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
  6. * the prior written permission of MediaTek inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of MediaTek Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * MediaTek Inc. (C) 2010. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  15. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
  25. * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
  30. * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  32. *
  33. * The following software/firmware and/or related documentation ("MediaTek
  34. * Software") have been modified by MediaTek Inc. All revisions are subject to
  35. * any receiver's applicable license agreements with MediaTek Inc.
  36. */
  37. /*=======================================================================*/
  38. /* HEADER FILES */
  39. /*=======================================================================*/
  40. #include "msdc.h"
  41. #define NR_MMC (MSDC_MAX_NUM)
  42. //#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
  43. static struct mmc_host sd_host[NR_MMC];
  44. static struct mmc_card sd_card[NR_MMC];
  45. static const unsigned int tran_exp[] = {
  46. 10000, 100000, 1000000, 10000000,
  47. 0, 0, 0, 0
  48. };
  49. static const unsigned char tran_mant[] = {
  50. 0, 10, 12, 13, 15, 20, 25, 30,
  51. 35, 40, 45, 50, 55, 60, 70, 80,
  52. };
  53. static const unsigned char mmc_tran_mant[] = {
  54. 0, 10, 12, 13, 15, 20, 26, 30,
  55. 35, 40, 45, 52, 55, 60, 70, 80,
  56. };
  57. static const unsigned int tacc_exp[] = {
  58. 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
  59. };
  60. static const unsigned int tacc_mant[] = {
  61. 0, 10, 12, 13, 15, 20, 25, 30,
  62. 35, 40, 45, 50, 55, 60, 70, 80,
  63. };
  64. /**** valid size: 1~32 ****/
  65. static u32 unstuff_bits(u32 *resp, u32 start, u32 size)
  66. {
  67. const u32 __mask = (~(u32)0) >> (32 - size);
  68. const int __off = 3 - ((start) / 32);
  69. const int __shft = (start) & 31;
  70. u32 __res;
  71. __res = resp[__off] >> __shft;
  72. if ((size) + __shft >= 32)
  73. __res |= resp[__off-1] << (32 - __shft);
  74. return __res & __mask;
  75. }
  76. #ifdef MTK_EMMC_POWER_ON_WP
  77. int mmc_set_write_protect_by_group(struct mmc_card *card,
  78. Region partition,unsigned long blknr,u32 blkcnt, EMMC_WP_TYPE type);
  79. #endif
  80. #ifdef MMC_PROFILING
  81. static void mmc_prof_card_init(void *data, ulong id, ulong counts)
  82. {
  83. int err = (int)data;
  84. if (!err) {
  85. printf("[SD%d] Init Card, %d counts, %d us\n",
  86. id, counts, counts * 30 + counts * 16960 / 32768);
  87. }
  88. }
  89. static void mmc_prof_read(void *data, ulong id, ulong counts)
  90. {
  91. struct mmc_op_perf *perf = (struct mmc_op_perf *)data;
  92. struct mmc_op_report *rpt;
  93. u32 blksz = perf->host->blklen;
  94. u32 blkcnt = (u32)id;
  95. if (blkcnt > 1)
  96. rpt = &perf->multi_blks_read;
  97. else
  98. rpt = &perf->single_blk_read;
  99. rpt->count++;
  100. rpt->total_size += blkcnt * blksz;
  101. rpt->total_time += counts;
  102. if ((counts < rpt->min_time) || (rpt->min_time == 0))
  103. rpt->min_time = counts;
  104. if ((counts > rpt->max_time) || (rpt->max_time == 0))
  105. rpt->max_time = counts;
  106. printf("[SD%d] Read %d bytes, %d counts, %d us, %d KB/s, Avg: %d KB/s\n",
  107. perf->host->id, blkcnt * blksz, counts,
  108. counts * 30 + counts * 16960 / 32768,
  109. blkcnt * blksz * 32 / (counts ? counts : 1),
  110. ((rpt->total_size / 1024) * 32768) / rpt->total_time);
  111. }
  112. static void mmc_prof_write(void *data, ulong id, ulong counts)
  113. {
  114. struct mmc_op_perf *perf = (struct mmc_op_perf *)data;
  115. struct mmc_op_report *rpt;
  116. u32 blksz = perf->host->blklen;
  117. u32 blkcnt = (u32)id;
  118. if (blkcnt > 1)
  119. rpt = &perf->multi_blks_write;
  120. else
  121. rpt = &perf->single_blk_write;
  122. rpt->count++;
  123. rpt->total_size += blkcnt * blksz;
  124. rpt->total_time += counts;
  125. if ((counts < rpt->min_time) || (rpt->min_time == 0))
  126. rpt->min_time = counts;
  127. if ((counts > rpt->max_time) || (rpt->max_time == 0))
  128. rpt->max_time = counts;
  129. printf("[SD%d] Write %d bytes, %d counts, %d us, %d KB/s, Avg: %d KB/s\n",
  130. perf->host->id, blkcnt * blksz, counts,
  131. counts * 30 + counts * 16960 / 32768,
  132. blkcnt * blksz * 32 / (counts ? counts : 1),
  133. ((rpt->total_size / 1024) * 32768) / rpt->total_time);
  134. }
  135. #endif
  136. #if MMC_DEBUG
  137. void mmc_dump_card_status(u32 card_status)
  138. {
  139. msdc_dump_card_status(card_status);
  140. }
  141. static void mmc_dump_ocr_reg(u32 resp)
  142. {
  143. msdc_dump_ocr_reg(resp);
  144. }
  145. static void mmc_dump_rca_resp(u32 resp)
  146. {
  147. msdc_dump_rca_resp(resp);
  148. }
  149. static void mmc_dump_tuning_blk(u8 *buf)
  150. {
  151. int i;
  152. for (i = 0; i < 16; i++) {
  153. printf("[TBLK%d] %x%x%x%x%x%x%x%x\n", i,
  154. (buf[(i<<2)] >> 4) & 0xF, buf[(i<<2)] & 0xF,
  155. (buf[(i<<2)+1] >> 4) & 0xF, buf[(i<<2)+1] & 0xF,
  156. (buf[(i<<2)+2] >> 4) & 0xF, buf[(i<<2)+2] & 0xF,
  157. (buf[(i<<2)+3] >> 4) & 0xF, buf[(i<<2)+3] & 0xF);
  158. }
  159. }
  160. static void mmc_dump_csd(struct mmc_card *card)
  161. {
  162. struct mmc_csd *csd = &card->csd;
  163. u32 *resp = card->raw_csd;
  164. int i;
  165. unsigned int csd_struct;
  166. static char *sd_csd_ver[] = {"v1.0", "v2.0"};
  167. static char *mmc_csd_ver[] = {"v1.0", "v1.1", "v1.2", "Ver. in EXT_CSD"};
  168. static char *mmc_cmd_cls[] = {"basic", "stream read", "block read",
  169. "stream write", "block write", "erase", "write prot", "lock card",
  170. "app-spec", "I/O", "rsv.", "rsv."};
  171. static char *sd_cmd_cls[] = {"basic", "rsv.", "block read",
  172. "rsv.", "block write", "erase", "write prot", "lock card",
  173. "app-spec", "I/O", "switch", "rsv."};
  174. if (mmc_card_sd(card)) {
  175. csd_struct = unstuff_bits(resp, 126, 2);
  176. printf("[CSD] CSD %s\n", sd_csd_ver[csd_struct]);
  177. printf("[CSD] TACC_NS: %d ns, TACC_CLKS: %d clks\n", csd->tacc_ns, csd->tacc_clks);
  178. if (csd_struct == 1) {
  179. printf("[CSD] Read/Write Blk Len = 512bytes\n");
  180. } else {
  181. printf("[CSD] Read Blk Len = %d, Write Blk Len = %d\n",
  182. 1 << csd->read_blkbits, 1 << csd->write_blkbits);
  183. }
  184. printf("[CSD] CMD Class:");
  185. for (i = 0; i < 12; i++) {
  186. if ((csd->cmdclass >> i) & 0x1)
  187. printf("'%s' ", sd_cmd_cls[i]);
  188. }
  189. printf("\n");
  190. } else {
  191. csd_struct = unstuff_bits(resp, 126, 2);
  192. printf("[CSD] CSD %s\n", mmc_csd_ver[csd_struct]);
  193. printf("[CSD] MMCA Spec v%d\n", csd->mmca_vsn);
  194. printf("[CSD] TACC_NS: %d ns, TACC_CLKS: %d clks\n", csd->tacc_ns, csd->tacc_clks);
  195. printf("[CSD] Read Blk Len = %d, Write Blk Len = %d\n",
  196. 1 << csd->read_blkbits, 1 << csd->write_blkbits);
  197. printf("[CSD] CMD Class:");
  198. for (i = 0; i < 12; i++) {
  199. if ((csd->cmdclass >> i) & 0x1)
  200. printf("'%s' ", mmc_cmd_cls[i]);
  201. }
  202. printf("\n");
  203. }
  204. }
  205. void mmc_dump_ext_csd(struct mmc_card *card)
  206. {
  207. u8 *ext_csd = &card->raw_ext_csd[0];
  208. u32 tmp;
  209. char *rev[] = {"4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1"};
  210. printf("===========================================================\n");
  211. printf("[EXT_CSD] EXT_CSD rev. : v1.%d (MMCv%s)\n",
  212. ext_csd[EXT_CSD_REV], rev[ext_csd[EXT_CSD_REV]]);
  213. printf("[EXT_CSD] CSD struct rev. : v1.%d\n", ext_csd[EXT_CSD_STRUCT]);
  214. printf("[EXT_CSD] Supported command sets : %xh\n", ext_csd[EXT_CSD_S_CMD_SET]);
  215. printf("[EXT_CSD] HPI features : %xh\n", ext_csd[EXT_CSD_HPI_FEATURE]);
  216. printf("[EXT_CSD] BG operations support : %xh\n", ext_csd[EXT_CSD_BKOPS_SUPP]);
  217. printf("[EXT_CSD] BG operations status : %xh\n", ext_csd[EXT_CSD_BKOPS_STATUS]);
  218. memcpy(&tmp, &ext_csd[EXT_CSD_CORRECT_PRG_SECTS_NUM], 4);
  219. printf("[EXT_CSD] Correct prg. sectors : %xh\n", tmp);
  220. printf("[EXT_CSD] 1st init time after part. : %d ms\n", ext_csd[EXT_CSD_INI_TIMEOUT_AP] * 100);
  221. printf("[EXT_CSD] Min. write perf.(DDR,52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_DDR_W_8_52]);
  222. printf("[EXT_CSD] Min. read perf. (DDR,52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_DDR_R_8_52]);
  223. printf("[EXT_CSD] TRIM timeout: %d ms\n", ext_csd[EXT_CSD_TRIM_MULT] & 0xFF * 300);
  224. printf("[EXT_CSD] Secure feature support: %xh\n", ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]);
  225. printf("[EXT_CSD] Secure erase timeout : %d ms\n", 300 *
  226. ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] * ext_csd[EXT_CSD_SEC_ERASE_MULT]);
  227. printf("[EXT_CSD] Secure trim timeout : %d ms\n", 300 *
  228. ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] * ext_csd[EXT_CSD_SEC_TRIM_MULT]);
  229. printf("[EXT_CSD] Access size : %d bytes\n", ext_csd[EXT_CSD_ACC_SIZE] * 512);
  230. printf("[EXT_CSD] HC erase unit size : %d kbytes\n", ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512);
  231. printf("[EXT_CSD] HC erase timeout : %d ms\n", ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] * 300);
  232. printf("[EXT_CSD] HC write prot grp size: %d kbytes\n", 512 *
  233. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * ext_csd[EXT_CSD_HC_WP_GPR_SIZE]);
  234. printf("[EXT_CSD] HC erase grp def. : %xh\n", ext_csd[EXT_CSD_ERASE_GRP_DEF]);
  235. printf("[EXT_CSD] Reliable write sect count: %xh\n", ext_csd[EXT_CSD_REL_WR_SEC_C]);
  236. printf("[EXT_CSD] Sleep current (VCC) : %xh\n", ext_csd[EXT_CSD_S_C_VCC]);
  237. printf("[EXT_CSD] Sleep current (VCCQ): %xh\n", ext_csd[EXT_CSD_S_C_VCCQ]);
  238. printf("[EXT_CSD] Sleep/awake timeout : %d ns\n",
  239. 100 * (2 << ext_csd[EXT_CSD_S_A_TIMEOUT]));
  240. memcpy(&tmp, &ext_csd[EXT_CSD_SEC_CNT], 4);
  241. printf("[EXT_CSD] Sector count : %xh\n", tmp);
  242. printf("[EXT_CSD] Min. WR Perf. (52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_W_8_52]);
  243. printf("[EXT_CSD] Min. Read Perf.(52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_R_8_52]);
  244. printf("[EXT_CSD] Min. WR Perf. (26MH,8b,52MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_W_8_26_4_25]);
  245. printf("[EXT_CSD] Min. Read Perf.(26MH,8b,52MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_R_8_26_4_25]);
  246. printf("[EXT_CSD] Min. WR Perf. (26MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_W_4_26]);
  247. printf("[EXT_CSD] Min. Read Perf.(26MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_R_4_26]);
  248. printf("[EXT_CSD] Power class: %x\n", ext_csd[EXT_CSD_PWR_CLASS]);
  249. printf("[EXT_CSD] Power class(DDR,52MH,3.6V): %xh\n", ext_csd[EXT_CSD_PWR_CL_DDR_52_360]);
  250. printf("[EXT_CSD] Power class(DDR,52MH,1.9V): %xh\n", ext_csd[EXT_CSD_PWR_CL_DDR_52_195]);
  251. printf("[EXT_CSD] Power class(26MH,3.6V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_26_360]);
  252. printf("[EXT_CSD] Power class(52MH,3.6V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_52_360]);
  253. printf("[EXT_CSD] Power class(26MH,1.9V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_26_195]);
  254. printf("[EXT_CSD] Power class(52MH,1.9V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_52_195]);
  255. printf("[EXT_CSD] Part. switch timing : %xh\n", ext_csd[EXT_CSD_PART_SWITCH_TIME]);
  256. printf("[EXT_CSD] Out-of-INTR busy timing: %xh\n", ext_csd[EXT_CSD_OUT_OF_INTR_TIME]);
  257. printf("[EXT_CSD] Card type : %xh\n", ext_csd[EXT_CSD_CARD_TYPE]);
  258. printf("[EXT_CSD] Command set : %xh\n", ext_csd[EXT_CSD_CMD_SET]);
  259. printf("[EXT_CSD] Command set rev.: %xh\n", ext_csd[EXT_CSD_CMD_SET_REV]);
  260. printf("[EXT_CSD] HS timing : %xh\n", ext_csd[EXT_CSD_HS_TIMING]);
  261. printf("[EXT_CSD] Bus width : %xh\n", ext_csd[EXT_CSD_BUS_WIDTH]);
  262. printf("[EXT_CSD] Erase memory content : %xh\n", ext_csd[EXT_CSD_ERASED_MEM_CONT]);
  263. printf("[EXT_CSD] Partition config : %xh\n", ext_csd[EXT_CSD_PART_CFG]);
  264. printf("[EXT_CSD] Boot partition size : %d kbytes\n", ext_csd[EXT_CSD_BOOT_SIZE_MULT] * 128);
  265. printf("[EXT_CSD] Boot information : %xh\n", ext_csd[EXT_CSD_BOOT_INFO]);
  266. printf("[EXT_CSD] Boot config protection: %xh\n", ext_csd[EXT_CSD_BOOT_CONFIG_PROT]);
  267. printf("[EXT_CSD] Boot bus width : %xh\n", ext_csd[EXT_CSD_BOOT_BUS_WIDTH]);
  268. printf("[EXT_CSD] Boot area write prot : %xh\n", ext_csd[EXT_CSD_BOOT_WP]);
  269. printf("[EXT_CSD] User area write prot : %xh\n", ext_csd[EXT_CSD_USR_WP]);
  270. printf("[EXT_CSD] FW configuration : %xh\n", ext_csd[EXT_CSD_FW_CONFIG]);
  271. printf("[EXT_CSD] RPMB size : %d kbytes\n", ext_csd[EXT_CSD_RPMB_SIZE_MULT] * 128);
  272. printf("[EXT_CSD] Write rel. setting : %xh\n", ext_csd[EXT_CSD_WR_REL_SET]);
  273. printf("[EXT_CSD] Write rel. parameter: %xh\n", ext_csd[EXT_CSD_WR_REL_PARAM]);
  274. printf("[EXT_CSD] Start background ops : %xh\n", ext_csd[EXT_CSD_BKOPS_START]);
  275. printf("[EXT_CSD] Enable background ops: %xh\n", ext_csd[EXT_CSD_BKOPS_EN]);
  276. printf("[EXT_CSD] H/W reset function : %xh\n", ext_csd[EXT_CSD_RST_N_FUNC]);
  277. printf("[EXT_CSD] HPI management : %xh\n", ext_csd[EXT_CSD_HPI_MGMT]);
  278. memcpy(&tmp, &ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT], 4);
  279. printf("[EXT_CSD] Max. enhanced area size : %xh (%d kbytes)\n",
  280. tmp & 0x00FFFFFF, (tmp & 0x00FFFFFF) * 512 *
  281. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  282. printf("[EXT_CSD] Part. support : %xh\n", ext_csd[EXT_CSD_PART_SUPPORT]);
  283. printf("[EXT_CSD] Part. attribute: %xh\n", ext_csd[EXT_CSD_PART_ATTR]);
  284. printf("[EXT_CSD] Part. setting : %xh\n", ext_csd[EXT_CSD_PART_SET_COMPL]);
  285. printf("[EXT_CSD] General purpose 1 size : %xh (%d kbytes)\n",
  286. (ext_csd[EXT_CSD_GP1_SIZE_MULT + 0] |
  287. ext_csd[EXT_CSD_GP1_SIZE_MULT + 1] << 8 |
  288. ext_csd[EXT_CSD_GP1_SIZE_MULT + 2] << 16),
  289. (ext_csd[EXT_CSD_GP1_SIZE_MULT + 0] |
  290. ext_csd[EXT_CSD_GP1_SIZE_MULT + 1] << 8 |
  291. ext_csd[EXT_CSD_GP1_SIZE_MULT + 2] << 16) * 512 *
  292. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  293. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  294. printf("[EXT_CSD] General purpose 2 size : %xh (%d kbytes)\n",
  295. (ext_csd[EXT_CSD_GP2_SIZE_MULT + 0] |
  296. ext_csd[EXT_CSD_GP2_SIZE_MULT + 1] << 8 |
  297. ext_csd[EXT_CSD_GP2_SIZE_MULT + 2] << 16),
  298. (ext_csd[EXT_CSD_GP2_SIZE_MULT + 0] |
  299. ext_csd[EXT_CSD_GP2_SIZE_MULT + 1] << 8 |
  300. ext_csd[EXT_CSD_GP2_SIZE_MULT + 2] << 16) * 512 *
  301. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  302. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  303. printf("[EXT_CSD] General purpose 3 size : %xh (%d kbytes)\n",
  304. (ext_csd[EXT_CSD_GP3_SIZE_MULT + 0] |
  305. ext_csd[EXT_CSD_GP3_SIZE_MULT + 1] << 8 |
  306. ext_csd[EXT_CSD_GP3_SIZE_MULT + 2] << 16),
  307. (ext_csd[EXT_CSD_GP3_SIZE_MULT + 0] |
  308. ext_csd[EXT_CSD_GP3_SIZE_MULT + 1] << 8 |
  309. ext_csd[EXT_CSD_GP3_SIZE_MULT + 2] << 16) * 512 *
  310. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  311. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  312. printf("[EXT_CSD] General purpose 4 size : %xh (%d kbytes)\n",
  313. (ext_csd[EXT_CSD_GP4_SIZE_MULT + 0] |
  314. ext_csd[EXT_CSD_GP4_SIZE_MULT + 1] << 8 |
  315. ext_csd[EXT_CSD_GP4_SIZE_MULT + 2] << 16),
  316. (ext_csd[EXT_CSD_GP4_SIZE_MULT + 0] |
  317. ext_csd[EXT_CSD_GP4_SIZE_MULT + 1] << 8 |
  318. ext_csd[EXT_CSD_GP4_SIZE_MULT + 2] << 16) * 512 *
  319. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  320. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  321. printf("[EXT_CSD] Enh. user area size : %xh (%d kbytes)\n",
  322. (ext_csd[EXT_CSD_ENH_SIZE_MULT + 0] |
  323. ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8 |
  324. ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16),
  325. (ext_csd[EXT_CSD_ENH_SIZE_MULT + 0] |
  326. ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8 |
  327. ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) * 512 *
  328. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  329. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  330. printf("[EXT_CSD] Enh. user area start: %xh\n",
  331. (ext_csd[EXT_CSD_ENH_START_ADDR + 0] |
  332. ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8 |
  333. ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16 |
  334. ext_csd[EXT_CSD_ENH_START_ADDR + 3]) << 24);
  335. printf("[EXT_CSD] Bad block mgmt mode: %xh\n", ext_csd[EXT_CSD_BADBLK_MGMT]);
  336. printf("===========================================================\n");
  337. }
  338. #endif
  339. #if defined(FEATURE_MMC_CARD_DETECT)
  340. int mmc_card_avail(struct mmc_host *host)
  341. {
  342. return msdc_card_avail(host);
  343. }
  344. #endif
  345. #if defined(MMC_MSDC_DRV_CTP)
  346. int mmc_card_protected(struct mmc_host *host)
  347. {
  348. return msdc_card_protected(host);
  349. }
  350. #endif
  351. struct mmc_host *mmc_get_host(int id)
  352. {
  353. return &sd_host[id];
  354. }
  355. struct mmc_card *mmc_get_card(int id)
  356. {
  357. return &sd_card[id];
  358. }
  359. int mmc_cmd(struct mmc_host *host, struct mmc_command *cmd)
  360. {
  361. int err;
  362. int retry = cmd->retries;
  363. do {
  364. err = msdc_cmd(host, cmd);
  365. if (err == MMC_ERR_NONE)
  366. break;
  367. /* Break retry, just retrun erase seq fail */
  368. if (err == MMC_ERR_ERASE_SEQ)
  369. break;
  370. } while (retry--);
  371. return err;
  372. }
  373. static int mmc_app_cmd(struct mmc_host *host, struct mmc_command *cmd,
  374. u32 rca, int retries)
  375. {
  376. int err = MMC_ERR_FAILED;
  377. struct mmc_command appcmd;
  378. appcmd.opcode = MMC_CMD_APP_CMD;
  379. appcmd.arg = rca << 16;
  380. appcmd.rsptyp = RESP_R1;
  381. appcmd.retries = CMD_RETRIES;
  382. appcmd.timeout = CMD_TIMEOUT;
  383. do {
  384. err = mmc_cmd(host, &appcmd);
  385. if (err == MMC_ERR_NONE)
  386. err = mmc_cmd(host, cmd);
  387. if (err == MMC_ERR_NONE)
  388. break;
  389. } while (retries--);
  390. return err;
  391. }
  392. u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
  393. {
  394. int bit;
  395. ocr &= host->ocr_avail;
  396. bit = uffs(ocr);
  397. if (bit) {
  398. bit -= 1;
  399. ocr &= 3 << bit;
  400. } else {
  401. ocr = 0;
  402. }
  403. return ocr;
  404. }
  405. int mmc_go_idle(struct mmc_host *host)
  406. {
  407. struct mmc_command cmd;
  408. cmd.opcode = MMC_CMD_GO_IDLE_STATE;
  409. cmd.rsptyp = RESP_NONE;
  410. cmd.arg = 0;
  411. cmd.retries = CMD_RETRIES;
  412. cmd.timeout = CMD_TIMEOUT;
  413. return mmc_cmd(host, &cmd);
  414. }
  415. int mmc_go_irq_state(struct mmc_host *host, struct mmc_card *card)
  416. {
  417. struct mmc_command cmd;
  418. if (!(card->csd.cmdclass & CCC_IO_MODE)) {
  419. printf("[SD%d] Card doesn't support I/O mode for IRQ state\n", host->id);
  420. return MMC_ERR_FAILED;
  421. }
  422. cmd.opcode = MMC_CMD_GO_IRQ_STATE;
  423. cmd.rsptyp = RESP_R5;
  424. cmd.arg = 0;
  425. cmd.retries = CMD_RETRIES;
  426. cmd.timeout = CMD_TIMEOUT;
  427. return mmc_cmd(host, &cmd);
  428. }
  429. static int mmc_go_inactive(struct mmc_host *host, struct mmc_card *card)
  430. {
  431. struct mmc_command cmd;
  432. cmd.opcode = MMC_CMD_GO_INACTIVE_STATE;
  433. cmd.rsptyp = RESP_NONE;
  434. cmd.arg = 0;
  435. cmd.retries = CMD_RETRIES;
  436. cmd.timeout = CMD_TIMEOUT;
  437. return mmc_cmd(host, &cmd);
  438. }
  439. static int mmc_go_pre_idle(struct mmc_host *host, struct mmc_card *card)
  440. {
  441. struct mmc_command cmd;
  442. cmd.opcode = MMC_CMD_GO_IDLE_STATE;
  443. cmd.rsptyp = RESP_NONE;
  444. cmd.arg = 0xF0F0F0F0;
  445. cmd.retries = CMD_RETRIES;
  446. cmd.timeout = CMD_TIMEOUT;
  447. return mmc_cmd(host, &cmd);
  448. }
  449. int mmc_sleep_awake(struct mmc_host *host, struct mmc_card *card, int sleep)
  450. {
  451. struct mmc_command cmd;
  452. u32 timeout;
  453. if (card->raw_ext_csd[EXT_CSD_S_A_TIMEOUT]) {
  454. timeout = ((1 << card->raw_ext_csd[EXT_CSD_S_A_TIMEOUT]) * 100) / 1000000;
  455. } else {
  456. timeout = CMD_TIMEOUT;
  457. }
  458. cmd.opcode = MMC_CMD_SLEEP_AWAKE;
  459. cmd.rsptyp = RESP_R1B;
  460. cmd.arg = (card->rca << 16) | (sleep << 15);
  461. cmd.retries = CMD_RETRIES;
  462. cmd.timeout = timeout;
  463. return mmc_cmd(host, &cmd);
  464. }
  465. int mmc_send_status(struct mmc_host *host, struct mmc_card *card, u32 *status)
  466. {
  467. int err;
  468. struct mmc_command cmd;
  469. cmd.opcode = MMC_CMD_SEND_STATUS;
  470. cmd.arg = card->rca << 16;
  471. cmd.rsptyp = RESP_R1;
  472. cmd.retries = CMD_RETRIES;
  473. cmd.timeout = CMD_TIMEOUT;
  474. err = mmc_cmd(host, &cmd);
  475. if (err == MMC_ERR_NONE) {
  476. *status = cmd.resp[0];
  477. #if MMC_DEBUG
  478. mmc_dump_card_status(*status);
  479. #endif
  480. }
  481. return err;
  482. }
  483. static int mmc_send_if_cond(struct mmc_host *host, u32 ocr)
  484. {
  485. struct mmc_command cmd;
  486. int err;
  487. static const u8 test_pattern = 0xAA;
  488. u8 result_pattern;
  489. /*
  490. * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND
  491. * before SD_APP_OP_COND. This command will harmlessly fail for
  492. * SD 1.0 cards.
  493. */
  494. cmd.opcode = SD_CMD_SEND_IF_COND;
  495. cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | test_pattern;
  496. cmd.rsptyp = RESP_R1;
  497. cmd.retries = 0;
  498. cmd.timeout = CMD_TIMEOUT;
  499. err = mmc_cmd(host, &cmd);
  500. if (err != MMC_ERR_NONE)
  501. return err;
  502. result_pattern = cmd.resp[0] & 0xFF;
  503. if (result_pattern != test_pattern)
  504. return MMC_ERR_INVALID;
  505. return MMC_ERR_NONE;
  506. }
  507. static int mmc_sd_get_write_blocks(struct mmc_host *host, struct mmc_card *card, u32* num)
  508. {
  509. u32 base = host->base;
  510. struct mmc_command cmd;
  511. int err;
  512. int result = MMC_ERR_NONE;
  513. u8 buf[4];
  514. cmd.opcode = SD_ACMD_SEND_NR_WR_BLOCKS;
  515. cmd.arg = 0;
  516. cmd.rsptyp = RESP_R1;
  517. cmd.retries = 3;
  518. cmd.timeout = CMD_TIMEOUT;
  519. msdc_reset_tune_counter(host);
  520. do {
  521. msdc_set_blknum(host, 1);
  522. msdc_set_blklen(host, 4);
  523. msdc_set_timeout(host, 100000000, 0);
  524. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  525. err = mmc_app_cmd(host, &cmd, card->rca, CMD_RETRIES);
  526. if (err != MMC_ERR_NONE)
  527. return err;
  528. /* 32bits = 4 byte */
  529. err = msdc_pio_read(host, (u32*)buf, 4);
  530. //printf("[%s:%d]err = %d\n", __func__, __LINE__, err);
  531. if (err != MMC_ERR_NONE){
  532. msdc_abort_handler(host, 1);
  533. result = msdc_tune_read(host);
  534. }
  535. } while (err && (result != MMC_ERR_READTUNEFAIL));
  536. msdc_reset_tune_counter(host);
  537. msdc_set_blklen(host, 512);
  538. if (err != MMC_ERR_NONE){
  539. return err;
  540. }
  541. *num = buf[3] | buf[2] << 8 | buf[1] << 16 | buf[0] << 24;
  542. return MMC_ERR_NONE;
  543. }
  544. static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
  545. {
  546. struct mmc_command cmd;
  547. int i, err = 0;
  548. cmd.opcode = MMC_CMD_SEND_OP_COND;
  549. cmd.arg = ocr;
  550. cmd.rsptyp = RESP_R3;
  551. cmd.retries = 0;
  552. cmd.timeout = CMD_TIMEOUT;
  553. for (i = 100; i; i--) {
  554. err = mmc_cmd(host, &cmd);
  555. if (err)
  556. break;
  557. /* if we're just probing, do a single pass */
  558. if (ocr == 0)
  559. break;
  560. if (cmd.resp[0] & MMC_CARD_BUSY)
  561. break;
  562. err = MMC_ERR_TIMEOUT;
  563. mdelay(10);
  564. }
  565. if (!err && rocr)
  566. *rocr = cmd.resp[0];
  567. return err;
  568. }
  569. static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
  570. {
  571. struct mmc_command cmd;
  572. int i, err = 0;
  573. cmd.opcode = SD_ACMD_SEND_OP_COND;
  574. cmd.arg = ocr;
  575. cmd.rsptyp = RESP_R3;
  576. cmd.retries = CMD_RETRIES;
  577. cmd.timeout = CMD_TIMEOUT;
  578. for (i = 100; i; i--) {
  579. err = mmc_app_cmd(host, &cmd, 0, CMD_RETRIES);
  580. if (err != MMC_ERR_NONE)
  581. break;
  582. if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0)
  583. break;
  584. err = MMC_ERR_TIMEOUT;
  585. mdelay(10);
  586. }
  587. if (rocr)
  588. *rocr = cmd.resp[0];
  589. return err;
  590. }
  591. static int mmc_all_send_cid(struct mmc_host *host, u32 *cid)
  592. {
  593. int err;
  594. struct mmc_command cmd;
  595. /* send cid */
  596. cmd.opcode = MMC_CMD_ALL_SEND_CID;
  597. cmd.arg = 0;
  598. cmd.rsptyp = RESP_R2;
  599. cmd.retries = CMD_RETRIES;
  600. cmd.timeout = CMD_TIMEOUT;
  601. err = mmc_cmd(host, &cmd);
  602. if (err != MMC_ERR_NONE)
  603. return err;
  604. memcpy(cid, cmd.resp, sizeof(u32) * 4);
  605. return MMC_ERR_NONE;
  606. }
  607. /* code size add 1KB*/
  608. static void mmc_decode_cid(struct mmc_card *card)
  609. {
  610. u32 *resp = card->raw_cid;
  611. memset(&card->cid, 0, sizeof(struct mmc_cid));
  612. card->cid.prod_name[4] = unstuff_bits(resp, 64, 8);
  613. card->cid.prod_name[3] = unstuff_bits(resp, 72, 8);
  614. card->cid.prod_name[2] = unstuff_bits(resp, 80, 8);
  615. card->cid.prod_name[1] = unstuff_bits(resp, 88, 8);
  616. card->cid.prod_name[0] = unstuff_bits(resp, 96, 8);
  617. if (mmc_card_sd(card)) {
  618. /*
  619. * SD doesn't currently have a version field so we will
  620. * have to assume we can parse this.
  621. */
  622. card->cid.month = unstuff_bits(resp, 8, 4);
  623. card->cid.year = unstuff_bits(resp, 12, 8);
  624. card->cid.serial = unstuff_bits(resp, 24, 32);
  625. card->cid.fwrev = unstuff_bits(resp, 56, 4);
  626. card->cid.hwrev = unstuff_bits(resp, 60, 4);
  627. card->cid.oemid = unstuff_bits(resp, 104, 16);
  628. card->cid.manfid = unstuff_bits(resp, 120, 8);
  629. card->cid.year += 2000; /* SD cards year offset */
  630. } else {
  631. /*
  632. * The selection of the format here is based upon published
  633. * specs from sandisk and from what people have reported.
  634. */
  635. card->cid.year = unstuff_bits(resp, 8, 4) + 1997;
  636. card->cid.month = unstuff_bits(resp, 12, 4);
  637. card->cid.prod_name[5] = unstuff_bits(resp, 56, 8);
  638. switch (card->csd.mmca_vsn) {
  639. case 0: /* MMC v1.0 - v1.2 */
  640. case 1: /* MMC v1.4 */
  641. card->cid.serial = unstuff_bits(resp, 16, 24);
  642. card->cid.fwrev = unstuff_bits(resp, 40, 4);
  643. card->cid.hwrev = unstuff_bits(resp, 44, 4);
  644. card->cid.prod_name[6] = unstuff_bits(resp, 48, 8);
  645. card->cid.manfid = unstuff_bits(resp, 104, 24);
  646. break;
  647. case 2: /* MMC v2.0 - v2.2 */
  648. case 3: /* MMC v3.1 - v3.3 */
  649. case 4: /* MMC v4 */
  650. card->cid.serial = unstuff_bits(resp, 16, 32);
  651. card->cid.oemid = unstuff_bits(resp, 104, 16);
  652. //card->cid.cbx = unstuff_bits(resp, 112, 2);
  653. card->cid.manfid = unstuff_bits(resp, 120, 8);
  654. break;
  655. default:
  656. printf("[SD%d] Unknown MMCA version %d\n",
  657. mmc_card_id(card), card->csd.mmca_vsn);
  658. break;
  659. }
  660. }
  661. }
  662. static int mmc_decode_csd(struct mmc_card *card)
  663. {
  664. struct mmc_csd *csd = &card->csd;
  665. unsigned int e, m, csd_struct;
  666. u32 *resp = card->raw_csd;
  667. /* common part; some part are updated later according to spec. */
  668. csd_struct = unstuff_bits(resp, 126, 2);
  669. csd->csd_struct = csd_struct;
  670. /* For MMC
  671. * We only understand CSD structure v1.1 and v1.2.
  672. * v1.2 has extra information in bits 15, 11 and 10.
  673. */
  674. if ( ( mmc_card_mmc(card) &&
  675. ( csd_struct != CSD_STRUCT_VER_1_0 && csd_struct != CSD_STRUCT_VER_1_1
  676. && csd_struct != CSD_STRUCT_VER_1_2 && csd_struct != CSD_STRUCT_EXT_CSD )
  677. ) ||
  678. ( mmc_card_sd(card) && ( csd_struct != 0 && csd_struct!=1 ) )
  679. )
  680. {
  681. printf("[SD%d] Unknown CSD ver %d\n", mmc_card_id(card), csd_struct);
  682. return MMC_ERR_INVALID;
  683. }
  684. m = unstuff_bits(resp, 99, 4);
  685. e = unstuff_bits(resp, 96, 3);
  686. csd->max_dtr = tran_exp[e] * tran_mant[m];
  687. /* update later according to spec. */
  688. csd->read_blkbits = unstuff_bits(resp, 80, 4);
  689. #if !defined(FEATURE_MMC_SLIM)
  690. csd->cmdclass = unstuff_bits(resp, 84, 12);
  691. csd->read_partial = unstuff_bits(resp, 79, 1);
  692. csd->write_misalign = unstuff_bits(resp, 78, 1);
  693. csd->read_misalign = unstuff_bits(resp, 77, 1);
  694. csd->dsr = unstuff_bits(resp, 76, 1);
  695. csd->write_prot_grpsz = unstuff_bits(resp, 32, 7);
  696. csd->write_prot_grp = unstuff_bits(resp, 31, 1);
  697. csd->r2w_factor = unstuff_bits(resp, 26, 3);
  698. csd->write_blkbits = unstuff_bits(resp, 22, 4);
  699. csd->write_partial = unstuff_bits(resp, 21, 1);
  700. csd->copy = unstuff_bits(resp, 14, 1);
  701. csd->perm_wr_prot = unstuff_bits(resp, 13, 1);
  702. csd->tmp_wr_prot = unstuff_bits(resp, 12, 1);
  703. m = unstuff_bits(resp, 115, 4);
  704. e = unstuff_bits(resp, 112, 3);
  705. csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
  706. csd->tacc_clks = unstuff_bits(resp, 104, 8) * 100;
  707. #endif
  708. e = unstuff_bits(resp, 47, 3);
  709. m = unstuff_bits(resp, 62, 12);
  710. csd->capacity = (1 + m) << (e + 2);
  711. //Specific part
  712. if (mmc_card_sd(card)) {
  713. #if !defined(FEATURE_MMC_SLIM)
  714. csd->erase_blk_en = unstuff_bits(resp, 46, 1);
  715. csd->erase_sctsz = unstuff_bits(resp, 39, 7) + 1;
  716. #endif
  717. switch (csd_struct) {
  718. case 0:
  719. break;
  720. case 1:
  721. /*
  722. * This is a block-addressed SDHC card. Most
  723. * interesting fields are unused and have fixed
  724. * values. To avoid getting tripped by buggy cards,
  725. * we assume those fixed values ourselves.
  726. */
  727. mmc_card_set_blockaddr(card);
  728. m = unstuff_bits(resp, 48, 22);
  729. csd->capacity = (1 + m) << 10;
  730. csd->read_blkbits = 9;
  731. #if !defined(FEATURE_MMC_SLIM)
  732. csd->tacc_ns = 0; /* Unused */
  733. csd->tacc_clks = 0; /* Unused */
  734. csd->read_partial = 0;
  735. csd->write_misalign = 0;
  736. csd->read_misalign = 0;
  737. csd->r2w_factor = 4; /* Unused */
  738. csd->write_blkbits = 9;
  739. csd->write_partial = 0;
  740. #endif
  741. break;
  742. }
  743. } else {
  744. csd->mmca_vsn = unstuff_bits(resp, 122, 4);
  745. #if !defined(FEATURE_MMC_SLIM)
  746. csd->write_prot_grpsz = unstuff_bits(resp, 32, 5);
  747. csd->erase_sctsz = (unstuff_bits(resp, 42, 5) + 1) * (unstuff_bits(resp, 37, 5) + 1);
  748. #endif
  749. }
  750. #if MMC_DEBUG
  751. mmc_dump_csd(card);
  752. #endif
  753. return 0;
  754. }
  755. static void mmc_decode_ext_csd(struct mmc_card *card)
  756. {
  757. u8 *ext_csd = &card->raw_ext_csd[0];
  758. card->ext_csd.sectors =
  759. ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
  760. ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
  761. ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
  762. ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
  763. #if !defined(FEATURE_MMC_SLIM)
  764. card->ext_csd.rev = ext_csd[EXT_CSD_REV];
  765. card->ext_csd.hc_erase_grp_sz = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512 * 1024;
  766. card->ext_csd.hc_wp_grp_sz = ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512 * 1024;
  767. card->ext_csd.trim_tmo_ms = ext_csd[EXT_CSD_TRIM_MULT] * 300;
  768. card->ext_csd.boot_info = ext_csd[EXT_CSD_BOOT_INFO];
  769. card->ext_csd.boot_part_sz = ext_csd[EXT_CSD_BOOT_SIZE_MULT] * 128 * 1024;
  770. card->ext_csd.access_sz = (ext_csd[EXT_CSD_ACC_SIZE] & 0xf) * 512;
  771. card->ext_csd.rpmb_sz = ext_csd[EXT_CSD_RPMB_SIZE_MULT] * 128 * 1024;
  772. card->ext_csd.erased_mem_cont = ext_csd[EXT_CSD_ERASED_MEM_CONT];
  773. card->ext_csd.part_en = ext_csd[EXT_CSD_PART_SUPPORT] & EXT_CSD_PART_SUPPORT_PART_EN ? 1 : 0;
  774. card->ext_csd.enh_attr_en = ext_csd[EXT_CSD_PART_SUPPORT] & EXT_CSD_PART_SUPPORT_ENH_ATTR_EN ? 1 : 0;
  775. card->ext_csd.enh_start_addr =
  776. (ext_csd[EXT_CSD_ENH_START_ADDR + 0] |
  777. ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8 |
  778. ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16 |
  779. ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24);
  780. card->ext_csd.enh_sz =
  781. (ext_csd[EXT_CSD_ENH_SIZE_MULT + 0] |
  782. ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8 |
  783. ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) * 512 * 1024 *
  784. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
  785. #endif
  786. if (card->ext_csd.sectors)
  787. mmc_card_set_blockaddr(card);
  788. card->ext_csd.hs_max_dtr = 0;
  789. if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS400_1_2V) ||
  790. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS400_1_8V)){
  791. card->ext_csd.hs_max_dtr = 200000000;
  792. card->ext_csd.ddr_support = 1;
  793. card->version = EMMC_VER_50;
  794. }else if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS200_1_2V) ||
  795. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS200_1_8V)) {
  796. card->ext_csd.hs_max_dtr = 200000000;
  797. if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52_1_2V) ||
  798. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52)){
  799. card->ext_csd.ddr_support = 1;
  800. }
  801. card->version = EMMC_VER_45;
  802. } else if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52_1_2V) ||
  803. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52)) {
  804. card->ext_csd.ddr_support = 1;
  805. card->ext_csd.hs_max_dtr = 52000000;
  806. card->version = EMMC_VER_44;
  807. } else if (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_52) {
  808. card->ext_csd.hs_max_dtr = 52000000;
  809. card->version = EMMC_VER_43;
  810. } else if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_26)) {
  811. card->ext_csd.hs_max_dtr = 26000000;
  812. card->version = EMMC_VER_42;
  813. } else {
  814. /* MMC v4 spec says this cannot happen */
  815. printf("[SD%d] MMCv4 but HS unsupported\n", card->host->id);
  816. }
  817. #ifdef MTK_EMMC_POWER_ON_WP
  818. card->ext_csd.usr_wp = ext_csd[EXT_CSD_USR_WP];
  819. card->ext_csd.boot_wp = ext_csd[EXT_CSD_BOOT_WP];
  820. //compute wp_size
  821. if(ext_csd[EXT_CSD_ERASE_GRP_DEF]&EXT_CSD_ERASE_GRP_DEF_EN)
  822. {
  823. card->wp_size = card->ext_csd.hc_erase_grp_sz * card->ext_csd.hc_wp_grp_sz >>9 ; //should be the sector size
  824. printf("EXT_CSD_ERASE_GRP_DEF is On, wp_size = %dMB\n", card->wp_size/2048);
  825. }
  826. else
  827. {
  828. card->wp_size =(card->csd.write_prot_grpsz+1) * card->csd.erase_sctsz;
  829. printf("EXT_CSD_ERASE_GRP_DEF is Off, wp_size = %dMB, csd.write_prot_grpsz = %d,csd.erase_sctsz = %d\n", card->wp_size/2048, card->csd.write_prot_grpsz, card->csd.erase_sctsz);
  830. }
  831. printf("[%s]: mmc_set_wp_size %dMB\n", __func__,card->wp_size/2048);
  832. #endif
  833. #if MMC_DEBUG
  834. mmc_dump_ext_csd(card);
  835. #endif
  836. return;
  837. }
  838. //Note: 1. Neither preloader or LK define this function
  839. #if defined(MMC_MSDC_DRV_CTP)
  840. int mmc_deselect_all_card(struct mmc_host *host)
  841. {
  842. int err;
  843. struct mmc_command cmd;
  844. cmd.opcode = MMC_CMD_SELECT_CARD;
  845. cmd.arg = 0;
  846. cmd.rsptyp = RESP_NONE;
  847. cmd.retries = CMD_RETRIES;
  848. cmd.timeout = CMD_TIMEOUT;
  849. err = mmc_cmd(host, &cmd);
  850. return err;
  851. }
  852. #endif
  853. int mmc_select_card(struct mmc_host *host, struct mmc_card *card)
  854. {
  855. int err;
  856. struct mmc_command cmd;
  857. cmd.opcode = MMC_CMD_SELECT_CARD;
  858. cmd.arg = card->rca << 16;
  859. cmd.rsptyp = RESP_R1B;
  860. cmd.retries = CMD_RETRIES;
  861. cmd.timeout = CMD_TIMEOUT;
  862. err = mmc_cmd(host, &cmd);
  863. return err;
  864. }
  865. int mmc_send_relative_addr(struct mmc_host *host, struct mmc_card *card, unsigned int *rca)
  866. {
  867. int err;
  868. struct mmc_command cmd;
  869. memset(&cmd, 0, sizeof(struct mmc_command));
  870. if (mmc_card_mmc(card)) { /* set rca */
  871. cmd.opcode = MMC_CMD_SET_RELATIVE_ADDR;
  872. cmd.arg = *rca << 16;
  873. cmd.rsptyp = RESP_R1;
  874. cmd.retries = CMD_RETRIES;
  875. cmd.timeout = CMD_TIMEOUT;
  876. } else { /* send rca */
  877. cmd.opcode = SD_CMD_SEND_RELATIVE_ADDR;
  878. cmd.arg = 0;
  879. cmd.rsptyp = RESP_R6;
  880. cmd.retries = CMD_RETRIES;
  881. cmd.timeout = CMD_TIMEOUT;
  882. }
  883. err = mmc_cmd(host, &cmd);
  884. if ((err == MMC_ERR_NONE) && !mmc_card_mmc(card))
  885. *rca = cmd.resp[0] >> 16;
  886. return err;
  887. }
  888. int mmc_send_tuning_blk(struct mmc_host *host, struct mmc_card *card, u32 *buf)
  889. {
  890. int err;
  891. struct mmc_command cmd;
  892. cmd.opcode = SD_CMD_SEND_TUNING_BLOCK;
  893. cmd.arg = 0;
  894. cmd.rsptyp = RESP_R1;
  895. cmd.retries = CMD_RETRIES;
  896. cmd.timeout = CMD_TIMEOUT;
  897. msdc_set_blknum(host, 1);
  898. msdc_set_blklen(host, 64);
  899. msdc_set_timeout(host, 100000000, 0);
  900. err = mmc_cmd(host, &cmd);
  901. if (err != MMC_ERR_NONE)
  902. goto out;
  903. err = msdc_pio_read(host, buf, 64);
  904. if (err != MMC_ERR_NONE)
  905. goto out;
  906. #if MMC_DEBUG
  907. mmc_dump_tuning_blk((u8*)buf);
  908. #endif
  909. out:
  910. return err;
  911. }
  912. int mmc_switch(struct mmc_host *host, struct mmc_card *card,
  913. u8 set, u8 index, u8 value)
  914. {
  915. int err;
  916. u32 status = 0;
  917. uint count = 0;
  918. struct mmc_command cmd;
  919. cmd.opcode = MMC_CMD_SWITCH;
  920. cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
  921. (index << 16) | (value << 8) | set;
  922. cmd.rsptyp = RESP_R1B;
  923. cmd.retries = CMD_RETRIES;
  924. cmd.timeout = CMD_TIMEOUT;
  925. err = mmc_cmd(host, &cmd);
  926. if (err != MMC_ERR_NONE)
  927. return err;
  928. do {
  929. err = mmc_send_status(host, card, &status);
  930. if (err) {
  931. printf("[SD%d] Fail to send status %d\n", host->id, err);
  932. break;
  933. }
  934. if (status & R1_SWITCH_ERROR) {
  935. printf("[SD%d] switch error. arg(0x%x)\n", host->id, cmd.arg);
  936. return MMC_ERR_FAILED;
  937. }
  938. if (count++ >= 600000)
  939. {
  940. printf("[%s]: timeout happend, count=%d, status=0x%x\n", __func__, count, status);
  941. break;
  942. }
  943. } while (!(status & R1_READY_FOR_DATA) || (R1_CURRENT_STATE(status) == 7));
  944. return err;
  945. }
  946. static int mmc_sd_switch(struct mmc_host *host,
  947. struct mmc_card *card,
  948. int mode, int group, u8 value, mmc_switch_t *resp)
  949. {
  950. int err = MMC_ERR_FAILED;
  951. int result = 0;
  952. struct mmc_command cmd;
  953. u32 *sts = (u32 *)resp;
  954. mode = !!mode;
  955. value &= 0xF;
  956. /* argument: mode[31]= 0 (for check func.) and 1 (for switch func) */
  957. cmd.opcode = SD_CMD_SWITCH;
  958. cmd.arg = mode << 31 | 0x00FFFFFF;
  959. cmd.arg &= ~(0xF << (group * 4));
  960. cmd.arg |= value << (group * 4);
  961. cmd.rsptyp = RESP_R1;
  962. cmd.retries = CMD_RETRIES;
  963. cmd.timeout = 100; /* 100ms */
  964. #if defined(FEATURE_MMC_RD_TUNING)
  965. //Note: 1. CTP does not perform tuning
  966. msdc_reset_tune_counter(host);
  967. do{
  968. #endif
  969. msdc_set_blknum(host, 1);
  970. msdc_set_blklen(host, 64);
  971. msdc_set_timeout(host, 100000000, 0);
  972. err = mmc_cmd(host, &cmd);
  973. if (err != MMC_ERR_NONE)
  974. goto out;
  975. /* 512 bits = 64 bytes = 16 words */
  976. err = msdc_pio_read(host, sts, 64);
  977. if (err != MMC_ERR_NONE){
  978. msdc_abort_handler(host, 1);
  979. #if defined(FEATURE_MMC_RD_TUNING)
  980. result = msdc_tune_read(host);
  981. #else
  982. goto out;
  983. #endif
  984. }
  985. #if defined(FEATURE_MMC_RD_TUNING)
  986. }while(err && result != MMC_ERR_READTUNEFAIL);
  987. msdc_reset_tune_counter(host);
  988. #endif
  989. #if MMC_DEBUG
  990. {
  991. int i;
  992. u8 *byte = (u8*)&sts[0];
  993. /* Status: B0 B1 ...
  994. * Bits : 511-504 503-495 ...
  995. */
  996. for (i = 0; i < 4; i++) {
  997. MSG(RSP, " [%d-%d] %xh %xh %xh %xh\n",
  998. ((3 - i + 1) << 7) - 1, (3 - i) << 7,
  999. sts[(i << 2) + 0], sts[(i << 2) + 1],
  1000. sts[(i << 2) + 2], sts[(i << 2) + 3]);
  1001. }
  1002. for (i = 0; i < 8; i++) {
  1003. MSG(RSP, " [%d-%d] %xh %xh %xh %xh %xh %xh %xh %xh\n",
  1004. ((8 - i) << 6) - 1, (8 - i - 1) << 6,
  1005. byte[(i << 3) + 0], byte[(i << 3) + 1],
  1006. byte[(i << 3) + 2], byte[(i << 3) + 3],
  1007. byte[(i << 3) + 4], byte[(i << 3) + 5],
  1008. byte[(i << 3) + 6], byte[(i << 3) + 7]);
  1009. }
  1010. }
  1011. #endif
  1012. out:
  1013. return err;
  1014. }
  1015. #if defined(FEATURE_MMC_UHS1)
  1016. int mmc_ctrl_speed_class(struct mmc_host *host, u32 scc)
  1017. {
  1018. struct mmc_command cmd;
  1019. cmd.opcode = SD_CMD_SPEED_CLASS_CTRL;
  1020. cmd.arg = scc << 28;
  1021. cmd.rsptyp = RESP_R1B;
  1022. cmd.retries = CMD_RETRIES;
  1023. cmd.timeout = CMD_TIMEOUT;
  1024. return mmc_cmd(host, &cmd);
  1025. }
  1026. int mmc_switch_volt(struct mmc_host *host, struct mmc_card *card)
  1027. {
  1028. int err;
  1029. struct mmc_command cmd;
  1030. cmd.opcode = SD_CMD_VOL_SWITCH;
  1031. cmd.arg = 0;
  1032. cmd.rsptyp = RESP_R1;
  1033. cmd.retries = CMD_RETRIES;
  1034. cmd.timeout = CMD_TIMEOUT;
  1035. err = mmc_cmd(host, &cmd);
  1036. if (err == MMC_ERR_NONE)
  1037. err = msdc_switch_volt(host, MMC_VDD_18_19);
  1038. return err;
  1039. }
  1040. #endif
  1041. int mmc_switch_hs(struct mmc_host *host, struct mmc_card *card)
  1042. {
  1043. int err;
  1044. u8 status[64];
  1045. int val = MMC_SWITCH_MODE_SDR25;
  1046. err = mmc_sd_switch(host, card, 1, 0, val, (mmc_switch_t*)&status[0]);
  1047. if (err != MMC_ERR_NONE)
  1048. goto out;
  1049. if ((status[16] & 0xF) != 1) {
  1050. printf("[SD%d] HS mode not supported!\n", host->id);
  1051. err = MMC_ERR_FAILED;
  1052. } else {
  1053. printf("[SD%d] Switch to HS mode!\n", host->id);
  1054. mmc_card_set_highspeed(card);
  1055. }
  1056. out:
  1057. return err;
  1058. }
  1059. #if defined(FEATURE_MMC_UHS1)
  1060. int mmc_switch_uhs1(struct mmc_host *host, struct mmc_card *card, unsigned int mode)
  1061. {
  1062. int err;
  1063. u8 status[64];
  1064. int val;
  1065. const char *smode[] = { "SDR12", "SDR25", "SDR50", "SDR104", "DDR50" };
  1066. err = mmc_sd_switch(host, card, 1, 0, mode, (mmc_switch_t*)&status[0]);
  1067. if (err != MMC_ERR_NONE)
  1068. goto out;
  1069. if ((status[16] & 0xF) != mode) {
  1070. printf("[SD%d] UHS-1 %s mode not supported!\n", host->id, smode[mode]);
  1071. err = MMC_ERR_FAILED;
  1072. } else {
  1073. card->uhs_mode = mode;
  1074. mmc_card_set_uhs1(card);
  1075. printf("[SD%d] Switch to UHS-1 %s mode!\n", host->id, smode[mode]);
  1076. if (mode == MMC_SWITCH_MODE_DDR50) {
  1077. mmc_card_set_ddr(card);
  1078. }
  1079. }
  1080. out:
  1081. return err;
  1082. }
  1083. int mmc_switch_drv_type(struct mmc_host *host, struct mmc_card *card, int val)
  1084. {
  1085. int err;
  1086. u8 status[64];
  1087. const char *type[] = { "TYPE-B", "TYPE-A", "TYPE-C", "TYPE-D" };
  1088. err = mmc_sd_switch(host, card, 1, 2, val, (mmc_switch_t*)&status[0]);
  1089. if (err != MMC_ERR_NONE)
  1090. goto out;
  1091. if ((status[15] & 0xF) != val) {
  1092. printf("[SD%d] UHS-1 %s drv not supported!\n", host->id, type[val]);
  1093. err = MMC_ERR_FAILED;
  1094. } else {
  1095. printf("[SD%d] Switch to UHS-1 %s drv!\n", host->id, type[val]);
  1096. }
  1097. out:
  1098. return err;
  1099. }
  1100. int mmc_switch_max_cur(struct mmc_host *host, struct mmc_card *card, int val)
  1101. {
  1102. int err;
  1103. u8 status[64];
  1104. const char *curr[] = { "200mA", "400mA", "600mA", "800mA" };
  1105. err = mmc_sd_switch(host, card, 1, 3, val, (mmc_switch_t*)&status[0]);
  1106. if (err != MMC_ERR_NONE)
  1107. goto out;
  1108. if (((status[15] >> 4) & 0xF) != val) {
  1109. printf("[SD%d] UHS-1 %s max. current not supported!\n", host->id, curr[val]);
  1110. err = MMC_ERR_FAILED;
  1111. } else {
  1112. printf("[SD%d] Switch to UHS-1 %s max. current!\n", host->id, curr[val]);
  1113. }
  1114. out:
  1115. return err;
  1116. }
  1117. #endif
  1118. static int mmc_read_csds(struct mmc_host *host, struct mmc_card *card)
  1119. {
  1120. int err;
  1121. struct mmc_command cmd;
  1122. cmd.opcode = MMC_CMD_SEND_CSD;
  1123. cmd.arg = card->rca << 16;
  1124. cmd.rsptyp = RESP_R2;
  1125. cmd.retries = CMD_RETRIES;
  1126. cmd.timeout = CMD_TIMEOUT * 100;
  1127. err = mmc_cmd(host, &cmd);
  1128. if (err == MMC_ERR_NONE)
  1129. memcpy(&card->raw_csd, &cmd.resp[0], sizeof(u32) * 4);
  1130. return err;
  1131. }
  1132. #if !defined(FEATURE_MMC_SLIM)
  1133. static int mmc_read_scrs(struct mmc_host *host, struct mmc_card *card)
  1134. {
  1135. int err = MMC_ERR_NONE;
  1136. int result=0;
  1137. struct mmc_command cmd;
  1138. struct sd_scr *scr = &card->scr;
  1139. u32 resp[4];
  1140. u32 tmp;
  1141. u8 buf[8];
  1142. msdc_set_blknum(host, 1);
  1143. msdc_set_blklen(host, 8);
  1144. msdc_set_timeout(host, 100000000, 0);
  1145. memset(buf, 0, 8);
  1146. cmd.opcode = SD_ACMD_SEND_SCR;
  1147. cmd.arg = 0;
  1148. cmd.rsptyp = RESP_R1;
  1149. cmd.retries = CMD_RETRIES;
  1150. cmd.timeout = CMD_TIMEOUT;
  1151. #if defined(FEATURE_MMC_RD_TUNING)
  1152. msdc_reset_tune_counter(host);
  1153. do{
  1154. #endif
  1155. mmc_app_cmd(host, &cmd, card->rca, CMD_RETRIES);
  1156. if ((err != MMC_ERR_NONE) || !(cmd.resp[0] & R1_APP_CMD))
  1157. return MMC_ERR_FAILED;
  1158. /* 8 bytes = 2 words */
  1159. err = msdc_pio_read(host, (u32 *)buf, 8);
  1160. if (err != MMC_ERR_NONE){
  1161. msdc_abort_handler(host, 1);
  1162. #if defined(FEATURE_MMC_RD_TUNING)
  1163. result = msdc_tune_read(host);
  1164. #else
  1165. return err;
  1166. #endif
  1167. }
  1168. #if defined(FEATURE_MMC_RD_TUNING)
  1169. } while(err && result != MMC_ERR_READTUNEFAIL);
  1170. msdc_reset_tune_counter(host);
  1171. #endif
  1172. if ( (err==MMC_ERR_NONE) && (result != MMC_ERR_READTUNEFAIL) ) {
  1173. memcpy(card->raw_scr, buf, 8);
  1174. }
  1175. MSG(INF, "[SD%d] SCR: %x %x (raw)\n", host->id, card->raw_scr[0], card->raw_scr[1]);
  1176. tmp = ntohl(card->raw_scr[0]);
  1177. card->raw_scr[0] = ntohl(card->raw_scr[1]);
  1178. card->raw_scr[1] = tmp;
  1179. MSG(INF, "[SD%d] SCR: %x %x (ntohl)\n", host->id, card->raw_scr[0], card->raw_scr[1]);
  1180. resp[2] = card->raw_scr[1];
  1181. resp[3] = card->raw_scr[0];
  1182. if (unstuff_bits(resp, 60, 4) != 0) {
  1183. printf("[SD%d] Unknown SCR ver %d\n",
  1184. mmc_card_id(card), unstuff_bits(resp, 60, 4));
  1185. return MMC_ERR_INVALID;
  1186. }
  1187. scr->scr_struct = unstuff_bits(resp, 60, 4);
  1188. scr->sda_vsn = unstuff_bits(resp, 56, 4);
  1189. scr->data_bit_after_erase = unstuff_bits(resp, 55, 1);
  1190. scr->security = unstuff_bits(resp, 52, 3);
  1191. scr->bus_widths = unstuff_bits(resp, 48, 4);
  1192. scr->sda_vsn3 = unstuff_bits(resp, 47, 1);
  1193. scr->ex_security = unstuff_bits(resp, 43, 4);
  1194. scr->cmd_support = unstuff_bits(resp, 32, 2);
  1195. printf("[SD%d] SD_SPEC(%d) SD_SPEC3(%d) SD_BUS_WIDTH=%d\n",
  1196. mmc_card_id(card), scr->sda_vsn, scr->sda_vsn3, scr->bus_widths);
  1197. printf("[SD%d] SD_SECU(%d) EX_SECU(%d), CMD_SUPP(%d): CMD23(%d), CMD20(%d)\n",
  1198. mmc_card_id(card), scr->security, scr->ex_security, scr->cmd_support,
  1199. (scr->cmd_support >> 1) & 0x1, scr->cmd_support & 0x1);
  1200. return err;
  1201. }
  1202. #endif
  1203. /* Read and decode extended CSD. */
  1204. int mmc_read_ext_csd(struct mmc_host *host, struct mmc_card *card)
  1205. {
  1206. int err = MMC_ERR_NONE;
  1207. u32 *ptr;
  1208. int result = MMC_ERR_NONE;
  1209. struct mmc_command cmd;
  1210. u8 buf[512];
  1211. if (card->csd.mmca_vsn < CSD_SPEC_VER_4) {
  1212. printf("[SD%d] MMCA_VSN: %d. Skip EXT_CSD\n", host->id, card->csd.mmca_vsn);
  1213. return MMC_ERR_NONE;
  1214. }
  1215. memset(buf, 0, 512); //memset(&card->raw_ext_csd[0], 0, 512);
  1216. ptr = (u32 *)buf; //ptr = (u32*)&card->raw_ext_csd[0];
  1217. cmd.opcode = MMC_CMD_SEND_EXT_CSD;
  1218. cmd.arg = 0;
  1219. cmd.rsptyp = RESP_R1;
  1220. cmd.retries = CMD_RETRIES;
  1221. cmd.timeout = CMD_TIMEOUT;
  1222. #if defined(FEATURE_MMC_RD_TUNING)
  1223. msdc_reset_tune_counter(host);
  1224. do{
  1225. #endif
  1226. msdc_set_blknum(host, 1);
  1227. msdc_set_blklen(host, 512);
  1228. msdc_set_timeout(host, 100000000, 0);
  1229. err = mmc_cmd(host, &cmd);
  1230. if (err != MMC_ERR_NONE)
  1231. goto out;
  1232. err = msdc_pio_read(host, ptr, 512);
  1233. if (err != MMC_ERR_NONE){
  1234. msdc_abort_handler(host, 1);
  1235. #if defined(FEATURE_MMC_RD_TUNING)
  1236. result = msdc_tune_read(host);
  1237. #endif
  1238. }
  1239. #if defined(FEATURE_MMC_RD_TUNING)
  1240. } while (err && result != MMC_ERR_READTUNEFAIL);
  1241. msdc_reset_tune_counter(host);
  1242. #endif
  1243. if ( (err==MMC_ERR_NONE) && (result != MMC_ERR_READTUNEFAIL) ) {
  1244. memcpy(card->raw_ext_csd, buf, 512);
  1245. mmc_decode_ext_csd(card);
  1246. }
  1247. out:
  1248. return err;
  1249. }
  1250. /* Fetches and decodes switch information */
  1251. static int mmc_read_switch(struct mmc_host *host, struct mmc_card *card)
  1252. {
  1253. int err;
  1254. u8 status[64];
  1255. err = mmc_sd_switch(host, card, 0, 0, 1, (mmc_switch_t*)&status[0]);
  1256. if (err != MMC_ERR_NONE) {
  1257. /* Card not supporting high-speed will ignore the command. */
  1258. err = MMC_ERR_NONE;
  1259. goto out;
  1260. }
  1261. /* bit 511:480 in status[0]. bit 415:400 in status[13] */
  1262. if (status[13] & 0x01) {
  1263. printf("[SD%d] Support: Default/SDR12\n", host->id);
  1264. card->sw_caps.hs_max_dtr = 25000000; /* default or sdr12 */
  1265. }
  1266. if (status[13] & 0x02) {
  1267. printf("[SD%d] Support: HS/SDR25\n", host->id);
  1268. card->sw_caps.hs_max_dtr = 50000000; /* high-speed or sdr25 */
  1269. }
  1270. if (status[13] & 0x10) {
  1271. printf("[SD%d] Support: DDR50\n", host->id);
  1272. card->sw_caps.hs_max_dtr = 50000000; /* ddr50 */
  1273. card->sw_caps.ddr = 1;
  1274. }
  1275. #if defined(FEATURE_MMC_UHS1)
  1276. if (status[13] & 0x04) {
  1277. printf("[SD%d] Support: SDR50\n", host->id);
  1278. card->sw_caps.hs_max_dtr = 100000000; /* sdr50 */
  1279. }
  1280. if (status[13] & 0x08) {
  1281. printf("[SD%d] Support: SDR104\n", host->id);
  1282. card->sw_caps.hs_max_dtr = 208000000; /* sdr104 */
  1283. }
  1284. if (status[9] & 0x01) {
  1285. printf("[SD%d] Support: Type-B Drv\n", host->id);
  1286. }
  1287. if (status[9] & 0x02) {
  1288. printf("[SD%d] Support: Type-A Drv\n", host->id);
  1289. }
  1290. if (status[9] & 0x04) {
  1291. printf("[SD%d] Support: Type-C Drv\n", host->id);
  1292. }
  1293. if (status[9] & 0x08) {
  1294. printf("[SD%d] Support: Type-D Drv\n", host->id);
  1295. }
  1296. if (status[7] & 0x01) {
  1297. printf("[SD%d] Support: 200mA current limit\n", host->id);
  1298. }
  1299. if (status[7] & 0x02) {
  1300. printf("[SD%d] Support: 400mA current limit\n", host->id);
  1301. }
  1302. if (status[7] & 0x04) {
  1303. printf("[SD%d] Support: 600mA current limit\n", host->id);
  1304. }
  1305. if (status[7] & 0x08) {
  1306. printf("[SD%d] Support: 800mA current limit\n", host->id);
  1307. }
  1308. #endif
  1309. out:
  1310. return err;
  1311. }
  1312. #if 0
  1313. static int mmc_deselect_cards(struct mmc_host *host)
  1314. {
  1315. struct mmc_command cmd;
  1316. cmd.opcode = MMC_CMD_SELECT_CARD;
  1317. cmd.arg = 0;
  1318. cmd.rsptyp = RESP_NONE;
  1319. cmd.retries = CMD_RETRIES;
  1320. cmd.timeout = CMD_TIMEOUT;
  1321. return mmc_cmd(host, &cmd);
  1322. }
  1323. int mmc_lock_unlock(struct mmc_host *host)
  1324. {
  1325. struct mmc_command cmd;
  1326. cmd.opcode = MMC_CMD_LOCK_UNLOCK;
  1327. cmd.rsptyp = RESP_R1;
  1328. cmd.arg = 0;
  1329. cmd.retries = 3;
  1330. cmd.timeout = CMD_TIMEOUT;
  1331. return mmc_cmd(host, &cmd);
  1332. }
  1333. #endif
  1334. #if 1
  1335. int mmc_set_write_prot(struct mmc_host *host, u32 addr)
  1336. {
  1337. struct mmc_command cmd;
  1338. if (!(host->card->csd.cmdclass & CCC_WRITE_PROT))
  1339. return MMC_ERR_INVALID;
  1340. cmd.opcode = MMC_CMD_SET_WRITE_PROT;
  1341. cmd.rsptyp = RESP_R1B;
  1342. cmd.arg = addr;
  1343. cmd.retries = 3;
  1344. cmd.timeout = CMD_TIMEOUT;
  1345. return mmc_cmd(host, &cmd);
  1346. }
  1347. #endif
  1348. #if 0
  1349. int mmc_clr_write_prot(struct mmc_card *card, u32 addr)
  1350. {
  1351. struct mmc_command cmd;
  1352. if (!(card->csd.cmdclass & CCC_WRITE_PROT))
  1353. return MMC_ERR_INVALID;
  1354. cmd.opcode = MMC_CMD_CLR_WRITE_PROT;
  1355. cmd.rsptyp = RESP_R1B;
  1356. cmd.arg = addr;
  1357. cmd.retries = 3;
  1358. cmd.timeout = CMD_TIMEOUT;
  1359. return mmc_cmd(card->host, &cmd);
  1360. }
  1361. #endif
  1362. //Note: 1. LK undefine this function
  1363. //SDHC and SDXC does not support this command
  1364. int mmc_send_write_prot(struct mmc_card *card, u32 wp_addr, u32 *wp_status)
  1365. {
  1366. int err;
  1367. struct mmc_command cmd;
  1368. struct mmc_host *host = card->host;
  1369. u8 *buf = (u8*)wp_status;
  1370. if (!(card->csd.cmdclass & CCC_WRITE_PROT))
  1371. return MMC_ERR_INVALID;
  1372. cmd.opcode = MMC_CMD_SEND_WRITE_PROT;
  1373. cmd.rsptyp = RESP_R1;
  1374. cmd.arg = wp_addr;
  1375. cmd.retries = 3;
  1376. cmd.timeout = CMD_TIMEOUT;
  1377. msdc_set_blknum(host, 1);
  1378. msdc_set_blklen(host, 4);
  1379. msdc_set_timeout(host, 100000000, 0);
  1380. err = mmc_cmd(host, &cmd);
  1381. if (err != MMC_ERR_NONE)
  1382. goto out;
  1383. err = msdc_pio_read(host, (u32*)buf, 4);
  1384. if (err != MMC_ERR_NONE)
  1385. goto out;
  1386. out:
  1387. return err;
  1388. }
  1389. int mmc_erase_start(struct mmc_card *card, u64 addr)
  1390. {
  1391. struct mmc_command cmd;
  1392. if (!(card->csd.cmdclass & CCC_ERASE)) {
  1393. printf("[SD%d] Card doesn't support Erase commands\n", card->host->id);
  1394. return MMC_ERR_INVALID;
  1395. }
  1396. if (mmc_card_highcaps(card))
  1397. addr /= MMC_BLOCK_SIZE; /* in sector unit */
  1398. if (mmc_card_mmc(card)) {
  1399. cmd.opcode = MMC_CMD_ERASE_GROUP_START;
  1400. } else {
  1401. cmd.opcode = MMC_CMD_ERASE_WR_BLK_START;
  1402. }
  1403. cmd.rsptyp = RESP_R1;
  1404. cmd.arg = addr;
  1405. cmd.retries = 3;
  1406. cmd.timeout = CMD_TIMEOUT;
  1407. return mmc_cmd(card->host, &cmd);
  1408. }
  1409. int mmc_erase_end(struct mmc_card *card, u64 addr)
  1410. {
  1411. struct mmc_command cmd;
  1412. if (!(card->csd.cmdclass & CCC_ERASE)) {
  1413. printf("[SD%d] Erase isn't supported\n", card->host->id);
  1414. return MMC_ERR_INVALID;
  1415. }
  1416. if (mmc_card_highcaps(card))
  1417. addr /= MMC_BLOCK_SIZE; /* in sector unit */
  1418. if (mmc_card_mmc(card)) {
  1419. cmd.opcode = MMC_CMD_ERASE_GROUP_END;
  1420. } else {
  1421. cmd.opcode = MMC_CMD_ERASE_WR_BLK_END;
  1422. }
  1423. cmd.rsptyp = RESP_R1;
  1424. cmd.arg = addr;
  1425. cmd.retries = 3;
  1426. cmd.timeout = CMD_TIMEOUT;
  1427. return mmc_cmd(card->host, &cmd);
  1428. }
  1429. int mmc_erase(struct mmc_card *card, u32 arg)
  1430. {
  1431. int err;
  1432. u32 status;
  1433. struct mmc_command cmd;
  1434. if (!(card->csd.cmdclass & CCC_ERASE)) {
  1435. printf("[SD%d] Erase isn't supported\n", card->host->id);
  1436. return MMC_ERR_INVALID;
  1437. }
  1438. if (arg & MMC_ERASE_SECURE_REQ) {
  1439. if (!(card->raw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] &
  1440. EXT_CSD_SEC_FEATURE_ER_EN)) {
  1441. return MMC_ERR_INVALID;
  1442. }
  1443. }
  1444. if ((arg & MMC_ERASE_GC_REQ) || (arg & MMC_ERASE_TRIM)) {
  1445. if (!(card->raw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] &
  1446. EXT_CSD_SEC_FEATURE_GB_CL_EN)) {
  1447. return MMC_ERR_INVALID;
  1448. }
  1449. }
  1450. cmd.opcode = MMC_CMD_ERASE;
  1451. cmd.rsptyp = RESP_R1B;
  1452. cmd.arg = arg;
  1453. cmd.retries = 3;
  1454. cmd.timeout = CMD_TIMEOUT;
  1455. err = mmc_cmd(card->host, &cmd);
  1456. if (!err) {
  1457. do {
  1458. err = mmc_send_status(card->host, card, &status);
  1459. if (err) break;
  1460. #if MMC_DEBUG
  1461. mmc_dump_card_status(status);
  1462. #endif
  1463. if (R1_STATUS(status) != 0) break;
  1464. } while (R1_CURRENT_STATE(status) == 7);
  1465. }
  1466. return err;
  1467. }
  1468. #if defined(FEATURE_MMC_UHS1)
  1469. int mmc_tune_timing(struct mmc_host *host, struct mmc_card *card)
  1470. {
  1471. int err = MMC_ERR_NONE;
  1472. if (mmc_card_sd(card) && mmc_card_uhs1(card) && !mmc_card_ddr(card)) {
  1473. err = msdc_tune_uhs1(host, card);
  1474. }
  1475. else if(mmc_card_mmc(card) && mmc_card_hs200(card)){
  1476. err = msdc_tune_hs200(host, card);
  1477. }else if(mmc_card_mmc(card) && mmc_card_hs400(card)){
  1478. err = msdc_tune_hs400(host, card);
  1479. }
  1480. return err;
  1481. }
  1482. #endif
  1483. u32 mmc_get_wpg_size(struct mmc_card *card)
  1484. {
  1485. u32 size;
  1486. u8 *ext_csd;
  1487. if (mmc_card_mmc(card)) {
  1488. ext_csd = &card->raw_ext_csd[0];
  1489. if ((ext_csd[EXT_CSD_ERASE_GRP_DEF] & EXT_CSD_ERASE_GRP_DEF_EN)
  1490. && (ext_csd[EXT_CSD_HC_WP_GPR_SIZE] > 0)) {
  1491. size = 512 * 1024 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
  1492. ext_csd[EXT_CSD_HC_WP_GPR_SIZE];
  1493. } else {
  1494. size = card->csd.write_prot_grpsz;
  1495. }
  1496. } else {
  1497. if (card->csd.write_prot_grp) {
  1498. /* SDSC could support write protect group */
  1499. size = (card->csd.write_prot_grpsz + 1) * (1 << card->csd.write_blkbits);
  1500. } else {
  1501. /* SDHC and SDXC don't support write protect group */
  1502. size = 0;
  1503. }
  1504. }
  1505. return size;
  1506. }
  1507. #if defined(MMC_MSDC_DRV_CTP)
  1508. /* need reset some register while switch to hs400 mode with emmc50 */
  1509. int mmc_register_partial_reset(struct mmc_host* host)
  1510. {
  1511. if (host->id != 0){
  1512. return 1;
  1513. }
  1514. /* back up, then reset to default value */
  1515. msdc_register_partial_backup_and_reset(host);
  1516. return 0;
  1517. }
  1518. int mmc_register_partial_restore(struct mmc_host* host)
  1519. {
  1520. if (host->id != 0){
  1521. return 1;
  1522. }
  1523. /* back up, then reset to default value */
  1524. msdc_register_partial_restore(host);
  1525. return 0;
  1526. }
  1527. #endif
  1528. void mmc_switch_card_timing(struct mmc_host *host, unsigned int clkhz)
  1529. {
  1530. int id = host->id;
  1531. struct mmc_card *card = host->card;
  1532. int result = 0;
  1533. if (card && mmc_card_mmc(card)){
  1534. if ((clkhz > MSDC_52M_SCLK) && (host->caps & MMC_CAP_DDR) && (host->caps & MMC_CAP_EMMC_HS400)){
  1535. if ((mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) &&
  1536. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8_DDR) == MMC_ERR_NONE) &&
  1537. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 3) == MMC_ERR_NONE)){
  1538. printf("[SD%d] Switch to HS400 mode!\n", id);
  1539. mmc_card_clr_speed_mode(card);
  1540. mmc_card_set_hs400(card);
  1541. /* hs400 used ddr mode */
  1542. mmc_card_set_ddr(card);
  1543. } else {
  1544. result = -__LINE__;
  1545. goto failure;
  1546. }
  1547. } else if ((clkhz > MSDC_52M_SCLK) && (host->caps & MMC_CAP_EMMC_HS200)){
  1548. if ((mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) &&
  1549. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8) == MMC_ERR_NONE) &&
  1550. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 2) == MMC_ERR_NONE)){
  1551. printf("[SD%d] Switch to HS200 mode!\n", id);
  1552. mmc_card_clr_speed_mode(card);
  1553. mmc_card_set_hs200(card);
  1554. /*if ddr enable, disable it */
  1555. if (host->caps & MMC_CAP_DDR){
  1556. host->caps &= ~MMC_CAP_DDR;
  1557. mmc_card_clr_ddr(card);
  1558. }
  1559. } else {
  1560. result = -__LINE__;
  1561. goto failure;
  1562. }
  1563. } else if ((clkhz > MSDC_26M_SCLK) && (clkhz <= MSDC_52M_SCLK) && (host->caps & MMC_CAP_DDR)){
  1564. if ((mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) &&
  1565. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8_DDR) == MMC_ERR_NONE)){
  1566. printf("[SD%d] Switch to DDR50 mode!\n", id);
  1567. mmc_card_clr_speed_mode(card);
  1568. mmc_card_set_highspeed(card);
  1569. mmc_card_set_ddr(card);
  1570. } else {
  1571. result = -__LINE__;
  1572. goto failure;
  1573. }
  1574. } else if ((clkhz > MSDC_26M_SCLK) && (host->caps & MMC_CAP_MMC_HIGHSPEED)){
  1575. if (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE){
  1576. printf("[SD%d] Switch to High-Speed mode!\n", id);
  1577. mmc_card_clr_speed_mode(card);
  1578. mmc_card_set_highspeed(card);
  1579. } else {
  1580. result = -__LINE__;
  1581. goto failure;
  1582. }
  1583. } else if(clkhz > 0){
  1584. if (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 0) == MMC_ERR_NONE){
  1585. printf("[SD%d] Switch to Default mode!\n", id);
  1586. mmc_card_clr_speed_mode(card);
  1587. mmc_card_set_backyard(card);
  1588. } else {
  1589. result = -__LINE__;
  1590. goto failure;
  1591. }
  1592. }
  1593. }
  1594. #if defined(MMC_MSDC_DRV_CTP)
  1595. else if (card && mmc_card_sd(card) && (card->version > SD_VER_10)) {
  1596. int uhsmode = 0;
  1597. if ((clkhz > MSDC_100M_SCLK) && (host->caps & MMC_CAP_SD_UHS1)) {
  1598. uhsmode = MMC_SWITCH_MODE_SDR104;
  1599. } else if (clkhz > MSDC_50M_SCLK){
  1600. if (card->sw_caps.ddr && msdc_cap[id].flags & MSDC_DDR) {
  1601. uhsmode = MMC_SWITCH_MODE_DDR50;
  1602. } else {
  1603. uhsmode = MMC_SWITCH_MODE_SDR50;
  1604. }
  1605. } else if ((clkhz > MSDC_25M_SCLK) && (host->caps & MMC_CAP_SD_HIGHSPEED)){
  1606. uhsmode = MMC_SWITCH_MODE_SDR25;
  1607. /*if ddr enable, disable it */
  1608. if (host->caps & MMC_CAP_DDR){
  1609. host->caps &= ~MMC_CAP_DDR;
  1610. mmc_card_clr_ddr(card);
  1611. }
  1612. } else if (clkhz > 0){
  1613. uhsmode = MMC_SWITCH_MODE_SDR12;
  1614. }
  1615. if (mmc_switch_uhs1(host, card, uhsmode) != 0){
  1616. result = -__LINE__;
  1617. goto failure;
  1618. }
  1619. }
  1620. #endif
  1621. failure:
  1622. if(result)
  1623. printf("[%s]: result=%d\n", __func__, result);
  1624. return;
  1625. }
  1626. void mmc_set_clock(struct mmc_host *host, int ddr, u32 hz)
  1627. {
  1628. unsigned int hs_timing = 0;
  1629. if (hz >= host->f_max) {
  1630. hz = host->f_max;
  1631. } else if (hz < host->f_min) {
  1632. hz = host->f_min;
  1633. }
  1634. //mmc_switch_card_timing(host, hz);
  1635. if (host->card && mmc_card_hs400(host->card)){
  1636. hs_timing |= EXT_CSD_HS_TIMEING_HS400;
  1637. }
  1638. if (host->card) {
  1639. msdc_config_clock(host, (mmc_card_ddr(host->card) > 0) ? 1 : 0, hz, hs_timing);
  1640. } else {
  1641. msdc_config_clock(host, ddr ? 1 : 0, hz, hs_timing);
  1642. }
  1643. }
  1644. int mmc_set_ext_csd(struct mmc_card *card, uint8 addr, uint8 value)
  1645. {
  1646. int err;
  1647. u8 *ext_csd;
  1648. /* can't write */
  1649. if (192 <= addr || !card || !mmc_card_mmc(card))
  1650. return MMC_ERR_INVALID;
  1651. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL, addr, value);
  1652. if (err == MMC_ERR_NONE) {
  1653. err = mmc_read_ext_csd(card->host, card);
  1654. if (err == MMC_ERR_NONE) {
  1655. ext_csd = &card->raw_ext_csd[0];
  1656. if (ext_csd[addr] != value)
  1657. err = MMC_ERR_FAILED;
  1658. }
  1659. }
  1660. return err;
  1661. }
  1662. int mmc_set_card_detect(struct mmc_host *host, struct mmc_card *card, int connect)
  1663. {
  1664. int err;
  1665. struct mmc_command cmd;
  1666. cmd.opcode = SD_ACMD_SET_CLR_CD;
  1667. cmd.arg = connect;
  1668. cmd.rsptyp = RESP_R1; /* CHECKME */
  1669. cmd.retries = CMD_RETRIES;
  1670. cmd.timeout = CMD_TIMEOUT;
  1671. err = mmc_app_cmd(host, &cmd, card->rca, CMD_RETRIES);
  1672. return err;
  1673. }
  1674. int mmc_set_blk_length(struct mmc_host *host, u32 blklen)
  1675. {
  1676. int err;
  1677. struct mmc_command cmd;
  1678. /* set block len */
  1679. cmd.opcode = MMC_CMD_SET_BLOCKLEN;
  1680. cmd.rsptyp = RESP_R1;
  1681. cmd.arg = blklen;
  1682. cmd.retries = 3;
  1683. cmd.timeout = CMD_TIMEOUT;
  1684. err = mmc_cmd(host, &cmd);
  1685. if (err == MMC_ERR_NONE)
  1686. msdc_set_blklen(host, blklen);
  1687. return err;
  1688. }
  1689. #if defined(MMC_MSDC_DRV_CTP)
  1690. int mmc_set_blk_count(struct mmc_host *host, u32 blkcnt)
  1691. {
  1692. int err;
  1693. struct mmc_command cmd;
  1694. /* set block count */
  1695. cmd.opcode = MMC_CMD_SET_BLOCK_COUNT;
  1696. cmd.rsptyp = RESP_R1;
  1697. cmd.arg = blkcnt; /* bit31 is for reliable write request */
  1698. #if MSDC_USE_DATA_TAG
  1699. cmd.arg |= (1 << 29);
  1700. cmd.arg &= ~(1 << 30);
  1701. #endif
  1702. #if MSDC_USE_RELIABLE_WRITE
  1703. cmd.arg |= (1 << 31);
  1704. cmd.arg &= ~(1 << 30);
  1705. #endif
  1706. #if MSDC_USE_FORCE_FLUSH
  1707. cmd.arg |= (1 << 24);
  1708. cmd.arg &= ~(1 << 30);
  1709. #endif
  1710. #if MSDC_USE_PACKED_CMD
  1711. cmd.arg &= ~0xffff;
  1712. cmd.arg |= (1 << 30);
  1713. #endif
  1714. cmd.retries = 3;
  1715. cmd.timeout = CMD_TIMEOUT;
  1716. err = mmc_cmd(host, &cmd);
  1717. return err;
  1718. }
  1719. #endif
  1720. int mmc_set_bus_width(struct mmc_host *host, struct mmc_card *card, int width)
  1721. {
  1722. int err = MMC_ERR_NONE;
  1723. u32 arg = 0;
  1724. struct mmc_command cmd;
  1725. if (mmc_card_sd(card)) {
  1726. if (width == HOST_BUS_WIDTH_8) {
  1727. WARN_ON(width == HOST_BUS_WIDTH_8);
  1728. arg = SD_BUS_WIDTH_4;
  1729. width = HOST_BUS_WIDTH_4;
  1730. }
  1731. if ((width == HOST_BUS_WIDTH_4) && (host->caps & MMC_CAP_4_BIT_DATA)) {
  1732. arg = SD_BUS_WIDTH_4;
  1733. } else {
  1734. arg = SD_BUS_WIDTH_1;
  1735. width = HOST_BUS_WIDTH_1;
  1736. }
  1737. cmd.opcode = SD_ACMD_SET_BUSWIDTH;
  1738. cmd.arg = arg;
  1739. cmd.rsptyp = RESP_R1;
  1740. cmd.retries = CMD_RETRIES;
  1741. cmd.timeout = CMD_TIMEOUT;
  1742. err = mmc_app_cmd(host, &cmd, card->rca, 0);
  1743. if (err != MMC_ERR_NONE)
  1744. goto out;
  1745. msdc_config_bus(host, width);
  1746. } else if (mmc_card_mmc(card)) {
  1747. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1748. goto out;
  1749. if (width == HOST_BUS_WIDTH_8) {
  1750. if (host->caps & MMC_CAP_8_BIT_DATA) {
  1751. /* need make sure card current bus mode */
  1752. if (mmc_card_hs400(card)) {
  1753. arg = (host->caps & MMC_CAP_EMMC_HS400) ?
  1754. EXT_CSD_BUS_WIDTH_8_DDR : EXT_CSD_BUS_WIDTH_8;
  1755. } else if (mmc_card_highspeed(card)) {
  1756. arg = ((host->caps & MMC_CAP_DDR) && card->ext_csd.ddr_support) ?
  1757. EXT_CSD_BUS_WIDTH_8_DDR : EXT_CSD_BUS_WIDTH_8;
  1758. } else if (mmc_card_hs200(card) || mmc_card_backyard(card)) {
  1759. arg = EXT_CSD_BUS_WIDTH_8;
  1760. } else {
  1761. width = HOST_BUS_WIDTH_4;
  1762. }
  1763. } else {
  1764. width = HOST_BUS_WIDTH_4;
  1765. }
  1766. }
  1767. if (width == HOST_BUS_WIDTH_4) {
  1768. if (host->caps & MMC_CAP_4_BIT_DATA) {
  1769. /* need make sure card current bus mode */
  1770. if (mmc_card_hs400(card)) {
  1771. arg = (host->caps & MMC_CAP_EMMC_HS400) ?
  1772. EXT_CSD_BUS_WIDTH_8_DDR : EXT_CSD_BUS_WIDTH_8;
  1773. } else if (mmc_card_highspeed(card)) {
  1774. arg = ((host->caps & MMC_CAP_DDR) && card->ext_csd.ddr_support) ?
  1775. EXT_CSD_BUS_WIDTH_4_DDR : EXT_CSD_BUS_WIDTH_4;
  1776. } else if (mmc_card_hs200(card) || mmc_card_backyard(card)) {
  1777. arg = EXT_CSD_BUS_WIDTH_4;
  1778. } else {
  1779. width = HOST_BUS_WIDTH_1;
  1780. }
  1781. } else {
  1782. width = HOST_BUS_WIDTH_1;
  1783. }
  1784. }
  1785. if (width == HOST_BUS_WIDTH_1)
  1786. arg = EXT_CSD_BUS_WIDTH_1;
  1787. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, arg);
  1788. if (err != MMC_ERR_NONE) {
  1789. printf("[SD%d] Switch to bus width(%d) failed\n", host->id, arg);
  1790. goto out;
  1791. }
  1792. if (arg == EXT_CSD_BUS_WIDTH_8_DDR || arg == EXT_CSD_BUS_WIDTH_4_DDR) {
  1793. mmc_card_set_ddr(card);
  1794. } else {
  1795. mmc_card_clr_ddr(card);
  1796. }
  1797. mmc_set_clock(host, mmc_card_ddr(card), host->cur_bus_clk);
  1798. msdc_config_bus(host, width);
  1799. } else {
  1800. BUG_ON(1); /* card is not recognized */
  1801. }
  1802. out:
  1803. #if 0
  1804. if (mmc_card_sd(card)) {
  1805. printf("[info][%s %d] switch to %dbit bus width, arg=0x%x, err = %d\n", __func__, __LINE__, (arg == SD_BUS_WIDTH_4) ? 4 : 1, arg, err);
  1806. } else {
  1807. switch (arg){
  1808. case EXT_CSD_BUS_WIDTH_1:
  1809. printf("[info][%s %d] switch to 1bit bus width, err = %d\n", __func__, __LINE__, err);
  1810. break;
  1811. case EXT_CSD_BUS_WIDTH_4:
  1812. printf("[info][%s %d] switch to 4bit bus width, err = %d\n", __func__, __LINE__, err);
  1813. break;
  1814. case EXT_CSD_BUS_WIDTH_8:
  1815. printf("[info][%s %d] switch to 8bit bus width, err = %d\n", __func__, __LINE__, err);
  1816. break;
  1817. case EXT_CSD_BUS_WIDTH_4_DDR:
  1818. printf("[info][%s %d] switch to 4bit bus width(DDR), err = %d\n", __func__, __LINE__, err);
  1819. break;
  1820. case EXT_CSD_BUS_WIDTH_8_DDR:
  1821. printf("[info][%s %d] switch to 8bit bus width(DDR), err = %d\n", __func__, __LINE__, err);
  1822. break;
  1823. default:
  1824. printf("[info][%s %d] switch to ?bit bus width(DDR), err = %d\n", __func__, __LINE__, err);
  1825. break;
  1826. }
  1827. }
  1828. #endif
  1829. return err;
  1830. }
  1831. int mmc_set_erase_grp_def(struct mmc_card *card, int enable)
  1832. {
  1833. int err = MMC_ERR_FAILED;
  1834. if (mmc_card_sd(card) || !mmc_card_highcaps(card))
  1835. goto out;
  1836. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1837. goto out;
  1838. err = mmc_set_ext_csd(card, EXT_CSD_ERASE_GRP_DEF,
  1839. EXT_CSD_ERASE_GRP_DEF_EN & enable);
  1840. out:
  1841. return err;
  1842. }
  1843. int mmc_set_gp_size(struct mmc_card *card, u8 id, u32 size)
  1844. {
  1845. int i;
  1846. int err = MMC_ERR_FAILED;
  1847. u8 gp[] = { EXT_CSD_GP1_SIZE_MULT, EXT_CSD_GP2_SIZE_MULT,
  1848. EXT_CSD_GP3_SIZE_MULT, EXT_CSD_GP4_SIZE_MULT };
  1849. u8 arg;
  1850. u8 *ext_csd = &card->raw_ext_csd[0];
  1851. if (mmc_card_sd(card) || !mmc_card_highcaps(card))
  1852. goto out;
  1853. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1854. goto out;
  1855. id--;
  1856. size /= 512 * 1024;
  1857. size /= (ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  1858. /* 143-144: GP_SIZE_MULT_X_0-GP_SIZE_MULT_X_2 */
  1859. for (i = 0; i < 3; i++) {
  1860. arg = (u8)(size & 0xFF);
  1861. size = size >> 8;
  1862. err = mmc_set_ext_csd(card, gp[id] + i, arg);
  1863. if (err)
  1864. goto out;
  1865. }
  1866. out:
  1867. return err;
  1868. }
  1869. int mmc_set_enh_size(struct mmc_card *card, u32 size)
  1870. {
  1871. int i;
  1872. int err = MMC_ERR_FAILED;
  1873. u8 arg;
  1874. u8 *ext_csd = &card->raw_ext_csd[0];
  1875. if (mmc_card_sd(card) || !mmc_card_highcaps(card))
  1876. goto out;
  1877. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1878. goto out;
  1879. /* need to set ERASE_GRP_DEF first?? */
  1880. if (0 == (card->raw_ext_csd[EXT_CSD_ERASE_GRP_DEF] & EXT_CSD_ERASE_GRP_DEF_EN))
  1881. goto out;
  1882. size /= (512 * 1024);
  1883. size /= (ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  1884. /* 140-142: ENH_SIZE_MULT0-ENH_SIZE_MULT2 */
  1885. for (i = 0; i < 3; i++) {
  1886. arg = (u8)(size & 0xFF);
  1887. size = size >> 8;
  1888. err = mmc_set_ext_csd(card, EXT_CSD_ENH_SIZE_MULT + i, arg);
  1889. if (err)
  1890. goto out;
  1891. }
  1892. out:
  1893. return err;
  1894. }
  1895. int mmc_set_enh_start_addr(struct mmc_card *card, u32 addr)
  1896. {
  1897. int i;
  1898. int err = MMC_ERR_FAILED;
  1899. u8 arg;
  1900. if (mmc_card_sd(card))
  1901. goto out;
  1902. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1903. goto out;
  1904. /* need to set ERASE_GRP_DEF first?? */
  1905. if (0 == (card->raw_ext_csd[EXT_CSD_ERASE_GRP_DEF] & EXT_CSD_ERASE_GRP_DEF_EN))
  1906. goto out;
  1907. /* start address would be round to protect group aligned. */
  1908. if (mmc_card_highcaps(card))
  1909. addr = addr / 512; /* in sector unit. otherwise in byte unit */
  1910. /* 136-139: ENH_START_ADDR0-ENH_START_ADDR3 */
  1911. for (i = 0; i < 4; i++) {
  1912. arg = (u8)(addr & 0xFF);
  1913. addr = addr >> 8;
  1914. err = mmc_set_ext_csd(card, EXT_CSD_ENH_START_ADDR + i, arg);
  1915. if (err)
  1916. goto out;
  1917. }
  1918. out:
  1919. return err;
  1920. }
  1921. int mmc_set_boot_bus(struct mmc_card *card, u8 rst_bwidth, u8 mode, u8 bwidth)
  1922. {
  1923. int err = MMC_ERR_FAILED;
  1924. u8 arg;
  1925. if (mmc_card_sd(card))
  1926. goto out;
  1927. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1928. goto out;
  1929. arg = mode | rst_bwidth | bwidth;
  1930. err = mmc_set_ext_csd(card, EXT_CSD_BOOT_BUS_WIDTH, arg);
  1931. out:
  1932. return err;
  1933. }
  1934. int mmc_set_part_config(struct mmc_card *card, u8 cfg)
  1935. {
  1936. int err = MMC_ERR_FAILED;
  1937. if (mmc_card_sd(card))
  1938. goto out;
  1939. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1940. goto out;
  1941. err = mmc_set_ext_csd(card, EXT_CSD_PART_CFG, cfg);
  1942. out:
  1943. return err;
  1944. }
  1945. int mmc_set_part_attr(struct mmc_card *card, u8 attr)
  1946. {
  1947. int err = MMC_ERR_FAILED;
  1948. if (mmc_card_sd(card))
  1949. goto out;
  1950. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1951. goto out;
  1952. if (!card->ext_csd.enh_attr_en) {
  1953. err = MMC_ERR_INVALID;
  1954. goto out;
  1955. }
  1956. attr &= 0x1F;
  1957. attr |= (card->raw_ext_csd[EXT_CSD_PART_ATTR] & 0x1F);
  1958. err = mmc_set_ext_csd(card, EXT_CSD_PART_ATTR, attr);
  1959. out:
  1960. return err;
  1961. }
  1962. int mmc_set_part_compl(struct mmc_card *card)
  1963. {
  1964. int err = MMC_ERR_FAILED;
  1965. if (mmc_card_sd(card))
  1966. goto out;
  1967. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1968. goto out;
  1969. err = mmc_set_ext_csd(card, EXT_CSD_PART_SET_COMPL,
  1970. EXT_CSD_PART_SET_COMPL_BIT);
  1971. out:
  1972. return err;
  1973. }
  1974. #if defined(MMC_MSDC_DRV_CTP)
  1975. int mmc_set_reset_func(struct mmc_card *card, u8 enable)
  1976. {
  1977. int err = MMC_ERR_FAILED;
  1978. u8 *ext_csd = &card->raw_ext_csd[0];
  1979. if (mmc_card_sd(card))
  1980. goto out;
  1981. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1982. goto out;
  1983. if (ext_csd[EXT_CSD_RST_N_FUNC] == 0) {
  1984. err = mmc_set_ext_csd(card, EXT_CSD_RST_N_FUNC, enable);
  1985. } else {
  1986. /* no need set */
  1987. return MMC_ERR_NONE;
  1988. }
  1989. out:
  1990. return err;
  1991. }
  1992. int mmc_boot_config(struct mmc_card *card, u8 acken, u8 enpart, u8 buswidth, u8 busmode)
  1993. {
  1994. int err = MMC_ERR_FAILED;
  1995. u8 val;
  1996. u8 rst_bwidth = 0;
  1997. u8 *ext_csd = &card->raw_ext_csd[0];
  1998. if (mmc_card_sd(card) || card->csd.mmca_vsn < CSD_SPEC_VER_4 ||
  1999. !card->ext_csd.boot_info || card->ext_csd.rev < 3)
  2000. goto out;
  2001. if (card->ext_csd.rev > 3 && !card->ext_csd.part_en)
  2002. goto out;
  2003. /* configure boot partition */
  2004. val = acken | enpart | (ext_csd[EXT_CSD_PART_CFG] & 0x7);
  2005. err = mmc_set_part_config(card, val);
  2006. if (err != MMC_ERR_NONE)
  2007. goto out;
  2008. /* update ext_csd information */
  2009. ext_csd[EXT_CSD_PART_CFG] = val;
  2010. /* configure boot bus mode and width */
  2011. rst_bwidth = (buswidth != EXT_CSD_BOOT_BUS_WIDTH_1 ? 1 : 0) << 2;
  2012. printf("=====Set boot Bus Width<%d>=======\n",buswidth);
  2013. printf("=====Set boot Bus mode<%d>=======\n",busmode);
  2014. err = mmc_set_boot_bus(card, rst_bwidth, busmode, buswidth);
  2015. out:
  2016. return err;
  2017. }
  2018. #if defined(FEATURE_MMC_BOOT_MODE)
  2019. int mmc_part_read(struct mmc_card *card, u8 partno, unsigned long blknr, u32 blkcnt, unsigned long *dst)
  2020. {
  2021. int err = MMC_ERR_FAILED;
  2022. u8 val;
  2023. u8 *ext_csd = &card->raw_ext_csd[0];
  2024. struct mmc_host *host = card->host;
  2025. if (mmc_card_sd(card) || card->csd.mmca_vsn < CSD_SPEC_VER_4 ||
  2026. !card->ext_csd.boot_info || card->ext_csd.rev < 3)
  2027. goto out;
  2028. if (card->ext_csd.rev > 3 && !card->ext_csd.part_en)
  2029. goto out;
  2030. /* configure to specified partition */
  2031. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | (partno & 0x7);
  2032. err = mmc_set_part_config(card, val);
  2033. if (err != MMC_ERR_NONE)
  2034. goto out;
  2035. /* write block to this partition */
  2036. err = mmc_block_read(host->id, blknr, blkcnt, dst);
  2037. out:
  2038. /* configure to user partition */
  2039. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | EXT_CSD_PART_CFG_DEFT_PART;
  2040. mmc_set_part_config(card, val);
  2041. return err;
  2042. }
  2043. int mmc_part_write(struct mmc_card *card, u8 partno, unsigned long blknr, u32 blkcnt, unsigned long *src)
  2044. {
  2045. int err = MMC_ERR_FAILED;
  2046. u8 val;
  2047. u8 *ext_csd = &card->raw_ext_csd[0];
  2048. struct mmc_host *host = card->host;
  2049. if (mmc_card_sd(card) || card->csd.mmca_vsn < CSD_SPEC_VER_4 ||
  2050. !card->ext_csd.boot_info || card->ext_csd.rev < 3)
  2051. goto out;
  2052. if (card->ext_csd.rev > 3 && !card->ext_csd.part_en)
  2053. goto out;
  2054. /* configure to specified partition */
  2055. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | (partno & 0x7);
  2056. err = mmc_set_part_config(card, val);
  2057. if (err != MMC_ERR_NONE)
  2058. goto out;
  2059. /* write block to this partition */
  2060. err = mmc_block_write(host->id, blknr, blkcnt, src);
  2061. out:
  2062. /* configure to user partition */
  2063. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | EXT_CSD_PART_CFG_DEFT_PART;
  2064. mmc_set_part_config(card, val);
  2065. return err;
  2066. }
  2067. #endif
  2068. #endif
  2069. #ifdef MTK_EMMC_POWER_ON_WP
  2070. int mmc_set_boot_prot(struct mmc_card *card, u8 prot)
  2071. {
  2072. int err = MMC_ERR_FAILED;
  2073. if (!mmc_card_mmc(card))
  2074. goto out;
  2075. WARN_ON(card->csd.mmca_vsn < CSD_SPEC_VER_4);
  2076. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  2077. goto out;
  2078. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2079. EXT_CSD_BOOT_CONFIG_PROT, prot);
  2080. out:
  2081. return err;
  2082. }
  2083. int mmc_set_boot_wp(struct mmc_card *card, EMMC_WP_TYPE type, Region partition)
  2084. {
  2085. int err = MMC_ERR_FAILED;
  2086. u8 value;
  2087. if (type == WP_DISABLE || type == WP_PERMANENT || type == WP_TEMPORARY){
  2088. return 0;
  2089. }
  2090. if (type > WP_DISABLE || type < 0){
  2091. goto out;
  2092. }
  2093. if (!mmc_card_mmc(card))
  2094. goto out;
  2095. WARN_ON(card->csd.mmca_vsn < CSD_SPEC_VER_4);
  2096. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  2097. goto out;
  2098. if(card->ext_csd.boot_wp & EXT_CSD_BOOT_WP_DIS_PWR_WP)
  2099. {
  2100. //dprintf(INFO, "[%s]: EXT_CSD_BOOT_WP_DIS_PWR_WP is err set \n", __func__);
  2101. goto out;
  2102. }
  2103. value = card->ext_csd.boot_wp | EXT_CSD_BOOT_WP_EN_PWR_WP;
  2104. //Set boot1 or boot2 protect
  2105. if (partition == EMMC_PART_BOOT1)
  2106. value &= ~EXT_CSD_BOOT_WP_WP_SEC_SEL;
  2107. else
  2108. value |= EXT_CSD_BOOT_WP_WP_SEC_SEL;
  2109. //Set only 1 protect according EXT_CSD_BOOT_WP_WP_SEC_SEL
  2110. value |= EXT_CSD_BOOT_WP_SEL;
  2111. //check if already set
  2112. if(card->ext_csd.boot_wp== value){
  2113. //dprintf(INFO, "[%s]: EXT_CSD_BOOT_WP alread set ",__func__);
  2114. return 0;
  2115. }
  2116. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2117. EXT_CSD_BOOT_WP, value);
  2118. if (err)
  2119. {
  2120. //dprintf(INFO, "[%s]: mmc_switch err %d\n", __func__,err);
  2121. goto out;
  2122. }
  2123. //check by read
  2124. err = mmc_read_ext_csd(card->host, card);
  2125. if (err)
  2126. {
  2127. dprintf(INFO, "[%s]: read ext_csd err %d\n", __func__,err);
  2128. }
  2129. out:
  2130. return err;
  2131. }
  2132. int mmc_set_user_wp(struct mmc_card *card, EMMC_WP_TYPE type, unsigned long blknr,
  2133. u32 blkcnt,Region partition)
  2134. {
  2135. int err = MMC_ERR_FAILED;
  2136. u8 value;
  2137. if (type == WP_DISABLE || type == WP_PERMANENT || type == WP_TEMPORARY){
  2138. return 0;
  2139. }
  2140. if (type > WP_DISABLE || type < 0){
  2141. goto out;
  2142. }
  2143. if (!mmc_card_mmc(card))
  2144. goto out;
  2145. WARN_ON(card->csd.mmca_vsn < CSD_SPEC_VER_4);
  2146. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  2147. goto out;
  2148. if(card->ext_csd.usr_wp & US_PWR_WP_DIS)
  2149. {
  2150. dprintf(CRITICAL, "[%s]: US_PWR_WP_DIS is err set \n", __func__);
  2151. goto out;
  2152. }
  2153. value = card->ext_csd.usr_wp | US_PWR_WP_EN;
  2154. value &= ~US_PERM_WP_EN;
  2155. //check if already set
  2156. if(card->ext_csd.usr_wp == value){
  2157. dprintf(CRITICAL, "[%s]: EXT_CSD_USR_WP alread set \n",__func__);
  2158. }
  2159. else
  2160. {
  2161. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2162. EXT_CSD_USR_WP, value);
  2163. if (err)
  2164. {
  2165. dprintf(CRITICAL, "[%s]: mmc_switch err %d\n", __func__,err);
  2166. goto out;
  2167. }
  2168. //check by read
  2169. err = mmc_read_ext_csd(card->host, card);
  2170. if (err)
  2171. {
  2172. dprintf(CRITICAL, "[%s]: read ext_csd err %d\n", __func__,err);
  2173. goto out;
  2174. }
  2175. dprintf(CRITICAL, "[%s]: card->ext_csd.usr_wp:%d\n", __func__,card->ext_csd.usr_wp);
  2176. }
  2177. //start to set the group wp
  2178. err = mmc_set_write_protect_by_group(card,
  2179. partition, blknr, blkcnt, type);
  2180. if (err)
  2181. {
  2182. dprintf(CRITICAL, "[%s]: mmc_set_write_protect_by_group err%d\n", __func__,err);
  2183. goto out;
  2184. }
  2185. //restore US_PWR_WP_EN
  2186. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2187. EXT_CSD_USR_WP, card->ext_csd.usr_wp & ~US_PWR_WP_EN);
  2188. if (err)
  2189. {
  2190. dprintf(CRITICAL, "[%s]: restore US_PWR_WP_EN err %d\n", __func__,err);
  2191. goto out;
  2192. }
  2193. //check by read
  2194. err = mmc_read_ext_csd(card->host, card);
  2195. if (err)
  2196. {
  2197. dprintf(CRITICAL, "[%s]: read ext_csd err %d\n", __func__,err);
  2198. }
  2199. //printf("[%s]: %d\n", __func__,card->ext_csd.usr_wp);
  2200. out:
  2201. return err;
  2202. }
  2203. #endif
  2204. int mmc_dev_bread(struct mmc_card *card, unsigned long blknr, u32 blkcnt, u8 *dst)
  2205. {
  2206. struct mmc_host *host = card->host;
  2207. u32 blksz = host->blklen;
  2208. int tune = 0;
  2209. #if defined(FEATURE_MMC_RD_TUNING)
  2210. int retry = 1;
  2211. #else
  2212. int retry = 3;
  2213. #endif
  2214. int err;
  2215. unsigned long src;
  2216. src = mmc_card_highcaps(card) ? blknr : blknr * blksz;
  2217. do {
  2218. mmc_prof_start();
  2219. if (!tune) {
  2220. err = host->blk_read(host, (uchar *)dst, src, blkcnt);
  2221. } else {
  2222. #ifdef FEATURE_MMC_RD_TUNING
  2223. if (mmc_card_mmc(card) && mmc_card_hs400(card)){
  2224. printf("[tune][%s:%d] start hs400 read tune\n", __func__, __LINE__);
  2225. err = msdc_tune_rw_hs400(host, (uchar *)dst, src, blkcnt, 0);
  2226. } else {
  2227. err = msdc_tune_bread(host, (uchar *)dst, src, blkcnt);
  2228. }
  2229. #endif
  2230. if (err && (host->cur_bus_clk > (host->f_max >> 4))) {
  2231. mmc_set_clock(host, mmc_card_ddr(card), host->cur_bus_clk >> 1);
  2232. err = host->blk_read(host, (uchar *)dst, src, blkcnt);
  2233. }
  2234. }
  2235. mmc_prof_stop();
  2236. if (err == MMC_ERR_NONE) {
  2237. mmc_prof_update(mmc_prof_read, blkcnt, mmc_prof_handle(host->id));
  2238. break;
  2239. }
  2240. #if defined(FEATURE_MMC_CM_TUNING) || defined(FEATURE_MMC_RD_TUNING)
  2241. if (err == MMC_ERR_BADCRC || err == MMC_ERR_ACMD_RSPCRC || err == MMC_ERR_CMD_RSPCRC){
  2242. if ( tune ) break;
  2243. tune = 1;
  2244. }
  2245. else if (err == MMC_ERR_READTUNEFAIL || err == MMC_ERR_CMDTUNEFAIL){
  2246. printf("[SD%d] Fail to tuning,%s",host->id,(err == MMC_ERR_CMDTUNEFAIL)?"cmd tune failed!\n":"read tune failed!\n");
  2247. break;
  2248. }
  2249. #endif
  2250. if (err == MMC_ERR_TIMEOUT ) {
  2251. printf("[SD%d] mmc_dev_bread TIMEOUT\n", host->id);
  2252. break;
  2253. }
  2254. } while (retry--);
  2255. return err;
  2256. }
  2257. static int mmc_dev_bwrite(struct mmc_card *card, unsigned long blknr, u32 blkcnt, u8 *src)
  2258. {
  2259. struct mmc_host *host = card->host;
  2260. u32 blksz = host->blklen;
  2261. u32 status;
  2262. int tune = 0;
  2263. #if defined(FEATURE_MMC_WR_TUNING)
  2264. int retry = 1;
  2265. #else
  2266. int retry = 3;
  2267. #endif
  2268. int err;
  2269. unsigned long dst;
  2270. dst = mmc_card_highcaps(card) ? blknr : blknr * blksz;
  2271. do {
  2272. mmc_prof_start();
  2273. if (!tune) {
  2274. err = host->blk_write(host, dst, (uchar *)src, blkcnt);
  2275. } else {
  2276. #if defined(FEATURE_MMC_WR_TUNING)
  2277. if (mmc_card_mmc(card) && mmc_card_hs400(card)){
  2278. err = msdc_tune_rw_hs400(host, (uchar *) dst, (ulong) src, blkcnt, 1);
  2279. } else {
  2280. err = msdc_tune_bwrite(host, dst, (uchar *)src, blkcnt);
  2281. }
  2282. #endif
  2283. if (err && (host->cur_bus_clk > (host->f_max >> 4))) {
  2284. mmc_set_clock(host, mmc_card_ddr(card), host->cur_bus_clk >> 1);
  2285. err = host->blk_write(host, dst, (uchar *)src, blkcnt);
  2286. }
  2287. }
  2288. if (err == MMC_ERR_NONE) {
  2289. do {
  2290. err = mmc_send_status(host, card, &status);
  2291. if (err) {
  2292. printf("[SD%d] Fail to send status %d\n", host->id, err);
  2293. break;
  2294. }
  2295. } while (!(status & R1_READY_FOR_DATA) ||
  2296. (R1_CURRENT_STATE(status) == 7));
  2297. mmc_prof_stop();
  2298. mmc_prof_update(mmc_prof_write, blkcnt, mmc_prof_handle(host->id));
  2299. MSG(OPS, "[SD%d] Write %d bytes (DONE)\n",
  2300. host->id, blkcnt * blksz);
  2301. break;
  2302. }
  2303. #if defined(FEATURE_MMC_WR_TUNING)
  2304. if (err == MMC_ERR_BADCRC || err == MMC_ERR_ACMD_RSPCRC || err == MMC_ERR_CMD_RSPCRC){
  2305. if ( tune ) break;
  2306. tune = 1;
  2307. }
  2308. #endif
  2309. if(err == MMC_ERR_TIMEOUT ) {
  2310. printf("[SD%d] mmc_dev_bwrite TIMEOUT\n", host->id);
  2311. break;
  2312. }
  2313. } while (retry--);
  2314. return err;
  2315. }
  2316. int mmc_block_read(int dev_num, unsigned long blknr, u32 blkcnt, unsigned long *dst)
  2317. {
  2318. struct mmc_host *host = mmc_get_host(dev_num);
  2319. struct mmc_card *card = mmc_get_card(dev_num);
  2320. u32 blksz = host->blklen;
  2321. u32 maxblks = host->max_phys_segs;
  2322. //u32 xfercnt = blkcnt / maxblks;
  2323. //u32 leftblks = blkcnt % maxblks;
  2324. u32 leftblks;
  2325. u8 *buf = (u8*)dst;
  2326. int ret;
  2327. if (!blkcnt)
  2328. return MMC_ERR_NONE;
  2329. if (blknr * (blksz / MMC_BLOCK_SIZE) > card->nblks) {
  2330. printf("[SD%d] Out of block range: blknr(%ld) > sd_blknr(%d)\n",
  2331. host->id, blknr, card->nblks);
  2332. return MMC_ERR_INVALID;
  2333. }
  2334. do {
  2335. leftblks=((blkcnt> maxblks) ? maxblks : blkcnt);
  2336. ret = mmc_dev_bread(card, (unsigned long)blknr, leftblks, buf);
  2337. if (ret)
  2338. return ret;
  2339. blknr += leftblks;
  2340. buf += maxblks * blksz;
  2341. blkcnt -= leftblks;
  2342. } while ( blkcnt );
  2343. return ret;
  2344. }
  2345. int mmc_block_write(int dev_num, unsigned long blknr, u32 blkcnt, unsigned long *src)
  2346. {
  2347. struct mmc_host *host = mmc_get_host(dev_num);
  2348. struct mmc_card *card = mmc_get_card(dev_num);
  2349. u32 blksz = host->blklen;
  2350. u32 maxblks = host->max_phys_segs;
  2351. //u32 xfercnt = blkcnt / maxblks;
  2352. //u32 leftblks = blkcnt % maxblks;
  2353. u32 leftblks;
  2354. u8 *buf = (u8*)src;
  2355. int ret;
  2356. if (!blkcnt)
  2357. return MMC_ERR_NONE;
  2358. if (blknr * (blksz / MMC_BLOCK_SIZE) > card->nblks) {
  2359. printf("[SD%d] Out of block range: blknr(%ld) > sd_blknr(%d)\n",
  2360. host->id, blknr, card->nblks);
  2361. return MMC_ERR_INVALID;
  2362. }
  2363. do {
  2364. leftblks=((blkcnt> maxblks) ? maxblks : blkcnt);
  2365. ret = mmc_dev_bwrite(card, (unsigned long)blknr, leftblks, buf);
  2366. if (ret)
  2367. return ret;
  2368. blknr += leftblks;
  2369. buf += maxblks * blksz;
  2370. blkcnt -= leftblks;
  2371. } while ( blkcnt );
  2372. return ret;
  2373. }
  2374. #if defined(MMC_MSDC_DRV_PRELOADER)
  2375. void mmc_stuff_buff(u8* buf)
  2376. {
  2377. memset(buf,0,512);
  2378. buf[0] = 0x10;
  2379. buf[1] = 0x06;
  2380. buf[2] = 0x01;
  2381. buf[3] = 0xF0;
  2382. buf[11]= 0xAA;
  2383. buf[12]= 0xA9;
  2384. buf[13]= 0x87;
  2385. buf[14]= 0x74;
  2386. buf[15]= 0x3C;
  2387. buf[16]= 0x71;
  2388. buf[17]= 0xFB;
  2389. buf[18]= 0xD4;
  2390. }
  2391. int mmc_get_sandisk_fwid(int id, u8* buf)
  2392. {
  2393. struct mmc_host *host;
  2394. struct mmc_card *card;
  2395. struct mmc_command stop;
  2396. int err = MMC_ERR_NONE;
  2397. u32 status;
  2398. u32 state = 0;
  2399. host = &sd_host[id];
  2400. card = &sd_card[id];
  2401. while (state != 4) {
  2402. err = mmc_send_status(host, card, &status);
  2403. if (err) {
  2404. printf("[SD%d] Fail to send status %d\n", host->id, err);
  2405. return err;
  2406. }
  2407. state = R1_CURRENT_STATE(status);
  2408. printf("check card state<%d>\n", state);
  2409. if (state == 5 || state == 6) {
  2410. printf("state<%d> need cmd12 to stop\n", state);
  2411. stop.opcode = MMC_CMD_STOP_TRANSMISSION;
  2412. stop.rsptyp = RESP_R1B;
  2413. stop.arg = 0;
  2414. stop.retries = CMD_RETRIES;
  2415. stop.timeout = CMD_TIMEOUT;
  2416. msdc_send_cmd(host, &stop);
  2417. msdc_wait_rsp(host, &stop); // don't tuning
  2418. } else if (state == 7) { // busy in programing
  2419. printf("state<%d> card is busy\n", state);
  2420. mdelay(100);
  2421. } else if (state != 4) {
  2422. printf("state<%d> ??? \n", state);
  2423. return MMC_ERR_INVALID;
  2424. }
  2425. }
  2426. mmc_stuff_buff(buf);
  2427. #if defined(MSDC_ENABLE_DMA_MODE)
  2428. err = msdc_dma_send_sandisk_fwid(host, buf,MMC_CMD50,1);
  2429. if (err) {
  2430. printf("[SD%d] Fail to send(CMD50) sandisk fwid %d\n", host->id, err);
  2431. return err;
  2432. }
  2433. err = msdc_dma_send_sandisk_fwid(host, buf,MMC_CMD21,1);
  2434. if (err) {
  2435. printf("[SD%d] Fail to get(CMD21) sandisk fwid %d\n", host->id, err);
  2436. return err;
  2437. }
  2438. #else
  2439. err = msdc_pio_send_sandisk_fwid(host, buf);
  2440. if (err) {
  2441. printf("[SD%d] Fail to send(CMD50) sandisk fwid %d\n", host->id, err);
  2442. return err;
  2443. }
  2444. err = msdc_pio_get_sandisk_fwid(host, buf);
  2445. if (err) {
  2446. printf("[SD%d] Fail to get(CMD21) sandisk fwid %d\n", host->id, err);
  2447. return err;
  2448. }
  2449. #endif
  2450. return err;
  2451. }
  2452. #endif
  2453. #ifdef FEATURE_MMC_BOOT_MODE
  2454. void mmc_boot_reset(struct mmc_host *host, int reset)
  2455. {
  2456. msdc_emmc_boot_reset(host, reset);
  2457. }
  2458. int mmc_boot_up(struct mmc_host *host, int ddr, int mode, u8 hostbuswidth, int ackdis, u32 *to, u64 size, int read_mode)
  2459. {
  2460. int err;
  2461. ERR_EXIT(msdc_emmc_boot_start(host, host->cur_bus_clk, ddr, mode, ackdis, hostbuswidth, size), err, MMC_ERR_NONE);
  2462. ERR_EXIT(msdc_emmc_boot_read(host, size, to, read_mode), err, MMC_ERR_NONE);
  2463. exit:
  2464. msdc_emmc_boot_stop(host);
  2465. return err;
  2466. }
  2467. #endif
  2468. int mmc_init_mem_card(struct mmc_host *host, struct mmc_card *card, u32 ocr)
  2469. {
  2470. int err = MMC_ERR_NONE, id = host->id;
  2471. #if defined(FEATURE_MMC_UHS1)
  2472. int s18a = 0;
  2473. #endif
  2474. /*
  2475. * Sanity check the voltages that the card claims to
  2476. * support.
  2477. */
  2478. if (ocr & 0x7F) {
  2479. printf("card claims to support voltages "
  2480. "below the defined range. These will be ignored.\n");
  2481. ocr &= ~0x7F;
  2482. }
  2483. ocr = host->ocr = mmc_select_voltage(host, ocr);
  2484. /*
  2485. * Can we support the voltage(s) of the card(s)?
  2486. */
  2487. if (!host->ocr) {
  2488. err = MMC_ERR_FAILED;
  2489. goto out;
  2490. }
  2491. mmc_go_idle(host);
  2492. /* send interface condition */
  2493. if (mmc_card_sd(card)) {
  2494. err = mmc_send_if_cond(host, ocr);
  2495. if (err != MMC_ERR_NONE) {
  2496. printf("msdc, send if cond error.\n");
  2497. goto out;
  2498. }
  2499. }
  2500. /* host support HCS[30] */
  2501. ocr |= (1 << 30);
  2502. #if defined(FEATURE_MMC_UHS1)
  2503. if (!err) {
  2504. /* host support S18A[24] and XPC[28]=1 to support speed class */
  2505. if (host->caps & MMC_CAP_SD_UHS1)
  2506. ocr |= ((1 << 28) | (1 << 24));
  2507. card->version = SD_VER_20;
  2508. }else {
  2509. card->version = SD_VER_10;
  2510. }
  2511. #else
  2512. card->version = SD_VER_10;
  2513. #endif
  2514. /* send operation condition */
  2515. if (mmc_card_sd(card)) {
  2516. err = mmc_send_app_op_cond(host, ocr, &card->ocr);
  2517. } else {
  2518. /* The extra bit indicates that we support high capacity */
  2519. err = mmc_send_op_cond(host, ocr, &card->ocr);
  2520. }
  2521. if (err != MMC_ERR_NONE) {
  2522. printf("[SD%d] Fail in SEND_OP_COND cmd\n", id);
  2523. goto out;
  2524. }
  2525. /* set hcs bit if a high-capacity card */
  2526. card->state |= ((card->ocr >> 30) & 0x1) ? MMC_STATE_HIGHCAPS : 0;
  2527. #if defined(FEATURE_MMC_UHS1)
  2528. s18a = (card->ocr >> 24) & 0x1;
  2529. printf("[SD%d] ocr = 0x%X, card->ocr=0x%X, s18a = %d \n", id, ocr, card->ocr, s18a);
  2530. #if 0
  2531. err = mmc_send_app_op_cond(host, ocr, &card->ocr);
  2532. if (err != MMC_ERR_NONE){
  2533. s18a = (card->ocr >> 24) & 0x1;
  2534. printf("[SD%d] ocr = 0x%X, s18a = %d \n", id, ocr, s18a);
  2535. }
  2536. err = mmc_send_app_op_cond(host, ocr, &card->ocr);
  2537. if (err != MMC_ERR_NONE){
  2538. s18a = (card->ocr >> 24) & 0x1;
  2539. printf("[SD%d] ocr = 0x%X, s18a = %d \n", id, ocr, s18a);
  2540. }
  2541. err = mmc_send_app_op_cond(host, ocr, &card->ocr);
  2542. if (err != MMC_ERR_NONE){
  2543. s18a = (card->ocr >> 24) & 0x1;
  2544. printf("[SD%d] ocr = 0x%X, s18a = %d \n", id, ocr, s18a);
  2545. }
  2546. err = mmc_send_app_op_cond(host, ocr, &card->ocr);
  2547. if (err != MMC_ERR_NONE){
  2548. s18a = (card->ocr >> 24) & 0x1;
  2549. printf("[SD%d] ocr = 0x%X, s18a = %d \n", id, ocr, s18a);
  2550. }
  2551. #endif
  2552. /* S18A support by card. switch to 1.8V signal */
  2553. if (s18a) {
  2554. card->version = SD_VER_30;
  2555. err = mmc_switch_volt(host, card);
  2556. if (err != MMC_ERR_NONE) {
  2557. printf("[SD%d] Fail in SWITCH_VOLT cmd\n", id);
  2558. goto out;
  2559. }
  2560. }
  2561. #endif
  2562. /* send cid */
  2563. err = mmc_all_send_cid(host, card->raw_cid);
  2564. if (err != MMC_ERR_NONE) {
  2565. printf("[SD%d] Fail in SEND_CID cmd\n", id);
  2566. goto out;
  2567. }
  2568. mmc_decode_cid(card);
  2569. if (mmc_card_mmc(card))
  2570. card->rca = 0x1; /* assign a rca */
  2571. /* set/send rca */
  2572. err = mmc_send_relative_addr(host, card, &card->rca);
  2573. if (err != MMC_ERR_NONE) {
  2574. printf("[SD%d] Fail in SEND_RCA cmd\n", id);
  2575. goto out;
  2576. }
  2577. /* send csd */
  2578. err = mmc_read_csds(host, card);
  2579. if (err != MMC_ERR_NONE) {
  2580. printf("[SD%d] Fail in SEND_CSD cmd\n", id);
  2581. goto out;
  2582. }
  2583. /* decode csd */
  2584. err = mmc_decode_csd(card);
  2585. if (err != MMC_ERR_NONE) {
  2586. printf("[SD%d] Fail in decode csd\n", id);
  2587. goto out;
  2588. }
  2589. /* select this card */
  2590. err = mmc_select_card(host, card);
  2591. if (err != MMC_ERR_NONE) {
  2592. printf("[SD%d] Fail in select card cmd\n", id);
  2593. goto out;
  2594. }
  2595. if (mmc_card_sd(card)) {
  2596. #if !defined(FEATURE_MMC_SLIM)
  2597. /* send scr */
  2598. err = mmc_read_scrs(host, card);
  2599. if (err != MMC_ERR_NONE) {
  2600. printf("[SD%d] Fail in SEND_SCR cmd\n", id);
  2601. goto out;
  2602. }
  2603. #endif
  2604. if ((card->csd.cmdclass & CCC_SWITCH) &&
  2605. (mmc_read_switch(host, card) == MMC_ERR_NONE)) {
  2606. do {
  2607. #if defined(FEATURE_MMC_UHS1)
  2608. if (s18a && (host->caps & MMC_CAP_SD_UHS1)) {
  2609. /* TODO: Switch driver strength first then current limit
  2610. * and access mode */
  2611. unsigned int freq, uhs_mode, drv_type, max_curr;
  2612. freq = min(host->f_max, card->sw_caps.hs_max_dtr);
  2613. if (freq > 100000000) {
  2614. uhs_mode = MMC_SWITCH_MODE_SDR104;
  2615. } else if (freq <= 100000000 && freq > 50000000) {
  2616. if (card->sw_caps.ddr && (host->caps & MMC_CAP_DDR)) {
  2617. uhs_mode = MMC_SWITCH_MODE_DDR50;
  2618. } else {
  2619. uhs_mode = MMC_SWITCH_MODE_SDR50;
  2620. }
  2621. } else if (freq <= 50000000 && freq > 25000000) {
  2622. uhs_mode = MMC_SWITCH_MODE_SDR25;
  2623. } else {
  2624. uhs_mode = MMC_SWITCH_MODE_SDR12;
  2625. }
  2626. drv_type = MMC_SWITCH_MODE_DRV_TYPE_B;
  2627. max_curr = MMC_SWITCH_MODE_CL_200MA;
  2628. if (mmc_switch_drv_type(host, card, drv_type) == MMC_ERR_NONE &&
  2629. mmc_switch_max_cur(host, card, max_curr) == MMC_ERR_NONE &&
  2630. mmc_switch_uhs1(host, card, uhs_mode) == MMC_ERR_NONE) {
  2631. break;
  2632. } else {
  2633. mmc_switch_drv_type(host, card, MMC_SWITCH_MODE_DRV_TYPE_B);
  2634. mmc_switch_max_cur(host, card, MMC_SWITCH_MODE_CL_200MA);
  2635. }
  2636. }
  2637. #endif
  2638. if (host->caps & MMC_CAP_SD_HIGHSPEED) {
  2639. mmc_switch_hs(host, card);
  2640. break;
  2641. }
  2642. } while(0);
  2643. }
  2644. /* set bus width */
  2645. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_4);
  2646. /* compute bus speed. */
  2647. card->maxhz = (unsigned int)-1;
  2648. if (mmc_card_highspeed(card) || mmc_card_uhs1(card)) {
  2649. if (card->maxhz > card->sw_caps.hs_max_dtr)
  2650. card->maxhz = card->sw_caps.hs_max_dtr;
  2651. } else if (card->maxhz > card->csd.max_dtr) {
  2652. card->maxhz = card->csd.max_dtr;
  2653. }
  2654. } else {
  2655. /* at the begin, the emmc card is under backward mode, this mode can support 1/4/8 buswidth */
  2656. mmc_card_set_backyard(card);
  2657. /* set bus width, if support HS200, needs to set 4 or 8 width first. */
  2658. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_8);
  2659. /*HS200 make sure host voltage support HS200*/
  2660. if ((host->caps & MMC_CAP_EMMC_HS200) && !(host->ocr_avail & 0x80)){//(MMC_VDD_17_18 | MMC_VDD_18_19))){
  2661. host->caps = host->caps & (~MMC_CAP_EMMC_HS200);
  2662. printf("[SD%d] can not switch to HS200:Host voltage not support!\n",id);
  2663. }
  2664. /* send ext csd */
  2665. err = mmc_read_ext_csd(host, card);
  2666. if (err != MMC_ERR_NONE) {
  2667. printf("[SD%d] Fail in SEND_EXT_CSD cmd\n", id);
  2668. goto out;
  2669. }
  2670. /* activate high speed (if supported) */
  2671. if ((card->ext_csd.hs_max_dtr > MSDC_52M_SCLK) && (host->caps & MMC_CAP_EMMC_HS400)){
  2672. err = mmc_set_blk_length(host, MMC_BLOCK_SIZE);
  2673. if(err == MMC_ERR_NONE)
  2674. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 2);
  2675. else
  2676. printf("[SD%d] Fail in set blklen cmd, card state=0x%x\n", id, card->state);
  2677. if(err == MMC_ERR_NONE)
  2678. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
  2679. else
  2680. printf("[SD%d] Switch to HS200 mode failed!\n", host->id);
  2681. if(err == MMC_ERR_NONE)
  2682. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8_DDR);
  2683. else
  2684. printf("[SD%d] Switch to High-Speed mode failed!\n", host->id);
  2685. if(err == MMC_ERR_NONE)
  2686. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 3);
  2687. else
  2688. printf("[SD%d] Switch to DDR mode failed!\n", id);
  2689. if (err == MMC_ERR_NONE) {
  2690. printf("[SD%d] Switch to HS400 mode!\n", host->id);
  2691. mmc_card_set_hs400(card);
  2692. }
  2693. else {
  2694. printf("[SD%d] Switch to HS400 mode failed!\n", host->id);
  2695. }
  2696. }else if ((card->ext_csd.hs_max_dtr > 52000000) && (host->caps & MMC_CAP_EMMC_HS200)){
  2697. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 2);
  2698. if (err == MMC_ERR_NONE) {
  2699. printf("[SD%d] Switch to HS200 mode!\n", host->id);
  2700. mmc_card_set_hs200(card);
  2701. }
  2702. }
  2703. else if ((card->ext_csd.hs_max_dtr != 0) && (host->caps & MMC_CAP_MMC_HIGHSPEED)) {
  2704. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
  2705. if (err == MMC_ERR_NONE) {
  2706. printf("[SD%d] Switch to High-Speed mode!\n", host->id);
  2707. mmc_card_set_highspeed(card);
  2708. }
  2709. if ((host->caps & MMC_CAP_DDR) && card->ext_csd.ddr_support )
  2710. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_8); //Set to 8bit and DDR
  2711. }
  2712. /* compute bus speed. */
  2713. card->maxhz = (unsigned int)-1;
  2714. if (mmc_card_highspeed(card)) {
  2715. card->maxhz = 52000000;
  2716. } else if ( mmc_card_hs200(card) || mmc_card_hs400(card)) {
  2717. if (card->maxhz > card->ext_csd.hs_max_dtr)
  2718. card->maxhz = card->ext_csd.hs_max_dtr;
  2719. } else if (card->maxhz > card->csd.max_dtr) {
  2720. card->maxhz = card->csd.max_dtr;
  2721. }
  2722. }
  2723. /* set block len. note that cmd16 is illegal while mmc card is in ddr mode */
  2724. if (!(mmc_card_mmc(card) && (mmc_card_ddr(card) || mmc_card_hs400(card)))) {
  2725. err = mmc_set_blk_length(host, MMC_BLOCK_SIZE);
  2726. if (err != MMC_ERR_NONE) {
  2727. printf("[SD%d] Fail in set blklen cmd, card state=0x%x\n", id, card->state);
  2728. goto out;
  2729. }
  2730. }
  2731. /* set clear card detect */
  2732. if (mmc_card_sd(card))
  2733. mmc_set_card_detect(host, card, 0);
  2734. if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) {
  2735. /* The EXT_CSD sector count is in number or 512 byte sectors. */
  2736. card->blklen = MMC_BLOCK_SIZE;
  2737. card->nblks = card->ext_csd.sectors;
  2738. } else {
  2739. /* The CSD capacity field is in units of read_blkbits.
  2740. * set_capacity takes units of 512 bytes.
  2741. */
  2742. card->blklen = MMC_BLOCK_SIZE;
  2743. card->nblks = card->csd.capacity << (card->csd.read_blkbits - 9);
  2744. }
  2745. printf("[SD%d] Size: %d MB, Max.Speed: %d kHz, blklen(%d), nblks(%d), ro(%d)\n",
  2746. id, ((card->nblks / 1024) * card->blklen) / 1024 , card->maxhz / 1000,
  2747. card->blklen, card->nblks, mmc_card_readonly(card));
  2748. card->ready = 1;
  2749. printf("[%s %d][SD%d] Initialized, %s%d\n", __func__, __LINE__, id, mmc_card_sd(card)?"SD":"eMMC", card->version);
  2750. out:
  2751. return err;
  2752. }
  2753. int mmc_init_card(struct mmc_host *host, struct mmc_card *card)
  2754. {
  2755. int err, id = host->id;
  2756. u32 ocr;
  2757. printf("[%s]: start\n", __func__);
  2758. memset(card, 0, sizeof(struct mmc_card));
  2759. mmc_prof_init(id, host, card);
  2760. mmc_prof_start();
  2761. #ifdef FEATURE_MMC_CARD_DETECT
  2762. if (!msdc_card_avail(host)) {
  2763. err = MMC_ERR_INVALID;
  2764. goto out;
  2765. }
  2766. #endif
  2767. #if 0
  2768. if (msdc_card_protected(host))
  2769. mmc_card_set_readonly(card);
  2770. #endif
  2771. mmc_card_set_present(card);
  2772. mmc_card_set_host(card, host);
  2773. mmc_card_set_unknown(card);
  2774. mmc_go_idle(host);
  2775. /* send interface condition */
  2776. mmc_send_if_cond(host, host->ocr_avail);
  2777. #if defined(FEATURE_MMC_SDIO)
  2778. if (mmc_send_io_op_cond(host, 0, &ocr) == MMC_ERR_NONE) {
  2779. mmc_card_set_sdio(card);
  2780. err = mmc_init_sdio_card(host, card, ocr);
  2781. if (err != MMC_ERR_NONE) {
  2782. printf("[SD%d] Fail in init sdio card\n", id);
  2783. goto out;
  2784. }
  2785. /* no memory present */
  2786. if ((ocr & 0x08000000) == 0) {
  2787. goto out;
  2788. }
  2789. }
  2790. #endif
  2791. /* query operation condition */
  2792. err = mmc_send_app_op_cond(host, 0, &ocr);
  2793. if (err != MMC_ERR_NONE) {
  2794. err = mmc_send_op_cond(host, 0, &ocr);
  2795. if (err != MMC_ERR_NONE) {
  2796. printf("[SD%d] Fail in MMC_CMD_SEND_OP_COND/SD_ACMD_SEND_OP_COND cmd\n", id);
  2797. goto out;
  2798. }
  2799. mmc_card_set_mmc(card);
  2800. } else {
  2801. mmc_card_set_sd(card);
  2802. }
  2803. err = mmc_init_mem_card(host, card, ocr);
  2804. if (err)
  2805. goto out;
  2806. /* change clock */
  2807. printf("before host->cur_bus_clk(%d)\n",host->cur_bus_clk);
  2808. mmc_set_clock(host, mmc_card_ddr(card), card->maxhz);
  2809. printf("host->cur_bus_clk(%d)\n",host->cur_bus_clk);
  2810. #if defined(FEATURE_MMC_UHS1)
  2811. /* tune timing */
  2812. mmc_tune_timing(host, card);
  2813. #endif
  2814. out:
  2815. mmc_prof_stop();
  2816. mmc_prof_update(mmc_prof_card_init, (ulong)id, (void*)err);
  2817. if (err) {
  2818. //msdc_power(host, MMC_POWER_OFF);
  2819. printf("[%s]: failed, err=%d\n", __func__, err);
  2820. return err;
  2821. }
  2822. host->card = card;
  2823. // HS400 change again, previous mmc_set_clock host->card is null.
  2824. // host is not set to HS400
  2825. if (mmc_card_hs400(card)) {
  2826. mmc_set_clock(host, mmc_card_ddr(card), card->maxhz);
  2827. }
  2828. printf("[%s]: finish successfully\n", __func__);
  2829. return 0;
  2830. }
  2831. #ifdef MTK_EMMC_POWER_ON_WP
  2832. int mmc_send_write_prot_type(struct mmc_card *card, u32 wp_addr, u32 *wp_type)
  2833. {
  2834. int err;
  2835. int result = MMC_ERR_NONE;
  2836. struct mmc_command cmd;
  2837. struct mmc_host *host = card->host;
  2838. u8 *buf = (u8*)wp_type;
  2839. //if (!(card->csd.cmdclass & CCC_WRITE_PROT))
  2840. // return MMC_ERR_INVALID;
  2841. cmd.opcode = MMC_CMD_SEND_WRITE_PROT_TYPE;
  2842. cmd.rsptyp = RESP_R1;
  2843. cmd.arg = wp_addr;
  2844. cmd.retries = 3;
  2845. cmd.timeout = CMD_TIMEOUT;
  2846. msdc_reset_tune_counter(host);
  2847. do{
  2848. msdc_set_blklen(host, 8);
  2849. msdc_set_timeout(host, 100000000, 0);
  2850. err = mmc_cmd(host, &cmd);
  2851. if (err != MMC_ERR_NONE)
  2852. goto out;
  2853. err = msdc_pio_read(host, (u32*)buf, 8);
  2854. if(err != MMC_ERR_NONE){
  2855. if(msdc_abort_handler(host, 1))
  2856. dprintf(INFO,"[SD%d] data abort failed\n",host->id);
  2857. result = msdc_tune_read(host);
  2858. }
  2859. }while(err && result != MMC_ERR_READTUNEFAIL);
  2860. msdc_reset_tune_counter(host);
  2861. out:
  2862. return err;
  2863. }
  2864. int mmc_verify_write_prot_type_by_group(struct mmc_card *card, unsigned long blknr,
  2865. u32 blkcnt, EMMC_WP_TYPE type){
  2866. int err = MMC_ERR_FAILED;
  2867. u32 count_wp;
  2868. u32 count_wp_rest;
  2869. u32 count_wp_group;
  2870. u32 i, j, z;
  2871. //memset(bd, 0, sizeof(bd_t) * MAX_BD_POOL_SZ);
  2872. //u8 status[512];
  2873. u8 status_bit;
  2874. //memset(status, 0, sizeof(u8) * 512);
  2875. u8 status[8] = {0xFF}; ;//64 bit
  2876. // Check the WP status
  2877. count_wp = blkcnt/card->wp_size;
  2878. count_wp_group = count_wp/32;
  2879. count_wp_rest = count_wp % 32;
  2880. if(type == WP_TEMPORARY)
  2881. {
  2882. status_bit = 0x55;
  2883. }else if(type == WP_POWER_ON)
  2884. {
  2885. status_bit = 0xAA;
  2886. }else if(type == WP_PERMANENT)
  2887. {
  2888. status_bit = 0xFF;
  2889. }else
  2890. {
  2891. status_bit = 0;
  2892. }
  2893. for(i = 0;i < count_wp_group;i++)
  2894. {
  2895. //err = mmc_send_write_prot_type(card,blknr+index*32*card.wp_size,wp_type);
  2896. err = mmc_send_write_prot_type(card, blknr+i*32*card->wp_size, (u32 *) status);
  2897. if (err)
  2898. {
  2899. dprintf(CRITICAL, "[%s]: mmc_send_write_prot_type err %d \n", __func__,err);
  2900. goto out;
  2901. }
  2902. //check each
  2903. for(j = 0; j < 8; j++)
  2904. {
  2905. if(status[j] != status_bit)
  2906. {
  2907. err = MMC_ERR_FAILED;
  2908. goto out;
  2909. }
  2910. }
  2911. //printf(" wp_type %d\n", status[j]);
  2912. }
  2913. //verify the rest bit
  2914. err = mmc_send_write_prot_type(card, blknr+count_wp_group*32*card->wp_size, (u32 *) status);
  2915. if (err)
  2916. {
  2917. dprintf(CRITICAL, "[%s]: mmc_send_write_prot_type err %d \n", __func__,err);
  2918. goto out;
  2919. }
  2920. for(z = 0; z < 8; z++)
  2921. {
  2922. if(count_wp_rest >= 4)
  2923. {
  2924. if(status[7 - z] != status_bit)
  2925. {
  2926. err = MMC_ERR_FAILED;
  2927. goto out;
  2928. }
  2929. count_wp_rest -= 4;
  2930. }
  2931. else if(count_wp_rest >= 1)
  2932. {
  2933. u8 status_select = status[7 - z] & (0xFF >> (8 - count_wp_rest * 2));
  2934. u8 status_should = status_bit >> (8 - count_wp_rest * 2);
  2935. if(status_select != status_should)
  2936. {
  2937. err = MMC_ERR_FAILED;
  2938. goto out;
  2939. }
  2940. break;
  2941. }
  2942. else
  2943. break;
  2944. }
  2945. err = 0;
  2946. out:
  2947. return err;
  2948. }
  2949. int mmc_set_write_protect_by_group(struct mmc_card *card,
  2950. Region partition,unsigned long blknr,u32 blkcnt, EMMC_WP_TYPE type){
  2951. int err = MMC_ERR_FAILED;
  2952. u32 count_wp;
  2953. u32 index;
  2954. //check type
  2955. if(type == WP_PERMANENT || type == WP_DISABLE || type == WP_TEMPORARY)
  2956. {
  2957. dprintf(CRITICAL, "[%s]: Type Not Support\n", __func__);
  2958. return 0;
  2959. }
  2960. if(type > WP_DISABLE || type < 0)
  2961. {
  2962. dprintf(CRITICAL, "[%s]:%d type=%d\n", __func__,__LINE__,type);
  2963. return err;
  2964. }
  2965. //check partition
  2966. if(partition == EMMC_PART_UNKNOWN ||partition == EMMC_PART_BOOT2
  2967. ||partition == EMMC_PART_RPMB ||partition == EMMC_PART_GP1
  2968. ||partition == EMMC_PART_GP2 ||partition == EMMC_PART_GP3
  2969. ||partition == EMMC_PART_GP4 ||partition == EMMC_PART_BOOT1)
  2970. {
  2971. dprintf(CRITICAL, "[%s]: partition Not Support\n", __func__);
  2972. return 0;
  2973. }
  2974. if(partition >= EMMC_PART_END || partition < 0)
  2975. {
  2976. dprintf(CRITICAL, "[%s]:%d partition=%d\n", __func__,__LINE__,partition);
  2977. return err;
  2978. }
  2979. //u8 wp_type[8] = {0xFF}; ;//64 bit
  2980. err=mmc_switch_part(EMMC_PART_USER);
  2981. if (err)
  2982. {
  2983. dprintf(CRITICAL, "[%s]: mmc_switch_part err %d\n", __func__,err);
  2984. return err;
  2985. }
  2986. count_wp = blkcnt/card->wp_size;
  2987. dprintf(CRITICAL, "[%s]: count_wp %d\n", __func__,count_wp);
  2988. for(index=0;index<count_wp;index++)
  2989. {
  2990. err=mmc_set_write_prot(card->host,blknr+(index*card->wp_size));
  2991. if (err)
  2992. {
  2993. dprintf(CRITICAL, "[%s]: mmc_set_write_prot err %d \n", __func__,err);
  2994. return err;
  2995. }
  2996. }
  2997. err = mmc_verify_write_prot_type_by_group(card, blknr, blkcnt, type);
  2998. return err;
  2999. }
  3000. unsigned int mmc_set_write_protect(int dev_num, Region partition,unsigned long blknr,u32 blkcnt, EMMC_WP_TYPE type)
  3001. {
  3002. int err = MMC_ERR_FAILED;
  3003. // struct mmc_host *host = mmc_get_host(dev_num);
  3004. struct mmc_card *card = mmc_get_card(dev_num);
  3005. MSG(INF, "[%s]: mmc_set_write_protect start \n", __func__);
  3006. if(type==WP_POWER_ON && partition == EMMC_PART_USER)
  3007. {
  3008. //check the alignment and capility
  3009. //size[EMMC_PART_USER] = (u64)card->blklen * card->nblks;
  3010. MSG(INF, "wp_size: %d blknr: %d blkcnt: %d nblks: %d\n", card->wp_size,
  3011. blknr, blkcnt, card->nblks);
  3012. if (blknr % card->wp_size || blkcnt % card->wp_size
  3013. || (blknr + blkcnt > card->nblks))
  3014. {
  3015. dprintf(CRITICAL, "[%s]: alignment or capility error \n", __func__);
  3016. MSG(INF, "return code: %d\n", MMC_ERR_FAILED);
  3017. return MMC_ERR_FAILED;
  3018. }
  3019. err=mmc_set_user_wp(card,WP_POWER_ON, blknr, blkcnt, partition);
  3020. if (err)
  3021. {
  3022. dprintf(CRITICAL, "[%s]: mmc_set_user_wp err%d\n", __func__,err);
  3023. return err;
  3024. }
  3025. }
  3026. else if(type==WP_POWER_ON && partition == EMMC_PART_BOOT1)//Boot partition power on protect
  3027. {
  3028. err = mmc_set_boot_wp(card, WP_POWER_ON, partition);
  3029. if (err)
  3030. {
  3031. dprintf(CRITICAL, "[%s]: mmc_set_boot_wp err%d\n", __func__,err);
  3032. return err;
  3033. }
  3034. }
  3035. //check type
  3036. else if(type == WP_PERMANENT || type == WP_DISABLE || type == WP_TEMPORARY)
  3037. {
  3038. dprintf(CRITICAL, "[%s]: Type Not Support\n", __func__);
  3039. return 0;
  3040. }
  3041. //check partition
  3042. else if(partition == EMMC_PART_UNKNOWN ||partition == EMMC_PART_BOOT2
  3043. ||partition == EMMC_PART_RPMB ||partition == EMMC_PART_GP1
  3044. ||partition == EMMC_PART_GP2 ||partition == EMMC_PART_GP3
  3045. ||partition == EMMC_PART_GP4)
  3046. {
  3047. dprintf(CRITICAL, "[%s]: partition Not Support\n", __func__);
  3048. return 0;
  3049. }
  3050. else
  3051. {
  3052. return err;
  3053. }
  3054. return err;
  3055. }
  3056. #endif
  3057. int mmc_init_host(struct mmc_host *host, int id, int clksrc, u8 mode)
  3058. {
  3059. memset(host, 0, sizeof(struct mmc_host));
  3060. return msdc_init(id, host, clksrc, mode);
  3061. }
  3062. int mmc_init(int id, u32 trans_mode)
  3063. {
  3064. int err = MMC_ERR_NONE;
  3065. struct mmc_host *host;
  3066. struct mmc_card *card;
  3067. BUG_ON(id >= NR_MMC);
  3068. host = &sd_host[id];
  3069. card = &sd_card[id];
  3070. printf("[%s]: msdc%d start mmc_init_host() in LK...\n", __func__, id);
  3071. err = mmc_init_host(host, id, -1, trans_mode);
  3072. if (err == MMC_ERR_NONE){
  3073. printf("[%s]: msdc%d start mmc_init_card()in LK...\n", __func__, id);
  3074. err = mmc_init_card(host, card);
  3075. }
  3076. if(err != MMC_ERR_NONE){
  3077. return err;
  3078. }
  3079. #ifdef MTK_EMMC_SUPPORT_OTP
  3080. printf("[%s]: msdc%d, use hc erase size\n", __func__, id);
  3081. if(mmc_card_mmc(card))
  3082. err = mmc_set_erase_grp_def(card, 1);
  3083. #endif
  3084. #ifdef MMC_TEST
  3085. //mmc_test(0, NULL);
  3086. #endif
  3087. #ifdef MTK_EMMC_POWER_ON_WP
  3088. //mmc_wp_test();
  3089. #endif
  3090. return err;
  3091. }
  3092. #if defined(MMC_MSDC_DRV_CTP)
  3093. int mmc_polling_CD_INT(struct mmc_host * host)
  3094. {
  3095. return msdc_polling_CD_interrupt(host);
  3096. }
  3097. #endif