150477Speter/*
235388Smjacob * Copyright 2007-8 Advanced Micro Devices, Inc.
339235Sgibbs * Copyright 2008 Red Hat Inc.
435388Smjacob *
535388Smjacob * Permission is hereby granted, free of charge, to any person obtaining a
673319Smjacob * copy of this software and associated documentation files (the "Software"),
766189Smjacob * to deal in the Software without restriction, including without limitation
835388Smjacob * the rights to use, copy, modify, merge, publish, distribute, sublicense,
935388Smjacob * and/or sell copies of the Software, and to permit persons to whom the
1035388Smjacob * Software is furnished to do so, subject to the following conditions:
1135388Smjacob *
1235388Smjacob * The above copyright notice and this permission notice shall be included in
1335388Smjacob * all copies or substantial portions of the Software.
1435388Smjacob *
1535388Smjacob * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1666189Smjacob * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1735388Smjacob * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1835388Smjacob * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1935388Smjacob * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
2035388Smjacob * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2135388Smjacob * OTHER DEALINGS IN THE SOFTWARE.
2235388Smjacob *
2335388Smjacob * Authors: Dave Airlie
2435388Smjacob *          Alex Deucher
2535388Smjacob */
2635388Smjacob
2735388Smjacob#include <linux/pci.h>
2835388Smjacob
2935388Smjacob#include <drm/drm_edid.h>
3035388Smjacob#include <drm/drm_device.h>
3135388Smjacob#include <drm/radeon_drm.h>
3235388Smjacob
3335388Smjacob#include <acpi/video.h>
3435388Smjacob
3535388Smjacob#include "radeon.h"
3635388Smjacob#include "radeon_atombios.h"
3735388Smjacob#include "radeon_legacy_encoders.h"
3835388Smjacob#include "atom.h"
3935388Smjacob
4035388Smjacobstatic uint32_t radeon_encoder_clones(struct drm_encoder *encoder)
4135388Smjacob{
4235388Smjacob	struct drm_device *dev = encoder->dev;
4335388Smjacob	struct radeon_device *rdev = dev->dev_private;
4435388Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
4535388Smjacob	struct drm_encoder *clone_encoder;
4635388Smjacob	uint32_t index_mask = 0;
4735388Smjacob	int count;
4844819Smjacob
4944819Smjacob	/* DIG routing gets problematic */
5044819Smjacob	if (rdev->family >= CHIP_R600)
5135388Smjacob		return index_mask;
5242131Smjacob	/* LVDS/TV are too wacky */
5335388Smjacob	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
5464095Smjacob		return index_mask;
5564095Smjacob	/* DVO requires 2x ppll clocks depending on tmds chip */
5664095Smjacob	if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT)
5735388Smjacob		return index_mask;
5835388Smjacob
5935388Smjacob	count = -1;
6035388Smjacob	list_for_each_entry(clone_encoder, &dev->mode_config.encoder_list, head) {
6135388Smjacob		struct radeon_encoder *radeon_clone = to_radeon_encoder(clone_encoder);
6235388Smjacob
6335388Smjacob		count++;
6435388Smjacob
6539235Sgibbs		if (clone_encoder == encoder)
6635388Smjacob			continue;
6770489Smjacob		if (radeon_clone->devices & (ATOM_DEVICE_LCD_SUPPORT))
6864095Smjacob			continue;
6970489Smjacob		if (radeon_clone->devices & ATOM_DEVICE_DFP2_SUPPORT)
7064095Smjacob			continue;
7179234Smjacob		else
7264095Smjacob			index_mask |= (1 << count);
7370489Smjacob	}
7464095Smjacob	return index_mask;
7570489Smjacob}
7664095Smjacob
7770489Smjacobvoid radeon_setup_encoder_clones(struct drm_device *dev)
7864095Smjacob{
7970489Smjacob	struct drm_encoder *encoder;
8064095Smjacob
8170489Smjacob	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
8264095Smjacob		encoder->possible_clones = radeon_encoder_clones(encoder);
8370489Smjacob	}
8464095Smjacob}
8570489Smjacob
8664095Smjacobuint32_t
8770489Smjacobradeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device, uint8_t dac)
8869523Smjacob{
8970489Smjacob	struct radeon_device *rdev = dev->dev_private;
9064095Smjacob	uint32_t ret = 0;
9170489Smjacob
9264095Smjacob	switch (supported_device) {
9370489Smjacob	case ATOM_DEVICE_CRT1_SUPPORT:
9464095Smjacob	case ATOM_DEVICE_TV1_SUPPORT:
9570489Smjacob	case ATOM_DEVICE_TV2_SUPPORT:
9664095Smjacob	case ATOM_DEVICE_CRT2_SUPPORT:
9770489Smjacob	case ATOM_DEVICE_CV_SUPPORT:
9864095Smjacob		switch (dac) {
9970489Smjacob		case 1: /* dac a */
10072346Smjacob			if ((rdev->family == CHIP_RS300) ||
10181988Smjacob			    (rdev->family == CHIP_RS400) ||
10281988Smjacob			    (rdev->family == CHIP_RS480))
10381988Smjacob				ret = ENCODER_INTERNAL_DAC2_ENUM_ID1;
10481988Smjacob			else if (ASIC_IS_AVIVO(rdev))
10581988Smjacob				ret = ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1;
10681988Smjacob			else
10781988Smjacob				ret = ENCODER_INTERNAL_DAC1_ENUM_ID1;
10881988Smjacob			break;
10939235Sgibbs		case 2: /* dac b */
11039235Sgibbs			if (ASIC_IS_AVIVO(rdev))
11139235Sgibbs				ret = ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1;
11241524Smjacob			else {
11339235Sgibbs				/* if (rdev->family == CHIP_R200)
11453490Smjacob				 * ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
11535388Smjacob				 * else
11664095Smjacob				 */
11773319Smjacob				ret = ENCODER_INTERNAL_DAC2_ENUM_ID1;
11846971Smjacob			}
11946971Smjacob			break;
12035388Smjacob		case 3: /* external dac */
12144819Smjacob			if (ASIC_IS_AVIVO(rdev))
12272346Smjacob				ret = ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1;
12344819Smjacob			else
12448486Smjacob				ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
12545040Smjacob			break;
12664095Smjacob		}
12772346Smjacob		break;
12872346Smjacob	case ATOM_DEVICE_LCD1_SUPPORT:
12948486Smjacob		if (ASIC_IS_AVIVO(rdev))
13070821Smjacob			ret = ENCODER_INTERNAL_LVTM1_ENUM_ID1;
13135388Smjacob		else
13264095Smjacob			ret = ENCODER_INTERNAL_LVDS_ENUM_ID1;
13335388Smjacob		break;
13446971Smjacob	case ATOM_DEVICE_DFP1_SUPPORT:
13546971Smjacob		if ((rdev->family == CHIP_RS300) ||
13646971Smjacob		    (rdev->family == CHIP_RS400) ||
13739235Sgibbs		    (rdev->family == CHIP_RS480))
13839235Sgibbs			ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
13957146Smjacob		else if (ASIC_IS_AVIVO(rdev))
14057146Smjacob			ret = ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1;
14157146Smjacob		else
14257146Smjacob			ret = ENCODER_INTERNAL_TMDS1_ENUM_ID1;
14339235Sgibbs		break;
14435388Smjacob	case ATOM_DEVICE_LCD2_SUPPORT:
14535388Smjacob	case ATOM_DEVICE_DFP2_SUPPORT:
14639235Sgibbs		if ((rdev->family == CHIP_RS600) ||
14752682Smjacob		    (rdev->family == CHIP_RS690) ||
14839235Sgibbs		    (rdev->family == CHIP_RS740))
14939235Sgibbs			ret = ENCODER_INTERNAL_DDI_ENUM_ID1;
15035388Smjacob		else if (ASIC_IS_AVIVO(rdev))
15182689Smjacob			ret = ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1;
15235388Smjacob		else
15374229Smjacob			ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
15435388Smjacob		break;
15535388Smjacob	case ATOM_DEVICE_DFP3_SUPPORT:
15682689Smjacob		ret = ENCODER_INTERNAL_LVTM1_ENUM_ID1;
15761776Smjacob		break;
15882689Smjacob	}
15935388Smjacob
16035388Smjacob	return ret;
16135388Smjacob}
16235388Smjacob
16339235Sgibbsstatic void radeon_encoder_add_backlight(struct radeon_encoder *radeon_encoder,
16439235Sgibbs					 struct drm_connector *connector)
16582689Smjacob{
16682689Smjacob	struct drm_device *dev = radeon_encoder->base.dev;
16764095Smjacob	struct radeon_device *rdev = dev->dev_private;
16843789Smjacob	bool use_bl = false;
16964095Smjacob
17043789Smjacob	if (!(radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)))
17143789Smjacob		return;
17243789Smjacob
17343420Smjacob	if (radeon_backlight == 0) {
17443420Smjacob		use_bl = false;
17543420Smjacob	} else if (radeon_backlight == 1) {
17643420Smjacob		use_bl = true;
17743420Smjacob	} else if (radeon_backlight == -1) {
17843420Smjacob		/* Quirks */
17943420Smjacob		/* Amilo Xi 2550 only works with acpi bl */
18061776Smjacob		if ((rdev->pdev->device == 0x9583) &&
18143420Smjacob		    (rdev->pdev->subsystem_vendor == 0x1734) &&
18264095Smjacob		    (rdev->pdev->subsystem_device == 0x1107))
18364095Smjacob			use_bl = false;
18482842Smjacob/* Older PPC macs use on-GPU backlight controller */
18582842Smjacob#ifndef CONFIG_PPC_PMAC
18682842Smjacob		/* disable native backlight control on older asics */
18782842Smjacob		else if (rdev->family < CHIP_R600)
18882842Smjacob			use_bl = false;
18982842Smjacob#endif
19082842Smjacob		else
19143420Smjacob			use_bl = true;
19264095Smjacob	}
19364095Smjacob
19464095Smjacob	if (use_bl) {
19564095Smjacob		if (rdev->is_atom_bios)
19664095Smjacob			radeon_atom_backlight_init(radeon_encoder, connector);
19764095Smjacob		else
19864095Smjacob			radeon_legacy_backlight_init(radeon_encoder, connector);
19964095Smjacob	}
20082842Smjacob
20164095Smjacob	/*
20264095Smjacob	 * If there is no native backlight device (which may happen even when
20364095Smjacob	 * use_bl==true) try registering an ACPI video backlight device instead.
20464095Smjacob	 */
20564095Smjacob	if (!rdev->mode_info.bl_encoder)
20642462Smjacob		acpi_video_register_backlight();
20753490Smjacob}
20842462Smjacob
20942462Smjacobvoid
21045287Smjacobradeon_link_encoder_connector(struct drm_device *dev)
21182842Smjacob{
21282689Smjacob	struct drm_connector *connector;
21382689Smjacob	struct radeon_connector *radeon_connector;
21482689Smjacob	struct drm_encoder *encoder;
21582689Smjacob	struct radeon_encoder *radeon_encoder;
21684149Smjacob
21784149Smjacob	/* walk the list and link encoders to connectors */
21884149Smjacob	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
21984149Smjacob		radeon_connector = to_radeon_connector(connector);
22084149Smjacob		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
22184149Smjacob			radeon_encoder = to_radeon_encoder(encoder);
22284149Smjacob			if (radeon_encoder->devices & radeon_connector->devices) {
22384149Smjacob				drm_connector_attach_encoder(connector, encoder);
22484149Smjacob				if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
22584149Smjacob					radeon_encoder_add_backlight(radeon_encoder, connector);
22684149Smjacob			}
22745287Smjacob		}
22843420Smjacob	}
22971074Smjacob}
23071074Smjacob
23143420Smjacobvoid radeon_encoder_set_active_device(struct drm_encoder *encoder)
23243420Smjacob{
23343420Smjacob	struct drm_device *dev = encoder->dev;
23448486Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
23548486Smjacob	struct drm_connector *connector;
23648486Smjacob
23782689Smjacob	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
23848486Smjacob		if (connector->encoder == encoder) {
23948486Smjacob			struct radeon_connector *radeon_connector = to_radeon_connector(connector);
24082689Smjacob
24148486Smjacob			radeon_encoder->active_device = radeon_encoder->devices & radeon_connector->devices;
24277365Smjacob			DRM_DEBUG_KMS("setting active device to %08x from %08x %08x for encoder %d\n",
24382689Smjacob				  radeon_encoder->active_device, radeon_encoder->devices,
24477365Smjacob				  radeon_connector->devices, encoder->encoder_type);
24548486Smjacob		}
24648486Smjacob	}
24748486Smjacob}
24871074Smjacob
24971074Smjacobstruct drm_connector *
25071074Smjacobradeon_get_connector_for_encoder(struct drm_encoder *encoder)
25171074Smjacob{
25271074Smjacob	struct drm_device *dev = encoder->dev;
25371074Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
25471074Smjacob	struct drm_connector *connector;
25571074Smjacob	struct radeon_connector *radeon_connector;
25654671Smjacob
25754671Smjacob	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
25882689Smjacob		radeon_connector = to_radeon_connector(connector);
25946971Smjacob		if (radeon_encoder->active_device & radeon_connector->devices)
26054671Smjacob			return connector;
26154671Smjacob	}
26254671Smjacob	return NULL;
26354671Smjacob}
26454671Smjacob
26554671Smjacobstruct drm_connector *
26654671Smjacobradeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
26770489Smjacob{
26845040Smjacob	struct drm_device *dev = encoder->dev;
26944819Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
27054671Smjacob	struct drm_connector *connector;
27154671Smjacob	struct radeon_connector *radeon_connector;
27254671Smjacob
27357146Smjacob	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
27482689Smjacob		radeon_connector = to_radeon_connector(connector);
27557146Smjacob		if (radeon_encoder->devices & radeon_connector->devices)
27682689Smjacob			return connector;
27757146Smjacob	}
27882689Smjacob	return NULL;
27957146Smjacob}
28082689Smjacob
28157146Smjacobstruct drm_encoder *radeon_get_external_encoder(struct drm_encoder *encoder)
28245040Smjacob{
28345040Smjacob	struct drm_device *dev = encoder->dev;
28445040Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
28545040Smjacob	struct drm_encoder *other_encoder;
28664095Smjacob	struct radeon_encoder *other_radeon_encoder;
28745040Smjacob
28845040Smjacob	if (radeon_encoder->is_ext_encoder)
28945040Smjacob		return NULL;
29064095Smjacob
29145040Smjacob	list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
29245040Smjacob		if (other_encoder == encoder)
29345040Smjacob			continue;
29464095Smjacob		other_radeon_encoder = to_radeon_encoder(other_encoder);
29545040Smjacob		if (other_radeon_encoder->is_ext_encoder &&
29645040Smjacob		    (radeon_encoder->devices & other_radeon_encoder->devices))
29764095Smjacob			return other_encoder;
29864095Smjacob	}
29945040Smjacob	return NULL;
30045040Smjacob}
30154671Smjacob
30257146Smjacobu16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder)
30354671Smjacob{
30454671Smjacob	struct drm_encoder *other_encoder = radeon_get_external_encoder(encoder);
30554671Smjacob
30654671Smjacob	if (other_encoder) {
30754671Smjacob		struct radeon_encoder *radeon_encoder = to_radeon_encoder(other_encoder);
30854671Smjacob
30964095Smjacob		switch (radeon_encoder->encoder_id) {
31054671Smjacob		case ENCODER_OBJECT_ID_TRAVIS:
31154671Smjacob		case ENCODER_OBJECT_ID_NUTMEG:
31254671Smjacob			return radeon_encoder->encoder_id;
31364095Smjacob		default:
31464095Smjacob			return ENCODER_OBJECT_ID_NONE;
31554671Smjacob		}
31654671Smjacob	}
31754671Smjacob	return ENCODER_OBJECT_ID_NONE;
31864095Smjacob}
31964095Smjacob
32054671Smjacobvoid radeon_panel_mode_fixup(struct drm_encoder *encoder,
32154671Smjacob			     struct drm_display_mode *adjusted_mode)
32264095Smjacob{
32364095Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
32454671Smjacob	struct drm_device *dev = encoder->dev;
32554671Smjacob	struct radeon_device *rdev = dev->dev_private;
32654671Smjacob	struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
32735388Smjacob	unsigned int hblank = native_mode->htotal - native_mode->hdisplay;
32839235Sgibbs	unsigned int vblank = native_mode->vtotal - native_mode->vdisplay;
32942462Smjacob	unsigned int hover = native_mode->hsync_start - native_mode->hdisplay;
33042462Smjacob	unsigned int vover = native_mode->vsync_start - native_mode->vdisplay;
33135388Smjacob	unsigned int hsync_width = native_mode->hsync_end - native_mode->hsync_start;
33264095Smjacob	unsigned int vsync_width = native_mode->vsync_end - native_mode->vsync_start;
33339235Sgibbs
33439235Sgibbs	adjusted_mode->clock = native_mode->clock;
33582689Smjacob	adjusted_mode->flags = native_mode->flags;
33635388Smjacob
33746971Smjacob	if (ASIC_IS_AVIVO(rdev)) {
33835388Smjacob		adjusted_mode->hdisplay = native_mode->hdisplay;
33935388Smjacob		adjusted_mode->vdisplay = native_mode->vdisplay;
34039235Sgibbs	}
34139235Sgibbs
34239235Sgibbs	adjusted_mode->htotal = native_mode->hdisplay + hblank;
34339235Sgibbs	adjusted_mode->hsync_start = native_mode->hdisplay + hover;
34439235Sgibbs	adjusted_mode->hsync_end = adjusted_mode->hsync_start + hsync_width;
34582689Smjacob
34639235Sgibbs	adjusted_mode->vtotal = native_mode->vdisplay + vblank;
34746971Smjacob	adjusted_mode->vsync_start = native_mode->vdisplay + vover;
34835388Smjacob	adjusted_mode->vsync_end = adjusted_mode->vsync_start + vsync_width;
34935388Smjacob
35082689Smjacob	drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
35139235Sgibbs
35246971Smjacob	if (ASIC_IS_AVIVO(rdev)) {
35339235Sgibbs		adjusted_mode->crtc_hdisplay = native_mode->hdisplay;
35439235Sgibbs		adjusted_mode->crtc_vdisplay = native_mode->vdisplay;
35582689Smjacob	}
35635388Smjacob
35746971Smjacob	adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + hblank;
35835388Smjacob	adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + hover;
35935388Smjacob	adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + hsync_width;
36082689Smjacob
36135388Smjacob	adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + vblank;
36246971Smjacob	adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + vover;
36335388Smjacob	adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + vsync_width;
36479234Smjacob
36582689Smjacob}
36645287Smjacob
36746971Smjacobbool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
36879234Smjacob				    u32 pixel_clock)
36935388Smjacob{
37039235Sgibbs	struct drm_device *dev = encoder->dev;
37143420Smjacob	struct radeon_device *rdev = dev->dev_private;
37243420Smjacob	struct drm_connector *connector;
37339235Sgibbs	struct radeon_connector *radeon_connector;
37443420Smjacob	struct radeon_connector_atom_dig *dig_connector;
37564095Smjacob
37643420Smjacob	connector = radeon_get_connector_for_encoder(encoder);
37742462Smjacob	/* if we don't have an active device yet, just use one of
37843420Smjacob	 * the connectors tied to the encoder.
37939235Sgibbs	 */
38043420Smjacob	if (!connector)
38143420Smjacob		connector = radeon_get_connector_for_encoder_init(encoder);
38243420Smjacob	radeon_connector = to_radeon_connector(connector);
38343420Smjacob
38443420Smjacob	switch (connector->connector_type) {
38543420Smjacob	case DRM_MODE_CONNECTOR_DVII:
38643420Smjacob	case DRM_MODE_CONNECTOR_HDMIB:
38764095Smjacob		if (radeon_connector->use_digital) {
38843420Smjacob			/* HDMI 1.3 supports up to 340 Mhz over single link */
38944819Smjacob			if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
39044819Smjacob				if (pixel_clock > 340000)
39144819Smjacob					return true;
39244819Smjacob				else
39346971Smjacob					return false;
39445040Smjacob			} else {
39543420Smjacob				if (pixel_clock > 165000)
39644819Smjacob					return true;
39744819Smjacob				else
39844819Smjacob					return false;
39943420Smjacob			}
40039235Sgibbs		} else
40139235Sgibbs			return false;
40239235Sgibbs	case DRM_MODE_CONNECTOR_DVID:
40339235Sgibbs	case DRM_MODE_CONNECTOR_HDMIA:
40439235Sgibbs	case DRM_MODE_CONNECTOR_DisplayPort:
40539235Sgibbs		dig_connector = radeon_connector->con_priv;
40646971Smjacob		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
40746971Smjacob		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
40839235Sgibbs			return false;
40939235Sgibbs		else {
41043420Smjacob			/* HDMI 1.3 supports up to 340 Mhz over single link */
41135388Smjacob			if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
41235388Smjacob				if (pixel_clock > 340000)
41335388Smjacob					return true;
41469523Smjacob				else
41569523Smjacob					return false;
41669523Smjacob			} else {
41769523Smjacob				if (pixel_clock > 165000)
41869523Smjacob					return true;
41935388Smjacob				else
42035388Smjacob					return false;
42135388Smjacob			}
42235388Smjacob		}
42343420Smjacob	default:
42439235Sgibbs		return false;
42535388Smjacob	}
42635388Smjacob}
42735388Smjacob
42835388Smjacobbool radeon_encoder_is_digital(struct drm_encoder *encoder)
42935388Smjacob{
43044819Smjacob	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
43135388Smjacob
43235388Smjacob	switch (radeon_encoder->encoder_id) {
43335388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_LVDS:
43435388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
43564095Smjacob	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
43635388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
43735388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_DVO1:
43835388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
43935388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_DDI:
44035388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
44145040Smjacob	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
44235388Smjacob	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
44345040Smjacob	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
44444819Smjacob	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
44544819Smjacob		return true;
44635388Smjacob	default:
44735388Smjacob		return false;
44835388Smjacob	}
44935388Smjacob}
45035388Smjacob