msdc.c 142 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204
  1. /*****************************************************************************
  2. * Copyright Statement:
  3. * --------------------
  4. * This software is protected by Copyright and the information contained
  5. * herein is confidential. The software may not be copied and the information
  6. * contained herein may not be used or disclosed except with the written
  7. * permission of MediaTek Inc. (C) 2010
  8. *
  9. * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. #include "msdc.h"
  36. #if defined(MMC_MSDC_DRV_CTP)
  37. #include <common.h>
  38. #include "api.h" //For invocation cache_clean_invalidate()
  39. #include "cache_api.h" //For invocation cache_clean_invalidate()
  40. #endif
  41. #if defined(MMC_MSDC_DRV_LK)
  42. #include <kernel/event.h>
  43. #include <platform/mt_irq.h>
  44. #endif
  45. #if defined(MMC_MSDC_DRV_CTP)
  46. #include "gpio.h"
  47. #if defined(MSDC_USE_DCM)
  48. #include "dcm.h"
  49. #endif
  50. #if !defined(FPGA_PLATFORM)
  51. #include "pmic.h"
  52. #include "clock_manager.h"
  53. #endif
  54. #endif
  55. static int msdc_rsp[] = {
  56. 0, /* RESP_NONE */
  57. 1, /* RESP_R1 */
  58. 2, /* RESP_R2 */
  59. 3, /* RESP_R3 */
  60. 4, /* RESP_R4 */
  61. 1, /* RESP_R5 */
  62. 1, /* RESP_R6 */
  63. 1, /* RESP_R7 */
  64. 7, /* RESP_R1b */
  65. };
  66. static msdc_priv_t msdc_priv[MSDC_MAX_NUM];
  67. #if MSDC_DEBUG
  68. static struct msdc_regs *msdc_reg[MSDC_MAX_NUM];
  69. #endif
  70. #if !defined(FPGA_PLATFORM)
  71. static u32 hclks_msdc0[] = {125130000, 150150000, 187690000, 178280000,
  72. 214500000, 187690000, 26000000, 208000000};
  73. static u32 hclks_msdc1[] = {125130000, 150150000, 187690000, 178280000,
  74. 214500000, 187690000, 26000000, 208000000};
  75. static u32 *msdc_src_clks = hclks_msdc1;
  76. #else
  77. static u32 msdc_src_clks[] = {12000000, 12000000, 12000000, 12000000,
  78. 12000000, 12000000, 12000000, 12000000};
  79. #endif
  80. void msdc_dump_card_status(u32 card_status)
  81. {
  82. #if MSDC_DEBUG
  83. static char *state[] = {
  84. "Idle", /* 0 */
  85. "Ready", /* 1 */
  86. "Ident", /* 2 */
  87. "Stby", /* 3 */
  88. "Tran", /* 4 */
  89. "Data", /* 5 */
  90. "Rcv", /* 6 */
  91. "Prg", /* 7 */
  92. "Dis", /* 8 */
  93. "Ina", /* 9 */
  94. "Sleep", /* 10 */
  95. "Reserved", /* 11 */
  96. "Reserved", /* 12 */
  97. "Reserved", /* 13 */
  98. "Reserved", /* 14 */
  99. "I/O mode", /* 15 */
  100. };
  101. if (card_status & R1_OUT_OF_RANGE)
  102. printf("\t[CARD_STATUS] Out of Range\n");
  103. if (card_status & R1_ADDRESS_ERROR)
  104. printf("\t[CARD_STATUS] Address Error\n");
  105. if (card_status & R1_BLOCK_LEN_ERROR)
  106. printf("\t[CARD_STATUS] Block Len Error\n");
  107. if (card_status & R1_ERASE_SEQ_ERROR)
  108. printf("\t[CARD_STATUS] Erase Seq Error\n");
  109. if (card_status & R1_ERASE_PARAM)
  110. printf("\t[CARD_STATUS] Erase Param\n");
  111. if (card_status & R1_WP_VIOLATION)
  112. printf("\t[CARD_STATUS] WP Violation\n");
  113. if (card_status & R1_CARD_IS_LOCKED)
  114. printf("\t[CARD_STATUS] Card is Locked\n");
  115. if (card_status & R1_LOCK_UNLOCK_FAILED)
  116. printf("\t[CARD_STATUS] Lock/Unlock Failed\n");
  117. if (card_status & R1_COM_CRC_ERROR)
  118. printf("\t[CARD_STATUS] Command CRC Error\n");
  119. if (card_status & R1_ILLEGAL_COMMAND)
  120. printf("\t[CARD_STATUS] Illegal Command\n");
  121. if (card_status & R1_CARD_ECC_FAILED)
  122. printf("\t[CARD_STATUS] Card ECC Failed\n");
  123. if (card_status & R1_CC_ERROR)
  124. printf("\t[CARD_STATUS] CC Error\n");
  125. if (card_status & R1_ERROR)
  126. printf("\t[CARD_STATUS] Error\n");
  127. if (card_status & R1_UNDERRUN)
  128. printf("\t[CARD_STATUS] Underrun\n");
  129. if (card_status & R1_OVERRUN)
  130. printf("\t[CARD_STATUS] Overrun\n");
  131. if (card_status & R1_CID_CSD_OVERWRITE)
  132. printf("\t[CARD_STATUS] CID/CSD Overwrite\n");
  133. if (card_status & R1_WP_ERASE_SKIP)
  134. printf("\t[CARD_STATUS] WP Eraser Skip\n");
  135. if (card_status & R1_CARD_ECC_DISABLED)
  136. printf("\t[CARD_STATUS] Card ECC Disabled\n");
  137. if (card_status & R1_ERASE_RESET)
  138. printf("\t[CARD_STATUS] Erase Reset\n");
  139. if (card_status & R1_READY_FOR_DATA)
  140. printf("\t[CARD_STATUS] Ready for Data\n");
  141. if (card_status & R1_SWITCH_ERROR)
  142. printf("\t[CARD_STATUS] Switch error\n");
  143. if (card_status & R1_URGENT_BKOPS)
  144. printf("\t[CARD_STATUS] Urgent background operations\n");
  145. if (card_status & R1_APP_CMD)
  146. printf("\t[CARD_STATUS] App Command\n");
  147. printf("\t[CARD_STATUS] '%s' State\n",
  148. state[R1_CURRENT_STATE(card_status)]);
  149. #endif
  150. }
  151. void msdc_dump_ocr_reg(u32 resp)
  152. {
  153. #if MSDC_DEBUG
  154. if (resp & (1 << 7))
  155. printf("\t[OCR] Low Voltage Range\n");
  156. if (resp & (1 << 15))
  157. printf("\t[OCR] 2.7-2.8 volt\n");
  158. if (resp & (1 << 16))
  159. printf("\t[OCR] 2.8-2.9 volt\n");
  160. if (resp & (1 << 17))
  161. printf("\t[OCR] 2.9-3.0 volt\n");
  162. if (resp & (1 << 18))
  163. printf("\t[OCR] 3.0-3.1 volt\n");
  164. if (resp & (1 << 19))
  165. printf("\t[OCR] 3.1-3.2 volt\n");
  166. if (resp & (1 << 20))
  167. printf("\t[OCR] 3.2-3.3 volt\n");
  168. if (resp & (1 << 21))
  169. printf("\t[OCR] 3.3-3.4 volt\n");
  170. if (resp & (1 << 22))
  171. printf("\t[OCR] 3.4-3.5 volt\n");
  172. if (resp & (1 << 23))
  173. printf("\t[OCR] 3.5-3.6 volt\n");
  174. if (resp & (1 << 24))
  175. printf("\t[OCR] Switching to 1.8V Accepted (S18A)\n");
  176. if (resp & (1 << 30))
  177. printf("\t[OCR] Card Capacity Status (CCS)\n");
  178. if (resp & (1UL << 31))
  179. printf("\t[OCR] Card Power Up Status (Idle)\n");
  180. else
  181. printf("\t[OCR] Card Power Up Status (Busy)\n");
  182. #endif
  183. }
  184. void msdc_dump_io_resp(u32 resp)
  185. {
  186. #if MSDC_DEBUG
  187. u32 flags = (resp >> 8) & 0xFF;
  188. char *state[] = {"DIS", "CMD", "TRN", "RFU"};
  189. if (flags & (1 << 7))
  190. printf("\t[IO] COM_CRC_ERR\n");
  191. if (flags & (1 << 6))
  192. printf("\t[IO] Illgal command\n");
  193. if (flags & (1 << 3))
  194. printf("\t[IO] Error\n");
  195. if (flags & (1 << 2))
  196. printf("\t[IO] RFU\n");
  197. if (flags & (1 << 1))
  198. printf("\t[IO] Function number error\n");
  199. if (flags & (1 << 0))
  200. printf("\t[IO] Out of range\n");
  201. printf("[IO] State: %s, Data:0x%x\n", state[(resp >> 12) & 0x3], resp & 0xFF);
  202. #endif
  203. }
  204. void msdc_dump_rca_resp(u32 resp)
  205. {
  206. #if MSDC_DEBUG
  207. u32 card_status = (((resp >> 15) & 0x1) << 23) |
  208. (((resp >> 14) & 0x1) << 22) |
  209. (((resp >> 13) & 0x1) << 19) |
  210. (resp & 0x1fff);
  211. printf("\t[RCA] 0x%x\n", resp >> 16);
  212. msdc_dump_card_status(card_status);
  213. #endif
  214. }
  215. #if defined(MMC_MSDC_DRV_CTP)
  216. static void msdc_dump_dbg_register(struct mmc_host *host)
  217. {
  218. u32 base = host->base;
  219. u32 i;
  220. for (i = 0; i < 26; i++) {
  221. MSDC_WRITE32(MSDC_DBG_SEL, i);
  222. printf("[SD%d]SW_DBG_SEL: write reg[%x] to 0x%x\n", host->id, OFFSET_MSDC_DBG_SEL, i);
  223. printf("[SD%d]SW_DBG_OUT: read reg[%x] to 0x%x\n", host->id, OFFSET_MSDC_DBG_OUT, MSDC_READ32(MSDC_DBG_OUT));
  224. }
  225. MSDC_WRITE32(MSDC_DBG_SEL, 0);
  226. }
  227. void msdc_dump_register(struct mmc_host *host)
  228. {
  229. u32 base = host->base;
  230. printf("[SD%d] Reg[%x] MSDC_CFG = 0x%x\n", host->id, OFFSET_MSDC_CFG, MSDC_READ32(MSDC_CFG));
  231. printf("[SD%d] Reg[%x] MSDC_IOCON = 0x%x\n", host->id, OFFSET_MSDC_IOCON, MSDC_READ32(MSDC_IOCON));
  232. printf("[SD%d] Reg[%x] MSDC_PS = 0x%x\n", host->id, OFFSET_MSDC_PS, MSDC_READ32(MSDC_PS));
  233. printf("[SD%d] Reg[%x] MSDC_INT = 0x%x\n", host->id, OFFSET_MSDC_INT, MSDC_READ32(MSDC_INT));
  234. printf("[SD%d] Reg[%x] MSDC_INTEN = 0x%x\n", host->id, OFFSET_MSDC_INTEN, MSDC_READ32(MSDC_INTEN));
  235. printf("[SD%d] Reg[%x] MSDC_FIFOCS = 0x%x\n", host->id, OFFSET_MSDC_FIFOCS, MSDC_READ32(MSDC_FIFOCS));
  236. printf("[SD%d] Reg[%x] MSDC_TXDATA = not read\n", host->id, OFFSET_MSDC_TXDATA);
  237. printf("[SD%d] Reg[%x] MSDC_RXDATA = not read\n", host->id, OFFSET_MSDC_RXDATA);
  238. printf("[SD%d] Reg[%x] SDC_CFG = 0x%x\n", host->id, OFFSET_SDC_CFG, MSDC_READ32(SDC_CFG));
  239. printf("[SD%d] Reg[%x] SDC_CMD = 0x%x\n", host->id, OFFSET_SDC_CMD, MSDC_READ32(SDC_CMD));
  240. printf("[SD%d] Reg[%x] SDC_ARG = 0x%x\n", host->id, OFFSET_SDC_ARG, MSDC_READ32(SDC_ARG));
  241. printf("[SD%d] Reg[%x] SDC_STS = 0x%x\n", host->id, OFFSET_SDC_STS, MSDC_READ32(SDC_STS));
  242. printf("[SD%d] Reg[%x] SDC_RESP0 = 0x%x\n", host->id, OFFSET_SDC_RESP0, MSDC_READ32(SDC_RESP0));
  243. printf("[SD%d] Reg[%x] SDC_RESP1 = 0x%x\n", host->id, OFFSET_SDC_RESP1, MSDC_READ32(SDC_RESP1));
  244. printf("[SD%d] Reg[%x] SDC_RESP2 = 0x%x\n", host->id, OFFSET_SDC_RESP2, MSDC_READ32(SDC_RESP2));
  245. printf("[SD%d] Reg[%x] SDC_RESP3 = 0x%x\n", host->id, OFFSET_SDC_RESP3, MSDC_READ32(SDC_RESP3));
  246. printf("[SD%d] Reg[%x] SDC_BLK_NUM = 0x%x\n", host->id, OFFSET_SDC_BLK_NUM, MSDC_READ32(SDC_BLK_NUM));
  247. printf("[SD%d] Reg[%x] SDC_VOL_CHG = 0x%x\n", host->id, OFFSET_SDC_VOL_CHG, MSDC_READ32(SDC_VOL_CHG));
  248. printf("[SD%d] Reg[%x] SDC_CSTS = 0x%x\n", host->id, OFFSET_SDC_CSTS, MSDC_READ32(SDC_CSTS));
  249. printf("[SD%d] Reg[%x] SDC_CSTS_EN = 0x%x\n", host->id, OFFSET_SDC_CSTS_EN, MSDC_READ32(SDC_CSTS_EN));
  250. printf("[SD%d] Reg[%x] SDC_DATCRC_STS = 0x%x\n", host->id, OFFSET_SDC_DCRC_STS, MSDC_READ32(SDC_DCRC_STS));
  251. printf("[SD%d] Reg[%x] EMMC_CFG0 = 0x%x\n", host->id, OFFSET_EMMC_CFG0, MSDC_READ32(EMMC_CFG0));
  252. printf("[SD%d] Reg[%x] EMMC_CFG1 = 0x%x\n", host->id, OFFSET_EMMC_CFG1, MSDC_READ32(EMMC_CFG1));
  253. printf("[SD%d] Reg[%x] EMMC_STS = 0x%x\n", host->id, OFFSET_EMMC_STS, MSDC_READ32(EMMC_STS));
  254. printf("[SD%d] Reg[%x] EMMC_IOCON = 0x%x\n", host->id, OFFSET_EMMC_IOCON, MSDC_READ32(EMMC_IOCON));
  255. printf("[SD%d] Reg[%x] SDC_ACMD_RESP = 0x%x\n", host->id, OFFSET_SDC_ACMD_RESP, MSDC_READ32(SDC_ACMD_RESP));
  256. printf("[SD%d] Reg[%x] SDC_ACMD19_TRG = 0x%x\n", host->id, OFFSET_SDC_ACMD19_TRG, MSDC_READ32(SDC_ACMD19_TRG));
  257. printf("[SD%d] Reg[%x] SDC_ACMD19_STS = 0x%x\n", host->id, OFFSET_SDC_ACMD19_STS, MSDC_READ32(SDC_ACMD19_STS));
  258. printf("[SD%d] Reg[%x] DMA_SA_HIGH4BIT= 0x%x\n", host->id, OFFSET_MSDC_DMA_SA_HIGH4BIT, MSDC_READ32(MSDC_DMA_SA_HIGH4BIT));
  259. printf("[SD%d] Reg[%x] DMA_SA = 0x%x\n", host->id, OFFSET_MSDC_DMA_SA, MSDC_READ32(MSDC_DMA_SA));
  260. printf("[SD%d] Reg[%x] DMA_CA = 0x%x\n", host->id, OFFSET_MSDC_DMA_CA, MSDC_READ32(MSDC_DMA_CA));
  261. printf("[SD%d] Reg[%x] DMA_CTRL = 0x%x\n", host->id, OFFSET_MSDC_DMA_CTRL, MSDC_READ32(MSDC_DMA_CTRL));
  262. printf("[SD%d] Reg[%x] DMA_CFG = 0x%x\n", host->id, OFFSET_MSDC_DMA_CFG, MSDC_READ32(MSDC_DMA_CFG));
  263. printf("[SD%d] Reg[%x] SW_DBG_SEL = 0x%x\n", host->id, OFFSET_MSDC_DBG_SEL, MSDC_READ32(MSDC_DBG_SEL));
  264. printf("[SD%d] Reg[%x] SW_DBG_OUT = 0x%x\n", host->id, OFFSET_MSDC_DBG_OUT, MSDC_READ32(MSDC_DBG_OUT));
  265. printf("[SD%d] Reg[%x] PATCH_BIT0 = 0x%x\n", host->id, OFFSET_MSDC_PATCH_BIT0,MSDC_READ32(MSDC_PATCH_BIT0));
  266. printf("[SD%d] Reg[%x] PATCH_BIT1 = 0x%x\n", host->id, OFFSET_MSDC_PATCH_BIT1,MSDC_READ32(MSDC_PATCH_BIT1));
  267. printf("[SD%d] Reg[%x] PATCH_BIT2 = 0x%x\n", host->id, OFFSET_MSDC_PATCH_BIT2,MSDC_READ32(MSDC_PATCH_BIT2));
  268. printf("[SD%d] Reg[%x] PAD_TUNE0 = 0x%x\n", host->id, OFFSET_MSDC_PAD_TUNE0, MSDC_READ32(MSDC_PAD_TUNE0));
  269. printf("[SD%d] Reg[%x] DAT_RD_DLY0 = 0x%x\n", host->id, OFFSET_MSDC_DAT_RDDLY0,MSDC_READ32(MSDC_DAT_RDDLY0));
  270. printf("[SD%d] Reg[%x] DAT_RD_DLY1 = 0x%x\n", host->id, OFFSET_MSDC_DAT_RDDLY1,MSDC_READ32(MSDC_DAT_RDDLY1));
  271. printf("[SD%d] Reg[%x] DAT_RD_DLY2 = 0x%x\n", host->id, OFFSET_MSDC_DAT_RDDLY2,MSDC_READ32(MSDC_DAT_RDDLY2));
  272. printf("[SD%d] Reg[%x] MAIN_VER = 0x%x\n", host->id, OFFSET_MSDC_VERSION, MSDC_READ32(MSDC_VERSION));
  273. if (host->id == 0){
  274. printf("[SD%d] Reg[%x] EMMC50_PAD_CTL0 = 0x%x\n", host->id, OFFSET_EMMC50_PAD_CTL0, MSDC_READ32(EMMC50_PAD_CTL0));
  275. printf("[SD%d] Reg[%x] EMMC50_PAD_DS_CTL0 = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DS_CTL0, MSDC_READ32(EMMC50_PAD_DS_CTL0));
  276. printf("[SD%d] Reg[%x] EMMC50_PAD_DS_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DS_TUNE, MSDC_READ32(EMMC50_PAD_DS_TUNE));
  277. printf("[SD%d] Reg[%x] EMMC50_PAD_CMD_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_CMD_TUNE, MSDC_READ32(EMMC50_PAD_CMD_TUNE));
  278. printf("[SD%d] Reg[%x] EMMC50_PAD_DAT01_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT01_TUNE, MSDC_READ32(EMMC50_PAD_DAT01_TUNE));
  279. printf("[SD%d] Reg[%x] EMMC50_PAD_DAT23_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT23_TUNE, MSDC_READ32(EMMC50_PAD_DAT23_TUNE));
  280. printf("[SD%d] Reg[%x] EMMC50_PAD_DAT45_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT45_TUNE, MSDC_READ32(EMMC50_PAD_DAT45_TUNE));
  281. printf("[SD%d] Reg[%x] EMMC50_PAD_DAT67_TUNE = 0x%x\n", host->id, OFFSET_EMMC50_PAD_DAT67_TUNE, MSDC_READ32(EMMC50_PAD_DAT67_TUNE));
  282. printf("[SD%d] Reg[%x] EMMC51_CFG0 = 0x%x\n", host->id, OFFSET_EMMC51_CFG0, MSDC_READ32(EMMC51_CFG0));
  283. printf("[SD%d] Reg[%x] EMMC50_CFG0 = 0x%x\n", host->id, OFFSET_EMMC50_CFG0, MSDC_READ32(EMMC50_CFG0));
  284. printf("[SD%d] Reg[%x] EMMC50_CFG1 = 0x%x\n", host->id, OFFSET_EMMC50_CFG1, MSDC_READ32(EMMC50_CFG1));
  285. printf("[SD%d] Reg[%x] EMMC50_CFG2 = 0x%x\n", host->id, OFFSET_EMMC50_CFG2, MSDC_READ32(EMMC50_CFG2));
  286. printf("[SD%d] Reg[%x] EMMC50_CFG3 = 0x%x\n", host->id, OFFSET_EMMC50_CFG3, MSDC_READ32(EMMC50_CFG3));
  287. printf("[SD%d] Reg[%x] EMMC50_CFG4 = 0x%x\n", host->id, OFFSET_EMMC50_CFG4, MSDC_READ32(EMMC50_CFG4));
  288. }
  289. msdc_dump_dbg_register(host);
  290. }
  291. #if !defined(FPGA_PLATFORM)
  292. static void msdc_dump_clock_sts(struct mmc_host *host)
  293. {
  294. #ifdef MTK_MSDC_BRINGUP_DEBUG
  295. printf(" cg [0x10000024][bit18 for msdc1, bit17 for msdc0]=0x%x\n", MSDC_READ32(TOPCKGEN_BASE+0x24));
  296. printf(" mux[0x10000000][bit20~22 for msdc1, bit11~13 for msdc0]=0x%x\n", MSDC_READ32(TOPCKGEN_BASE));
  297. #endif
  298. }
  299. #endif
  300. void msdc_dump_info(struct mmc_host *host)
  301. {
  302. // 1: dump msdc hw register
  303. msdc_dump_register(host);
  304. // 2: For designer
  305. msdc_dump_dbg_register(host);
  306. #if !defined(FPGA_PLATFORM)
  307. // 3: check msdc clock gate and clock source
  308. msdc_dump_clock_sts(host);
  309. #endif
  310. }
  311. #endif
  312. #if !defined(FPGA_PLATFORM)
  313. void msdc_set_smt(struct mmc_host *host, int set_smt)
  314. {
  315. switch(host->id){
  316. case 0:
  317. if (set_smt )
  318. MSDC_WRITE32(MSDC0_SMT_CFG_SET, MSDC0_SMT_ALL_MASK);
  319. else
  320. MSDC_WRITE32(MSDC0_SMT_CFG_CLR, MSDC0_SMT_ALL_MASK);
  321. break;
  322. case 1:
  323. if (set_smt)
  324. MSDC_WRITE32(MSDC1_SMT_CFG_SET, MSDC1_SMT_ALL_MASK);
  325. else
  326. MSDC_WRITE32(MSDC1_SMT_CFG_CLR, MSDC1_SMT_ALL_MASK);
  327. break;
  328. default:
  329. printf("error...msdc_set_smt out of range!!\n");
  330. break;
  331. }
  332. }
  333. void msdc_set_sr(struct mmc_host *host, int clk, int cmd, int dat, int rst, int ds)
  334. {
  335. switch(host->id){
  336. case 0:
  337. MSDC_SET_FIELD(MSDC0_SR_CFG_BASE, MSDC0_SR_ALL_MASK, clk);
  338. break;
  339. case 1:
  340. MSDC_SET_FIELD(MSDC1_SR_CFG_BASE, MSDC1_SR_ALL_MASK, clk);
  341. break;
  342. default:
  343. break;
  344. }
  345. }
  346. void msdc_set_rdtdsel(struct mmc_host *host, bool sd_18)
  347. {
  348. switch(host->id){
  349. case 0:
  350. MSDC_SET_FIELD(MSDC0_TDSEL_BASE, MSDC0_TDSEL_ALL_MASK, 0xA);
  351. MSDC_SET_FIELD(MSDC0_RDSEL_BASE, MSDC0_RDSEL_ALL_MASK, 0x0);
  352. break;
  353. case 1:
  354. if (sd_18){
  355. MSDC_SET_FIELD(MSDC1_TDSEL_BASE, MSDC1_TDSEL_ALL_MASK ,0xA);
  356. MSDC_SET_FIELD(MSDC1_RDSEL_BASE, MSDC1_RDSEL_ALL_MASK ,0x0);
  357. } else{
  358. MSDC_SET_FIELD(MSDC1_TDSEL_BASE, MSDC1_TDSEL_ALL_MASK ,0xA);
  359. MSDC_SET_FIELD(MSDC1_RDSEL_BASE, MSDC1_RDSEL_ALL_MASK ,0xC);
  360. }
  361. break;
  362. default:
  363. break;
  364. }
  365. }
  366. static void msdc_pin_pnul(struct mmc_host *host, int mode)
  367. {
  368. switch(host->id){
  369. case 0:
  370. if (!mode) {
  371. MSDC_SET_FIELD(MSDC0_PULL_R0_CFG_BASE, MSDC0_PULL_R_ALL_MASK, 0);
  372. MSDC_SET_FIELD(MSDC0_PULL_R1_CFG_BASE, MSDC0_PULL_R_ALL_MASK, 0);
  373. }
  374. break;
  375. case 1:
  376. if (!mode) {
  377. MSDC_SET_FIELD(MSDC1_PULL_R0_CFG_BASE, MSDC1_PULL_R_ALL_MASK, 0);
  378. MSDC_SET_FIELD(MSDC1_PULL_R1_CFG_BASE, MSDC1_PULL_R_ALL_MASK, 0);
  379. }
  380. break;
  381. default:
  382. break;
  383. }
  384. }
  385. static void msdc_pin_pud(struct mmc_host *host, u32 mode)
  386. {
  387. switch(host->id){
  388. case 0:
  389. if (mode) {
  390. //Attention: don't pull CLK high; Don't toggle RST to prevent from entering boot mode
  391. MSDC_SET_FIELD(MSDC0_PULL_SEL_CFG_BASE, MSDC0_PULL_SEL_ALL_MASK, 0x100);
  392. } else {
  393. MSDC_WRITE32(MSDC0_PULL_SEL_CFG_SET, MSDC0_PULL_SEL_ALL_MASK);
  394. }
  395. //Assume another pull-resistor is never set before, therefore no need to clear their correpsonding bit
  396. MSDC_SET_FIELD(MSDC0_PULL_R0_CFG_BASE, MSDC0_PULL_R_ALL_MASK, 0x6FF);
  397. MSDC_SET_FIELD(MSDC0_PULL_R1_CFG_BASE, MSDC0_PULL_R_ALL_MASK, 0x100);
  398. break;
  399. case 1:
  400. if (mode) {
  401. MSDC_SET_FIELD(MSDC1_PULL_SEL_CFG_BASE, MSDC1_PULL_SEL_ALL_MASK, 0x01);
  402. } else {
  403. MSDC_WRITE32(MSDC1_PULL_SEL_CFG_SET, MSDC1_PULL_SEL_ALL_MASK);
  404. }
  405. MSDC_SET_FIELD(MSDC1_PULL_R0_CFG_BASE, MSDC1_PULL_R_ALL_MASK, 0x3E);
  406. MSDC_SET_FIELD(MSDC1_PULL_R1_CFG_BASE, MSDC1_PULL_R_ALL_MASK, 0x01);
  407. break;
  408. default:
  409. break;
  410. }
  411. }
  412. /* host can modify from 0-7 */
  413. void msdc_set_driving(struct mmc_host *host, struct msdc_cust *msdc_cap, bool sd_18)
  414. {
  415. switch (host->id){
  416. case 0:
  417. if (sd_18) {
  418. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT7_DRVING, msdc_cap->dat_18v_drv);
  419. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT6_DRVING, msdc_cap->dat_18v_drv);
  420. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT5_DRVING, msdc_cap->dat_18v_drv);
  421. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT4_DRVING, msdc_cap->dat_18v_drv);
  422. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT3_DRVING, msdc_cap->dat_18v_drv);
  423. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT2_DRVING, msdc_cap->dat_18v_drv);
  424. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT1_DRVING, msdc_cap->dat_18v_drv);
  425. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT0_DRVING, msdc_cap->dat_18v_drv);
  426. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CLK_DRVING, msdc_cap->clk_18v_drv);
  427. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_RST_DRVING, msdc_cap->cmd_18v_drv);
  428. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CMD_DRVING, msdc_cap->cmd_18v_drv);
  429. } else {
  430. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT7_DRVING, msdc_cap->dat_drv);
  431. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT6_DRVING, msdc_cap->dat_drv);
  432. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT5_DRVING, msdc_cap->dat_drv);
  433. MSDC_SET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT4_DRVING, msdc_cap->dat_drv);
  434. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT3_DRVING, msdc_cap->dat_drv);
  435. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT2_DRVING, msdc_cap->dat_drv);
  436. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT1_DRVING, msdc_cap->dat_drv);
  437. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT0_DRVING, msdc_cap->dat_drv);
  438. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CLK_DRVING, msdc_cap->clk_drv);
  439. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_RST_DRVING, msdc_cap->rst_drv);
  440. MSDC_SET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CMD_DRVING, msdc_cap->cmd_drv);
  441. }
  442. break;
  443. case 1:
  444. if (sd_18) {
  445. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_CLK_DRVING, msdc_cap->clk_18v_drv);
  446. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_CMD_DRVING, msdc_cap->cmd_18v_drv);
  447. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT3_DRVING, msdc_cap->dat_18v_drv);
  448. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT2_DRVING, msdc_cap->dat_18v_drv);
  449. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT1_DRVING, msdc_cap->dat_18v_drv);
  450. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT0_DRVING, msdc_cap->dat_18v_drv);
  451. } else {
  452. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_CLK_DRVING, msdc_cap->clk_drv);
  453. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_CMD_DRVING, msdc_cap->cmd_drv);
  454. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT3_DRVING, msdc_cap->dat_drv);
  455. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT2_DRVING, msdc_cap->dat_drv);
  456. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT1_DRVING, msdc_cap->dat_drv);
  457. MSDC_SET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT0_DRVING, msdc_cap->dat_drv);
  458. }
  459. break;
  460. default:
  461. printf("error...msdc_set_driving out of range!!\n");
  462. break;
  463. }
  464. }
  465. #if defined(MMC_MSDC_DRV_CTP)
  466. void msdc_get_driving(struct mmc_host *host,struct msdc_cust *msdc_cap, bool sd_18)
  467. {
  468. switch(host->id){
  469. case 0:
  470. if (sd_18) {
  471. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT7_DRVING, msdc_cap->dat_18v_drv);
  472. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT6_DRVING, msdc_cap->dat_18v_drv);
  473. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT5_DRVING, msdc_cap->dat_18v_drv);
  474. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT4_DRVING, msdc_cap->dat_18v_drv);
  475. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT3_DRVING, msdc_cap->dat_18v_drv);
  476. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT2_DRVING, msdc_cap->dat_18v_drv);
  477. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT1_DRVING, msdc_cap->dat_18v_drv);
  478. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT0_DRVING, msdc_cap->dat_18v_drv);
  479. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CLK_DRVING, msdc_cap->clk_18v_drv);
  480. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_RST_DRVING, msdc_cap->cmd_18v_drv);
  481. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CMD_DRVING, msdc_cap->cmd_18v_drv);
  482. } else {
  483. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT7_DRVING, msdc_cap->dat_drv);
  484. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT6_DRVING, msdc_cap->dat_drv);
  485. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT5_DRVING, msdc_cap->dat_drv);
  486. MSDC_GET_FIELD(MSDC0_DRVING0_BASE, MSDC0_DAT4_DRVING, msdc_cap->dat_drv);
  487. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT3_DRVING, msdc_cap->dat_drv);
  488. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT2_DRVING, msdc_cap->dat_drv);
  489. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT1_DRVING, msdc_cap->dat_drv);
  490. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_DAT0_DRVING, msdc_cap->dat_drv);
  491. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CLK_DRVING, msdc_cap->clk_drv);
  492. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_RST_DRVING, msdc_cap->rst_drv);
  493. MSDC_GET_FIELD(MSDC0_DRVING1_BASE, MSDC0_CMD_DRVING, msdc_cap->cmd_drv);
  494. }
  495. break;
  496. case 1:
  497. if (sd_18) {
  498. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_CLK_DRVING, msdc_cap->clk_18v_drv);
  499. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_CMD_DRVING, msdc_cap->cmd_18v_drv);
  500. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT3_DRVING, msdc_cap->dat_18v_drv);
  501. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT2_DRVING, msdc_cap->dat_18v_drv);
  502. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT1_DRVING, msdc_cap->dat_18v_drv);
  503. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT0_DRVING, msdc_cap->dat_18v_drv);
  504. } else {
  505. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_CLK_DRVING, msdc_cap->clk_drv);
  506. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_CMD_DRVING, msdc_cap->cmd_drv);
  507. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT3_DRVING, msdc_cap->dat_drv);
  508. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT2_DRVING, msdc_cap->dat_drv);
  509. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT1_DRVING, msdc_cap->dat_drv);
  510. MSDC_GET_FIELD(MSDC1_DRVING_BASE, MSDC1_DAT0_DRVING, msdc_cap->dat_drv);
  511. }
  512. break;
  513. default:
  514. break;
  515. }
  516. }
  517. #endif
  518. #endif
  519. #if defined(MMC_MSDC_DRV_CTP)
  520. #if !defined(FPGA_PLATFORM)
  521. void msdc_pmic_VEMC_3V3_sel(MT65XX_POWER_VOLTAGE volt)
  522. {
  523. if (volt == VOL_3000) {
  524. pmic_set_register_value(PMIC_RG_VEMC_3V3_VOSEL, 0);
  525. } else if (volt == VOL_3300) {
  526. pmic_set_register_value(PMIC_RG_VEMC_3V3_VOSEL, 1);
  527. } else {
  528. printf("Not support to Set VEMC_3V3 power to %d\n", volt);
  529. }
  530. }
  531. void msdc_pmic_VMC_sel(MT65XX_POWER_VOLTAGE volt)
  532. {
  533. if (volt == VOL_3000) {
  534. pmic_set_register_value(PMIC_RG_VMC_VOSEL, 1);
  535. } else if (volt == VOL_1800) {
  536. pmic_set_register_value(PMIC_RG_VMC_VOSEL, 0);
  537. } else {
  538. printf("Not support to Set VMC power to %d\n", volt);
  539. }
  540. }
  541. void msdc_pmic_VMCH_sel(MT65XX_POWER_VOLTAGE volt)
  542. {
  543. if (volt == VOL_3000) {
  544. pmic_set_register_value(PMIC_RG_VMCH_VOSEL, 0);
  545. } else if (volt == VOL_3300) {
  546. pmic_set_register_value(PMIC_RG_VMCH_VOSEL, 1);
  547. } else {
  548. printf("Not support to Set VMCH power to %d\n", volt);
  549. }
  550. }
  551. u32 hwPowerOn(MSDC_POWER_DOMAIN powerId, MT65XX_POWER_VOLTAGE powerVolt)
  552. {
  553. switch (powerId){
  554. case MSDC_VEMC33:
  555. msdc_pmic_VEMC_3V3_sel(powerVolt);
  556. pmic_set_register_value(PMIC_QI_VEMC_3V3_EN, 1);
  557. mt6350_upmu_set_rg_vemc_3v3_en(1);
  558. break;
  559. case MSDC_VMC:
  560. msdc_pmic_VMC_sel(powerVolt);
  561. pmic_set_register_value(PMIC_QI_VMC_EN, 1);
  562. mt6350_upmu_set_rg_vmc_en(1);
  563. break;
  564. case MSDC_VMCH:
  565. msdc_pmic_VMCH_sel(powerVolt);
  566. pmic_set_register_value(PMIC_QI_VMCH_EN, 1);
  567. mt6350_upmu_set_rg_vmch_en(1);
  568. break;
  569. default:
  570. printf("Not support to Set %d power on\n", powerId);
  571. break;
  572. }
  573. mdelay(100); /* requires before voltage stable */
  574. return 0;
  575. }
  576. u32 hwPowerDown(MSDC_POWER_DOMAIN powerId)
  577. {
  578. switch (powerId){
  579. case MSDC_VEMC33:
  580. pmic_set_register_value(PMIC_QI_VEMC_3V3_EN, 0);
  581. mt6350_upmu_set_rg_vemc_3v3_en(0);
  582. break;
  583. case MSDC_VMC:
  584. pmic_set_register_value(PMIC_QI_VMC_EN, 0);
  585. mt6350_upmu_set_rg_vmc_en(0);
  586. break;
  587. case MSDC_VMCH:
  588. pmic_set_register_value(PMIC_QI_VMCH_EN, 0);
  589. mt6350_upmu_set_rg_vmch_en(0);
  590. break;
  591. default:
  592. printf("Not support to Set %d power down\n", powerId);
  593. break;
  594. }
  595. return 0;
  596. }
  597. static u32 msdc_ldo_power(u32 on, MSDC_POWER_DOMAIN powerId, MT65XX_POWER_VOLTAGE powerVolt, u32 *status)
  598. {
  599. if (on) { // want to power on
  600. if (*status == 0) { // can power on
  601. printf("msdc LDO<%d> power on<%d>\n", powerId, powerVolt);
  602. hwPowerOn(powerId, powerVolt);
  603. *status = powerVolt;
  604. } else if (*status == powerVolt) {
  605. printf("msdc LDO<%d><%d> power on again!\n", powerId, powerVolt);
  606. } else { // for sd3.0 later
  607. printf("msdc LDO<%d> change<%d> to <%d>\n", powerId, *status, powerVolt);
  608. hwPowerDown(powerId);
  609. hwPowerOn(powerId, powerVolt);
  610. *status = powerVolt;
  611. }
  612. } else { // want to power off
  613. if (*status != 0) { // has been powerred on
  614. printf("msdc LDO<%d> power off\n", powerId);
  615. hwPowerDown(powerId);
  616. *status = 0;
  617. } else {
  618. printf("LDO<%d> not power on\n", powerId);
  619. }
  620. }
  621. return 0;
  622. }
  623. #endif /* end of FPGA_PLATFORM */
  624. #endif /* end of MMC_MSDC_DRV_CTP */
  625. void msdc_clock(struct mmc_host *host, int on)
  626. {
  627. #if 0
  628. int clk_id = 0;
  629. switch(host->id)
  630. {
  631. case 0:
  632. clk_id = MT_CG_PERI_MSDC30_0;
  633. break;
  634. case 1:
  635. clk_id = MT_CG_PERI_MSDC30_1;
  636. break;
  637. case 2:
  638. clk_id = MT_CG_PERI_MSDC30_2;
  639. break;
  640. case 3:
  641. clk_id = MT_CG_PERI_MSDC30_3;
  642. break;
  643. }
  644. MSG(CFG, "[SD%d] Turn %s %s clock \n", host->id, on ? "on" : "off", "host");
  645. printf("[SD%d] Turn %s %s clock \n", host->id, on ? "on" : "off", "host");
  646. if (on)
  647. PERI_enable_clock(clk_id);
  648. else
  649. PERI_disable_clock(clk_id);
  650. #else
  651. MSG(CFG, "[SD%d] Turn %s %s clock \n", host->id, on ? "on" : "off", "host");
  652. #endif
  653. }
  654. void msdc_clr_fifo(struct mmc_host *host)
  655. {
  656. u32 base = host->base;
  657. MSDC_CLR_FIFO();
  658. }
  659. void msdc_reset(struct mmc_host *host)
  660. {
  661. u32 base = host->base;
  662. MSDC_RESET();
  663. }
  664. void msdc_abort(struct mmc_host *host)
  665. {
  666. u32 base = host->base;
  667. MSG(INF, "[SD%d] Abort: MSDC_FIFOCS=%xh MSDC_PS=%xh SDC_STS=%xh\n",
  668. host->id, MSDC_READ32(MSDC_FIFOCS), MSDC_READ32(MSDC_PS), MSDC_READ32(SDC_STS));
  669. /* reset controller */
  670. msdc_reset(host);
  671. /* clear fifo */
  672. msdc_clr_fifo(host);
  673. /* make sure txfifo and rxfifo are empty */
  674. if (MSDC_TXFIFOCNT() != 0 || MSDC_RXFIFOCNT() != 0) {
  675. MSG(INF, "[SD%d] Abort: TXFIFO(%d), RXFIFO(%d) != 0\n",
  676. host->id, MSDC_TXFIFOCNT(), MSDC_RXFIFOCNT());
  677. }
  678. /* clear all interrupts */
  679. MSDC_WRITE32(MSDC_INT, MSDC_READ32(MSDC_INT));
  680. }
  681. #if defined(FPGA_PLATFORM)
  682. #define PWR_GPIO (0x10001E84)
  683. #define PWR_GPIO_EO (0x10001E88)
  684. #define PWR_MASK_EN (0x1 << 8)
  685. #define PWR_MASK_VOL_18 (0x1 << 9)
  686. #define PWR_MASK_VOL_33 (0x1 << 10)
  687. #define PWR_MASK_L4 (0x1 << 11)
  688. #define PWR_MSDC (PWR_MASK_EN | PWR_MASK_VOL_18 | PWR_MASK_VOL_33 | PWR_MASK_L4)
  689. //#define FPGA_GPIO_DEBUG
  690. static void msdc_clr_gpio(u32 bits)
  691. {
  692. u32 l_val = 0;
  693. switch (bits){
  694. case PWR_MASK_EN:
  695. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_EN, l_val);
  696. //printf("====PWR_MASK_EN====%d\n", l_val);
  697. if (0 == l_val){
  698. printf("check me! [clr]gpio for card pwr is input\n");
  699. l_val = MSDC_READ32(PWR_GPIO_EO);
  700. l_val |= PWR_MASK_EN;
  701. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  702. }
  703. /* check for set before */
  704. if (PWR_MASK_EN & MSDC_READ32(PWR_GPIO)){
  705. printf("clear card pwr:\n");
  706. l_val = MSDC_READ32(PWR_GPIO);
  707. l_val &= ~PWR_MASK_EN;
  708. MSDC_WRITE32(PWR_GPIO, l_val);
  709. l_val = MSDC_READ32(PWR_GPIO);
  710. }
  711. break;
  712. case PWR_MASK_VOL_18:
  713. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_VOL_18, l_val);
  714. //printf("====PWR_MASK_VOL_18====%d\n", l_val);
  715. if (0 == l_val){
  716. printf("check me! [clr]gpio for card 1.8 pwr is input\n");
  717. l_val = MSDC_READ32(PWR_GPIO_EO);
  718. l_val |= PWR_MASK_VOL_18;
  719. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  720. }
  721. /* check for set before */
  722. if (PWR_MASK_VOL_18 & MSDC_READ32(PWR_GPIO)){
  723. printf("clear card 1.8v pwr:\n");
  724. l_val = MSDC_READ32(PWR_GPIO);
  725. l_val &= ~PWR_MASK_VOL_18;
  726. MSDC_WRITE32(PWR_GPIO, l_val);
  727. }
  728. break;
  729. case PWR_MASK_VOL_33:
  730. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_VOL_33, l_val);
  731. //printf("====PWR_MASK_VOL_33====%d\n", l_val);
  732. if (0 == l_val){
  733. printf("check me! gpio for card 3.3v pwr is input\n");
  734. l_val = MSDC_READ32(PWR_GPIO_EO);
  735. l_val |= PWR_MASK_VOL_33;
  736. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  737. }
  738. /* check for set before */
  739. if (PWR_MASK_VOL_33 & MSDC_READ32(PWR_GPIO)){
  740. printf("clear card 3.3v pwr:\n");
  741. l_val = MSDC_READ32(PWR_GPIO);
  742. l_val &= ~PWR_MASK_VOL_33;
  743. MSDC_WRITE32(PWR_GPIO, l_val);
  744. }
  745. break;
  746. case PWR_MASK_L4:
  747. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_L4, l_val);
  748. //printf("====PWR_MASK_L4====%d\n", l_val);
  749. if (0 == l_val){
  750. printf("check me! gpio for l4 dir is input\n");
  751. l_val = MSDC_READ32(PWR_GPIO_EO);
  752. l_val |= PWR_MASK_L4;
  753. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  754. }
  755. /* check for set before */
  756. if (PWR_MASK_L4 & MSDC_READ32(PWR_GPIO)){
  757. printf("clear l4 dir:\n");
  758. l_val = MSDC_READ32(PWR_GPIO);
  759. l_val &= ~PWR_MASK_L4;
  760. MSDC_WRITE32(PWR_GPIO, l_val);
  761. }
  762. break;
  763. default:
  764. printf("[%s:%s]invalid value: 0x%x\n", __FILE__, __func__, bits);
  765. break;
  766. }
  767. #ifdef FPGA_GPIO_DEBUG
  768. {
  769. u32 val = 0;
  770. val = MSDC_READ32(PWR_GPIO);
  771. printf("[clr]PWR_GPIO[8-11]:0x%x\n", val);
  772. val = MSDC_READ32(PWR_GPIO_EO);
  773. printf("[clr]GPIO_DIR[8-11] :0x%x\n", val);
  774. }
  775. #endif
  776. }
  777. static void msdc_set_gpio(u32 bits)
  778. {
  779. u32 l_val = 0;
  780. switch (bits){
  781. case PWR_MASK_EN:
  782. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_EN, l_val);
  783. //printf("====PWR_MASK_EN====%d\n", l_val);
  784. if (0 == l_val){
  785. printf("check me! [set]gpio for card pwr is input\n");
  786. l_val = MSDC_READ32(PWR_GPIO_EO);
  787. l_val |= PWR_MASK_EN;
  788. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  789. }
  790. /* check for set before */
  791. if (0 == (PWR_MASK_EN & MSDC_READ32(PWR_GPIO))){
  792. printf("set card pwr:\n");
  793. l_val = MSDC_READ32(PWR_GPIO);
  794. l_val |= PWR_MASK_EN;
  795. MSDC_WRITE32(PWR_GPIO, l_val);
  796. }
  797. break;
  798. case PWR_MASK_VOL_18:
  799. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_VOL_18, l_val);
  800. //printf("====PWR_MASK_VOL_18====%d\n", l_val);
  801. if (0 == l_val){
  802. printf("check me! gpio for card 1.8v pwr is input\n");
  803. l_val = MSDC_READ32(PWR_GPIO_EO);
  804. l_val |= PWR_MASK_VOL_18;
  805. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  806. }
  807. /* check for set before */
  808. if (0 == (PWR_MASK_VOL_18 & MSDC_READ32(PWR_GPIO))){
  809. printf("set card 1.8v pwr:\n");
  810. l_val = MSDC_READ32(PWR_GPIO);
  811. l_val |= PWR_MASK_VOL_18;
  812. MSDC_WRITE32(PWR_GPIO, l_val);
  813. }
  814. break;
  815. case PWR_MASK_VOL_33:
  816. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_VOL_33, l_val);
  817. //printf("====PWR_MASK_VOL_33====%d\n", l_val);
  818. if (0 == l_val){
  819. printf("check me! gpio for card 3.3v pwr is input\n");
  820. l_val = MSDC_READ32(PWR_GPIO_EO);
  821. l_val |= PWR_MASK_VOL_33;
  822. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  823. }
  824. /* check for set before */
  825. if (0 == (PWR_MASK_VOL_33 & MSDC_READ32(PWR_GPIO))){
  826. printf("set card 3.3v pwr:\n");
  827. l_val = MSDC_READ32(PWR_GPIO);
  828. l_val |= PWR_MASK_VOL_33;
  829. MSDC_WRITE32(PWR_GPIO, l_val);
  830. }
  831. break;
  832. case PWR_MASK_L4:
  833. MSDC_GET_FIELD(PWR_GPIO_EO, PWR_MASK_L4, l_val);
  834. //printf("====PWR_MASK_L4====%d\n", l_val);
  835. if (0 == l_val){
  836. printf("check me! gpio for l4 dir is input\n");
  837. l_val = MSDC_READ32(PWR_GPIO_EO);
  838. l_val |= PWR_MASK_L4;
  839. MSDC_WRITE32(PWR_GPIO_EO, l_val);
  840. }
  841. /* check for set before */
  842. if (0 == (PWR_MASK_L4 & MSDC_READ32(PWR_GPIO))){
  843. printf("set l4 dir:\n");
  844. l_val = MSDC_READ32(PWR_GPIO);
  845. l_val |= PWR_MASK_L4;
  846. MSDC_WRITE32(PWR_GPIO, l_val);
  847. }
  848. break;
  849. default:
  850. printf("[%s:%s]invalid value: 0x%x\n", __FILE__, __func__, bits);
  851. break;
  852. }
  853. #ifdef FPGA_GPIO_DEBUG
  854. {
  855. u32 val = 0;
  856. val = MSDC_READ32(PWR_GPIO);
  857. printf("[set]PWR_GPIO[8-11]:0x%x\n", val);
  858. val = MSDC_READ32(PWR_GPIO_EO);
  859. printf("[set]GPIO_DIR[8-11] :0x%x\n", val);
  860. }
  861. #endif
  862. }
  863. #endif
  864. void msdc_set_card_pwr(int on)
  865. {
  866. #if defined(FPGA_PLATFORM)
  867. if (on){
  868. #if MSDC_USE_EMMC45_POWER
  869. msdc_set_gpio(PWR_MASK_EN);
  870. msdc_set_gpio(PWR_MASK_VOL_18);
  871. #else
  872. msdc_set_gpio(PWR_MASK_EN);
  873. msdc_set_gpio(PWR_MASK_VOL_33);
  874. #endif
  875. /* add for fpga debug */
  876. msdc_set_gpio(PWR_MASK_L4);
  877. } else {
  878. msdc_clr_gpio(PWR_MASK_EN);
  879. msdc_clr_gpio(PWR_MASK_VOL_33);
  880. msdc_clr_gpio(PWR_MASK_VOL_18);
  881. /* add for fpga debug */
  882. msdc_clr_gpio(PWR_MASK_L4);
  883. }
  884. mdelay(10);
  885. #endif
  886. }
  887. void msdc_config_pin(struct mmc_host *host, int mode)
  888. {
  889. MSG(CFG, "[SD%d] Pins mode(%d), none(0), down(1), up(2), keep(3)\n",
  890. host->id, mode);
  891. printf("[SD%d] Pins mode(%d), none(0), down(1), up(2), keep(3)\n",
  892. host->id, mode);
  893. #if !defined(FPGA_PLATFORM)
  894. switch (mode) {
  895. case MSDC_PIN_PULL_UP:
  896. msdc_pin_pud(host, 1);
  897. break;
  898. case MSDC_PIN_PULL_DOWN:
  899. msdc_pin_pud(host, 0);
  900. break;
  901. case MSDC_PIN_PULL_NONE:
  902. default:
  903. msdc_pin_pnul(host, 0);
  904. break;
  905. }
  906. #endif
  907. }
  908. #if defined(MSDC0_EMMC50_SUPPORT)
  909. void msdc_set_axi_burst_len(struct mmc_host *host, u8 len)
  910. {
  911. u32 base = host->base;
  912. /* set axi burst len */
  913. MSDC_SET_FIELD(EMMC50_CFG2, MSDC_EMMC50_CFG2_AXI_SET_LEN, len);
  914. }
  915. void msdc_set_axi_outstanding(struct mmc_host *host, u8 rw, u8 num)
  916. {
  917. u32 base = host->base;
  918. /* set axi outstanding num */
  919. if (rw == 0) /* read */
  920. MSDC_SET_FIELD(EMMC50_CFG2, MSDC_EMMC50_CFG2_AXI_RD_OUTS_NUM, num);
  921. else /* write */
  922. MSDC_SET_FIELD(EMMC50_CFG3, MSDC_EMMC50_CFG3_OUTS_WR, num);
  923. }
  924. void msdc_set_startbit(struct mmc_host *host, u8 start_bit)
  925. {
  926. u32 base = host->base;
  927. u32 l_start_bit;
  928. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  929. if (host->id != 0){
  930. return;
  931. }
  932. /* set start bit */
  933. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_START_BIT, start_bit);
  934. priv->start_bit = start_bit;
  935. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_START_BIT, l_start_bit);
  936. #if 1
  937. switch (l_start_bit){
  938. case 0:
  939. printf("[info][%s %d] read data start bit at rising edge\n", __func__, __LINE__);
  940. break;
  941. case 1:
  942. printf("[info][%s %d] read data start bit at falling edge\n", __func__, __LINE__);
  943. break;
  944. case 2:
  945. printf("[info][%s %d] read data start bit at rising & falling edge\n", __func__, __LINE__);
  946. break;
  947. case 3:
  948. printf("[info][%s %d] read data start bit at rising | falling edge\n", __func__, __LINE__);
  949. break;
  950. default:
  951. break;
  952. }
  953. #endif
  954. }
  955. #endif
  956. void msdc_set_smpl(struct mmc_host *host, u8 HS400, u8 mode, u8 type)
  957. {
  958. u32 base = host->base;
  959. int i=0;
  960. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  961. static u8 read_data_edge[8] = {MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING,
  962. MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING};
  963. static u8 write_data_edge[4] = {MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING, MSDC_SMPL_RISING};
  964. switch (type)
  965. {
  966. case TYPE_CMD_RESP_EDGE:
  967. #if defined(MSDC0_EMMC50_SUPPORT)
  968. if (HS400) {
  969. // eMMC5.0 only output resp at CLK pin, so no need to select DS pin
  970. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_PADCMD_LATCHCK, 0); //latch cmd resp at CLK pin
  971. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CMD_RESP_SEL, 0);//latch cmd resp at CLK pin
  972. }
  973. #endif
  974. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  975. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, mode);
  976. priv->rsmpl = mode;
  977. }
  978. else {
  979. printf("[%s]: SD%d invalid resp parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  980. }
  981. break;
  982. case TYPE_WRITE_CRC_EDGE:
  983. #if defined(MSDC0_EMMC50_SUPPORT)
  984. if (HS400) {
  985. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_SEL, 1);//latch write crc status at DS pin
  986. }
  987. else {
  988. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_SEL, 0);//latch write crc status at CLK pin
  989. }
  990. #endif
  991. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  992. #if defined(MSDC0_EMMC50_SUPPORT)
  993. if (HS400) {
  994. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_EDGE, mode);
  995. }
  996. else
  997. #endif
  998. {
  999. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL, 0);
  1000. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, mode);
  1001. }
  1002. priv->wdsmpl = mode;
  1003. }
  1004. else if (mode == MSDC_SMPL_SEPERATE && !HS400) {
  1005. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D0SPL, write_data_edge[0]); //only dat0 is for write crc status.
  1006. priv->wdsmpl = mode;
  1007. }
  1008. else {
  1009. printf("[%s]: SD%d invalid crc parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  1010. }
  1011. break;
  1012. case TYPE_READ_DATA_EDGE:
  1013. #if defined(MSDC0_EMMC50_SUPPORT)
  1014. if (HS400) {
  1015. msdc_set_startbit(host, START_AT_RISING_AND_FALLING); //for HS400, start bit is output both on rising and falling edge
  1016. priv->start_bit = START_AT_RISING_AND_FALLING;
  1017. }
  1018. else {
  1019. msdc_set_startbit(host, START_AT_RISING); //for the other mode, start bit is only output on rising edge. but DDR50 can try falling edge if error casued by pad delay
  1020. priv->start_bit = START_AT_RISING;
  1021. }
  1022. #endif
  1023. if (mode == MSDC_SMPL_RISING || mode == MSDC_SMPL_FALLING) {
  1024. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL_SEL, 0);
  1025. //MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, mode);
  1026. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, mode);
  1027. priv->rdsmpl = mode;
  1028. }
  1029. else if (mode == MSDC_SMPL_SEPERATE) {
  1030. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL_SEL, 1);
  1031. for(i=0; i<8; i++)
  1032. {
  1033. MSDC_SET_FIELD(MSDC_IOCON, (MSDC_IOCON_R_D0SPL << i), read_data_edge[i]);
  1034. }
  1035. priv->rdsmpl = mode;
  1036. }
  1037. else {
  1038. printf("[%s]: SD%d invalid read parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  1039. }
  1040. break;
  1041. case TYPE_WRITE_DATA_EDGE:
  1042. #if defined(MSDC0_EMMC50_SUPPORT)
  1043. MSDC_SET_FIELD(EMMC50_CFG0, MSDC_EMMC50_CFG_CRC_STS_SEL, 0);//latch write crc status at CLK pin
  1044. #endif
  1045. if (mode == MSDC_SMPL_RISING|| mode == MSDC_SMPL_FALLING) {
  1046. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL, 0);
  1047. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, mode);
  1048. priv->wdsmpl = mode;
  1049. }
  1050. else if (mode == MSDC_SMPL_SEPERATE) {
  1051. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL_SEL, 1);
  1052. for(i=0; i<4; i++)
  1053. {
  1054. MSDC_SET_FIELD(MSDC_IOCON, (MSDC_IOCON_W_D0SPL << i), write_data_edge[i]);//dat0~4 is for SDIO card.
  1055. }
  1056. priv->wdsmpl = mode;
  1057. } else {
  1058. printf("[%s]: SD%d invalid write parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  1059. }
  1060. break;
  1061. default:
  1062. printf("[%s]: SD%d invalid parameter: HS400=%d, type=%d, mode=%d\n", __func__, host->id, HS400, type, mode);
  1063. break;
  1064. }
  1065. }
  1066. static u32 msdc_cal_timeout(struct mmc_host *host, u64 ns, u32 clks, u32 clkunit)
  1067. {
  1068. u32 timeout, clk_ns;
  1069. clk_ns = 1000000000UL / host->cur_bus_clk;
  1070. timeout = ns / clk_ns + clks;
  1071. timeout = timeout / clkunit;
  1072. return timeout;
  1073. }
  1074. void msdc_set_timeout(struct mmc_host *host, u64 ns, u32 clks)
  1075. {
  1076. u32 base = host->base;
  1077. u32 timeout, clk_ns;
  1078. u32 mode = 0;
  1079. if (host->cur_bus_clk == 0) {
  1080. timeout = 0;
  1081. }else {
  1082. clk_ns = 1000000000UL / host->cur_bus_clk;
  1083. timeout = (ns + clk_ns - 1) / clk_ns + clks;
  1084. timeout = (timeout + (1 << 20) - 1) >> 20; /* in 1048576 sclk cycle unit */
  1085. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, mode);
  1086. timeout = mode >= 2 ? timeout * 2 : timeout; //DDR mode will double the clk cycles for data timeout
  1087. timeout = timeout > 1 ? timeout - 1 : 0;
  1088. timeout = timeout > 255 ? 255 : timeout;
  1089. }
  1090. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_DTOC, timeout);
  1091. MSG(OPS, "[SD%d] Set read data timeout: %lldns %dclks -> %d x 1048576 cycles, mode:%d, clk_freq=%dKHz\n",
  1092. host->id, ns, clks, timeout + 1, mode, (host->cur_bus_clk / 1000));
  1093. }
  1094. void msdc_set_blklen(struct mmc_host *host, u32 blklen)
  1095. {
  1096. //u32 base = host->base;
  1097. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1098. host->blklen = blklen;
  1099. priv->cfg.blklen = blklen;
  1100. msdc_clr_fifo(host);
  1101. }
  1102. void msdc_set_blknum(struct mmc_host *host, u32 blknum)
  1103. {
  1104. u32 base = host->base;
  1105. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1106. /* autocmd23 with packed cmd, this feature is conflict with data tag, reliable write, and force flush cache */
  1107. #if defined(MMC_MSDC_DRV_CTP)
  1108. if (priv->autocmd & MSDC_AUTOCMD23){
  1109. #if MSDC_USE_DATA_TAG
  1110. blknum |= (1 << 29);
  1111. blknum &= ~(1 << 30);
  1112. #endif
  1113. #if MSDC_USE_RELIABLE_WRITE
  1114. blknum |= (1 << 31);
  1115. blknum &= ~(1 << 30);
  1116. #endif
  1117. #if MSDC_USE_FORCE_FLUSH
  1118. blknum |= (1 << 24);
  1119. blknum &= ~(1 << 30);
  1120. #endif
  1121. #if MSDC_USE_PACKED_CMD
  1122. blknum &= ~0xffff;
  1123. blknum |= (1 << 30);
  1124. #endif
  1125. }
  1126. #endif
  1127. if (priv->cmd23_flags & MSDC_RELIABLE_WRITE){
  1128. blknum |= (1 << 31);
  1129. blknum &= ~(1 << 30);
  1130. }
  1131. MSDC_WRITE32(SDC_BLK_NUM, blknum);
  1132. }
  1133. void msdc_set_dmode(struct mmc_host *host, int mode)
  1134. {
  1135. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1136. //u32 base = host->base;
  1137. #if defined(MSDC_ENABLE_DMA_MODE)
  1138. priv->cfg.mode = mode;
  1139. #endif
  1140. if (mode == MSDC_MODE_PIO) {
  1141. host->blk_read = msdc_pio_bread;
  1142. host->blk_write = msdc_pio_bwrite;
  1143. #if defined(MSDC_ENABLE_DMA_MODE)
  1144. } else {
  1145. host->blk_read = msdc_dma_bread;
  1146. host->blk_write = msdc_dma_bwrite;
  1147. #endif
  1148. }
  1149. }
  1150. void msdc_set_pio_bits(struct mmc_host *host, int bits)
  1151. {
  1152. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1153. priv->pio_bits = bits;
  1154. }
  1155. void msdc_set_autocmd(struct mmc_host *host, int cmd, int on)
  1156. {
  1157. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1158. if (on) {
  1159. priv->autocmd |= cmd;
  1160. } else {
  1161. priv->autocmd &= ~cmd;
  1162. }
  1163. }
  1164. void msdc_set_reliable_write(struct mmc_host *host, int on)
  1165. {
  1166. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1167. if (on) {
  1168. priv->cmd23_flags |= MSDC_RELIABLE_WRITE;
  1169. } else {
  1170. priv->cmd23_flags &= ~MSDC_RELIABLE_WRITE;
  1171. }
  1172. }
  1173. void msdc_set_autocmd23_feature(struct mmc_host *host, int on)
  1174. {
  1175. u32 base = host->base;
  1176. if (on) {
  1177. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 0);
  1178. } else {
  1179. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 1);
  1180. }
  1181. }
  1182. int msdc_send_cmd(struct mmc_host *host, struct mmc_command *cmd)
  1183. {
  1184. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1185. u32 base = host->base;
  1186. u32 opcode = cmd->opcode;
  1187. u32 rsptyp = cmd->rsptyp;
  1188. u32 rawcmd;
  1189. u32 timeout = cmd->timeout;
  1190. u32 error = MMC_ERR_NONE;
  1191. /* rawcmd :
  1192. * vol_swt << 30 | auto_cmd << 28 | blklen << 16 | go_irq << 15 |
  1193. * stop << 14 | rw << 13 | dtype << 11 | rsptyp << 7 | brk << 6 | opcode
  1194. */
  1195. rawcmd = (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)) |
  1196. msdc_rsp[rsptyp] << 7 | host->blklen << 16;
  1197. if (opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK) {
  1198. rawcmd |= ((2 << 11) | (1 << 13));
  1199. if (priv->autocmd & MSDC_AUTOCMD12) {
  1200. rawcmd |= (1 << 28);
  1201. } else if (priv->autocmd & MSDC_AUTOCMD23) {
  1202. rawcmd |= (2 << 28);
  1203. }
  1204. } else if (opcode == MMC_CMD_WRITE_BLOCK || opcode == MMC_CMD50) {
  1205. rawcmd |= ((1 << 11) | (1 << 13));
  1206. } else if (opcode == MMC_CMD_READ_MULTIPLE_BLOCK) {
  1207. rawcmd |= (2 << 11);
  1208. if (priv->autocmd & MSDC_AUTOCMD12) {
  1209. rawcmd |= (1 << 28);
  1210. } else if (priv->autocmd & MSDC_AUTOCMD23) {
  1211. rawcmd |= (2 << 28);
  1212. }
  1213. } else if (opcode == MMC_CMD_READ_SINGLE_BLOCK ||
  1214. opcode == SD_ACMD_SEND_SCR ||
  1215. opcode == SD_CMD_SWITCH ||
  1216. opcode == MMC_CMD_SEND_EXT_CSD ||
  1217. opcode == MMC_CMD_SEND_WRITE_PROT ||
  1218. opcode == MMC_CMD_SEND_WRITE_PROT_TYPE ||
  1219. opcode == MMC_CMD21) {
  1220. rawcmd |= (1 << 11);
  1221. } else if (opcode == MMC_CMD_STOP_TRANSMISSION) {
  1222. rawcmd |= (1 << 14);
  1223. rawcmd &= ~(0x0FFF << 16);
  1224. } else if (opcode == SD_IO_RW_EXTENDED) {
  1225. if (cmd->arg & 0x80000000) /* R/W flag */
  1226. rawcmd |= (1 << 13);
  1227. if ((cmd->arg & 0x08000000) && ((cmd->arg & 0x1FF) > 1))
  1228. rawcmd |= (2 << 11); /* multiple block mode */
  1229. else
  1230. rawcmd |= (1 << 11);
  1231. } else if (opcode == SD_IO_RW_DIRECT) {
  1232. if ((cmd->arg & 0x80000000) && ((cmd->arg >> 9) & 0x1FFFF))/* I/O abt */
  1233. rawcmd |= (1 << 14);
  1234. } else if (opcode == SD_CMD_VOL_SWITCH) {
  1235. rawcmd |= (1 << 30);
  1236. } else if (opcode == SD_CMD_SEND_TUNING_BLOCK) {
  1237. rawcmd |= (1 << 11); /* CHECKME */
  1238. if (priv->autocmd & MSDC_AUTOCMD19)
  1239. rawcmd |= (3 << 28);
  1240. } else if (opcode == MMC_CMD_GO_IRQ_STATE) {
  1241. rawcmd |= (1 << 15);
  1242. } else if (opcode == MMC_CMD_WRITE_DAT_UNTIL_STOP) {
  1243. rawcmd |= ((1<< 13) | (3 << 11));
  1244. } else if (opcode == MMC_CMD_READ_DAT_UNTIL_STOP) {
  1245. rawcmd |= (3 << 11);
  1246. }
  1247. MSG(CMD, "[SD%d] CMD(%d): ARG(0x%x), RAW(0x%x), BLK_NUM(0x%x) RSP(%d)\n",
  1248. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)), cmd->arg, rawcmd, MSDC_READ32(SDC_BLK_NUM), rsptyp);
  1249. if (opcode == MMC_CMD_SEND_STATUS) {
  1250. if (SDC_IS_CMD_BUSY()) {
  1251. WAIT_COND(!SDC_IS_CMD_BUSY(), cmd->timeout, timeout);
  1252. if (timeout == 0) {
  1253. error = MMC_ERR_TIMEOUT;
  1254. printf("[SD%d] CMD(%d): SDC_IS_CMD_BUSY timeout\n",
  1255. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)));
  1256. goto end;
  1257. }
  1258. }
  1259. } else {
  1260. if (SDC_IS_BUSY()) {
  1261. WAIT_COND(!SDC_IS_BUSY(), 1000, timeout);
  1262. if (timeout == 0) {
  1263. error = MMC_ERR_TIMEOUT;
  1264. printf("[SD%d] CMD(%d): SDC_IS_BUSY timeout\n",
  1265. host->id, (opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT)));
  1266. goto end;
  1267. }
  1268. }
  1269. }
  1270. SDC_SEND_CMD(rawcmd, cmd->arg);
  1271. end:
  1272. cmd->error = error;
  1273. return error;
  1274. }
  1275. int msdc_wait_rsp(struct mmc_host *host, struct mmc_command *cmd)
  1276. {
  1277. u32 base = host->base;
  1278. u32 rsptyp = cmd->rsptyp;
  1279. u32 status;
  1280. u32 opcode = (cmd->opcode & ~(SD_CMD_BIT | SD_CMD_APP_BIT));
  1281. u32 error = MMC_ERR_NONE;
  1282. u32 wints = MSDC_INT_CMDTMO | MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR |
  1283. MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO |
  1284. MSDC_INT_ACMD19_DONE;
  1285. if (cmd->opcode == MMC_CMD_GO_IRQ_STATE)
  1286. wints |= MSDC_INT_MMCIRQ;
  1287. status = msdc_intr_wait(host, wints);
  1288. #if defined(FEATURE_MMC_SDIO)
  1289. if (status & MSDC_INT_SDIOIRQ) {
  1290. if(mmc_card_sdio(host->card)) {
  1291. struct sdio_func *func = host->card->io_func[0];
  1292. if (func->irq_handler)
  1293. func->irq_handler(func);
  1294. }
  1295. }
  1296. #endif
  1297. if (status == 0) {
  1298. error = MMC_ERR_TIMEOUT;
  1299. goto end;
  1300. }
  1301. if ((status & MSDC_INT_RSPCRCERR) || (status & MSDC_INT_ACMDCRCERR)) {
  1302. error = MMC_ERR_BADCRC;
  1303. if (rsptyp == RESP_R1B) {
  1304. while ((MSDC_READ32(MSDC_PS) & 0x10000) != 0x10000);
  1305. }
  1306. msdc_abort(host);
  1307. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) ERR(BADCRC)\n",
  1308. host->id, opcode, cmd->rsptyp);
  1309. } else if ((status & MSDC_INT_CMDTMO) || (status & MSDC_INT_ACMDTMO)) {
  1310. error = MMC_ERR_TIMEOUT;
  1311. if (rsptyp == RESP_R1B) {
  1312. while ((MSDC_READ32(MSDC_PS) & 0x10000) != 0x10000);
  1313. }
  1314. msdc_abort(host);
  1315. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) ERR(CMDTO) AUTO(%d)\n",
  1316. host->id, opcode, cmd->rsptyp, status & MSDC_INT_ACMDTMO ? 1: 0);
  1317. } else if ((status & MSDC_INT_CMDRDY) || (status & MSDC_INT_ACMDRDY) ||
  1318. (status & MSDC_INT_ACMD19_DONE)) {
  1319. switch (rsptyp) {
  1320. case RESP_NONE:
  1321. MSG(RSP, "[SD%d] CMD(%d): RSP(%d)\n", host->id, opcode, rsptyp);
  1322. break;
  1323. case RESP_R2:
  1324. {
  1325. u32 *resp = &cmd->resp[0];
  1326. *resp++ = MSDC_READ32(SDC_RESP3);
  1327. *resp++ = MSDC_READ32(SDC_RESP2);
  1328. *resp++ = MSDC_READ32(SDC_RESP1);
  1329. *resp++ = MSDC_READ32(SDC_RESP0);
  1330. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) = 0x%x 0x%x 0x%x 0x%x\n",
  1331. host->id, opcode, cmd->rsptyp, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
  1332. break;
  1333. }
  1334. default: /* Response types 1, 3, 4, 5, 6, 7(1b) */
  1335. if ((status & MSDC_INT_ACMDRDY) || (status & MSDC_INT_ACMD19_DONE))
  1336. cmd->resp[0] = MSDC_READ32(SDC_ACMD_RESP);
  1337. else
  1338. cmd->resp[0] = MSDC_READ32(SDC_RESP0);
  1339. MSG(RSP, "[SD%d] CMD(%d): RSP(%d) = 0x%x AUTO(%d)\n", host->id, opcode,
  1340. cmd->rsptyp, cmd->resp[0],
  1341. ((status & MSDC_INT_ACMDRDY) || (status & MSDC_INT_ACMD19_DONE)) ? 1 : 0);
  1342. break;
  1343. }
  1344. } else {
  1345. error = MMC_ERR_INVALID;
  1346. if (rsptyp == RESP_R1B) {
  1347. while ((MSDC_READ32(MSDC_PS) & 0x10000) != 0x10000);
  1348. }
  1349. msdc_abort(host);
  1350. printf("[SD%d] CMD(%d): RSP(%d) ERR(INVALID), Status:%x\n",
  1351. host->id, opcode, cmd->rsptyp, status);
  1352. }
  1353. end:
  1354. if (rsptyp == RESP_R1B) {
  1355. while ((MSDC_READ32(MSDC_PS) & 0x10000) != 0x10000);
  1356. }
  1357. #if MSDC_DEBUG
  1358. if ((error == MMC_ERR_NONE) && (MSG_EVT_MASK & MSG_EVT_RSP)){
  1359. switch(cmd->rsptyp) {
  1360. case RESP_R1:
  1361. case RESP_R1B:
  1362. msdc_dump_card_status(cmd->resp[0]);
  1363. break;
  1364. case RESP_R3:
  1365. msdc_dump_ocr_reg(cmd->resp[0]);
  1366. break;
  1367. case RESP_R5:
  1368. msdc_dump_io_resp(cmd->resp[0]);
  1369. break;
  1370. case RESP_R6:
  1371. msdc_dump_rca_resp(cmd->resp[0]);
  1372. break;
  1373. }
  1374. }
  1375. #endif
  1376. cmd->error = error;
  1377. if(cmd->opcode == MMC_CMD_APP_CMD && error == MMC_ERR_NONE){
  1378. host->app_cmd = 1;
  1379. host->app_cmd_arg = cmd->arg;
  1380. }
  1381. else
  1382. host->app_cmd = 0;
  1383. return error;
  1384. }
  1385. int msdc_cmd(struct mmc_host *host, struct mmc_command *cmd)
  1386. {
  1387. int err;
  1388. err = msdc_send_cmd(host, cmd);
  1389. if (err != MMC_ERR_NONE)
  1390. return err;
  1391. err = msdc_wait_rsp(host, cmd);
  1392. if (err == MMC_ERR_BADCRC) {
  1393. u32 base = host->base;
  1394. u32 tmp = MSDC_READ32(SDC_CMD);
  1395. /* check if data is used by the command or not */
  1396. if (tmp & SDC_CMD_DTYP) {
  1397. msdc_abort_handler(host, 1);
  1398. }
  1399. #if defined(FEATURE_MMC_CM_TUNING)
  1400. //Light: For CMD17/18/24/25, tuning may have been done by
  1401. // msdc_abort_handler()->msdc_get_card_status()->msdc_cmd() for CMD13->msdc_tune_cmdrsp().
  1402. // This means that 2nd invocation of msdc_tune_cmdrsp() occurs here!
  1403. //--> To Do: consider if 2nd invocation can be avoid
  1404. if ( host->app_cmd!=2 ) { //Light 20121225, to prevent recursive call path: msdc_tune_cmdrsp->msdc_app_cmd->msdc_cmd->msdc_tune_cmdrsp
  1405. err = msdc_tune_cmdrsp(host, cmd);
  1406. if (err != MMC_ERR_NONE){
  1407. printf("[Err handle][%s:%d]tune cmd fail\n", __func__, __LINE__);
  1408. }
  1409. }
  1410. /* After tuning, erase sequence will error */
  1411. if ((cmd->opcode == MMC_CMD_ERASE_GROUP_START) || (cmd->opcode == MMC_CMD_ERASE_GROUP_END) ||
  1412. (cmd->opcode == MMC_CMD_ERASE_WR_BLK_START) || (cmd->opcode == MMC_CMD_ERASE_WR_BLK_END)) {
  1413. err = MMC_ERR_ERASE_SEQ;
  1414. }
  1415. #endif
  1416. }
  1417. return err;
  1418. }
  1419. int msdc_cmd_stop(struct mmc_host *host, struct mmc_command *cmd)
  1420. {
  1421. int err = MMC_ERR_NONE;
  1422. struct mmc_command stop;
  1423. if (mmc_card_mmc(host->card) && (cmd) && (cmd->opcode == 18))
  1424. stop.rsptyp = RESP_R1;
  1425. else
  1426. stop.rsptyp = RESP_R1B;
  1427. stop.opcode = MMC_CMD_STOP_TRANSMISSION;
  1428. stop.arg = 0;
  1429. stop.retries = CMD_RETRIES;
  1430. stop.timeout = CMD_TIMEOUT;
  1431. err = msdc_cmd(host, &stop);
  1432. #ifdef MTK_EMMC_POWER_ON_WP
  1433. if (err == MMC_ERR_NONE) {
  1434. if (stop.resp[0] & R1_WP_VIOLATION)
  1435. cmd->error = MMC_ERR_WP_VIOLATION;
  1436. }
  1437. #endif
  1438. return err;
  1439. }
  1440. static int msdc_get_card_status(struct mmc_host *host, u32 *status)
  1441. {
  1442. int err;
  1443. struct mmc_command cmd;
  1444. cmd.opcode = MMC_CMD_SEND_STATUS;
  1445. cmd.arg = host->card->rca << 16;
  1446. cmd.rsptyp = RESP_R1;
  1447. cmd.retries = CMD_RETRIES;
  1448. cmd.timeout = CMD_TIMEOUT;
  1449. err = msdc_cmd(host, &cmd);
  1450. if (err == MMC_ERR_NONE) {
  1451. *status = cmd.resp[0];
  1452. }
  1453. return err;
  1454. }
  1455. #ifdef MTK_EMMC_POWER_ON_WP
  1456. int msdc_get_wp_err(struct mmc_host *host)
  1457. {
  1458. u32 status;
  1459. int err = msdc_get_card_status(host, &status);
  1460. if (err == MMC_ERR_NONE) {
  1461. if (status & R1_WP_VIOLATION)
  1462. err = MMC_ERR_WP_VIOLATION;
  1463. }
  1464. return err;
  1465. }
  1466. #endif
  1467. void msdc_abort_handler(struct mmc_host *host, int abort_card)
  1468. {
  1469. //Copy from BROM-Light version
  1470. //u32 base = host->base;
  1471. u32 status = 0;
  1472. u32 state = 0;
  1473. u32 err;
  1474. //u32 count=0;
  1475. while (state != 4) { // until status to "tran"; //20130125 Comment out by Light
  1476. //while ( abort_card ) { //20130125 Light
  1477. msdc_abort(host);
  1478. err=msdc_get_card_status(host, &status);
  1479. //To do: move the following 2 if clause into msdc_get_card_status() or write as a function
  1480. #if 0 //Light: turn if off before I verify it
  1481. //#if defined(MMC_MSDC_DRV_CTP)
  1482. if (err == MMC_ERR_BADCRC) {
  1483. printf("[Err handle][%s:%d]cmd13 crc error\n", __func__, __LINE__);
  1484. msdc_tune_update_cmdrsp(host, count++);
  1485. if (count >= 512)
  1486. count = 0;
  1487. }
  1488. if (err == MMC_ERR_TIMEOUT) {
  1489. printf("[Err handle][%s:%d]cmd13 timeout\n", __func__, __LINE__);
  1490. msdc_tune_update_cmdrsp(host, count++);
  1491. if (count >= 512)
  1492. count = 0;
  1493. }
  1494. #else
  1495. if (err != MMC_ERR_NONE) {
  1496. printf("[Err handle][%s:%d]cmd13 fail\n", __func__, __LINE__);
  1497. goto out;
  1498. }
  1499. #endif
  1500. state = R1_CURRENT_STATE(status);
  1501. #if MMC_DEBUG
  1502. mmc_dump_card_status(status);
  1503. #endif
  1504. printf("check card state<%d>\n", state);
  1505. if (state == 5 || state == 6) {
  1506. if (abort_card) {
  1507. printf("state<%d> need cmd12 to stop\n", state);
  1508. err=msdc_cmd_stop(host, NULL);
  1509. //To do: move the following 2 if clause into msdc_cmd_stop() or write as a function
  1510. #if 0 //Light: turn if off before I verify it
  1511. //#if defined(MMC_MSDC_DRV_CTP)
  1512. if (err == MMC_ERR_BADCRC) {
  1513. printf("[Err handle][%s:%d]cmd12 crc error\n", __func__, __LINE__);
  1514. msdc_tune_update_cmdrsp(host, count++);
  1515. if (count >= 512)
  1516. count = 0;
  1517. continue;
  1518. }
  1519. if (err == MMC_ERR_TIMEOUT) {
  1520. printf("[Err handle][%s:%d]cmd12 timeout\n", __func__, __LINE__);
  1521. msdc_tune_update_cmdrsp(host, count++);
  1522. if (count >= 512)
  1523. count = 0;
  1524. continue;
  1525. }
  1526. #else
  1527. if (err != MMC_ERR_NONE) {
  1528. printf("[Err handle][%s:%d]cmd12 fail\n", __func__, __LINE__);
  1529. goto out;
  1530. }
  1531. #endif
  1532. }
  1533. //break; //20130125 Light
  1534. } else if (state == 7) { // busy in programing
  1535. printf("state<%d> card is busy\n", state);
  1536. mdelay(100);
  1537. } else if (state != 4) {
  1538. printf("state<%d> ??? \n", state);
  1539. goto out;
  1540. }
  1541. }
  1542. msdc_abort(host);
  1543. return;
  1544. out:
  1545. printf("[SD%d] data abort failed\n",host->id);
  1546. }
  1547. void msdc_intr_unmask(struct mmc_host *host, u32 bits)
  1548. {
  1549. u32 base = host->base;
  1550. u32 val;
  1551. val = MSDC_READ32(MSDC_INTEN);
  1552. val |= bits;
  1553. MSDC_WRITE32(MSDC_INTEN, val);
  1554. }
  1555. void msdc_intr_mask(struct mmc_host *host, u32 bits)
  1556. {
  1557. u32 base = host->base;
  1558. u32 val;
  1559. val = MSDC_READ32(MSDC_INTEN);
  1560. val &= ~bits;
  1561. MSDC_WRITE32(MSDC_INTEN, val);
  1562. }
  1563. static int msdc_app_cmd(struct mmc_host *host)
  1564. {
  1565. struct mmc_command appcmd;
  1566. int err = MMC_ERR_NONE;
  1567. int retries = 10;
  1568. appcmd.opcode = MMC_CMD_APP_CMD;
  1569. appcmd.arg = host->app_cmd_arg;
  1570. appcmd.rsptyp = RESP_R1;
  1571. appcmd.retries = CMD_RETRIES;
  1572. appcmd.timeout = CMD_TIMEOUT;
  1573. do {
  1574. err = msdc_cmd(host, &appcmd);
  1575. if (err == MMC_ERR_NONE)
  1576. break;
  1577. } while (retries--);
  1578. return err;
  1579. }
  1580. #if defined(MSDC_ENABLE_DMA_MODE)
  1581. int msdc_dma_send_sandisk_fwid(struct mmc_host *host, uchar *buf,u32 opcode, ulong nblks)
  1582. {
  1583. //int multi;
  1584. struct mmc_command cmd;
  1585. struct mmc_data data;
  1586. BUG_ON(nblks > host->max_phys_segs);
  1587. //MSG(OPS, "[SD%d] Read data %d blks from 0x%x\n", host->id, nblks, src);
  1588. //multi = nblks > 1 ? 1 : 0;
  1589. /* send read command */
  1590. cmd.opcode = opcode;
  1591. cmd.rsptyp = RESP_R1;
  1592. cmd.arg = 0; //src;
  1593. cmd.retries = 0;
  1594. cmd.timeout = CMD_TIMEOUT;
  1595. data.blks = nblks;
  1596. data.buf = (u8*)buf;
  1597. data.timeout = 100; /* 100ms */
  1598. return msdc_dma_transfer(host, &cmd, &data);
  1599. }
  1600. #endif
  1601. void msdc_brk_cmd(struct mmc_host *host)
  1602. {
  1603. u32 base = host->base;
  1604. u32 tmo =0;
  1605. WAIT_COND(SDC_IS_BUSY() == 0, tmo, tmo);
  1606. if(tmo == 0)
  1607. printf("[%s]: SDC BUSY timeout happend, before send break cmd\n", __func__);
  1608. SDC_SEND_CMD(0x000000e8, 0);
  1609. }
  1610. int msdc_pio_read(struct mmc_host *host, u32 *ptr, u32 size)
  1611. {
  1612. int err = MMC_ERR_NONE;
  1613. #if defined(MMC_MSDC_DRV_CTP)
  1614. u8 *ptr8;
  1615. u16 *ptr16;
  1616. #endif
  1617. msdc_priv_t *priv = host->priv;
  1618. u32 base = host->base;
  1619. u32 ints = MSDC_INT_DATCRCERR | MSDC_INT_DATTMO | MSDC_INT_XFER_COMPL;
  1620. //u32 timeout = 100000;
  1621. u32 status;
  1622. u32 totalsz = size;
  1623. u8 done = 0;
  1624. u32 size_per_round;
  1625. u32 dcrc;
  1626. u8* u8ptr;
  1627. #if defined(MMC_MSDC_DRV_CTP)
  1628. if (priv->pio_bits == 16)
  1629. ptr16 = (u16 *) ptr;
  1630. else if (priv->pio_bits == 8)
  1631. ptr8 = (u8 *) ptr;
  1632. #endif
  1633. while (1) {
  1634. #if defined(MSDC_USE_IRQ)
  1635. //For CTP only
  1636. DisableIRQ();
  1637. status = msdc_irq_sts[host->id];
  1638. msdc_irq_sts[host->id] &= ~ints;
  1639. EnableIRQ();
  1640. #else
  1641. status = MSDC_READ32(MSDC_INT);
  1642. MSDC_WRITE32(MSDC_INT, status);
  1643. #if defined(FEATURE_MMC_SDIO)
  1644. if (status & MSDC_INT_SDIOIRQ) {
  1645. printf("(%s)INT status:0x%x\n", __func__, status);
  1646. if ( (host->id == 2) || (host->id == 3) ) {
  1647. mmc_sdio_proc_pending_irqs(host->card);
  1648. //sdio_read_pending_irq(host->card->io_func[0]);
  1649. }
  1650. }
  1651. #endif
  1652. #endif
  1653. if (status & ~ints) {
  1654. MSG(WRN, "[SD%d]<CHECKME> Unexpected INT(0x%x)\n",
  1655. host->id, status);
  1656. }
  1657. if (status & MSDC_INT_DATCRCERR) {
  1658. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  1659. printf("[SD%d] DAT CRC error (0x%x), Left:%d/%d bytes, RXFIFO:%d,dcrc:0x%x\n",
  1660. host->id, status, size, totalsz, MSDC_RXFIFOCNT(),dcrc);
  1661. err = MMC_ERR_BADCRC;
  1662. break;
  1663. } else if (status & MSDC_INT_DATTMO) {
  1664. printf("[SD%d] DAT TMO error (0x%x), Left: %d/%d bytes, RXFIFO:%d\n",
  1665. host->id, status, size, totalsz, MSDC_RXFIFOCNT());
  1666. err = MMC_ERR_TIMEOUT;
  1667. break;
  1668. } else if (status & MSDC_INT_ACMDCRCERR) {
  1669. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  1670. printf("[SD%d] AUTOCMD CRC error (0x%x), Left:%d/%d bytes, RXFIFO:%d,dcrc:0x%x\n",
  1671. host->id, status, size, totalsz, MSDC_RXFIFOCNT(),dcrc);
  1672. err = MMC_ERR_ACMD_RSPCRC;
  1673. break;
  1674. } else if (status & MSDC_INT_XFER_COMPL) {
  1675. done = 1;
  1676. }
  1677. if (size == 0 && done)
  1678. break;
  1679. /* Note. RXFIFO count would be aligned to 4-bytes alignment size */
  1680. //if ((size >= MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= MSDC_FIFO_THD))
  1681. if (size > 0)
  1682. {
  1683. int left;
  1684. if ( (size >= MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= MSDC_FIFO_THD) )
  1685. left = MSDC_FIFO_THD;
  1686. else if ( (size < MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= size) )
  1687. left = size;
  1688. else
  1689. continue;
  1690. size_per_round = left;
  1691. #if defined(MMC_MSDC_DRV_CTP)
  1692. if (priv->pio_bits == 8) {
  1693. do {
  1694. *ptr8++ = MSDC_FIFO_READ8();;
  1695. left--;
  1696. } while (left);
  1697. } else if (priv->pio_bits == 16) {
  1698. do {
  1699. if (left> 1) {
  1700. *ptr16++ = MSDC_FIFO_READ16();
  1701. left-=2;
  1702. } else {
  1703. u8ptr = (u8*)ptr;
  1704. while (left--){
  1705. *u8ptr++ = MSDC_FIFO_READ8();
  1706. }
  1707. }
  1708. } while (left);
  1709. } else
  1710. #endif
  1711. { //if (priv->pio_bits==32 )
  1712. do {
  1713. if (left> 3) {
  1714. *ptr++ = MSDC_FIFO_READ32();
  1715. left-=4;
  1716. } else {
  1717. u8ptr = (u8*)ptr;
  1718. while (left--){
  1719. *u8ptr++ = MSDC_FIFO_READ8();
  1720. }
  1721. }
  1722. } while (left);
  1723. }
  1724. size -= size_per_round;
  1725. MSG(FIO, "[SD%d] Read %d bytes, RXFIFOCNT: %d, Left: %d/%d\n",
  1726. host->id, size_per_round, MSDC_RXFIFOCNT(), size, totalsz);
  1727. }
  1728. }
  1729. if (err != MMC_ERR_NONE) {
  1730. msdc_abort(host); /* reset internal fifo and state machine */
  1731. printf("[SD%d] %d-bit PIO Read Error (%d)\n", host->id,
  1732. priv->pio_bits, err);
  1733. }
  1734. return err;
  1735. }
  1736. int msdc_pio_write(struct mmc_host *host, u32 *ptr, u32 size)
  1737. {
  1738. int err = MMC_ERR_NONE;
  1739. u8 *ptr8=(u8 *)ptr;
  1740. u32 base = host->base;
  1741. u32 ints = MSDC_INT_DATCRCERR | MSDC_INT_DATTMO | MSDC_INT_XFER_COMPL;
  1742. //u32 timeout = 250000;
  1743. u32 status;
  1744. #if defined(MMC_MSDC_DRV_CTP)
  1745. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1746. #endif
  1747. u32 size_per_round;
  1748. while (1) {
  1749. #if defined(MSDC_USE_IRQ)
  1750. //For CTP only
  1751. DisableIRQ();
  1752. status = msdc_irq_sts[host->id];
  1753. msdc_irq_sts[host->id] &= ~ints;
  1754. EnableIRQ();
  1755. #else
  1756. status = MSDC_READ32(MSDC_INT);
  1757. MSDC_WRITE32(MSDC_INT, status);
  1758. #if defined(FEATURE_MMC_SDIO)
  1759. if (status & MSDC_INT_SDIOIRQ) {
  1760. printf("(%s)INT status:0x%x\n", __func__, status);
  1761. if ( (host->id == 2) || (host->id == 3) ) {
  1762. mmc_sdio_proc_pending_irqs(host->card);
  1763. //sdio_read_pending_irq(host->card->io_func[0]);
  1764. }
  1765. }
  1766. #endif
  1767. #endif
  1768. if (status & ~ints) {
  1769. MSG(WRN, "[SD%d]<CHECKME> Unexpected INT(0x%x)\n",
  1770. host->id, status);
  1771. }
  1772. if (status & MSDC_INT_DATCRCERR) {
  1773. printf("[SD%d] DAT CRC error (0x%x), Left DAT: %d bytes\n",
  1774. host->id, status, size);
  1775. err = MMC_ERR_BADCRC;
  1776. break;
  1777. } else if (status & MSDC_INT_DATTMO) {
  1778. printf("[SD%d] DAT TMO error (0x%x), Left DAT: %d bytes, MSDC_FIFOCS=%xh\n",
  1779. host->id, status, size, MSDC_READ32(MSDC_FIFOCS));
  1780. err = MMC_ERR_TIMEOUT;
  1781. break;
  1782. } else if (status & MSDC_INT_ACMDCRCERR) {
  1783. printf("[SD%d] AUTO CMD CRC error (0x%x), Left DAT: %d bytes\n",
  1784. host->id, status, size);
  1785. err = MMC_ERR_ACMD_RSPCRC;
  1786. break;
  1787. } else if (status & MSDC_INT_XFER_COMPL) {
  1788. if (size == 0) {
  1789. MSG(OPS, "[SD%d] all data flushed to card\n", host->id);
  1790. break;
  1791. } else {
  1792. MSG(WRN, "[SD%d]<CHECKME> XFER_COMPL before all data written\n",
  1793. host->id);
  1794. }
  1795. }
  1796. if (size == 0)
  1797. continue;
  1798. if (MSDC_TXFIFOCNT() == 0) {
  1799. int left;
  1800. #if defined(MMC_MSDC_DRV_CTP)
  1801. if ( priv->pio_bits==32 ) {
  1802. if ( size >= MSDC_FIFO_THD )
  1803. left = MSDC_FIFO_THD;
  1804. else
  1805. left = size;
  1806. } else
  1807. #endif
  1808. {
  1809. if ( size >= MSDC_FIFO_SZ )
  1810. left = MSDC_FIFO_SZ;
  1811. else
  1812. left = size;
  1813. }
  1814. size_per_round = left;
  1815. #if defined(MMC_MSDC_DRV_CTP)
  1816. if (priv->pio_bits == 8) {
  1817. do {
  1818. MSDC_FIFO_WRITE8(*ptr8);
  1819. ptr8++;
  1820. left--;
  1821. } while (left);
  1822. } else if (priv->pio_bits == 16) {
  1823. do {
  1824. if (left > 1) {
  1825. MSDC_FIFO_WRITE16(*(u16*)ptr8);
  1826. ptr8+=2;
  1827. left-=2;
  1828. } else {
  1829. while (left--) {
  1830. MSDC_FIFO_WRITE8(*ptr8);
  1831. ptr8++;
  1832. }
  1833. }
  1834. } while (left);
  1835. } else
  1836. #endif
  1837. { //if ( write_unit==4 )
  1838. do {
  1839. if (left > 3) {
  1840. MSDC_FIFO_WRITE32(*(u32*)ptr8);
  1841. ptr8+=4;
  1842. left-=4;
  1843. } else {
  1844. while (left--){
  1845. MSDC_FIFO_WRITE8(*ptr8);
  1846. ptr8++;
  1847. }
  1848. }
  1849. } while (left);
  1850. }
  1851. size -= size_per_round;
  1852. }
  1853. }
  1854. if (err != MMC_ERR_NONE) {
  1855. msdc_abort(host); /* reset internal fifo and state machine */
  1856. MSG(OPS, "[SD%d] PIO Write Error (%d)\n", host->id, err);
  1857. }
  1858. return err;
  1859. }
  1860. int msdc_pio_get_sandisk_fwid(struct mmc_host *host, uchar *dst)
  1861. {
  1862. //msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1863. //u32 base = host->base;
  1864. u32 blksz = host->blklen;
  1865. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE;
  1866. //int multi;
  1867. struct mmc_command cmd;
  1868. ulong *ptr = (ulong *)dst;
  1869. //MSG(OPS, "[SD%d] Read data %d bytes from 0x%x\n", host->id, nblks * blksz, src);
  1870. msdc_clr_fifo(host);
  1871. msdc_set_blknum(host, 1);
  1872. msdc_set_blklen(host, blksz);
  1873. msdc_set_timeout(host, 100000000, 0);
  1874. /* send read command */
  1875. cmd.opcode = MMC_CMD21;
  1876. cmd.rsptyp = RESP_R1;
  1877. cmd.arg = 0;
  1878. cmd.retries = 0;
  1879. cmd.timeout = CMD_TIMEOUT;
  1880. err = msdc_cmd(host, &cmd);
  1881. if (err != MMC_ERR_NONE)
  1882. goto done;
  1883. err = derr = msdc_pio_read(host, (u32*)ptr, 1 * blksz);
  1884. done:
  1885. if (err != MMC_ERR_NONE) {
  1886. if (derr != MMC_ERR_NONE) {
  1887. printf("[SD%d] Read data error (%d)\n", host->id, derr);
  1888. msdc_abort_handler(host, 1);
  1889. } else {
  1890. printf("[SD%d] Read error (%d)\n", host->id, err);
  1891. }
  1892. }
  1893. return (derr == MMC_ERR_NONE) ? err : derr;
  1894. }
  1895. int msdc_pio_send_sandisk_fwid(struct mmc_host *host,uchar *src)
  1896. {
  1897. //msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1898. //u32 base = host->base;
  1899. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE;
  1900. //int multi;
  1901. u32 blksz = host->blklen;
  1902. struct mmc_command cmd;
  1903. ulong *ptr = (ulong *)src;
  1904. //MSG(OPS, "[SD%d] Write data %d bytes to 0x%x\n", host->id, nblks * blksz, dst);
  1905. msdc_clr_fifo(host);
  1906. msdc_set_blknum(host, 1);
  1907. msdc_set_blklen(host, blksz);
  1908. /* No need since MSDC always waits 8 cycles for write data timeout */
  1909. /* send write command */
  1910. cmd.opcode = MMC_CMD50;
  1911. cmd.rsptyp = RESP_R1;
  1912. cmd.arg = 0;
  1913. cmd.retries = 0;
  1914. cmd.timeout = CMD_TIMEOUT;
  1915. err = msdc_cmd(host, &cmd);
  1916. if (err != MMC_ERR_NONE)
  1917. goto done;
  1918. err = derr = msdc_pio_write(host, (u32*)ptr, 1 * blksz);
  1919. done:
  1920. if (err != MMC_ERR_NONE) {
  1921. if (derr != MMC_ERR_NONE) {
  1922. printf("[SD%d] Write data error (%d)\n", host->id, derr);
  1923. msdc_abort_handler(host, 1);
  1924. } else {
  1925. printf("[SD%d] Write error (%d)\n", host->id, err);
  1926. }
  1927. }
  1928. return (derr == MMC_ERR_NONE) ? err : derr;
  1929. }
  1930. int msdc_pio_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks)
  1931. {
  1932. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1933. //u32 base = host->base;
  1934. u32 blksz = host->blklen;
  1935. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE, cmd_err = MMC_ERR_NONE;
  1936. int multi;
  1937. struct mmc_command cmd;
  1938. ulong *ptr = (ulong *)dst;
  1939. MSG(OPS, "[SD%d] Read data %d bytes from 0x%x\n", host->id, nblks * blksz, src);
  1940. multi = nblks > 1 ? 1 : 0;
  1941. msdc_clr_fifo(host);
  1942. msdc_set_blknum(host, nblks);
  1943. msdc_set_blklen(host, blksz);
  1944. msdc_set_timeout(host, 100000000, 0);
  1945. /* send read command */
  1946. cmd.opcode = multi ? MMC_CMD_READ_MULTIPLE_BLOCK : MMC_CMD_READ_SINGLE_BLOCK;
  1947. /* CMD23 with length only 1 */
  1948. if (priv->autocmd & MSDC_AUTOCMD23)
  1949. cmd.opcode = MMC_CMD_READ_MULTIPLE_BLOCK;
  1950. cmd.rsptyp = RESP_R1;
  1951. cmd.arg = src;
  1952. cmd.retries = 0;
  1953. cmd.timeout = CMD_TIMEOUT;
  1954. host->cmd = &cmd;
  1955. err = msdc_cmd(host, &cmd);
  1956. if (err != MMC_ERR_NONE)
  1957. goto done;
  1958. derr = msdc_pio_read(host, (u32*)ptr, nblks * blksz);
  1959. if (derr != MMC_ERR_NONE)
  1960. goto done;
  1961. if (multi && (priv->autocmd == 0)) {
  1962. cmd_err = msdc_cmd_stop(host, &cmd);
  1963. }
  1964. done:
  1965. if (err != MMC_ERR_NONE){
  1966. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout.
  1967. * need reset host */
  1968. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  1969. // so call msdc_abort() directly
  1970. //msdc_abort_handler(host, 0);
  1971. msdc_abort(host);
  1972. return err; // high level will retry
  1973. }
  1974. if (derr != MMC_ERR_NONE){
  1975. /* crc error find in data transfer. need reset host & send cmd12 */
  1976. /* if autocmd crc occur, will enter here too */
  1977. msdc_abort_handler(host, 1);
  1978. return derr;
  1979. }
  1980. if (cmd_err != MMC_ERR_NONE){
  1981. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout
  1982. * need reset host */
  1983. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  1984. // so call msdc_abort() directly
  1985. //msdc_abort_handler(host, 0);
  1986. msdc_abort(host);
  1987. }
  1988. return MMC_ERR_NONE;
  1989. }
  1990. int msdc_pio_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks)
  1991. {
  1992. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  1993. int err = MMC_ERR_NONE, derr = MMC_ERR_NONE, cmd_err = MMC_ERR_NONE;
  1994. int multi;
  1995. u32 blksz = host->blklen;
  1996. struct mmc_command cmd;
  1997. ulong *ptr = (ulong *)src;
  1998. #ifdef MTK_EMMC_POWER_ON_WP
  1999. u32 base = host->base;
  2000. #endif
  2001. MSG(OPS, "[SD%d] Write data %d bytes to 0x%x\n", host->id, nblks * blksz, dst);
  2002. multi = nblks > 1 ? 1 : 0;
  2003. msdc_clr_fifo(host);
  2004. msdc_set_blknum(host, nblks);
  2005. msdc_set_blklen(host, blksz);
  2006. /* send write command */
  2007. cmd.opcode = multi ? MMC_CMD_WRITE_MULTIPLE_BLOCK : MMC_CMD_WRITE_BLOCK;
  2008. /* CMD23 with length only 1 */
  2009. if (priv->autocmd & MSDC_AUTOCMD23)
  2010. cmd.opcode = MMC_CMD_WRITE_MULTIPLE_BLOCK;
  2011. cmd.rsptyp = RESP_R1;
  2012. cmd.arg = dst;
  2013. cmd.retries = 0;
  2014. cmd.timeout = CMD_TIMEOUT;
  2015. err = msdc_cmd(host, &cmd);
  2016. if (err != MMC_ERR_NONE)
  2017. goto done;
  2018. host->cmd = &cmd;
  2019. derr = msdc_pio_write(host, (u32*)ptr, nblks * blksz);
  2020. if (multi && (priv->autocmd == 0)) {
  2021. cmd_err = msdc_cmd_stop(host, &cmd);
  2022. #ifdef MTK_EMMC_POWER_ON_WP
  2023. if (cmd.error == MMC_ERR_WP_VIOLATION) {
  2024. return MMC_ERR_WP_VIOLATION;
  2025. }
  2026. #endif
  2027. }
  2028. #ifdef MTK_EMMC_POWER_ON_WP
  2029. if (multi && (priv->autocmd & MSDC_AUTOCMD12)) {
  2030. if (MSDC_READ32(SDC_ACMD_RESP) & R1_WP_VIOLATION) {
  2031. return MMC_ERR_WP_VIOLATION;
  2032. }
  2033. }
  2034. err = msdc_get_wp_err(host);
  2035. if (err == MMC_ERR_WP_VIOLATION) {
  2036. return MMC_ERR_WP_VIOLATION;
  2037. }
  2038. #endif
  2039. done:
  2040. if (err != MMC_ERR_NONE){
  2041. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout.
  2042. * need reset host */
  2043. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  2044. // so call msdc_abort() directly
  2045. //msdc_abort_handler(host, 0);
  2046. msdc_abort(host);
  2047. return err; // high level will retry
  2048. }
  2049. if (derr != MMC_ERR_NONE){
  2050. /* crc error find in data transfer. need reset host & send cmd12 */
  2051. /* if autocmd crc occur, will enter here too */
  2052. msdc_abort_handler(host, 1);
  2053. return derr;
  2054. }
  2055. if (cmd_err != MMC_ERR_NONE){
  2056. /* msdc_cmd will do cmd tuning flow, so if enter here, cmd maybe timeout
  2057. * need reset host */
  2058. //Light: msdc_abort_handler() combined from preloader/LK and CTP can not meet this purpose,
  2059. // so call msdc_abort() directly
  2060. //msdc_abort_handler(host, 0);
  2061. msdc_abort(host);
  2062. return MMC_ERR_FAILED; // high level will retry
  2063. }
  2064. return MMC_ERR_NONE;
  2065. }
  2066. /* perloader will pre-set msdc pll and the mux channel of msdc pll */
  2067. /* note: pll will not changed */
  2068. void msdc_config_clksrc(struct mmc_host *host, u8 clksrc)
  2069. {
  2070. u32 ori_clksrc;
  2071. // modify the clock
  2072. #if !defined(FPGA_PLATFORM)
  2073. if (host->id == 0) {
  2074. msdc_src_clks = hclks_msdc0;
  2075. }
  2076. else {
  2077. msdc_src_clks = hclks_msdc1;
  2078. }
  2079. #endif
  2080. #if defined(MSDC0_EMMC50_SUPPORT)
  2081. if (host->card && mmc_card_hs400(host->card)){
  2082. /* after the card init flow, if the card support hs400 mode
  2083. * modify the mux channel of the msdc pll */
  2084. // mux select
  2085. #if (1 == MTK_HS400_USED_800M)
  2086. host->pll_mux_clk = MSDC50_CLKSRC_800MHZ;
  2087. host->src_clk = msdc_src_clks[MSDC50_CLKSRC_800MHZ];
  2088. printf("[info][%s] hs400 mode, change pll mux to 800Mhz\n", __func__);
  2089. #else
  2090. host->pll_mux_clk = MSDC50_CLKSRC_400MHZ;
  2091. printf("[info][%s] hs400 mode, change pll mux to 400Mhz\n", __func__);
  2092. host->src_clk = msdc_src_clks[MSDC50_CLKSRC_400MHZ];
  2093. #endif
  2094. } else
  2095. #endif
  2096. {
  2097. /* Perloader and LK use 208 is ok, no need change source, because not use HS200 */
  2098. #if defined(MMC_MSDC_DRV_PRELOADER) || defined(MMC_MSDC_DRV_LK)
  2099. host->pll_mux_clk = MSDC0_CLKSRC_DEFAULT;
  2100. host->src_clk = msdc_src_clks[MSDC0_CLKSRC_DEFAULT];
  2101. #endif
  2102. #if defined(MMC_MSDC_DRV_CTP)
  2103. host->pll_mux_clk = clksrc;
  2104. host->src_clk = msdc_src_clks[clksrc];
  2105. #endif
  2106. }
  2107. if (host->id == 0) {
  2108. MSDC_GET_FIELD((TOPCKGEN_BASE + 0), 0x7 << 11, ori_clksrc);
  2109. if (ori_clksrc != host->pll_mux_clk) {
  2110. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x24), 0x1 << 17, 1);
  2111. MSDC_SET_FIELD((TOPCKGEN_BASE + 0), 0x7 << 11, host->pll_mux_clk);
  2112. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x24), 0x1 << 17, 0);
  2113. }
  2114. } else {
  2115. MSDC_GET_FIELD((TOPCKGEN_BASE + 0), 0x7 << 20, ori_clksrc);
  2116. if (ori_clksrc != host->pll_mux_clk) {
  2117. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x24), 0x1 << 18, 1);
  2118. MSDC_SET_FIELD((TOPCKGEN_BASE + 0), 0x7 << 20, host->pll_mux_clk);
  2119. MSDC_SET_FIELD((TOPCKGEN_BASE + 0x24), 0x1 << 18, 0);
  2120. }
  2121. }
  2122. printf("[info][%s] input clock is %dkHz\n", __func__, host->src_clk/1000);
  2123. }
  2124. void msdc_config_clock(struct mmc_host *host, int ddr, u32 hz, u32 hs_timing)
  2125. {
  2126. msdc_priv_t *priv = host->priv;
  2127. u32 base = host->base;
  2128. u32 mode;
  2129. u32 div;
  2130. u32 sclk;
  2131. u32 orig_clksrc = host->pll_mux_clk;
  2132. #if defined(MSDC0_EMMC50_SUPPORT)
  2133. u32 hs400_src = 0;
  2134. #endif
  2135. #if defined(MMC_MSDC_DRV_CTP)
  2136. /* CTP HS200 and SDR104 need change clock source */
  2137. if (host->id == 0) {
  2138. /* Set for HS200 */
  2139. if (hz > MSDC_52M_SCLK) {
  2140. /* Change clock source to 187Mhz for HS200 */
  2141. if (orig_clksrc != MSDC0_CLKSRC_187MHZ) {
  2142. printf("[SD%d] hz=(%dkHz), change clock source form (%d) to (%d)\n",
  2143. host->id, hz/1000, orig_clksrc, MSDC0_CLKSRC_187MHZ);
  2144. orig_clksrc = MSDC0_CLKSRC_187MHZ;
  2145. host->src_clk = hclks_msdc0[orig_clksrc];
  2146. }
  2147. } else {
  2148. /* Change clock source to 208Mhz form HS200 to other mode */
  2149. if (orig_clksrc != MSDC0_CLKSRC_208MHZ) {
  2150. printf("[SD%d] hz=(%dkHz), change clock source form (%d) to (%d)\n",
  2151. host->id, hz/1000, orig_clksrc, MSDC0_CLKSRC_208MHZ);
  2152. orig_clksrc = MSDC0_CLKSRC_208MHZ;
  2153. host->src_clk = hclks_msdc0[orig_clksrc];
  2154. }
  2155. }
  2156. } else if (host->id == 1) {
  2157. /* Set for SDR104 */
  2158. if (hz > MSDC_100M_SCLK) {
  2159. /* Change clock source to 208Mhz for SDR104 */
  2160. if (orig_clksrc != MSDC1_CLKSRC_208MHZ) {
  2161. printf("[SD%d] hz=(%dkHz), change clock source form (%d) to (%d)\n",
  2162. host->id, hz/1000, orig_clksrc, MSDC1_CLKSRC_208MHZ);
  2163. orig_clksrc = MSDC1_CLKSRC_208MHZ;
  2164. host->src_clk = hclks_msdc1[orig_clksrc];
  2165. }
  2166. } else {
  2167. /* Change clock source to 187Mhz form SDR104 to other mode */
  2168. if (orig_clksrc != MSDC1_CLKSRC_187MHZ) {
  2169. printf("[SD%d] hz=(%dkHz), change clock source form (%d) to (%d)\n",
  2170. host->id, hz/1000, orig_clksrc, MSDC1_CLKSRC_187MHZ);
  2171. orig_clksrc = MSDC1_CLKSRC_187MHZ;
  2172. host->src_clk = hclks_msdc1[orig_clksrc];
  2173. }
  2174. }
  2175. }
  2176. #endif
  2177. if (hz >= host->f_max) {
  2178. hz = host->f_max;
  2179. } else if (hz < host->f_min) {
  2180. hz = host->f_min;
  2181. }
  2182. #if defined(MSDC0_EMMC50_SUPPORT)
  2183. if (hs_timing & EXT_CSD_HS_TIMEING_HS400) {
  2184. mode = 0x3; /* HS400 mode */
  2185. #if !defined(FPGA_PLATFORM)
  2186. if (host->id == 0) {
  2187. msdc_src_clks = hclks_msdc0;
  2188. }
  2189. else {
  2190. msdc_src_clks = hclks_msdc1;
  2191. }
  2192. #endif
  2193. #if (1 == MTK_HS400_USED_800M)
  2194. host->pll_mux_clk = MSDC50_CLKSRC_800MHZ;
  2195. host->src_clk = msdc_src_clks[MSDC50_CLKSRC_800MHZ];
  2196. if (hz >= (host->src_clk >> 2)) {
  2197. div = 0; /* mean div = 1/2 */
  2198. sclk = host->src_clk >> 2; /* sclk = clk/div/2. 2: internal divisor */
  2199. } else {
  2200. div = (host->src_clk + ((hz << 2) - 1)) / (hz << 2);
  2201. sclk = (host->src_clk >> 2) / div;
  2202. div = (div >> 1); /* since there is 1/2 internal divisor */
  2203. }
  2204. #else
  2205. host->pll_mux_clk = MSDC50_CLKSRC_400MHZ;
  2206. host->src_clk = msdc_src_clks[MSDC50_CLKSRC_400MHZ];
  2207. sclk = host->src_clk >> 1; // use 400Mhz source
  2208. div = 0;
  2209. #endif
  2210. } else
  2211. #endif
  2212. if (ddr) {
  2213. mode = 0x2; /* ddr mode and use divisor */
  2214. if (hz >= (host->src_clk >> 2)) {
  2215. div = 0; /* mean div = 1/2 */
  2216. sclk = host->src_clk >> 2; /* sclk = clk/div/2. 2: internal divisor */
  2217. } else {
  2218. div = (host->src_clk + ((hz << 2) - 1)) / (hz << 2);
  2219. sclk = (host->src_clk >> 2) / div;
  2220. div = (div >> 1); /* since there is 1/2 internal divisor */
  2221. }
  2222. } else if (hz >= host->src_clk) {
  2223. mode = 0x1; /* no divisor and divisor is ignored */
  2224. div = 0;
  2225. sclk = host->src_clk;
  2226. } else {
  2227. mode = 0x0; /* use divisor */
  2228. if (hz >= (host->src_clk >> 1)) {
  2229. div = 0; /* mean div = 1/2 */
  2230. sclk = host->src_clk >> 1; /* sclk = clk / 2 */
  2231. } else {
  2232. div = (host->src_clk + ((hz << 2) - 1)) / (hz << 2);
  2233. sclk = (host->src_clk >> 2) / div;
  2234. }
  2235. }
  2236. host->cur_bus_clk = sclk;
  2237. /* set clock mode and divisor */
  2238. #if defined(MSDC0_EMMC50_SUPPORT)
  2239. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD_HS400 | MSDC_CFG_CKMOD |
  2240. MSDC_CFG_CKDIV, (hs400_src << 14) | (mode << 12) | div);
  2241. #else
  2242. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD |
  2243. MSDC_CFG_CKDIV, (mode << 12) | div);
  2244. #endif
  2245. msdc_config_clksrc(host, orig_clksrc);
  2246. /* wait clock stable */
  2247. while (!(MSDC_READ32(MSDC_CFG) & MSDC_CFG_CKSTB));
  2248. if (hs_timing & EXT_CSD_HS_TIMEING_HS400){
  2249. msdc_set_smpl(host, 1, priv->rsmpl, TYPE_CMD_RESP_EDGE);
  2250. msdc_set_smpl(host, 1, priv->rdsmpl, TYPE_READ_DATA_EDGE);
  2251. msdc_set_smpl(host, 1, priv->wdsmpl, TYPE_WRITE_CRC_EDGE);
  2252. } else {
  2253. msdc_set_smpl(host, 0, priv->rsmpl, TYPE_CMD_RESP_EDGE);
  2254. msdc_set_smpl(host, 0, priv->rdsmpl, TYPE_READ_DATA_EDGE);
  2255. msdc_set_smpl(host, 0, priv->wdsmpl, TYPE_WRITE_CRC_EDGE);
  2256. }
  2257. printf("[SD%d] SET_CLK(%dkHz): SCLK(%dkHz) MODE(%d) DDR(%d) DIV(%d) DS(%d) RS(%d)\n",
  2258. host->id, hz/1000, sclk/1000, mode, ddr > 0 ? 1 : 0, div,
  2259. msdc_cap[host->id].data_edge, msdc_cap[host->id].cmd_edge);
  2260. }
  2261. void msdc_config_bus(struct mmc_host *host, u32 width)
  2262. {
  2263. u32 base = host->base;
  2264. u32 val = MSDC_READ32(SDC_CFG);
  2265. val &= ~SDC_CFG_BUSWIDTH;
  2266. switch (width) {
  2267. case HOST_BUS_WIDTH_1:
  2268. val |= (MSDC_BUS_1BITS << 16);
  2269. break;
  2270. case HOST_BUS_WIDTH_4:
  2271. val |= (MSDC_BUS_4BITS << 16);
  2272. break;
  2273. case HOST_BUS_WIDTH_8:
  2274. val |= (MSDC_BUS_8BITS << 16);
  2275. break;
  2276. default:
  2277. val |= (MSDC_BUS_1BITS << 16);
  2278. break;
  2279. }
  2280. MSDC_WRITE32(SDC_CFG, val);
  2281. printf("[SD%d] Bus Width: %d\n", host->id, width);
  2282. }
  2283. ////////////////////////////////////////////////////////////////////////////////
  2284. //
  2285. // Power Control -- Common for ASIC and FPGA
  2286. //
  2287. ////////////////////////////////////////////////////////////////////////////////
  2288. u32 g_msdc0_io;
  2289. u32 g_msdc1_io;
  2290. u32 g_msdc2_io;
  2291. u32 g_msdc3_io;
  2292. u32 g_msdc0_flash;
  2293. u32 g_msdc1_flash;
  2294. u32 g_msdc2_flash;
  2295. u32 g_msdc3_flash;
  2296. #if defined(FPGA_PLATFORM)
  2297. void msdc_set_host_level_pwr(struct mmc_host *host, u32 on, u32 level)
  2298. {
  2299. //Parameter host is currently not used. Reserve it for future usage
  2300. // GPO[3:2] = {LVL_PWR33, LVL_PWR18};
  2301. msdc_clr_gpio(PWR_MASK_VOL_18);
  2302. msdc_clr_gpio(PWR_MASK_VOL_33);
  2303. if ( on ) {
  2304. if (level)
  2305. msdc_set_gpio(PWR_MASK_VOL_18);
  2306. else
  2307. msdc_set_gpio(PWR_MASK_VOL_33);
  2308. }
  2309. //add for fpga debug
  2310. msdc_set_gpio(PWR_MASK_L4);
  2311. }
  2312. #else
  2313. #if defined(MMC_MSDC_DRV_CTP)
  2314. void msdc_set_host_level_pwr(struct mmc_host *host, u32 on, u32 level)
  2315. {
  2316. switch (host->id) {
  2317. case 0:
  2318. //no need change;
  2319. break;
  2320. case 1:
  2321. host->cur_pwr = VOL_1800;
  2322. msdc_set_rdtdsel(host, (host->cur_pwr == VOL_1800));
  2323. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  2324. msdc_ldo_power(on, MSDC_VMC, VOL_1800, &g_msdc1_io);
  2325. break;
  2326. case 2:
  2327. host->cur_pwr = VOL_1800;
  2328. msdc_set_rdtdsel(host, (host->cur_pwr == VOL_1800));
  2329. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  2330. msdc_ldo_power(on, MSDC_VMC, VOL_1800, &g_msdc2_io);
  2331. break;
  2332. default:
  2333. break;
  2334. }
  2335. }
  2336. #endif
  2337. #endif
  2338. void msdc_set_host_pwr(struct mmc_host *host, int on)
  2339. {
  2340. #if !defined(FPGA_PLATFORM)
  2341. msdc_set_rdtdsel(host, (host->cur_pwr == VOL_1800));
  2342. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  2343. #if defined(MMC_MSDC_DRV_CTP)
  2344. switch(host->id){
  2345. case 0:
  2346. //do nothing since it is always on
  2347. host->cur_pwr = VOL_3300;
  2348. break;
  2349. case 1:
  2350. msdc_ldo_power(on, MSDC_VMC, VOL_3000, &g_msdc1_io);
  2351. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &g_msdc1_flash);
  2352. host->cur_pwr = VOL_3000;
  2353. break;
  2354. case 2:
  2355. /* for sd */
  2356. msdc_ldo_power(on, MSDC_VMC, VOL_3000, &g_msdc2_io);
  2357. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &g_msdc2_flash);
  2358. host->cur_pwr = VOL_3000;
  2359. break;
  2360. case 3:
  2361. break;
  2362. default:
  2363. break;
  2364. }
  2365. #endif
  2366. #else
  2367. msdc_set_host_level_pwr(host, on, 0);
  2368. #endif
  2369. }
  2370. void msdc_host_power(struct mmc_host *host, int on)
  2371. {
  2372. MSG(CFG, "[SD%d] Turn %s %s power \n", host->id, on ? "on" : "off", "host");
  2373. if (on) {
  2374. msdc_config_pin(host, MSDC_PIN_PULL_UP);
  2375. msdc_set_host_pwr(host, 1);
  2376. msdc_clock(host, 1);
  2377. } else {
  2378. msdc_clock(host, 0);
  2379. msdc_set_host_pwr(host, 0);
  2380. msdc_config_pin(host, MSDC_PIN_PULL_DOWN);
  2381. }
  2382. }
  2383. void msdc_card_power(struct mmc_host *host, int on)
  2384. {
  2385. MSG(CFG, "[SD%d] Turn %s %s power \n", host->id, on ? "on" : "off", "card");
  2386. #if defined(FPGA_PLATFORM)
  2387. switch(host->id) {
  2388. case 0:
  2389. if (on) {
  2390. msdc_set_card_pwr(1);
  2391. } else {
  2392. msdc_set_card_pwr(0);
  2393. }
  2394. mdelay(10);
  2395. break;
  2396. default:
  2397. //No MSDC1 in FPGA
  2398. break;
  2399. }
  2400. #else
  2401. #if defined(MMC_MSDC_DRV_CTP)
  2402. switch(host->id) {
  2403. case 0:
  2404. //Do nothing since it is always on
  2405. break;
  2406. case 1:
  2407. msdc_ldo_power(on, MSDC_VMCH, VOL_3000, &g_msdc1_flash);
  2408. mdelay(10);
  2409. break;
  2410. default:
  2411. break;
  2412. }
  2413. #endif
  2414. #endif
  2415. }
  2416. void msdc_power(struct mmc_host *host, u8 mode)
  2417. {
  2418. if (mode == MMC_POWER_ON || mode == MMC_POWER_UP) {
  2419. msdc_host_power(host, 1);
  2420. msdc_card_power(host, 1);
  2421. } else {
  2422. msdc_card_power(host, 0);
  2423. msdc_host_power(host, 0);
  2424. }
  2425. }
  2426. #if defined(FEATURE_MMC_UHS1)
  2427. int msdc_switch_volt(struct mmc_host *host, int volt)
  2428. {
  2429. u32 base = host->base;
  2430. int err = MMC_ERR_FAILED;
  2431. u32 timeout = 1000;
  2432. u32 status;
  2433. u32 bus_clk = host->cur_bus_clk;
  2434. /* make sure SDC is not busy (TBC) */
  2435. WAIT_COND(!SDC_IS_BUSY(), timeout, timeout);
  2436. if (timeout == 0) {
  2437. err = MMC_ERR_TIMEOUT;
  2438. goto out;
  2439. }
  2440. /* check if CMD/DATA lines both 0 */
  2441. if ((MSDC_READ32(MSDC_PS) & ((1 << 24) | (0xF << 16))) == 0) {
  2442. /* pull up disabled in CMD and DAT[3:0] */
  2443. msdc_config_pin(host, MSDC_PIN_PULL_NONE);
  2444. /* change signal from 3.3v to 1.8v */
  2445. msdc_set_host_level_pwr(host, 1, 1);
  2446. /* wait at least 5ms for 1.8v signal switching in card */
  2447. mdelay(10);
  2448. /* config clock to 10~12MHz mode for volt switch detection by host. */
  2449. msdc_config_clock(host, 0, 12000000, 0);/*For FPGA 13MHz clock,this not work*/
  2450. /* pull up enabled in CMD and DAT[3:0] */
  2451. msdc_config_pin(host, MSDC_PIN_PULL_UP);
  2452. mdelay(5);
  2453. /* start to detect volt change by providing 1.8v signal to card */
  2454. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_BV18SDT);
  2455. /* wait at max. 1ms */
  2456. mdelay(1);
  2457. while ((status = MSDC_READ32(MSDC_CFG)) & MSDC_CFG_BV18SDT);
  2458. if (status & MSDC_CFG_BV18PSS)
  2459. err = MMC_ERR_NONE;
  2460. else
  2461. printf("[%s] sd%d v18 switch failed, MSDC_CFG=0x%x\n", __func__, host->id, status);
  2462. /* config clock back to init clk freq. */
  2463. msdc_config_clock(host, 0, bus_clk, 0);
  2464. }
  2465. out:
  2466. return err;
  2467. }
  2468. #endif
  2469. void msdc_reset_tune_counter(struct mmc_host *host)
  2470. {
  2471. host->time_read = 0;
  2472. }
  2473. #if defined(FEATURE_MMC_CM_TUNING)
  2474. int msdc_tune_cmdrsp(struct mmc_host *host, struct mmc_command *cmd)
  2475. {
  2476. u32 base = host->base;
  2477. u32 sel = 0;
  2478. u32 rsmpl,cur_rsmpl, orig_rsmpl;
  2479. u32 rrdly,cur_rrdly, orig_rrdly;
  2480. u32 cntr,cur_cntr,orig_cmdrtc;
  2481. u32 dl_cksel, cur_dl_cksel, orig_dl_cksel;
  2482. u32 times = 0;
  2483. int result = MMC_ERR_CMDTUNEFAIL;
  2484. u8 hs400 = 0, orig_clkmode;
  2485. if (host->cur_bus_clk > 100000000){
  2486. sel = 1;
  2487. }
  2488. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, orig_rsmpl);
  2489. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, orig_rrdly);
  2490. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, orig_cmdrtc);
  2491. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2492. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, orig_clkmode);
  2493. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2494. dl_cksel = 0;
  2495. do {
  2496. cntr = 0;
  2497. do{
  2498. rrdly = 0;
  2499. do {
  2500. for (rsmpl = 0; rsmpl < 2; rsmpl++) {
  2501. cur_rsmpl = (orig_rsmpl + rsmpl) % 2;
  2502. msdc_set_smpl(host, hs400, cur_rsmpl, TYPE_CMD_RESP_EDGE);
  2503. if (host->cur_bus_clk <= 400000){
  2504. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, 0);
  2505. }
  2506. if (cmd->opcode != MMC_CMD_STOP_TRANSMISSION) {
  2507. if (host->app_cmd){
  2508. host->app_cmd = false;
  2509. result = msdc_app_cmd(host);
  2510. host->app_cmd = true;
  2511. if(result != MMC_ERR_NONE)
  2512. return MMC_ERR_CMDTUNEFAIL;
  2513. }
  2514. result = msdc_send_cmd(host, cmd);
  2515. if(result == MMC_ERR_TIMEOUT)
  2516. rsmpl--;
  2517. if (result != MMC_ERR_NONE && cmd->opcode != MMC_CMD_STOP_TRANSMISSION){
  2518. if (cmd->opcode == MMC_CMD_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK
  2519. || cmd->opcode == MMC_CMD_READ_SINGLE_BLOCK ||cmd->opcode == MMC_CMD_WRITE_BLOCK
  2520. || cmd->opcode == MMC_CMD_SEND_WRITE_PROT_TYPE) {
  2521. msdc_abort_handler(host,1);
  2522. }
  2523. continue;
  2524. }
  2525. result = msdc_wait_rsp(host, cmd);
  2526. } else if (cmd->opcode == MMC_CMD_STOP_TRANSMISSION){
  2527. result = MMC_ERR_NONE;
  2528. goto done;
  2529. }
  2530. else
  2531. result = MMC_ERR_BADCRC;
  2532. #if MSDC_TUNE_LOG
  2533. /* for debugging */
  2534. {
  2535. u32 t_rrdly, t_rsmpl, t_dl_cksel,t_cmdrtc;
  2536. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, t_rsmpl);
  2537. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, t_rrdly);
  2538. //MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_RX_SDCLKO_SEL, t_cksel);
  2539. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, t_cmdrtc);
  2540. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, t_dl_cksel);
  2541. times++;
  2542. printf("[SD%d] <TUNE_CMD%d><%d><%s> CMDRRDLY=%d, RSPL=%dh\n",
  2543. host->id, (cmd->opcode & (~(SD_CMD_BIT | SD_CMD_APP_BIT))), times, (result == MMC_ERR_NONE) ?
  2544. "PASS" : "FAIL", t_rrdly, t_rsmpl);
  2545. printf("[SD%d] <TUNE_CMD><%d><%s> CMD_RSP_TA_CNTR=%xh\n",
  2546. host->id, times, (result == MMC_ERR_NONE) ?
  2547. "PASS" : "FAIL", t_cmdrtc);
  2548. if (host->cur_bus_clk > 100000000){
  2549. printf("[SD%d] <TUNE_CMD%d><%d><%s> CMD_RSP_TA_CNTR=%xh, INT_DAT_LATCH_CK_SEL=%xh\n",
  2550. host->id, (cmd->opcode & (~(SD_CMD_BIT | SD_CMD_APP_BIT))), times, (result == MMC_ERR_NONE) ?
  2551. "PASS" : "FAIL", t_cmdrtc, t_dl_cksel);
  2552. }
  2553. }
  2554. #endif
  2555. if (result == MMC_ERR_NONE) {
  2556. host->app_cmd = false;
  2557. goto done;
  2558. }
  2559. if(cmd->opcode == MMC_CMD_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_CMD_WRITE_MULTIPLE_BLOCK || cmd->opcode == MMC_CMD_READ_SINGLE_BLOCK ||cmd->opcode == MMC_CMD_WRITE_BLOCK)
  2560. msdc_abort_handler(host,1);
  2561. }
  2562. cur_rrdly = (orig_rrdly + rrdly + 1) % 32;
  2563. MSDC_SET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, cur_rrdly);
  2564. } while (++rrdly < 32);
  2565. if(!sel)
  2566. break;
  2567. cur_cntr = (orig_cmdrtc + cntr + 1) % 8;
  2568. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, cur_cntr);
  2569. }while(++cntr < 8);
  2570. /* no need to update data ck sel */
  2571. if (!sel)
  2572. break;
  2573. cur_dl_cksel = (orig_dl_cksel +dl_cksel+1) % 8;
  2574. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel);
  2575. dl_cksel++;
  2576. } while(dl_cksel < 8);
  2577. /* no need to update ck sel */
  2578. if(result != MMC_ERR_NONE)
  2579. result = MMC_ERR_CMDTUNEFAIL;
  2580. done:
  2581. return result;
  2582. }
  2583. #endif
  2584. #if defined(MMC_MSDC_DRV_CTP)
  2585. void msdc_tune_update_cmdrsp(struct mmc_host *host, u32 count)
  2586. {
  2587. u32 base = host->base;
  2588. u32 sel = 0;
  2589. u32 rsmpl,cur_rsmpl, orig_rsmpl;
  2590. u32 rrdly,cur_rrdly, orig_rrdly;
  2591. u32 cntr,cur_cntr,orig_cmdrtc;
  2592. u32 dl_cksel, cur_dl_cksel, orig_dl_cksel;
  2593. u32 times = 0;
  2594. u8 hs400 = 0, orig_clkmode;
  2595. printf("cur_bus_clk = %d\n", host->cur_bus_clk);
  2596. if (host->cur_bus_clk > 100000000){
  2597. sel = 1;
  2598. }
  2599. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, orig_rsmpl);
  2600. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, orig_rrdly);
  2601. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, orig_cmdrtc);
  2602. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2603. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, orig_clkmode);
  2604. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2605. dl_cksel = 0;
  2606. cntr = 0;
  2607. rrdly = 0;
  2608. if (sel == 1){
  2609. if (count >= 8 * 64 && count < 8 * 8 * 64) {
  2610. dl_cksel = count % 8;
  2611. cur_dl_cksel = (orig_dl_cksel + dl_cksel + 1) % 8;
  2612. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel);
  2613. count = count % (8 * 64);
  2614. }
  2615. if (count >= 64 && count < 8 * 64) {
  2616. cntr = count % 8;
  2617. cur_cntr = (orig_cmdrtc + cntr + 1) % 8;
  2618. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_CMD_RSP_TA_CNTR, cur_cntr);
  2619. count = count % 64;
  2620. }
  2621. }
  2622. if (count >= 2 && count < 64) {
  2623. rrdly = count % 32;
  2624. cur_rrdly = (orig_rrdly + rrdly + 1) % 32;
  2625. MSDC_SET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_CMDRRDLY, cur_rrdly);
  2626. count = (count > 32 ? 1 : 0);
  2627. }
  2628. if (count >= 0 && count < 2){
  2629. cur_rsmpl = (orig_rsmpl + count) % 2;
  2630. msdc_set_smpl(host, hs400, cur_rsmpl, TYPE_CMD_RESP_EDGE);
  2631. }
  2632. }
  2633. #endif
  2634. #if defined(FEATURE_MMC_RD_TUNING)
  2635. int msdc_tune_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks)
  2636. {
  2637. u32 base = host->base;
  2638. u32 dcrc, ddr = 0, sel = 0;
  2639. u32 cur_rxdly0, cur_rxdly1;
  2640. u32 rdsmpl, cur_rdsmpl, orig_rdsmpl;
  2641. u32 dsel,cur_dsel,orig_dsel;
  2642. u32 dl_cksel,cur_dl_cksel,orig_dl_cksel;
  2643. u32 rxdly;
  2644. u32 orig_clkmode;
  2645. u32 times = 0;
  2646. int result = MMC_ERR_READTUNEFAIL;
  2647. u8 hs400 = 0;
  2648. if (host->cur_bus_clk > 100000000)
  2649. sel = 1;
  2650. MSDC_GET_FIELD(MSDC_CFG, MSDC_CFG_CKMOD, orig_clkmode);
  2651. ddr = (orig_clkmode == 2) ? 1 : 0;
  2652. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2653. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, orig_dsel);
  2654. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2655. //MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, orig_rdsmpl);
  2656. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, orig_rdsmpl);
  2657. /* Tune Method 2. delay each data line */
  2658. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  2659. dl_cksel = 0;
  2660. do {
  2661. dsel = 0;
  2662. do {
  2663. rxdly = 0;
  2664. do {
  2665. for (rdsmpl = 0; rdsmpl < 2; rdsmpl++) {
  2666. cur_rdsmpl = (orig_rdsmpl + rdsmpl) % 2;
  2667. msdc_set_smpl(host, hs400, cur_rdsmpl, TYPE_READ_DATA_EDGE);
  2668. result = host->blk_read(host, dst, src, nblks);
  2669. if (result == MMC_ERR_CMDTUNEFAIL || result == MMC_ERR_CMD_RSPCRC || result == MMC_ERR_ACMD_RSPCRC)
  2670. goto done;
  2671. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  2672. if (!ddr) dcrc &= ~SDC_DCRC_STS_NEG;
  2673. #if MSDC_TUNE_LOG
  2674. /* for debugging */
  2675. {
  2676. u32 t_dspl, t_ckgen_dsel, t_int_cksel;
  2677. //MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, t_dspl);
  2678. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, t_dspl);
  2679. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, t_ckgen_dsel);
  2680. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, t_int_cksel);
  2681. times++;
  2682. printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> DCRC=%xh, ret=%d\n",
  2683. host->id, times, (result == MMC_ERR_NONE && dcrc == 0) ?
  2684. "PASS" : "FAIL", (nblks == 1 ? 17 : 18), src, dcrc, result);
  2685. printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> DATRDDLY0=%xh, DATRDDLY1=%xh, DSMPL=%xh\n",
  2686. host->id, times, (result == MMC_ERR_NONE && dcrc == 0) ?
  2687. "PASS" : "FAIL", (nblks == 1 ? 17 : 18), src, MSDC_READ32(MSDC_DAT_RDDLY0), MSDC_READ32(MSDC_DAT_RDDLY1), t_dspl);
  2688. if (host->cur_bus_clk >= 100000000){
  2689. printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> CKGEN_MSDC_DLY_SEL=%xh, INT_DAT_LATCH_CK_SEL=%xh\n",
  2690. host->id, times, (result == MMC_ERR_NONE && dcrc == 0) ?
  2691. "PASS" : "FAIL", (nblks == 1 ? 17 : 18), src, t_ckgen_dsel, t_int_cksel);
  2692. }
  2693. }
  2694. #endif
  2695. /* no crc error in this data line */
  2696. if (result == MMC_ERR_NONE && dcrc == 0) {
  2697. goto done;
  2698. } else {
  2699. result = MMC_ERR_BADCRC;
  2700. }
  2701. }
  2702. cur_rxdly0 = MSDC_READ32(MSDC_DAT_RDDLY0);
  2703. cur_rxdly1 = MSDC_READ32(MSDC_DAT_RDDLY1);
  2704. cur_rxdly0 += (dcrc & ((1 << 0) | (1 << 8)) ) ? (1<<24) : 0;
  2705. cur_rxdly0 += (dcrc & ((1 << 1) | (1 << 9)) ) ? (1<<16) : 0;
  2706. cur_rxdly0 += (dcrc & ((1 << 2) | (1 << 10)) ) ? (1<<8) : 0;
  2707. cur_rxdly0 += (dcrc & ((1 << 3) | (1 << 11)) ) ? (1<<0) : 0;
  2708. cur_rxdly1 += (dcrc & ((1 << 4) | (1 << 12)) ) ? (1<<24) : 0;
  2709. cur_rxdly1 += (dcrc & ((1 << 5) | (1 << 13)) ) ? (1<<16) : 0;
  2710. cur_rxdly1 += (dcrc & ((1 << 6) | (1 << 14)) ) ? (1<<8) : 0;
  2711. cur_rxdly1 += (dcrc & ((1 << 7) | (1 << 15)) ) ? (1<<0) : 0;
  2712. MSDC_WRITE32(MSDC_DAT_RDDLY0, cur_rxdly0&0x1F1F1F1F);
  2713. MSDC_WRITE32(MSDC_DAT_RDDLY1, cur_rxdly1&0x1F1F1F1F);
  2714. if ( (cur_rxdly0&0x20202020) || (cur_rxdly1&0x20202020) )
  2715. break;
  2716. } while (++rxdly < 32);
  2717. if(!sel)
  2718. break;
  2719. cur_dsel = (orig_dsel + dsel + 1) % 32;
  2720. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, cur_dsel);
  2721. } while(++dsel < 32);
  2722. /* no need to update data ck sel */
  2723. if (orig_clkmode != 1)
  2724. break;
  2725. cur_dl_cksel = (orig_dl_cksel + dl_cksel + 1) % 8;
  2726. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel);
  2727. dl_cksel++;
  2728. } while (dl_cksel < 8);
  2729. done:
  2730. return result;
  2731. }
  2732. #define READ_TUNING_MAX_HS (2 * 32)
  2733. #define READ_TUNING_MAX_UHS (2 * 32 * 32)
  2734. #define READ_TUNING_MAX_UHS_CLKMOD1 (2 * 32 * 32 *8)
  2735. int msdc_tune_read(struct mmc_host *host)
  2736. {
  2737. u32 base = host->base;
  2738. u32 dcrc, ddr = 0, sel = 0;
  2739. u32 cur_rxdly0 = 0 , cur_rxdly1 = 0;
  2740. u32 cur_dsmpl = 0, orig_dsmpl;
  2741. u32 cur_dsel = 0,orig_dsel;
  2742. u32 cur_dl_cksel = 0,orig_dl_cksel;
  2743. u32 orig_clkmode;
  2744. //u32 times = 0;
  2745. int result = MMC_ERR_NONE;
  2746. u8 hs400 = 0;
  2747. if (host->cur_bus_clk > 100000000)
  2748. sel = 1;
  2749. if (host->card){
  2750. ddr = mmc_card_ddr(host->card);
  2751. }
  2752. MSDC_GET_FIELD(MSDC_CFG,MSDC_CFG_CKMOD,orig_clkmode);
  2753. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2754. //if(orig_clkmode == 1)
  2755. //MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_RX_SDCLKO_SEL, 0);
  2756. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, orig_dsel);
  2757. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, orig_dl_cksel);
  2758. //MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, orig_dsmpl);
  2759. MSDC_GET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, orig_dsmpl);
  2760. /* Tune Method 2. delay each data line */
  2761. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  2762. cur_dsmpl = (orig_dsmpl + 1) ;
  2763. msdc_set_smpl(host, hs400, (cur_dsmpl % 2), TYPE_READ_DATA_EDGE);
  2764. if (cur_dsmpl >= 2){
  2765. MSDC_GET_FIELD(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc);
  2766. if (!ddr) dcrc &= ~SDC_DCRC_STS_NEG;
  2767. cur_rxdly0 = MSDC_READ32(MSDC_DAT_RDDLY0);
  2768. cur_rxdly1 = MSDC_READ32(MSDC_DAT_RDDLY1);
  2769. cur_rxdly0 += (dcrc & ((1 << 0) | (1 << 8)) ) ? (1<<24) : 0;
  2770. cur_rxdly0 += (dcrc & ((1 << 1) | (1 << 9)) ) ? (1<<16) : 0;
  2771. cur_rxdly0 += (dcrc & ((1 << 2) | (1 << 10)) ) ? (1<<8) : 0;
  2772. cur_rxdly0 += (dcrc & ((1 << 3) | (1 << 11)) ) ? (1<<0) : 0;
  2773. cur_rxdly1 += (dcrc & ((1 << 4) | (1 << 12)) ) ? (1<<24) : 0;
  2774. cur_rxdly1 += (dcrc & ((1 << 5) | (1 << 13)) ) ? (1<<16) : 0;
  2775. cur_rxdly1 += (dcrc & ((1 << 6) | (1 << 14)) ) ? (1<<8) : 0;
  2776. cur_rxdly1 += (dcrc & ((1 << 7) | (1 << 15)) ) ? (1<<0) : 0;
  2777. MSDC_WRITE32(MSDC_DAT_RDDLY0, cur_rxdly0&0x1F1F1F1F);
  2778. MSDC_WRITE32(MSDC_DAT_RDDLY1, cur_rxdly1&0x1F1F1F1F);
  2779. }
  2780. if ( (cur_rxdly0&0x20202020) || (cur_rxdly1&0x20202020) ) {
  2781. if(sel){
  2782. cur_dsel = (orig_dsel + 1);
  2783. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_CKGEN_MSDC_DLY_SEL, cur_dsel % 32);
  2784. }
  2785. }
  2786. if (cur_dsel >= 32){
  2787. if(orig_clkmode == 1 && sel){
  2788. cur_dl_cksel = (orig_dl_cksel + 1);
  2789. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, cur_dl_cksel % 8);
  2790. }
  2791. }
  2792. MSG(WRN, "[SD%d] <TUNE_READ_%d> DSMPL=%x, DATRDDLY0=%xh, DATRDDLY1=%xh\n"
  2793. "[SD%d] <TUNE_READ_%d> CKGEN_MSDC_DLY_SEL=%xh, INT_DAT_LATCH_CK_SEL=%xh\n",
  2794. host->id, host->time_read, cur_dsmpl&0x1, cur_rxdly0, cur_rxdly1,
  2795. host->id, host->time_read, cur_dsel, cur_dl_cksel%8);
  2796. ++(host->time_read);
  2797. if((sel == 1 && orig_clkmode == 1 && host->time_read == READ_TUNING_MAX_UHS_CLKMOD1)||
  2798. (sel == 1 && orig_clkmode != 1 && host->time_read == READ_TUNING_MAX_UHS)||
  2799. (sel == 0 && orig_clkmode != 1 && host->time_read == READ_TUNING_MAX_HS)){
  2800. result = MMC_ERR_READTUNEFAIL;
  2801. }
  2802. return result;
  2803. }
  2804. #endif /* end of FEATURE_MMC_RD_TUNING */
  2805. #if defined(MSDC0_EMMC50_SUPPORT)
  2806. int msdc_tune_rw_hs400(struct mmc_host *host, uchar *dst, ulong src, ulong nblks, unsigned int rw)
  2807. {
  2808. u32 ds_dly1 = 0, ds_dly3 = 0, orig_ds_dly1 = 0, orig_ds_dly3 = 0;
  2809. u32 ds_dly1_count, ds_dly3_count = 0;
  2810. int result = MMC_ERR_READTUNEFAIL;
  2811. #if MSDC_TUNE_LOG
  2812. u32 times = 0;
  2813. #endif
  2814. u32 base = host->base;
  2815. if(host->id != 0){
  2816. return result;
  2817. }
  2818. printf("[tune][%s:%d] start hs400 read tune\n", __func__, __LINE__);
  2819. MSDC_GET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY1, orig_ds_dly1);
  2820. MSDC_GET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY3, orig_ds_dly3);
  2821. ds_dly3 = orig_ds_dly3;
  2822. ds_dly1 = orig_ds_dly1;
  2823. do {
  2824. if (ds_dly3 >= 31){
  2825. ds_dly3 = 0;
  2826. } else {
  2827. ds_dly3 += 1;
  2828. }
  2829. MSDC_SET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY3, ds_dly3);
  2830. ds_dly1_count = 0;
  2831. do {
  2832. if (ds_dly1 == 0){
  2833. ds_dly1 = 31;
  2834. } else {
  2835. ds_dly1 -= 1;
  2836. }
  2837. MSDC_SET_FIELD(EMMC50_PAD_DS_TUNE, MSDC_EMMC50_PAD_DS_TUNE_DLY1, ds_dly1);
  2838. /* resend the r/w command */
  2839. if (rw == 0){
  2840. result = host->blk_read(host, dst, src, nblks);
  2841. } else if (rw == 1){
  2842. result = host->blk_write(host, (ulong) dst, (uchar *) src, nblks);
  2843. }
  2844. #if MSDC_TUNE_LOG
  2845. /* for debugging */
  2846. {
  2847. times++;
  2848. if (rw == 0){
  2849. printf("[SD%d] <TUNE_BREAD_%d><%s><cmd%d:0x%x> ret=%d, DS_DLY1=%d, DS_DLY3=%d\n",
  2850. host->id, times, result == MMC_ERR_NONE ? "PASS" : "FAIL", (nblks == 1 ? 17 : 18), (unsigned int)dst,
  2851. result, ds_dly1, ds_dly3);
  2852. } else if (rw == 1){
  2853. printf("[SD%d] <TUNE_BEWRITE_%d><%s><cmd%d:0x%x> ret=%d, DS_DLY1=%d, DS_DLY3=%d\n",
  2854. host->id, times, result == MMC_ERR_NONE ? "PASS" : "FAIL", (nblks == 1 ? 24 : 25), (unsigned int)dst,
  2855. result, ds_dly1, ds_dly3);
  2856. }
  2857. }
  2858. #endif
  2859. if(result == MMC_ERR_CMDTUNEFAIL || result == MMC_ERR_CMD_RSPCRC)
  2860. goto done;
  2861. if (result == MMC_ERR_NONE) {
  2862. goto done;
  2863. }
  2864. } while(++ds_dly1_count < 32);
  2865. } while(++ds_dly3_count < 32);
  2866. done:
  2867. return result;
  2868. }
  2869. #endif
  2870. #if defined(FEATURE_MMC_WR_TUNING)
  2871. int msdc_tune_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks)
  2872. {
  2873. u32 base = host->base;
  2874. u32 orig_clkmode;
  2875. u32 sel = 0;
  2876. //u32 ddrckdly = 0;
  2877. u32 wrrdly, cur_wrrdly, orig_wrrdly;
  2878. u32 wdsmpl, cur_wdsmpl, orig_wdsmpl;
  2879. u32 d_cntr,orig_d_cntr,cur_d_cntr;
  2880. u32 rxdly, cur_rxdly0;
  2881. u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3;
  2882. u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3;
  2883. #if MSDC_TUNE_LOG
  2884. u32 times = 0;
  2885. #endif
  2886. //u32 status;
  2887. int result = MMC_ERR_WRITETUNEFAIL;
  2888. u8 hs400 = 0;
  2889. if (host->cur_bus_clk > 100000000)
  2890. sel = 1;
  2891. //if (mmc_card_ddr(host->card))
  2892. // ddrckdly = 1;
  2893. MSDC_GET_FIELD(MSDC_CFG,MSDC_CFG_CKMOD,orig_clkmode);
  2894. #if (1 == MTK_HS400_USED_800M)
  2895. hs400 = (orig_clkmode == 3) ? 1 : 0;
  2896. #else
  2897. hs400 = (orig_clkmode == 2) ? 1 : 0;
  2898. #endif
  2899. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATWRDLY, orig_wrrdly);
  2900. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, orig_wdsmpl);
  2901. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, orig_d_cntr);
  2902. /* Tune Method 2. delay data0 line */
  2903. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
  2904. cur_rxdly0 = MSDC_READ32(MSDC_DAT_RDDLY0);
  2905. orig_dat0 = (cur_rxdly0 >> 24) & 0x1F;
  2906. orig_dat1 = (cur_rxdly0 >> 16) & 0x1F;
  2907. orig_dat2 = (cur_rxdly0 >> 8) & 0x1F;
  2908. orig_dat3 = (cur_rxdly0 >> 0) & 0x1F;
  2909. d_cntr = 0;
  2910. do {
  2911. rxdly = 0;
  2912. do {
  2913. wrrdly = 0;
  2914. do {
  2915. for (wdsmpl = 0; wdsmpl < 2; wdsmpl++) {
  2916. cur_wdsmpl = (orig_wdsmpl + wdsmpl) % 2;
  2917. msdc_set_smpl(host, hs400, cur_wdsmpl, TYPE_WRITE_CRC_EDGE);
  2918. result = host->blk_write(host, dst, src, nblks);
  2919. if (result == MMC_ERR_CMDTUNEFAIL || result == MMC_ERR_CMD_RSPCRC || result == MMC_ERR_ACMD_RSPCRC)
  2920. goto done;
  2921. #if MSDC_TUNE_LOG
  2922. /* for debugging */
  2923. {
  2924. u32 t_dspl, t_wrrdly, t_d_cntr;// t_dl_cksel, t_ddrdly, t_cksel;
  2925. MSDC_GET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATWRDLY, t_wrrdly);
  2926. MSDC_GET_FIELD(MSDC_IOCON, MSDC_IOCON_W_D_SMPL, t_dspl);
  2927. MSDC_GET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, t_d_cntr);
  2928. times++;
  2929. printf("[SD%d] <TUNE_BWRITE_%d><%s><cmd%d:0x%x> ret=%d, DSPL=%d, WRRDLY=%d, MSDC_DAT_RDDLY0=%xh\n",
  2930. host->id, times, result == MMC_ERR_NONE ? "PASS" : "FAIL", (nblks == 1 ? 24 : 25), (unsigned int)dst,
  2931. result, t_dspl, t_wrrdly, MSDC_READ32(MSDC_DAT_RDDLY0));
  2932. if (host->cur_bus_clk >= 100000000){
  2933. printf("[SD%d] <TUNE_BWRITE_%d><%s><cmd%d:0x%x> MSDC_PB1_WRDAT_CRCS_TA_CNTR=%xh\n",
  2934. host->id, times, (result == MMC_ERR_NONE) ? "PASS" : "FAIL", (nblks == 1 ? 24 : 25), (unsigned int)dst,
  2935. t_d_cntr);
  2936. }
  2937. }
  2938. #endif
  2939. if (result == MMC_ERR_NONE) {
  2940. goto done;
  2941. }
  2942. }
  2943. cur_wrrdly = ++orig_wrrdly % 32;
  2944. MSDC_SET_FIELD(MSDC_PAD_TUNE0, MSDC_PAD_TUNE0_DATWRDLY, cur_wrrdly);
  2945. } while (++wrrdly < 32);
  2946. cur_dat0 = ++orig_dat0 % 32; /* only adjust bit-1 for crc */
  2947. cur_dat1 = orig_dat1;
  2948. cur_dat2 = orig_dat2;
  2949. cur_dat3 = orig_dat3;
  2950. cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0);
  2951. MSDC_WRITE32(MSDC_DAT_RDDLY0, cur_rxdly0);
  2952. } while (++rxdly < 32);
  2953. /* no need to update data ck sel */
  2954. if (!sel)
  2955. break;
  2956. cur_d_cntr= (orig_d_cntr + d_cntr +1 )% 8;
  2957. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_WRDAT_CRCS_TA_CNTR, cur_d_cntr);
  2958. d_cntr++;
  2959. } while (d_cntr < 8);
  2960. done:
  2961. return result;
  2962. }
  2963. #endif /* end of FEATURE_MMC_WR_TUNING */
  2964. #if defined(FEATURE_MMC_UHS1)
  2965. int msdc_tune_uhs1(struct mmc_host *host, struct mmc_card *card)
  2966. {
  2967. u32 base = host->base;
  2968. u32 status;
  2969. int i;
  2970. int err = MMC_ERR_FAILED;
  2971. struct mmc_command cmd;
  2972. cmd.opcode = SD_CMD_SEND_TUNING_BLOCK;
  2973. cmd.arg = 0;
  2974. cmd.rsptyp = RESP_R1;
  2975. cmd.retries = CMD_RETRIES;
  2976. cmd.timeout = 0xFFFFFFFF;
  2977. msdc_set_timeout(host, 100000000, 0);
  2978. msdc_set_autocmd(host, MSDC_AUTOCMD19, 1);
  2979. for (i = 0; i < 13; i++) {
  2980. /* Note. select a pad to be tuned. msdc only tries 32 times to tune the
  2981. * pad since there is only 32 tuning steps for a pad.
  2982. */
  2983. MSDC_SET_FIELD(SDC_ACMD19_TRG, SDC_ACMD19_TRG_TUNESEL, i);
  2984. /* Note. autocmd19 will only trigger done interrupt and won't trigger
  2985. * autocmd timeout and crc error interrupt. (autocmd19 is a special command
  2986. * and is different from autocmd12 and autocmd23.
  2987. */
  2988. err = msdc_cmd(host, &cmd);
  2989. if (err != MMC_ERR_NONE)
  2990. goto out;
  2991. /* read and check acmd19 sts. bit-1: success, bit-0: fail */
  2992. status = MSDC_READ32(SDC_ACMD19_STS);
  2993. if (!status) {
  2994. printf("[SD%d] ACMD19_TRG(%d), STS(0x%x) Failed\n", host->id, i,
  2995. status);
  2996. err = MMC_ERR_FAILED;
  2997. goto out;
  2998. }
  2999. }
  3000. err = MMC_ERR_NONE;
  3001. out:
  3002. msdc_set_autocmd(host, MSDC_AUTOCMD19, 0);
  3003. return err;
  3004. }
  3005. int msdc_tune_hs200(struct mmc_host *host, struct mmc_card *card)
  3006. {
  3007. return 0;
  3008. }
  3009. int msdc_tune_hs400(struct mmc_host *host, struct mmc_card *card)
  3010. {
  3011. return 0;
  3012. }
  3013. #endif
  3014. #if defined(FEATURE_MMC_CARD_DETECT)
  3015. void msdc_card_detect(struct mmc_host *host, int on)
  3016. {
  3017. u32 base = host->base;
  3018. if ((msdc_cap[host->id].flags & MSDC_CD_PIN_EN) == 0) {
  3019. MSDC_CARD_DETECTION_OFF();
  3020. return;
  3021. }
  3022. if (on) {
  3023. MSDC_SET_FIELD(MSDC_PS, MSDC_PS_CDDEBOUNCE, DEFAULT_DEBOUNCE);
  3024. MSDC_CARD_DETECTION_ON();
  3025. } else {
  3026. MSDC_CARD_DETECTION_OFF();
  3027. MSDC_SET_FIELD(MSDC_PS, MSDC_PS_CDDEBOUNCE, 0);
  3028. }
  3029. }
  3030. int msdc_card_avail(struct mmc_host *host)
  3031. {
  3032. u32 base = host->base;
  3033. u32 sts, avail = 0;
  3034. if ((msdc_cap[host->id].flags & MSDC_REMOVABLE) == 0)
  3035. return 1;
  3036. if (msdc_cap[host->id].flags & MSDC_CD_PIN_EN) {
  3037. MSDC_GET_FIELD(MSDC_PS, MSDC_PS_CDSTS, sts);
  3038. avail = sts == 0 ? 1 : 0;
  3039. }
  3040. return avail;
  3041. }
  3042. #endif
  3043. #if defined(MMC_MSDC_DRV_CTP)
  3044. int msdc_card_protected(struct mmc_host *host)
  3045. {
  3046. u32 base = host->base;
  3047. u32 prot;
  3048. if (msdc_cap[host->id].flags & MSDC_WP_PIN_EN) {
  3049. MSDC_GET_FIELD(MSDC_PS, MSDC_PS_WP, prot);
  3050. } else {
  3051. prot = 0;
  3052. }
  3053. return prot;
  3054. }
  3055. #endif
  3056. #if defined(MMC_MSDC_DRV_CTP) || defined(MMC_MSDC_DRV_LK)
  3057. void msdc_hard_reset(struct mmc_host *host)
  3058. {
  3059. msdc_card_power(host, 0);
  3060. mdelay(10);
  3061. msdc_card_power(host, 1);
  3062. mdelay(10);
  3063. }
  3064. void msdc_soft_reset(struct mmc_host *host)
  3065. {
  3066. u32 base = host->base;
  3067. u32 tmo = 0x0000ffff;
  3068. MSDC_RESET();
  3069. MSDC_SET_FIELD(MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1);
  3070. WAIT_COND((MSDC_READ32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS) == 0, 0xFFFF, tmo);
  3071. if (tmo == 0) {
  3072. MSG(DMA, "[SD%d] MSDC_DMA_CFG_STS != inactive\n", host->id);
  3073. }
  3074. MSDC_CLR_FIFO();
  3075. }
  3076. #endif
  3077. #if defined(MMC_MSDC_DRV_CTP)
  3078. void msdc_emmc_hard_reset(struct mmc_host *host)
  3079. {
  3080. u32 base = host->base;
  3081. MSDC_SET_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  3082. //mt_set_gpio_out(PAD_MSDC0_RSTB,GPIO_OUT_ZERO);
  3083. mdelay(10);
  3084. MSDC_CLR_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  3085. //mt_set_gpio_out(PAD_MSDC0_RSTB,GPIO_OUT_ONE);
  3086. }
  3087. #endif
  3088. #ifdef FEATURE_MMC_BOOT_MODE
  3089. int msdc_emmc_boot_start(struct mmc_host *host, u32 hz, int ddr, int mode, int ackdis, u8 hostbuswidth, u64 size)
  3090. {
  3091. int err = MMC_ERR_NONE;
  3092. u32 sts;
  3093. u32 base = host->base;
  3094. u32 tmo = 0xFFFFFFFF;
  3095. u32 acktmo, dattmo;
  3096. u64 acktime,dattime;
  3097. u32 test_timer1;
  3098. u32 test_timer2;
  3099. MSDC_RESET();
  3100. MSDC_CLR_FIFO();
  3101. msdc_set_blklen(host, 512);
  3102. msdc_set_blknum(host, size/512);
  3103. msdc_config_bus(host, hostbuswidth);
  3104. msdc_config_clock(host, (ddr ? MMC_STATE_DDR : 0), hz, 0);
  3105. //MSDC_SET_FIELD(MSDC_DMA_CFG,3 << 12,0x2);
  3106. //MSDC_SET_FIELD(MSDC_DMA_CFG,3 << 8,0x1);
  3107. /* requires 74 clocks/1ms before CMD0 */
  3108. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  3109. mdelay(2);
  3110. MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  3111. /* configure boot timeout value */
  3112. WAIT_COND(SDC_IS_BUSY() == 0, tmo, tmo);
  3113. acktime = 50 * 1000 * 1000ULL;
  3114. dattime = 1000 * 1000 * 1000ULL;
  3115. acktmo = msdc_cal_timeout(host, acktime, 0, 1<<EMMC_BOOT_TMO_IN_CLK_2POWER); /* 50ms MT6583 MSDC IP eMMC boot timeout unit change to 2^16*/
  3116. dattmo = msdc_cal_timeout(host, dattime, 0, 1<<EMMC_BOOT_TMO_IN_CLK_2POWER); /* 1sec */
  3117. if (acktmo == 0) acktmo = 1;
  3118. if (dattmo == 0) dattmo = 1;
  3119. acktmo = acktmo > 0xFFE ? 0xFFE : acktmo;
  3120. dattmo = dattmo > 0xFFFFE ? 0xFFFFE : dattmo;
  3121. printf("[SD%d] EMMC BOOT ACK timeout: %d ms (clkcnt: %d)(host->cur_bus_clk = %d)\n", host->id,
  3122. (acktmo * 65536) / (host->cur_bus_clk / 1000), acktmo, host->cur_bus_clk);
  3123. printf("[SD%d] EMMC BOOT DAT timeout: %d ms (clkcnt: %d)\n", host->id,
  3124. (dattmo * 65536) / (host->cur_bus_clk / 1000), dattmo);
  3125. MSDC_SET_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSUPP);
  3126. MSDC_SET_FIELD(EMMC_CFG0, EMMC_CFG0_BOOTACKDIS, ackdis);
  3127. MSDC_SET_FIELD(EMMC_CFG0, EMMC_CFG0_BOOTMODE, mode);
  3128. MSDC_SET_FIELD(EMMC_CFG1, EMMC_CFG1_BOOTACKTMC, acktmo);
  3129. MSDC_SET_FIELD(EMMC_CFG1, EMMC_CFG1_BOOTDATTMC, dattmo);
  3130. if (mode == EMMC_BOOT_RST_CMD_MODE) {
  3131. MSDC_WRITE32(SDC_ARG, 0xFFFFFFFA);
  3132. } else {
  3133. MSDC_WRITE32(SDC_ARG, 0);
  3134. }
  3135. MSDC_WRITE32(SDC_CMD, 0x02001000); /* bit[12]: 1 multiple block read, 0: single block read */
  3136. #if 0 //init timer to test MT6583 ACK/DAT timeour modification test case
  3137. MSDC_WRITE32(0x10008040,0x31);
  3138. MSDC_WRITE32(0x10008044,0x0);
  3139. test_timer1 = MSDC_READ32(0x10008048);//init timer to test MT6583 ACK/DAT timeour modification test case
  3140. #endif
  3141. MSDC_SET_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSTART);
  3142. WAIT_COND((MSDC_READ32(EMMC_STS) & EMMC_STS_BOOTUPSTATE) == EMMC_STS_BOOTUPSTATE, tmo, tmo);
  3143. if (!ackdis) {
  3144. do {
  3145. sts = MSDC_READ32(EMMC_STS);
  3146. if (sts == 0)
  3147. continue;
  3148. MSDC_WRITE32(EMMC_STS, sts); /* write 1 to clear */
  3149. /* if ack is error, hw will first set bootackrcv bit, then set bootackerr bit
  3150. * so the best way is check EMMC_STS_BOOTACKERR bit after EMMC_STS_BOOTACKRCV bit set*/
  3151. if (sts & EMMC_STS_BOOTACKERR){
  3152. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up ack error\n", __func__, host->id, sts);
  3153. err = MMC_ERR_BADCRC;
  3154. goto out;
  3155. } else if (sts & EMMC_STS_BOOTACKRCV) {
  3156. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot ack received\n", __func__,host->id, sts);
  3157. break;
  3158. } else if (sts & EMMC_STS_BOOTACKTMO) {
  3159. #if 0
  3160. test_timer2 = MSDC_READ32(0x10008048);
  3161. test_timer1 = (test_timer2 - test_timer1) /6000;
  3162. printf("[SD%d] EMMC_STS(%x): boot up ack timeout(%d ms)\n", host->id, sts,test_timer1);
  3163. //test MT6583 ACK/DAT timeour modification test case
  3164. #endif
  3165. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up ack timeout\n", __func__,host->id, sts);
  3166. err = MMC_ERR_TIMEOUT;
  3167. goto out;
  3168. } else if (sts & EMMC_STS_BOOTUPSTATE) {
  3169. //printf("[%s]: [SD%d] EMMC_STS(%x): boot up mode state\n", __func__, host->id, sts);
  3170. } else {
  3171. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up unexpected\n", __func__,host->id, sts);
  3172. }
  3173. } while (1);
  3174. }
  3175. //printf("ackdis(%d) err(%d)\n",ackdis,err);
  3176. /* check if data received */
  3177. do {
  3178. sts = MSDC_READ32(EMMC_STS);
  3179. if (sts == 0)
  3180. continue;
  3181. if (sts & EMMC_STS_BOOTDATRCV) {
  3182. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot dat received\n", __func__,host->id, sts);
  3183. break;
  3184. }
  3185. if (sts & EMMC_STS_BOOTCRCERR) {
  3186. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up data crc error\n", __func__,host->id, sts);
  3187. err = MMC_ERR_BADCRC;
  3188. goto out;
  3189. } else if (sts & EMMC_STS_BOOTDATTMO) {
  3190. #if 0
  3191. test_timer2 = MSDC_READ32(0x10008048);
  3192. test_timer1 = (test_timer2 - test_timer1) /6000;
  3193. printf("[%s]: [SD%d] EMMC_STS(%x): boot up data timeout(%d s)\n", __func__,host->id, sts,test_timer1);
  3194. //test MT6583 ACK/DAT timeour modification test case
  3195. #endif
  3196. printf("[%s]: [SD%d] EMMC_STS(0x%x): boot up data timeout\n", __func__,host->id, sts);
  3197. err = MMC_ERR_TIMEOUT;
  3198. goto out;
  3199. }
  3200. } while(1);
  3201. out:
  3202. return err;
  3203. }
  3204. void msdc_emmc_boot_stop(struct mmc_host *host)
  3205. {
  3206. u32 base = host->base;
  3207. u32 tmo = 0xFFFFFFFF;
  3208. /* Step5. stop the boot mode */
  3209. MSDC_WRITE32(SDC_ARG, 0x00000000);
  3210. MSDC_WRITE32(SDC_CMD, 0x00001000);
  3211. MSDC_SET_FIELD(EMMC_CFG0, EMMC_CFG0_BOOTWDLY, 2);
  3212. MSDC_SET_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSTOP);
  3213. WAIT_COND((MSDC_READ32(EMMC_STS) & EMMC_STS_BOOTUPSTATE) == 0, tmo, tmo);
  3214. /* Step6. */
  3215. MSDC_CLR_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSUPP);
  3216. /* Step7. clear EMMC_STS bits */
  3217. MSDC_WRITE32(EMMC_STS, MSDC_READ32(EMMC_STS));
  3218. }
  3219. int msdc_emmc_boot_read(struct mmc_host *host, u64 size, u32 *to, int read_mode)
  3220. {
  3221. int err = MMC_ERR_NONE;
  3222. int derr = MMC_ERR_NONE;
  3223. u32 sts;
  3224. u64 totalsz = size;
  3225. u32 base = host->base;
  3226. u64 left_sz, xfer_sz;
  3227. msdc_priv_t *priv = (msdc_priv_t*)host->priv;
  3228. struct dma_config *cfg = &priv->cfg;
  3229. BUG_ON((read_mode < MSDC_MODE_PIO) && (read_mode > MSDC_MODE_DMA_DESC));
  3230. if (read_mode == MSDC_MODE_PIO){
  3231. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  3232. while (size) {
  3233. sts = MSDC_READ32(EMMC_STS);
  3234. if (sts & EMMC_STS_BOOTCRCERR) {
  3235. printf("[SD%d] EMMC_STS(0x%x): boot up data crc error\n", host->id, sts);
  3236. err = MMC_ERR_BADCRC;
  3237. goto out;
  3238. } else if (sts & EMMC_STS_BOOTDATTMO) {
  3239. printf("[SD%d] EMMC_STS(0x%x): boot up data timeout error\n", host->id, sts);
  3240. err = MMC_ERR_TIMEOUT;
  3241. goto out;
  3242. }
  3243. /* Note. RXFIFO count would be aligned to 4-bytes alignment size */
  3244. if ((size >= MSDC_FIFO_THD) && (MSDC_RXFIFOCNT() >= MSDC_FIFO_THD)) {
  3245. int left = MSDC_FIFO_THD >> 2;
  3246. do {
  3247. *to++ = MSDC_FIFO_READ32();
  3248. } while (--left);
  3249. size -= MSDC_FIFO_THD;
  3250. MSG(FIO, "[SD%d] Read %d bytes, RXFIFOCNT: %d, Left: %d/%d\n",
  3251. host->id, MSDC_FIFO_THD, MSDC_RXFIFOCNT(), size, totalsz);
  3252. } else if ((size < MSDC_FIFO_THD) && MSDC_RXFIFOCNT() >= size) {
  3253. while (size) {
  3254. if (size > 3) {
  3255. *to++ = MSDC_FIFO_READ32();
  3256. size -= 4;
  3257. } else {
  3258. u32 val = MSDC_FIFO_READ32();
  3259. memcpy(to, &val, size);
  3260. size = 0;
  3261. }
  3262. }
  3263. MSG(FIO, "[SD%d] Read left bytes, RXFIFOCNT: %d, Left: %d/%d\n",
  3264. host->id, MSDC_RXFIFOCNT(), size, totalsz);
  3265. }
  3266. }
  3267. out:
  3268. if (err) {
  3269. printf("[SD%d] EMMC_BOOT: read boot code fail(%d), FIFOCNT=%d\n",
  3270. host->id, err, MSDC_RXFIFOCNT());
  3271. }
  3272. }
  3273. else {
  3274. //MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  3275. cfg->mode = read_mode;
  3276. left_sz = size;
  3277. if (read_mode == MSDC_MODE_DMA_BASIC) {
  3278. cfg->inboot = 1;
  3279. xfer_sz = left_sz > MAX_DMA_CNT ? MAX_DMA_CNT : left_sz;
  3280. //msdc_set_blknum(host, xfer_sz/512);
  3281. } else {
  3282. xfer_sz = left_sz;
  3283. }
  3284. while (left_sz) {
  3285. u32 base = host->base;
  3286. cfg->xfersz = xfer_sz;
  3287. //printf("to (0x%x) xfer_sz(0x%x)\n",to,xfer_sz);
  3288. if (cfg->mode == MSDC_MODE_DMA_BASIC) {
  3289. cfg->sglen = 1;
  3290. cfg->sg[0].addr = (u32)to;
  3291. cfg->sg[0].len = xfer_sz;
  3292. msdc_flush_membuf(to, xfer_sz);
  3293. } else {
  3294. cfg->sglen = msdc_sg_init(cfg->sg, to, xfer_sz);
  3295. cfg->flags |= DMA_FLAG_EN_CHKSUM;
  3296. }
  3297. MSDC_DMA_ON();
  3298. //printf("nblks(%d),xfer_sz(%d),left_sz(%d)\n",nblks,xfer_sz,left_sz);
  3299. msdc_dma_config(host, cfg);
  3300. if(left_sz - xfer_sz != 0)
  3301. MSDC_SET_FIELD(MSDC_DMA_CTRL, MSDC_DMA_CTRL_LASTBUF, 0);
  3302. msdc_dma_start(host);
  3303. err = derr = msdc_dma_wait_done(host, 0xFFFFFFFF);
  3304. msdc_dma_stop(host);
  3305. msdc_flush_membuf(to, xfer_sz);
  3306. if (err != MMC_ERR_NONE)
  3307. goto done;
  3308. to =(u8*)to + xfer_sz;
  3309. left_sz -= xfer_sz;
  3310. /* left_sz > 0 only when in basic dma mode */
  3311. if (left_sz) {
  3312. xfer_sz = (xfer_sz > left_sz) ? left_sz : xfer_sz;
  3313. }
  3314. }
  3315. done:
  3316. if (derr != MMC_ERR_NONE) {
  3317. printf("[SD%d] EMMC boot read error(%d)\n", host->id,derr);
  3318. msdc_abort_handler(host, 1);
  3319. }
  3320. }
  3321. return err;
  3322. }
  3323. void msdc_emmc_boot_reset(struct mmc_host *host, int reset)
  3324. {
  3325. u32 base = host->base;
  3326. u32 wints = MSDC_INT_CMDRDY | MSDC_INT_CMDTMO;
  3327. u32 l_arg, l_cmd, status;
  3328. u32 tmo=0xffffffff;
  3329. switch (reset) {
  3330. case EMMC_BOOT_PWR_RESET:
  3331. msdc_hard_reset(host);
  3332. break;
  3333. case EMMC_BOOT_RST_N_SIG:
  3334. if (msdc_cap[host->id].flags & MSDC_RST_PIN_EN) {
  3335. /* set n_reset pin to low */
  3336. MSDC_SET_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  3337. /* tRSTW (RST_n pulse width) at least 1us */
  3338. mdelay(1);
  3339. /* set n_reset pin to high, mark this line if do boot ACK & boot DAT timeout test */
  3340. MSDC_CLR_BIT32(EMMC_IOCON, EMMC_IOCON_BOOTRST);
  3341. /* tRSCA (RST_n to command time) at least 200us,
  3342. tRSTH (RST_n high period) at least 1us */
  3343. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  3344. mdelay(1);
  3345. MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_CKPDN);
  3346. }
  3347. break;
  3348. case EMMC_BOOT_PRE_IDLE_CMD:
  3349. /* bring emmc to pre-idle mode by software reset command. (MMCv4.41)*/
  3350. SDC_SEND_CMD(0x0, 0xF0F0F0F0);
  3351. /* read SDC_ARG & SDC_CMD for avoid buffered register */
  3352. l_arg = MSDC_READ32(SDC_ARG);
  3353. l_cmd = MSDC_READ32(SDC_CMD);
  3354. /* check cmd0 is send */
  3355. status = msdc_intr_wait(host, wints);
  3356. if (status & MSDC_INT_CMDTMO) {
  3357. printf("[SD%d] CMD0:ERR(CMDTO)\n", host->id);
  3358. }
  3359. mdelay(1); //need delay to make sure pre-idle
  3360. break;
  3361. }
  3362. }
  3363. #endif
  3364. #if !defined(FPGA_PLATFORM)
  3365. /* make sure the pad is msdc mode */
  3366. void msdc_set_pad_init(struct mmc_host *host)
  3367. {
  3368. switch (host->id) {
  3369. case 0:
  3370. /* msdc0 already init in preloader/LK. Therefore, the following code can be commented out. */
  3371. /*
  3372. * set pull enable. cmd/dat pull resistor to 10K for emmc 1.8v. clk set 50K.
  3373. */
  3374. MSDC_SET_FIELD(MSDC0_PULL_R0_CFG_BASE, MSDC0_PULL_R_ALL_MASK, 0x6FF);
  3375. MSDC_SET_FIELD(MSDC0_PULL_R1_CFG_BASE, MSDC0_PULL_R_ALL_MASK, 0x100);
  3376. /*
  3377. * set pull_sel cmd/dat/rst. (designer comment: when rstb switch to msdc mode, need gpio pull up to drive high)
  3378. */
  3379. MSDC_SET_FIELD(MSDC0_PULL_SEL_CFG_BASE, MSDC0_PULL_SEL_ALL_MASK, 0x100);
  3380. /*
  3381. * set msdc mode. (MC0_DAT0~4, MC0_CMD, MC0_CLK)
  3382. */
  3383. MSDC_SET_FIELD(MSDC0_SELGP_CLR, 0xFFFFFFFF, 0x3FF);
  3384. MSDC_SET_FIELD(MSDC0_SELGP_SET, 0xFFFFFFFF, 0x400);
  3385. MSDC_SET_FIELD(MSDC0_GPIO_MODE5_MWR_ADDR,
  3386. MSDC0_DAT4_PINMUX_BITS | MSDC0_DAT3_PINMUX_BITS | MSDC0_DAT2_PINMUX_BITS | MSDC0_DAT1_PINMUX_BITS |
  3387. MSDC0_DAT0_PINMUX_BITS | MSDC0_CMD_PINMUX_BITS | MSDC0_CLK_PINMUX_BITS,
  3388. 0x99999990);
  3389. /*
  3390. * set msdc mode. (MC0_RST, MC0_DAT6~7)
  3391. */
  3392. MSDC_SET_FIELD(MSDC0_GPIO_MODE6_MWR_ADDR,
  3393. MSDC0_RST_PINMUX_BITS | MSDC0_DAT7_PINMUX_BITS | MSDC0_DAT6_PINMUX_BITS | MSDC0_DAT5_PINMUX_BITS,
  3394. 0x8999);
  3395. /*
  3396. * set pull NFI11, NFI10, NFI8 disable, because electric leakage.
  3397. */
  3398. MSDC_WRITE32(MSDC0_IO_CONFIG_BASE + 0x08, 0x6800);
  3399. break;
  3400. case 1:
  3401. /*
  3402. * set pull enable.
  3403. */
  3404. MSDC_SET_FIELD(MSDC1_PULL_R0_CFG_BASE, MSDC1_PULL_R_ALL_MASK, 0x3E);
  3405. MSDC_SET_FIELD(MSDC1_PULL_R1_CFG_BASE, MSDC1_PULL_R_ALL_MASK, 0x01);
  3406. /*
  3407. * set pull_sel to pull up cmd/dat. (clk default low).
  3408. */
  3409. MSDC_SET_FIELD(MSDC1_PULL_SEL_CFG_BASE, MSDC1_PULL_SEL_ALL_MASK, 0x01);
  3410. /*
  3411. * set gpio to msdc mode. (clk/cmd/dat3/dat2 in GPIO_MODE6)
  3412. */
  3413. MSDC_SET_FIELD(MSDC1_SELGP_CLR, 0xFFFFFFFF, 0x3F);
  3414. MSDC_SET_FIELD(MSDC1_GPIO_MODE6_MWR_ADDR,
  3415. MSDC1_CLK_PINMUX_BITS | MSDC1_CMD_PINMUX_BITS |
  3416. MSDC1_DAT3_PINMUX_BITS | MSDC1_DAT2_PINMUX_BITS, 0x9999);
  3417. /*
  3418. * set gpio to msdc mode. (dat0/dat1 in GPIO_MODE7)
  3419. */
  3420. MSDC_SET_FIELD(MSDC1_GPIO_MODE7_MWR_ADDR, MSDC1_DAT0_PINMUX_BITS | MSDC1_DAT1_PINMUX_BITS, 0x99);
  3421. /*
  3422. * Set CLK pinmux after all other pinmux have been set
  3423. * set gpio to msdc mode. (clk in GPIO_MODE1)
  3424. */
  3425. MSDC_SET_FIELD(MSDC1_GPIO_MODE6_MWR_ADDR, MSDC1_CLK_PINMUX_BITS, 0x9);
  3426. break;
  3427. default:
  3428. printf("error...msdc_set_pad_init out of range!!\n");
  3429. break;
  3430. }
  3431. }
  3432. #endif
  3433. int msdc_init(int id, struct mmc_host *host, int clksrc, int mode)
  3434. {
  3435. u32 baddr[] = {MSDC0_BASE, MSDC1_BASE};//, MSDC2_BASE, MSDC3_BASE};
  3436. u32 base = baddr[id];
  3437. msdc_priv_t *priv;
  3438. struct dma_config *cfg;
  3439. printf("[%s]: msdc%d Host controller intialization start \n", __func__, id);
  3440. clksrc = (clksrc == -1) ? msdc_cap[id].clk_src : clksrc;
  3441. priv = &msdc_priv[id];
  3442. cfg = &priv->cfg;
  3443. #if MSDC_DEBUG
  3444. msdc_reg[id] = (struct msdc_regs*)base;
  3445. #endif
  3446. memset(priv, 0, sizeof(msdc_priv_t));
  3447. host->id = id;
  3448. host->base = base;
  3449. #if defined(MMC_MSDC_DRV_CTP)
  3450. #if !defined(FPGA_PLATFORM)
  3451. if (host->id == 0) {
  3452. msdc_src_clks = hclks_msdc0;
  3453. }
  3454. else {
  3455. msdc_src_clks = hclks_msdc1;
  3456. }
  3457. #endif
  3458. /* We use dynamic clock source, just set max 208Mhz */
  3459. host->f_max = msdc_src_clks[7];
  3460. #else
  3461. host->f_max = MSDC_MAX_SCLK;
  3462. #endif
  3463. host->f_min = MSDC_MIN_SCLK;
  3464. host->blkbits= MMC_BLOCK_BITS;
  3465. host->blklen = 0;
  3466. host->priv = (void*)priv;
  3467. host->caps = MMC_CAP_MULTIWRITE;
  3468. if (msdc_cap[id].flags & MSDC_HIGHSPEED)
  3469. host->caps |= (MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED);
  3470. #if defined(FEATURE_MMC_UHS1)
  3471. if (msdc_cap[id].flags & MSDC_UHS1)
  3472. host->caps |= MMC_CAP_SD_UHS1;
  3473. #endif
  3474. if (msdc_cap[id].flags & MSDC_DDR)
  3475. host->caps |= MMC_CAP_DDR;
  3476. if (msdc_cap[id].data_pins == 4)
  3477. host->caps |= MMC_CAP_4_BIT_DATA;
  3478. if (msdc_cap[id].data_pins == 8)
  3479. host->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA;
  3480. if (msdc_cap[id].flags & MSDC_HS200)
  3481. host->caps |= MMC_CAP_EMMC_HS200;
  3482. #if defined(MSDC0_EMMC50_SUPPORT)
  3483. if (msdc_cap[id].flags & MSDC_HS400)
  3484. host->caps |= MMC_CAP_EMMC_HS400;
  3485. #endif
  3486. host->ocr_avail = MMC_VDD_27_36;
  3487. /* msdc0 only support 1.8 IO */
  3488. if (host->caps & (MMC_CAP_EMMC_HS200 | MMC_CAP_EMMC_HS400))
  3489. host->ocr_avail |= MMC_VDD_165_195;
  3490. host->max_hw_segs = MAX_DMA_TRAN_SIZE/512;
  3491. host->max_phys_segs = MAX_DMA_TRAN_SIZE/512;
  3492. host->max_seg_size = MAX_DMA_TRAN_SIZE;
  3493. host->max_blk_size = 2048;
  3494. host->max_blk_count = 65535;
  3495. host->app_cmd = 0;
  3496. host->app_cmd_arg = 0;
  3497. priv->rdsmpl = msdc_cap[id].data_edge;
  3498. priv->wdsmpl = msdc_cap[id].data_edge;
  3499. priv->rsmpl = msdc_cap[id].cmd_edge;
  3500. #if defined(MSDC_ENABLE_DMA_MODE)
  3501. cfg->sg = &priv->sg[0];
  3502. cfg->burstsz = MSDC_BRUST_64B;
  3503. cfg->flags = DMA_FLAG_NONE;
  3504. cfg->mode = mode;
  3505. cfg->inboot = 0;
  3506. msdc_init_gpd_bd(host);
  3507. priv->alloc_bd = 0;
  3508. priv->alloc_gpd = 0;
  3509. priv->active_head = NULL;
  3510. priv->active_tail = NULL;
  3511. #endif
  3512. #if defined(FPGA_PLATFORM)
  3513. MSDC_WRITE32(PWR_GPIO_EO, PWR_MSDC); //setup GPIO mode (GPO or GPI)
  3514. printf("set up GPIO for MSDC\n");
  3515. #endif
  3516. // set current power level: VOL_1800 or VOL_3000
  3517. host->cur_pwr = VOL_3000;
  3518. msdc_clock(host, 1);
  3519. msdc_power(host, MMC_POWER_ON);
  3520. msdc_power(host, MMC_POWER_OFF);
  3521. msdc_power(host, MMC_POWER_ON);
  3522. /* set to SD/MMC mode */
  3523. MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC);
  3524. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  3525. MSDC_RESET();
  3526. MSDC_CLR_FIFO();
  3527. MSDC_CLR_INT();
  3528. /* reset tuning parameter */
  3529. MSDC_WRITE32(MSDC_PAD_TUNE0, 0x10008000);
  3530. MSDC_WRITE32(MSDC_DAT_RDDLY0, 0x00000000);
  3531. MSDC_WRITE32(MSDC_DAT_RDDLY1, 0x00000000);
  3532. MSDC_WRITE32(MSDC_IOCON, 0x00000000);
  3533. /* High 16 bit = 0 mean Power KPI is on, open KPI exclude MSDC_CK_SD_CKGN[designer asked]
  3534. * bit6-7 ECO switch, enable it for SLT load test */
  3535. //MSDC_WRITE32(MSDC_PATCH_BIT1, 0x100000C9);
  3536. MSDC_WRITE32(MSDC_PATCH_BIT1, 0xFFFE00C9); /* 2013-1-6 close KPI for e2 eco verify */
  3537. //MSDC_PATCH_BIT1:WRDAT_CRCS_TA_CNTR need fix to 3'001 by default,(<50MHz) (>=50MHz set 3'001 as initial value is OK for tunning)
  3538. //YD:CMD_RSP_TA_CNTR need fix to 3'001 by default(<50MHz)(>=50MHz set 3'001as initial value is OK for tunning)
  3539. /* Disable async fifo use internal delay*/
  3540. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTS);
  3541. MSDC_SET_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_CFGRESP);
  3542. /* DMA byte swap SW workaround */
  3543. //MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_INT_DAT_LATCH_CK_SEL, 3);
  3544. /* Disable support 64G */
  3545. MSDC_CLR_BIT32(MSDC_PATCH_BIT2, MSDC_PB2_SUPPORT64G);
  3546. /* enable SDIO mode. it's must otherwise sdio command failed */
  3547. MSDC_SET_BIT32(SDC_CFG, SDC_CFG_SDIO);
  3548. /* disable detect SDIO device interupt function */
  3549. MSDC_CLR_BIT32(SDC_CFG, SDC_CFG_SDIOIDE);
  3550. /* enable wake up events */
  3551. #if defined(MMC_MSDC_DRV_CTP)
  3552. MSDC_SET_BIT32(SDC_CFG, SDC_CFG_INSWKUP);
  3553. #endif
  3554. #if !defined(FPGA_PLATFORM)
  3555. /* set clk, cmd, dat pad driving */
  3556. msdc_set_driving(host, &msdc_cap[host->id], (host->cur_pwr == VOL_1800));
  3557. msdc_set_rdtdsel(host,0);
  3558. msdc_set_pad_init(host);
  3559. msdc_set_smt(host, 1);
  3560. #endif
  3561. /* disable boot function, else eMMC intialization may be failed after BROM ops. */
  3562. MSDC_CLR_BIT32(EMMC_CFG0, EMMC_CFG0_BOOTSUPP);
  3563. /* set sampling edge */
  3564. MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_RSPL, msdc_cap[host->id].cmd_edge);
  3565. //MSDC_SET_FIELD(MSDC_IOCON, MSDC_IOCON_R_D_SMPL, msdc_cap[host->id].data_edge);
  3566. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_RD_DAT_SEL, msdc_cap[host->id].data_edge);
  3567. /* write crc timeout detection */
  3568. MSDC_SET_FIELD(MSDC_PATCH_BIT0, 1 << 30, 1);
  3569. #if defined(MMC_MSDC_DRV_CTP)
  3570. #if (MSDC_USE_FORCE_FLUSH || MSDC_USE_RELIABLE_WRITE || MSDC_USE_DATA_TAG || MSDC_USE_PACKED_CMD)
  3571. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 0);
  3572. #else
  3573. MSDC_SET_FIELD(MSDC_PATCH_BIT0, MSDC_PB0_BLKNUM_SEL, 1);
  3574. #endif
  3575. #endif
  3576. #if defined(MSDC0_EMMC50_SUPPORT)
  3577. msdc_set_startbit(host, START_AT_RISING);
  3578. #endif
  3579. msdc_config_clksrc(host, clksrc);
  3580. msdc_config_bus(host, HOST_BUS_WIDTH_1);
  3581. msdc_config_clock(host, 0, MSDC_MIN_SCLK, 0);
  3582. msdc_set_dmode(host, mode);
  3583. msdc_set_pio_bits(host, 32);
  3584. /* disable sdio interrupt by default. sdio interrupt enable upon request */
  3585. msdc_intr_unmask(host, 0x0001FF7B);
  3586. msdc_irq_init(host);
  3587. msdc_set_timeout(host, 100000000, 0);
  3588. #if defined(FEATURE_MMC_CARD_DETECT)
  3589. msdc_card_detect(host, 1);
  3590. #endif
  3591. #if defined(MSDC_USE_DCM)
  3592. dcm_disable(ALL_DCM);
  3593. dcm_enable(MSDC_DCM);
  3594. #endif
  3595. if ((host->id == 0) || (host->id == 1)){
  3596. /* disable SDIO func */
  3597. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_SDIO, 0);
  3598. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_SDIOIDE, 0);
  3599. MSDC_SET_FIELD(SDC_CFG, SDC_CFG_INSWKUP, 0);
  3600. }
  3601. printf("[%s]: msdc%d Host controller intialization done\n", __func__, id);
  3602. return 0;
  3603. }
  3604. #if defined(MSDC_WITH_DEINIT)
  3605. int msdc_deinit(struct mmc_host *host)
  3606. {
  3607. u32 base = host->base;
  3608. #if defined(FEATURE_MMC_CARD_DETECT)
  3609. msdc_card_detect(host, 0);
  3610. #endif
  3611. msdc_intr_mask(host, 0x0001FFFB);
  3612. msdc_irq_deinit(host);
  3613. MSDC_RESET();
  3614. MSDC_CLR_FIFO();
  3615. MSDC_CLR_INT();
  3616. msdc_power(host, MMC_POWER_OFF);
  3617. return 0;
  3618. }
  3619. #endif
  3620. int msdc_polling_CD_interrupt(struct mmc_host *host)
  3621. {
  3622. u32 base = host->base;
  3623. u32 intsts;
  3624. intsts = MSDC_READ32(MSDC_INT);
  3625. MSDC_WRITE32(MSDC_INT, intsts);
  3626. //printf("SDIO INT(0x%x)\n",intsts);
  3627. if(intsts & MSDC_INT_CDSC)
  3628. return 1;
  3629. else
  3630. return 0;
  3631. }
  3632. void msdc_set_signal_burst(struct mmc_host *host, unsigned int on)
  3633. {
  3634. u32 base = host->base;
  3635. if (on)
  3636. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_SINGLEBURST, 1);
  3637. else
  3638. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_SINGLEBURST, 0);
  3639. }
  3640. void msdc_enable_dcm(struct mmc_host *host, unsigned int on)
  3641. {
  3642. u32 base = host->base;
  3643. /* 1 is disable DCM, 0 is enable DCM */
  3644. if (on)
  3645. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_EN, 1);
  3646. else
  3647. MSDC_SET_FIELD(MSDC_PATCH_BIT1, MSDC_PB1_DCM_EN, 0);
  3648. }