[go: nahoru, domu]

1/*
2 *	drivers/video/aty/radeon_pm.c
3 *
4 *	Copyright 2003,2004 Ben. Herrenschmidt <benh@kernel.crashing.org>
5 *	Copyright 2004 Paul Mackerras <paulus@samba.org>
6 *
7 *	This is the power management code for ATI radeon chipsets. It contains
8 *	some dynamic clock PM enable/disable code similar to what X.org does,
9 *	some D2-state (APM-style) sleep/wakeup code for use on some PowerMacs,
10 *	and the necessary bits to re-initialize from scratch a few chips found
11 *	on PowerMacs as well. The later could be extended to more platforms
12 *	provided the memory controller configuration code be made more generic,
13 *	and you can get the proper mode register commands for your RAMs.
14 *	Those things may be found in the BIOS image...
15 */
16
17#include "radeonfb.h"
18
19#include <linux/console.h>
20#include <linux/agp_backend.h>
21
22#ifdef CONFIG_PPC_PMAC
23#include <asm/machdep.h>
24#include <asm/prom.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_OF
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_OF */
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	case 2:
1211		dll_sleep_mask |= MDLL_R300_RDCK__MRDCKB_SLEEP;
1212		dll_reset_mask |= MDLL_R300_RDCK__MRDCKB_RESET;
1213	case 0:
1214		dll_sleep_mask |= MDLL_R300_RDCK__MRDCKA_SLEEP;
1215		dll_reset_mask |= MDLL_R300_RDCK__MRDCKA_RESET;
1216	}
1217	switch (mc & 0x3) {
1218	case 1:
1219		if (!(mc & 0x4))
1220			break;
1221	case 2:
1222		dll_sleep_mask |= MDLL_R300_RDCK__MRDCKD_SLEEP;
1223		dll_reset_mask |= MDLL_R300_RDCK__MRDCKD_RESET;
1224		dll_sleep_mask |= MDLL_R300_RDCK__MRDCKC_SLEEP;
1225		dll_reset_mask |= MDLL_R300_RDCK__MRDCKC_RESET;
1226	}
1227
1228	dll_value = INPLL(pllMDLL_RDCKA);
1229
1230	/* Power Up */
1231	dll_value &= ~(dll_sleep_mask);
1232	OUTPLL(pllMDLL_RDCKA, dll_value);
1233	mdelay( DLL_SLEEP_DELAY);
1234
1235	dll_value &= ~(dll_reset_mask);
1236	OUTPLL(pllMDLL_RDCKA, dll_value);
1237	mdelay( DLL_RESET_DELAY);
1238
1239#undef DLL_RESET_DELAY
1240#undef DLL_SLEEP_DELAY
1241}
1242
1243
1244static void radeon_pm_full_reset_sdram(struct radeonfb_info *rinfo)
1245{
1246	u32 crtcGenCntl, crtcGenCntl2, memRefreshCntl, crtc_more_cntl,
1247		fp_gen_cntl, fp2_gen_cntl;
1248
1249	crtcGenCntl  = INREG( CRTC_GEN_CNTL);
1250	crtcGenCntl2 = INREG( CRTC2_GEN_CNTL);
1251
1252	crtc_more_cntl 	= INREG( CRTC_MORE_CNTL);
1253	fp_gen_cntl 	= INREG( FP_GEN_CNTL);
1254	fp2_gen_cntl 	= INREG( FP2_GEN_CNTL);
1255
1256
1257	OUTREG( CRTC_MORE_CNTL, 0);
1258	OUTREG( FP_GEN_CNTL, 0);
1259	OUTREG( FP2_GEN_CNTL,0);
1260
1261	OUTREG( CRTC_GEN_CNTL,  (crtcGenCntl | CRTC_GEN_CNTL__CRTC_DISP_REQ_EN_B) );
1262	OUTREG( CRTC2_GEN_CNTL, (crtcGenCntl2 | CRTC2_GEN_CNTL__CRTC2_DISP_REQ_EN_B) );
1263
1264	/* This is the code for the Aluminium PowerBooks M10 / iBooks M11 */
1265	if (rinfo->family == CHIP_FAMILY_RV350) {
1266		u32 sdram_mode_reg = rinfo->save_regs[35];
1267		static const u32 default_mrtable[] =
1268			{ 0x21320032,
1269			  0x21321000, 0xa1321000, 0x21321000, 0xffffffff,
1270			  0x21320032, 0xa1320032, 0x21320032, 0xffffffff,
1271			  0x21321002, 0xa1321002, 0x21321002, 0xffffffff,
1272			  0x21320132, 0xa1320132, 0x21320132, 0xffffffff,
1273			  0x21320032, 0xa1320032, 0x21320032, 0xffffffff,
1274			  0x31320032 };
1275
1276		const u32 *mrtable = default_mrtable;
1277		int i, mrtable_size = ARRAY_SIZE(default_mrtable);
1278
1279		mdelay(30);
1280
1281		/* Disable refresh */
1282		memRefreshCntl 	= INREG( MEM_REFRESH_CNTL)
1283			& ~MEM_REFRESH_CNTL__MEM_REFRESH_DIS;
1284		OUTREG( MEM_REFRESH_CNTL, memRefreshCntl
1285			| MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
1286
1287		/* Configure and enable M & SPLLs */
1288       		radeon_pm_enable_dll_m10(rinfo);
1289		radeon_pm_yclk_mclk_sync_m10(rinfo);
1290
1291#ifdef CONFIG_PPC_OF
1292		if (rinfo->of_node != NULL) {
1293			int size;
1294
1295			mrtable = of_get_property(rinfo->of_node, "ATY,MRT", &size);
1296			if (mrtable)
1297				mrtable_size = size >> 2;
1298			else
1299				mrtable = default_mrtable;
1300		}
1301#endif /* CONFIG_PPC_OF */
1302
1303		/* Program the SDRAM */
1304		sdram_mode_reg = mrtable[0];
1305		OUTREG(MEM_SDRAM_MODE_REG, sdram_mode_reg);
1306		for (i = 0; i < mrtable_size; i++) {
1307			if (mrtable[i] == 0xffffffffu)
1308				radeon_pm_m10_program_mode_wait(rinfo);
1309			else {
1310				sdram_mode_reg &= ~(MEM_SDRAM_MODE_REG__MEM_MODE_REG_MASK
1311						    | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE
1312						    | MEM_SDRAM_MODE_REG__MEM_SDRAM_RESET);
1313				sdram_mode_reg |= mrtable[i];
1314
1315				OUTREG(MEM_SDRAM_MODE_REG, sdram_mode_reg);
1316				mdelay(1);
1317			}
1318		}
1319
1320		/* Restore memory refresh */
1321		OUTREG(MEM_REFRESH_CNTL, memRefreshCntl);
1322		mdelay(30);
1323
1324	}
1325	/* Here come the desktop RV200 "QW" card */
1326	else if (!rinfo->is_mobility && rinfo->family == CHIP_FAMILY_RV200) {
1327		/* Disable refresh */
1328		memRefreshCntl 	= INREG( MEM_REFRESH_CNTL)
1329			& ~MEM_REFRESH_CNTL__MEM_REFRESH_DIS;
1330		OUTREG(MEM_REFRESH_CNTL, memRefreshCntl
1331		       | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
1332		mdelay(30);
1333
1334		/* Reset memory */
1335		OUTREG(MEM_SDRAM_MODE_REG,
1336		       INREG( MEM_SDRAM_MODE_REG) & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1337
1338		radeon_pm_program_mode_reg(rinfo, 0x2002, 2);
1339		radeon_pm_program_mode_reg(rinfo, 0x0132, 2);
1340		radeon_pm_program_mode_reg(rinfo, 0x0032, 2);
1341
1342		OUTREG(MEM_SDRAM_MODE_REG,
1343		       INREG(MEM_SDRAM_MODE_REG) | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1344
1345		OUTREG( MEM_REFRESH_CNTL, 	memRefreshCntl);
1346
1347	}
1348	/* The M6 */
1349	else if (rinfo->is_mobility && rinfo->family == CHIP_FAMILY_RV100) {
1350		/* Disable refresh */
1351		memRefreshCntl = INREG(EXT_MEM_CNTL) & ~(1 << 20);
1352		OUTREG( EXT_MEM_CNTL, memRefreshCntl | (1 << 20));
1353
1354		/* Reset memory */
1355		OUTREG( MEM_SDRAM_MODE_REG,
1356			INREG( MEM_SDRAM_MODE_REG)
1357			& ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1358
1359		/* DLL */
1360		radeon_pm_enable_dll(rinfo);
1361
1362		/* MLCK / YCLK sync */
1363		radeon_pm_yclk_mclk_sync(rinfo);
1364
1365		/* Program Mode Register */
1366		radeon_pm_program_mode_reg(rinfo, 0x2000, 1);
1367		radeon_pm_program_mode_reg(rinfo, 0x2001, 1);
1368		radeon_pm_program_mode_reg(rinfo, 0x2002, 1);
1369		radeon_pm_program_mode_reg(rinfo, 0x0132, 1);
1370		radeon_pm_program_mode_reg(rinfo, 0x0032, 1);
1371
1372		/* Complete & re-enable refresh */
1373		OUTREG( MEM_SDRAM_MODE_REG,
1374			INREG( MEM_SDRAM_MODE_REG) | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1375
1376		OUTREG(EXT_MEM_CNTL, memRefreshCntl);
1377	}
1378	/* And finally, the M7..M9 models, including M9+ (RV280) */
1379	else if (rinfo->is_mobility) {
1380
1381		/* Disable refresh */
1382		memRefreshCntl 	= INREG( MEM_REFRESH_CNTL)
1383			& ~MEM_REFRESH_CNTL__MEM_REFRESH_DIS;
1384		OUTREG( MEM_REFRESH_CNTL, memRefreshCntl
1385			| MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
1386
1387		/* Reset memory */
1388		OUTREG( MEM_SDRAM_MODE_REG,
1389			INREG( MEM_SDRAM_MODE_REG)
1390			& ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1391
1392		/* DLL */
1393		radeon_pm_enable_dll(rinfo);
1394
1395		/* MLCK / YCLK sync */
1396		radeon_pm_yclk_mclk_sync(rinfo);
1397
1398		/* M6, M7 and M9 so far ... */
1399		if (rinfo->family <= CHIP_FAMILY_RV250) {
1400			radeon_pm_program_mode_reg(rinfo, 0x2000, 1);
1401			radeon_pm_program_mode_reg(rinfo, 0x2001, 1);
1402			radeon_pm_program_mode_reg(rinfo, 0x2002, 1);
1403			radeon_pm_program_mode_reg(rinfo, 0x0132, 1);
1404			radeon_pm_program_mode_reg(rinfo, 0x0032, 1);
1405		}
1406		/* M9+ (iBook G4) */
1407		else if (rinfo->family == CHIP_FAMILY_RV280) {
1408			radeon_pm_program_mode_reg(rinfo, 0x2000, 1);
1409			radeon_pm_program_mode_reg(rinfo, 0x0132, 1);
1410			radeon_pm_program_mode_reg(rinfo, 0x0032, 1);
1411		}
1412
1413		/* Complete & re-enable refresh */
1414		OUTREG( MEM_SDRAM_MODE_REG,
1415			INREG( MEM_SDRAM_MODE_REG) | MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1416
1417		OUTREG( MEM_REFRESH_CNTL, 	memRefreshCntl);
1418	}
1419
1420	OUTREG( CRTC_GEN_CNTL, 		crtcGenCntl);
1421	OUTREG( CRTC2_GEN_CNTL, 	crtcGenCntl2);
1422	OUTREG( FP_GEN_CNTL, 		fp_gen_cntl);
1423	OUTREG( FP2_GEN_CNTL, 		fp2_gen_cntl);
1424
1425	OUTREG( CRTC_MORE_CNTL, 	crtc_more_cntl);
1426
1427	mdelay( 15);
1428}
1429
1430#if defined(CONFIG_PM)
1431#if defined(CONFIG_X86) || defined(CONFIG_PPC_PMAC)
1432static void radeon_pm_reset_pad_ctlr_strength(struct radeonfb_info *rinfo)
1433{
1434	u32 tmp, tmp2;
1435	int i,j;
1436
1437	/* Reset the PAD_CTLR_STRENGTH & wait for it to be stable */
1438	INREG(PAD_CTLR_STRENGTH);
1439	OUTREG(PAD_CTLR_STRENGTH, INREG(PAD_CTLR_STRENGTH) & ~PAD_MANUAL_OVERRIDE);
1440	tmp = INREG(PAD_CTLR_STRENGTH);
1441	for (i = j = 0; i < 65; ++i) {
1442		mdelay(1);
1443		tmp2 = INREG(PAD_CTLR_STRENGTH);
1444		if (tmp != tmp2) {
1445			tmp = tmp2;
1446			i = 0;
1447			j++;
1448			if (j > 10) {
1449				printk(KERN_WARNING "radeon: PAD_CTLR_STRENGTH doesn't "
1450				       "stabilize !\n");
1451				break;
1452			}
1453		}
1454	}
1455}
1456
1457static void radeon_pm_all_ppls_off(struct radeonfb_info *rinfo)
1458{
1459	u32 tmp;
1460
1461	tmp = INPLL(pllPPLL_CNTL);
1462	OUTPLL(pllPPLL_CNTL, tmp | 0x3);
1463	tmp = INPLL(pllP2PLL_CNTL);
1464	OUTPLL(pllP2PLL_CNTL, tmp | 0x3);
1465	tmp = INPLL(pllSPLL_CNTL);
1466	OUTPLL(pllSPLL_CNTL, tmp | 0x3);
1467	tmp = INPLL(pllMPLL_CNTL);
1468	OUTPLL(pllMPLL_CNTL, tmp | 0x3);
1469}
1470
1471static void radeon_pm_start_mclk_sclk(struct radeonfb_info *rinfo)
1472{
1473	u32 tmp;
1474
1475	/* Switch SPLL to PCI source */
1476	tmp = INPLL(pllSCLK_CNTL);
1477	OUTPLL(pllSCLK_CNTL, tmp & ~SCLK_CNTL__SCLK_SRC_SEL_MASK);
1478
1479	/* Reconfigure SPLL charge pump, VCO gain, duty cycle */
1480	tmp = INPLL(pllSPLL_CNTL);
1481	OUTREG8(CLOCK_CNTL_INDEX, pllSPLL_CNTL + PLL_WR_EN);
1482	radeon_pll_errata_after_index(rinfo);
1483	OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
1484	radeon_pll_errata_after_data(rinfo);
1485
1486	/* Set SPLL feedback divider */
1487	tmp = INPLL(pllM_SPLL_REF_FB_DIV);
1488	tmp = (tmp & 0xff00fffful) | (rinfo->save_regs[77] & 0x00ff0000ul);
1489	OUTPLL(pllM_SPLL_REF_FB_DIV, tmp);
1490
1491	/* Power up SPLL */
1492	tmp = INPLL(pllSPLL_CNTL);
1493	OUTPLL(pllSPLL_CNTL, tmp & ~1);
1494	(void)INPLL(pllSPLL_CNTL);
1495
1496	mdelay(10);
1497
1498	/* Release SPLL reset */
1499	tmp = INPLL(pllSPLL_CNTL);
1500	OUTPLL(pllSPLL_CNTL, tmp & ~0x2);
1501	(void)INPLL(pllSPLL_CNTL);
1502
1503	mdelay(10);
1504
1505	/* Select SCLK source  */
1506	tmp = INPLL(pllSCLK_CNTL);
1507	tmp &= ~SCLK_CNTL__SCLK_SRC_SEL_MASK;
1508	tmp |= rinfo->save_regs[3] & SCLK_CNTL__SCLK_SRC_SEL_MASK;
1509	OUTPLL(pllSCLK_CNTL, tmp);
1510	(void)INPLL(pllSCLK_CNTL);
1511
1512	mdelay(10);
1513
1514	/* Reconfigure MPLL charge pump, VCO gain, duty cycle */
1515	tmp = INPLL(pllMPLL_CNTL);
1516	OUTREG8(CLOCK_CNTL_INDEX, pllMPLL_CNTL + PLL_WR_EN);
1517	radeon_pll_errata_after_index(rinfo);
1518	OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
1519	radeon_pll_errata_after_data(rinfo);
1520
1521	/* Set MPLL feedback divider */
1522	tmp = INPLL(pllM_SPLL_REF_FB_DIV);
1523	tmp = (tmp & 0xffff00fful) | (rinfo->save_regs[77] & 0x0000ff00ul);
1524
1525	OUTPLL(pllM_SPLL_REF_FB_DIV, tmp);
1526	/* Power up MPLL */
1527	tmp = INPLL(pllMPLL_CNTL);
1528	OUTPLL(pllMPLL_CNTL, tmp & ~0x2);
1529	(void)INPLL(pllMPLL_CNTL);
1530
1531	mdelay(10);
1532
1533	/* Un-reset MPLL */
1534	tmp = INPLL(pllMPLL_CNTL);
1535	OUTPLL(pllMPLL_CNTL, tmp & ~0x1);
1536	(void)INPLL(pllMPLL_CNTL);
1537
1538	mdelay(10);
1539
1540	/* Select source for MCLK */
1541	tmp = INPLL(pllMCLK_CNTL);
1542	tmp |= rinfo->save_regs[2] & 0xffff;
1543	OUTPLL(pllMCLK_CNTL, tmp);
1544	(void)INPLL(pllMCLK_CNTL);
1545
1546	mdelay(10);
1547}
1548
1549static void radeon_pm_m10_disable_spread_spectrum(struct radeonfb_info *rinfo)
1550{
1551	u32 r2ec;
1552
1553	/* GACK ! I though we didn't have a DDA on Radeon's anymore
1554	 * here we rewrite with the same value, ... I suppose we clear
1555	 * some bits that are already clear ? Or maybe this 0x2ec
1556	 * register is something new ?
1557	 */
1558	mdelay(20);
1559	r2ec = INREG(VGA_DDA_ON_OFF);
1560	OUTREG(VGA_DDA_ON_OFF, r2ec);
1561	mdelay(1);
1562
1563	/* Spread spectrum PLLL off */
1564	OUTPLL(pllSSPLL_CNTL, 0xbf03);
1565
1566	/* Spread spectrum disabled */
1567	OUTPLL(pllSS_INT_CNTL, rinfo->save_regs[90] & ~3);
1568
1569	/* The trace shows read & rewrite of LVDS_PLL_CNTL here with same
1570	 * value, not sure what for...
1571	 */
1572
1573	r2ec |= 0x3f0;
1574	OUTREG(VGA_DDA_ON_OFF, r2ec);
1575	mdelay(1);
1576}
1577
1578static void radeon_pm_m10_enable_lvds_spread_spectrum(struct radeonfb_info *rinfo)
1579{
1580	u32 r2ec, tmp;
1581
1582	/* GACK (bis) ! I though we didn't have a DDA on Radeon's anymore
1583	 * here we rewrite with the same value, ... I suppose we clear/set
1584	 * some bits that are already clear/set ?
1585	 */
1586	r2ec = INREG(VGA_DDA_ON_OFF);
1587	OUTREG(VGA_DDA_ON_OFF, r2ec);
1588	mdelay(1);
1589
1590	/* Enable spread spectrum */
1591	OUTPLL(pllSSPLL_CNTL, rinfo->save_regs[43] | 3);
1592	mdelay(3);
1593
1594	OUTPLL(pllSSPLL_REF_DIV, rinfo->save_regs[44]);
1595	OUTPLL(pllSSPLL_DIV_0, rinfo->save_regs[45]);
1596	tmp = INPLL(pllSSPLL_CNTL);
1597	OUTPLL(pllSSPLL_CNTL, tmp & ~0x2);
1598	mdelay(6);
1599	tmp = INPLL(pllSSPLL_CNTL);
1600	OUTPLL(pllSSPLL_CNTL, tmp & ~0x1);
1601	mdelay(5);
1602
1603       	OUTPLL(pllSS_INT_CNTL, rinfo->save_regs[90]);
1604
1605	r2ec |= 8;
1606	OUTREG(VGA_DDA_ON_OFF, r2ec);
1607	mdelay(20);
1608
1609	/* Enable LVDS interface */
1610	tmp = INREG(LVDS_GEN_CNTL);
1611	OUTREG(LVDS_GEN_CNTL, tmp | LVDS_EN);
1612
1613	/* Enable LVDS_PLL */
1614	tmp = INREG(LVDS_PLL_CNTL);
1615	tmp &= ~0x30000;
1616	tmp |= 0x10000;
1617	OUTREG(LVDS_PLL_CNTL, tmp);
1618
1619	OUTPLL(pllSCLK_MORE_CNTL, rinfo->save_regs[34]);
1620	OUTPLL(pllSS_TST_CNTL, rinfo->save_regs[91]);
1621
1622	/* The trace reads that one here, waiting for something to settle down ? */
1623	INREG(RBBM_STATUS);
1624
1625	/* Ugh ? SS_TST_DEC is supposed to be a read register in the
1626	 * R300 register spec at least...
1627	 */
1628	tmp = INPLL(pllSS_TST_CNTL);
1629	tmp |= 0x00400000;
1630	OUTPLL(pllSS_TST_CNTL, tmp);
1631}
1632
1633static void radeon_pm_restore_pixel_pll(struct radeonfb_info *rinfo)
1634{
1635	u32 tmp;
1636
1637	OUTREG8(CLOCK_CNTL_INDEX, pllHTOTAL_CNTL + PLL_WR_EN);
1638	radeon_pll_errata_after_index(rinfo);
1639	OUTREG8(CLOCK_CNTL_DATA, 0);
1640	radeon_pll_errata_after_data(rinfo);
1641
1642	tmp = INPLL(pllVCLK_ECP_CNTL);
1643	OUTPLL(pllVCLK_ECP_CNTL, tmp | 0x80);
1644	mdelay(5);
1645
1646	tmp = INPLL(pllPPLL_REF_DIV);
1647	tmp = (tmp & ~PPLL_REF_DIV_MASK) | rinfo->pll.ref_div;
1648	OUTPLL(pllPPLL_REF_DIV, tmp);
1649	INPLL(pllPPLL_REF_DIV);
1650
1651	/* Reconfigure SPLL charge pump, VCO gain, duty cycle,
1652	 * probably useless since we already did it ...
1653	 */
1654	tmp = INPLL(pllPPLL_CNTL);
1655	OUTREG8(CLOCK_CNTL_INDEX, pllSPLL_CNTL + PLL_WR_EN);
1656	radeon_pll_errata_after_index(rinfo);
1657	OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
1658	radeon_pll_errata_after_data(rinfo);
1659
1660	/* Restore our "reference" PPLL divider set by firmware
1661	 * according to proper spread spectrum calculations
1662	 */
1663	OUTPLL(pllPPLL_DIV_0, rinfo->save_regs[92]);
1664
1665	tmp = INPLL(pllPPLL_CNTL);
1666	OUTPLL(pllPPLL_CNTL, tmp & ~0x2);
1667	mdelay(5);
1668
1669	tmp = INPLL(pllPPLL_CNTL);
1670	OUTPLL(pllPPLL_CNTL, tmp & ~0x1);
1671	mdelay(5);
1672
1673	tmp = INPLL(pllVCLK_ECP_CNTL);
1674	OUTPLL(pllVCLK_ECP_CNTL, tmp | 3);
1675	mdelay(5);
1676
1677	tmp = INPLL(pllVCLK_ECP_CNTL);
1678	OUTPLL(pllVCLK_ECP_CNTL, tmp | 3);
1679	mdelay(5);
1680
1681	/* Switch pixel clock to firmware default div 0 */
1682	OUTREG8(CLOCK_CNTL_INDEX+1, 0);
1683	radeon_pll_errata_after_index(rinfo);
1684	radeon_pll_errata_after_data(rinfo);
1685}
1686
1687static void radeon_pm_m10_reconfigure_mc(struct radeonfb_info *rinfo)
1688{
1689	OUTREG(MC_CNTL, rinfo->save_regs[46]);
1690	OUTREG(MC_INIT_GFX_LAT_TIMER, rinfo->save_regs[47]);
1691	OUTREG(MC_INIT_MISC_LAT_TIMER, rinfo->save_regs[48]);
1692	OUTREG(MEM_SDRAM_MODE_REG,
1693	       rinfo->save_regs[35] & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1694	OUTREG(MC_TIMING_CNTL, rinfo->save_regs[49]);
1695	OUTREG(MEM_REFRESH_CNTL, rinfo->save_regs[42]);
1696	OUTREG(MC_READ_CNTL_AB, rinfo->save_regs[50]);
1697	OUTREG(MC_CHIP_IO_OE_CNTL_AB, rinfo->save_regs[52]);
1698	OUTREG(MC_IOPAD_CNTL, rinfo->save_regs[51]);
1699	OUTREG(MC_DEBUG, rinfo->save_regs[53]);
1700
1701	OUTMC(rinfo, ixR300_MC_MC_INIT_WR_LAT_TIMER, rinfo->save_regs[58]);
1702	OUTMC(rinfo, ixR300_MC_IMP_CNTL, rinfo->save_regs[59]);
1703	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_C0, rinfo->save_regs[60]);
1704	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_C1, rinfo->save_regs[61]);
1705	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_D0, rinfo->save_regs[62]);
1706	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_D1, rinfo->save_regs[63]);
1707	OUTMC(rinfo, ixR300_MC_BIST_CNTL_3, rinfo->save_regs[64]);
1708	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_A0, rinfo->save_regs[65]);
1709	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_A1, rinfo->save_regs[66]);
1710	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_B0, rinfo->save_regs[67]);
1711	OUTMC(rinfo, ixR300_MC_CHP_IO_CNTL_B1, rinfo->save_regs[68]);
1712	OUTMC(rinfo, ixR300_MC_DEBUG_CNTL, rinfo->save_regs[69]);
1713	OUTMC(rinfo, ixR300_MC_DLL_CNTL, rinfo->save_regs[70]);
1714	OUTMC(rinfo, ixR300_MC_IMP_CNTL_0, rinfo->save_regs[71]);
1715	OUTMC(rinfo, ixR300_MC_ELPIDA_CNTL, rinfo->save_regs[72]);
1716	OUTMC(rinfo, ixR300_MC_READ_CNTL_CD, rinfo->save_regs[96]);
1717	OUTREG(MC_IND_INDEX, 0);
1718}
1719
1720static void radeon_reinitialize_M10(struct radeonfb_info *rinfo)
1721{
1722	u32 tmp, i;
1723
1724	/* Restore a bunch of registers first */
1725	OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
1726	OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
1727	OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
1728	OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
1729	OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]);
1730	OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
1731	OUTREG(BUS_CNTL, rinfo->save_regs[36]);
1732	OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
1733	OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]);
1734	OUTREG(FCP_CNTL, rinfo->save_regs[38]);
1735	OUTREG(RBBM_CNTL, rinfo->save_regs[39]);
1736	OUTREG(DAC_CNTL, rinfo->save_regs[40]);
1737	OUTREG(DAC_MACRO_CNTL, (INREG(DAC_MACRO_CNTL) & ~0x6) | 8);
1738	OUTREG(DAC_MACRO_CNTL, (INREG(DAC_MACRO_CNTL) & ~0x6) | 8);
1739
1740	/* Hrm... */
1741	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | DAC2_EXPAND_MODE);
1742
1743	/* Reset the PAD CTLR */
1744	radeon_pm_reset_pad_ctlr_strength(rinfo);
1745
1746	/* Some PLLs are Read & written identically in the trace here...
1747	 * I suppose it's actually to switch them all off & reset,
1748	 * let's assume off is what we want. I'm just doing that for all major PLLs now.
1749	 */
1750	radeon_pm_all_ppls_off(rinfo);
1751
1752	/* Clear tiling, reset swappers */
1753	INREG(SURFACE_CNTL);
1754	OUTREG(SURFACE_CNTL, 0);
1755
1756	/* Some black magic with TV_DAC_CNTL, we should restore those from backups
1757	 * rather than hard coding...
1758	 */
1759	tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_BGADJ_MASK;
1760	tmp |= 8 << TV_DAC_CNTL_BGADJ__SHIFT;
1761	OUTREG(TV_DAC_CNTL, tmp);
1762
1763	tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_DACADJ_MASK;
1764	tmp |= 7 << TV_DAC_CNTL_DACADJ__SHIFT;
1765	OUTREG(TV_DAC_CNTL, tmp);
1766
1767	/* More registers restored */
1768	OUTREG(AGP_CNTL, rinfo->save_regs[16]);
1769	OUTREG(HOST_PATH_CNTL, rinfo->save_regs[41]);
1770	OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
1771
1772	/* Hrmmm ... What is that ? */
1773	tmp = rinfo->save_regs[1]
1774		& ~(CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK |
1775		    CLK_PWRMGT_CNTL__MC_BUSY);
1776	OUTPLL(pllCLK_PWRMGT_CNTL, tmp);
1777
1778	OUTREG(PAD_CTLR_MISC, rinfo->save_regs[56]);
1779	OUTREG(FW_CNTL, rinfo->save_regs[57]);
1780	OUTREG(HDP_DEBUG, rinfo->save_regs[96]);
1781	OUTREG(PAMAC0_DLY_CNTL, rinfo->save_regs[54]);
1782	OUTREG(PAMAC1_DLY_CNTL, rinfo->save_regs[55]);
1783	OUTREG(PAMAC2_DLY_CNTL, rinfo->save_regs[79]);
1784
1785	/* Restore Memory Controller configuration */
1786	radeon_pm_m10_reconfigure_mc(rinfo);
1787
1788	/* Make sure CRTC's dont touch memory */
1789	OUTREG(CRTC_GEN_CNTL, INREG(CRTC_GEN_CNTL)
1790	       | CRTC_GEN_CNTL__CRTC_DISP_REQ_EN_B);
1791	OUTREG(CRTC2_GEN_CNTL, INREG(CRTC2_GEN_CNTL)
1792	       | CRTC2_GEN_CNTL__CRTC2_DISP_REQ_EN_B);
1793	mdelay(30);
1794
1795	/* Disable SDRAM refresh */
1796	OUTREG(MEM_REFRESH_CNTL, INREG(MEM_REFRESH_CNTL)
1797	       | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
1798
1799	/* Restore XTALIN routing (CLK_PIN_CNTL) */
1800	OUTPLL(pllCLK_PIN_CNTL, rinfo->save_regs[4]);
1801
1802	/* Switch MCLK, YCLK and SCLK PLLs to PCI source & force them ON */
1803	tmp = rinfo->save_regs[2] & 0xff000000;
1804	tmp |=	MCLK_CNTL__FORCE_MCLKA |
1805		MCLK_CNTL__FORCE_MCLKB |
1806		MCLK_CNTL__FORCE_YCLKA |
1807		MCLK_CNTL__FORCE_YCLKB |
1808		MCLK_CNTL__FORCE_MC;
1809	OUTPLL(pllMCLK_CNTL, tmp);
1810
1811	/* Force all clocks on in SCLK */
1812	tmp = INPLL(pllSCLK_CNTL);
1813	tmp |=	SCLK_CNTL__FORCE_DISP2|
1814		SCLK_CNTL__FORCE_CP|
1815		SCLK_CNTL__FORCE_HDP|
1816		SCLK_CNTL__FORCE_DISP1|
1817		SCLK_CNTL__FORCE_TOP|
1818		SCLK_CNTL__FORCE_E2|
1819		SCLK_CNTL__FORCE_SE|
1820		SCLK_CNTL__FORCE_IDCT|
1821		SCLK_CNTL__FORCE_VIP|
1822		SCLK_CNTL__FORCE_PB|
1823		SCLK_CNTL__FORCE_TAM|
1824		SCLK_CNTL__FORCE_TDM|
1825		SCLK_CNTL__FORCE_RB|
1826		SCLK_CNTL__FORCE_TV_SCLK|
1827		SCLK_CNTL__FORCE_SUBPIC|
1828		SCLK_CNTL__FORCE_OV0;
1829	tmp |=	SCLK_CNTL__CP_MAX_DYN_STOP_LAT  |
1830		SCLK_CNTL__HDP_MAX_DYN_STOP_LAT |
1831		SCLK_CNTL__TV_MAX_DYN_STOP_LAT  |
1832		SCLK_CNTL__E2_MAX_DYN_STOP_LAT  |
1833		SCLK_CNTL__SE_MAX_DYN_STOP_LAT  |
1834		SCLK_CNTL__IDCT_MAX_DYN_STOP_LAT|
1835		SCLK_CNTL__VIP_MAX_DYN_STOP_LAT |
1836		SCLK_CNTL__RE_MAX_DYN_STOP_LAT  |
1837		SCLK_CNTL__PB_MAX_DYN_STOP_LAT  |
1838		SCLK_CNTL__TAM_MAX_DYN_STOP_LAT |
1839		SCLK_CNTL__TDM_MAX_DYN_STOP_LAT |
1840		SCLK_CNTL__RB_MAX_DYN_STOP_LAT;
1841	OUTPLL(pllSCLK_CNTL, tmp);
1842
1843	OUTPLL(pllVCLK_ECP_CNTL, 0);
1844	OUTPLL(pllPIXCLKS_CNTL, 0);
1845	OUTPLL(pllMCLK_MISC,
1846	       MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT |
1847	       MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT);
1848
1849	mdelay(5);
1850
1851	/* Restore the M_SPLL_REF_FB_DIV, MPLL_AUX_CNTL and SPLL_AUX_CNTL values */
1852	OUTPLL(pllM_SPLL_REF_FB_DIV, rinfo->save_regs[77]);
1853	OUTPLL(pllMPLL_AUX_CNTL, rinfo->save_regs[75]);
1854	OUTPLL(pllSPLL_AUX_CNTL, rinfo->save_regs[76]);
1855
1856	/* Now restore the major PLLs settings, keeping them off & reset though */
1857	OUTPLL(pllPPLL_CNTL, rinfo->save_regs[93] | 0x3);
1858	OUTPLL(pllP2PLL_CNTL, rinfo->save_regs[8] | 0x3);
1859	OUTPLL(pllMPLL_CNTL, rinfo->save_regs[73] | 0x03);
1860	OUTPLL(pllSPLL_CNTL, rinfo->save_regs[74] | 0x03);
1861
1862	/* Restore MC DLL state and switch it off/reset too  */
1863	OUTMC(rinfo, ixR300_MC_DLL_CNTL, rinfo->save_regs[70]);
1864
1865	/* Switch MDLL off & reset */
1866	OUTPLL(pllMDLL_RDCKA, rinfo->save_regs[98] | 0xff);
1867	mdelay(5);
1868
1869	/* Setup some black magic bits in PLL_PWRMGT_CNTL. Hrm... we saved
1870	 * 0xa1100007... and MacOS writes 0xa1000007 ..
1871	 */
1872	OUTPLL(pllPLL_PWRMGT_CNTL, rinfo->save_regs[0]);
1873
1874	/* Restore more stuffs */
1875	OUTPLL(pllHTOTAL_CNTL, 0);
1876	OUTPLL(pllHTOTAL2_CNTL, 0);
1877
1878	/* More PLL initial configuration */
1879	tmp = INPLL(pllSCLK_CNTL2); /* What for ? */
1880	OUTPLL(pllSCLK_CNTL2, tmp);
1881
1882	tmp = INPLL(pllSCLK_MORE_CNTL);
1883	tmp |= 	SCLK_MORE_CNTL__FORCE_DISPREGS |	/* a guess */
1884		SCLK_MORE_CNTL__FORCE_MC_GUI |
1885		SCLK_MORE_CNTL__FORCE_MC_HOST;
1886	OUTPLL(pllSCLK_MORE_CNTL, tmp);
1887
1888	/* Now we actually start MCLK and SCLK */
1889	radeon_pm_start_mclk_sclk(rinfo);
1890
1891	/* Full reset sdrams, this also re-inits the MDLL */
1892	radeon_pm_full_reset_sdram(rinfo);
1893
1894	/* Fill palettes */
1895	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | 0x20);
1896	for (i=0; i<256; i++)
1897		OUTREG(PALETTE_30_DATA, 0x15555555);
1898	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~20);
1899	udelay(20);
1900	for (i=0; i<256; i++)
1901		OUTREG(PALETTE_30_DATA, 0x15555555);
1902
1903	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~0x20);
1904	mdelay(3);
1905
1906	/* Restore TMDS */
1907	OUTREG(FP_GEN_CNTL, rinfo->save_regs[82]);
1908	OUTREG(FP2_GEN_CNTL, rinfo->save_regs[83]);
1909
1910	/* Set LVDS registers but keep interface & pll down */
1911	OUTREG(LVDS_GEN_CNTL, rinfo->save_regs[11] &
1912	       ~(LVDS_EN | LVDS_ON | LVDS_DIGON | LVDS_BLON | LVDS_BL_MOD_EN));
1913	OUTREG(LVDS_PLL_CNTL, (rinfo->save_regs[12] & ~0xf0000) | 0x20000);
1914
1915	OUTREG(DISP_OUTPUT_CNTL, rinfo->save_regs[86]);
1916
1917	/* Restore GPIOPAD state */
1918	OUTREG(GPIOPAD_A, rinfo->save_regs[19]);
1919	OUTREG(GPIOPAD_EN, rinfo->save_regs[20]);
1920	OUTREG(GPIOPAD_MASK, rinfo->save_regs[21]);
1921
1922	/* write some stuff to the framebuffer... */
1923	for (i = 0; i < 0x8000; ++i)
1924		writeb(0, rinfo->fb_base + i);
1925
1926	mdelay(40);
1927	OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) | LVDS_DIGON | LVDS_ON);
1928	mdelay(40);
1929
1930	/* Restore a few more things */
1931	OUTREG(GRPH_BUFFER_CNTL, rinfo->save_regs[94]);
1932	OUTREG(GRPH2_BUFFER_CNTL, rinfo->save_regs[95]);
1933
1934	/* Take care of spread spectrum & PPLLs now */
1935	radeon_pm_m10_disable_spread_spectrum(rinfo);
1936	radeon_pm_restore_pixel_pll(rinfo);
1937
1938	/* GRRRR... I can't figure out the proper LVDS power sequence, and the
1939	 * code I have for blank/unblank doesn't quite work on some laptop models
1940	 * it seems ... Hrm. What I have here works most of the time ...
1941	 */
1942	radeon_pm_m10_enable_lvds_spread_spectrum(rinfo);
1943}
1944#endif
1945
1946#ifdef CONFIG_PPC_OF
1947#ifdef CONFIG_PPC_PMAC
1948static void radeon_pm_m9p_reconfigure_mc(struct radeonfb_info *rinfo)
1949{
1950	OUTREG(MC_CNTL, rinfo->save_regs[46]);
1951	OUTREG(MC_INIT_GFX_LAT_TIMER, rinfo->save_regs[47]);
1952	OUTREG(MC_INIT_MISC_LAT_TIMER, rinfo->save_regs[48]);
1953	OUTREG(MEM_SDRAM_MODE_REG,
1954	       rinfo->save_regs[35] & ~MEM_SDRAM_MODE_REG__MC_INIT_COMPLETE);
1955	OUTREG(MC_TIMING_CNTL, rinfo->save_regs[49]);
1956	OUTREG(MC_READ_CNTL_AB, rinfo->save_regs[50]);
1957	OUTREG(MEM_REFRESH_CNTL, rinfo->save_regs[42]);
1958	OUTREG(MC_IOPAD_CNTL, rinfo->save_regs[51]);
1959	OUTREG(MC_DEBUG, rinfo->save_regs[53]);
1960	OUTREG(MC_CHIP_IO_OE_CNTL_AB, rinfo->save_regs[52]);
1961
1962	OUTMC(rinfo, ixMC_IMP_CNTL, rinfo->save_regs[59] /*0x00f460d6*/);
1963	OUTMC(rinfo, ixMC_CHP_IO_CNTL_A0, rinfo->save_regs[65] /*0xfecfa666*/);
1964	OUTMC(rinfo, ixMC_CHP_IO_CNTL_A1, rinfo->save_regs[66] /*0x141555ff*/);
1965	OUTMC(rinfo, ixMC_CHP_IO_CNTL_B0, rinfo->save_regs[67] /*0xfecfa666*/);
1966	OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, rinfo->save_regs[68] /*0x141555ff*/);
1967	OUTMC(rinfo, ixMC_IMP_CNTL_0, rinfo->save_regs[71] /*0x00009249*/);
1968	OUTREG(MC_IND_INDEX, 0);
1969	OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
1970
1971	mdelay(20);
1972}
1973
1974static void radeon_reinitialize_M9P(struct radeonfb_info *rinfo)
1975{
1976	u32 tmp, i;
1977
1978	/* Restore a bunch of registers first */
1979	OUTREG(SURFACE_CNTL, rinfo->save_regs[29]);
1980	OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
1981	OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
1982	OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
1983	OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
1984	OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]);
1985	OUTREG(BUS_CNTL, rinfo->save_regs[36]);
1986	OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
1987	OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]);
1988	OUTREG(FCP_CNTL, rinfo->save_regs[38]);
1989	OUTREG(RBBM_CNTL, rinfo->save_regs[39]);
1990
1991	OUTREG(DAC_CNTL, rinfo->save_regs[40]);
1992	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | DAC2_EXPAND_MODE);
1993
1994	/* Reset the PAD CTLR */
1995	radeon_pm_reset_pad_ctlr_strength(rinfo);
1996
1997	/* Some PLLs are Read & written identically in the trace here...
1998	 * I suppose it's actually to switch them all off & reset,
1999	 * let's assume off is what we want. I'm just doing that for all major PLLs now.
2000	 */
2001	radeon_pm_all_ppls_off(rinfo);
2002
2003	/* Clear tiling, reset swappers */
2004	INREG(SURFACE_CNTL);
2005	OUTREG(SURFACE_CNTL, 0);
2006
2007	/* Some black magic with TV_DAC_CNTL, we should restore those from backups
2008	 * rather than hard coding...
2009	 */
2010	tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_BGADJ_MASK;
2011	tmp |= 6 << TV_DAC_CNTL_BGADJ__SHIFT;
2012	OUTREG(TV_DAC_CNTL, tmp);
2013
2014	tmp = INREG(TV_DAC_CNTL) & ~TV_DAC_CNTL_DACADJ_MASK;
2015	tmp |= 6 << TV_DAC_CNTL_DACADJ__SHIFT;
2016	OUTREG(TV_DAC_CNTL, tmp);
2017
2018	OUTPLL(pllAGP_PLL_CNTL, rinfo->save_regs[78]);
2019
2020	OUTREG(PAMAC0_DLY_CNTL, rinfo->save_regs[54]);
2021	OUTREG(PAMAC1_DLY_CNTL, rinfo->save_regs[55]);
2022	OUTREG(PAMAC2_DLY_CNTL, rinfo->save_regs[79]);
2023
2024	OUTREG(AGP_CNTL, rinfo->save_regs[16]);
2025	OUTREG(HOST_PATH_CNTL, rinfo->save_regs[41]); /* MacOS sets that to 0 !!! */
2026	OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
2027
2028	tmp  = rinfo->save_regs[1]
2029		& ~(CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK |
2030		    CLK_PWRMGT_CNTL__MC_BUSY);
2031	OUTPLL(pllCLK_PWRMGT_CNTL, tmp);
2032
2033	OUTREG(FW_CNTL, rinfo->save_regs[57]);
2034
2035	/* Disable SDRAM refresh */
2036	OUTREG(MEM_REFRESH_CNTL, INREG(MEM_REFRESH_CNTL)
2037	       | MEM_REFRESH_CNTL__MEM_REFRESH_DIS);
2038
2039	/* Restore XTALIN routing (CLK_PIN_CNTL) */
2040       	OUTPLL(pllCLK_PIN_CNTL, rinfo->save_regs[4]);
2041
2042	/* Force MCLK to be PCI sourced and forced ON */
2043	tmp = rinfo->save_regs[2] & 0xff000000;
2044	tmp |=	MCLK_CNTL__FORCE_MCLKA |
2045		MCLK_CNTL__FORCE_MCLKB |
2046		MCLK_CNTL__FORCE_YCLKA |
2047		MCLK_CNTL__FORCE_YCLKB |
2048		MCLK_CNTL__FORCE_MC    |
2049		MCLK_CNTL__FORCE_AIC;
2050	OUTPLL(pllMCLK_CNTL, tmp);
2051
2052	/* Force SCLK to be PCI sourced with a bunch forced */
2053	tmp =	0 |
2054		SCLK_CNTL__FORCE_DISP2|
2055		SCLK_CNTL__FORCE_CP|
2056		SCLK_CNTL__FORCE_HDP|
2057		SCLK_CNTL__FORCE_DISP1|
2058		SCLK_CNTL__FORCE_TOP|
2059		SCLK_CNTL__FORCE_E2|
2060		SCLK_CNTL__FORCE_SE|
2061		SCLK_CNTL__FORCE_IDCT|
2062		SCLK_CNTL__FORCE_VIP|
2063		SCLK_CNTL__FORCE_RE|
2064		SCLK_CNTL__FORCE_PB|
2065		SCLK_CNTL__FORCE_TAM|
2066		SCLK_CNTL__FORCE_TDM|
2067		SCLK_CNTL__FORCE_RB;
2068	OUTPLL(pllSCLK_CNTL, tmp);
2069
2070	/* Clear VCLK_ECP_CNTL & PIXCLKS_CNTL  */
2071	OUTPLL(pllVCLK_ECP_CNTL, 0);
2072	OUTPLL(pllPIXCLKS_CNTL, 0);
2073
2074	/* Setup MCLK_MISC, non dynamic mode */
2075	OUTPLL(pllMCLK_MISC,
2076	       MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT |
2077	       MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT);
2078
2079	mdelay(5);
2080
2081	/* Set back the default clock dividers */
2082	OUTPLL(pllM_SPLL_REF_FB_DIV, rinfo->save_regs[77]);
2083	OUTPLL(pllMPLL_AUX_CNTL, rinfo->save_regs[75]);
2084	OUTPLL(pllSPLL_AUX_CNTL, rinfo->save_regs[76]);
2085
2086	/* PPLL and P2PLL default values & off */
2087	OUTPLL(pllPPLL_CNTL, rinfo->save_regs[93] | 0x3);
2088	OUTPLL(pllP2PLL_CNTL, rinfo->save_regs[8] | 0x3);
2089
2090	/* S and M PLLs are reset & off, configure them */
2091	OUTPLL(pllMPLL_CNTL, rinfo->save_regs[73] | 0x03);
2092	OUTPLL(pllSPLL_CNTL, rinfo->save_regs[74] | 0x03);
2093
2094	/* Default values for MDLL ... fixme */
2095	OUTPLL(pllMDLL_CKO, 0x9c009c);
2096	OUTPLL(pllMDLL_RDCKA, 0x08830883);
2097	OUTPLL(pllMDLL_RDCKB, 0x08830883);
2098	mdelay(5);
2099
2100	/* Restore PLL_PWRMGT_CNTL */ // XXXX
2101	tmp = rinfo->save_regs[0];
2102	tmp &= ~PLL_PWRMGT_CNTL_SU_SCLK_USE_BCLK;
2103	tmp |= PLL_PWRMGT_CNTL_SU_MCLK_USE_BCLK;
2104	OUTPLL(PLL_PWRMGT_CNTL,  tmp);
2105
2106	/* Clear HTOTAL_CNTL & HTOTAL2_CNTL */
2107	OUTPLL(pllHTOTAL_CNTL, 0);
2108	OUTPLL(pllHTOTAL2_CNTL, 0);
2109
2110	/* All outputs off */
2111	OUTREG(CRTC_GEN_CNTL, 0x04000000);
2112	OUTREG(CRTC2_GEN_CNTL, 0x04000000);
2113	OUTREG(FP_GEN_CNTL, 0x00004008);
2114	OUTREG(FP2_GEN_CNTL, 0x00000008);
2115	OUTREG(LVDS_GEN_CNTL, 0x08000008);
2116
2117	/* Restore Memory Controller configuration */
2118	radeon_pm_m9p_reconfigure_mc(rinfo);
2119
2120	/* Now we actually start MCLK and SCLK */
2121	radeon_pm_start_mclk_sclk(rinfo);
2122
2123	/* Full reset sdrams, this also re-inits the MDLL */
2124	radeon_pm_full_reset_sdram(rinfo);
2125
2126	/* Fill palettes */
2127	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | 0x20);
2128	for (i=0; i<256; i++)
2129		OUTREG(PALETTE_30_DATA, 0x15555555);
2130	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~20);
2131	udelay(20);
2132	for (i=0; i<256; i++)
2133		OUTREG(PALETTE_30_DATA, 0x15555555);
2134
2135	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) & ~0x20);
2136	mdelay(3);
2137
2138	/* Restore TV stuff, make sure TV DAC is down */
2139	OUTREG(TV_MASTER_CNTL, rinfo->save_regs[88]);
2140	OUTREG(TV_DAC_CNTL, rinfo->save_regs[13] | 0x07000000);
2141
2142	/* Restore GPIOS. MacOS does some magic here with one of the GPIO bits,
2143	 * possibly related to the weird PLL related workarounds and to the
2144	 * fact that CLK_PIN_CNTL is tweaked in ways I don't fully understand,
2145	 * but we keep things the simple way here
2146	 */
2147	OUTREG(GPIOPAD_A, rinfo->save_regs[19]);
2148	OUTREG(GPIOPAD_EN, rinfo->save_regs[20]);
2149	OUTREG(GPIOPAD_MASK, rinfo->save_regs[21]);
2150
2151	/* Now do things with SCLK_MORE_CNTL. Force bits are already set, copy
2152	 * high bits from backup
2153	 */
2154	tmp = INPLL(pllSCLK_MORE_CNTL) & 0x0000ffff;
2155	tmp |= rinfo->save_regs[34] & 0xffff0000;
2156	tmp |= SCLK_MORE_CNTL__FORCE_DISPREGS;
2157	OUTPLL(pllSCLK_MORE_CNTL, tmp);
2158
2159	tmp = INPLL(pllSCLK_MORE_CNTL) & 0x0000ffff;
2160	tmp |= rinfo->save_regs[34] & 0xffff0000;
2161	tmp |= SCLK_MORE_CNTL__FORCE_DISPREGS;
2162	OUTPLL(pllSCLK_MORE_CNTL, tmp);
2163
2164	OUTREG(LVDS_GEN_CNTL, rinfo->save_regs[11] &
2165	       ~(LVDS_EN | LVDS_ON | LVDS_DIGON | LVDS_BLON | LVDS_BL_MOD_EN));
2166	OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) | LVDS_BLON);
2167	OUTREG(LVDS_PLL_CNTL, (rinfo->save_regs[12] & ~0xf0000) | 0x20000);
2168	mdelay(20);
2169
2170	/* write some stuff to the framebuffer... */
2171	for (i = 0; i < 0x8000; ++i)
2172		writeb(0, rinfo->fb_base + i);
2173
2174	OUTREG(0x2ec, 0x6332a020);
2175	OUTPLL(pllSSPLL_REF_DIV, rinfo->save_regs[44] /*0x3f */);
2176	OUTPLL(pllSSPLL_DIV_0, rinfo->save_regs[45] /*0x000081bb */);
2177	tmp = INPLL(pllSSPLL_CNTL);
2178	tmp &= ~2;
2179	OUTPLL(pllSSPLL_CNTL, tmp);
2180	mdelay(6);
2181	tmp &= ~1;
2182	OUTPLL(pllSSPLL_CNTL, tmp);
2183	mdelay(5);
2184	tmp |= 3;
2185	OUTPLL(pllSSPLL_CNTL, tmp);
2186	mdelay(5);
2187
2188	OUTPLL(pllSS_INT_CNTL, rinfo->save_regs[90] & ~3);/*0x0020300c*/
2189	OUTREG(0x2ec, 0x6332a3f0);
2190	mdelay(17);
2191
2192	OUTPLL(pllPPLL_REF_DIV, rinfo->pll.ref_div);
2193	OUTPLL(pllPPLL_DIV_0, rinfo->save_regs[92]);
2194
2195	mdelay(40);
2196	OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) | LVDS_DIGON | LVDS_ON);
2197	mdelay(40);
2198
2199	/* Restore a few more things */
2200	OUTREG(GRPH_BUFFER_CNTL, rinfo->save_regs[94]);
2201	OUTREG(GRPH2_BUFFER_CNTL, rinfo->save_regs[95]);
2202
2203	/* Restore PPLL, spread spectrum & LVDS */
2204	radeon_pm_m10_disable_spread_spectrum(rinfo);
2205	radeon_pm_restore_pixel_pll(rinfo);
2206	radeon_pm_m10_enable_lvds_spread_spectrum(rinfo);
2207}
2208#endif
2209#endif
2210
2211#if 0 /* Not ready yet */
2212static void radeon_reinitialize_QW(struct radeonfb_info *rinfo)
2213{
2214	int i;
2215	u32 tmp, tmp2;
2216	u32 cko, cka, ckb;
2217	u32 cgc, cec, c2gc;
2218
2219	OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
2220	OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
2221	OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
2222	OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
2223	OUTREG(BUS_CNTL, rinfo->save_regs[36]);
2224	OUTREG(RBBM_CNTL, rinfo->save_regs[39]);
2225
2226	INREG(PAD_CTLR_STRENGTH);
2227	OUTREG(PAD_CTLR_STRENGTH, INREG(PAD_CTLR_STRENGTH) & ~0x10000);
2228	for (i = 0; i < 65; ++i) {
2229		mdelay(1);
2230		INREG(PAD_CTLR_STRENGTH);
2231	}
2232
2233	OUTREG(DISP_TEST_DEBUG_CNTL, INREG(DISP_TEST_DEBUG_CNTL) | 0x10000000);
2234	OUTREG(OV0_FLAG_CNTRL, INREG(OV0_FLAG_CNTRL) | 0x100);
2235	OUTREG(CRTC_GEN_CNTL, INREG(CRTC_GEN_CNTL));
2236	OUTREG(DAC_CNTL, 0xff00410a);
2237	OUTREG(CRTC2_GEN_CNTL, INREG(CRTC2_GEN_CNTL));
2238	OUTREG(DAC_CNTL2, INREG(DAC_CNTL2) | 0x4000);
2239
2240	OUTREG(SURFACE_CNTL, rinfo->save_regs[29]);
2241	OUTREG(AGP_CNTL, rinfo->save_regs[16]);
2242	OUTREG(HOST_PATH_CNTL, rinfo->save_regs[41]);
2243	OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
2244
2245	OUTMC(rinfo, ixMC_CHP_IO_CNTL_A0, 0xf7bb4433);
2246	OUTREG(MC_IND_INDEX, 0);
2247	OUTMC(rinfo, ixMC_CHP_IO_CNTL_B0, 0xf7bb4433);
2248	OUTREG(MC_IND_INDEX, 0);
2249
2250	OUTREG(CRTC_MORE_CNTL, INREG(CRTC_MORE_CNTL));
2251
2252	tmp = INPLL(pllVCLK_ECP_CNTL);
2253	OUTPLL(pllVCLK_ECP_CNTL, tmp);
2254	tmp = INPLL(pllPIXCLKS_CNTL);
2255	OUTPLL(pllPIXCLKS_CNTL, tmp);
2256
2257	OUTPLL(MCLK_CNTL, 0xaa3f0000);
2258	OUTPLL(SCLK_CNTL, 0xffff0000);
2259	OUTPLL(pllMPLL_AUX_CNTL, 6);
2260	OUTPLL(pllSPLL_AUX_CNTL, 1);
2261	OUTPLL(MDLL_CKO, 0x9f009f);
2262	OUTPLL(MDLL_RDCKA, 0x830083);
2263	OUTPLL(pllMDLL_RDCKB, 0x830083);
2264	OUTPLL(PPLL_CNTL, 0xa433);
2265	OUTPLL(P2PLL_CNTL, 0xa433);
2266	OUTPLL(MPLL_CNTL, 0x0400a403);
2267	OUTPLL(SPLL_CNTL, 0x0400a433);
2268
2269	tmp = INPLL(M_SPLL_REF_FB_DIV);
2270	OUTPLL(M_SPLL_REF_FB_DIV, tmp);
2271	tmp = INPLL(M_SPLL_REF_FB_DIV);
2272	OUTPLL(M_SPLL_REF_FB_DIV, tmp | 0xc);
2273	INPLL(M_SPLL_REF_FB_DIV);
2274
2275	tmp = INPLL(MPLL_CNTL);
2276	OUTREG8(CLOCK_CNTL_INDEX, MPLL_CNTL + PLL_WR_EN);
2277	radeon_pll_errata_after_index(rinfo);
2278	OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
2279	radeon_pll_errata_after_data(rinfo);
2280
2281	tmp = INPLL(M_SPLL_REF_FB_DIV);
2282	OUTPLL(M_SPLL_REF_FB_DIV, tmp | 0x5900);
2283
2284	tmp = INPLL(MPLL_CNTL);
2285	OUTPLL(MPLL_CNTL, tmp & ~0x2);
2286	mdelay(1);
2287	tmp = INPLL(MPLL_CNTL);
2288	OUTPLL(MPLL_CNTL, tmp & ~0x1);
2289	mdelay(10);
2290
2291	OUTPLL(MCLK_CNTL, 0xaa3f1212);
2292	mdelay(1);
2293
2294	INPLL(M_SPLL_REF_FB_DIV);
2295	INPLL(MCLK_CNTL);
2296	INPLL(M_SPLL_REF_FB_DIV);
2297
2298	tmp = INPLL(SPLL_CNTL);
2299	OUTREG8(CLOCK_CNTL_INDEX, SPLL_CNTL + PLL_WR_EN);
2300	radeon_pll_errata_after_index(rinfo);
2301	OUTREG8(CLOCK_CNTL_DATA + 1, (tmp >> 8) & 0xff);
2302	radeon_pll_errata_after_data(rinfo);
2303
2304	tmp = INPLL(M_SPLL_REF_FB_DIV);
2305	OUTPLL(M_SPLL_REF_FB_DIV, tmp | 0x780000);
2306
2307	tmp = INPLL(SPLL_CNTL);
2308	OUTPLL(SPLL_CNTL, tmp & ~0x1);
2309	mdelay(1);
2310	tmp = INPLL(SPLL_CNTL);
2311	OUTPLL(SPLL_CNTL, tmp & ~0x2);
2312	mdelay(10);
2313
2314	tmp = INPLL(SCLK_CNTL);
2315	OUTPLL(SCLK_CNTL, tmp | 2);
2316	mdelay(1);
2317
2318	cko = INPLL(pllMDLL_CKO);
2319	cka = INPLL(pllMDLL_RDCKA);
2320	ckb = INPLL(pllMDLL_RDCKB);
2321
2322	cko &= ~(MDLL_CKO__MCKOA_SLEEP | MDLL_CKO__MCKOB_SLEEP);
2323	OUTPLL(pllMDLL_CKO, cko);
2324	mdelay(1);
2325	cko &= ~(MDLL_CKO__MCKOA_RESET | MDLL_CKO__MCKOB_RESET);
2326	OUTPLL(pllMDLL_CKO, cko);
2327	mdelay(5);
2328
2329	cka &= ~(MDLL_RDCKA__MRDCKA0_SLEEP | MDLL_RDCKA__MRDCKA1_SLEEP);
2330	OUTPLL(pllMDLL_RDCKA, cka);
2331	mdelay(1);
2332	cka &= ~(MDLL_RDCKA__MRDCKA0_RESET | MDLL_RDCKA__MRDCKA1_RESET);
2333	OUTPLL(pllMDLL_RDCKA, cka);
2334	mdelay(5);
2335
2336	ckb &= ~(MDLL_RDCKB__MRDCKB0_SLEEP | MDLL_RDCKB__MRDCKB1_SLEEP);
2337	OUTPLL(pllMDLL_RDCKB, ckb);
2338	mdelay(1);
2339	ckb &= ~(MDLL_RDCKB__MRDCKB0_RESET | MDLL_RDCKB__MRDCKB1_RESET);
2340	OUTPLL(pllMDLL_RDCKB, ckb);
2341	mdelay(5);
2342
2343	OUTMC(rinfo, ixMC_CHP_IO_CNTL_A1, 0x151550ff);
2344	OUTREG(MC_IND_INDEX, 0);
2345	OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, 0x151550ff);
2346	OUTREG(MC_IND_INDEX, 0);
2347	mdelay(1);
2348	OUTMC(rinfo, ixMC_CHP_IO_CNTL_A1, 0x141550ff);
2349	OUTREG(MC_IND_INDEX, 0);
2350	OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, 0x141550ff);
2351	OUTREG(MC_IND_INDEX, 0);
2352	mdelay(1);
2353
2354	OUTPLL(pllHTOTAL_CNTL, 0);
2355	OUTPLL(pllHTOTAL2_CNTL, 0);
2356
2357	OUTREG(MEM_CNTL, 0x29002901);
2358	OUTREG(MEM_SDRAM_MODE_REG, 0x45320032);	/* XXX use save_regs[35]? */
2359	OUTREG(EXT_MEM_CNTL, 0x1a394333);
2360	OUTREG(MEM_IO_CNTL_A1, 0x0aac0aac);
2361	OUTREG(MEM_INIT_LATENCY_TIMER, 0x34444444);
2362	OUTREG(MEM_REFRESH_CNTL, 0x1f1f7218);	/* XXX or save_regs[42]? */
2363	OUTREG(MC_DEBUG, 0);
2364	OUTREG(MEM_IO_OE_CNTL, 0x04300430);
2365
2366	OUTMC(rinfo, ixMC_IMP_CNTL, 0x00f460d6);
2367	OUTREG(MC_IND_INDEX, 0);
2368	OUTMC(rinfo, ixMC_IMP_CNTL_0, 0x00009249);
2369	OUTREG(MC_IND_INDEX, 0);
2370
2371	OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
2372
2373	radeon_pm_full_reset_sdram(rinfo);
2374
2375	INREG(FP_GEN_CNTL);
2376	OUTREG(TMDS_CNTL, 0x01000000);	/* XXX ? */
2377	tmp = INREG(FP_GEN_CNTL);
2378	tmp |= FP_CRTC_DONT_SHADOW_HEND | FP_CRTC_DONT_SHADOW_VPAR | 0x200;
2379	OUTREG(FP_GEN_CNTL, tmp);
2380
2381	tmp = INREG(DISP_OUTPUT_CNTL);
2382	tmp &= ~0x400;
2383	OUTREG(DISP_OUTPUT_CNTL, tmp);
2384
2385	OUTPLL(CLK_PIN_CNTL, rinfo->save_regs[4]);
2386	OUTPLL(CLK_PWRMGT_CNTL, rinfo->save_regs[1]);
2387	OUTPLL(PLL_PWRMGT_CNTL, rinfo->save_regs[0]);
2388
2389	tmp = INPLL(MCLK_MISC);
2390	tmp |= MCLK_MISC__MC_MCLK_DYN_ENABLE | MCLK_MISC__IO_MCLK_DYN_ENABLE;
2391	OUTPLL(MCLK_MISC, tmp);
2392
2393	tmp = INPLL(SCLK_CNTL);
2394	OUTPLL(SCLK_CNTL, tmp);
2395
2396	OUTREG(CRTC_MORE_CNTL, 0);
2397	OUTREG8(CRTC_GEN_CNTL+1, 6);
2398	OUTREG8(CRTC_GEN_CNTL+3, 1);
2399	OUTREG(CRTC_PITCH, 32);
2400
2401	tmp = INPLL(VCLK_ECP_CNTL);
2402	OUTPLL(VCLK_ECP_CNTL, tmp);
2403
2404	tmp = INPLL(PPLL_CNTL);
2405	OUTPLL(PPLL_CNTL, tmp);
2406
2407	/* palette stuff and BIOS_1_SCRATCH... */
2408
2409	tmp = INREG(FP_GEN_CNTL);
2410	tmp2 = INREG(TMDS_TRANSMITTER_CNTL);
2411	tmp |= 2;
2412	OUTREG(FP_GEN_CNTL, tmp);
2413	mdelay(5);
2414	OUTREG(FP_GEN_CNTL, tmp);
2415	mdelay(5);
2416	OUTREG(TMDS_TRANSMITTER_CNTL, tmp2);
2417	OUTREG(CRTC_MORE_CNTL, 0);
2418	mdelay(20);
2419
2420	tmp = INREG(CRTC_MORE_CNTL);
2421	OUTREG(CRTC_MORE_CNTL, tmp);
2422
2423	cgc = INREG(CRTC_GEN_CNTL);
2424	cec = INREG(CRTC_EXT_CNTL);
2425	c2gc = INREG(CRTC2_GEN_CNTL);
2426
2427	OUTREG(CRTC_H_SYNC_STRT_WID, 0x008e0580);
2428	OUTREG(CRTC_H_TOTAL_DISP, 0x009f00d2);
2429	OUTREG8(CLOCK_CNTL_INDEX, HTOTAL_CNTL + PLL_WR_EN);
2430	radeon_pll_errata_after_index(rinfo);
2431	OUTREG8(CLOCK_CNTL_DATA, 0);
2432	radeon_pll_errata_after_data(rinfo);
2433	OUTREG(CRTC_V_SYNC_STRT_WID, 0x00830403);
2434	OUTREG(CRTC_V_TOTAL_DISP, 0x03ff0429);
2435	OUTREG(FP_CRTC_H_TOTAL_DISP, 0x009f0033);
2436	OUTREG(FP_H_SYNC_STRT_WID, 0x008e0080);
2437	OUTREG(CRT_CRTC_H_SYNC_STRT_WID, 0x008e0080);
2438	OUTREG(FP_CRTC_V_TOTAL_DISP, 0x03ff002a);
2439	OUTREG(FP_V_SYNC_STRT_WID, 0x00830004);
2440	OUTREG(CRT_CRTC_V_SYNC_STRT_WID, 0x00830004);
2441	OUTREG(FP_HORZ_VERT_ACTIVE, 0x009f03ff);
2442	OUTREG(FP_HORZ_STRETCH, 0);
2443	OUTREG(FP_VERT_STRETCH, 0);
2444	OUTREG(OVR_CLR, 0);
2445	OUTREG(OVR_WID_LEFT_RIGHT, 0);
2446	OUTREG(OVR_WID_TOP_BOTTOM, 0);
2447
2448	tmp = INPLL(PPLL_REF_DIV);
2449	tmp = (tmp & ~PPLL_REF_DIV_MASK) | rinfo->pll.ref_div;
2450	OUTPLL(PPLL_REF_DIV, tmp);
2451	INPLL(PPLL_REF_DIV);
2452
2453	OUTREG8(CLOCK_CNTL_INDEX, PPLL_CNTL + PLL_WR_EN);
2454	radeon_pll_errata_after_index(rinfo);
2455	OUTREG8(CLOCK_CNTL_DATA + 1, 0xbc);
2456	radeon_pll_errata_after_data(rinfo);
2457
2458	tmp = INREG(CLOCK_CNTL_INDEX);
2459	radeon_pll_errata_after_index(rinfo);
2460	OUTREG(CLOCK_CNTL_INDEX, tmp & 0xff);
2461	radeon_pll_errata_after_index(rinfo);
2462	radeon_pll_errata_after_data(rinfo);
2463
2464	OUTPLL(PPLL_DIV_0, 0x48090);
2465
2466	tmp = INPLL(PPLL_CNTL);
2467	OUTPLL(PPLL_CNTL, tmp & ~0x2);
2468	mdelay(1);
2469	tmp = INPLL(PPLL_CNTL);
2470	OUTPLL(PPLL_CNTL, tmp & ~0x1);
2471	mdelay(10);
2472
2473	tmp = INPLL(VCLK_ECP_CNTL);
2474	OUTPLL(VCLK_ECP_CNTL, tmp | 3);
2475	mdelay(1);
2476
2477	tmp = INPLL(VCLK_ECP_CNTL);
2478	OUTPLL(VCLK_ECP_CNTL, tmp);
2479
2480	c2gc |= CRTC2_DISP_REQ_EN_B;
2481	OUTREG(CRTC2_GEN_CNTL, c2gc);
2482	cgc |= CRTC_EN;
2483	OUTREG(CRTC_GEN_CNTL, cgc);
2484	OUTREG(CRTC_EXT_CNTL, cec);
2485	OUTREG(CRTC_PITCH, 0xa0);
2486	OUTREG(CRTC_OFFSET, 0);
2487	OUTREG(CRTC_OFFSET_CNTL, 0);
2488
2489	OUTREG(GRPH_BUFFER_CNTL, 0x20117c7c);
2490	OUTREG(GRPH2_BUFFER_CNTL, 0x00205c5c);
2491
2492	tmp2 = INREG(FP_GEN_CNTL);
2493	tmp = INREG(TMDS_TRANSMITTER_CNTL);
2494	OUTREG(0x2a8, 0x0000061b);
2495	tmp |= TMDS_PLL_EN;
2496	OUTREG(TMDS_TRANSMITTER_CNTL, tmp);
2497	mdelay(1);
2498	tmp &= ~TMDS_PLLRST;
2499	OUTREG(TMDS_TRANSMITTER_CNTL, tmp);
2500	tmp2 &= ~2;
2501	tmp2 |= FP_TMDS_EN;
2502	OUTREG(FP_GEN_CNTL, tmp2);
2503	mdelay(5);
2504	tmp2 |= FP_FPON;
2505	OUTREG(FP_GEN_CNTL, tmp2);
2506
2507	OUTREG(CUR_HORZ_VERT_OFF, CUR_LOCK | 1);
2508	cgc = INREG(CRTC_GEN_CNTL);
2509	OUTREG(CUR_HORZ_VERT_POSN, 0xbfff0fff);
2510	cgc |= 0x10000;
2511	OUTREG(CUR_OFFSET, 0);
2512}
2513#endif /* 0 */
2514
2515#endif /* CONFIG_PPC_OF */
2516
2517static void radeonfb_whack_power_state(struct radeonfb_info *rinfo, pci_power_t state)
2518{
2519	u16 pwr_cmd;
2520
2521	for (;;) {
2522		pci_read_config_word(rinfo->pdev,
2523				     rinfo->pdev->pm_cap + PCI_PM_CTRL,
2524				     &pwr_cmd);
2525		if (pwr_cmd & state)
2526			break;
2527		pwr_cmd = (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | state;
2528		pci_write_config_word(rinfo->pdev,
2529				      rinfo->pdev->pm_cap + PCI_PM_CTRL,
2530				      pwr_cmd);
2531		msleep(500);
2532	}
2533	rinfo->pdev->current_state = state;
2534}
2535
2536static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend)
2537{
2538	u32 tmp;
2539
2540	if (!rinfo->pdev->pm_cap)
2541		return;
2542
2543	/* Set the chip into appropriate suspend mode (we use D2,
2544	 * D3 would require a compete re-initialization of the chip,
2545	 * including PCI config registers, clocks, AGP conf, ...)
2546	 */
2547	if (suspend) {
2548		printk(KERN_DEBUG "radeonfb (%s): switching to D2 state...\n",
2549		       pci_name(rinfo->pdev));
2550
2551		/* Disable dynamic power management of clocks for the
2552		 * duration of the suspend/resume process
2553		 */
2554		radeon_pm_disable_dynamic_mode(rinfo);
2555
2556		/* Save some registers */
2557		radeon_pm_save_regs(rinfo, 0);
2558
2559		/* Prepare mobility chips for suspend.
2560		 */
2561		if (rinfo->is_mobility) {
2562			/* Program V2CLK */
2563			radeon_pm_program_v2clk(rinfo);
2564
2565			/* Disable IO PADs */
2566			radeon_pm_disable_iopad(rinfo);
2567
2568			/* Set low current */
2569			radeon_pm_low_current(rinfo);
2570
2571			/* Prepare chip for power management */
2572			radeon_pm_setup_for_suspend(rinfo);
2573
2574			if (rinfo->family <= CHIP_FAMILY_RV280) {
2575				/* Reset the MDLL */
2576				/* because both INPLL and OUTPLL take the same
2577				 * lock, that's why. */
2578				tmp = INPLL( pllMDLL_CKO) | MDLL_CKO__MCKOA_RESET
2579					| MDLL_CKO__MCKOB_RESET;
2580				OUTPLL( pllMDLL_CKO, tmp );
2581			}
2582		}
2583
2584		/* Switch PCI power management to D2. */
2585		pci_disable_device(rinfo->pdev);
2586		pci_save_state(rinfo->pdev);
2587		/* The chip seems to need us to whack the PM register
2588		 * repeatedly until it sticks. We do that -prior- to
2589		 * calling pci_set_power_state()
2590		 */
2591		radeonfb_whack_power_state(rinfo, PCI_D2);
2592		__pci_complete_power_transition(rinfo->pdev, PCI_D2);
2593	} else {
2594		printk(KERN_DEBUG "radeonfb (%s): switching to D0 state...\n",
2595		       pci_name(rinfo->pdev));
2596
2597		if (rinfo->family <= CHIP_FAMILY_RV250) {
2598			/* Reset the SDRAM controller  */
2599			radeon_pm_full_reset_sdram(rinfo);
2600
2601			/* Restore some registers */
2602			radeon_pm_restore_regs(rinfo);
2603		} else {
2604			/* Restore registers first */
2605			radeon_pm_restore_regs(rinfo);
2606			/* init sdram controller */
2607			radeon_pm_full_reset_sdram(rinfo);
2608		}
2609	}
2610}
2611
2612int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
2613{
2614        struct fb_info *info = pci_get_drvdata(pdev);
2615        struct radeonfb_info *rinfo = info->par;
2616
2617	if (mesg.event == pdev->dev.power.power_state.event)
2618		return 0;
2619
2620	printk(KERN_DEBUG "radeonfb (%s): suspending for event: %d...\n",
2621	       pci_name(pdev), mesg.event);
2622
2623	/* For suspend-to-disk, we cheat here. We don't suspend anything and
2624	 * let fbcon continue drawing until we are all set. That shouldn't
2625	 * really cause any problem at this point, provided that the wakeup
2626	 * code knows that any state in memory may not match the HW
2627	 */
2628	switch (mesg.event) {
2629	case PM_EVENT_FREEZE:		/* about to take snapshot */
2630	case PM_EVENT_PRETHAW:		/* before restoring snapshot */
2631		goto done;
2632	}
2633
2634	console_lock();
2635
2636	fb_set_suspend(info, 1);
2637
2638	if (!(info->flags & FBINFO_HWACCEL_DISABLED)) {
2639		/* Make sure engine is reset */
2640		radeon_engine_idle();
2641		radeonfb_engine_reset(rinfo);
2642		radeon_engine_idle();
2643	}
2644
2645	/* Blank display and LCD */
2646	radeon_screen_blank(rinfo, FB_BLANK_POWERDOWN, 1);
2647
2648	/* Sleep */
2649	rinfo->asleep = 1;
2650	rinfo->lock_blank = 1;
2651	del_timer_sync(&rinfo->lvds_timer);
2652
2653#ifdef CONFIG_PPC_PMAC
2654	/* On powermac, we have hooks to properly suspend/resume AGP now,
2655	 * use them here. We'll ultimately need some generic support here,
2656	 * but the generic code isn't quite ready for that yet
2657	 */
2658	pmac_suspend_agp_for_card(pdev);
2659#endif /* CONFIG_PPC_PMAC */
2660
2661	/* It's unclear whether or when the generic code will do that, so let's
2662	 * do it ourselves. We save state before we do any power management
2663	 */
2664	pci_save_state(pdev);
2665
2666	/* If we support wakeup from poweroff, we save all regs we can including cfg
2667	 * space
2668	 */
2669	if (rinfo->pm_mode & radeon_pm_off) {
2670		/* Always disable dynamic clocks or weird things are happening when
2671		 * the chip goes off (basically the panel doesn't shut down properly
2672		 * and we crash on wakeup),
2673		 * also, we want the saved regs context to have no dynamic clocks in
2674		 * it, we'll restore the dynamic clocks state on wakeup
2675		 */
2676		radeon_pm_disable_dynamic_mode(rinfo);
2677		mdelay(50);
2678		radeon_pm_save_regs(rinfo, 1);
2679
2680		if (rinfo->is_mobility && !(rinfo->pm_mode & radeon_pm_d2)) {
2681			/* Switch off LVDS interface */
2682			mdelay(1);
2683			OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_BL_MOD_EN));
2684			mdelay(1);
2685			OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_EN | LVDS_ON));
2686			OUTREG(LVDS_PLL_CNTL, (INREG(LVDS_PLL_CNTL) & ~30000) | 0x20000);
2687			mdelay(20);
2688			OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_DIGON));
2689		}
2690		pci_disable_device(pdev);
2691	}
2692	/* If we support D2, we go to it (should be fixed later with a flag forcing
2693	 * D3 only for some laptops)
2694	 */
2695	if (rinfo->pm_mode & radeon_pm_d2)
2696		radeon_set_suspend(rinfo, 1);
2697
2698	console_unlock();
2699
2700 done:
2701	pdev->dev.power.power_state = mesg;
2702
2703	return 0;
2704}
2705
2706static int radeon_check_power_loss(struct radeonfb_info *rinfo)
2707{
2708	return rinfo->save_regs[4] != INPLL(CLK_PIN_CNTL) ||
2709	       rinfo->save_regs[2] != INPLL(MCLK_CNTL) ||
2710	       rinfo->save_regs[3] != INPLL(SCLK_CNTL);
2711}
2712
2713int radeonfb_pci_resume(struct pci_dev *pdev)
2714{
2715        struct fb_info *info = pci_get_drvdata(pdev);
2716        struct radeonfb_info *rinfo = info->par;
2717	int rc = 0;
2718
2719	if (pdev->dev.power.power_state.event == PM_EVENT_ON)
2720		return 0;
2721
2722	if (rinfo->no_schedule) {
2723		if (!console_trylock())
2724			return 0;
2725	} else
2726		console_lock();
2727
2728	printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
2729	       pci_name(pdev), pdev->dev.power.power_state.event);
2730
2731	/* PCI state will have been restored by the core, so
2732	 * we should be in D0 now with our config space fully
2733	 * restored
2734	 */
2735	if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
2736		/* Wakeup chip */
2737		if ((rinfo->pm_mode & radeon_pm_off) && radeon_check_power_loss(rinfo)) {
2738			if (rinfo->reinit_func != NULL)
2739				rinfo->reinit_func(rinfo);
2740			else {
2741				printk(KERN_ERR "radeonfb (%s): can't resume radeon from"
2742				       " D3 cold, need softboot !", pci_name(pdev));
2743				rc = -EIO;
2744				goto bail;
2745			}
2746		}
2747		/* If we support D2, try to resume... we should check what was our
2748		 * state though... (were we really in D2 state ?). Right now, this code
2749		 * is only enable on Macs so it's fine.
2750		 */
2751		else if (rinfo->pm_mode & radeon_pm_d2)
2752			radeon_set_suspend(rinfo, 0);
2753
2754		rinfo->asleep = 0;
2755	} else
2756		radeon_engine_idle();
2757
2758	/* Restore display & engine */
2759	radeon_write_mode (rinfo, &rinfo->state, 1);
2760	if (!(info->flags & FBINFO_HWACCEL_DISABLED))
2761		radeonfb_engine_init (rinfo);
2762
2763	fb_pan_display(info, &info->var);
2764	fb_set_cmap(&info->cmap, info);
2765
2766	/* Refresh */
2767	fb_set_suspend(info, 0);
2768
2769	/* Unblank */
2770	rinfo->lock_blank = 0;
2771	radeon_screen_blank(rinfo, FB_BLANK_UNBLANK, 1);
2772
2773#ifdef CONFIG_PPC_PMAC
2774	/* On powermac, we have hooks to properly suspend/resume AGP now,
2775	 * use them here. We'll ultimately need some generic support here,
2776	 * but the generic code isn't quite ready for that yet
2777	 */
2778	pmac_resume_agp_for_card(pdev);
2779#endif /* CONFIG_PPC_PMAC */
2780
2781
2782	/* Check status of dynclk */
2783	if (rinfo->dynclk == 1)
2784		radeon_pm_enable_dynamic_mode(rinfo);
2785	else if (rinfo->dynclk == 0)
2786		radeon_pm_disable_dynamic_mode(rinfo);
2787
2788	pdev->dev.power.power_state = PMSG_ON;
2789
2790 bail:
2791	console_unlock();
2792
2793	return rc;
2794}
2795
2796#ifdef CONFIG_PPC_OF__disabled
2797static void radeonfb_early_resume(void *data)
2798{
2799        struct radeonfb_info *rinfo = data;
2800
2801	rinfo->no_schedule = 1;
2802	pci_restore_state(rinfo->pdev);
2803	radeonfb_pci_resume(rinfo->pdev);
2804	rinfo->no_schedule = 0;
2805}
2806#endif /* CONFIG_PPC_OF */
2807
2808#endif /* CONFIG_PM */
2809
2810void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep)
2811{
2812	/* Enable/Disable dynamic clocks: TODO add sysfs access */
2813	if (rinfo->family == CHIP_FAMILY_RS480)
2814		rinfo->dynclk = -1;
2815	else
2816		rinfo->dynclk = dynclk;
2817
2818	if (rinfo->dynclk == 1) {
2819		radeon_pm_enable_dynamic_mode(rinfo);
2820		printk("radeonfb: Dynamic Clock Power Management enabled\n");
2821	} else if (rinfo->dynclk == 0) {
2822		radeon_pm_disable_dynamic_mode(rinfo);
2823		printk("radeonfb: Dynamic Clock Power Management disabled\n");
2824	}
2825
2826#if defined(CONFIG_PM)
2827#if defined(CONFIG_PPC_PMAC)
2828	/* Check if we can power manage on suspend/resume. We can do
2829	 * D2 on M6, M7 and M9, and we can resume from D3 cold a few other
2830	 * "Mac" cards, but that's all. We need more infos about what the
2831	 * BIOS does tho. Right now, all this PM stuff is pmac-only for that
2832	 * reason. --BenH
2833	 */
2834	if (machine_is(powermac) && rinfo->of_node) {
2835		if (rinfo->is_mobility && rinfo->pdev->pm_cap &&
2836		    rinfo->family <= CHIP_FAMILY_RV250)
2837			rinfo->pm_mode |= radeon_pm_d2;
2838
2839		/* We can restart Jasper (M10 chip in albooks), BlueStone (7500 chip
2840		 * in some desktop G4s), Via (M9+ chip on iBook G4) and
2841		 * Snowy (M11 chip on iBook G4 manufactured after July 2005)
2842		 */
2843		if (!strcmp(rinfo->of_node->name, "ATY,JasperParent") ||
2844		    !strcmp(rinfo->of_node->name, "ATY,SnowyParent")) {
2845			rinfo->reinit_func = radeon_reinitialize_M10;
2846			rinfo->pm_mode |= radeon_pm_off;
2847		}
2848#if 0 /* Not ready yet */
2849		if (!strcmp(rinfo->of_node->name, "ATY,BlueStoneParent")) {
2850			rinfo->reinit_func = radeon_reinitialize_QW;
2851			rinfo->pm_mode |= radeon_pm_off;
2852		}
2853#endif
2854		if (!strcmp(rinfo->of_node->name, "ATY,ViaParent")) {
2855			rinfo->reinit_func = radeon_reinitialize_M9P;
2856			rinfo->pm_mode |= radeon_pm_off;
2857		}
2858
2859		/* If any of the above is set, we assume the machine can sleep/resume.
2860		 * It's a bit of a "shortcut" but will work fine. Ideally, we need infos
2861		 * from the platform about what happens to the chip...
2862		 * Now we tell the platform about our capability
2863		 */
2864		if (rinfo->pm_mode != radeon_pm_none) {
2865			pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, rinfo->of_node, 0, 1);
2866#if 0 /* Disable the early video resume hack for now as it's causing problems, among
2867       * others we now rely on the PCI core restoring the config space for us, which
2868       * isn't the case with that hack, and that code path causes various things to
2869       * be called with interrupts off while they shouldn't. I'm leaving the code in
2870       * as it can be useful for debugging purposes
2871       */
2872			pmac_set_early_video_resume(radeonfb_early_resume, rinfo);
2873#endif
2874		}
2875
2876#if 0
2877		/* Power down TV DAC, that saves a significant amount of power,
2878		 * we'll have something better once we actually have some TVOut
2879		 * support
2880		 */
2881		OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000);
2882#endif
2883	}
2884#endif /* defined(CONFIG_PPC_PMAC) */
2885#endif /* defined(CONFIG_PM) */
2886
2887	if (ignore_devlist)
2888		printk(KERN_DEBUG
2889		       "radeonfb: skipping test for device workarounds\n");
2890	else
2891		radeon_apply_workarounds(rinfo);
2892
2893	if (force_sleep) {
2894		printk(KERN_DEBUG
2895		       "radeonfb: forcefully enabling D2 sleep mode\n");
2896		rinfo->pm_mode |= radeon_pm_d2;
2897	}
2898}
2899
2900void radeonfb_pm_exit(struct radeonfb_info *rinfo)
2901{
2902#if defined(CONFIG_PM) && defined(CONFIG_PPC_PMAC)
2903	if (rinfo->pm_mode != radeon_pm_none)
2904		pmac_set_early_video_resume(NULL, NULL);
2905#endif
2906}
2907