root/drivers/gpu/drm/radeon/radeon_legacy_encoders.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. radeon_legacy_encoder_disable
  2. radeon_legacy_lvds_update
  3. radeon_legacy_lvds_dpms
  4. radeon_legacy_lvds_prepare
  5. radeon_legacy_lvds_commit
  6. radeon_legacy_lvds_mode_set
  7. radeon_legacy_mode_fixup
  8. radeon_legacy_get_backlight_level
  9. radeon_legacy_set_backlight_level
  10. radeon_legacy_lvds_level
  11. radeon_legacy_backlight_update_status
  12. radeon_legacy_backlight_get_brightness
  13. radeon_legacy_backlight_init
  14. radeon_legacy_backlight_exit
  15. radeon_legacy_backlight_init
  16. radeon_legacy_backlight_exit
  17. radeon_lvds_enc_destroy
  18. radeon_legacy_primary_dac_dpms
  19. radeon_legacy_primary_dac_prepare
  20. radeon_legacy_primary_dac_commit
  21. radeon_legacy_primary_dac_mode_set
  22. radeon_legacy_primary_dac_detect
  23. radeon_legacy_tmds_int_dpms
  24. radeon_legacy_tmds_int_prepare
  25. radeon_legacy_tmds_int_commit
  26. radeon_legacy_tmds_int_mode_set
  27. radeon_legacy_tmds_ext_dpms
  28. radeon_legacy_tmds_ext_prepare
  29. radeon_legacy_tmds_ext_commit
  30. radeon_legacy_tmds_ext_mode_set
  31. radeon_ext_tmds_enc_destroy
  32. radeon_legacy_tv_dac_dpms
  33. radeon_legacy_tv_dac_prepare
  34. radeon_legacy_tv_dac_commit
  35. radeon_legacy_tv_dac_mode_set
  36. r300_legacy_tv_detect
  37. radeon_legacy_tv_detect
  38. radeon_legacy_ext_dac_detect
  39. radeon_legacy_tv_dac_detect
  40. radeon_legacy_get_tmds_info
  41. radeon_legacy_get_ext_tmds_info
  42. radeon_add_legacy_encoder

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

/* [<][>][^][v][top][bottom][index][help] */