radeon_pm.c 87 KB

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