xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/radeon/radeon_clocks.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2008 Advanced Micro Devices, Inc.
3*4882a593Smuzhiyun  * Copyright 2008 Red Hat Inc.
4*4882a593Smuzhiyun  * Copyright 2009 Jerome Glisse.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
7*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
8*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
9*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
11*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
14*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * Authors: Dave Airlie
25*4882a593Smuzhiyun  *          Alex Deucher
26*4882a593Smuzhiyun  *          Jerome Glisse
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include <linux/pci.h>
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #include <drm/drm_device.h>
32*4882a593Smuzhiyun #include <drm/radeon_drm.h>
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include "atom.h"
35*4882a593Smuzhiyun #include "radeon.h"
36*4882a593Smuzhiyun #include "radeon_asic.h"
37*4882a593Smuzhiyun #include "radeon_reg.h"
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* 10 khz */
radeon_legacy_get_engine_clock(struct radeon_device * rdev)40*4882a593Smuzhiyun uint32_t radeon_legacy_get_engine_clock(struct radeon_device *rdev)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun 	struct radeon_pll *spll = &rdev->clock.spll;
43*4882a593Smuzhiyun 	uint32_t fb_div, ref_div, post_div, sclk;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
46*4882a593Smuzhiyun 	fb_div = (fb_div >> RADEON_SPLL_FB_DIV_SHIFT) & RADEON_SPLL_FB_DIV_MASK;
47*4882a593Smuzhiyun 	fb_div <<= 1;
48*4882a593Smuzhiyun 	fb_div *= spll->reference_freq;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	ref_div =
51*4882a593Smuzhiyun 	    RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	if (ref_div == 0)
54*4882a593Smuzhiyun 		return 0;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	sclk = fb_div / ref_div;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	post_div = RREG32_PLL(RADEON_SCLK_CNTL) & RADEON_SCLK_SRC_SEL_MASK;
59*4882a593Smuzhiyun 	if (post_div == 2)
60*4882a593Smuzhiyun 		sclk >>= 1;
61*4882a593Smuzhiyun 	else if (post_div == 3)
62*4882a593Smuzhiyun 		sclk >>= 2;
63*4882a593Smuzhiyun 	else if (post_div == 4)
64*4882a593Smuzhiyun 		sclk >>= 3;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	return sclk;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /* 10 khz */
radeon_legacy_get_memory_clock(struct radeon_device * rdev)70*4882a593Smuzhiyun uint32_t radeon_legacy_get_memory_clock(struct radeon_device *rdev)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	struct radeon_pll *mpll = &rdev->clock.mpll;
73*4882a593Smuzhiyun 	uint32_t fb_div, ref_div, post_div, mclk;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
76*4882a593Smuzhiyun 	fb_div = (fb_div >> RADEON_MPLL_FB_DIV_SHIFT) & RADEON_MPLL_FB_DIV_MASK;
77*4882a593Smuzhiyun 	fb_div <<= 1;
78*4882a593Smuzhiyun 	fb_div *= mpll->reference_freq;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	ref_div =
81*4882a593Smuzhiyun 	    RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	if (ref_div == 0)
84*4882a593Smuzhiyun 		return 0;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	mclk = fb_div / ref_div;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	post_div = RREG32_PLL(RADEON_MCLK_CNTL) & 0x7;
89*4882a593Smuzhiyun 	if (post_div == 2)
90*4882a593Smuzhiyun 		mclk >>= 1;
91*4882a593Smuzhiyun 	else if (post_div == 3)
92*4882a593Smuzhiyun 		mclk >>= 2;
93*4882a593Smuzhiyun 	else if (post_div == 4)
94*4882a593Smuzhiyun 		mclk >>= 3;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	return mclk;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #ifdef CONFIG_OF
100*4882a593Smuzhiyun /*
101*4882a593Smuzhiyun  * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
102*4882a593Smuzhiyun  * tree. Hopefully, ATI OF driver is kind enough to fill these
103*4882a593Smuzhiyun  */
radeon_read_clocks_OF(struct drm_device * dev)104*4882a593Smuzhiyun static bool radeon_read_clocks_OF(struct drm_device *dev)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	struct radeon_device *rdev = dev->dev_private;
107*4882a593Smuzhiyun 	struct device_node *dp = rdev->pdev->dev.of_node;
108*4882a593Smuzhiyun 	const u32 *val;
109*4882a593Smuzhiyun 	struct radeon_pll *p1pll = &rdev->clock.p1pll;
110*4882a593Smuzhiyun 	struct radeon_pll *p2pll = &rdev->clock.p2pll;
111*4882a593Smuzhiyun 	struct radeon_pll *spll = &rdev->clock.spll;
112*4882a593Smuzhiyun 	struct radeon_pll *mpll = &rdev->clock.mpll;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	if (dp == NULL)
115*4882a593Smuzhiyun 		return false;
116*4882a593Smuzhiyun 	val = of_get_property(dp, "ATY,RefCLK", NULL);
117*4882a593Smuzhiyun 	if (!val || !*val) {
118*4882a593Smuzhiyun 		pr_warn("radeonfb: No ATY,RefCLK property !\n");
119*4882a593Smuzhiyun 		return false;
120*4882a593Smuzhiyun 	}
121*4882a593Smuzhiyun 	p1pll->reference_freq = p2pll->reference_freq = (*val) / 10;
122*4882a593Smuzhiyun 	p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
123*4882a593Smuzhiyun 	if (p1pll->reference_div < 2)
124*4882a593Smuzhiyun 		p1pll->reference_div = 12;
125*4882a593Smuzhiyun 	p2pll->reference_div = p1pll->reference_div;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	/* These aren't in the device-tree */
128*4882a593Smuzhiyun 	if (rdev->family >= CHIP_R420) {
129*4882a593Smuzhiyun 		p1pll->pll_in_min = 100;
130*4882a593Smuzhiyun 		p1pll->pll_in_max = 1350;
131*4882a593Smuzhiyun 		p1pll->pll_out_min = 20000;
132*4882a593Smuzhiyun 		p1pll->pll_out_max = 50000;
133*4882a593Smuzhiyun 		p2pll->pll_in_min = 100;
134*4882a593Smuzhiyun 		p2pll->pll_in_max = 1350;
135*4882a593Smuzhiyun 		p2pll->pll_out_min = 20000;
136*4882a593Smuzhiyun 		p2pll->pll_out_max = 50000;
137*4882a593Smuzhiyun 	} else {
138*4882a593Smuzhiyun 		p1pll->pll_in_min = 40;
139*4882a593Smuzhiyun 		p1pll->pll_in_max = 500;
140*4882a593Smuzhiyun 		p1pll->pll_out_min = 12500;
141*4882a593Smuzhiyun 		p1pll->pll_out_max = 35000;
142*4882a593Smuzhiyun 		p2pll->pll_in_min = 40;
143*4882a593Smuzhiyun 		p2pll->pll_in_max = 500;
144*4882a593Smuzhiyun 		p2pll->pll_out_min = 12500;
145*4882a593Smuzhiyun 		p2pll->pll_out_max = 35000;
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun 	/* not sure what the max should be in all cases */
148*4882a593Smuzhiyun 	rdev->clock.max_pixel_clock = 35000;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
151*4882a593Smuzhiyun 	spll->reference_div = mpll->reference_div =
152*4882a593Smuzhiyun 		RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
153*4882a593Smuzhiyun 			    RADEON_M_SPLL_REF_DIV_MASK;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	val = of_get_property(dp, "ATY,SCLK", NULL);
156*4882a593Smuzhiyun 	if (val && *val)
157*4882a593Smuzhiyun 		rdev->clock.default_sclk = (*val) / 10;
158*4882a593Smuzhiyun 	else
159*4882a593Smuzhiyun 		rdev->clock.default_sclk =
160*4882a593Smuzhiyun 			radeon_legacy_get_engine_clock(rdev);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	val = of_get_property(dp, "ATY,MCLK", NULL);
163*4882a593Smuzhiyun 	if (val && *val)
164*4882a593Smuzhiyun 		rdev->clock.default_mclk = (*val) / 10;
165*4882a593Smuzhiyun 	else
166*4882a593Smuzhiyun 		rdev->clock.default_mclk =
167*4882a593Smuzhiyun 			radeon_legacy_get_memory_clock(rdev);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	DRM_INFO("Using device-tree clock info\n");
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	return true;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun #else
radeon_read_clocks_OF(struct drm_device * dev)174*4882a593Smuzhiyun static bool radeon_read_clocks_OF(struct drm_device *dev)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	return false;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun #endif /* CONFIG_OF */
179*4882a593Smuzhiyun 
radeon_get_clock_info(struct drm_device * dev)180*4882a593Smuzhiyun void radeon_get_clock_info(struct drm_device *dev)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun 	struct radeon_device *rdev = dev->dev_private;
183*4882a593Smuzhiyun 	struct radeon_pll *p1pll = &rdev->clock.p1pll;
184*4882a593Smuzhiyun 	struct radeon_pll *p2pll = &rdev->clock.p2pll;
185*4882a593Smuzhiyun 	struct radeon_pll *dcpll = &rdev->clock.dcpll;
186*4882a593Smuzhiyun 	struct radeon_pll *spll = &rdev->clock.spll;
187*4882a593Smuzhiyun 	struct radeon_pll *mpll = &rdev->clock.mpll;
188*4882a593Smuzhiyun 	int ret;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	if (rdev->is_atom_bios)
191*4882a593Smuzhiyun 		ret = radeon_atom_get_clock_info(dev);
192*4882a593Smuzhiyun 	else
193*4882a593Smuzhiyun 		ret = radeon_combios_get_clock_info(dev);
194*4882a593Smuzhiyun 	if (!ret)
195*4882a593Smuzhiyun 		ret = radeon_read_clocks_OF(dev);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	if (ret) {
198*4882a593Smuzhiyun 		if (p1pll->reference_div < 2) {
199*4882a593Smuzhiyun 			if (!ASIC_IS_AVIVO(rdev)) {
200*4882a593Smuzhiyun 				u32 tmp = RREG32_PLL(RADEON_PPLL_REF_DIV);
201*4882a593Smuzhiyun 				if (ASIC_IS_R300(rdev))
202*4882a593Smuzhiyun 					p1pll->reference_div =
203*4882a593Smuzhiyun 						(tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
204*4882a593Smuzhiyun 				else
205*4882a593Smuzhiyun 					p1pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
206*4882a593Smuzhiyun 				if (p1pll->reference_div < 2)
207*4882a593Smuzhiyun 					p1pll->reference_div = 12;
208*4882a593Smuzhiyun 			} else
209*4882a593Smuzhiyun 				p1pll->reference_div = 12;
210*4882a593Smuzhiyun 		}
211*4882a593Smuzhiyun 		if (p2pll->reference_div < 2)
212*4882a593Smuzhiyun 			p2pll->reference_div = 12;
213*4882a593Smuzhiyun 		if (rdev->family < CHIP_RS600) {
214*4882a593Smuzhiyun 			if (spll->reference_div < 2)
215*4882a593Smuzhiyun 				spll->reference_div =
216*4882a593Smuzhiyun 					RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
217*4882a593Smuzhiyun 					RADEON_M_SPLL_REF_DIV_MASK;
218*4882a593Smuzhiyun 		}
219*4882a593Smuzhiyun 		if (mpll->reference_div < 2)
220*4882a593Smuzhiyun 			mpll->reference_div = spll->reference_div;
221*4882a593Smuzhiyun 	} else {
222*4882a593Smuzhiyun 		if (ASIC_IS_AVIVO(rdev)) {
223*4882a593Smuzhiyun 			/* TODO FALLBACK */
224*4882a593Smuzhiyun 		} else {
225*4882a593Smuzhiyun 			DRM_INFO("Using generic clock info\n");
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 			/* may need to be per card */
228*4882a593Smuzhiyun 			rdev->clock.max_pixel_clock = 35000;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 			if (rdev->flags & RADEON_IS_IGP) {
231*4882a593Smuzhiyun 				p1pll->reference_freq = 1432;
232*4882a593Smuzhiyun 				p2pll->reference_freq = 1432;
233*4882a593Smuzhiyun 				spll->reference_freq = 1432;
234*4882a593Smuzhiyun 				mpll->reference_freq = 1432;
235*4882a593Smuzhiyun 			} else {
236*4882a593Smuzhiyun 				p1pll->reference_freq = 2700;
237*4882a593Smuzhiyun 				p2pll->reference_freq = 2700;
238*4882a593Smuzhiyun 				spll->reference_freq = 2700;
239*4882a593Smuzhiyun 				mpll->reference_freq = 2700;
240*4882a593Smuzhiyun 			}
241*4882a593Smuzhiyun 			p1pll->reference_div =
242*4882a593Smuzhiyun 			    RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
243*4882a593Smuzhiyun 			if (p1pll->reference_div < 2)
244*4882a593Smuzhiyun 				p1pll->reference_div = 12;
245*4882a593Smuzhiyun 			p2pll->reference_div = p1pll->reference_div;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 			if (rdev->family >= CHIP_R420) {
248*4882a593Smuzhiyun 				p1pll->pll_in_min = 100;
249*4882a593Smuzhiyun 				p1pll->pll_in_max = 1350;
250*4882a593Smuzhiyun 				p1pll->pll_out_min = 20000;
251*4882a593Smuzhiyun 				p1pll->pll_out_max = 50000;
252*4882a593Smuzhiyun 				p2pll->pll_in_min = 100;
253*4882a593Smuzhiyun 				p2pll->pll_in_max = 1350;
254*4882a593Smuzhiyun 				p2pll->pll_out_min = 20000;
255*4882a593Smuzhiyun 				p2pll->pll_out_max = 50000;
256*4882a593Smuzhiyun 			} else {
257*4882a593Smuzhiyun 				p1pll->pll_in_min = 40;
258*4882a593Smuzhiyun 				p1pll->pll_in_max = 500;
259*4882a593Smuzhiyun 				p1pll->pll_out_min = 12500;
260*4882a593Smuzhiyun 				p1pll->pll_out_max = 35000;
261*4882a593Smuzhiyun 				p2pll->pll_in_min = 40;
262*4882a593Smuzhiyun 				p2pll->pll_in_max = 500;
263*4882a593Smuzhiyun 				p2pll->pll_out_min = 12500;
264*4882a593Smuzhiyun 				p2pll->pll_out_max = 35000;
265*4882a593Smuzhiyun 			}
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 			spll->reference_div =
268*4882a593Smuzhiyun 			    RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
269*4882a593Smuzhiyun 			    RADEON_M_SPLL_REF_DIV_MASK;
270*4882a593Smuzhiyun 			mpll->reference_div = spll->reference_div;
271*4882a593Smuzhiyun 			rdev->clock.default_sclk =
272*4882a593Smuzhiyun 			    radeon_legacy_get_engine_clock(rdev);
273*4882a593Smuzhiyun 			rdev->clock.default_mclk =
274*4882a593Smuzhiyun 			    radeon_legacy_get_memory_clock(rdev);
275*4882a593Smuzhiyun 		}
276*4882a593Smuzhiyun 	}
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	/* pixel clocks */
279*4882a593Smuzhiyun 	if (ASIC_IS_AVIVO(rdev)) {
280*4882a593Smuzhiyun 		p1pll->min_post_div = 2;
281*4882a593Smuzhiyun 		p1pll->max_post_div = 0x7f;
282*4882a593Smuzhiyun 		p1pll->min_frac_feedback_div = 0;
283*4882a593Smuzhiyun 		p1pll->max_frac_feedback_div = 9;
284*4882a593Smuzhiyun 		p2pll->min_post_div = 2;
285*4882a593Smuzhiyun 		p2pll->max_post_div = 0x7f;
286*4882a593Smuzhiyun 		p2pll->min_frac_feedback_div = 0;
287*4882a593Smuzhiyun 		p2pll->max_frac_feedback_div = 9;
288*4882a593Smuzhiyun 	} else {
289*4882a593Smuzhiyun 		p1pll->min_post_div = 1;
290*4882a593Smuzhiyun 		p1pll->max_post_div = 16;
291*4882a593Smuzhiyun 		p1pll->min_frac_feedback_div = 0;
292*4882a593Smuzhiyun 		p1pll->max_frac_feedback_div = 0;
293*4882a593Smuzhiyun 		p2pll->min_post_div = 1;
294*4882a593Smuzhiyun 		p2pll->max_post_div = 12;
295*4882a593Smuzhiyun 		p2pll->min_frac_feedback_div = 0;
296*4882a593Smuzhiyun 		p2pll->max_frac_feedback_div = 0;
297*4882a593Smuzhiyun 	}
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	/* dcpll is DCE4 only */
300*4882a593Smuzhiyun 	dcpll->min_post_div = 2;
301*4882a593Smuzhiyun 	dcpll->max_post_div = 0x7f;
302*4882a593Smuzhiyun 	dcpll->min_frac_feedback_div = 0;
303*4882a593Smuzhiyun 	dcpll->max_frac_feedback_div = 9;
304*4882a593Smuzhiyun 	dcpll->min_ref_div = 2;
305*4882a593Smuzhiyun 	dcpll->max_ref_div = 0x3ff;
306*4882a593Smuzhiyun 	dcpll->min_feedback_div = 4;
307*4882a593Smuzhiyun 	dcpll->max_feedback_div = 0xfff;
308*4882a593Smuzhiyun 	dcpll->best_vco = 0;
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 	p1pll->min_ref_div = 2;
311*4882a593Smuzhiyun 	p1pll->max_ref_div = 0x3ff;
312*4882a593Smuzhiyun 	p1pll->min_feedback_div = 4;
313*4882a593Smuzhiyun 	p1pll->max_feedback_div = 0x7ff;
314*4882a593Smuzhiyun 	p1pll->best_vco = 0;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	p2pll->min_ref_div = 2;
317*4882a593Smuzhiyun 	p2pll->max_ref_div = 0x3ff;
318*4882a593Smuzhiyun 	p2pll->min_feedback_div = 4;
319*4882a593Smuzhiyun 	p2pll->max_feedback_div = 0x7ff;
320*4882a593Smuzhiyun 	p2pll->best_vco = 0;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	/* system clock */
323*4882a593Smuzhiyun 	spll->min_post_div = 1;
324*4882a593Smuzhiyun 	spll->max_post_div = 1;
325*4882a593Smuzhiyun 	spll->min_ref_div = 2;
326*4882a593Smuzhiyun 	spll->max_ref_div = 0xff;
327*4882a593Smuzhiyun 	spll->min_feedback_div = 4;
328*4882a593Smuzhiyun 	spll->max_feedback_div = 0xff;
329*4882a593Smuzhiyun 	spll->best_vco = 0;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	/* memory clock */
332*4882a593Smuzhiyun 	mpll->min_post_div = 1;
333*4882a593Smuzhiyun 	mpll->max_post_div = 1;
334*4882a593Smuzhiyun 	mpll->min_ref_div = 2;
335*4882a593Smuzhiyun 	mpll->max_ref_div = 0xff;
336*4882a593Smuzhiyun 	mpll->min_feedback_div = 4;
337*4882a593Smuzhiyun 	mpll->max_feedback_div = 0xff;
338*4882a593Smuzhiyun 	mpll->best_vco = 0;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	if (!rdev->clock.default_sclk)
341*4882a593Smuzhiyun 		rdev->clock.default_sclk = radeon_get_engine_clock(rdev);
342*4882a593Smuzhiyun 	if ((!rdev->clock.default_mclk) && rdev->asic->pm.get_memory_clock)
343*4882a593Smuzhiyun 		rdev->clock.default_mclk = radeon_get_memory_clock(rdev);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	rdev->pm.current_sclk = rdev->clock.default_sclk;
346*4882a593Smuzhiyun 	rdev->pm.current_mclk = rdev->clock.default_mclk;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun /* 10 khz */
calc_eng_mem_clock(struct radeon_device * rdev,uint32_t req_clock,int * fb_div,int * post_div)351*4882a593Smuzhiyun static uint32_t calc_eng_mem_clock(struct radeon_device *rdev,
352*4882a593Smuzhiyun 				   uint32_t req_clock,
353*4882a593Smuzhiyun 				   int *fb_div, int *post_div)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun 	struct radeon_pll *spll = &rdev->clock.spll;
356*4882a593Smuzhiyun 	int ref_div = spll->reference_div;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	if (!ref_div)
359*4882a593Smuzhiyun 		ref_div =
360*4882a593Smuzhiyun 		    RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
361*4882a593Smuzhiyun 		    RADEON_M_SPLL_REF_DIV_MASK;
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	if (req_clock < 15000) {
364*4882a593Smuzhiyun 		*post_div = 8;
365*4882a593Smuzhiyun 		req_clock *= 8;
366*4882a593Smuzhiyun 	} else if (req_clock < 30000) {
367*4882a593Smuzhiyun 		*post_div = 4;
368*4882a593Smuzhiyun 		req_clock *= 4;
369*4882a593Smuzhiyun 	} else if (req_clock < 60000) {
370*4882a593Smuzhiyun 		*post_div = 2;
371*4882a593Smuzhiyun 		req_clock *= 2;
372*4882a593Smuzhiyun 	} else
373*4882a593Smuzhiyun 		*post_div = 1;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	req_clock *= ref_div;
376*4882a593Smuzhiyun 	req_clock += spll->reference_freq;
377*4882a593Smuzhiyun 	req_clock /= (2 * spll->reference_freq);
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	*fb_div = req_clock & 0xff;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	req_clock = (req_clock & 0xffff) << 1;
382*4882a593Smuzhiyun 	req_clock *= spll->reference_freq;
383*4882a593Smuzhiyun 	req_clock /= ref_div;
384*4882a593Smuzhiyun 	req_clock /= *post_div;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	return req_clock;
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun /* 10 khz */
radeon_legacy_set_engine_clock(struct radeon_device * rdev,uint32_t eng_clock)390*4882a593Smuzhiyun void radeon_legacy_set_engine_clock(struct radeon_device *rdev,
391*4882a593Smuzhiyun 				    uint32_t eng_clock)
392*4882a593Smuzhiyun {
393*4882a593Smuzhiyun 	uint32_t tmp;
394*4882a593Smuzhiyun 	int fb_div, post_div;
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	/* XXX: wait for idle */
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	eng_clock = calc_eng_mem_clock(rdev, eng_clock, &fb_div, &post_div);
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
401*4882a593Smuzhiyun 	tmp &= ~RADEON_DONT_USE_XTALIN;
402*4882a593Smuzhiyun 	WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SCLK_CNTL);
405*4882a593Smuzhiyun 	tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
406*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SCLK_CNTL, tmp);
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	udelay(10);
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SPLL_CNTL);
411*4882a593Smuzhiyun 	tmp |= RADEON_SPLL_SLEEP;
412*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SPLL_CNTL, tmp);
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	udelay(2);
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SPLL_CNTL);
417*4882a593Smuzhiyun 	tmp |= RADEON_SPLL_RESET;
418*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SPLL_CNTL, tmp);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	udelay(200);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
423*4882a593Smuzhiyun 	tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
424*4882a593Smuzhiyun 	tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
425*4882a593Smuzhiyun 	WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV, tmp);
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	/* XXX: verify on different asics */
428*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SPLL_CNTL);
429*4882a593Smuzhiyun 	tmp &= ~RADEON_SPLL_PVG_MASK;
430*4882a593Smuzhiyun 	if ((eng_clock * post_div) >= 90000)
431*4882a593Smuzhiyun 		tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
432*4882a593Smuzhiyun 	else
433*4882a593Smuzhiyun 		tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
434*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SPLL_CNTL, tmp);
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SPLL_CNTL);
437*4882a593Smuzhiyun 	tmp &= ~RADEON_SPLL_SLEEP;
438*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SPLL_CNTL, tmp);
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	udelay(2);
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SPLL_CNTL);
443*4882a593Smuzhiyun 	tmp &= ~RADEON_SPLL_RESET;
444*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SPLL_CNTL, tmp);
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	udelay(200);
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_SCLK_CNTL);
449*4882a593Smuzhiyun 	tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
450*4882a593Smuzhiyun 	switch (post_div) {
451*4882a593Smuzhiyun 	case 1:
452*4882a593Smuzhiyun 	default:
453*4882a593Smuzhiyun 		tmp |= 1;
454*4882a593Smuzhiyun 		break;
455*4882a593Smuzhiyun 	case 2:
456*4882a593Smuzhiyun 		tmp |= 2;
457*4882a593Smuzhiyun 		break;
458*4882a593Smuzhiyun 	case 4:
459*4882a593Smuzhiyun 		tmp |= 3;
460*4882a593Smuzhiyun 		break;
461*4882a593Smuzhiyun 	case 8:
462*4882a593Smuzhiyun 		tmp |= 4;
463*4882a593Smuzhiyun 		break;
464*4882a593Smuzhiyun 	}
465*4882a593Smuzhiyun 	WREG32_PLL(RADEON_SCLK_CNTL, tmp);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	udelay(20);
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
470*4882a593Smuzhiyun 	tmp |= RADEON_DONT_USE_XTALIN;
471*4882a593Smuzhiyun 	WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	udelay(10);
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun 
radeon_legacy_set_clock_gating(struct radeon_device * rdev,int enable)476*4882a593Smuzhiyun void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun 	uint32_t tmp;
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 	if (enable) {
481*4882a593Smuzhiyun 		if (rdev->flags & RADEON_SINGLE_CRTC) {
482*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_CNTL);
483*4882a593Smuzhiyun 			if ((RREG32(RADEON_CONFIG_CNTL) &
484*4882a593Smuzhiyun 			     RADEON_CFG_ATI_REV_ID_MASK) >
485*4882a593Smuzhiyun 			    RADEON_CFG_ATI_REV_A13) {
486*4882a593Smuzhiyun 				tmp &=
487*4882a593Smuzhiyun 				    ~(RADEON_SCLK_FORCE_CP |
488*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_RB);
489*4882a593Smuzhiyun 			}
490*4882a593Smuzhiyun 			tmp &=
491*4882a593Smuzhiyun 			    ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 |
492*4882a593Smuzhiyun 			      RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE |
493*4882a593Smuzhiyun 			      RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE |
494*4882a593Smuzhiyun 			      RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM |
495*4882a593Smuzhiyun 			      RADEON_SCLK_FORCE_TDM);
496*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_CNTL, tmp);
497*4882a593Smuzhiyun 		} else if (ASIC_IS_R300(rdev)) {
498*4882a593Smuzhiyun 			if ((rdev->family == CHIP_RS400) ||
499*4882a593Smuzhiyun 			    (rdev->family == CHIP_RS480)) {
500*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_CNTL);
501*4882a593Smuzhiyun 				tmp &=
502*4882a593Smuzhiyun 				    ~(RADEON_SCLK_FORCE_DISP2 |
503*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_CP |
504*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_HDP |
505*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_DISP1 |
506*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_TOP |
507*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
508*4882a593Smuzhiyun 				      | RADEON_SCLK_FORCE_IDCT |
509*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
510*4882a593Smuzhiyun 				      | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
511*4882a593Smuzhiyun 				      | R300_SCLK_FORCE_US |
512*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_TV_SCLK |
513*4882a593Smuzhiyun 				      R300_SCLK_FORCE_SU |
514*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_OV0);
515*4882a593Smuzhiyun 				tmp |= RADEON_DYN_STOP_LAT_MASK;
516*4882a593Smuzhiyun 				tmp |=
517*4882a593Smuzhiyun 				    RADEON_SCLK_FORCE_TOP |
518*4882a593Smuzhiyun 				    RADEON_SCLK_FORCE_VIP;
519*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_CNTL, tmp);
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
522*4882a593Smuzhiyun 				tmp &= ~RADEON_SCLK_MORE_FORCEON;
523*4882a593Smuzhiyun 				tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
524*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
527*4882a593Smuzhiyun 				tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
528*4882a593Smuzhiyun 					RADEON_PIXCLK_DAC_ALWAYS_ONb);
529*4882a593Smuzhiyun 				WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
532*4882a593Smuzhiyun 				tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
533*4882a593Smuzhiyun 					RADEON_PIX2CLK_DAC_ALWAYS_ONb |
534*4882a593Smuzhiyun 					RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
535*4882a593Smuzhiyun 					R300_DVOCLK_ALWAYS_ONb |
536*4882a593Smuzhiyun 					RADEON_PIXCLK_BLEND_ALWAYS_ONb |
537*4882a593Smuzhiyun 					RADEON_PIXCLK_GV_ALWAYS_ONb |
538*4882a593Smuzhiyun 					R300_PIXCLK_DVO_ALWAYS_ONb |
539*4882a593Smuzhiyun 					RADEON_PIXCLK_LVDS_ALWAYS_ONb |
540*4882a593Smuzhiyun 					RADEON_PIXCLK_TMDS_ALWAYS_ONb |
541*4882a593Smuzhiyun 					R300_PIXCLK_TRANS_ALWAYS_ONb |
542*4882a593Smuzhiyun 					R300_PIXCLK_TVO_ALWAYS_ONb |
543*4882a593Smuzhiyun 					R300_P2G2CLK_ALWAYS_ONb |
544*4882a593Smuzhiyun 					R300_P2G2CLK_DAC_ALWAYS_ONb);
545*4882a593Smuzhiyun 				WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
546*4882a593Smuzhiyun 			} else if (rdev->family >= CHIP_RV350) {
547*4882a593Smuzhiyun 				tmp = RREG32_PLL(R300_SCLK_CNTL2);
548*4882a593Smuzhiyun 				tmp &= ~(R300_SCLK_FORCE_TCL |
549*4882a593Smuzhiyun 					 R300_SCLK_FORCE_GA |
550*4882a593Smuzhiyun 					 R300_SCLK_FORCE_CBA);
551*4882a593Smuzhiyun 				tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
552*4882a593Smuzhiyun 					R300_SCLK_GA_MAX_DYN_STOP_LAT |
553*4882a593Smuzhiyun 					R300_SCLK_CBA_MAX_DYN_STOP_LAT);
554*4882a593Smuzhiyun 				WREG32_PLL(R300_SCLK_CNTL2, tmp);
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_CNTL);
557*4882a593Smuzhiyun 				tmp &=
558*4882a593Smuzhiyun 				    ~(RADEON_SCLK_FORCE_DISP2 |
559*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_CP |
560*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_HDP |
561*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_DISP1 |
562*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_TOP |
563*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
564*4882a593Smuzhiyun 				      | RADEON_SCLK_FORCE_IDCT |
565*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
566*4882a593Smuzhiyun 				      | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
567*4882a593Smuzhiyun 				      | R300_SCLK_FORCE_US |
568*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_TV_SCLK |
569*4882a593Smuzhiyun 				      R300_SCLK_FORCE_SU |
570*4882a593Smuzhiyun 				      RADEON_SCLK_FORCE_OV0);
571*4882a593Smuzhiyun 				tmp |= RADEON_DYN_STOP_LAT_MASK;
572*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_CNTL, tmp);
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
575*4882a593Smuzhiyun 				tmp &= ~RADEON_SCLK_MORE_FORCEON;
576*4882a593Smuzhiyun 				tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
577*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
580*4882a593Smuzhiyun 				tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
581*4882a593Smuzhiyun 					RADEON_PIXCLK_DAC_ALWAYS_ONb);
582*4882a593Smuzhiyun 				WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
585*4882a593Smuzhiyun 				tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
586*4882a593Smuzhiyun 					RADEON_PIX2CLK_DAC_ALWAYS_ONb |
587*4882a593Smuzhiyun 					RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
588*4882a593Smuzhiyun 					R300_DVOCLK_ALWAYS_ONb |
589*4882a593Smuzhiyun 					RADEON_PIXCLK_BLEND_ALWAYS_ONb |
590*4882a593Smuzhiyun 					RADEON_PIXCLK_GV_ALWAYS_ONb |
591*4882a593Smuzhiyun 					R300_PIXCLK_DVO_ALWAYS_ONb |
592*4882a593Smuzhiyun 					RADEON_PIXCLK_LVDS_ALWAYS_ONb |
593*4882a593Smuzhiyun 					RADEON_PIXCLK_TMDS_ALWAYS_ONb |
594*4882a593Smuzhiyun 					R300_PIXCLK_TRANS_ALWAYS_ONb |
595*4882a593Smuzhiyun 					R300_PIXCLK_TVO_ALWAYS_ONb |
596*4882a593Smuzhiyun 					R300_P2G2CLK_ALWAYS_ONb |
597*4882a593Smuzhiyun 					R300_P2G2CLK_DAC_ALWAYS_ONb);
598*4882a593Smuzhiyun 				WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_MCLK_MISC);
601*4882a593Smuzhiyun 				tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
602*4882a593Smuzhiyun 					RADEON_IO_MCLK_DYN_ENABLE);
603*4882a593Smuzhiyun 				WREG32_PLL(RADEON_MCLK_MISC, tmp);
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_MCLK_CNTL);
606*4882a593Smuzhiyun 				tmp |= (RADEON_FORCEON_MCLKA |
607*4882a593Smuzhiyun 					RADEON_FORCEON_MCLKB);
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 				tmp &= ~(RADEON_FORCEON_YCLKA |
610*4882a593Smuzhiyun 					 RADEON_FORCEON_YCLKB |
611*4882a593Smuzhiyun 					 RADEON_FORCEON_MC);
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 				/* Some releases of vbios have set DISABLE_MC_MCLKA
614*4882a593Smuzhiyun 				   and DISABLE_MC_MCLKB bits in the vbios table.  Setting these
615*4882a593Smuzhiyun 				   bits will cause H/W hang when reading video memory with dynamic clocking
616*4882a593Smuzhiyun 				   enabled. */
617*4882a593Smuzhiyun 				if ((tmp & R300_DISABLE_MC_MCLKA) &&
618*4882a593Smuzhiyun 				    (tmp & R300_DISABLE_MC_MCLKB)) {
619*4882a593Smuzhiyun 					/* If both bits are set, then check the active channels */
620*4882a593Smuzhiyun 					tmp = RREG32_PLL(RADEON_MCLK_CNTL);
621*4882a593Smuzhiyun 					if (rdev->mc.vram_width == 64) {
622*4882a593Smuzhiyun 						if (RREG32(RADEON_MEM_CNTL) &
623*4882a593Smuzhiyun 						    R300_MEM_USE_CD_CH_ONLY)
624*4882a593Smuzhiyun 							tmp &=
625*4882a593Smuzhiyun 							    ~R300_DISABLE_MC_MCLKB;
626*4882a593Smuzhiyun 						else
627*4882a593Smuzhiyun 							tmp &=
628*4882a593Smuzhiyun 							    ~R300_DISABLE_MC_MCLKA;
629*4882a593Smuzhiyun 					} else {
630*4882a593Smuzhiyun 						tmp &= ~(R300_DISABLE_MC_MCLKA |
631*4882a593Smuzhiyun 							 R300_DISABLE_MC_MCLKB);
632*4882a593Smuzhiyun 					}
633*4882a593Smuzhiyun 				}
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun 				WREG32_PLL(RADEON_MCLK_CNTL, tmp);
636*4882a593Smuzhiyun 			} else {
637*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_CNTL);
638*4882a593Smuzhiyun 				tmp &= ~(R300_SCLK_FORCE_VAP);
639*4882a593Smuzhiyun 				tmp |= RADEON_SCLK_FORCE_CP;
640*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_CNTL, tmp);
641*4882a593Smuzhiyun 				mdelay(15);
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun 				tmp = RREG32_PLL(R300_SCLK_CNTL2);
644*4882a593Smuzhiyun 				tmp &= ~(R300_SCLK_FORCE_TCL |
645*4882a593Smuzhiyun 					 R300_SCLK_FORCE_GA |
646*4882a593Smuzhiyun 					 R300_SCLK_FORCE_CBA);
647*4882a593Smuzhiyun 				WREG32_PLL(R300_SCLK_CNTL2, tmp);
648*4882a593Smuzhiyun 			}
649*4882a593Smuzhiyun 		} else {
650*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_CLK_PWRMGT_CNTL);
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 			tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK |
653*4882a593Smuzhiyun 				 RADEON_DISP_DYN_STOP_LAT_MASK |
654*4882a593Smuzhiyun 				 RADEON_DYN_STOP_MODE_MASK);
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 			tmp |= (RADEON_ENGIN_DYNCLK_MODE |
657*4882a593Smuzhiyun 				(0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
658*4882a593Smuzhiyun 			WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp);
659*4882a593Smuzhiyun 			mdelay(15);
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
662*4882a593Smuzhiyun 			tmp |= RADEON_SCLK_DYN_START_CNTL;
663*4882a593Smuzhiyun 			WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
664*4882a593Smuzhiyun 			mdelay(15);
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun 			/* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
667*4882a593Smuzhiyun 			   to lockup randomly, leave them as set by BIOS.
668*4882a593Smuzhiyun 			 */
669*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_CNTL);
670*4882a593Smuzhiyun 			/*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
671*4882a593Smuzhiyun 			tmp &= ~RADEON_SCLK_FORCEON_MASK;
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 			/*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
674*4882a593Smuzhiyun 			if (((rdev->family == CHIP_RV250) &&
675*4882a593Smuzhiyun 			     ((RREG32(RADEON_CONFIG_CNTL) &
676*4882a593Smuzhiyun 			       RADEON_CFG_ATI_REV_ID_MASK) <
677*4882a593Smuzhiyun 			      RADEON_CFG_ATI_REV_A13))
678*4882a593Smuzhiyun 			    || ((rdev->family == CHIP_RV100)
679*4882a593Smuzhiyun 				&&
680*4882a593Smuzhiyun 				((RREG32(RADEON_CONFIG_CNTL) &
681*4882a593Smuzhiyun 				  RADEON_CFG_ATI_REV_ID_MASK) <=
682*4882a593Smuzhiyun 				 RADEON_CFG_ATI_REV_A13))) {
683*4882a593Smuzhiyun 				tmp |= RADEON_SCLK_FORCE_CP;
684*4882a593Smuzhiyun 				tmp |= RADEON_SCLK_FORCE_VIP;
685*4882a593Smuzhiyun 			}
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_CNTL, tmp);
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 			if ((rdev->family == CHIP_RV200) ||
690*4882a593Smuzhiyun 			    (rdev->family == CHIP_RV250) ||
691*4882a593Smuzhiyun 			    (rdev->family == CHIP_RV280)) {
692*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
693*4882a593Smuzhiyun 				tmp &= ~RADEON_SCLK_MORE_FORCEON;
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 				/* RV200::A11 A12 RV250::A11 A12 */
696*4882a593Smuzhiyun 				if (((rdev->family == CHIP_RV200) ||
697*4882a593Smuzhiyun 				     (rdev->family == CHIP_RV250)) &&
698*4882a593Smuzhiyun 				    ((RREG32(RADEON_CONFIG_CNTL) &
699*4882a593Smuzhiyun 				      RADEON_CFG_ATI_REV_ID_MASK) <
700*4882a593Smuzhiyun 				     RADEON_CFG_ATI_REV_A13)) {
701*4882a593Smuzhiyun 					tmp |= RADEON_SCLK_MORE_FORCEON;
702*4882a593Smuzhiyun 				}
703*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
704*4882a593Smuzhiyun 				mdelay(15);
705*4882a593Smuzhiyun 			}
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 			/* RV200::A11 A12, RV250::A11 A12 */
708*4882a593Smuzhiyun 			if (((rdev->family == CHIP_RV200) ||
709*4882a593Smuzhiyun 			     (rdev->family == CHIP_RV250)) &&
710*4882a593Smuzhiyun 			    ((RREG32(RADEON_CONFIG_CNTL) &
711*4882a593Smuzhiyun 			      RADEON_CFG_ATI_REV_ID_MASK) <
712*4882a593Smuzhiyun 			     RADEON_CFG_ATI_REV_A13)) {
713*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);
714*4882a593Smuzhiyun 				tmp |= RADEON_TCL_BYPASS_DISABLE;
715*4882a593Smuzhiyun 				WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);
716*4882a593Smuzhiyun 			}
717*4882a593Smuzhiyun 			mdelay(15);
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun 			/*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
720*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
721*4882a593Smuzhiyun 			tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
722*4882a593Smuzhiyun 				RADEON_PIX2CLK_DAC_ALWAYS_ONb |
723*4882a593Smuzhiyun 				RADEON_PIXCLK_BLEND_ALWAYS_ONb |
724*4882a593Smuzhiyun 				RADEON_PIXCLK_GV_ALWAYS_ONb |
725*4882a593Smuzhiyun 				RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
726*4882a593Smuzhiyun 				RADEON_PIXCLK_LVDS_ALWAYS_ONb |
727*4882a593Smuzhiyun 				RADEON_PIXCLK_TMDS_ALWAYS_ONb);
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 			WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
730*4882a593Smuzhiyun 			mdelay(15);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
733*4882a593Smuzhiyun 			tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
734*4882a593Smuzhiyun 				RADEON_PIXCLK_DAC_ALWAYS_ONb);
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 			WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
737*4882a593Smuzhiyun 			mdelay(15);
738*4882a593Smuzhiyun 		}
739*4882a593Smuzhiyun 	} else {
740*4882a593Smuzhiyun 		/* Turn everything OFF (ForceON to everything) */
741*4882a593Smuzhiyun 		if (rdev->flags & RADEON_SINGLE_CRTC) {
742*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_CNTL);
743*4882a593Smuzhiyun 			tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP |
744*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP
745*4882a593Smuzhiyun 				| RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE |
746*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
747*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB |
748*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM |
749*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_RB);
750*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_CNTL, tmp);
751*4882a593Smuzhiyun 		} else if ((rdev->family == CHIP_RS400) ||
752*4882a593Smuzhiyun 			   (rdev->family == CHIP_RS480)) {
753*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_CNTL);
754*4882a593Smuzhiyun 			tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
755*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
756*4882a593Smuzhiyun 				| RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
757*4882a593Smuzhiyun 				R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
758*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
759*4882a593Smuzhiyun 				R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
760*4882a593Smuzhiyun 				R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
761*4882a593Smuzhiyun 				R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
762*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_CNTL, tmp);
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
765*4882a593Smuzhiyun 			tmp |= RADEON_SCLK_MORE_FORCEON;
766*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
769*4882a593Smuzhiyun 			tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
770*4882a593Smuzhiyun 				 RADEON_PIXCLK_DAC_ALWAYS_ONb |
771*4882a593Smuzhiyun 				 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
772*4882a593Smuzhiyun 			WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
775*4882a593Smuzhiyun 			tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
776*4882a593Smuzhiyun 				 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
777*4882a593Smuzhiyun 				 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
778*4882a593Smuzhiyun 				 R300_DVOCLK_ALWAYS_ONb |
779*4882a593Smuzhiyun 				 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
780*4882a593Smuzhiyun 				 RADEON_PIXCLK_GV_ALWAYS_ONb |
781*4882a593Smuzhiyun 				 R300_PIXCLK_DVO_ALWAYS_ONb |
782*4882a593Smuzhiyun 				 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
783*4882a593Smuzhiyun 				 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
784*4882a593Smuzhiyun 				 R300_PIXCLK_TRANS_ALWAYS_ONb |
785*4882a593Smuzhiyun 				 R300_PIXCLK_TVO_ALWAYS_ONb |
786*4882a593Smuzhiyun 				 R300_P2G2CLK_ALWAYS_ONb |
787*4882a593Smuzhiyun 				 R300_P2G2CLK_DAC_ALWAYS_ONb |
788*4882a593Smuzhiyun 				 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
789*4882a593Smuzhiyun 			WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
790*4882a593Smuzhiyun 		} else if (rdev->family >= CHIP_RV350) {
791*4882a593Smuzhiyun 			/* for RV350/M10, no delays are required. */
792*4882a593Smuzhiyun 			tmp = RREG32_PLL(R300_SCLK_CNTL2);
793*4882a593Smuzhiyun 			tmp |= (R300_SCLK_FORCE_TCL |
794*4882a593Smuzhiyun 				R300_SCLK_FORCE_GA | R300_SCLK_FORCE_CBA);
795*4882a593Smuzhiyun 			WREG32_PLL(R300_SCLK_CNTL2, tmp);
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_CNTL);
798*4882a593Smuzhiyun 			tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
799*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
800*4882a593Smuzhiyun 				| RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
801*4882a593Smuzhiyun 				R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
802*4882a593Smuzhiyun 				RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
803*4882a593Smuzhiyun 				R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
804*4882a593Smuzhiyun 				R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
805*4882a593Smuzhiyun 				R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
806*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_CNTL, tmp);
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
809*4882a593Smuzhiyun 			tmp |= RADEON_SCLK_MORE_FORCEON;
810*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_MCLK_CNTL);
813*4882a593Smuzhiyun 			tmp |= (RADEON_FORCEON_MCLKA |
814*4882a593Smuzhiyun 				RADEON_FORCEON_MCLKB |
815*4882a593Smuzhiyun 				RADEON_FORCEON_YCLKA |
816*4882a593Smuzhiyun 				RADEON_FORCEON_YCLKB | RADEON_FORCEON_MC);
817*4882a593Smuzhiyun 			WREG32_PLL(RADEON_MCLK_CNTL, tmp);
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
820*4882a593Smuzhiyun 			tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
821*4882a593Smuzhiyun 				 RADEON_PIXCLK_DAC_ALWAYS_ONb |
822*4882a593Smuzhiyun 				 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
823*4882a593Smuzhiyun 			WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
826*4882a593Smuzhiyun 			tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
827*4882a593Smuzhiyun 				 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
828*4882a593Smuzhiyun 				 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
829*4882a593Smuzhiyun 				 R300_DVOCLK_ALWAYS_ONb |
830*4882a593Smuzhiyun 				 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
831*4882a593Smuzhiyun 				 RADEON_PIXCLK_GV_ALWAYS_ONb |
832*4882a593Smuzhiyun 				 R300_PIXCLK_DVO_ALWAYS_ONb |
833*4882a593Smuzhiyun 				 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
834*4882a593Smuzhiyun 				 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
835*4882a593Smuzhiyun 				 R300_PIXCLK_TRANS_ALWAYS_ONb |
836*4882a593Smuzhiyun 				 R300_PIXCLK_TVO_ALWAYS_ONb |
837*4882a593Smuzhiyun 				 R300_P2G2CLK_ALWAYS_ONb |
838*4882a593Smuzhiyun 				 R300_P2G2CLK_DAC_ALWAYS_ONb |
839*4882a593Smuzhiyun 				 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
840*4882a593Smuzhiyun 			WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
841*4882a593Smuzhiyun 		} else {
842*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_SCLK_CNTL);
843*4882a593Smuzhiyun 			tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
844*4882a593Smuzhiyun 			tmp |= RADEON_SCLK_FORCE_SE;
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun 			if (rdev->flags & RADEON_SINGLE_CRTC) {
847*4882a593Smuzhiyun 				tmp |= (RADEON_SCLK_FORCE_RB |
848*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_TDM |
849*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_TAM |
850*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_PB |
851*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_RE |
852*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_VIP |
853*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_IDCT |
854*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_TOP |
855*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_DISP1 |
856*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_DISP2 |
857*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_HDP);
858*4882a593Smuzhiyun 			} else if ((rdev->family == CHIP_R300) ||
859*4882a593Smuzhiyun 				   (rdev->family == CHIP_R350)) {
860*4882a593Smuzhiyun 				tmp |= (RADEON_SCLK_FORCE_HDP |
861*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_DISP1 |
862*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_DISP2 |
863*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_TOP |
864*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_IDCT |
865*4882a593Smuzhiyun 					RADEON_SCLK_FORCE_VIP);
866*4882a593Smuzhiyun 			}
867*4882a593Smuzhiyun 			WREG32_PLL(RADEON_SCLK_CNTL, tmp);
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun 			mdelay(16);
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 			if ((rdev->family == CHIP_R300) ||
872*4882a593Smuzhiyun 			    (rdev->family == CHIP_R350)) {
873*4882a593Smuzhiyun 				tmp = RREG32_PLL(R300_SCLK_CNTL2);
874*4882a593Smuzhiyun 				tmp |= (R300_SCLK_FORCE_TCL |
875*4882a593Smuzhiyun 					R300_SCLK_FORCE_GA |
876*4882a593Smuzhiyun 					R300_SCLK_FORCE_CBA);
877*4882a593Smuzhiyun 				WREG32_PLL(R300_SCLK_CNTL2, tmp);
878*4882a593Smuzhiyun 				mdelay(16);
879*4882a593Smuzhiyun 			}
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun 			if (rdev->flags & RADEON_IS_IGP) {
882*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_MCLK_CNTL);
883*4882a593Smuzhiyun 				tmp &= ~(RADEON_FORCEON_MCLKA |
884*4882a593Smuzhiyun 					 RADEON_FORCEON_YCLKA);
885*4882a593Smuzhiyun 				WREG32_PLL(RADEON_MCLK_CNTL, tmp);
886*4882a593Smuzhiyun 				mdelay(16);
887*4882a593Smuzhiyun 			}
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 			if ((rdev->family == CHIP_RV200) ||
890*4882a593Smuzhiyun 			    (rdev->family == CHIP_RV250) ||
891*4882a593Smuzhiyun 			    (rdev->family == CHIP_RV280)) {
892*4882a593Smuzhiyun 				tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
893*4882a593Smuzhiyun 				tmp |= RADEON_SCLK_MORE_FORCEON;
894*4882a593Smuzhiyun 				WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
895*4882a593Smuzhiyun 				mdelay(16);
896*4882a593Smuzhiyun 			}
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
899*4882a593Smuzhiyun 			tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
900*4882a593Smuzhiyun 				 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
901*4882a593Smuzhiyun 				 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
902*4882a593Smuzhiyun 				 RADEON_PIXCLK_GV_ALWAYS_ONb |
903*4882a593Smuzhiyun 				 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
904*4882a593Smuzhiyun 				 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
905*4882a593Smuzhiyun 				 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 			WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
908*4882a593Smuzhiyun 			mdelay(16);
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 			tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
911*4882a593Smuzhiyun 			tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
912*4882a593Smuzhiyun 				 RADEON_PIXCLK_DAC_ALWAYS_ONb);
913*4882a593Smuzhiyun 			WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
914*4882a593Smuzhiyun 		}
915*4882a593Smuzhiyun 	}
916*4882a593Smuzhiyun }
917*4882a593Smuzhiyun 
918