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