radeon_pm.c 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * drivers/video/aty/radeon_pm.c
  4. *
  5. * Copyright 2003,2004 Ben. Herrenschmidt <benh@kernel.crashing.org>
  6. * Copyright 2004 Paul Mackerras <paulus@samba.org>
  7. *
  8. * This is the power management code for ATI radeon chipsets. It contains
  9. * some dynamic clock PM enable/disable code similar to what X.org does,
  10. * some D2-state (APM-style) sleep/wakeup code for use on some PowerMacs,
  11. * and the necessary bits to re-initialize from scratch a few chips found
  12. * on PowerMacs as well. The later could be extended to more platforms
  13. * provided the memory controller configuration code be made more generic,
  14. * and you can get the proper mode register commands for your RAMs.
  15. * Those things may be found in the BIOS image...
  16. */
  17. #include "radeonfb.h"
  18. #include <linux/console.h>
  19. #include <linux/agp_backend.h>
  20. #ifdef CONFIG_PPC_PMAC
  21. #include <asm/machdep.h>
  22. #include <asm/prom.h>
  23. #include <asm/pmac_feature.h>
  24. #endif
  25. #include "ati_ids.h"
  26. /*
  27. * Workarounds for bugs in PC laptops:
  28. * - enable D2 sleep in some IBM Thinkpads
  29. * - special case for Samsung P35
  30. *
  31. * Whitelist by subsystem vendor/device because
  32. * its the subsystem vendor's fault!
  33. */
  34. #if defined(CONFIG_PM) && defined(CONFIG_X86)
  35. static void radeon_reinitialize_M10(struct radeonfb_info *rinfo);
  36. struct radeon_device_id {
  37. const char *ident; /* (arbitrary) Name */
  38. const unsigned short subsystem_vendor; /* Subsystem Vendor ID */
  39. const unsigned short subsystem_device; /* Subsystem Device ID */
  40. const enum radeon_pm_mode pm_mode_modifier; /* modify pm_mode */
  41. const reinit_function_ptr new_reinit_func; /* changed reinit_func */
  42. };
  43. #define BUGFIX(model, sv, sd, pm, fn) { \
  44. .ident = model, \
  45. .subsystem_vendor = sv, \
  46. .subsystem_device = sd, \
  47. .pm_mode_modifier = pm, \
  48. .new_reinit_func = fn \
  49. }
  50. static struct radeon_device_id radeon_workaround_list[] = {
  51. BUGFIX("IBM Thinkpad R32",
  52. PCI_VENDOR_ID_IBM, 0x1905,
  53. radeon_pm_d2, NULL),
  54. BUGFIX("IBM Thinkpad R40",
  55. PCI_VENDOR_ID_IBM, 0x0526,
  56. radeon_pm_d2, NULL),
  57. BUGFIX("IBM Thinkpad R40",
  58. PCI_VENDOR_ID_IBM, 0x0527,
  59. radeon_pm_d2, NULL),
  60. BUGFIX("IBM Thinkpad R50/R51/T40/T41",
  61. PCI_VENDOR_ID_IBM, 0x0531,
  62. radeon_pm_d2, NULL),
  63. BUGFIX("IBM Thinkpad R51/T40/T41/T42",
  64. PCI_VENDOR_ID_IBM, 0x0530,
  65. radeon_pm_d2, NULL),
  66. BUGFIX("IBM Thinkpad T30",
  67. PCI_VENDOR_ID_IBM, 0x0517,
  68. radeon_pm_d2, NULL),
  69. BUGFIX("IBM Thinkpad T40p",
  70. PCI_VENDOR_ID_IBM, 0x054d,
  71. radeon_pm_d2, NULL),
  72. BUGFIX("IBM Thinkpad T42",
  73. PCI_VENDOR_ID_IBM, 0x0550,
  74. radeon_pm_d2, NULL),
  75. BUGFIX("IBM Thinkpad X31/X32",
  76. PCI_VENDOR_ID_IBM, 0x052f,
  77. radeon_pm_d2, NULL),
  78. BUGFIX("Samsung P35",
  79. PCI_VENDOR_ID_SAMSUNG, 0xc00c,
  80. radeon_pm_off, radeon_reinitialize_M10),
  81. BUGFIX("Acer Aspire 2010",
  82. PCI_VENDOR_ID_AI, 0x0061,
  83. radeon_pm_off, radeon_reinitialize_M10),
  84. BUGFIX("Acer Travelmate 290D/292LMi",
  85. PCI_VENDOR_ID_AI, 0x005a,
  86. radeon_pm_off, radeon_reinitialize_M10),
  87. { .ident = NULL }
  88. };
  89. static int radeon_apply_workarounds(struct radeonfb_info *rinfo)
  90. {
  91. struct radeon_device_id *id;
  92. for (id = radeon_workaround_list; id->ident != NULL; id++ )
  93. if ((id->subsystem_vendor == rinfo->pdev->subsystem_vendor ) &&
  94. (id->subsystem_device == rinfo->pdev->subsystem_device )) {
  95. /* we found a device that requires workaround */
  96. printk(KERN_DEBUG "radeonfb: %s detected"
  97. ", enabling workaround\n", id->ident);
  98. rinfo->pm_mode |= id->pm_mode_modifier;
  99. if (id->new_reinit_func != NULL)
  100. rinfo->reinit_func = id->new_reinit_func;
  101. return 1;
  102. }
  103. return 0; /* not found */
  104. }
  105. #else /* defined(CONFIG_PM) && defined(CONFIG_X86) */
  106. static inline int radeon_apply_workarounds(struct radeonfb_info *rinfo)
  107. {
  108. return 0;
  109. }
  110. #endif /* defined(CONFIG_PM) && defined(CONFIG_X86) */
  111. static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo)
  112. {
  113. u32 tmp;
  114. /* RV100 */
  115. if ((rinfo->family == CHIP_FAMILY_RV100) && (!rinfo->is_mobility)) {
  116. if (rinfo->has_CRTC2) {
  117. tmp = INPLL(pllSCLK_CNTL);
  118. tmp &= ~SCLK_CNTL__DYN_STOP_LAT_MASK;
  119. tmp |= SCLK_CNTL__CP_MAX_DYN_STOP_LAT | SCLK_CNTL__FORCEON_MASK;
  120. OUTPLL(pllSCLK_CNTL, tmp);
  121. }
  122. tmp = INPLL(pllMCLK_CNTL);
  123. tmp |= (MCLK_CNTL__FORCE_MCLKA |
  124. MCLK_CNTL__FORCE_MCLKB |
  125. MCLK_CNTL__FORCE_YCLKA |
  126. MCLK_CNTL__FORCE_YCLKB |
  127. MCLK_CNTL__FORCE_AIC |
  128. MCLK_CNTL__FORCE_MC);
  129. OUTPLL(pllMCLK_CNTL, tmp);
  130. return;
  131. }
  132. /* R100 */
  133. if (!rinfo->has_CRTC2) {
  134. tmp = INPLL(pllSCLK_CNTL);
  135. tmp |= (SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_HDP |
  136. SCLK_CNTL__FORCE_DISP1 | SCLK_CNTL__FORCE_TOP |
  137. SCLK_CNTL__FORCE_E2 | SCLK_CNTL__FORCE_SE |
  138. SCLK_CNTL__FORCE_IDCT | SCLK_CNTL__FORCE_VIP |
  139. SCLK_CNTL__FORCE_RE | SCLK_CNTL__FORCE_PB |
  140. SCLK_CNTL__FORCE_TAM | SCLK_CNTL__FORCE_TDM |
  141. SCLK_CNTL__FORCE_RB);
  142. OUTPLL(pllSCLK_CNTL, tmp);
  143. return;
  144. }
  145. /* RV350 (M10/M11) */
  146. if (rinfo->family == CHIP_FAMILY_RV350) {
  147. /* for RV350/M10/M11, no delays are required. */
  148. tmp = INPLL(pllSCLK_CNTL2);
  149. tmp |= (SCLK_CNTL2__R300_FORCE_TCL |
  150. SCLK_CNTL2__R300_FORCE_GA |
  151. SCLK_CNTL2__R300_FORCE_CBA);
  152. OUTPLL(pllSCLK_CNTL2, tmp);
  153. tmp = INPLL(pllSCLK_CNTL);
  154. tmp |= (SCLK_CNTL__FORCE_DISP2 | SCLK_CNTL__FORCE_CP |
  155. SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 |
  156. SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_E2 |
  157. SCLK_CNTL__R300_FORCE_VAP | SCLK_CNTL__FORCE_IDCT |
  158. SCLK_CNTL__FORCE_VIP | SCLK_CNTL__R300_FORCE_SR |
  159. SCLK_CNTL__R300_FORCE_PX | SCLK_CNTL__R300_FORCE_TX |
  160. SCLK_CNTL__R300_FORCE_US | SCLK_CNTL__FORCE_TV_SCLK |
  161. SCLK_CNTL__R300_FORCE_SU | SCLK_CNTL__FORCE_OV0);
  162. OUTPLL(pllSCLK_CNTL, tmp);
  163. tmp = INPLL(pllSCLK_MORE_CNTL);
  164. tmp |= (SCLK_MORE_CNTL__FORCE_DISPREGS | SCLK_MORE_CNTL__FORCE_MC_GUI |
  165. SCLK_MORE_CNTL__FORCE_MC_HOST);
  166. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  167. tmp = INPLL(pllMCLK_CNTL);
  168. tmp |= (MCLK_CNTL__FORCE_MCLKA |
  169. MCLK_CNTL__FORCE_MCLKB |
  170. MCLK_CNTL__FORCE_YCLKA |
  171. MCLK_CNTL__FORCE_YCLKB |
  172. MCLK_CNTL__FORCE_MC);
  173. OUTPLL(pllMCLK_CNTL, tmp);
  174. tmp = INPLL(pllVCLK_ECP_CNTL);
  175. tmp &= ~(VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  176. VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb |
  177. VCLK_ECP_CNTL__R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
  178. OUTPLL(pllVCLK_ECP_CNTL, tmp);
  179. tmp = INPLL(pllPIXCLKS_CNTL);
  180. tmp &= ~(PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb |
  181. PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb |
  182. PIXCLKS_CNTL__DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  183. PIXCLKS_CNTL__R300_DVOCLK_ALWAYS_ONb |
  184. PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb |
  185. PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb |
  186. PIXCLKS_CNTL__R300_PIXCLK_DVO_ALWAYS_ONb |
  187. PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb |
  188. PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb |
  189. PIXCLKS_CNTL__R300_PIXCLK_TRANS_ALWAYS_ONb |
  190. PIXCLKS_CNTL__R300_PIXCLK_TVO_ALWAYS_ONb |
  191. PIXCLKS_CNTL__R300_P2G2CLK_ALWAYS_ONb |
  192. PIXCLKS_CNTL__R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
  193. OUTPLL(pllPIXCLKS_CNTL, tmp);
  194. return;
  195. }
  196. /* Default */
  197. /* Force Core Clocks */
  198. tmp = INPLL(pllSCLK_CNTL);
  199. tmp |= (SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_E2);
  200. /* XFree doesn't do that case, but we had this code from Apple and it
  201. * seem necessary for proper suspend/resume operations
  202. */
  203. if (rinfo->is_mobility) {
  204. tmp |= SCLK_CNTL__FORCE_HDP|
  205. SCLK_CNTL__FORCE_DISP1|
  206. SCLK_CNTL__FORCE_DISP2|
  207. SCLK_CNTL__FORCE_TOP|
  208. SCLK_CNTL__FORCE_SE|
  209. SCLK_CNTL__FORCE_IDCT|
  210. SCLK_CNTL__FORCE_VIP|
  211. SCLK_CNTL__FORCE_PB|
  212. SCLK_CNTL__FORCE_RE|
  213. SCLK_CNTL__FORCE_TAM|
  214. SCLK_CNTL__FORCE_TDM|
  215. SCLK_CNTL__FORCE_RB|
  216. SCLK_CNTL__FORCE_TV_SCLK|
  217. SCLK_CNTL__FORCE_SUBPIC|
  218. SCLK_CNTL__FORCE_OV0;
  219. }
  220. else if (rinfo->family == CHIP_FAMILY_R300 ||
  221. rinfo->family == CHIP_FAMILY_R350) {
  222. tmp |= SCLK_CNTL__FORCE_HDP |
  223. SCLK_CNTL__FORCE_DISP1 |
  224. SCLK_CNTL__FORCE_DISP2 |
  225. SCLK_CNTL__FORCE_TOP |
  226. SCLK_CNTL__FORCE_IDCT |
  227. SCLK_CNTL__FORCE_VIP;
  228. }
  229. OUTPLL(pllSCLK_CNTL, tmp);
  230. radeon_msleep(16);
  231. if (rinfo->family == CHIP_FAMILY_R300 || rinfo->family == CHIP_FAMILY_R350) {
  232. tmp = INPLL(pllSCLK_CNTL2);
  233. tmp |= SCLK_CNTL2__R300_FORCE_TCL |
  234. SCLK_CNTL2__R300_FORCE_GA |
  235. SCLK_CNTL2__R300_FORCE_CBA;
  236. OUTPLL(pllSCLK_CNTL2, tmp);
  237. radeon_msleep(16);
  238. }
  239. tmp = INPLL(pllCLK_PIN_CNTL);
  240. tmp &= ~CLK_PIN_CNTL__SCLK_DYN_START_CNTL;
  241. OUTPLL(pllCLK_PIN_CNTL, tmp);
  242. radeon_msleep(15);
  243. if (rinfo->is_IGP) {
  244. /* Weird ... X is _un_ forcing clocks here, I think it's
  245. * doing backward. Imitate it for now...
  246. */
  247. tmp = INPLL(pllMCLK_CNTL);
  248. tmp &= ~(MCLK_CNTL__FORCE_MCLKA |
  249. MCLK_CNTL__FORCE_YCLKA);
  250. OUTPLL(pllMCLK_CNTL, tmp);
  251. radeon_msleep(16);
  252. }
  253. /* Hrm... same shit, X doesn't do that but I have to */
  254. else if (rinfo->is_mobility) {
  255. tmp = INPLL(pllMCLK_CNTL);
  256. tmp |= (MCLK_CNTL__FORCE_MCLKA |
  257. MCLK_CNTL__FORCE_MCLKB |
  258. MCLK_CNTL__FORCE_YCLKA |
  259. MCLK_CNTL__FORCE_YCLKB);
  260. OUTPLL(pllMCLK_CNTL, tmp);
  261. radeon_msleep(16);
  262. tmp = INPLL(pllMCLK_MISC);
  263. tmp &= ~(MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT|
  264. MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT|
  265. MCLK_MISC__MC_MCLK_DYN_ENABLE|
  266. MCLK_MISC__IO_MCLK_DYN_ENABLE);
  267. OUTPLL(pllMCLK_MISC, tmp);
  268. radeon_msleep(15);
  269. }
  270. if (rinfo->is_mobility) {
  271. tmp = INPLL(pllSCLK_MORE_CNTL);
  272. tmp |= SCLK_MORE_CNTL__FORCE_DISPREGS|
  273. SCLK_MORE_CNTL__FORCE_MC_GUI|
  274. SCLK_MORE_CNTL__FORCE_MC_HOST;
  275. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  276. radeon_msleep(16);
  277. }
  278. tmp = INPLL(pllPIXCLKS_CNTL);
  279. tmp &= ~(PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb |
  280. PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb|
  281. PIXCLKS_CNTL__PIXCLK_DIG_TMDS_ALWAYS_ONb |
  282. PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb|
  283. PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb|
  284. PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb|
  285. PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb);
  286. OUTPLL(pllPIXCLKS_CNTL, tmp);
  287. radeon_msleep(16);
  288. tmp = INPLL( pllVCLK_ECP_CNTL);
  289. tmp &= ~(VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  290. VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb);
  291. OUTPLL( pllVCLK_ECP_CNTL, tmp);
  292. radeon_msleep(16);
  293. }
  294. static void radeon_pm_enable_dynamic_mode(struct radeonfb_info *rinfo)
  295. {
  296. u32 tmp;
  297. /* R100 */
  298. if (!rinfo->has_CRTC2) {
  299. tmp = INPLL(pllSCLK_CNTL);
  300. if ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13)
  301. tmp &= ~(SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_RB);
  302. tmp &= ~(SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 |
  303. SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_SE |
  304. SCLK_CNTL__FORCE_IDCT | SCLK_CNTL__FORCE_RE |
  305. SCLK_CNTL__FORCE_PB | SCLK_CNTL__FORCE_TAM |
  306. SCLK_CNTL__FORCE_TDM);
  307. OUTPLL(pllSCLK_CNTL, tmp);
  308. return;
  309. }
  310. /* M10/M11 */
  311. if (rinfo->family == CHIP_FAMILY_RV350) {
  312. tmp = INPLL(pllSCLK_CNTL2);
  313. tmp &= ~(SCLK_CNTL2__R300_FORCE_TCL |
  314. SCLK_CNTL2__R300_FORCE_GA |
  315. SCLK_CNTL2__R300_FORCE_CBA);
  316. tmp |= (SCLK_CNTL2__R300_TCL_MAX_DYN_STOP_LAT |
  317. SCLK_CNTL2__R300_GA_MAX_DYN_STOP_LAT |
  318. SCLK_CNTL2__R300_CBA_MAX_DYN_STOP_LAT);
  319. OUTPLL(pllSCLK_CNTL2, tmp);
  320. tmp = INPLL(pllSCLK_CNTL);
  321. tmp &= ~(SCLK_CNTL__FORCE_DISP2 | SCLK_CNTL__FORCE_CP |
  322. SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 |
  323. SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_E2 |
  324. SCLK_CNTL__R300_FORCE_VAP | SCLK_CNTL__FORCE_IDCT |
  325. SCLK_CNTL__FORCE_VIP | SCLK_CNTL__R300_FORCE_SR |
  326. SCLK_CNTL__R300_FORCE_PX | SCLK_CNTL__R300_FORCE_TX |
  327. SCLK_CNTL__R300_FORCE_US | SCLK_CNTL__FORCE_TV_SCLK |
  328. SCLK_CNTL__R300_FORCE_SU | SCLK_CNTL__FORCE_OV0);
  329. tmp |= SCLK_CNTL__DYN_STOP_LAT_MASK;
  330. OUTPLL(pllSCLK_CNTL, tmp);
  331. tmp = INPLL(pllSCLK_MORE_CNTL);
  332. tmp &= ~SCLK_MORE_CNTL__FORCEON;
  333. tmp |= SCLK_MORE_CNTL__DISPREGS_MAX_DYN_STOP_LAT |
  334. SCLK_MORE_CNTL__MC_GUI_MAX_DYN_STOP_LAT |
  335. SCLK_MORE_CNTL__MC_HOST_MAX_DYN_STOP_LAT;
  336. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  337. tmp = INPLL(pllVCLK_ECP_CNTL);
  338. tmp |= (VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  339. VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb);
  340. OUTPLL(pllVCLK_ECP_CNTL, tmp);
  341. tmp = INPLL(pllPIXCLKS_CNTL);
  342. tmp |= (PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb |
  343. PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb |
  344. PIXCLKS_CNTL__DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  345. PIXCLKS_CNTL__R300_DVOCLK_ALWAYS_ONb |
  346. PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb |
  347. PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb |
  348. PIXCLKS_CNTL__R300_PIXCLK_DVO_ALWAYS_ONb |
  349. PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb |
  350. PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb |
  351. PIXCLKS_CNTL__R300_PIXCLK_TRANS_ALWAYS_ONb |
  352. PIXCLKS_CNTL__R300_PIXCLK_TVO_ALWAYS_ONb |
  353. PIXCLKS_CNTL__R300_P2G2CLK_ALWAYS_ONb |
  354. PIXCLKS_CNTL__R300_P2G2CLK_DAC_ALWAYS_ONb);
  355. OUTPLL(pllPIXCLKS_CNTL, tmp);
  356. tmp = INPLL(pllMCLK_MISC);
  357. tmp |= (MCLK_MISC__MC_MCLK_DYN_ENABLE |
  358. MCLK_MISC__IO_MCLK_DYN_ENABLE);
  359. OUTPLL(pllMCLK_MISC, tmp);
  360. tmp = INPLL(pllMCLK_CNTL);
  361. tmp |= (MCLK_CNTL__FORCE_MCLKA | MCLK_CNTL__FORCE_MCLKB);
  362. tmp &= ~(MCLK_CNTL__FORCE_YCLKA |
  363. MCLK_CNTL__FORCE_YCLKB |
  364. MCLK_CNTL__FORCE_MC);
  365. /* Some releases of vbios have set DISABLE_MC_MCLKA
  366. * and DISABLE_MC_MCLKB bits in the vbios table. Setting these
  367. * bits will cause H/W hang when reading video memory with dynamic
  368. * clocking enabled.
  369. */
  370. if ((tmp & MCLK_CNTL__R300_DISABLE_MC_MCLKA) &&
  371. (tmp & MCLK_CNTL__R300_DISABLE_MC_MCLKB)) {
  372. /* If both bits are set, then check the active channels */
  373. tmp = INPLL(pllMCLK_CNTL);
  374. if (rinfo->vram_width == 64) {
  375. if (INREG(MEM_CNTL) & R300_MEM_USE_CD_CH_ONLY)
  376. tmp &= ~MCLK_CNTL__R300_DISABLE_MC_MCLKB;
  377. else
  378. tmp &= ~MCLK_CNTL__R300_DISABLE_MC_MCLKA;
  379. } else {
  380. tmp &= ~(MCLK_CNTL__R300_DISABLE_MC_MCLKA |
  381. MCLK_CNTL__R300_DISABLE_MC_MCLKB);
  382. }
  383. }
  384. OUTPLL(pllMCLK_CNTL, tmp);
  385. return;
  386. }
  387. /* R300 */
  388. if (rinfo->family == CHIP_FAMILY_R300 || rinfo->family == CHIP_FAMILY_R350) {
  389. tmp = INPLL(pllSCLK_CNTL);
  390. tmp &= ~(SCLK_CNTL__R300_FORCE_VAP);
  391. tmp |= SCLK_CNTL__FORCE_CP;
  392. OUTPLL(pllSCLK_CNTL, tmp);
  393. radeon_msleep(15);
  394. tmp = INPLL(pllSCLK_CNTL2);
  395. tmp &= ~(SCLK_CNTL2__R300_FORCE_TCL |
  396. SCLK_CNTL2__R300_FORCE_GA |
  397. SCLK_CNTL2__R300_FORCE_CBA);
  398. OUTPLL(pllSCLK_CNTL2, tmp);
  399. }
  400. /* Others */
  401. tmp = INPLL( pllCLK_PWRMGT_CNTL);
  402. tmp &= ~(CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK|
  403. CLK_PWRMGT_CNTL__DISP_DYN_STOP_LAT_MASK|
  404. CLK_PWRMGT_CNTL__DYN_STOP_MODE_MASK);
  405. tmp |= CLK_PWRMGT_CNTL__ENGINE_DYNCLK_MODE_MASK |
  406. (0x01 << CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT__SHIFT);
  407. OUTPLL( pllCLK_PWRMGT_CNTL, tmp);
  408. radeon_msleep(15);
  409. tmp = INPLL(pllCLK_PIN_CNTL);
  410. tmp |= CLK_PIN_CNTL__SCLK_DYN_START_CNTL;
  411. OUTPLL(pllCLK_PIN_CNTL, tmp);
  412. radeon_msleep(15);
  413. /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
  414. * to lockup randomly, leave them as set by BIOS.
  415. */
  416. tmp = INPLL(pllSCLK_CNTL);
  417. tmp &= ~SCLK_CNTL__FORCEON_MASK;
  418. /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/
  419. if ((rinfo->family == CHIP_FAMILY_RV250 &&
  420. ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) ||
  421. ((rinfo->family == CHIP_FAMILY_RV100) &&
  422. ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) {
  423. tmp |= SCLK_CNTL__FORCE_CP;
  424. tmp |= SCLK_CNTL__FORCE_VIP;
  425. }
  426. OUTPLL(pllSCLK_CNTL, tmp);
  427. radeon_msleep(15);
  428. if ((rinfo->family == CHIP_FAMILY_RV200) ||
  429. (rinfo->family == CHIP_FAMILY_RV250) ||
  430. (rinfo->family == CHIP_FAMILY_RV280)) {
  431. tmp = INPLL(pllSCLK_MORE_CNTL);
  432. tmp &= ~SCLK_MORE_CNTL__FORCEON;
  433. /* RV200::A11 A12 RV250::A11 A12 */
  434. if (((rinfo->family == CHIP_FAMILY_RV200) ||
  435. (rinfo->family == CHIP_FAMILY_RV250)) &&
  436. ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13))
  437. tmp |= SCLK_MORE_CNTL__FORCEON;
  438. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  439. radeon_msleep(15);
  440. }
  441. /* RV200::A11 A12, RV250::A11 A12 */
  442. if (((rinfo->family == CHIP_FAMILY_RV200) ||
  443. (rinfo->family == CHIP_FAMILY_RV250)) &&
  444. ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) {
  445. tmp = INPLL(pllPLL_PWRMGT_CNTL);
  446. tmp |= PLL_PWRMGT_CNTL__TCL_BYPASS_DISABLE;
  447. OUTPLL(pllPLL_PWRMGT_CNTL, tmp);
  448. radeon_msleep(15);
  449. }
  450. tmp = INPLL(pllPIXCLKS_CNTL);
  451. tmp |= PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb |
  452. PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb|
  453. PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb|
  454. PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb|
  455. PIXCLKS_CNTL__PIXCLK_DIG_TMDS_ALWAYS_ONb|
  456. PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb|
  457. PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb;
  458. OUTPLL(pllPIXCLKS_CNTL, tmp);
  459. radeon_msleep(15);
  460. tmp = INPLL(pllVCLK_ECP_CNTL);
  461. tmp |= VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  462. VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb;
  463. OUTPLL(pllVCLK_ECP_CNTL, tmp);
  464. /* X doesn't do that ... hrm, we do on mobility && Macs */
  465. #ifdef CONFIG_PPC
  466. if (rinfo->is_mobility) {
  467. tmp = INPLL(pllMCLK_CNTL);
  468. tmp &= ~(MCLK_CNTL__FORCE_MCLKA |
  469. MCLK_CNTL__FORCE_MCLKB |
  470. MCLK_CNTL__FORCE_YCLKA |
  471. MCLK_CNTL__FORCE_YCLKB);
  472. OUTPLL(pllMCLK_CNTL, tmp);
  473. radeon_msleep(15);
  474. tmp = INPLL(pllMCLK_MISC);
  475. tmp |= MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT|
  476. MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT|
  477. MCLK_MISC__MC_MCLK_DYN_ENABLE|
  478. MCLK_MISC__IO_MCLK_DYN_ENABLE;
  479. OUTPLL(pllMCLK_MISC, tmp);
  480. radeon_msleep(15);
  481. }
  482. #endif /* CONFIG_PPC */
  483. }
  484. #ifdef CONFIG_PM
  485. static void OUTMC( struct radeonfb_info *rinfo, u8 indx, u32 value)
  486. {
  487. OUTREG( MC_IND_INDEX, indx | MC_IND_INDEX__MC_IND_WR_EN);
  488. OUTREG( MC_IND_DATA, value);
  489. }
  490. static u32 INMC(struct radeonfb_info *rinfo, u8 indx)
  491. {
  492. OUTREG( MC_IND_INDEX, indx);
  493. return INREG( MC_IND_DATA);
  494. }
  495. static void radeon_pm_save_regs(struct radeonfb_info *rinfo, int saving_for_d3)
  496. {
  497. rinfo->save_regs[0] = INPLL(PLL_PWRMGT_CNTL);
  498. rinfo->save_regs[1] = INPLL(CLK_PWRMGT_CNTL);
  499. rinfo->save_regs[2] = INPLL(MCLK_CNTL);
  500. rinfo->save_regs[3] = INPLL(SCLK_CNTL);
  501. rinfo->save_regs[4] = INPLL(CLK_PIN_CNTL);
  502. rinfo->save_regs[5] = INPLL(VCLK_ECP_CNTL);
  503. rinfo->save_regs[6] = INPLL(PIXCLKS_CNTL);
  504. rinfo->save_regs[7] = INPLL(MCLK_MISC);
  505. rinfo->save_regs[8] = INPLL(P2PLL_CNTL);
  506. rinfo->save_regs[9] = INREG(DISP_MISC_CNTL);
  507. rinfo->save_regs[10] = INREG(DISP_PWR_MAN);
  508. rinfo->save_regs[11] = INREG(LVDS_GEN_CNTL);
  509. rinfo->save_regs[13] = INREG(TV_DAC_CNTL);
  510. rinfo->save_regs[14] = INREG(BUS_CNTL1);
  511. rinfo->save_regs[15] = INREG(CRTC_OFFSET_CNTL);
  512. rinfo->save_regs[16] = INREG(AGP_CNTL);
  513. rinfo->save_regs[17] = (INREG(CRTC_GEN_CNTL) & 0xfdffffff) | 0x04000000;
  514. rinfo->save_regs[18] = (INREG(CRTC2_GEN_CNTL) & 0xfdffffff) | 0x04000000;
  515. rinfo->save_regs[19] = INREG(GPIOPAD_A);
  516. rinfo->save_regs[20] = INREG(GPIOPAD_EN);
  517. rinfo->save_regs[21] = INREG(GPIOPAD_MASK);
  518. rinfo->save_regs[22] = INREG(ZV_LCDPAD_A);
  519. rinfo->save_regs[23] = INREG(ZV_LCDPAD_EN);
  520. rinfo->save_regs[24] = INREG(ZV_LCDPAD_MASK);
  521. rinfo->save_regs[25] = INREG(GPIO_VGA_DDC);
  522. rinfo->save_regs[26] = INREG(GPIO_DVI_DDC);
  523. rinfo->save_regs[27] = INREG(GPIO_MONID);
  524. rinfo->save_regs[28] = INREG(GPIO_CRT2_DDC);
  525. rinfo->save_regs[29] = INREG(SURFACE_CNTL);
  526. rinfo->save_regs[30] = INREG(MC_FB_LOCATION);
  527. rinfo->save_regs[31] = INREG(DISPLAY_BASE_ADDR);
  528. rinfo->save_regs[32] = INREG(MC_AGP_LOCATION);
  529. rinfo->save_regs[33] = INREG(CRTC2_DISPLAY_BASE_ADDR);
  530. rinfo->save_regs[34] = INPLL(SCLK_MORE_CNTL);
  531. rinfo->save_regs[35] = INREG(MEM_SDRAM_MODE_REG);
  532. rinfo->save_regs[36] = INREG(BUS_CNTL);
  533. rinfo->save_regs[39] = INREG(RBBM_CNTL);
  534. rinfo->save_regs[40] = INREG(DAC_CNTL);
  535. rinfo->save_regs[41] = INREG(HOST_PATH_CNTL);
  536. rinfo->save_regs[37] = INREG(MPP_TB_CONFIG);
  537. rinfo->save_regs[38] = INREG(FCP_CNTL);
  538. if (rinfo->is_mobility) {
  539. rinfo->save_regs[12] = INREG(LVDS_PLL_CNTL);
  540. rinfo->save_regs[43] = INPLL(pllSSPLL_CNTL);
  541. rinfo->save_regs[44] = INPLL(pllSSPLL_REF_DIV);
  542. rinfo->save_regs[45] = INPLL(pllSSPLL_DIV_0);
  543. rinfo->save_regs[90] = INPLL(pllSS_INT_CNTL);
  544. rinfo->save_regs[91] = INPLL(pllSS_TST_CNTL);
  545. rinfo->save_regs[81] = INREG(LVDS_GEN_CNTL);
  546. }
  547. if (rinfo->family >= CHIP_FAMILY_RV200) {
  548. rinfo->save_regs[42] = INREG(MEM_REFRESH_CNTL);
  549. rinfo->save_regs[46] = INREG(MC_CNTL);
  550. rinfo->save_regs[47] = INREG(MC_INIT_GFX_LAT_TIMER);
  551. rinfo->save_regs[48] = INREG(MC_INIT_MISC_LAT_TIMER);
  552. rinfo->save_regs[49] = INREG(MC_TIMING_CNTL);
  553. rinfo->save_regs[50] = INREG(MC_READ_CNTL_AB);
  554. rinfo->save_regs[51] = INREG(MC_IOPAD_CNTL);
  555. rinfo->save_regs[52] = INREG(MC_CHIP_IO_OE_CNTL_AB);
  556. rinfo->save_regs[53] = INREG(MC_DEBUG);
  557. }
  558. rinfo->save_regs[54] = INREG(PAMAC0_DLY_CNTL);
  559. rinfo->save_regs[55] = INREG(PAMAC1_DLY_CNTL);
  560. rinfo->save_regs[56] = INREG(PAD_CTLR_MISC);
  561. rinfo->save_regs[57] = INREG(FW_CNTL);
  562. if (rinfo->family >= CHIP_FAMILY_R300) {
  563. rinfo->save_regs[58] = INMC(rinfo, ixR300_MC_MC_INIT_WR_LAT_TIMER);
  564. rinfo->save_regs[59] = INMC(rinfo, ixR300_MC_IMP_CNTL);
  565. rinfo->save_regs[60] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_C0);
  566. rinfo->save_regs[61] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_C1);
  567. rinfo->save_regs[62] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_D0);
  568. rinfo->save_regs[63] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_D1);
  569. rinfo->save_regs[64] = INMC(rinfo, ixR300_MC_BIST_CNTL_3);
  570. rinfo->save_regs[65] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_A0);
  571. rinfo->save_regs[66] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_A1);
  572. rinfo->save_regs[67] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_B0);
  573. rinfo->save_regs[68] = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_B1);
  574. rinfo->save_regs[69] = INMC(rinfo, ixR300_MC_DEBUG_CNTL);
  575. rinfo->save_regs[70] = INMC(rinfo, ixR300_MC_DLL_CNTL);
  576. rinfo->save_regs[71] = INMC(rinfo, ixR300_MC_IMP_CNTL_0);
  577. rinfo->save_regs[72] = INMC(rinfo, ixR300_MC_ELPIDA_CNTL);
  578. rinfo->save_regs[96] = INMC(rinfo, ixR300_MC_READ_CNTL_CD);
  579. } else {
  580. rinfo->save_regs[59] = INMC(rinfo, ixMC_IMP_CNTL);
  581. rinfo->save_regs[65] = INMC(rinfo, ixMC_CHP_IO_CNTL_A0);
  582. rinfo->save_regs[66] = INMC(rinfo, ixMC_CHP_IO_CNTL_A1);
  583. rinfo->save_regs[67] = INMC(rinfo, ixMC_CHP_IO_CNTL_B0);
  584. rinfo->save_regs[68] = INMC(rinfo, ixMC_CHP_IO_CNTL_B1);
  585. rinfo->save_regs[71] = INMC(rinfo, ixMC_IMP_CNTL_0);
  586. }
  587. rinfo->save_regs[73] = INPLL(pllMPLL_CNTL);
  588. rinfo->save_regs[74] = INPLL(pllSPLL_CNTL);
  589. rinfo->save_regs[75] = INPLL(pllMPLL_AUX_CNTL);
  590. rinfo->save_regs[76] = INPLL(pllSPLL_AUX_CNTL);
  591. rinfo->save_regs[77] = INPLL(pllM_SPLL_REF_FB_DIV);
  592. rinfo->save_regs[78] = INPLL(pllAGP_PLL_CNTL);
  593. rinfo->save_regs[79] = INREG(PAMAC2_DLY_CNTL);
  594. rinfo->save_regs[80] = INREG(OV0_BASE_ADDR);
  595. rinfo->save_regs[82] = INREG(FP_GEN_CNTL);
  596. rinfo->save_regs[83] = INREG(FP2_GEN_CNTL);
  597. rinfo->save_regs[84] = INREG(TMDS_CNTL);
  598. rinfo->save_regs[85] = INREG(TMDS_TRANSMITTER_CNTL);
  599. rinfo->save_regs[86] = INREG(DISP_OUTPUT_CNTL);
  600. rinfo->save_regs[87] = INREG(DISP_HW_DEBUG);
  601. rinfo->save_regs[88] = INREG(TV_MASTER_CNTL);
  602. rinfo->save_regs[89] = INPLL(pllP2PLL_REF_DIV);
  603. rinfo->save_regs[92] = INPLL(pllPPLL_DIV_0);
  604. rinfo->save_regs[93] = INPLL(pllPPLL_CNTL);
  605. rinfo->save_regs[94] = INREG(GRPH_BUFFER_CNTL);
  606. rinfo->save_regs[95] = INREG(GRPH2_BUFFER_CNTL);
  607. rinfo->save_regs[96] = INREG(HDP_DEBUG);
  608. rinfo->save_regs[97] = INPLL(pllMDLL_CKO);
  609. rinfo->save_regs[98] = INPLL(pllMDLL_RDCKA);
  610. rinfo->save_regs[99] = INPLL(pllMDLL_RDCKB);
  611. }
  612. static void radeon_pm_restore_regs(struct radeonfb_info *rinfo)
  613. {
  614. OUTPLL(P2PLL_CNTL, rinfo->save_regs[8] & 0xFFFFFFFE); /* First */
  615. OUTPLL(PLL_PWRMGT_CNTL, rinfo->save_regs[0]);
  616. OUTPLL(CLK_PWRMGT_CNTL, rinfo->save_regs[1]);
  617. OUTPLL(MCLK_CNTL, rinfo->save_regs[2]);
  618. OUTPLL(SCLK_CNTL, rinfo->save_regs[3]);
  619. OUTPLL(CLK_PIN_CNTL, rinfo->save_regs[4]);
  620. OUTPLL(VCLK_ECP_CNTL, rinfo->save_regs[5]);
  621. OUTPLL(PIXCLKS_CNTL, rinfo->save_regs[6]);
  622. OUTPLL(MCLK_MISC, rinfo->save_regs[7]);
  623. if (rinfo->family == CHIP_FAMILY_RV350)
  624. OUTPLL(SCLK_MORE_CNTL, rinfo->save_regs[34]);
  625. OUTREG(SURFACE_CNTL, rinfo->save_regs[29]);
  626. OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
  627. OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
  628. OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
  629. OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
  630. OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
  631. OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
  632. OUTREG(DISP_PWR_MAN, rinfo->save_regs[10]);
  633. OUTREG(LVDS_GEN_CNTL, rinfo->save_regs[11]);
  634. OUTREG(LVDS_PLL_CNTL,rinfo->save_regs[12]);
  635. OUTREG(TV_DAC_CNTL, rinfo->save_regs[13]);
  636. OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
  637. OUTREG(CRTC_OFFSET_CNTL, rinfo->save_regs[15]);
  638. OUTREG(AGP_CNTL, rinfo->save_regs[16]);
  639. OUTREG(CRTC_GEN_CNTL, rinfo->save_regs[17]);
  640. OUTREG(CRTC2_GEN_CNTL, rinfo->save_regs[18]);
  641. OUTPLL(P2PLL_CNTL, rinfo->save_regs[8]);
  642. OUTREG(GPIOPAD_A, rinfo->save_regs[19]);
  643. OUTREG(GPIOPAD_EN, rinfo->save_regs[20]);
  644. OUTREG(GPIOPAD_MASK, rinfo->save_regs[21]);
  645. OUTREG(ZV_LCDPAD_A, rinfo->save_regs[22]);
  646. OUTREG(ZV_LCDPAD_EN, rinfo->save_regs[23]);
  647. OUTREG(ZV_LCDPAD_MASK, rinfo->save_regs[24]);
  648. OUTREG(GPIO_VGA_DDC, rinfo->save_regs[25]);
  649. OUTREG(GPIO_DVI_DDC, rinfo->save_regs[26]);
  650. OUTREG(GPIO_MONID, rinfo->save_regs[27]);
  651. OUTREG(GPIO_CRT2_DDC, rinfo->save_regs[28]);
  652. }
  653. static void radeon_pm_disable_iopad(struct radeonfb_info *rinfo)
  654. {
  655. OUTREG(GPIOPAD_MASK, 0x0001ffff);
  656. OUTREG(GPIOPAD_EN, 0x00000400);
  657. OUTREG(GPIOPAD_A, 0x00000000);
  658. OUTREG(ZV_LCDPAD_MASK, 0x00000000);
  659. OUTREG(ZV_LCDPAD_EN, 0x00000000);
  660. OUTREG(ZV_LCDPAD_A, 0x00000000);
  661. OUTREG(GPIO_VGA_DDC, 0x00030000);
  662. OUTREG(GPIO_DVI_DDC, 0x00000000);
  663. OUTREG(GPIO_MONID, 0x00030000);
  664. OUTREG(GPIO_CRT2_DDC, 0x00000000);
  665. }
  666. static void radeon_pm_program_v2clk(struct radeonfb_info *rinfo)
  667. {
  668. /* Set v2clk to 65MHz */
  669. if (rinfo->family <= CHIP_FAMILY_RV280) {
  670. OUTPLL(pllPIXCLKS_CNTL,
  671. __INPLL(rinfo, pllPIXCLKS_CNTL)
  672. & ~PIXCLKS_CNTL__PIX2CLK_SRC_SEL_MASK);
  673. OUTPLL(pllP2PLL_REF_DIV, 0x0000000c);
  674. OUTPLL(pllP2PLL_CNTL, 0x0000bf00);
  675. } else {
  676. OUTPLL(pllP2PLL_REF_DIV, 0x0000000c);
  677. INPLL(pllP2PLL_REF_DIV);
  678. OUTPLL(pllP2PLL_CNTL, 0x0000a700);
  679. }
  680. OUTPLL(pllP2PLL_DIV_0, 0x00020074 | P2PLL_DIV_0__P2PLL_ATOMIC_UPDATE_W);
  681. OUTPLL(pllP2PLL_CNTL, INPLL(pllP2PLL_CNTL) & ~P2PLL_CNTL__P2PLL_SLEEP);
  682. mdelay(1);
  683. OUTPLL(pllP2PLL_CNTL, INPLL(pllP2PLL_CNTL) & ~P2PLL_CNTL__P2PLL_RESET);
  684. mdelay( 1);
  685. OUTPLL(pllPIXCLKS_CNTL,
  686. (INPLL(pllPIXCLKS_CNTL) & ~PIXCLKS_CNTL__PIX2CLK_SRC_SEL_MASK)
  687. | (0x03 << PIXCLKS_CNTL__PIX2CLK_SRC_SEL__SHIFT));
  688. mdelay( 1);
  689. }
  690. static void radeon_pm_low_current(struct radeonfb_info *rinfo)
  691. {
  692. u32 reg;
  693. reg = INREG(BUS_CNTL1);
  694. if (rinfo->family <= CHIP_FAMILY_RV280) {
  695. reg &= ~BUS_CNTL1_MOBILE_PLATFORM_SEL_MASK;
  696. reg |= BUS_CNTL1_AGPCLK_VALID | (1<<BUS_CNTL1_MOBILE_PLATFORM_SEL_SHIFT);
  697. } else {
  698. reg |= 0x4080;
  699. }
  700. OUTREG(BUS_CNTL1, reg);
  701. reg = INPLL(PLL_PWRMGT_CNTL);
  702. reg |= PLL_PWRMGT_CNTL_SPLL_TURNOFF | PLL_PWRMGT_CNTL_PPLL_TURNOFF |
  703. PLL_PWRMGT_CNTL_P2PLL_TURNOFF | PLL_PWRMGT_CNTL_TVPLL_TURNOFF;
  704. reg &= ~PLL_PWRMGT_CNTL_SU_MCLK_USE_BCLK;
  705. reg &= ~PLL_PWRMGT_CNTL_MOBILE_SU;
  706. OUTPLL(PLL_PWRMGT_CNTL, reg);
  707. reg = INREG(TV_DAC_CNTL);
  708. reg &= ~(TV_DAC_CNTL_BGADJ_MASK |TV_DAC_CNTL_DACADJ_MASK);
  709. reg |=TV_DAC_CNTL_BGSLEEP | TV_DAC_CNTL_RDACPD | TV_DAC_CNTL_GDACPD |
  710. TV_DAC_CNTL_BDACPD |
  711. (8<<TV_DAC_CNTL_BGADJ__SHIFT) | (8<<TV_DAC_CNTL_DACADJ__SHIFT);
  712. OUTREG(TV_DAC_CNTL, reg);
  713. reg = INREG(TMDS_TRANSMITTER_CNTL);
  714. reg &= ~(TMDS_PLL_EN | TMDS_PLLRST);
  715. OUTREG(TMDS_TRANSMITTER_CNTL, reg);
  716. reg = INREG(DAC_CNTL);
  717. reg &= ~DAC_CMP_EN;
  718. OUTREG(DAC_CNTL, reg);
  719. reg = INREG(DAC_CNTL2);
  720. reg &= ~DAC2_CMP_EN;
  721. OUTREG(DAC_CNTL2, reg);
  722. reg = INREG(TV_DAC_CNTL);
  723. reg &= ~TV_DAC_CNTL_DETECT;
  724. OUTREG(TV_DAC_CNTL, reg);
  725. }
  726. static void radeon_pm_setup_for_suspend(struct radeonfb_info *rinfo)
  727. {
  728. u32 sclk_cntl, mclk_cntl, sclk_more_cntl;
  729. u32 pll_pwrmgt_cntl;
  730. u32 clk_pwrmgt_cntl;
  731. u32 clk_pin_cntl;
  732. u32 vclk_ecp_cntl;
  733. u32 pixclks_cntl;
  734. u32 disp_mis_cntl;
  735. u32 disp_pwr_man;
  736. u32 tmp;
  737. /* Force Core Clocks */
  738. sclk_cntl = INPLL( pllSCLK_CNTL);
  739. sclk_cntl |= SCLK_CNTL__IDCT_MAX_DYN_STOP_LAT|
  740. SCLK_CNTL__VIP_MAX_DYN_STOP_LAT|
  741. SCLK_CNTL__RE_MAX_DYN_STOP_LAT|
  742. SCLK_CNTL__PB_MAX_DYN_STOP_LAT|
  743. SCLK_CNTL__TAM_MAX_DYN_STOP_LAT|
  744. SCLK_CNTL__TDM_MAX_DYN_STOP_LAT|
  745. SCLK_CNTL__RB_MAX_DYN_STOP_LAT|
  746. SCLK_CNTL__FORCE_DISP2|
  747. SCLK_CNTL__FORCE_CP|
  748. SCLK_CNTL__FORCE_HDP|
  749. SCLK_CNTL__FORCE_DISP1|
  750. SCLK_CNTL__FORCE_TOP|
  751. SCLK_CNTL__FORCE_E2|
  752. SCLK_CNTL__FORCE_SE|
  753. SCLK_CNTL__FORCE_IDCT|
  754. SCLK_CNTL__FORCE_VIP|
  755. SCLK_CNTL__FORCE_PB|
  756. SCLK_CNTL__FORCE_TAM|
  757. SCLK_CNTL__FORCE_TDM|
  758. SCLK_CNTL__FORCE_RB|
  759. SCLK_CNTL__FORCE_TV_SCLK|
  760. SCLK_CNTL__FORCE_SUBPIC|
  761. SCLK_CNTL__FORCE_OV0;
  762. if (rinfo->family <= CHIP_FAMILY_RV280)
  763. sclk_cntl |= SCLK_CNTL__FORCE_RE;
  764. else
  765. sclk_cntl |= SCLK_CNTL__SE_MAX_DYN_STOP_LAT |
  766. SCLK_CNTL__E2_MAX_DYN_STOP_LAT |
  767. SCLK_CNTL__TV_MAX_DYN_STOP_LAT |
  768. SCLK_CNTL__HDP_MAX_DYN_STOP_LAT |
  769. SCLK_CNTL__CP_MAX_DYN_STOP_LAT;
  770. OUTPLL( pllSCLK_CNTL, sclk_cntl);
  771. sclk_more_cntl = INPLL(pllSCLK_MORE_CNTL);
  772. sclk_more_cntl |= SCLK_MORE_CNTL__FORCE_DISPREGS |
  773. SCLK_MORE_CNTL__FORCE_MC_GUI |
  774. SCLK_MORE_CNTL__FORCE_MC_HOST;
  775. OUTPLL(pllSCLK_MORE_CNTL, sclk_more_cntl);
  776. mclk_cntl = INPLL( pllMCLK_CNTL);
  777. mclk_cntl &= ~( MCLK_CNTL__FORCE_MCLKA |
  778. MCLK_CNTL__FORCE_MCLKB |
  779. MCLK_CNTL__FORCE_YCLKA |
  780. MCLK_CNTL__FORCE_YCLKB |
  781. MCLK_CNTL__FORCE_MC
  782. );
  783. OUTPLL( pllMCLK_CNTL, mclk_cntl);
  784. /* Force Display clocks */
  785. vclk_ecp_cntl = INPLL( pllVCLK_ECP_CNTL);
  786. vclk_ecp_cntl &= ~(VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb
  787. | VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb);
  788. vclk_ecp_cntl |= VCLK_ECP_CNTL__ECP_FORCE_ON;
  789. OUTPLL( pllVCLK_ECP_CNTL, vclk_ecp_cntl);
  790. pixclks_cntl = INPLL( pllPIXCLKS_CNTL);
  791. pixclks_cntl &= ~( PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb |
  792. PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb|
  793. PIXCLKS_CNTL__PIXCLK_DIG_TMDS_ALWAYS_ONb |
  794. PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb|
  795. PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb|
  796. PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb|
  797. PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb);
  798. OUTPLL( pllPIXCLKS_CNTL, pixclks_cntl);
  799. /* Switch off LVDS interface */
  800. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) &
  801. ~(LVDS_BLON | LVDS_EN | LVDS_ON | LVDS_DIGON));
  802. /* Enable System power management */
  803. pll_pwrmgt_cntl = INPLL( pllPLL_PWRMGT_CNTL);
  804. pll_pwrmgt_cntl |= PLL_PWRMGT_CNTL__SPLL_TURNOFF |
  805. PLL_PWRMGT_CNTL__MPLL_TURNOFF|
  806. PLL_PWRMGT_CNTL__PPLL_TURNOFF|
  807. PLL_PWRMGT_CNTL__P2PLL_TURNOFF|
  808. PLL_PWRMGT_CNTL__TVPLL_TURNOFF;
  809. OUTPLL( pllPLL_PWRMGT_CNTL, pll_pwrmgt_cntl);
  810. clk_pwrmgt_cntl = INPLL( pllCLK_PWRMGT_CNTL);
  811. clk_pwrmgt_cntl &= ~( CLK_PWRMGT_CNTL__MPLL_PWRMGT_OFF|
  812. CLK_PWRMGT_CNTL__SPLL_PWRMGT_OFF|
  813. CLK_PWRMGT_CNTL__PPLL_PWRMGT_OFF|
  814. CLK_PWRMGT_CNTL__P2PLL_PWRMGT_OFF|
  815. CLK_PWRMGT_CNTL__MCLK_TURNOFF|
  816. CLK_PWRMGT_CNTL__SCLK_TURNOFF|
  817. CLK_PWRMGT_CNTL__PCLK_TURNOFF|
  818. CLK_PWRMGT_CNTL__P2CLK_TURNOFF|
  819. CLK_PWRMGT_CNTL__TVPLL_PWRMGT_OFF|
  820. CLK_PWRMGT_CNTL__GLOBAL_PMAN_EN|
  821. CLK_PWRMGT_CNTL__ENGINE_DYNCLK_MODE|
  822. CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK|
  823. CLK_PWRMGT_CNTL__CG_NO1_DEBUG_MASK
  824. );
  825. clk_pwrmgt_cntl |= CLK_PWRMGT_CNTL__GLOBAL_PMAN_EN
  826. | CLK_PWRMGT_CNTL__DISP_PM;
  827. OUTPLL( pllCLK_PWRMGT_CNTL, clk_pwrmgt_cntl);
  828. clk_pin_cntl = INPLL( pllCLK_PIN_CNTL);
  829. clk_pin_cntl &= ~CLK_PIN_CNTL__ACCESS_REGS_IN_SUSPEND;
  830. /* because both INPLL and OUTPLL take the same lock, that's why. */
  831. tmp = INPLL( pllMCLK_MISC) | MCLK_MISC__EN_MCLK_TRISTATE_IN_SUSPEND;
  832. OUTPLL( pllMCLK_MISC, tmp);
  833. /* BUS_CNTL1__MOBILE_PLATORM_SEL setting is northbridge chipset
  834. * and radeon chip dependent. Thus we only enable it on Mac for
  835. * now (until we get more info on how to compute the correct
  836. * value for various X86 bridges).
  837. */
  838. #ifdef CONFIG_PPC_PMAC
  839. if (machine_is(powermac)) {
  840. /* AGP PLL control */
  841. if (rinfo->family <= CHIP_FAMILY_RV280) {
  842. OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID);
  843. OUTREG(BUS_CNTL1,
  844. (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK)
  845. | (2<<BUS_CNTL1__MOBILE_PLATFORM_SEL__SHIFT)); // 440BX
  846. } else {
  847. OUTREG(BUS_CNTL1, INREG(BUS_CNTL1));
  848. OUTREG(BUS_CNTL1, (INREG(BUS_CNTL1) & ~0x4000) | 0x8000);
  849. }
  850. }
  851. #endif
  852. OUTREG(CRTC_OFFSET_CNTL, (INREG(CRTC_OFFSET_CNTL)
  853. & ~CRTC_OFFSET_CNTL__CRTC_STEREO_SYNC_OUT_EN));
  854. clk_pin_cntl &= ~CLK_PIN_CNTL__CG_CLK_TO_OUTPIN;
  855. clk_pin_cntl |= CLK_PIN_CNTL__XTALIN_ALWAYS_ONb;
  856. OUTPLL( pllCLK_PIN_CNTL, clk_pin_cntl);
  857. /* Solano2M */
  858. OUTREG(AGP_CNTL,
  859. (INREG(AGP_CNTL) & ~(AGP_CNTL__MAX_IDLE_CLK_MASK))
  860. | (0x20<<AGP_CNTL__MAX_IDLE_CLK__SHIFT));
  861. /* ACPI mode */
  862. /* because both INPLL and OUTPLL take the same lock, that's why. */
  863. tmp = INPLL( pllPLL_PWRMGT_CNTL) & ~PLL_PWRMGT_CNTL__PM_MODE_SEL;
  864. OUTPLL( pllPLL_PWRMGT_CNTL, tmp);
  865. disp_mis_cntl = INREG(DISP_MISC_CNTL);
  866. disp_mis_cntl &= ~( DISP_MISC_CNTL__SOFT_RESET_GRPH_PP |
  867. DISP_MISC_CNTL__SOFT_RESET_SUBPIC_PP |
  868. DISP_MISC_CNTL__SOFT_RESET_OV0_PP |
  869. DISP_MISC_CNTL__SOFT_RESET_GRPH_SCLK|
  870. DISP_MISC_CNTL__SOFT_RESET_SUBPIC_SCLK|
  871. DISP_MISC_CNTL__SOFT_RESET_OV0_SCLK|
  872. DISP_MISC_CNTL__SOFT_RESET_GRPH2_PP|
  873. DISP_MISC_CNTL__SOFT_RESET_GRPH2_SCLK|
  874. DISP_MISC_CNTL__SOFT_RESET_LVDS|
  875. DISP_MISC_CNTL__SOFT_RESET_TMDS|
  876. DISP_MISC_CNTL__SOFT_RESET_DIG_TMDS|
  877. DISP_MISC_CNTL__SOFT_RESET_TV);
  878. OUTREG(DISP_MISC_CNTL, disp_mis_cntl);
  879. disp_pwr_man = INREG(DISP_PWR_MAN);
  880. disp_pwr_man &= ~( DISP_PWR_MAN__DISP_PWR_MAN_D3_CRTC_EN |
  881. DISP_PWR_MAN__DISP2_PWR_MAN_D3_CRTC2_EN |
  882. DISP_PWR_MAN__DISP_PWR_MAN_DPMS_MASK|
  883. DISP_PWR_MAN__DISP_D3_RST|
  884. DISP_PWR_MAN__DISP_D3_REG_RST
  885. );
  886. disp_pwr_man |= DISP_PWR_MAN__DISP_D3_GRPH_RST|
  887. DISP_PWR_MAN__DISP_D3_SUBPIC_RST|
  888. DISP_PWR_MAN__DISP_D3_OV0_RST|
  889. DISP_PWR_MAN__DISP_D1D2_GRPH_RST|
  890. DISP_PWR_MAN__DISP_D1D2_SUBPIC_RST|
  891. DISP_PWR_MAN__DISP_D1D2_OV0_RST|
  892. DISP_PWR_MAN__DIG_TMDS_ENABLE_RST|
  893. DISP_PWR_MAN__TV_ENABLE_RST|
  894. // DISP_PWR_MAN__AUTO_PWRUP_EN|
  895. 0;
  896. OUTREG(DISP_PWR_MAN, disp_pwr_man);
  897. clk_pwrmgt_cntl = INPLL( pllCLK_PWRMGT_CNTL);
  898. pll_pwrmgt_cntl = INPLL( pllPLL_PWRMGT_CNTL) ;
  899. clk_pin_cntl = INPLL( pllCLK_PIN_CNTL);
  900. disp_pwr_man = INREG(DISP_PWR_MAN);
  901. /* D2 */
  902. clk_pwrmgt_cntl |= CLK_PWRMGT_CNTL__DISP_PM;
  903. pll_pwrmgt_cntl |= PLL_PWRMGT_CNTL__MOBILE_SU | PLL_PWRMGT_CNTL__SU_SCLK_USE_BCLK;
  904. clk_pin_cntl |= CLK_PIN_CNTL__XTALIN_ALWAYS_ONb;
  905. disp_pwr_man &= ~(DISP_PWR_MAN__DISP_PWR_MAN_D3_CRTC_EN_MASK
  906. | DISP_PWR_MAN__DISP2_PWR_MAN_D3_CRTC2_EN_MASK);
  907. OUTPLL( pllCLK_PWRMGT_CNTL, clk_pwrmgt_cntl);
  908. OUTPLL( pllPLL_PWRMGT_CNTL, pll_pwrmgt_cntl);
  909. OUTPLL( pllCLK_PIN_CNTL, clk_pin_cntl);
  910. OUTREG(DISP_PWR_MAN, disp_pwr_man);
  911. /* disable display request & disable display */
  912. OUTREG( CRTC_GEN_CNTL, (INREG( CRTC_GEN_CNTL) & ~CRTC_GEN_CNTL__CRTC_EN)
  913. | CRTC_GEN_CNTL__CRTC_DISP_REQ_EN_B);
  914. OUTREG( CRTC2_GEN_CNTL, (INREG( CRTC2_GEN_CNTL) & ~CRTC2_GEN_CNTL__CRTC2_EN)
  915. | CRTC2_GEN_CNTL__CRTC2_DISP_REQ_EN_B);
  916. mdelay(17);
  917. }
  918. static void radeon_pm_yclk_mclk_sync(struct radeonfb_info *rinfo)
  919. {
  920. u32 mc_chp_io_cntl_a1, mc_chp_io_cntl_b1;
  921. mc_chp_io_cntl_a1 = INMC( rinfo, ixMC_CHP_IO_CNTL_A1)
  922. & ~MC_CHP_IO_CNTL_A1__MEM_SYNC_ENA_MASK;
  923. mc_chp_io_cntl_b1 = INMC( rinfo, ixMC_CHP_IO_CNTL_B1)
  924. & ~MC_CHP_IO_CNTL_B1__MEM_SYNC_ENB_MASK;
  925. OUTMC( rinfo, ixMC_CHP_IO_CNTL_A1, mc_chp_io_cntl_a1
  926. | (1<<MC_CHP_IO_CNTL_A1__MEM_SYNC_ENA__SHIFT));
  927. OUTMC( rinfo, ixMC_CHP_IO_CNTL_B1, mc_chp_io_cntl_b1
  928. | (1<<MC_CHP_IO_CNTL_B1__MEM_SYNC_ENB__SHIFT));
  929. OUTMC( rinfo, ixMC_CHP_IO_CNTL_A1, mc_chp_io_cntl_a1);
  930. OUTMC( rinfo, ixMC_CHP_IO_CNTL_B1, mc_chp_io_cntl_b1);
  931. mdelay( 1);
  932. }
  933. static void radeon_pm_yclk_mclk_sync_m10(struct radeonfb_info *rinfo)
  934. {
  935. u32 mc_chp_io_cntl_a1, mc_chp_io_cntl_b1;
  936. mc_chp_io_cntl_a1 = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_A1)
  937. & ~MC_CHP_IO_CNTL_A1__MEM_SYNC_ENA_MASK;
  938. mc_chp_io_cntl_b1 = INMC(rinfo, ixR300_MC_CHP_IO_CNTL_B1)
  939. & ~MC_CHP_IO_CNTL_B1__MEM_SYNC_ENB_MASK;
  940. OUTMC( rinfo, ixR300_MC_CHP_IO_CNTL_A1,
  941. mc_chp_io_cntl_a1 | (1<<MC_CHP_IO_CNTL_A1__MEM_SYNC_ENA__SHIFT));
  942. OUTMC( rinfo, ixR300_MC_CHP_IO_CNTL_B1,
  943. mc_chp_io_cntl_b1 | (1<<MC_CHP_IO_CNTL_B1__MEM_SYNC_ENB__SHIFT));
  944. OUTMC( rinfo, ixR300_MC_CHP_IO_CNTL_A1, mc_chp_io_cntl_a1);
  945. OUTMC( rinfo, ixR300_MC_CHP_IO_CNTL_B1, mc_chp_io_cntl_b1);
  946. mdelay( 1);
  947. }
  948. static void radeon_pm_program_mode_reg(struct radeonfb_info *rinfo, u16 value,
  949. u8 delay_required)
  950. {
  951. u32 mem_sdram_mode;
  952. mem_sdram_mode = INREG( MEM_SDRAM_MODE_REG);
  953. mem_sdram_mode &= ~MEM_SDRAM_MODE_REG__MEM_MODE_REG_MASK;
  954. mem_sdram_mode |= (value<<MEM_SDRAM_MODE_REG__MEM_MODE_REG__SHIFT)
  955. | MEM_SDRAM_MODE_REG__MEM_CFG_TYPE;
  956. OUTREG( MEM_SDRAM_MODE_REG, mem_sdram_mode);
  957. if (delay_required >= 2)
  958. mdelay(1);
  959. mem_sdram_mode |= MEM_SDRAM_MODE_REG__MEM_SDRAM_RESET;
  960. OUTREG( MEM_SDRAM_MODE_REG, mem_sdram_mode);
  961. if (delay_required >= 2)
  962. mdelay(1);
  963. mem_sdram_mode &= ~MEM_SDRAM_MODE_REG__MEM_SDRAM_RESET;
  964. OUTREG( MEM_SDRAM_MODE_REG, mem_sdram_mode);
  965. if (delay_required >= 2)
  966. mdelay(1);
  967. if (delay_required) {
  968. do {
  969. if (delay_required >= 2)
  970. mdelay(1);
  971. } while ((INREG(MC_STATUS)
  972. & (MC_STATUS__MEM_PWRUP_COMPL_A |
  973. MC_STATUS__MEM_PWRUP_COMPL_B)) == 0);
  974. }
  975. }
  976. static void radeon_pm_m10_program_mode_wait(struct radeonfb_info *rinfo)
  977. {
  978. int cnt;
  979. for (cnt = 0; cnt < 100; ++cnt) {
  980. mdelay(1);
  981. if (INREG(MC_STATUS) & (MC_STATUS__MEM_PWRUP_COMPL_A
  982. | MC_STATUS__MEM_PWRUP_COMPL_B))
  983. break;
  984. }
  985. }
  986. static void radeon_pm_enable_dll(struct radeonfb_info *rinfo)
  987. {
  988. #define DLL_RESET_DELAY 5
  989. #define DLL_SLEEP_DELAY 1
  990. u32 cko = INPLL(pllMDLL_CKO) | MDLL_CKO__MCKOA_SLEEP
  991. | MDLL_CKO__MCKOA_RESET;
  992. u32 cka = INPLL(pllMDLL_RDCKA) | MDLL_RDCKA__MRDCKA0_SLEEP
  993. | MDLL_RDCKA__MRDCKA1_SLEEP | MDLL_RDCKA__MRDCKA0_RESET
  994. | MDLL_RDCKA__MRDCKA1_RESET;
  995. u32 ckb = INPLL(pllMDLL_RDCKB) | MDLL_RDCKB__MRDCKB0_SLEEP
  996. | MDLL_RDCKB__MRDCKB1_SLEEP | MDLL_RDCKB__MRDCKB0_RESET
  997. | MDLL_RDCKB__MRDCKB1_RESET;
  998. /* Setting up the DLL range for write */
  999. OUTPLL(pllMDLL_CKO, cko);
  1000. OUTPLL(pllMDLL_RDCKA, cka);
  1001. OUTPLL(pllMDLL_RDCKB, ckb);
  1002. mdelay(DLL_RESET_DELAY*2);
  1003. cko &= ~(MDLL_CKO__MCKOA_SLEEP | MDLL_CKO__MCKOB_SLEEP);
  1004. OUTPLL(pllMDLL_CKO, cko);
  1005. mdelay(DLL_SLEEP_DELAY);
  1006. cko &= ~(MDLL_CKO__MCKOA_RESET | MDLL_CKO__MCKOB_RESET);
  1007. OUTPLL(pllMDLL_CKO, cko);
  1008. mdelay(DLL_RESET_DELAY);
  1009. cka &= ~(MDLL_RDCKA__MRDCKA0_SLEEP | MDLL_RDCKA__MRDCKA1_SLEEP);
  1010. OUTPLL(pllMDLL_RDCKA, cka);
  1011. mdelay(DLL_SLEEP_DELAY);
  1012. cka &= ~(MDLL_RDCKA__MRDCKA0_RESET | MDLL_RDCKA__MRDCKA1_RESET);
  1013. OUTPLL(pllMDLL_RDCKA, cka);
  1014. mdelay(DLL_RESET_DELAY);
  1015. ckb &= ~(MDLL_RDCKB__MRDCKB0_SLEEP | MDLL_RDCKB__MRDCKB1_SLEEP);
  1016. OUTPLL(pllMDLL_RDCKB, ckb);
  1017. mdelay(DLL_SLEEP_DELAY);
  1018. ckb &= ~(MDLL_RDCKB__MRDCKB0_RESET | MDLL_RDCKB__MRDCKB1_RESET);
  1019. OUTPLL(pllMDLL_RDCKB, ckb);
  1020. mdelay(DLL_RESET_DELAY);
  1021. #undef DLL_RESET_DELAY
  1022. #undef DLL_SLEEP_DELAY
  1023. }
  1024. static void radeon_pm_enable_dll_m10(struct radeonfb_info *rinfo)
  1025. {
  1026. u32 dll_value;
  1027. u32 dll_sleep_mask = 0;
  1028. u32 dll_reset_mask = 0;
  1029. u32 mc;
  1030. #define DLL_RESET_DELAY 5
  1031. #define DLL_SLEEP_DELAY 1
  1032. OUTMC(rinfo, ixR300_MC_DLL_CNTL, rinfo->save_regs[70]);
  1033. mc = INREG(MC_CNTL);
  1034. /* Check which channels are enabled */
  1035. switch (mc & 0x3) {
  1036. case 1:
  1037. if (mc & 0x4)
  1038. break;
  1039. /* fall through */
  1040. case 2:
  1041. dll_sleep_mask |= MDLL_R300_RDCK__MRDCKB_SLEEP;
  1042. dll_reset_mask |= MDLL_R300_RDCK__MRDCKB_RESET;
  1043. /* fall through */
  1044. case 0:
  1045. dll_sleep_mask |= MDLL_R300_RDCK__MRDCKA_SLEEP;
  1046. dll_reset_mask |= MDLL_R300_RDCK__MRDCKA_RESET;
  1047. }
  1048. switch (mc & 0x3) {
  1049. case 1:
  1050. if (!(mc & 0x4))
  1051. break;
  1052. /* fall through */
  1053. case 2:
  1054. dll_sleep_mask |= MDLL_R300_RDCK__MRDCKD_SLEEP;
  1055. dll_reset_mask |= MDLL_R300_RDCK__MRDCKD_RESET;
  1056. dll_sleep_mask |= MDLL_R300_RDCK__MRDCKC_SLEEP;
  1057. dll_reset_mask |= MDLL_R300_RDCK__MRDCKC_RESET;
  1058. }
  1059. dll_value = INPLL(pllMDLL_RDCKA);
  1060. /* Power Up */
  1061. dll_value &= ~(dll_sleep_mask);
  1062. OUTPLL(pllMDLL_RDCKA, dll_value);
  1063. mdelay( DLL_SLEEP_DELAY);
  1064. dll_value &= ~(dll_reset_mask);
  1065. OUTPLL(pllMDLL_RDCKA, dll_value);
  1066. mdelay( DLL_RESET_DELAY);
  1067. #undef DLL_RESET_DELAY
  1068. #undef DLL_SLEEP_DELAY
  1069. }
  1070. static void radeon_pm_full_reset_sdram(struct radeonfb_info *rinfo)
  1071. {
  1072. u32 crtcGenCntl, crtcGenCntl2, memRefreshCntl, crtc_more_cntl,
  1073. fp_gen_cntl, fp2_gen_cntl;
  1074. crtcGenCntl = INREG( CRTC_GEN_CNTL);
  1075. crtcGenCntl2 = INREG( CRTC2_GEN_CNTL);
  1076. crtc_more_cntl = INREG( CRTC_MORE_CNTL);
  1077. fp_gen_cntl = INREG( FP_GEN_CNTL);
  1078. fp2_gen_cntl = INREG( FP2_GEN_CNTL);
  1079. OUTREG( CRTC_MORE_CNTL, 0);
  1080. OUTREG( FP_GEN_CNTL, 0);
  1081. OUTREG( FP2_GEN_CNTL,0);
  1082. OUTREG( CRTC_GEN_CNTL, (crtcGenCntl | CRTC_GEN_CNTL__CRTC_DISP_REQ_EN_B) );
  1083. OUTREG( CRTC2_GEN_CNTL, (crtcGenCntl2 | CRTC2_GEN_CNTL__CRTC2_DISP_REQ_EN_B) );
  1084. /* This is the code for the Aluminium PowerBooks M10 / iBooks M11 */
  1085. if (rinfo->family == CHIP_FAMILY_RV350) {
  1086. u32 sdram_mode_reg = rinfo->save_regs[35];
  1087. static const u32 default_mrtable[] =
  1088. { 0x21320032,
  1089. 0x21321000, 0xa1321000, 0x21321000, 0xffffffff,
  1090. 0x21320032, 0xa1320032, 0x21320032, 0xffffffff,
  1091. 0x21321002, 0xa1321002, 0x21321002, 0xffffffff,
  1092. 0x21320132, 0xa1320132, 0x21320132, 0xffffffff,
  1093. 0x21320032, 0xa1320032, 0x21320032, 0xffffffff,
  1094. 0x31320032 };
  1095. const u32 *mrtable = default_mrtable;
  1096. int i, mrtable_size = ARRAY_SIZE(default_mrtable);
  1097. mdelay(30);
  1098. /* Disable refresh */
  1099. memRefreshCntl = INREG( MEM_REFRESH_CNTL)
  1100. & ~MEM_REFRESH_CNTL__MEM_REFRESH_DIS;
  1101. OUTREG( MEM_REFRESH_CNTL, memRefreshCntl
  1102. | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
  1103. /* Configure and enable M & SPLLs */
  1104. radeon_pm_enable_dll_m10(rinfo);
  1105. radeon_pm_yclk_mclk_sync_m10(rinfo);
  1106. #ifdef CONFIG_PPC
  1107. if (rinfo->of_node != NULL) {
  1108. int size;
  1109. mrtable = of_get_property(rinfo->of_node, "ATY,MRT", &size);
  1110. if (mrtable)
  1111. mrtable_size = size >> 2;
  1112. else
  1113. mrtable = default_mrtable;
  1114. }
  1115. #endif /* CONFIG_PPC */
  1116. /* Program the SDRAM */
  1117. sdram_mode_reg = mrtable[0];
  1118. OUTREG(MEM_SDRAM_MODE_REG, sdram_mode_reg);
  1119. for (i = 0; i < mrtable_size; i++) {
  1120. if (mrtable[i] == 0xffffffffu)
  1121. radeon_pm_m10_program_mode_wait(rinfo);
  1122. else {
  1123. sdram_mode_reg &= ~(MEM_SDRAM_MODE_REG__MEM_MODE_REG_MASK
  1124. | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE
  1125. | MEM_SDRAM_MODE_REG__MEM_SDRAM_RESET);
  1126. sdram_mode_reg |= mrtable[i];
  1127. OUTREG(MEM_SDRAM_MODE_REG, sdram_mode_reg);
  1128. mdelay(1);
  1129. }
  1130. }
  1131. /* Restore memory refresh */
  1132. OUTREG(MEM_REFRESH_CNTL, memRefreshCntl);
  1133. mdelay(30);
  1134. }
  1135. /* Here come the desktop RV200 "QW" card */
  1136. else if (!rinfo->is_mobility && rinfo->family == CHIP_FAMILY_RV200) {
  1137. /* Disable refresh */
  1138. memRefreshCntl = INREG( MEM_REFRESH_CNTL)
  1139. & ~MEM_REFRESH_CNTL__MEM_REFRESH_DIS;
  1140. OUTREG(MEM_REFRESH_CNTL, memRefreshCntl
  1141. | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
  1142. mdelay(30);
  1143. /* Reset memory */
  1144. OUTREG(MEM_SDRAM_MODE_REG,
  1145. INREG( MEM_SDRAM_MODE_REG) & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1146. radeon_pm_program_mode_reg(rinfo, 0x2002, 2);
  1147. radeon_pm_program_mode_reg(rinfo, 0x0132, 2);
  1148. radeon_pm_program_mode_reg(rinfo, 0x0032, 2);
  1149. OUTREG(MEM_SDRAM_MODE_REG,
  1150. INREG(MEM_SDRAM_MODE_REG) | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1151. OUTREG( MEM_REFRESH_CNTL, memRefreshCntl);
  1152. }
  1153. /* The M6 */
  1154. else if (rinfo->is_mobility && rinfo->family == CHIP_FAMILY_RV100) {
  1155. /* Disable refresh */
  1156. memRefreshCntl = INREG(EXT_MEM_CNTL) & ~(1 << 20);
  1157. OUTREG( EXT_MEM_CNTL, memRefreshCntl | (1 << 20));
  1158. /* Reset memory */
  1159. OUTREG( MEM_SDRAM_MODE_REG,
  1160. INREG( MEM_SDRAM_MODE_REG)
  1161. & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1162. /* DLL */
  1163. radeon_pm_enable_dll(rinfo);
  1164. /* MLCK / YCLK sync */
  1165. radeon_pm_yclk_mclk_sync(rinfo);
  1166. /* Program Mode Register */
  1167. radeon_pm_program_mode_reg(rinfo, 0x2000, 1);
  1168. radeon_pm_program_mode_reg(rinfo, 0x2001, 1);
  1169. radeon_pm_program_mode_reg(rinfo, 0x2002, 1);
  1170. radeon_pm_program_mode_reg(rinfo, 0x0132, 1);
  1171. radeon_pm_program_mode_reg(rinfo, 0x0032, 1);
  1172. /* Complete & re-enable refresh */
  1173. OUTREG( MEM_SDRAM_MODE_REG,
  1174. INREG( MEM_SDRAM_MODE_REG) | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1175. OUTREG(EXT_MEM_CNTL, memRefreshCntl);
  1176. }
  1177. /* And finally, the M7..M9 models, including M9+ (RV280) */
  1178. else if (rinfo->is_mobility) {
  1179. /* Disable refresh */
  1180. memRefreshCntl = INREG( MEM_REFRESH_CNTL)
  1181. & ~MEM_REFRESH_CNTL__MEM_REFRESH_DIS;
  1182. OUTREG( MEM_REFRESH_CNTL, memRefreshCntl
  1183. | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
  1184. /* Reset memory */
  1185. OUTREG( MEM_SDRAM_MODE_REG,
  1186. INREG( MEM_SDRAM_MODE_REG)
  1187. & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1188. /* DLL */
  1189. radeon_pm_enable_dll(rinfo);
  1190. /* MLCK / YCLK sync */
  1191. radeon_pm_yclk_mclk_sync(rinfo);
  1192. /* M6, M7 and M9 so far ... */
  1193. if (rinfo->family <= CHIP_FAMILY_RV250) {
  1194. radeon_pm_program_mode_reg(rinfo, 0x2000, 1);
  1195. radeon_pm_program_mode_reg(rinfo, 0x2001, 1);
  1196. radeon_pm_program_mode_reg(rinfo, 0x2002, 1);
  1197. radeon_pm_program_mode_reg(rinfo, 0x0132, 1);
  1198. radeon_pm_program_mode_reg(rinfo, 0x0032, 1);
  1199. }
  1200. /* M9+ (iBook G4) */
  1201. else if (rinfo->family == CHIP_FAMILY_RV280) {
  1202. radeon_pm_program_mode_reg(rinfo, 0x2000, 1);
  1203. radeon_pm_program_mode_reg(rinfo, 0x0132, 1);
  1204. radeon_pm_program_mode_reg(rinfo, 0x0032, 1);
  1205. }
  1206. /* Complete & re-enable refresh */
  1207. OUTREG( MEM_SDRAM_MODE_REG,
  1208. INREG( MEM_SDRAM_MODE_REG) | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1209. OUTREG( MEM_REFRESH_CNTL, memRefreshCntl);
  1210. }
  1211. OUTREG( CRTC_GEN_CNTL, crtcGenCntl);
  1212. OUTREG( CRTC2_GEN_CNTL, crtcGenCntl2);
  1213. OUTREG( FP_GEN_CNTL, fp_gen_cntl);
  1214. OUTREG( FP2_GEN_CNTL, fp2_gen_cntl);
  1215. OUTREG( CRTC_MORE_CNTL, crtc_more_cntl);
  1216. mdelay( 15);
  1217. }
  1218. #if defined(CONFIG_PM)
  1219. #if defined(CONFIG_X86) || defined(CONFIG_PPC_PMAC)
  1220. static void radeon_pm_reset_pad_ctlr_strength(struct radeonfb_info *rinfo)
  1221. {
  1222. u32 tmp, tmp2;
  1223. int i,j;
  1224. /* Reset the PAD_CTLR_STRENGTH & wait for it to be stable */
  1225. INREG(PAD_CTLR_STRENGTH);
  1226. OUTREG(PAD_CTLR_STRENGTH, INREG(PAD_CTLR_STRENGTH) & ~PAD_MANUAL_OVERRIDE);
  1227. tmp = INREG(PAD_CTLR_STRENGTH);
  1228. for (i = j = 0; i < 65; ++i) {
  1229. mdelay(1);
  1230. tmp2 = INREG(PAD_CTLR_STRENGTH);
  1231. if (tmp != tmp2) {
  1232. tmp = tmp2;
  1233. i = 0;
  1234. j++;
  1235. if (j > 10) {
  1236. printk(KERN_WARNING "radeon: PAD_CTLR_STRENGTH doesn't "
  1237. "stabilize !\n");
  1238. break;
  1239. }
  1240. }
  1241. }
  1242. }
  1243. static void radeon_pm_all_ppls_off(struct radeonfb_info *rinfo)
  1244. {
  1245. u32 tmp;
  1246. tmp = INPLL(pllPPLL_CNTL);
  1247. OUTPLL(pllPPLL_CNTL, tmp | 0x3);
  1248. tmp = INPLL(pllP2PLL_CNTL);
  1249. OUTPLL(pllP2PLL_CNTL, tmp | 0x3);
  1250. tmp = INPLL(pllSPLL_CNTL);
  1251. OUTPLL(pllSPLL_CNTL, tmp | 0x3);
  1252. tmp = INPLL(pllMPLL_CNTL);
  1253. OUTPLL(pllMPLL_CNTL, tmp | 0x3);
  1254. }
  1255. static void radeon_pm_start_mclk_sclk(struct radeonfb_info *rinfo)
  1256. {
  1257. u32 tmp;
  1258. /* Switch SPLL to PCI source */
  1259. tmp = INPLL(pllSCLK_CNTL);
  1260. OUTPLL(pllSCLK_CNTL, tmp & ~SCLK_CNTL__SCLK_SRC_SEL_MASK);
  1261. /* Reconfigure SPLL charge pump, VCO gain, duty cycle */
  1262. tmp = INPLL(pllSPLL_CNTL);
  1263. OUTREG8(CLOCK_CNTL_INDEX, pllSPLL_CNTL + PLL_WR_EN);
  1264. radeon_pll_errata_after_index(rinfo);
  1265. OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
  1266. radeon_pll_errata_after_data(rinfo);
  1267. /* Set SPLL feedback divider */
  1268. tmp = INPLL(pllM_SPLL_REF_FB_DIV);
  1269. tmp = (tmp & 0xff00fffful) | (rinfo->save_regs[77] & 0x00ff0000ul);
  1270. OUTPLL(pllM_SPLL_REF_FB_DIV, tmp);
  1271. /* Power up SPLL */
  1272. tmp = INPLL(pllSPLL_CNTL);
  1273. OUTPLL(pllSPLL_CNTL, tmp & ~1);
  1274. (void)INPLL(pllSPLL_CNTL);
  1275. mdelay(10);
  1276. /* Release SPLL reset */
  1277. tmp = INPLL(pllSPLL_CNTL);
  1278. OUTPLL(pllSPLL_CNTL, tmp & ~0x2);
  1279. (void)INPLL(pllSPLL_CNTL);
  1280. mdelay(10);
  1281. /* Select SCLK source */
  1282. tmp = INPLL(pllSCLK_CNTL);
  1283. tmp &= ~SCLK_CNTL__SCLK_SRC_SEL_MASK;
  1284. tmp |= rinfo->save_regs[3] & SCLK_CNTL__SCLK_SRC_SEL_MASK;
  1285. OUTPLL(pllSCLK_CNTL, tmp);
  1286. (void)INPLL(pllSCLK_CNTL);
  1287. mdelay(10);
  1288. /* Reconfigure MPLL charge pump, VCO gain, duty cycle */
  1289. tmp = INPLL(pllMPLL_CNTL);
  1290. OUTREG8(CLOCK_CNTL_INDEX, pllMPLL_CNTL + PLL_WR_EN);
  1291. radeon_pll_errata_after_index(rinfo);
  1292. OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
  1293. radeon_pll_errata_after_data(rinfo);
  1294. /* Set MPLL feedback divider */
  1295. tmp = INPLL(pllM_SPLL_REF_FB_DIV);
  1296. tmp = (tmp & 0xffff00fful) | (rinfo->save_regs[77] & 0x0000ff00ul);
  1297. OUTPLL(pllM_SPLL_REF_FB_DIV, tmp);
  1298. /* Power up MPLL */
  1299. tmp = INPLL(pllMPLL_CNTL);
  1300. OUTPLL(pllMPLL_CNTL, tmp & ~0x2);
  1301. (void)INPLL(pllMPLL_CNTL);
  1302. mdelay(10);
  1303. /* Un-reset MPLL */
  1304. tmp = INPLL(pllMPLL_CNTL);
  1305. OUTPLL(pllMPLL_CNTL, tmp & ~0x1);
  1306. (void)INPLL(pllMPLL_CNTL);
  1307. mdelay(10);
  1308. /* Select source for MCLK */
  1309. tmp = INPLL(pllMCLK_CNTL);
  1310. tmp |= rinfo->save_regs[2] & 0xffff;
  1311. OUTPLL(pllMCLK_CNTL, tmp);
  1312. (void)INPLL(pllMCLK_CNTL);
  1313. mdelay(10);
  1314. }
  1315. static void radeon_pm_m10_disable_spread_spectrum(struct radeonfb_info *rinfo)
  1316. {
  1317. u32 r2ec;
  1318. /* GACK ! I though we didn't have a DDA on Radeon's anymore
  1319. * here we rewrite with the same value, ... I suppose we clear
  1320. * some bits that are already clear ? Or maybe this 0x2ec
  1321. * register is something new ?
  1322. */
  1323. mdelay(20);
  1324. r2ec = INREG(VGA_DDA_ON_OFF);
  1325. OUTREG(VGA_DDA_ON_OFF, r2ec);
  1326. mdelay(1);
  1327. /* Spread spectrum PLLL off */
  1328. OUTPLL(pllSSPLL_CNTL, 0xbf03);
  1329. /* Spread spectrum disabled */
  1330. OUTPLL(pllSS_INT_CNTL, rinfo->save_regs[90] & ~3);
  1331. /* The trace shows read & rewrite of LVDS_PLL_CNTL here with same
  1332. * value, not sure what for...
  1333. */
  1334. r2ec |= 0x3f0;
  1335. OUTREG(VGA_DDA_ON_OFF, r2ec);
  1336. mdelay(1);
  1337. }
  1338. static void radeon_pm_m10_enable_lvds_spread_spectrum(struct radeonfb_info *rinfo)
  1339. {
  1340. u32 r2ec, tmp;
  1341. /* GACK (bis) ! I though we didn't have a DDA on Radeon's anymore
  1342. * here we rewrite with the same value, ... I suppose we clear/set
  1343. * some bits that are already clear/set ?
  1344. */
  1345. r2ec = INREG(VGA_DDA_ON_OFF);
  1346. OUTREG(VGA_DDA_ON_OFF, r2ec);
  1347. mdelay(1);
  1348. /* Enable spread spectrum */
  1349. OUTPLL(pllSSPLL_CNTL, rinfo->save_regs[43] | 3);
  1350. mdelay(3);
  1351. OUTPLL(pllSSPLL_REF_DIV, rinfo->save_regs[44]);
  1352. OUTPLL(pllSSPLL_DIV_0, rinfo->save_regs[45]);
  1353. tmp = INPLL(pllSSPLL_CNTL);
  1354. OUTPLL(pllSSPLL_CNTL, tmp & ~0x2);
  1355. mdelay(6);
  1356. tmp = INPLL(pllSSPLL_CNTL);
  1357. OUTPLL(pllSSPLL_CNTL, tmp & ~0x1);
  1358. mdelay(5);
  1359. OUTPLL(pllSS_INT_CNTL, rinfo->save_regs[90]);
  1360. r2ec |= 8;
  1361. OUTREG(VGA_DDA_ON_OFF, r2ec);
  1362. mdelay(20);
  1363. /* Enable LVDS interface */
  1364. tmp = INREG(LVDS_GEN_CNTL);
  1365. OUTREG(LVDS_GEN_CNTL, tmp | LVDS_EN);
  1366. /* Enable LVDS_PLL */
  1367. tmp = INREG(LVDS_PLL_CNTL);
  1368. tmp &= ~0x30000;
  1369. tmp |= 0x10000;
  1370. OUTREG(LVDS_PLL_CNTL, tmp);
  1371. OUTPLL(pllSCLK_MORE_CNTL, rinfo->save_regs[34]);
  1372. OUTPLL(pllSS_TST_CNTL, rinfo->save_regs[91]);
  1373. /* The trace reads that one here, waiting for something to settle down ? */
  1374. INREG(RBBM_STATUS);
  1375. /* Ugh ? SS_TST_DEC is supposed to be a read register in the
  1376. * R300 register spec at least...
  1377. */
  1378. tmp = INPLL(pllSS_TST_CNTL);
  1379. tmp |= 0x00400000;
  1380. OUTPLL(pllSS_TST_CNTL, tmp);
  1381. }
  1382. static void radeon_pm_restore_pixel_pll(struct radeonfb_info *rinfo)
  1383. {
  1384. u32 tmp;
  1385. OUTREG8(CLOCK_CNTL_INDEX, pllHTOTAL_CNTL + PLL_WR_EN);
  1386. radeon_pll_errata_after_index(rinfo);
  1387. OUTREG8(CLOCK_CNTL_DATA, 0);
  1388. radeon_pll_errata_after_data(rinfo);
  1389. tmp = INPLL(pllVCLK_ECP_CNTL);
  1390. OUTPLL(pllVCLK_ECP_CNTL, tmp | 0x80);
  1391. mdelay(5);
  1392. tmp = INPLL(pllPPLL_REF_DIV);
  1393. tmp = (tmp & ~PPLL_REF_DIV_MASK) | rinfo->pll.ref_div;
  1394. OUTPLL(pllPPLL_REF_DIV, tmp);
  1395. INPLL(pllPPLL_REF_DIV);
  1396. /* Reconfigure SPLL charge pump, VCO gain, duty cycle,
  1397. * probably useless since we already did it ...
  1398. */
  1399. tmp = INPLL(pllPPLL_CNTL);
  1400. OUTREG8(CLOCK_CNTL_INDEX, pllSPLL_CNTL + PLL_WR_EN);
  1401. radeon_pll_errata_after_index(rinfo);
  1402. OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
  1403. radeon_pll_errata_after_data(rinfo);
  1404. /* Restore our "reference" PPLL divider set by firmware
  1405. * according to proper spread spectrum calculations
  1406. */
  1407. OUTPLL(pllPPLL_DIV_0, rinfo->save_regs[92]);
  1408. tmp = INPLL(pllPPLL_CNTL);
  1409. OUTPLL(pllPPLL_CNTL, tmp & ~0x2);
  1410. mdelay(5);
  1411. tmp = INPLL(pllPPLL_CNTL);
  1412. OUTPLL(pllPPLL_CNTL, tmp & ~0x1);
  1413. mdelay(5);
  1414. tmp = INPLL(pllVCLK_ECP_CNTL);
  1415. OUTPLL(pllVCLK_ECP_CNTL, tmp | 3);
  1416. mdelay(5);
  1417. tmp = INPLL(pllVCLK_ECP_CNTL);
  1418. OUTPLL(pllVCLK_ECP_CNTL, tmp | 3);
  1419. mdelay(5);
  1420. /* Switch pixel clock to firmware default div 0 */
  1421. OUTREG8(CLOCK_CNTL_INDEX+1, 0);
  1422. radeon_pll_errata_after_index(rinfo);
  1423. radeon_pll_errata_after_data(rinfo);
  1424. }
  1425. static void radeon_pm_m10_reconfigure_mc(struct radeonfb_info *rinfo)
  1426. {
  1427. OUTREG(MC_CNTL, rinfo->save_regs[46]);
  1428. OUTREG(MC_INIT_GFX_LAT_TIMER, rinfo->save_regs[47]);
  1429. OUTREG(MC_INIT_MISC_LAT_TIMER, rinfo->save_regs[48]);
  1430. OUTREG(MEM_SDRAM_MODE_REG,
  1431. rinfo->save_regs[35] & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1432. OUTREG(MC_TIMING_CNTL, rinfo->save_regs[49]);
  1433. OUTREG(MEM_REFRESH_CNTL, rinfo->save_regs[42]);
  1434. OUTREG(MC_READ_CNTL_AB, rinfo->save_regs[50]);
  1435. OUTREG(MC_CHIP_IO_OE_CNTL_AB, rinfo->save_regs[52]);
  1436. OUTREG(MC_IOPAD_CNTL, rinfo->save_regs[51]);
  1437. OUTREG(MC_DEBUG, rinfo->save_regs[53]);
  1438. OUTMC(rinfo, ixR300_MC_MC_INIT_WR_LAT_TIMER, rinfo->save_regs[58]);
  1439. OUTMC(rinfo, ixR300_MC_IMP_CNTL, rinfo->save_regs[59]);
  1440. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_C0, rinfo->save_regs[60]);
  1441. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_C1, rinfo->save_regs[61]);
  1442. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_D0, rinfo->save_regs[62]);
  1443. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_D1, rinfo->save_regs[63]);
  1444. OUTMC(rinfo, ixR300_MC_BIST_CNTL_3, rinfo->save_regs[64]);
  1445. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_A0, rinfo->save_regs[65]);
  1446. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_A1, rinfo->save_regs[66]);
  1447. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_B0, rinfo->save_regs[67]);
  1448. OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_B1, rinfo->save_regs[68]);
  1449. OUTMC(rinfo, ixR300_MC_DEBUG_CNTL, rinfo->save_regs[69]);
  1450. OUTMC(rinfo, ixR300_MC_DLL_CNTL, rinfo->save_regs[70]);
  1451. OUTMC(rinfo, ixR300_MC_IMP_CNTL_0, rinfo->save_regs[71]);
  1452. OUTMC(rinfo, ixR300_MC_ELPIDA_CNTL, rinfo->save_regs[72]);
  1453. OUTMC(rinfo, ixR300_MC_READ_CNTL_CD, rinfo->save_regs[96]);
  1454. OUTREG(MC_IND_INDEX, 0);
  1455. }
  1456. static void radeon_reinitialize_M10(struct radeonfb_info *rinfo)
  1457. {
  1458. u32 tmp, i;
  1459. /* Restore a bunch of registers first */
  1460. OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
  1461. OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
  1462. OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
  1463. OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
  1464. OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]);
  1465. OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
  1466. OUTREG(BUS_CNTL, rinfo->save_regs[36]);
  1467. OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
  1468. OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]);
  1469. OUTREG(FCP_CNTL, rinfo->save_regs[38]);
  1470. OUTREG(RBBM_CNTL, rinfo->save_regs[39]);
  1471. OUTREG(DAC_CNTL, rinfo->save_regs[40]);
  1472. OUTREG(DAC_MACRO_CNTL, (INREG(DAC_MACRO_CNTL) & ~0x6) | 8);
  1473. OUTREG(DAC_MACRO_CNTL, (INREG(DAC_MACRO_CNTL) & ~0x6) | 8);
  1474. /* Hrm... */
  1475. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | DAC2_EXPAND_MODE);
  1476. /* Reset the PAD CTLR */
  1477. radeon_pm_reset_pad_ctlr_strength(rinfo);
  1478. /* Some PLLs are Read & written identically in the trace here...
  1479. * I suppose it's actually to switch them all off & reset,
  1480. * let's assume off is what we want. I'm just doing that for all major PLLs now.
  1481. */
  1482. radeon_pm_all_ppls_off(rinfo);
  1483. /* Clear tiling, reset swappers */
  1484. INREG(SURFACE_CNTL);
  1485. OUTREG(SURFACE_CNTL, 0);
  1486. /* Some black magic with TV_DAC_CNTL, we should restore those from backups
  1487. * rather than hard coding...
  1488. */
  1489. tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_BGADJ_MASK;
  1490. tmp |= 8 << TV_DAC_CNTL_BGADJ__SHIFT;
  1491. OUTREG(TV_DAC_CNTL, tmp);
  1492. tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_DACADJ_MASK;
  1493. tmp |= 7 << TV_DAC_CNTL_DACADJ__SHIFT;
  1494. OUTREG(TV_DAC_CNTL, tmp);
  1495. /* More registers restored */
  1496. OUTREG(AGP_CNTL, rinfo->save_regs[16]);
  1497. OUTREG(HOST_PATH_CNTL, rinfo->save_regs[41]);
  1498. OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
  1499. /* Hrmmm ... What is that ? */
  1500. tmp = rinfo->save_regs[1]
  1501. & ~(CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK |
  1502. CLK_PWRMGT_CNTL__MC_BUSY);
  1503. OUTPLL(pllCLK_PWRMGT_CNTL, tmp);
  1504. OUTREG(PAD_CTLR_MISC, rinfo->save_regs[56]);
  1505. OUTREG(FW_CNTL, rinfo->save_regs[57]);
  1506. OUTREG(HDP_DEBUG, rinfo->save_regs[96]);
  1507. OUTREG(PAMAC0_DLY_CNTL, rinfo->save_regs[54]);
  1508. OUTREG(PAMAC1_DLY_CNTL, rinfo->save_regs[55]);
  1509. OUTREG(PAMAC2_DLY_CNTL, rinfo->save_regs[79]);
  1510. /* Restore Memory Controller configuration */
  1511. radeon_pm_m10_reconfigure_mc(rinfo);
  1512. /* Make sure CRTC's dont touch memory */
  1513. OUTREG(CRTC_GEN_CNTL, INREG(CRTC_GEN_CNTL)
  1514. | CRTC_GEN_CNTL__CRTC_DISP_REQ_EN_B);
  1515. OUTREG(CRTC2_GEN_CNTL, INREG(CRTC2_GEN_CNTL)
  1516. | CRTC2_GEN_CNTL__CRTC2_DISP_REQ_EN_B);
  1517. mdelay(30);
  1518. /* Disable SDRAM refresh */
  1519. OUTREG(MEM_REFRESH_CNTL, INREG(MEM_REFRESH_CNTL)
  1520. | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
  1521. /* Restore XTALIN routing (CLK_PIN_CNTL) */
  1522. OUTPLL(pllCLK_PIN_CNTL, rinfo->save_regs[4]);
  1523. /* Switch MCLK, YCLK and SCLK PLLs to PCI source & force them ON */
  1524. tmp = rinfo->save_regs[2] & 0xff000000;
  1525. tmp |= MCLK_CNTL__FORCE_MCLKA |
  1526. MCLK_CNTL__FORCE_MCLKB |
  1527. MCLK_CNTL__FORCE_YCLKA |
  1528. MCLK_CNTL__FORCE_YCLKB |
  1529. MCLK_CNTL__FORCE_MC;
  1530. OUTPLL(pllMCLK_CNTL, tmp);
  1531. /* Force all clocks on in SCLK */
  1532. tmp = INPLL(pllSCLK_CNTL);
  1533. tmp |= SCLK_CNTL__FORCE_DISP2|
  1534. SCLK_CNTL__FORCE_CP|
  1535. SCLK_CNTL__FORCE_HDP|
  1536. SCLK_CNTL__FORCE_DISP1|
  1537. SCLK_CNTL__FORCE_TOP|
  1538. SCLK_CNTL__FORCE_E2|
  1539. SCLK_CNTL__FORCE_SE|
  1540. SCLK_CNTL__FORCE_IDCT|
  1541. SCLK_CNTL__FORCE_VIP|
  1542. SCLK_CNTL__FORCE_PB|
  1543. SCLK_CNTL__FORCE_TAM|
  1544. SCLK_CNTL__FORCE_TDM|
  1545. SCLK_CNTL__FORCE_RB|
  1546. SCLK_CNTL__FORCE_TV_SCLK|
  1547. SCLK_CNTL__FORCE_SUBPIC|
  1548. SCLK_CNTL__FORCE_OV0;
  1549. tmp |= SCLK_CNTL__CP_MAX_DYN_STOP_LAT |
  1550. SCLK_CNTL__HDP_MAX_DYN_STOP_LAT |
  1551. SCLK_CNTL__TV_MAX_DYN_STOP_LAT |
  1552. SCLK_CNTL__E2_MAX_DYN_STOP_LAT |
  1553. SCLK_CNTL__SE_MAX_DYN_STOP_LAT |
  1554. SCLK_CNTL__IDCT_MAX_DYN_STOP_LAT|
  1555. SCLK_CNTL__VIP_MAX_DYN_STOP_LAT |
  1556. SCLK_CNTL__RE_MAX_DYN_STOP_LAT |
  1557. SCLK_CNTL__PB_MAX_DYN_STOP_LAT |
  1558. SCLK_CNTL__TAM_MAX_DYN_STOP_LAT |
  1559. SCLK_CNTL__TDM_MAX_DYN_STOP_LAT |
  1560. SCLK_CNTL__RB_MAX_DYN_STOP_LAT;
  1561. OUTPLL(pllSCLK_CNTL, tmp);
  1562. OUTPLL(pllVCLK_ECP_CNTL, 0);
  1563. OUTPLL(pllPIXCLKS_CNTL, 0);
  1564. OUTPLL(pllMCLK_MISC,
  1565. MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT |
  1566. MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT);
  1567. mdelay(5);
  1568. /* Restore the M_SPLL_REF_FB_DIV, MPLL_AUX_CNTL and SPLL_AUX_CNTL values */
  1569. OUTPLL(pllM_SPLL_REF_FB_DIV, rinfo->save_regs[77]);
  1570. OUTPLL(pllMPLL_AUX_CNTL, rinfo->save_regs[75]);
  1571. OUTPLL(pllSPLL_AUX_CNTL, rinfo->save_regs[76]);
  1572. /* Now restore the major PLLs settings, keeping them off & reset though */
  1573. OUTPLL(pllPPLL_CNTL, rinfo->save_regs[93] | 0x3);
  1574. OUTPLL(pllP2PLL_CNTL, rinfo->save_regs[8] | 0x3);
  1575. OUTPLL(pllMPLL_CNTL, rinfo->save_regs[73] | 0x03);
  1576. OUTPLL(pllSPLL_CNTL, rinfo->save_regs[74] | 0x03);
  1577. /* Restore MC DLL state and switch it off/reset too */
  1578. OUTMC(rinfo, ixR300_MC_DLL_CNTL, rinfo->save_regs[70]);
  1579. /* Switch MDLL off & reset */
  1580. OUTPLL(pllMDLL_RDCKA, rinfo->save_regs[98] | 0xff);
  1581. mdelay(5);
  1582. /* Setup some black magic bits in PLL_PWRMGT_CNTL. Hrm... we saved
  1583. * 0xa1100007... and MacOS writes 0xa1000007 ..
  1584. */
  1585. OUTPLL(pllPLL_PWRMGT_CNTL, rinfo->save_regs[0]);
  1586. /* Restore more stuffs */
  1587. OUTPLL(pllHTOTAL_CNTL, 0);
  1588. OUTPLL(pllHTOTAL2_CNTL, 0);
  1589. /* More PLL initial configuration */
  1590. tmp = INPLL(pllSCLK_CNTL2); /* What for ? */
  1591. OUTPLL(pllSCLK_CNTL2, tmp);
  1592. tmp = INPLL(pllSCLK_MORE_CNTL);
  1593. tmp |= SCLK_MORE_CNTL__FORCE_DISPREGS | /* a guess */
  1594. SCLK_MORE_CNTL__FORCE_MC_GUI |
  1595. SCLK_MORE_CNTL__FORCE_MC_HOST;
  1596. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  1597. /* Now we actually start MCLK and SCLK */
  1598. radeon_pm_start_mclk_sclk(rinfo);
  1599. /* Full reset sdrams, this also re-inits the MDLL */
  1600. radeon_pm_full_reset_sdram(rinfo);
  1601. /* Fill palettes */
  1602. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | 0x20);
  1603. for (i=0; i<256; i++)
  1604. OUTREG(PALETTE_30_DATA, 0x15555555);
  1605. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~20);
  1606. udelay(20);
  1607. for (i=0; i<256; i++)
  1608. OUTREG(PALETTE_30_DATA, 0x15555555);
  1609. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~0x20);
  1610. mdelay(3);
  1611. /* Restore TMDS */
  1612. OUTREG(FP_GEN_CNTL, rinfo->save_regs[82]);
  1613. OUTREG(FP2_GEN_CNTL, rinfo->save_regs[83]);
  1614. /* Set LVDS registers but keep interface & pll down */
  1615. OUTREG(LVDS_GEN_CNTL, rinfo->save_regs[11] &
  1616. ~(LVDS_EN | LVDS_ON | LVDS_DIGON | LVDS_BLON | LVDS_BL_MOD_EN));
  1617. OUTREG(LVDS_PLL_CNTL, (rinfo->save_regs[12] & ~0xf0000) | 0x20000);
  1618. OUTREG(DISP_OUTPUT_CNTL, rinfo->save_regs[86]);
  1619. /* Restore GPIOPAD state */
  1620. OUTREG(GPIOPAD_A, rinfo->save_regs[19]);
  1621. OUTREG(GPIOPAD_EN, rinfo->save_regs[20]);
  1622. OUTREG(GPIOPAD_MASK, rinfo->save_regs[21]);
  1623. /* write some stuff to the framebuffer... */
  1624. for (i = 0; i < 0x8000; ++i)
  1625. writeb(0, rinfo->fb_base + i);
  1626. mdelay(40);
  1627. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) | LVDS_DIGON | LVDS_ON);
  1628. mdelay(40);
  1629. /* Restore a few more things */
  1630. OUTREG(GRPH_BUFFER_CNTL, rinfo->save_regs[94]);
  1631. OUTREG(GRPH2_BUFFER_CNTL, rinfo->save_regs[95]);
  1632. /* Take care of spread spectrum & PPLLs now */
  1633. radeon_pm_m10_disable_spread_spectrum(rinfo);
  1634. radeon_pm_restore_pixel_pll(rinfo);
  1635. /* GRRRR... I can't figure out the proper LVDS power sequence, and the
  1636. * code I have for blank/unblank doesn't quite work on some laptop models
  1637. * it seems ... Hrm. What I have here works most of the time ...
  1638. */
  1639. radeon_pm_m10_enable_lvds_spread_spectrum(rinfo);
  1640. }
  1641. #endif
  1642. #ifdef CONFIG_PPC
  1643. #ifdef CONFIG_PPC_PMAC
  1644. static void radeon_pm_m9p_reconfigure_mc(struct radeonfb_info *rinfo)
  1645. {
  1646. OUTREG(MC_CNTL, rinfo->save_regs[46]);
  1647. OUTREG(MC_INIT_GFX_LAT_TIMER, rinfo->save_regs[47]);
  1648. OUTREG(MC_INIT_MISC_LAT_TIMER, rinfo->save_regs[48]);
  1649. OUTREG(MEM_SDRAM_MODE_REG,
  1650. rinfo->save_regs[35] & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
  1651. OUTREG(MC_TIMING_CNTL, rinfo->save_regs[49]);
  1652. OUTREG(MC_READ_CNTL_AB, rinfo->save_regs[50]);
  1653. OUTREG(MEM_REFRESH_CNTL, rinfo->save_regs[42]);
  1654. OUTREG(MC_IOPAD_CNTL, rinfo->save_regs[51]);
  1655. OUTREG(MC_DEBUG, rinfo->save_regs[53]);
  1656. OUTREG(MC_CHIP_IO_OE_CNTL_AB, rinfo->save_regs[52]);
  1657. OUTMC(rinfo, ixMC_IMP_CNTL, rinfo->save_regs[59] /*0x00f460d6*/);
  1658. OUTMC(rinfo, ixMC_CHP_IO_CNTL_A0, rinfo->save_regs[65] /*0xfecfa666*/);
  1659. OUTMC(rinfo, ixMC_CHP_IO_CNTL_A1, rinfo->save_regs[66] /*0x141555ff*/);
  1660. OUTMC(rinfo, ixMC_CHP_IO_CNTL_B0, rinfo->save_regs[67] /*0xfecfa666*/);
  1661. OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, rinfo->save_regs[68] /*0x141555ff*/);
  1662. OUTMC(rinfo, ixMC_IMP_CNTL_0, rinfo->save_regs[71] /*0x00009249*/);
  1663. OUTREG(MC_IND_INDEX, 0);
  1664. OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
  1665. mdelay(20);
  1666. }
  1667. static void radeon_reinitialize_M9P(struct radeonfb_info *rinfo)
  1668. {
  1669. u32 tmp, i;
  1670. /* Restore a bunch of registers first */
  1671. OUTREG(SURFACE_CNTL, rinfo->save_regs[29]);
  1672. OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
  1673. OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
  1674. OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
  1675. OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
  1676. OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]);
  1677. OUTREG(BUS_CNTL, rinfo->save_regs[36]);
  1678. OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
  1679. OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]);
  1680. OUTREG(FCP_CNTL, rinfo->save_regs[38]);
  1681. OUTREG(RBBM_CNTL, rinfo->save_regs[39]);
  1682. OUTREG(DAC_CNTL, rinfo->save_regs[40]);
  1683. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | DAC2_EXPAND_MODE);
  1684. /* Reset the PAD CTLR */
  1685. radeon_pm_reset_pad_ctlr_strength(rinfo);
  1686. /* Some PLLs are Read & written identically in the trace here...
  1687. * I suppose it's actually to switch them all off & reset,
  1688. * let's assume off is what we want. I'm just doing that for all major PLLs now.
  1689. */
  1690. radeon_pm_all_ppls_off(rinfo);
  1691. /* Clear tiling, reset swappers */
  1692. INREG(SURFACE_CNTL);
  1693. OUTREG(SURFACE_CNTL, 0);
  1694. /* Some black magic with TV_DAC_CNTL, we should restore those from backups
  1695. * rather than hard coding...
  1696. */
  1697. tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_BGADJ_MASK;
  1698. tmp |= 6 << TV_DAC_CNTL_BGADJ__SHIFT;
  1699. OUTREG(TV_DAC_CNTL, tmp);
  1700. tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_DACADJ_MASK;
  1701. tmp |= 6 << TV_DAC_CNTL_DACADJ__SHIFT;
  1702. OUTREG(TV_DAC_CNTL, tmp);
  1703. OUTPLL(pllAGP_PLL_CNTL, rinfo->save_regs[78]);
  1704. OUTREG(PAMAC0_DLY_CNTL, rinfo->save_regs[54]);
  1705. OUTREG(PAMAC1_DLY_CNTL, rinfo->save_regs[55]);
  1706. OUTREG(PAMAC2_DLY_CNTL, rinfo->save_regs[79]);
  1707. OUTREG(AGP_CNTL, rinfo->save_regs[16]);
  1708. OUTREG(HOST_PATH_CNTL, rinfo->save_regs[41]); /* MacOS sets that to 0 !!! */
  1709. OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
  1710. tmp = rinfo->save_regs[1]
  1711. & ~(CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK |
  1712. CLK_PWRMGT_CNTL__MC_BUSY);
  1713. OUTPLL(pllCLK_PWRMGT_CNTL, tmp);
  1714. OUTREG(FW_CNTL, rinfo->save_regs[57]);
  1715. /* Disable SDRAM refresh */
  1716. OUTREG(MEM_REFRESH_CNTL, INREG(MEM_REFRESH_CNTL)
  1717. | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
  1718. /* Restore XTALIN routing (CLK_PIN_CNTL) */
  1719. OUTPLL(pllCLK_PIN_CNTL, rinfo->save_regs[4]);
  1720. /* Force MCLK to be PCI sourced and forced ON */
  1721. tmp = rinfo->save_regs[2] & 0xff000000;
  1722. tmp |= MCLK_CNTL__FORCE_MCLKA |
  1723. MCLK_CNTL__FORCE_MCLKB |
  1724. MCLK_CNTL__FORCE_YCLKA |
  1725. MCLK_CNTL__FORCE_YCLKB |
  1726. MCLK_CNTL__FORCE_MC |
  1727. MCLK_CNTL__FORCE_AIC;
  1728. OUTPLL(pllMCLK_CNTL, tmp);
  1729. /* Force SCLK to be PCI sourced with a bunch forced */
  1730. tmp = 0 |
  1731. SCLK_CNTL__FORCE_DISP2|
  1732. SCLK_CNTL__FORCE_CP|
  1733. SCLK_CNTL__FORCE_HDP|
  1734. SCLK_CNTL__FORCE_DISP1|
  1735. SCLK_CNTL__FORCE_TOP|
  1736. SCLK_CNTL__FORCE_E2|
  1737. SCLK_CNTL__FORCE_SE|
  1738. SCLK_CNTL__FORCE_IDCT|
  1739. SCLK_CNTL__FORCE_VIP|
  1740. SCLK_CNTL__FORCE_RE|
  1741. SCLK_CNTL__FORCE_PB|
  1742. SCLK_CNTL__FORCE_TAM|
  1743. SCLK_CNTL__FORCE_TDM|
  1744. SCLK_CNTL__FORCE_RB;
  1745. OUTPLL(pllSCLK_CNTL, tmp);
  1746. /* Clear VCLK_ECP_CNTL & PIXCLKS_CNTL */
  1747. OUTPLL(pllVCLK_ECP_CNTL, 0);
  1748. OUTPLL(pllPIXCLKS_CNTL, 0);
  1749. /* Setup MCLK_MISC, non dynamic mode */
  1750. OUTPLL(pllMCLK_MISC,
  1751. MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT |
  1752. MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT);
  1753. mdelay(5);
  1754. /* Set back the default clock dividers */
  1755. OUTPLL(pllM_SPLL_REF_FB_DIV, rinfo->save_regs[77]);
  1756. OUTPLL(pllMPLL_AUX_CNTL, rinfo->save_regs[75]);
  1757. OUTPLL(pllSPLL_AUX_CNTL, rinfo->save_regs[76]);
  1758. /* PPLL and P2PLL default values & off */
  1759. OUTPLL(pllPPLL_CNTL, rinfo->save_regs[93] | 0x3);
  1760. OUTPLL(pllP2PLL_CNTL, rinfo->save_regs[8] | 0x3);
  1761. /* S and M PLLs are reset & off, configure them */
  1762. OUTPLL(pllMPLL_CNTL, rinfo->save_regs[73] | 0x03);
  1763. OUTPLL(pllSPLL_CNTL, rinfo->save_regs[74] | 0x03);
  1764. /* Default values for MDLL ... fixme */
  1765. OUTPLL(pllMDLL_CKO, 0x9c009c);
  1766. OUTPLL(pllMDLL_RDCKA, 0x08830883);
  1767. OUTPLL(pllMDLL_RDCKB, 0x08830883);
  1768. mdelay(5);
  1769. /* Restore PLL_PWRMGT_CNTL */ // XXXX
  1770. tmp = rinfo->save_regs[0];
  1771. tmp &= ~PLL_PWRMGT_CNTL_SU_SCLK_USE_BCLK;
  1772. tmp |= PLL_PWRMGT_CNTL_SU_MCLK_USE_BCLK;
  1773. OUTPLL(PLL_PWRMGT_CNTL, tmp);
  1774. /* Clear HTOTAL_CNTL & HTOTAL2_CNTL */
  1775. OUTPLL(pllHTOTAL_CNTL, 0);
  1776. OUTPLL(pllHTOTAL2_CNTL, 0);
  1777. /* All outputs off */
  1778. OUTREG(CRTC_GEN_CNTL, 0x04000000);
  1779. OUTREG(CRTC2_GEN_CNTL, 0x04000000);
  1780. OUTREG(FP_GEN_CNTL, 0x00004008);
  1781. OUTREG(FP2_GEN_CNTL, 0x00000008);
  1782. OUTREG(LVDS_GEN_CNTL, 0x08000008);
  1783. /* Restore Memory Controller configuration */
  1784. radeon_pm_m9p_reconfigure_mc(rinfo);
  1785. /* Now we actually start MCLK and SCLK */
  1786. radeon_pm_start_mclk_sclk(rinfo);
  1787. /* Full reset sdrams, this also re-inits the MDLL */
  1788. radeon_pm_full_reset_sdram(rinfo);
  1789. /* Fill palettes */
  1790. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | 0x20);
  1791. for (i=0; i<256; i++)
  1792. OUTREG(PALETTE_30_DATA, 0x15555555);
  1793. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~20);
  1794. udelay(20);
  1795. for (i=0; i<256; i++)
  1796. OUTREG(PALETTE_30_DATA, 0x15555555);
  1797. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~0x20);
  1798. mdelay(3);
  1799. /* Restore TV stuff, make sure TV DAC is down */
  1800. OUTREG(TV_MASTER_CNTL, rinfo->save_regs[88]);
  1801. OUTREG(TV_DAC_CNTL, rinfo->save_regs[13] | 0x07000000);
  1802. /* Restore GPIOS. MacOS does some magic here with one of the GPIO bits,
  1803. * possibly related to the weird PLL related workarounds and to the
  1804. * fact that CLK_PIN_CNTL is tweaked in ways I don't fully understand,
  1805. * but we keep things the simple way here
  1806. */
  1807. OUTREG(GPIOPAD_A, rinfo->save_regs[19]);
  1808. OUTREG(GPIOPAD_EN, rinfo->save_regs[20]);
  1809. OUTREG(GPIOPAD_MASK, rinfo->save_regs[21]);
  1810. /* Now do things with SCLK_MORE_CNTL. Force bits are already set, copy
  1811. * high bits from backup
  1812. */
  1813. tmp = INPLL(pllSCLK_MORE_CNTL) & 0x0000ffff;
  1814. tmp |= rinfo->save_regs[34] & 0xffff0000;
  1815. tmp |= SCLK_MORE_CNTL__FORCE_DISPREGS;
  1816. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  1817. tmp = INPLL(pllSCLK_MORE_CNTL) & 0x0000ffff;
  1818. tmp |= rinfo->save_regs[34] & 0xffff0000;
  1819. tmp |= SCLK_MORE_CNTL__FORCE_DISPREGS;
  1820. OUTPLL(pllSCLK_MORE_CNTL, tmp);
  1821. OUTREG(LVDS_GEN_CNTL, rinfo->save_regs[11] &
  1822. ~(LVDS_EN | LVDS_ON | LVDS_DIGON | LVDS_BLON | LVDS_BL_MOD_EN));
  1823. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) | LVDS_BLON);
  1824. OUTREG(LVDS_PLL_CNTL, (rinfo->save_regs[12] & ~0xf0000) | 0x20000);
  1825. mdelay(20);
  1826. /* write some stuff to the framebuffer... */
  1827. for (i = 0; i < 0x8000; ++i)
  1828. writeb(0, rinfo->fb_base + i);
  1829. OUTREG(0x2ec, 0x6332a020);
  1830. OUTPLL(pllSSPLL_REF_DIV, rinfo->save_regs[44] /*0x3f */);
  1831. OUTPLL(pllSSPLL_DIV_0, rinfo->save_regs[45] /*0x000081bb */);
  1832. tmp = INPLL(pllSSPLL_CNTL);
  1833. tmp &= ~2;
  1834. OUTPLL(pllSSPLL_CNTL, tmp);
  1835. mdelay(6);
  1836. tmp &= ~1;
  1837. OUTPLL(pllSSPLL_CNTL, tmp);
  1838. mdelay(5);
  1839. tmp |= 3;
  1840. OUTPLL(pllSSPLL_CNTL, tmp);
  1841. mdelay(5);
  1842. OUTPLL(pllSS_INT_CNTL, rinfo->save_regs[90] & ~3);/*0x0020300c*/
  1843. OUTREG(0x2ec, 0x6332a3f0);
  1844. mdelay(17);
  1845. OUTPLL(pllPPLL_REF_DIV, rinfo->pll.ref_div);
  1846. OUTPLL(pllPPLL_DIV_0, rinfo->save_regs[92]);
  1847. mdelay(40);
  1848. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) | LVDS_DIGON | LVDS_ON);
  1849. mdelay(40);
  1850. /* Restore a few more things */
  1851. OUTREG(GRPH_BUFFER_CNTL, rinfo->save_regs[94]);
  1852. OUTREG(GRPH2_BUFFER_CNTL, rinfo->save_regs[95]);
  1853. /* Restore PPLL, spread spectrum & LVDS */
  1854. radeon_pm_m10_disable_spread_spectrum(rinfo);
  1855. radeon_pm_restore_pixel_pll(rinfo);
  1856. radeon_pm_m10_enable_lvds_spread_spectrum(rinfo);
  1857. }
  1858. #endif
  1859. #endif
  1860. #if 0 /* Not ready yet */
  1861. static void radeon_reinitialize_QW(struct radeonfb_info *rinfo)
  1862. {
  1863. int i;
  1864. u32 tmp, tmp2;
  1865. u32 cko, cka, ckb;
  1866. u32 cgc, cec, c2gc;
  1867. OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
  1868. OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
  1869. OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
  1870. OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
  1871. OUTREG(BUS_CNTL, rinfo->save_regs[36]);
  1872. OUTREG(RBBM_CNTL, rinfo->save_regs[39]);
  1873. INREG(PAD_CTLR_STRENGTH);
  1874. OUTREG(PAD_CTLR_STRENGTH, INREG(PAD_CTLR_STRENGTH) & ~0x10000);
  1875. for (i = 0; i < 65; ++i) {
  1876. mdelay(1);
  1877. INREG(PAD_CTLR_STRENGTH);
  1878. }
  1879. OUTREG(DISP_TEST_DEBUG_CNTL, INREG(DISP_TEST_DEBUG_CNTL) | 0x10000000);
  1880. OUTREG(OV0_FLAG_CNTRL, INREG(OV0_FLAG_CNTRL) | 0x100);
  1881. OUTREG(CRTC_GEN_CNTL, INREG(CRTC_GEN_CNTL));
  1882. OUTREG(DAC_CNTL, 0xff00410a);
  1883. OUTREG(CRTC2_GEN_CNTL, INREG(CRTC2_GEN_CNTL));
  1884. OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | 0x4000);
  1885. OUTREG(SURFACE_CNTL, rinfo->save_regs[29]);
  1886. OUTREG(AGP_CNTL, rinfo->save_regs[16]);
  1887. OUTREG(HOST_PATH_CNTL, rinfo->save_regs[41]);
  1888. OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
  1889. OUTMC(rinfo, ixMC_CHP_IO_CNTL_A0, 0xf7bb4433);
  1890. OUTREG(MC_IND_INDEX, 0);
  1891. OUTMC(rinfo, ixMC_CHP_IO_CNTL_B0, 0xf7bb4433);
  1892. OUTREG(MC_IND_INDEX, 0);
  1893. OUTREG(CRTC_MORE_CNTL, INREG(CRTC_MORE_CNTL));
  1894. tmp = INPLL(pllVCLK_ECP_CNTL);
  1895. OUTPLL(pllVCLK_ECP_CNTL, tmp);
  1896. tmp = INPLL(pllPIXCLKS_CNTL);
  1897. OUTPLL(pllPIXCLKS_CNTL, tmp);
  1898. OUTPLL(MCLK_CNTL, 0xaa3f0000);
  1899. OUTPLL(SCLK_CNTL, 0xffff0000);
  1900. OUTPLL(pllMPLL_AUX_CNTL, 6);
  1901. OUTPLL(pllSPLL_AUX_CNTL, 1);
  1902. OUTPLL(MDLL_CKO, 0x9f009f);
  1903. OUTPLL(MDLL_RDCKA, 0x830083);
  1904. OUTPLL(pllMDLL_RDCKB, 0x830083);
  1905. OUTPLL(PPLL_CNTL, 0xa433);
  1906. OUTPLL(P2PLL_CNTL, 0xa433);
  1907. OUTPLL(MPLL_CNTL, 0x0400a403);
  1908. OUTPLL(SPLL_CNTL, 0x0400a433);
  1909. tmp = INPLL(M_SPLL_REF_FB_DIV);
  1910. OUTPLL(M_SPLL_REF_FB_DIV, tmp);
  1911. tmp = INPLL(M_SPLL_REF_FB_DIV);
  1912. OUTPLL(M_SPLL_REF_FB_DIV, tmp | 0xc);
  1913. INPLL(M_SPLL_REF_FB_DIV);
  1914. tmp = INPLL(MPLL_CNTL);
  1915. OUTREG8(CLOCK_CNTL_INDEX, MPLL_CNTL + PLL_WR_EN);
  1916. radeon_pll_errata_after_index(rinfo);
  1917. OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
  1918. radeon_pll_errata_after_data(rinfo);
  1919. tmp = INPLL(M_SPLL_REF_FB_DIV);
  1920. OUTPLL(M_SPLL_REF_FB_DIV, tmp | 0x5900);
  1921. tmp = INPLL(MPLL_CNTL);
  1922. OUTPLL(MPLL_CNTL, tmp & ~0x2);
  1923. mdelay(1);
  1924. tmp = INPLL(MPLL_CNTL);
  1925. OUTPLL(MPLL_CNTL, tmp & ~0x1);
  1926. mdelay(10);
  1927. OUTPLL(MCLK_CNTL, 0xaa3f1212);
  1928. mdelay(1);
  1929. INPLL(M_SPLL_REF_FB_DIV);
  1930. INPLL(MCLK_CNTL);
  1931. INPLL(M_SPLL_REF_FB_DIV);
  1932. tmp = INPLL(SPLL_CNTL);
  1933. OUTREG8(CLOCK_CNTL_INDEX, SPLL_CNTL + PLL_WR_EN);
  1934. radeon_pll_errata_after_index(rinfo);
  1935. OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
  1936. radeon_pll_errata_after_data(rinfo);
  1937. tmp = INPLL(M_SPLL_REF_FB_DIV);
  1938. OUTPLL(M_SPLL_REF_FB_DIV, tmp | 0x780000);
  1939. tmp = INPLL(SPLL_CNTL);
  1940. OUTPLL(SPLL_CNTL, tmp & ~0x1);
  1941. mdelay(1);
  1942. tmp = INPLL(SPLL_CNTL);
  1943. OUTPLL(SPLL_CNTL, tmp & ~0x2);
  1944. mdelay(10);
  1945. tmp = INPLL(SCLK_CNTL);
  1946. OUTPLL(SCLK_CNTL, tmp | 2);
  1947. mdelay(1);
  1948. cko = INPLL(pllMDLL_CKO);
  1949. cka = INPLL(pllMDLL_RDCKA);
  1950. ckb = INPLL(pllMDLL_RDCKB);
  1951. cko &= ~(MDLL_CKO__MCKOA_SLEEP | MDLL_CKO__MCKOB_SLEEP);
  1952. OUTPLL(pllMDLL_CKO, cko);
  1953. mdelay(1);
  1954. cko &= ~(MDLL_CKO__MCKOA_RESET | MDLL_CKO__MCKOB_RESET);
  1955. OUTPLL(pllMDLL_CKO, cko);
  1956. mdelay(5);
  1957. cka &= ~(MDLL_RDCKA__MRDCKA0_SLEEP | MDLL_RDCKA__MRDCKA1_SLEEP);
  1958. OUTPLL(pllMDLL_RDCKA, cka);
  1959. mdelay(1);
  1960. cka &= ~(MDLL_RDCKA__MRDCKA0_RESET | MDLL_RDCKA__MRDCKA1_RESET);
  1961. OUTPLL(pllMDLL_RDCKA, cka);
  1962. mdelay(5);
  1963. ckb &= ~(MDLL_RDCKB__MRDCKB0_SLEEP | MDLL_RDCKB__MRDCKB1_SLEEP);
  1964. OUTPLL(pllMDLL_RDCKB, ckb);
  1965. mdelay(1);
  1966. ckb &= ~(MDLL_RDCKB__MRDCKB0_RESET | MDLL_RDCKB__MRDCKB1_RESET);
  1967. OUTPLL(pllMDLL_RDCKB, ckb);
  1968. mdelay(5);
  1969. OUTMC(rinfo, ixMC_CHP_IO_CNTL_A1, 0x151550ff);
  1970. OUTREG(MC_IND_INDEX, 0);
  1971. OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, 0x151550ff);
  1972. OUTREG(MC_IND_INDEX, 0);
  1973. mdelay(1);
  1974. OUTMC(rinfo, ixMC_CHP_IO_CNTL_A1, 0x141550ff);
  1975. OUTREG(MC_IND_INDEX, 0);
  1976. OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, 0x141550ff);
  1977. OUTREG(MC_IND_INDEX, 0);
  1978. mdelay(1);
  1979. OUTPLL(pllHTOTAL_CNTL, 0);
  1980. OUTPLL(pllHTOTAL2_CNTL, 0);
  1981. OUTREG(MEM_CNTL, 0x29002901);
  1982. OUTREG(MEM_SDRAM_MODE_REG, 0x45320032); /* XXX use save_regs[35]? */
  1983. OUTREG(EXT_MEM_CNTL, 0x1a394333);
  1984. OUTREG(MEM_IO_CNTL_A1, 0x0aac0aac);
  1985. OUTREG(MEM_INIT_LATENCY_TIMER, 0x34444444);
  1986. OUTREG(MEM_REFRESH_CNTL, 0x1f1f7218); /* XXX or save_regs[42]? */
  1987. OUTREG(MC_DEBUG, 0);
  1988. OUTREG(MEM_IO_OE_CNTL, 0x04300430);
  1989. OUTMC(rinfo, ixMC_IMP_CNTL, 0x00f460d6);
  1990. OUTREG(MC_IND_INDEX, 0);
  1991. OUTMC(rinfo, ixMC_IMP_CNTL_0, 0x00009249);
  1992. OUTREG(MC_IND_INDEX, 0);
  1993. OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
  1994. radeon_pm_full_reset_sdram(rinfo);
  1995. INREG(FP_GEN_CNTL);
  1996. OUTREG(TMDS_CNTL, 0x01000000); /* XXX ? */
  1997. tmp = INREG(FP_GEN_CNTL);
  1998. tmp |= FP_CRTC_DONT_SHADOW_HEND | FP_CRTC_DONT_SHADOW_VPAR | 0x200;
  1999. OUTREG(FP_GEN_CNTL, tmp);
  2000. tmp = INREG(DISP_OUTPUT_CNTL);
  2001. tmp &= ~0x400;
  2002. OUTREG(DISP_OUTPUT_CNTL, tmp);
  2003. OUTPLL(CLK_PIN_CNTL, rinfo->save_regs[4]);
  2004. OUTPLL(CLK_PWRMGT_CNTL, rinfo->save_regs[1]);
  2005. OUTPLL(PLL_PWRMGT_CNTL, rinfo->save_regs[0]);
  2006. tmp = INPLL(MCLK_MISC);
  2007. tmp |= MCLK_MISC__MC_MCLK_DYN_ENABLE | MCLK_MISC__IO_MCLK_DYN_ENABLE;
  2008. OUTPLL(MCLK_MISC, tmp);
  2009. tmp = INPLL(SCLK_CNTL);
  2010. OUTPLL(SCLK_CNTL, tmp);
  2011. OUTREG(CRTC_MORE_CNTL, 0);
  2012. OUTREG8(CRTC_GEN_CNTL+1, 6);
  2013. OUTREG8(CRTC_GEN_CNTL+3, 1);
  2014. OUTREG(CRTC_PITCH, 32);
  2015. tmp = INPLL(VCLK_ECP_CNTL);
  2016. OUTPLL(VCLK_ECP_CNTL, tmp);
  2017. tmp = INPLL(PPLL_CNTL);
  2018. OUTPLL(PPLL_CNTL, tmp);
  2019. /* palette stuff and BIOS_1_SCRATCH... */
  2020. tmp = INREG(FP_GEN_CNTL);
  2021. tmp2 = INREG(TMDS_TRANSMITTER_CNTL);
  2022. tmp |= 2;
  2023. OUTREG(FP_GEN_CNTL, tmp);
  2024. mdelay(5);
  2025. OUTREG(FP_GEN_CNTL, tmp);
  2026. mdelay(5);
  2027. OUTREG(TMDS_TRANSMITTER_CNTL, tmp2);
  2028. OUTREG(CRTC_MORE_CNTL, 0);
  2029. mdelay(20);
  2030. tmp = INREG(CRTC_MORE_CNTL);
  2031. OUTREG(CRTC_MORE_CNTL, tmp);
  2032. cgc = INREG(CRTC_GEN_CNTL);
  2033. cec = INREG(CRTC_EXT_CNTL);
  2034. c2gc = INREG(CRTC2_GEN_CNTL);
  2035. OUTREG(CRTC_H_SYNC_STRT_WID, 0x008e0580);
  2036. OUTREG(CRTC_H_TOTAL_DISP, 0x009f00d2);
  2037. OUTREG8(CLOCK_CNTL_INDEX, HTOTAL_CNTL + PLL_WR_EN);
  2038. radeon_pll_errata_after_index(rinfo);
  2039. OUTREG8(CLOCK_CNTL_DATA, 0);
  2040. radeon_pll_errata_after_data(rinfo);
  2041. OUTREG(CRTC_V_SYNC_STRT_WID, 0x00830403);
  2042. OUTREG(CRTC_V_TOTAL_DISP, 0x03ff0429);
  2043. OUTREG(FP_CRTC_H_TOTAL_DISP, 0x009f0033);
  2044. OUTREG(FP_H_SYNC_STRT_WID, 0x008e0080);
  2045. OUTREG(CRT_CRTC_H_SYNC_STRT_WID, 0x008e0080);
  2046. OUTREG(FP_CRTC_V_TOTAL_DISP, 0x03ff002a);
  2047. OUTREG(FP_V_SYNC_STRT_WID, 0x00830004);
  2048. OUTREG(CRT_CRTC_V_SYNC_STRT_WID, 0x00830004);
  2049. OUTREG(FP_HORZ_VERT_ACTIVE, 0x009f03ff);
  2050. OUTREG(FP_HORZ_STRETCH, 0);
  2051. OUTREG(FP_VERT_STRETCH, 0);
  2052. OUTREG(OVR_CLR, 0);
  2053. OUTREG(OVR_WID_LEFT_RIGHT, 0);
  2054. OUTREG(OVR_WID_TOP_BOTTOM, 0);
  2055. tmp = INPLL(PPLL_REF_DIV);
  2056. tmp = (tmp & ~PPLL_REF_DIV_MASK) | rinfo->pll.ref_div;
  2057. OUTPLL(PPLL_REF_DIV, tmp);
  2058. INPLL(PPLL_REF_DIV);
  2059. OUTREG8(CLOCK_CNTL_INDEX, PPLL_CNTL + PLL_WR_EN);
  2060. radeon_pll_errata_after_index(rinfo);
  2061. OUTREG8(CLOCK_CNTL_DATA + 1, 0xbc);
  2062. radeon_pll_errata_after_data(rinfo);
  2063. tmp = INREG(CLOCK_CNTL_INDEX);
  2064. radeon_pll_errata_after_index(rinfo);
  2065. OUTREG(CLOCK_CNTL_INDEX, tmp & 0xff);
  2066. radeon_pll_errata_after_index(rinfo);
  2067. radeon_pll_errata_after_data(rinfo);
  2068. OUTPLL(PPLL_DIV_0, 0x48090);
  2069. tmp = INPLL(PPLL_CNTL);
  2070. OUTPLL(PPLL_CNTL, tmp & ~0x2);
  2071. mdelay(1);
  2072. tmp = INPLL(PPLL_CNTL);
  2073. OUTPLL(PPLL_CNTL, tmp & ~0x1);
  2074. mdelay(10);
  2075. tmp = INPLL(VCLK_ECP_CNTL);
  2076. OUTPLL(VCLK_ECP_CNTL, tmp | 3);
  2077. mdelay(1);
  2078. tmp = INPLL(VCLK_ECP_CNTL);
  2079. OUTPLL(VCLK_ECP_CNTL, tmp);
  2080. c2gc |= CRTC2_DISP_REQ_EN_B;
  2081. OUTREG(CRTC2_GEN_CNTL, c2gc);
  2082. cgc |= CRTC_EN;
  2083. OUTREG(CRTC_GEN_CNTL, cgc);
  2084. OUTREG(CRTC_EXT_CNTL, cec);
  2085. OUTREG(CRTC_PITCH, 0xa0);
  2086. OUTREG(CRTC_OFFSET, 0);
  2087. OUTREG(CRTC_OFFSET_CNTL, 0);
  2088. OUTREG(GRPH_BUFFER_CNTL, 0x20117c7c);
  2089. OUTREG(GRPH2_BUFFER_CNTL, 0x00205c5c);
  2090. tmp2 = INREG(FP_GEN_CNTL);
  2091. tmp = INREG(TMDS_TRANSMITTER_CNTL);
  2092. OUTREG(0x2a8, 0x0000061b);
  2093. tmp |= TMDS_PLL_EN;
  2094. OUTREG(TMDS_TRANSMITTER_CNTL, tmp);
  2095. mdelay(1);
  2096. tmp &= ~TMDS_PLLRST;
  2097. OUTREG(TMDS_TRANSMITTER_CNTL, tmp);
  2098. tmp2 &= ~2;
  2099. tmp2 |= FP_TMDS_EN;
  2100. OUTREG(FP_GEN_CNTL, tmp2);
  2101. mdelay(5);
  2102. tmp2 |= FP_FPON;
  2103. OUTREG(FP_GEN_CNTL, tmp2);
  2104. OUTREG(CUR_HORZ_VERT_OFF, CUR_LOCK | 1);
  2105. cgc = INREG(CRTC_GEN_CNTL);
  2106. OUTREG(CUR_HORZ_VERT_POSN, 0xbfff0fff);
  2107. cgc |= 0x10000;
  2108. OUTREG(CUR_OFFSET, 0);
  2109. }
  2110. #endif /* 0 */
  2111. #endif /* CONFIG_PPC */
  2112. static void radeonfb_whack_power_state(struct radeonfb_info *rinfo, pci_power_t state)
  2113. {
  2114. u16 pwr_cmd;
  2115. for (;;) {
  2116. pci_read_config_word(rinfo->pdev,
  2117. rinfo->pdev->pm_cap + PCI_PM_CTRL,
  2118. &pwr_cmd);
  2119. if (pwr_cmd & state)
  2120. break;
  2121. pwr_cmd = (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | state;
  2122. pci_write_config_word(rinfo->pdev,
  2123. rinfo->pdev->pm_cap + PCI_PM_CTRL,
  2124. pwr_cmd);
  2125. msleep(500);
  2126. }
  2127. rinfo->pdev->current_state = state;
  2128. }
  2129. static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend)
  2130. {
  2131. u32 tmp;
  2132. if (!rinfo->pdev->pm_cap)
  2133. return;
  2134. /* Set the chip into appropriate suspend mode (we use D2,
  2135. * D3 would require a compete re-initialization of the chip,
  2136. * including PCI config registers, clocks, AGP conf, ...)
  2137. */
  2138. if (suspend) {
  2139. printk(KERN_DEBUG "radeonfb (%s): switching to D2 state...\n",
  2140. pci_name(rinfo->pdev));
  2141. /* Disable dynamic power management of clocks for the
  2142. * duration of the suspend/resume process
  2143. */
  2144. radeon_pm_disable_dynamic_mode(rinfo);
  2145. /* Save some registers */
  2146. radeon_pm_save_regs(rinfo, 0);
  2147. /* Prepare mobility chips for suspend.
  2148. */
  2149. if (rinfo->is_mobility) {
  2150. /* Program V2CLK */
  2151. radeon_pm_program_v2clk(rinfo);
  2152. /* Disable IO PADs */
  2153. radeon_pm_disable_iopad(rinfo);
  2154. /* Set low current */
  2155. radeon_pm_low_current(rinfo);
  2156. /* Prepare chip for power management */
  2157. radeon_pm_setup_for_suspend(rinfo);
  2158. if (rinfo->family <= CHIP_FAMILY_RV280) {
  2159. /* Reset the MDLL */
  2160. /* because both INPLL and OUTPLL take the same
  2161. * lock, that's why. */
  2162. tmp = INPLL( pllMDLL_CKO) | MDLL_CKO__MCKOA_RESET
  2163. | MDLL_CKO__MCKOB_RESET;
  2164. OUTPLL( pllMDLL_CKO, tmp );
  2165. }
  2166. }
  2167. /* Switch PCI power management to D2. */
  2168. pci_disable_device(rinfo->pdev);
  2169. pci_save_state(rinfo->pdev);
  2170. /* The chip seems to need us to whack the PM register
  2171. * repeatedly until it sticks. We do that -prior- to
  2172. * calling pci_set_power_state()
  2173. */
  2174. radeonfb_whack_power_state(rinfo, PCI_D2);
  2175. __pci_complete_power_transition(rinfo->pdev, PCI_D2);
  2176. } else {
  2177. printk(KERN_DEBUG "radeonfb (%s): switching to D0 state...\n",
  2178. pci_name(rinfo->pdev));
  2179. if (rinfo->family <= CHIP_FAMILY_RV250) {
  2180. /* Reset the SDRAM controller */
  2181. radeon_pm_full_reset_sdram(rinfo);
  2182. /* Restore some registers */
  2183. radeon_pm_restore_regs(rinfo);
  2184. } else {
  2185. /* Restore registers first */
  2186. radeon_pm_restore_regs(rinfo);
  2187. /* init sdram controller */
  2188. radeon_pm_full_reset_sdram(rinfo);
  2189. }
  2190. }
  2191. }
  2192. int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
  2193. {
  2194. struct fb_info *info = pci_get_drvdata(pdev);
  2195. struct radeonfb_info *rinfo = info->par;
  2196. if (mesg.event == pdev->dev.power.power_state.event)
  2197. return 0;
  2198. printk(KERN_DEBUG "radeonfb (%s): suspending for event: %d...\n",
  2199. pci_name(pdev), mesg.event);
  2200. /* For suspend-to-disk, we cheat here. We don't suspend anything and
  2201. * let fbcon continue drawing until we are all set. That shouldn't
  2202. * really cause any problem at this point, provided that the wakeup
  2203. * code knows that any state in memory may not match the HW
  2204. */
  2205. switch (mesg.event) {
  2206. case PM_EVENT_FREEZE: /* about to take snapshot */
  2207. case PM_EVENT_PRETHAW: /* before restoring snapshot */
  2208. goto done;
  2209. }
  2210. console_lock();
  2211. fb_set_suspend(info, 1);
  2212. if (!(info->flags & FBINFO_HWACCEL_DISABLED)) {
  2213. /* Make sure engine is reset */
  2214. radeon_engine_idle();
  2215. radeonfb_engine_reset(rinfo);
  2216. radeon_engine_idle();
  2217. }
  2218. /* Blank display and LCD */
  2219. radeon_screen_blank(rinfo, FB_BLANK_POWERDOWN, 1);
  2220. /* Sleep */
  2221. rinfo->asleep = 1;
  2222. rinfo->lock_blank = 1;
  2223. del_timer_sync(&rinfo->lvds_timer);
  2224. #ifdef CONFIG_PPC_PMAC
  2225. /* On powermac, we have hooks to properly suspend/resume AGP now,
  2226. * use them here. We'll ultimately need some generic support here,
  2227. * but the generic code isn't quite ready for that yet
  2228. */
  2229. pmac_suspend_agp_for_card(pdev);
  2230. #endif /* CONFIG_PPC_PMAC */
  2231. /* It's unclear whether or when the generic code will do that, so let's
  2232. * do it ourselves. We save state before we do any power management
  2233. */
  2234. pci_save_state(pdev);
  2235. /* If we support wakeup from poweroff, we save all regs we can including cfg
  2236. * space
  2237. */
  2238. if (rinfo->pm_mode & radeon_pm_off) {
  2239. /* Always disable dynamic clocks or weird things are happening when
  2240. * the chip goes off (basically the panel doesn't shut down properly
  2241. * and we crash on wakeup),
  2242. * also, we want the saved regs context to have no dynamic clocks in
  2243. * it, we'll restore the dynamic clocks state on wakeup
  2244. */
  2245. radeon_pm_disable_dynamic_mode(rinfo);
  2246. mdelay(50);
  2247. radeon_pm_save_regs(rinfo, 1);
  2248. if (rinfo->is_mobility && !(rinfo->pm_mode & radeon_pm_d2)) {
  2249. /* Switch off LVDS interface */
  2250. mdelay(1);
  2251. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_BL_MOD_EN));
  2252. mdelay(1);
  2253. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_EN | LVDS_ON));
  2254. OUTREG(LVDS_PLL_CNTL, (INREG(LVDS_PLL_CNTL) & ~30000) | 0x20000);
  2255. mdelay(20);
  2256. OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_DIGON));
  2257. }
  2258. pci_disable_device(pdev);
  2259. }
  2260. /* If we support D2, we go to it (should be fixed later with a flag forcing
  2261. * D3 only for some laptops)
  2262. */
  2263. if (rinfo->pm_mode & radeon_pm_d2)
  2264. radeon_set_suspend(rinfo, 1);
  2265. console_unlock();
  2266. done:
  2267. pdev->dev.power.power_state = mesg;
  2268. return 0;
  2269. }
  2270. static int radeon_check_power_loss(struct radeonfb_info *rinfo)
  2271. {
  2272. return rinfo->save_regs[4] != INPLL(CLK_PIN_CNTL) ||
  2273. rinfo->save_regs[2] != INPLL(MCLK_CNTL) ||
  2274. rinfo->save_regs[3] != INPLL(SCLK_CNTL);
  2275. }
  2276. int radeonfb_pci_resume(struct pci_dev *pdev)
  2277. {
  2278. struct fb_info *info = pci_get_drvdata(pdev);
  2279. struct radeonfb_info *rinfo = info->par;
  2280. int rc = 0;
  2281. if (pdev->dev.power.power_state.event == PM_EVENT_ON)
  2282. return 0;
  2283. if (rinfo->no_schedule) {
  2284. if (!console_trylock())
  2285. return 0;
  2286. } else
  2287. console_lock();
  2288. printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
  2289. pci_name(pdev), pdev->dev.power.power_state.event);
  2290. /* PCI state will have been restored by the core, so
  2291. * we should be in D0 now with our config space fully
  2292. * restored
  2293. */
  2294. if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
  2295. /* Wakeup chip */
  2296. if ((rinfo->pm_mode & radeon_pm_off) && radeon_check_power_loss(rinfo)) {
  2297. if (rinfo->reinit_func != NULL)
  2298. rinfo->reinit_func(rinfo);
  2299. else {
  2300. printk(KERN_ERR "radeonfb (%s): can't resume radeon from"
  2301. " D3 cold, need softboot !", pci_name(pdev));
  2302. rc = -EIO;
  2303. goto bail;
  2304. }
  2305. }
  2306. /* If we support D2, try to resume... we should check what was our
  2307. * state though... (were we really in D2 state ?). Right now, this code
  2308. * is only enable on Macs so it's fine.
  2309. */
  2310. else if (rinfo->pm_mode & radeon_pm_d2)
  2311. radeon_set_suspend(rinfo, 0);
  2312. rinfo->asleep = 0;
  2313. } else
  2314. radeon_engine_idle();
  2315. /* Restore display & engine */
  2316. radeon_write_mode (rinfo, &rinfo->state, 1);
  2317. if (!(info->flags & FBINFO_HWACCEL_DISABLED))
  2318. radeonfb_engine_init (rinfo);
  2319. fb_pan_display(info, &info->var);
  2320. fb_set_cmap(&info->cmap, info);
  2321. /* Refresh */
  2322. fb_set_suspend(info, 0);
  2323. /* Unblank */
  2324. rinfo->lock_blank = 0;
  2325. radeon_screen_blank(rinfo, FB_BLANK_UNBLANK, 1);
  2326. #ifdef CONFIG_PPC_PMAC
  2327. /* On powermac, we have hooks to properly suspend/resume AGP now,
  2328. * use them here. We'll ultimately need some generic support here,
  2329. * but the generic code isn't quite ready for that yet
  2330. */
  2331. pmac_resume_agp_for_card(pdev);
  2332. #endif /* CONFIG_PPC_PMAC */
  2333. /* Check status of dynclk */
  2334. if (rinfo->dynclk == 1)
  2335. radeon_pm_enable_dynamic_mode(rinfo);
  2336. else if (rinfo->dynclk == 0)
  2337. radeon_pm_disable_dynamic_mode(rinfo);
  2338. pdev->dev.power.power_state = PMSG_ON;
  2339. bail:
  2340. console_unlock();
  2341. return rc;
  2342. }
  2343. #ifdef CONFIG_PPC__disabled
  2344. static void radeonfb_early_resume(void *data)
  2345. {
  2346. struct radeonfb_info *rinfo = data;
  2347. rinfo->no_schedule = 1;
  2348. pci_restore_state(rinfo->pdev);
  2349. radeonfb_pci_resume(rinfo->pdev);
  2350. rinfo->no_schedule = 0;
  2351. }
  2352. #endif /* CONFIG_PPC */
  2353. #endif /* CONFIG_PM */
  2354. void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep)
  2355. {
  2356. /* Enable/Disable dynamic clocks: TODO add sysfs access */
  2357. if (rinfo->family == CHIP_FAMILY_RS480)
  2358. rinfo->dynclk = -1;
  2359. else
  2360. rinfo->dynclk = dynclk;
  2361. if (rinfo->dynclk == 1) {
  2362. radeon_pm_enable_dynamic_mode(rinfo);
  2363. printk("radeonfb: Dynamic Clock Power Management enabled\n");
  2364. } else if (rinfo->dynclk == 0) {
  2365. radeon_pm_disable_dynamic_mode(rinfo);
  2366. printk("radeonfb: Dynamic Clock Power Management disabled\n");
  2367. }
  2368. #if defined(CONFIG_PM)
  2369. #if defined(CONFIG_PPC_PMAC)
  2370. /* Check if we can power manage on suspend/resume. We can do
  2371. * D2 on M6, M7 and M9, and we can resume from D3 cold a few other
  2372. * "Mac" cards, but that's all. We need more infos about what the
  2373. * BIOS does tho. Right now, all this PM stuff is pmac-only for that
  2374. * reason. --BenH
  2375. */
  2376. if (machine_is(powermac) && rinfo->of_node) {
  2377. if (rinfo->is_mobility && rinfo->pdev->pm_cap &&
  2378. rinfo->family <= CHIP_FAMILY_RV250)
  2379. rinfo->pm_mode |= radeon_pm_d2;
  2380. /* We can restart Jasper (M10 chip in albooks), BlueStone (7500 chip
  2381. * in some desktop G4s), Via (M9+ chip on iBook G4) and
  2382. * Snowy (M11 chip on iBook G4 manufactured after July 2005)
  2383. */
  2384. if (!strcmp(rinfo->of_node->name, "ATY,JasperParent") ||
  2385. !strcmp(rinfo->of_node->name, "ATY,SnowyParent")) {
  2386. rinfo->reinit_func = radeon_reinitialize_M10;
  2387. rinfo->pm_mode |= radeon_pm_off;
  2388. }
  2389. #if 0 /* Not ready yet */
  2390. if (!strcmp(rinfo->of_node->name, "ATY,BlueStoneParent")) {
  2391. rinfo->reinit_func = radeon_reinitialize_QW;
  2392. rinfo->pm_mode |= radeon_pm_off;
  2393. }
  2394. #endif
  2395. if (!strcmp(rinfo->of_node->name, "ATY,ViaParent")) {
  2396. rinfo->reinit_func = radeon_reinitialize_M9P;
  2397. rinfo->pm_mode |= radeon_pm_off;
  2398. }
  2399. /* If any of the above is set, we assume the machine can sleep/resume.
  2400. * It's a bit of a "shortcut" but will work fine. Ideally, we need infos
  2401. * from the platform about what happens to the chip...
  2402. * Now we tell the platform about our capability
  2403. */
  2404. if (rinfo->pm_mode != radeon_pm_none) {
  2405. pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, rinfo->of_node, 0, 1);
  2406. #if 0 /* Disable the early video resume hack for now as it's causing problems, among
  2407. * others we now rely on the PCI core restoring the config space for us, which
  2408. * isn't the case with that hack, and that code path causes various things to
  2409. * be called with interrupts off while they shouldn't. I'm leaving the code in
  2410. * as it can be useful for debugging purposes
  2411. */
  2412. pmac_set_early_video_resume(radeonfb_early_resume, rinfo);
  2413. #endif
  2414. }
  2415. #if 0
  2416. /* Power down TV DAC, that saves a significant amount of power,
  2417. * we'll have something better once we actually have some TVOut
  2418. * support
  2419. */
  2420. OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000);
  2421. #endif
  2422. }
  2423. #endif /* defined(CONFIG_PPC_PMAC) */
  2424. #endif /* defined(CONFIG_PM) */
  2425. if (ignore_devlist)
  2426. printk(KERN_DEBUG
  2427. "radeonfb: skipping test for device workarounds\n");
  2428. else
  2429. radeon_apply_workarounds(rinfo);
  2430. if (force_sleep) {
  2431. printk(KERN_DEBUG
  2432. "radeonfb: forcefully enabling D2 sleep mode\n");
  2433. rinfo->pm_mode |= radeon_pm_d2;
  2434. }
  2435. }
  2436. void radeonfb_pm_exit(struct radeonfb_info *rinfo)
  2437. {
  2438. #if defined(CONFIG_PM) && defined(CONFIG_PPC_PMAC)
  2439. if (rinfo->pm_mode != radeon_pm_none)
  2440. pmac_set_early_video_resume(NULL, NULL);
  2441. #endif
  2442. }