xref: /linux/drivers/gpu/drm/radeon/radeon_legacy_encoders.c (revision a7f7f6248d9740d710fd6bd190293fe5e16410ac)
1 /*
2  * Copyright 2007-8 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie
24  *          Alex Deucher
25  */
26 
27 #include <linux/backlight.h>
28 #include <linux/pci.h>
29 
30 #include <drm/drm_crtc_helper.h>
31 #include <drm/drm_device.h>
32 #include <drm/drm_file.h>
33 #include <drm/drm_util.h>
34 #include <drm/radeon_drm.h>
35 
36 #include "radeon.h"
37 #include "radeon_asic.h"
38 #include "atom.h"
39 #ifdef CONFIG_PMAC_BACKLIGHT
40 #include <asm/backlight.h>
41 #endif
42 
43 static void radeon_legacy_encoder_disable(struct drm_encoder *encoder)
44 {
45 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
46 	const struct drm_encoder_helper_funcs *encoder_funcs;
47 
48 	encoder_funcs = encoder->helper_private;
49 	encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
50 	radeon_encoder->active_device = 0;
51 }
52 
53 static void radeon_legacy_lvds_update(struct drm_encoder *encoder, int mode)
54 {
55 	struct drm_device *dev = encoder->dev;
56 	struct radeon_device *rdev = dev->dev_private;
57 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
58 	uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man;
59 	int panel_pwr_delay = 2000;
60 	bool is_mac = false;
61 	uint8_t backlight_level;
62 	DRM_DEBUG_KMS("\n");
63 
64 	lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
65 	backlight_level = (lvds_gen_cntl >> RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
66 
67 	if (radeon_encoder->enc_priv) {
68 		if (rdev->is_atom_bios) {
69 			struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
70 			panel_pwr_delay = lvds->panel_pwr_delay;
71 			if (lvds->bl_dev)
72 				backlight_level = lvds->backlight_level;
73 		} else {
74 			struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
75 			panel_pwr_delay = lvds->panel_pwr_delay;
76 			if (lvds->bl_dev)
77 				backlight_level = lvds->backlight_level;
78 		}
79 	}
80 
81 	/* macs (and possibly some x86 oem systems?) wire up LVDS strangely
82 	 * Taken from radeonfb.
83 	 */
84 	if ((rdev->mode_info.connector_table == CT_IBOOK) ||
85 	    (rdev->mode_info.connector_table == CT_POWERBOOK_EXTERNAL) ||
86 	    (rdev->mode_info.connector_table == CT_POWERBOOK_INTERNAL) ||
87 	    (rdev->mode_info.connector_table == CT_POWERBOOK_VGA))
88 		is_mac = true;
89 
90 	switch (mode) {
91 	case DRM_MODE_DPMS_ON:
92 		disp_pwr_man = RREG32(RADEON_DISP_PWR_MAN);
93 		disp_pwr_man |= RADEON_AUTO_PWRUP_EN;
94 		WREG32(RADEON_DISP_PWR_MAN, disp_pwr_man);
95 		lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL);
96 		lvds_pll_cntl |= RADEON_LVDS_PLL_EN;
97 		WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl);
98 		mdelay(1);
99 
100 		lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL);
101 		lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET;
102 		WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl);
103 
104 		lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS |
105 				   RADEON_LVDS_BL_MOD_LEVEL_MASK);
106 		lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN |
107 				  RADEON_LVDS_DIGON | RADEON_LVDS_BLON |
108 				  (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT));
109 		if (is_mac)
110 			lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN;
111 		mdelay(panel_pwr_delay);
112 		WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
113 		break;
114 	case DRM_MODE_DPMS_STANDBY:
115 	case DRM_MODE_DPMS_SUSPEND:
116 	case DRM_MODE_DPMS_OFF:
117 		pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
118 		WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb);
119 		lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS;
120 		if (is_mac) {
121 			lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN;
122 			WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
123 			lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_EN);
124 		} else {
125 			WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
126 			lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN | RADEON_LVDS_DIGON);
127 		}
128 		mdelay(panel_pwr_delay);
129 		WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
130 		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
131 		mdelay(panel_pwr_delay);
132 		break;
133 	}
134 
135 	if (rdev->is_atom_bios)
136 		radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
137 	else
138 		radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
139 
140 }
141 
142 static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
143 {
144 	struct radeon_device *rdev = encoder->dev->dev_private;
145 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
146 	DRM_DEBUG("\n");
147 
148 	if (radeon_encoder->enc_priv) {
149 		if (rdev->is_atom_bios) {
150 			struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
151 			lvds->dpms_mode = mode;
152 		} else {
153 			struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
154 			lvds->dpms_mode = mode;
155 		}
156 	}
157 
158 	radeon_legacy_lvds_update(encoder, mode);
159 }
160 
161 static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder)
162 {
163 	struct radeon_device *rdev = encoder->dev->dev_private;
164 
165 	if (rdev->is_atom_bios)
166 		radeon_atom_output_lock(encoder, true);
167 	else
168 		radeon_combios_output_lock(encoder, true);
169 	radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_OFF);
170 }
171 
172 static void radeon_legacy_lvds_commit(struct drm_encoder *encoder)
173 {
174 	struct radeon_device *rdev = encoder->dev->dev_private;
175 
176 	radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_ON);
177 	if (rdev->is_atom_bios)
178 		radeon_atom_output_lock(encoder, false);
179 	else
180 		radeon_combios_output_lock(encoder, false);
181 }
182 
183 static void radeon_legacy_lvds_mode_set(struct drm_encoder *encoder,
184 					struct drm_display_mode *mode,
185 					struct drm_display_mode *adjusted_mode)
186 {
187 	struct drm_device *dev = encoder->dev;
188 	struct radeon_device *rdev = dev->dev_private;
189 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
190 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
191 	uint32_t lvds_pll_cntl, lvds_gen_cntl, lvds_ss_gen_cntl;
192 
193 	DRM_DEBUG_KMS("\n");
194 
195 	lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL);
196 	lvds_pll_cntl &= ~RADEON_LVDS_PLL_EN;
197 
198 	lvds_ss_gen_cntl = RREG32(RADEON_LVDS_SS_GEN_CNTL);
199 	if (rdev->is_atom_bios) {
200 		/* LVDS_GEN_CNTL parameters are computed in LVDSEncoderControl
201 		 * need to call that on resume to set up the reg properly.
202 		 */
203 		radeon_encoder->pixel_clock = adjusted_mode->clock;
204 		atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_ENABLE);
205 		lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
206 	} else {
207 		struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
208 		if (lvds) {
209 			DRM_DEBUG_KMS("bios LVDS_GEN_CNTL: 0x%x\n", lvds->lvds_gen_cntl);
210 			lvds_gen_cntl = lvds->lvds_gen_cntl;
211 			lvds_ss_gen_cntl &= ~((0xf << RADEON_LVDS_PWRSEQ_DELAY1_SHIFT) |
212 					      (0xf << RADEON_LVDS_PWRSEQ_DELAY2_SHIFT));
213 			lvds_ss_gen_cntl |= ((lvds->panel_digon_delay << RADEON_LVDS_PWRSEQ_DELAY1_SHIFT) |
214 					     (lvds->panel_blon_delay << RADEON_LVDS_PWRSEQ_DELAY2_SHIFT));
215 		} else
216 			lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
217 	}
218 	lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS;
219 	lvds_gen_cntl &= ~(RADEON_LVDS_ON |
220 			   RADEON_LVDS_BLON |
221 			   RADEON_LVDS_EN |
222 			   RADEON_LVDS_RST_FM);
223 
224 	if (ASIC_IS_R300(rdev))
225 		lvds_pll_cntl &= ~(R300_LVDS_SRC_SEL_MASK);
226 
227 	if (radeon_crtc->crtc_id == 0) {
228 		if (ASIC_IS_R300(rdev)) {
229 			if (radeon_encoder->rmx_type != RMX_OFF)
230 				lvds_pll_cntl |= R300_LVDS_SRC_SEL_RMX;
231 		} else
232 			lvds_gen_cntl &= ~RADEON_LVDS_SEL_CRTC2;
233 	} else {
234 		if (ASIC_IS_R300(rdev))
235 			lvds_pll_cntl |= R300_LVDS_SRC_SEL_CRTC2;
236 		else
237 			lvds_gen_cntl |= RADEON_LVDS_SEL_CRTC2;
238 	}
239 
240 	WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
241 	WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl);
242 	WREG32(RADEON_LVDS_SS_GEN_CNTL, lvds_ss_gen_cntl);
243 
244 	if (rdev->family == CHIP_RV410)
245 		WREG32(RADEON_CLOCK_CNTL_INDEX, 0);
246 
247 	if (rdev->is_atom_bios)
248 		radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
249 	else
250 		radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
251 }
252 
253 static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder,
254 				     const struct drm_display_mode *mode,
255 				     struct drm_display_mode *adjusted_mode)
256 {
257 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
258 
259 	/* set the active encoder to connector routing */
260 	radeon_encoder_set_active_device(encoder);
261 	drm_mode_set_crtcinfo(adjusted_mode, 0);
262 
263 	/* get the native mode for LVDS */
264 	if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
265 		radeon_panel_mode_fixup(encoder, adjusted_mode);
266 
267 	return true;
268 }
269 
270 static const struct drm_encoder_helper_funcs radeon_legacy_lvds_helper_funcs = {
271 	.dpms = radeon_legacy_lvds_dpms,
272 	.mode_fixup = radeon_legacy_mode_fixup,
273 	.prepare = radeon_legacy_lvds_prepare,
274 	.mode_set = radeon_legacy_lvds_mode_set,
275 	.commit = radeon_legacy_lvds_commit,
276 	.disable = radeon_legacy_encoder_disable,
277 };
278 
279 u8
280 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder)
281 {
282 	struct drm_device *dev = radeon_encoder->base.dev;
283 	struct radeon_device *rdev = dev->dev_private;
284 	u8 backlight_level;
285 
286 	backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >>
287 			   RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
288 
289 	return backlight_level;
290 }
291 
292 void
293 radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level)
294 {
295 	struct drm_device *dev = radeon_encoder->base.dev;
296 	struct radeon_device *rdev = dev->dev_private;
297 	int dpms_mode = DRM_MODE_DPMS_ON;
298 
299 	if (radeon_encoder->enc_priv) {
300 		if (rdev->is_atom_bios) {
301 			struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
302 			if (lvds->backlight_level > 0)
303 				dpms_mode = lvds->dpms_mode;
304 			else
305 				dpms_mode = DRM_MODE_DPMS_OFF;
306 			lvds->backlight_level = level;
307 		} else {
308 			struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
309 			if (lvds->backlight_level > 0)
310 				dpms_mode = lvds->dpms_mode;
311 			else
312 				dpms_mode = DRM_MODE_DPMS_OFF;
313 			lvds->backlight_level = level;
314 		}
315 	}
316 
317 	radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode);
318 }
319 
320 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
321 
322 static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd)
323 {
324 	struct radeon_backlight_privdata *pdata = bl_get_data(bd);
325 	uint8_t level;
326 
327 	/* Convert brightness to hardware level */
328 	if (bd->props.brightness < 0)
329 		level = 0;
330 	else if (bd->props.brightness > RADEON_MAX_BL_LEVEL)
331 		level = RADEON_MAX_BL_LEVEL;
332 	else
333 		level = bd->props.brightness;
334 
335 	if (pdata->negative)
336 		level = RADEON_MAX_BL_LEVEL - level;
337 
338 	return level;
339 }
340 
341 static int radeon_legacy_backlight_update_status(struct backlight_device *bd)
342 {
343 	struct radeon_backlight_privdata *pdata = bl_get_data(bd);
344 	struct radeon_encoder *radeon_encoder = pdata->encoder;
345 
346 	radeon_legacy_set_backlight_level(radeon_encoder,
347 					  radeon_legacy_lvds_level(bd));
348 
349 	return 0;
350 }
351 
352 static int radeon_legacy_backlight_get_brightness(struct backlight_device *bd)
353 {
354 	struct radeon_backlight_privdata *pdata = bl_get_data(bd);
355 	struct radeon_encoder *radeon_encoder = pdata->encoder;
356 	struct drm_device *dev = radeon_encoder->base.dev;
357 	struct radeon_device *rdev = dev->dev_private;
358 	uint8_t backlight_level;
359 
360 	backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >>
361 			   RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
362 
363 	return pdata->negative ? RADEON_MAX_BL_LEVEL - backlight_level : backlight_level;
364 }
365 
366 static const struct backlight_ops radeon_backlight_ops = {
367 	.get_brightness = radeon_legacy_backlight_get_brightness,
368 	.update_status	= radeon_legacy_backlight_update_status,
369 };
370 
371 void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
372 				  struct drm_connector *drm_connector)
373 {
374 	struct drm_device *dev = radeon_encoder->base.dev;
375 	struct radeon_device *rdev = dev->dev_private;
376 	struct backlight_device *bd;
377 	struct backlight_properties props;
378 	struct radeon_backlight_privdata *pdata;
379 	uint8_t backlight_level;
380 	char bl_name[16];
381 
382 	if (!radeon_encoder->enc_priv)
383 		return;
384 
385 #ifdef CONFIG_PMAC_BACKLIGHT
386 	if (!pmac_has_backlight_type("ati") &&
387 	    !pmac_has_backlight_type("mnca"))
388 		return;
389 #endif
390 
391 	pdata = kmalloc(sizeof(struct radeon_backlight_privdata), GFP_KERNEL);
392 	if (!pdata) {
393 		DRM_ERROR("Memory allocation failed\n");
394 		goto error;
395 	}
396 
397 	memset(&props, 0, sizeof(props));
398 	props.max_brightness = RADEON_MAX_BL_LEVEL;
399 	props.type = BACKLIGHT_RAW;
400 	snprintf(bl_name, sizeof(bl_name),
401 		 "radeon_bl%d", dev->primary->index);
402 	bd = backlight_device_register(bl_name, drm_connector->kdev,
403 				       pdata, &radeon_backlight_ops, &props);
404 	if (IS_ERR(bd)) {
405 		DRM_ERROR("Backlight registration failed\n");
406 		goto error;
407 	}
408 
409 	pdata->encoder = radeon_encoder;
410 
411 	backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >>
412 			   RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
413 
414 	/* First, try to detect backlight level sense based on the assumption
415 	 * that firmware set it up at full brightness
416 	 */
417 	if (backlight_level == 0)
418 		pdata->negative = true;
419 	else if (backlight_level == 0xff)
420 		pdata->negative = false;
421 	else {
422 		/* XXX hack... maybe some day we can figure out in what direction
423 		 * backlight should work on a given panel?
424 		 */
425 		pdata->negative = (rdev->family != CHIP_RV200 &&
426 				   rdev->family != CHIP_RV250 &&
427 				   rdev->family != CHIP_RV280 &&
428 				   rdev->family != CHIP_RV350);
429 
430 #ifdef CONFIG_PMAC_BACKLIGHT
431 		pdata->negative = (pdata->negative ||
432 				   of_machine_is_compatible("PowerBook4,3") ||
433 				   of_machine_is_compatible("PowerBook6,3") ||
434 				   of_machine_is_compatible("PowerBook6,5"));
435 #endif
436 	}
437 
438 	if (rdev->is_atom_bios) {
439 		struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
440 		lvds->bl_dev = bd;
441 	} else {
442 		struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
443 		lvds->bl_dev = bd;
444 	}
445 
446 	bd->props.brightness = radeon_legacy_backlight_get_brightness(bd);
447 	bd->props.power = FB_BLANK_UNBLANK;
448 	backlight_update_status(bd);
449 
450 	DRM_INFO("radeon legacy LVDS backlight initialized\n");
451 	rdev->mode_info.bl_encoder = radeon_encoder;
452 
453 	return;
454 
455 error:
456 	kfree(pdata);
457 	return;
458 }
459 
460 static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder)
461 {
462 	struct drm_device *dev = radeon_encoder->base.dev;
463 	struct radeon_device *rdev = dev->dev_private;
464 	struct backlight_device *bd = NULL;
465 
466 	if (!radeon_encoder->enc_priv)
467 		return;
468 
469 	if (rdev->is_atom_bios) {
470 		struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
471 		bd = lvds->bl_dev;
472 		lvds->bl_dev = NULL;
473 	} else {
474 		struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
475 		bd = lvds->bl_dev;
476 		lvds->bl_dev = NULL;
477 	}
478 
479 	if (bd) {
480 		struct radeon_backlight_privdata *pdata;
481 
482 		pdata = bl_get_data(bd);
483 		backlight_device_unregister(bd);
484 		kfree(pdata);
485 
486 		DRM_INFO("radeon legacy LVDS backlight unloaded\n");
487 	}
488 }
489 
490 #else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */
491 
492 void radeon_legacy_backlight_init(struct radeon_encoder *encoder)
493 {
494 }
495 
496 static void radeon_legacy_backlight_exit(struct radeon_encoder *encoder)
497 {
498 }
499 
500 #endif
501 
502 
503 static void radeon_lvds_enc_destroy(struct drm_encoder *encoder)
504 {
505 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
506 
507 	if (radeon_encoder->enc_priv) {
508 		radeon_legacy_backlight_exit(radeon_encoder);
509 		kfree(radeon_encoder->enc_priv);
510 	}
511 	drm_encoder_cleanup(encoder);
512 	kfree(radeon_encoder);
513 }
514 
515 static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = {
516 	.destroy = radeon_lvds_enc_destroy,
517 };
518 
519 static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode)
520 {
521 	struct drm_device *dev = encoder->dev;
522 	struct radeon_device *rdev = dev->dev_private;
523 	uint32_t crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
524 	uint32_t dac_cntl = RREG32(RADEON_DAC_CNTL);
525 	uint32_t dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL);
526 
527 	DRM_DEBUG_KMS("\n");
528 
529 	switch (mode) {
530 	case DRM_MODE_DPMS_ON:
531 		crtc_ext_cntl |= RADEON_CRTC_CRT_ON;
532 		dac_cntl &= ~RADEON_DAC_PDWN;
533 		dac_macro_cntl &= ~(RADEON_DAC_PDWN_R |
534 				    RADEON_DAC_PDWN_G |
535 				    RADEON_DAC_PDWN_B);
536 		break;
537 	case DRM_MODE_DPMS_STANDBY:
538 	case DRM_MODE_DPMS_SUSPEND:
539 	case DRM_MODE_DPMS_OFF:
540 		crtc_ext_cntl &= ~RADEON_CRTC_CRT_ON;
541 		dac_cntl |= RADEON_DAC_PDWN;
542 		dac_macro_cntl |= (RADEON_DAC_PDWN_R |
543 				   RADEON_DAC_PDWN_G |
544 				   RADEON_DAC_PDWN_B);
545 		break;
546 	}
547 
548 	/* handled in radeon_crtc_dpms() */
549 	if (!(rdev->flags & RADEON_SINGLE_CRTC))
550 		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
551 	WREG32(RADEON_DAC_CNTL, dac_cntl);
552 	WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl);
553 
554 	if (rdev->is_atom_bios)
555 		radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
556 	else
557 		radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
558 
559 }
560 
561 static void radeon_legacy_primary_dac_prepare(struct drm_encoder *encoder)
562 {
563 	struct radeon_device *rdev = encoder->dev->dev_private;
564 
565 	if (rdev->is_atom_bios)
566 		radeon_atom_output_lock(encoder, true);
567 	else
568 		radeon_combios_output_lock(encoder, true);
569 	radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
570 }
571 
572 static void radeon_legacy_primary_dac_commit(struct drm_encoder *encoder)
573 {
574 	struct radeon_device *rdev = encoder->dev->dev_private;
575 
576 	radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_ON);
577 
578 	if (rdev->is_atom_bios)
579 		radeon_atom_output_lock(encoder, false);
580 	else
581 		radeon_combios_output_lock(encoder, false);
582 }
583 
584 static void radeon_legacy_primary_dac_mode_set(struct drm_encoder *encoder,
585 					       struct drm_display_mode *mode,
586 					       struct drm_display_mode *adjusted_mode)
587 {
588 	struct drm_device *dev = encoder->dev;
589 	struct radeon_device *rdev = dev->dev_private;
590 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
591 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
592 	uint32_t disp_output_cntl, dac_cntl, dac2_cntl, dac_macro_cntl;
593 
594 	DRM_DEBUG_KMS("\n");
595 
596 	if (radeon_crtc->crtc_id == 0) {
597 		if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) {
598 			disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL) &
599 				~(RADEON_DISP_DAC_SOURCE_MASK);
600 			WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
601 		} else {
602 			dac2_cntl = RREG32(RADEON_DAC_CNTL2)  & ~(RADEON_DAC2_DAC_CLK_SEL);
603 			WREG32(RADEON_DAC_CNTL2, dac2_cntl);
604 		}
605 	} else {
606 		if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) {
607 			disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL) &
608 				~(RADEON_DISP_DAC_SOURCE_MASK);
609 			disp_output_cntl |= RADEON_DISP_DAC_SOURCE_CRTC2;
610 			WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
611 		} else {
612 			dac2_cntl = RREG32(RADEON_DAC_CNTL2) | RADEON_DAC2_DAC_CLK_SEL;
613 			WREG32(RADEON_DAC_CNTL2, dac2_cntl);
614 		}
615 	}
616 
617 	dac_cntl = (RADEON_DAC_MASK_ALL |
618 		    RADEON_DAC_VGA_ADR_EN |
619 		    /* TODO 6-bits */
620 		    RADEON_DAC_8BIT_EN);
621 
622 	WREG32_P(RADEON_DAC_CNTL,
623 		       dac_cntl,
624 		       RADEON_DAC_RANGE_CNTL |
625 		       RADEON_DAC_BLANKING);
626 
627 	if (radeon_encoder->enc_priv) {
628 		struct radeon_encoder_primary_dac *p_dac = (struct radeon_encoder_primary_dac *)radeon_encoder->enc_priv;
629 		dac_macro_cntl = p_dac->ps2_pdac_adj;
630 	} else
631 		dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL);
632 	dac_macro_cntl |= RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G | RADEON_DAC_PDWN_B;
633 	WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl);
634 
635 	if (rdev->is_atom_bios)
636 		radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
637 	else
638 		radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
639 }
640 
641 static enum drm_connector_status radeon_legacy_primary_dac_detect(struct drm_encoder *encoder,
642 								  struct drm_connector *connector)
643 {
644 	struct drm_device *dev = encoder->dev;
645 	struct radeon_device *rdev = dev->dev_private;
646 	uint32_t vclk_ecp_cntl, crtc_ext_cntl;
647 	uint32_t dac_ext_cntl, dac_cntl, dac_macro_cntl, tmp;
648 	enum drm_connector_status found = connector_status_disconnected;
649 	bool color = true;
650 
651 	/* just don't bother on RN50 those chip are often connected to remoting
652 	 * console hw and often we get failure to load detect those. So to make
653 	 * everyone happy report the encoder as always connected.
654 	 */
655 	if (ASIC_IS_RN50(rdev)) {
656 		return connector_status_connected;
657 	}
658 
659 	/* save the regs we need */
660 	vclk_ecp_cntl = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
661 	crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
662 	dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL);
663 	dac_cntl = RREG32(RADEON_DAC_CNTL);
664 	dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL);
665 
666 	tmp = vclk_ecp_cntl &
667 		~(RADEON_PIXCLK_ALWAYS_ONb | RADEON_PIXCLK_DAC_ALWAYS_ONb);
668 	WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
669 
670 	tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON;
671 	WREG32(RADEON_CRTC_EXT_CNTL, tmp);
672 
673 	tmp = RADEON_DAC_FORCE_BLANK_OFF_EN |
674 		RADEON_DAC_FORCE_DATA_EN;
675 
676 	if (color)
677 		tmp |= RADEON_DAC_FORCE_DATA_SEL_RGB;
678 	else
679 		tmp |= RADEON_DAC_FORCE_DATA_SEL_G;
680 
681 	if (ASIC_IS_R300(rdev))
682 		tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT);
683 	else if (ASIC_IS_RV100(rdev))
684 		tmp |= (0x1ac << RADEON_DAC_FORCE_DATA_SHIFT);
685 	else
686 		tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT);
687 
688 	WREG32(RADEON_DAC_EXT_CNTL, tmp);
689 
690 	tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN);
691 	tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN;
692 	WREG32(RADEON_DAC_CNTL, tmp);
693 
694 	tmp = dac_macro_cntl;
695 	tmp &= ~(RADEON_DAC_PDWN_R |
696 		 RADEON_DAC_PDWN_G |
697 		 RADEON_DAC_PDWN_B);
698 
699 	WREG32(RADEON_DAC_MACRO_CNTL, tmp);
700 
701 	mdelay(2);
702 
703 	if (RREG32(RADEON_DAC_CNTL) & RADEON_DAC_CMP_OUTPUT)
704 		found = connector_status_connected;
705 
706 	/* restore the regs we used */
707 	WREG32(RADEON_DAC_CNTL, dac_cntl);
708 	WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl);
709 	WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl);
710 	WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
711 	WREG32_PLL(RADEON_VCLK_ECP_CNTL, vclk_ecp_cntl);
712 
713 	return found;
714 }
715 
716 static const struct drm_encoder_helper_funcs radeon_legacy_primary_dac_helper_funcs = {
717 	.dpms = radeon_legacy_primary_dac_dpms,
718 	.mode_fixup = radeon_legacy_mode_fixup,
719 	.prepare = radeon_legacy_primary_dac_prepare,
720 	.mode_set = radeon_legacy_primary_dac_mode_set,
721 	.commit = radeon_legacy_primary_dac_commit,
722 	.detect = radeon_legacy_primary_dac_detect,
723 	.disable = radeon_legacy_encoder_disable,
724 };
725 
726 
727 static const struct drm_encoder_funcs radeon_legacy_primary_dac_enc_funcs = {
728 	.destroy = radeon_enc_destroy,
729 };
730 
731 static void radeon_legacy_tmds_int_dpms(struct drm_encoder *encoder, int mode)
732 {
733 	struct drm_device *dev = encoder->dev;
734 	struct radeon_device *rdev = dev->dev_private;
735 	uint32_t fp_gen_cntl = RREG32(RADEON_FP_GEN_CNTL);
736 	DRM_DEBUG_KMS("\n");
737 
738 	switch (mode) {
739 	case DRM_MODE_DPMS_ON:
740 		fp_gen_cntl |= (RADEON_FP_FPON | RADEON_FP_TMDS_EN);
741 		break;
742 	case DRM_MODE_DPMS_STANDBY:
743 	case DRM_MODE_DPMS_SUSPEND:
744 	case DRM_MODE_DPMS_OFF:
745 		fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN);
746 		break;
747 	}
748 
749 	WREG32(RADEON_FP_GEN_CNTL, fp_gen_cntl);
750 
751 	if (rdev->is_atom_bios)
752 		radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
753 	else
754 		radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
755 
756 }
757 
758 static void radeon_legacy_tmds_int_prepare(struct drm_encoder *encoder)
759 {
760 	struct radeon_device *rdev = encoder->dev->dev_private;
761 
762 	if (rdev->is_atom_bios)
763 		radeon_atom_output_lock(encoder, true);
764 	else
765 		radeon_combios_output_lock(encoder, true);
766 	radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_OFF);
767 }
768 
769 static void radeon_legacy_tmds_int_commit(struct drm_encoder *encoder)
770 {
771 	struct radeon_device *rdev = encoder->dev->dev_private;
772 
773 	radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_ON);
774 
775 	if (rdev->is_atom_bios)
776 		radeon_atom_output_lock(encoder, true);
777 	else
778 		radeon_combios_output_lock(encoder, true);
779 }
780 
781 static void radeon_legacy_tmds_int_mode_set(struct drm_encoder *encoder,
782 					    struct drm_display_mode *mode,
783 					    struct drm_display_mode *adjusted_mode)
784 {
785 	struct drm_device *dev = encoder->dev;
786 	struct radeon_device *rdev = dev->dev_private;
787 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
788 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
789 	uint32_t tmp, tmds_pll_cntl, tmds_transmitter_cntl, fp_gen_cntl;
790 	int i;
791 
792 	DRM_DEBUG_KMS("\n");
793 
794 	tmp = tmds_pll_cntl = RREG32(RADEON_TMDS_PLL_CNTL);
795 	tmp &= 0xfffff;
796 	if (rdev->family == CHIP_RV280) {
797 		/* bit 22 of TMDS_PLL_CNTL is read-back inverted */
798 		tmp ^= (1 << 22);
799 		tmds_pll_cntl ^= (1 << 22);
800 	}
801 
802 	if (radeon_encoder->enc_priv) {
803 		struct radeon_encoder_int_tmds *tmds = (struct radeon_encoder_int_tmds *)radeon_encoder->enc_priv;
804 
805 		for (i = 0; i < 4; i++) {
806 			if (tmds->tmds_pll[i].freq == 0)
807 				break;
808 			if ((uint32_t)(mode->clock / 10) < tmds->tmds_pll[i].freq) {
809 				tmp = tmds->tmds_pll[i].value ;
810 				break;
811 			}
812 		}
813 	}
814 
815 	if (ASIC_IS_R300(rdev) || (rdev->family == CHIP_RV280)) {
816 		if (tmp & 0xfff00000)
817 			tmds_pll_cntl = tmp;
818 		else {
819 			tmds_pll_cntl &= 0xfff00000;
820 			tmds_pll_cntl |= tmp;
821 		}
822 	} else
823 		tmds_pll_cntl = tmp;
824 
825 	tmds_transmitter_cntl = RREG32(RADEON_TMDS_TRANSMITTER_CNTL) &
826 		~(RADEON_TMDS_TRANSMITTER_PLLRST);
827 
828 	if (rdev->family == CHIP_R200 ||
829 	    rdev->family == CHIP_R100 ||
830 	    ASIC_IS_R300(rdev))
831 		tmds_transmitter_cntl &= ~(RADEON_TMDS_TRANSMITTER_PLLEN);
832 	else /* RV chips got this bit reversed */
833 		tmds_transmitter_cntl |= RADEON_TMDS_TRANSMITTER_PLLEN;
834 
835 	fp_gen_cntl = (RREG32(RADEON_FP_GEN_CNTL) |
836 		      (RADEON_FP_CRTC_DONT_SHADOW_VPAR |
837 		       RADEON_FP_CRTC_DONT_SHADOW_HEND));
838 
839 	fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN);
840 
841 	fp_gen_cntl &= ~(RADEON_FP_RMX_HVSYNC_CONTROL_EN |
842 			 RADEON_FP_DFP_SYNC_SEL |
843 			 RADEON_FP_CRT_SYNC_SEL |
844 			 RADEON_FP_CRTC_LOCK_8DOT |
845 			 RADEON_FP_USE_SHADOW_EN |
846 			 RADEON_FP_CRTC_USE_SHADOW_VEND |
847 			 RADEON_FP_CRT_SYNC_ALT);
848 
849 	if (1) /*  FIXME rgbBits == 8 */
850 		fp_gen_cntl |= RADEON_FP_PANEL_FORMAT;  /* 24 bit format */
851 	else
852 		fp_gen_cntl &= ~RADEON_FP_PANEL_FORMAT;/* 18 bit format */
853 
854 	if (radeon_crtc->crtc_id == 0) {
855 		if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) {
856 			fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK;
857 			if (radeon_encoder->rmx_type != RMX_OFF)
858 				fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX;
859 			else
860 				fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1;
861 		} else
862 			fp_gen_cntl &= ~RADEON_FP_SEL_CRTC2;
863 	} else {
864 		if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) {
865 			fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK;
866 			fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC2;
867 		} else
868 			fp_gen_cntl |= RADEON_FP_SEL_CRTC2;
869 	}
870 
871 	WREG32(RADEON_TMDS_PLL_CNTL, tmds_pll_cntl);
872 	WREG32(RADEON_TMDS_TRANSMITTER_CNTL, tmds_transmitter_cntl);
873 	WREG32(RADEON_FP_GEN_CNTL, fp_gen_cntl);
874 
875 	if (rdev->is_atom_bios)
876 		radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
877 	else
878 		radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
879 }
880 
881 static const struct drm_encoder_helper_funcs radeon_legacy_tmds_int_helper_funcs = {
882 	.dpms = radeon_legacy_tmds_int_dpms,
883 	.mode_fixup = radeon_legacy_mode_fixup,
884 	.prepare = radeon_legacy_tmds_int_prepare,
885 	.mode_set = radeon_legacy_tmds_int_mode_set,
886 	.commit = radeon_legacy_tmds_int_commit,
887 	.disable = radeon_legacy_encoder_disable,
888 };
889 
890 
891 static const struct drm_encoder_funcs radeon_legacy_tmds_int_enc_funcs = {
892 	.destroy = radeon_enc_destroy,
893 };
894 
895 static void radeon_legacy_tmds_ext_dpms(struct drm_encoder *encoder, int mode)
896 {
897 	struct drm_device *dev = encoder->dev;
898 	struct radeon_device *rdev = dev->dev_private;
899 	uint32_t fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
900 	DRM_DEBUG_KMS("\n");
901 
902 	switch (mode) {
903 	case DRM_MODE_DPMS_ON:
904 		fp2_gen_cntl &= ~RADEON_FP2_BLANK_EN;
905 		fp2_gen_cntl |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN);
906 		break;
907 	case DRM_MODE_DPMS_STANDBY:
908 	case DRM_MODE_DPMS_SUSPEND:
909 	case DRM_MODE_DPMS_OFF:
910 		fp2_gen_cntl |= RADEON_FP2_BLANK_EN;
911 		fp2_gen_cntl &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN);
912 		break;
913 	}
914 
915 	WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
916 
917 	if (rdev->is_atom_bios)
918 		radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
919 	else
920 		radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
921 
922 }
923 
924 static void radeon_legacy_tmds_ext_prepare(struct drm_encoder *encoder)
925 {
926 	struct radeon_device *rdev = encoder->dev->dev_private;
927 
928 	if (rdev->is_atom_bios)
929 		radeon_atom_output_lock(encoder, true);
930 	else
931 		radeon_combios_output_lock(encoder, true);
932 	radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_OFF);
933 }
934 
935 static void radeon_legacy_tmds_ext_commit(struct drm_encoder *encoder)
936 {
937 	struct radeon_device *rdev = encoder->dev->dev_private;
938 	radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_ON);
939 
940 	if (rdev->is_atom_bios)
941 		radeon_atom_output_lock(encoder, false);
942 	else
943 		radeon_combios_output_lock(encoder, false);
944 }
945 
946 static void radeon_legacy_tmds_ext_mode_set(struct drm_encoder *encoder,
947 					    struct drm_display_mode *mode,
948 					    struct drm_display_mode *adjusted_mode)
949 {
950 	struct drm_device *dev = encoder->dev;
951 	struct radeon_device *rdev = dev->dev_private;
952 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
953 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
954 	uint32_t fp2_gen_cntl;
955 
956 	DRM_DEBUG_KMS("\n");
957 
958 	if (rdev->is_atom_bios) {
959 		radeon_encoder->pixel_clock = adjusted_mode->clock;
960 		atombios_dvo_setup(encoder, ATOM_ENABLE);
961 		fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
962 	} else {
963 		fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
964 
965 		if (1) /*  FIXME rgbBits == 8 */
966 			fp2_gen_cntl |= RADEON_FP2_PANEL_FORMAT; /* 24 bit format, */
967 		else
968 			fp2_gen_cntl &= ~RADEON_FP2_PANEL_FORMAT;/* 18 bit format, */
969 
970 		fp2_gen_cntl &= ~(RADEON_FP2_ON |
971 				  RADEON_FP2_DVO_EN |
972 				  RADEON_FP2_DVO_RATE_SEL_SDR);
973 
974 		/* XXX: these are oem specific */
975 		if (ASIC_IS_R300(rdev)) {
976 			if ((dev->pdev->device == 0x4850) &&
977 			    (dev->pdev->subsystem_vendor == 0x1028) &&
978 			    (dev->pdev->subsystem_device == 0x2001)) /* Dell Inspiron 8600 */
979 				fp2_gen_cntl |= R300_FP2_DVO_CLOCK_MODE_SINGLE;
980 			else
981 				fp2_gen_cntl |= RADEON_FP2_PAD_FLOP_EN | R300_FP2_DVO_CLOCK_MODE_SINGLE;
982 
983 			/*if (mode->clock > 165000)
984 			  fp2_gen_cntl |= R300_FP2_DVO_DUAL_CHANNEL_EN;*/
985 		}
986 		if (!radeon_combios_external_tmds_setup(encoder))
987 			radeon_external_tmds_setup(encoder);
988 	}
989 
990 	if (radeon_crtc->crtc_id == 0) {
991 		if ((rdev->family == CHIP_R200) || ASIC_IS_R300(rdev)) {
992 			fp2_gen_cntl &= ~R200_FP2_SOURCE_SEL_MASK;
993 			if (radeon_encoder->rmx_type != RMX_OFF)
994 				fp2_gen_cntl |= R200_FP2_SOURCE_SEL_RMX;
995 			else
996 				fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC1;
997 		} else
998 			fp2_gen_cntl &= ~RADEON_FP2_SRC_SEL_CRTC2;
999 	} else {
1000 		if ((rdev->family == CHIP_R200) || ASIC_IS_R300(rdev)) {
1001 			fp2_gen_cntl &= ~R200_FP2_SOURCE_SEL_MASK;
1002 			fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2;
1003 		} else
1004 			fp2_gen_cntl |= RADEON_FP2_SRC_SEL_CRTC2;
1005 	}
1006 
1007 	WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
1008 
1009 	if (rdev->is_atom_bios)
1010 		radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
1011 	else
1012 		radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
1013 }
1014 
1015 static void radeon_ext_tmds_enc_destroy(struct drm_encoder *encoder)
1016 {
1017 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1018 	/* don't destroy the i2c bus record here, this will be done in radeon_i2c_fini */
1019 	kfree(radeon_encoder->enc_priv);
1020 	drm_encoder_cleanup(encoder);
1021 	kfree(radeon_encoder);
1022 }
1023 
1024 static const struct drm_encoder_helper_funcs radeon_legacy_tmds_ext_helper_funcs = {
1025 	.dpms = radeon_legacy_tmds_ext_dpms,
1026 	.mode_fixup = radeon_legacy_mode_fixup,
1027 	.prepare = radeon_legacy_tmds_ext_prepare,
1028 	.mode_set = radeon_legacy_tmds_ext_mode_set,
1029 	.commit = radeon_legacy_tmds_ext_commit,
1030 	.disable = radeon_legacy_encoder_disable,
1031 };
1032 
1033 
1034 static const struct drm_encoder_funcs radeon_legacy_tmds_ext_enc_funcs = {
1035 	.destroy = radeon_ext_tmds_enc_destroy,
1036 };
1037 
1038 static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode)
1039 {
1040 	struct drm_device *dev = encoder->dev;
1041 	struct radeon_device *rdev = dev->dev_private;
1042 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1043 	uint32_t fp2_gen_cntl = 0, crtc2_gen_cntl = 0, tv_dac_cntl = 0;
1044 	uint32_t tv_master_cntl = 0;
1045 	bool is_tv;
1046 	DRM_DEBUG_KMS("\n");
1047 
1048 	is_tv = radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT ? true : false;
1049 
1050 	if (rdev->family == CHIP_R200)
1051 		fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
1052 	else {
1053 		if (is_tv)
1054 			tv_master_cntl = RREG32(RADEON_TV_MASTER_CNTL);
1055 		else
1056 			crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
1057 		tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1058 	}
1059 
1060 	switch (mode) {
1061 	case DRM_MODE_DPMS_ON:
1062 		if (rdev->family == CHIP_R200) {
1063 			fp2_gen_cntl |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN);
1064 		} else {
1065 			if (is_tv)
1066 				tv_master_cntl |= RADEON_TV_ON;
1067 			else
1068 				crtc2_gen_cntl |= RADEON_CRTC2_CRT2_ON;
1069 
1070 			if (rdev->family == CHIP_R420 ||
1071 			    rdev->family == CHIP_R423 ||
1072 			    rdev->family == CHIP_RV410)
1073 				tv_dac_cntl &= ~(R420_TV_DAC_RDACPD |
1074 						 R420_TV_DAC_GDACPD |
1075 						 R420_TV_DAC_BDACPD |
1076 						 RADEON_TV_DAC_BGSLEEP);
1077 			else
1078 				tv_dac_cntl &= ~(RADEON_TV_DAC_RDACPD |
1079 						 RADEON_TV_DAC_GDACPD |
1080 						 RADEON_TV_DAC_BDACPD |
1081 						 RADEON_TV_DAC_BGSLEEP);
1082 		}
1083 		break;
1084 	case DRM_MODE_DPMS_STANDBY:
1085 	case DRM_MODE_DPMS_SUSPEND:
1086 	case DRM_MODE_DPMS_OFF:
1087 		if (rdev->family == CHIP_R200)
1088 			fp2_gen_cntl &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN);
1089 		else {
1090 			if (is_tv)
1091 				tv_master_cntl &= ~RADEON_TV_ON;
1092 			else
1093 				crtc2_gen_cntl &= ~RADEON_CRTC2_CRT2_ON;
1094 
1095 			if (rdev->family == CHIP_R420 ||
1096 			    rdev->family == CHIP_R423 ||
1097 			    rdev->family == CHIP_RV410)
1098 				tv_dac_cntl |= (R420_TV_DAC_RDACPD |
1099 						R420_TV_DAC_GDACPD |
1100 						R420_TV_DAC_BDACPD |
1101 						RADEON_TV_DAC_BGSLEEP);
1102 			else
1103 				tv_dac_cntl |= (RADEON_TV_DAC_RDACPD |
1104 						RADEON_TV_DAC_GDACPD |
1105 						RADEON_TV_DAC_BDACPD |
1106 						RADEON_TV_DAC_BGSLEEP);
1107 		}
1108 		break;
1109 	}
1110 
1111 	if (rdev->family == CHIP_R200) {
1112 		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
1113 	} else {
1114 		if (is_tv)
1115 			WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
1116 		/* handled in radeon_crtc_dpms() */
1117 		else if (!(rdev->flags & RADEON_SINGLE_CRTC))
1118 			WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1119 		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1120 	}
1121 
1122 	if (rdev->is_atom_bios)
1123 		radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
1124 	else
1125 		radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
1126 
1127 }
1128 
1129 static void radeon_legacy_tv_dac_prepare(struct drm_encoder *encoder)
1130 {
1131 	struct radeon_device *rdev = encoder->dev->dev_private;
1132 
1133 	if (rdev->is_atom_bios)
1134 		radeon_atom_output_lock(encoder, true);
1135 	else
1136 		radeon_combios_output_lock(encoder, true);
1137 	radeon_legacy_tv_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
1138 }
1139 
1140 static void radeon_legacy_tv_dac_commit(struct drm_encoder *encoder)
1141 {
1142 	struct radeon_device *rdev = encoder->dev->dev_private;
1143 
1144 	radeon_legacy_tv_dac_dpms(encoder, DRM_MODE_DPMS_ON);
1145 
1146 	if (rdev->is_atom_bios)
1147 		radeon_atom_output_lock(encoder, true);
1148 	else
1149 		radeon_combios_output_lock(encoder, true);
1150 }
1151 
1152 static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
1153 		struct drm_display_mode *mode,
1154 		struct drm_display_mode *adjusted_mode)
1155 {
1156 	struct drm_device *dev = encoder->dev;
1157 	struct radeon_device *rdev = dev->dev_private;
1158 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1159 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1160 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
1161 	uint32_t tv_dac_cntl, gpiopad_a = 0, dac2_cntl, disp_output_cntl = 0;
1162 	uint32_t disp_hw_debug = 0, fp2_gen_cntl = 0, disp_tv_out_cntl = 0;
1163 	bool is_tv = false;
1164 
1165 	DRM_DEBUG_KMS("\n");
1166 
1167 	is_tv = radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT ? true : false;
1168 
1169 	if (rdev->family != CHIP_R200) {
1170 		tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1171 		if (rdev->family == CHIP_R420 ||
1172 		    rdev->family == CHIP_R423 ||
1173 		    rdev->family == CHIP_RV410) {
1174 			tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK |
1175 					 RADEON_TV_DAC_BGADJ_MASK |
1176 					 R420_TV_DAC_DACADJ_MASK |
1177 					 R420_TV_DAC_RDACPD |
1178 					 R420_TV_DAC_GDACPD |
1179 					 R420_TV_DAC_BDACPD |
1180 					 R420_TV_DAC_TVENABLE);
1181 		} else {
1182 			tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK |
1183 					 RADEON_TV_DAC_BGADJ_MASK |
1184 					 RADEON_TV_DAC_DACADJ_MASK |
1185 					 RADEON_TV_DAC_RDACPD |
1186 					 RADEON_TV_DAC_GDACPD |
1187 					 RADEON_TV_DAC_BDACPD);
1188 		}
1189 
1190 		tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD;
1191 
1192 		if (is_tv) {
1193 			if (tv_dac->tv_std == TV_STD_NTSC ||
1194 			    tv_dac->tv_std == TV_STD_NTSC_J ||
1195 			    tv_dac->tv_std == TV_STD_PAL_M ||
1196 			    tv_dac->tv_std == TV_STD_PAL_60)
1197 				tv_dac_cntl |= tv_dac->ntsc_tvdac_adj;
1198 			else
1199 				tv_dac_cntl |= tv_dac->pal_tvdac_adj;
1200 
1201 			if (tv_dac->tv_std == TV_STD_NTSC ||
1202 			    tv_dac->tv_std == TV_STD_NTSC_J)
1203 				tv_dac_cntl |= RADEON_TV_DAC_STD_NTSC;
1204 			else
1205 				tv_dac_cntl |= RADEON_TV_DAC_STD_PAL;
1206 		} else
1207 			tv_dac_cntl |= (RADEON_TV_DAC_STD_PS2 |
1208 					tv_dac->ps2_tvdac_adj);
1209 
1210 		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1211 	}
1212 
1213 	if (ASIC_IS_R300(rdev)) {
1214 		gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1;
1215 		disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
1216 	} else if (rdev->family != CHIP_R200)
1217 		disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
1218 	else if (rdev->family == CHIP_R200)
1219 		fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
1220 
1221 	if (rdev->family >= CHIP_R200)
1222 		disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL);
1223 
1224 	if (is_tv) {
1225 		uint32_t dac_cntl;
1226 
1227 		dac_cntl = RREG32(RADEON_DAC_CNTL);
1228 		dac_cntl &= ~RADEON_DAC_TVO_EN;
1229 		WREG32(RADEON_DAC_CNTL, dac_cntl);
1230 
1231 		if (ASIC_IS_R300(rdev))
1232 			gpiopad_a = RREG32(RADEON_GPIOPAD_A) & ~1;
1233 
1234 		dac2_cntl = RREG32(RADEON_DAC_CNTL2) & ~RADEON_DAC2_DAC2_CLK_SEL;
1235 		if (radeon_crtc->crtc_id == 0) {
1236 			if (ASIC_IS_R300(rdev)) {
1237 				disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK;
1238 				disp_output_cntl |= (RADEON_DISP_TVDAC_SOURCE_CRTC |
1239 						     RADEON_DISP_TV_SOURCE_CRTC);
1240 			}
1241 			if (rdev->family >= CHIP_R200) {
1242 				disp_tv_out_cntl &= ~RADEON_DISP_TV_PATH_SRC_CRTC2;
1243 			} else {
1244 				disp_hw_debug |= RADEON_CRT2_DISP1_SEL;
1245 			}
1246 		} else {
1247 			if (ASIC_IS_R300(rdev)) {
1248 				disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK;
1249 				disp_output_cntl |= RADEON_DISP_TV_SOURCE_CRTC;
1250 			}
1251 			if (rdev->family >= CHIP_R200) {
1252 				disp_tv_out_cntl |= RADEON_DISP_TV_PATH_SRC_CRTC2;
1253 			} else {
1254 				disp_hw_debug &= ~RADEON_CRT2_DISP1_SEL;
1255 			}
1256 		}
1257 		WREG32(RADEON_DAC_CNTL2, dac2_cntl);
1258 	} else {
1259 
1260 		dac2_cntl = RREG32(RADEON_DAC_CNTL2) | RADEON_DAC2_DAC2_CLK_SEL;
1261 
1262 		if (radeon_crtc->crtc_id == 0) {
1263 			if (ASIC_IS_R300(rdev)) {
1264 				disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK;
1265 				disp_output_cntl |= RADEON_DISP_TVDAC_SOURCE_CRTC;
1266 			} else if (rdev->family == CHIP_R200) {
1267 				fp2_gen_cntl &= ~(R200_FP2_SOURCE_SEL_MASK |
1268 						  RADEON_FP2_DVO_RATE_SEL_SDR);
1269 			} else
1270 				disp_hw_debug |= RADEON_CRT2_DISP1_SEL;
1271 		} else {
1272 			if (ASIC_IS_R300(rdev)) {
1273 				disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK;
1274 				disp_output_cntl |= RADEON_DISP_TVDAC_SOURCE_CRTC2;
1275 			} else if (rdev->family == CHIP_R200) {
1276 				fp2_gen_cntl &= ~(R200_FP2_SOURCE_SEL_MASK |
1277 						  RADEON_FP2_DVO_RATE_SEL_SDR);
1278 				fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2;
1279 			} else
1280 				disp_hw_debug &= ~RADEON_CRT2_DISP1_SEL;
1281 		}
1282 		WREG32(RADEON_DAC_CNTL2, dac2_cntl);
1283 	}
1284 
1285 	if (ASIC_IS_R300(rdev)) {
1286 		WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
1287 		WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
1288 	} else if (rdev->family != CHIP_R200)
1289 		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
1290 	else if (rdev->family == CHIP_R200)
1291 		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
1292 
1293 	if (rdev->family >= CHIP_R200)
1294 		WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl);
1295 
1296 	if (is_tv)
1297 		radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode);
1298 
1299 	if (rdev->is_atom_bios)
1300 		radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
1301 	else
1302 		radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
1303 
1304 }
1305 
1306 static bool r300_legacy_tv_detect(struct drm_encoder *encoder,
1307 				  struct drm_connector *connector)
1308 {
1309 	struct drm_device *dev = encoder->dev;
1310 	struct radeon_device *rdev = dev->dev_private;
1311 	uint32_t crtc2_gen_cntl, tv_dac_cntl, dac_cntl2, dac_ext_cntl;
1312 	uint32_t disp_output_cntl, gpiopad_a, tmp;
1313 	bool found = false;
1314 
1315 	/* save regs needed */
1316 	gpiopad_a = RREG32(RADEON_GPIOPAD_A);
1317 	dac_cntl2 = RREG32(RADEON_DAC_CNTL2);
1318 	crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
1319 	dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL);
1320 	tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1321 	disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
1322 
1323 	WREG32_P(RADEON_GPIOPAD_A, 0, ~1);
1324 
1325 	WREG32(RADEON_DAC_CNTL2, RADEON_DAC2_DAC2_CLK_SEL);
1326 
1327 	WREG32(RADEON_CRTC2_GEN_CNTL,
1328 	       RADEON_CRTC2_CRT2_ON | RADEON_CRTC2_VSYNC_TRISTAT);
1329 
1330 	tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK;
1331 	tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2;
1332 	WREG32(RADEON_DISP_OUTPUT_CNTL, tmp);
1333 
1334 	WREG32(RADEON_DAC_EXT_CNTL,
1335 	       RADEON_DAC2_FORCE_BLANK_OFF_EN |
1336 	       RADEON_DAC2_FORCE_DATA_EN |
1337 	       RADEON_DAC_FORCE_DATA_SEL_RGB |
1338 	       (0xec << RADEON_DAC_FORCE_DATA_SHIFT));
1339 
1340 	WREG32(RADEON_TV_DAC_CNTL,
1341 	       RADEON_TV_DAC_STD_NTSC |
1342 	       (8 << RADEON_TV_DAC_BGADJ_SHIFT) |
1343 	       (6 << RADEON_TV_DAC_DACADJ_SHIFT));
1344 
1345 	RREG32(RADEON_TV_DAC_CNTL);
1346 	mdelay(4);
1347 
1348 	WREG32(RADEON_TV_DAC_CNTL,
1349 	       RADEON_TV_DAC_NBLANK |
1350 	       RADEON_TV_DAC_NHOLD |
1351 	       RADEON_TV_MONITOR_DETECT_EN |
1352 	       RADEON_TV_DAC_STD_NTSC |
1353 	       (8 << RADEON_TV_DAC_BGADJ_SHIFT) |
1354 	       (6 << RADEON_TV_DAC_DACADJ_SHIFT));
1355 
1356 	RREG32(RADEON_TV_DAC_CNTL);
1357 	mdelay(6);
1358 
1359 	tmp = RREG32(RADEON_TV_DAC_CNTL);
1360 	if ((tmp & RADEON_TV_DAC_GDACDET) != 0) {
1361 		found = true;
1362 		DRM_DEBUG_KMS("S-video TV connection detected\n");
1363 	} else if ((tmp & RADEON_TV_DAC_BDACDET) != 0) {
1364 		found = true;
1365 		DRM_DEBUG_KMS("Composite TV connection detected\n");
1366 	}
1367 
1368 	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1369 	WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl);
1370 	WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1371 	WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
1372 	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1373 	WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
1374 	return found;
1375 }
1376 
1377 static bool radeon_legacy_tv_detect(struct drm_encoder *encoder,
1378 				    struct drm_connector *connector)
1379 {
1380 	struct drm_device *dev = encoder->dev;
1381 	struct radeon_device *rdev = dev->dev_private;
1382 	uint32_t tv_dac_cntl, dac_cntl2;
1383 	uint32_t config_cntl, tv_pre_dac_mux_cntl, tv_master_cntl, tmp;
1384 	bool found = false;
1385 
1386 	if (ASIC_IS_R300(rdev))
1387 		return r300_legacy_tv_detect(encoder, connector);
1388 
1389 	dac_cntl2 = RREG32(RADEON_DAC_CNTL2);
1390 	tv_master_cntl = RREG32(RADEON_TV_MASTER_CNTL);
1391 	tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1392 	config_cntl = RREG32(RADEON_CONFIG_CNTL);
1393 	tv_pre_dac_mux_cntl = RREG32(RADEON_TV_PRE_DAC_MUX_CNTL);
1394 
1395 	tmp = dac_cntl2 & ~RADEON_DAC2_DAC2_CLK_SEL;
1396 	WREG32(RADEON_DAC_CNTL2, tmp);
1397 
1398 	tmp = tv_master_cntl | RADEON_TV_ON;
1399 	tmp &= ~(RADEON_TV_ASYNC_RST |
1400 		 RADEON_RESTART_PHASE_FIX |
1401 		 RADEON_CRT_FIFO_CE_EN |
1402 		 RADEON_TV_FIFO_CE_EN |
1403 		 RADEON_RE_SYNC_NOW_SEL_MASK);
1404 	tmp |= RADEON_TV_FIFO_ASYNC_RST | RADEON_CRT_ASYNC_RST;
1405 	WREG32(RADEON_TV_MASTER_CNTL, tmp);
1406 
1407 	tmp = RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD |
1408 		RADEON_TV_MONITOR_DETECT_EN | RADEON_TV_DAC_STD_NTSC |
1409 		(8 << RADEON_TV_DAC_BGADJ_SHIFT);
1410 
1411 	if (config_cntl & RADEON_CFG_ATI_REV_ID_MASK)
1412 		tmp |= (4 << RADEON_TV_DAC_DACADJ_SHIFT);
1413 	else
1414 		tmp |= (8 << RADEON_TV_DAC_DACADJ_SHIFT);
1415 	WREG32(RADEON_TV_DAC_CNTL, tmp);
1416 
1417 	tmp = RADEON_C_GRN_EN | RADEON_CMP_BLU_EN |
1418 		RADEON_RED_MX_FORCE_DAC_DATA |
1419 		RADEON_GRN_MX_FORCE_DAC_DATA |
1420 		RADEON_BLU_MX_FORCE_DAC_DATA |
1421 		(0x109 << RADEON_TV_FORCE_DAC_DATA_SHIFT);
1422 	WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, tmp);
1423 
1424 	mdelay(3);
1425 	tmp = RREG32(RADEON_TV_DAC_CNTL);
1426 	if (tmp & RADEON_TV_DAC_GDACDET) {
1427 		found = true;
1428 		DRM_DEBUG_KMS("S-video TV connection detected\n");
1429 	} else if ((tmp & RADEON_TV_DAC_BDACDET) != 0) {
1430 		found = true;
1431 		DRM_DEBUG_KMS("Composite TV connection detected\n");
1432 	}
1433 
1434 	WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, tv_pre_dac_mux_cntl);
1435 	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1436 	WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
1437 	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1438 	return found;
1439 }
1440 
1441 static bool radeon_legacy_ext_dac_detect(struct drm_encoder *encoder,
1442 					 struct drm_connector *connector)
1443 {
1444 	struct drm_device *dev = encoder->dev;
1445 	struct radeon_device *rdev = dev->dev_private;
1446 	uint32_t gpio_monid, fp2_gen_cntl, disp_output_cntl, crtc2_gen_cntl;
1447 	uint32_t disp_lin_trans_grph_a, disp_lin_trans_grph_b, disp_lin_trans_grph_c;
1448 	uint32_t disp_lin_trans_grph_d, disp_lin_trans_grph_e, disp_lin_trans_grph_f;
1449 	uint32_t tmp, crtc2_h_total_disp, crtc2_v_total_disp;
1450 	uint32_t crtc2_h_sync_strt_wid, crtc2_v_sync_strt_wid;
1451 	bool found = false;
1452 	int i;
1453 
1454 	/* save the regs we need */
1455 	gpio_monid = RREG32(RADEON_GPIO_MONID);
1456 	fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
1457 	disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
1458 	crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
1459 	disp_lin_trans_grph_a = RREG32(RADEON_DISP_LIN_TRANS_GRPH_A);
1460 	disp_lin_trans_grph_b = RREG32(RADEON_DISP_LIN_TRANS_GRPH_B);
1461 	disp_lin_trans_grph_c = RREG32(RADEON_DISP_LIN_TRANS_GRPH_C);
1462 	disp_lin_trans_grph_d = RREG32(RADEON_DISP_LIN_TRANS_GRPH_D);
1463 	disp_lin_trans_grph_e = RREG32(RADEON_DISP_LIN_TRANS_GRPH_E);
1464 	disp_lin_trans_grph_f = RREG32(RADEON_DISP_LIN_TRANS_GRPH_F);
1465 	crtc2_h_total_disp = RREG32(RADEON_CRTC2_H_TOTAL_DISP);
1466 	crtc2_v_total_disp = RREG32(RADEON_CRTC2_V_TOTAL_DISP);
1467 	crtc2_h_sync_strt_wid = RREG32(RADEON_CRTC2_H_SYNC_STRT_WID);
1468 	crtc2_v_sync_strt_wid = RREG32(RADEON_CRTC2_V_SYNC_STRT_WID);
1469 
1470 	tmp = RREG32(RADEON_GPIO_MONID);
1471 	tmp &= ~RADEON_GPIO_A_0;
1472 	WREG32(RADEON_GPIO_MONID, tmp);
1473 
1474 	WREG32(RADEON_FP2_GEN_CNTL, (RADEON_FP2_ON |
1475 				     RADEON_FP2_PANEL_FORMAT |
1476 				     R200_FP2_SOURCE_SEL_TRANS_UNIT |
1477 				     RADEON_FP2_DVO_EN |
1478 				     R200_FP2_DVO_RATE_SEL_SDR));
1479 
1480 	WREG32(RADEON_DISP_OUTPUT_CNTL, (RADEON_DISP_DAC_SOURCE_RMX |
1481 					 RADEON_DISP_TRANS_MATRIX_GRAPHICS));
1482 
1483 	WREG32(RADEON_CRTC2_GEN_CNTL, (RADEON_CRTC2_EN |
1484 				       RADEON_CRTC2_DISP_REQ_EN_B));
1485 
1486 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000);
1487 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0);
1488 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000);
1489 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0);
1490 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000);
1491 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0);
1492 
1493 	WREG32(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008);
1494 	WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800);
1495 	WREG32(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001);
1496 	WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080);
1497 
1498 	for (i = 0; i < 200; i++) {
1499 		tmp = RREG32(RADEON_GPIO_MONID);
1500 		if (tmp & RADEON_GPIO_Y_0)
1501 			found = true;
1502 
1503 		if (found)
1504 			break;
1505 
1506 		if (!drm_can_sleep())
1507 			mdelay(1);
1508 		else
1509 			msleep(1);
1510 	}
1511 
1512 	/* restore the regs we used */
1513 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, disp_lin_trans_grph_a);
1514 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, disp_lin_trans_grph_b);
1515 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, disp_lin_trans_grph_c);
1516 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, disp_lin_trans_grph_d);
1517 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, disp_lin_trans_grph_e);
1518 	WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, disp_lin_trans_grph_f);
1519 	WREG32(RADEON_CRTC2_H_TOTAL_DISP, crtc2_h_total_disp);
1520 	WREG32(RADEON_CRTC2_V_TOTAL_DISP, crtc2_v_total_disp);
1521 	WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, crtc2_h_sync_strt_wid);
1522 	WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, crtc2_v_sync_strt_wid);
1523 	WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1524 	WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
1525 	WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
1526 	WREG32(RADEON_GPIO_MONID, gpio_monid);
1527 
1528 	return found;
1529 }
1530 
1531 static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder *encoder,
1532 							     struct drm_connector *connector)
1533 {
1534 	struct drm_device *dev = encoder->dev;
1535 	struct radeon_device *rdev = dev->dev_private;
1536 	uint32_t crtc2_gen_cntl = 0, tv_dac_cntl, dac_cntl2, dac_ext_cntl;
1537 	uint32_t gpiopad_a = 0, pixclks_cntl, tmp;
1538 	uint32_t disp_output_cntl = 0, disp_hw_debug = 0, crtc_ext_cntl = 0;
1539 	enum drm_connector_status found = connector_status_disconnected;
1540 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1541 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
1542 	bool color = true;
1543 	struct drm_crtc *crtc;
1544 
1545 	/* find out if crtc2 is in use or if this encoder is using it */
1546 	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1547 		struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1548 		if ((radeon_crtc->crtc_id == 1) && crtc->enabled) {
1549 			if (encoder->crtc != crtc) {
1550 				return connector_status_disconnected;
1551 			}
1552 		}
1553 	}
1554 
1555 	if (connector->connector_type == DRM_MODE_CONNECTOR_SVIDEO ||
1556 	    connector->connector_type == DRM_MODE_CONNECTOR_Composite ||
1557 	    connector->connector_type == DRM_MODE_CONNECTOR_9PinDIN) {
1558 		bool tv_detect;
1559 
1560 		if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT))
1561 			return connector_status_disconnected;
1562 
1563 		tv_detect = radeon_legacy_tv_detect(encoder, connector);
1564 		if (tv_detect && tv_dac)
1565 			found = connector_status_connected;
1566 		return found;
1567 	}
1568 
1569 	/* don't probe if the encoder is being used for something else not CRT related */
1570 	if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_CRT_SUPPORT)) {
1571 		DRM_INFO("not detecting due to %08x\n", radeon_encoder->active_device);
1572 		return connector_status_disconnected;
1573 	}
1574 
1575 	/* R200 uses an external DAC for secondary DAC */
1576 	if (rdev->family == CHIP_R200) {
1577 		if (radeon_legacy_ext_dac_detect(encoder, connector))
1578 			found = connector_status_connected;
1579 		return found;
1580 	}
1581 
1582 	/* save the regs we need */
1583 	pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
1584 
1585 	if (rdev->flags & RADEON_SINGLE_CRTC) {
1586 		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
1587 	} else {
1588 		if (ASIC_IS_R300(rdev)) {
1589 			gpiopad_a = RREG32(RADEON_GPIOPAD_A);
1590 			disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
1591 		} else {
1592 			disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
1593 		}
1594 		crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
1595 	}
1596 	tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1597 	dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL);
1598 	dac_cntl2 = RREG32(RADEON_DAC_CNTL2);
1599 
1600 	tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb
1601 			       | RADEON_PIX2CLK_DAC_ALWAYS_ONb);
1602 	WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
1603 
1604 	if (rdev->flags & RADEON_SINGLE_CRTC) {
1605 		tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON;
1606 		WREG32(RADEON_CRTC_EXT_CNTL, tmp);
1607 	} else {
1608 		tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK;
1609 		tmp |= RADEON_CRTC2_CRT2_ON |
1610 			(2 << RADEON_CRTC2_PIX_WIDTH_SHIFT);
1611 		WREG32(RADEON_CRTC2_GEN_CNTL, tmp);
1612 
1613 		if (ASIC_IS_R300(rdev)) {
1614 			WREG32_P(RADEON_GPIOPAD_A, 1, ~1);
1615 			tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK;
1616 			tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2;
1617 			WREG32(RADEON_DISP_OUTPUT_CNTL, tmp);
1618 		} else {
1619 			tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL;
1620 			WREG32(RADEON_DISP_HW_DEBUG, tmp);
1621 		}
1622 	}
1623 
1624 	tmp = RADEON_TV_DAC_NBLANK |
1625 		RADEON_TV_DAC_NHOLD |
1626 		RADEON_TV_MONITOR_DETECT_EN |
1627 		RADEON_TV_DAC_STD_PS2;
1628 
1629 	WREG32(RADEON_TV_DAC_CNTL, tmp);
1630 
1631 	tmp = RADEON_DAC2_FORCE_BLANK_OFF_EN |
1632 		RADEON_DAC2_FORCE_DATA_EN;
1633 
1634 	if (color)
1635 		tmp |= RADEON_DAC_FORCE_DATA_SEL_RGB;
1636 	else
1637 		tmp |= RADEON_DAC_FORCE_DATA_SEL_G;
1638 
1639 	if (ASIC_IS_R300(rdev))
1640 		tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT);
1641 	else
1642 		tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT);
1643 
1644 	WREG32(RADEON_DAC_EXT_CNTL, tmp);
1645 
1646 	tmp = dac_cntl2 | RADEON_DAC2_DAC2_CLK_SEL | RADEON_DAC2_CMP_EN;
1647 	WREG32(RADEON_DAC_CNTL2, tmp);
1648 
1649 	mdelay(10);
1650 
1651 	if (ASIC_IS_R300(rdev)) {
1652 		if (RREG32(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUT_B)
1653 			found = connector_status_connected;
1654 	} else {
1655 		if (RREG32(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUTPUT)
1656 			found = connector_status_connected;
1657 	}
1658 
1659 	/* restore regs we used */
1660 	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1661 	WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl);
1662 	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1663 
1664 	if (rdev->flags & RADEON_SINGLE_CRTC) {
1665 		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
1666 	} else {
1667 		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1668 		if (ASIC_IS_R300(rdev)) {
1669 			WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
1670 			WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
1671 		} else {
1672 			WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
1673 		}
1674 	}
1675 
1676 	WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1677 
1678 	return found;
1679 
1680 }
1681 
1682 static const struct drm_encoder_helper_funcs radeon_legacy_tv_dac_helper_funcs = {
1683 	.dpms = radeon_legacy_tv_dac_dpms,
1684 	.mode_fixup = radeon_legacy_mode_fixup,
1685 	.prepare = radeon_legacy_tv_dac_prepare,
1686 	.mode_set = radeon_legacy_tv_dac_mode_set,
1687 	.commit = radeon_legacy_tv_dac_commit,
1688 	.detect = radeon_legacy_tv_dac_detect,
1689 	.disable = radeon_legacy_encoder_disable,
1690 };
1691 
1692 
1693 static const struct drm_encoder_funcs radeon_legacy_tv_dac_enc_funcs = {
1694 	.destroy = radeon_enc_destroy,
1695 };
1696 
1697 
1698 static struct radeon_encoder_int_tmds *radeon_legacy_get_tmds_info(struct radeon_encoder *encoder)
1699 {
1700 	struct drm_device *dev = encoder->base.dev;
1701 	struct radeon_device *rdev = dev->dev_private;
1702 	struct radeon_encoder_int_tmds *tmds = NULL;
1703 	bool ret;
1704 
1705 	tmds = kzalloc(sizeof(struct radeon_encoder_int_tmds), GFP_KERNEL);
1706 
1707 	if (!tmds)
1708 		return NULL;
1709 
1710 	if (rdev->is_atom_bios)
1711 		ret = radeon_atombios_get_tmds_info(encoder, tmds);
1712 	else
1713 		ret = radeon_legacy_get_tmds_info_from_combios(encoder, tmds);
1714 
1715 	if (!ret)
1716 		radeon_legacy_get_tmds_info_from_table(encoder, tmds);
1717 
1718 	return tmds;
1719 }
1720 
1721 static struct radeon_encoder_ext_tmds *radeon_legacy_get_ext_tmds_info(struct radeon_encoder *encoder)
1722 {
1723 	struct drm_device *dev = encoder->base.dev;
1724 	struct radeon_device *rdev = dev->dev_private;
1725 	struct radeon_encoder_ext_tmds *tmds = NULL;
1726 	bool ret;
1727 
1728 	if (rdev->is_atom_bios)
1729 		return NULL;
1730 
1731 	tmds = kzalloc(sizeof(struct radeon_encoder_ext_tmds), GFP_KERNEL);
1732 
1733 	if (!tmds)
1734 		return NULL;
1735 
1736 	ret = radeon_legacy_get_ext_tmds_info_from_combios(encoder, tmds);
1737 
1738 	if (!ret)
1739 		radeon_legacy_get_ext_tmds_info_from_table(encoder, tmds);
1740 
1741 	return tmds;
1742 }
1743 
1744 void
1745 radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t supported_device)
1746 {
1747 	struct radeon_device *rdev = dev->dev_private;
1748 	struct drm_encoder *encoder;
1749 	struct radeon_encoder *radeon_encoder;
1750 
1751 	/* see if we already added it */
1752 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1753 		radeon_encoder = to_radeon_encoder(encoder);
1754 		if (radeon_encoder->encoder_enum == encoder_enum) {
1755 			radeon_encoder->devices |= supported_device;
1756 			return;
1757 		}
1758 
1759 	}
1760 
1761 	/* add a new one */
1762 	radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
1763 	if (!radeon_encoder)
1764 		return;
1765 
1766 	encoder = &radeon_encoder->base;
1767 	if (rdev->flags & RADEON_SINGLE_CRTC)
1768 		encoder->possible_crtcs = 0x1;
1769 	else
1770 		encoder->possible_crtcs = 0x3;
1771 
1772 	radeon_encoder->enc_priv = NULL;
1773 
1774 	radeon_encoder->encoder_enum = encoder_enum;
1775 	radeon_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1776 	radeon_encoder->devices = supported_device;
1777 	radeon_encoder->rmx_type = RMX_OFF;
1778 
1779 	switch (radeon_encoder->encoder_id) {
1780 	case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1781 		encoder->possible_crtcs = 0x1;
1782 		drm_encoder_init(dev, encoder, &radeon_legacy_lvds_enc_funcs,
1783 				 DRM_MODE_ENCODER_LVDS, NULL);
1784 		drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs);
1785 		if (rdev->is_atom_bios)
1786 			radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
1787 		else
1788 			radeon_encoder->enc_priv = radeon_combios_get_lvds_info(radeon_encoder);
1789 		radeon_encoder->rmx_type = RMX_FULL;
1790 		break;
1791 	case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1792 		drm_encoder_init(dev, encoder, &radeon_legacy_tmds_int_enc_funcs,
1793 				 DRM_MODE_ENCODER_TMDS, NULL);
1794 		drm_encoder_helper_add(encoder, &radeon_legacy_tmds_int_helper_funcs);
1795 		radeon_encoder->enc_priv = radeon_legacy_get_tmds_info(radeon_encoder);
1796 		break;
1797 	case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1798 		drm_encoder_init(dev, encoder, &radeon_legacy_primary_dac_enc_funcs,
1799 				 DRM_MODE_ENCODER_DAC, NULL);
1800 		drm_encoder_helper_add(encoder, &radeon_legacy_primary_dac_helper_funcs);
1801 		if (rdev->is_atom_bios)
1802 			radeon_encoder->enc_priv = radeon_atombios_get_primary_dac_info(radeon_encoder);
1803 		else
1804 			radeon_encoder->enc_priv = radeon_combios_get_primary_dac_info(radeon_encoder);
1805 		break;
1806 	case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1807 		drm_encoder_init(dev, encoder, &radeon_legacy_tv_dac_enc_funcs,
1808 				 DRM_MODE_ENCODER_TVDAC, NULL);
1809 		drm_encoder_helper_add(encoder, &radeon_legacy_tv_dac_helper_funcs);
1810 		if (rdev->is_atom_bios)
1811 			radeon_encoder->enc_priv = radeon_atombios_get_tv_dac_info(radeon_encoder);
1812 		else
1813 			radeon_encoder->enc_priv = radeon_combios_get_tv_dac_info(radeon_encoder);
1814 		break;
1815 	case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1816 		drm_encoder_init(dev, encoder, &radeon_legacy_tmds_ext_enc_funcs,
1817 				 DRM_MODE_ENCODER_TMDS, NULL);
1818 		drm_encoder_helper_add(encoder, &radeon_legacy_tmds_ext_helper_funcs);
1819 		if (!rdev->is_atom_bios)
1820 			radeon_encoder->enc_priv = radeon_legacy_get_ext_tmds_info(radeon_encoder);
1821 		break;
1822 	}
1823 }
1824