cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

radeon_legacy_encoders.c (57038B)


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