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)
40static void radeon_reinitialize_M10(struct radeonfb_info *rinfo);
41
42struct 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
58static 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
98static 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) */
121static 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
129static 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
330static 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
549static 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
555static u32 INMC(struct radeonfb_info *rinfo, u8 indx)
556{
557	OUTREG( MC_IND_INDEX, indx);
558	return INREG( MC_IND_DATA);
559}
560
561static 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
687static 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
733static 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
747static 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
777static 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
821static 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
1059static 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
1079static 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
1099static 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
1133static 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
1146static 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
1193static 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
1247static 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)
1434static 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
1459static 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
1473static 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
1551static 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
1580static 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
1635static 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
1689static 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
1722static 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
1950static 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
1976static 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 */
2213static 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
2518static 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
2537static 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
2613static 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
2702static int radeonfb_pci_suspend(struct device *dev)
2703{
2704	return radeonfb_pci_suspend_late(dev, PMSG_SUSPEND);
2705}
2706
2707static int radeonfb_pci_hibernate(struct device *dev)
2708{
2709	return radeonfb_pci_suspend_late(dev, PMSG_HIBERNATE);
2710}
2711
2712static int radeonfb_pci_freeze(struct device *dev)
2713{
2714	return radeonfb_pci_suspend_late(dev, PMSG_FREEZE);
2715}
2716
2717static 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
2724static 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
2808const 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
2818static 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
2831void 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
2921void 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}
2928