From: Dave Airlie airl...@redhat.com
This adds:
coherent mode: TMDS coherent mode for atom cards.
scaling mode: LVDS scaler mode
load detect: DAC load detection, DVI-I, VGA, TV
tmds pll: legacy TMDS pll selection
tv standard: TV standard selection.
TODO: other TV ones? dvi subconnector selection using std prop
Signed-off-by: Dave Airlie airl...@redhat.com
---
drivers/gpu/drm/radeon/radeon_atombios.c| 15 +-
drivers/gpu/drm/radeon/radeon_combios.c | 48 +++--
drivers/gpu/drm/radeon/radeon_connectors.c | 241 ---
drivers/gpu/drm/radeon/radeon_display.c | 81
drivers/gpu/drm/radeon/radeon_encoders.c| 10 +-
drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 29 +++-
drivers/gpu/drm/radeon/radeon_mode.h| 20 ++-
7 files changed, 379 insertions(+), 65 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c
b/drivers/gpu/drm/radeon/radeon_atombios.c
index a8fb392..aeebae1 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -702,9 +702,8 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
return false;
}
-struct radeon_encoder_int_tmds *radeon_atombios_get_tmds_info(struct
- radeon_encoder
- *encoder)
+bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
+ struct radeon_encoder_int_tmds *tmds)
{
struct drm_device *dev = encoder-base.dev;
struct radeon_device *rdev = dev-dev_private;
@@ -715,7 +714,6 @@ struct radeon_encoder_int_tmds
*radeon_atombios_get_tmds_info(struct
uint8_t frev, crev;
uint16_t maxfreq;
int i;
- struct radeon_encoder_int_tmds *tmds = NULL;
atom_parse_data_header(mode_info-atom_context, index, NULL, frev,
crev, data_offset);
@@ -725,12 +723,6 @@ struct radeon_encoder_int_tmds
*radeon_atombios_get_tmds_info(struct
data_offset);
if (tmds_info) {
- tmds =
- kzalloc(sizeof(struct radeon_encoder_int_tmds), GFP_KERNEL);
-
- if (!tmds)
- return NULL;
-
maxfreq = le16_to_cpu(tmds_info-usMaxFrequency);
for (i = 0; i 4; i++) {
tmds-tmds_pll[i].freq =
@@ -756,8 +748,9 @@ struct radeon_encoder_int_tmds
*radeon_atombios_get_tmds_info(struct
break;
}
}
+ return true;
}
- return tmds;
+ return false;
}
union lvds_info {
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c
b/drivers/gpu/drm/radeon/radeon_combios.c
index 2a027e0..e2ad8f7 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -994,48 +994,37 @@ static const struct radeon_tmds_pll
default_tmds_pll[CHIP_LAST][4] = {
{{15000, 0xb0155}, {0x, 0xb01cb}, {0, 0}, {0, 0}}, /*
CHIP_RS480 */
};
-static struct radeon_encoder_int_tmds
-*radeon_legacy_get_tmds_info_from_table(struct radeon_device *rdev)
+bool radeon_legacy_get_tmds_info_from_table(struct radeon_encoder *encoder,
+ struct radeon_encoder_int_tmds
*tmds)
{
+ struct drm_device *dev = encoder-base.dev;
+ struct radeon_device *rdev = dev-dev_private;
int i;
- struct radeon_encoder_int_tmds *tmds = NULL;
-
- tmds = kzalloc(sizeof(struct radeon_encoder_int_tmds), GFP_KERNEL);
-
- if (!tmds)
- return NULL;
for (i = 0; i 4; i++) {
tmds-tmds_pll[i].value =
- default_tmds_pll[rdev-family][i].value;
+ default_tmds_pll[rdev-family][i].value;
tmds-tmds_pll[i].freq = default_tmds_pll[rdev-family][i].freq;
}
- return tmds;
+ return true;
}
-struct radeon_encoder_int_tmds *radeon_combios_get_tmds_info(struct
-radeon_encoder
-*encoder)
+bool radeon_legacy_get_tmds_info_from_combios(struct radeon_encoder *encoder,
+ struct radeon_encoder_int_tmds
*tmds)
{
struct drm_device *dev = encoder-base.dev;
struct radeon_device *rdev = dev-dev_private;
uint16_t tmds_info;
int i, n;
uint8_t ver;
- struct radeon_encoder_int_tmds *tmds = NULL;
if (rdev-bios == NULL)
- return radeon_legacy_get_tmds_info_from_table(rdev);
-
+ return false;
+
tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);
if (tmds_info) {
- tmds =
-