Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / drivers / gpu / drm / radeon / radeon_connectors.c
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 #include "drmP.h"
27 #include "drm_edid.h"
28 #include "drm_crtc_helper.h"
29 #include "drm_fb_helper.h"
30 #include "radeon_drm.h"
31 #include "radeon.h"
32 #include "atom.h"
33
34 extern void
35 radeon_combios_connected_scratch_regs(struct drm_connector *connector,
36                                       struct drm_encoder *encoder,
37                                       bool connected);
38 extern void
39 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
40                                        struct drm_encoder *encoder,
41                                        bool connected);
42
43 extern void
44 radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
45                              struct drm_connector *drm_connector);
46
47 void radeon_connector_hotplug(struct drm_connector *connector)
48 {
49         struct drm_device *dev = connector->dev;
50         struct radeon_device *rdev = dev->dev_private;
51         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
52
53         radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
54
55         /* powering up/down the eDP panel generates hpd events which
56          * can interfere with modesetting.
57          */
58         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
59                 return;
60
61         /* pre-r600 did not always have the hpd pins mapped accurately to connectors */
62         if (rdev->family >= CHIP_R600) {
63                 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
64                         drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
65                 else
66                         drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
67         }
68 }
69
70 static void radeon_property_change_mode(struct drm_encoder *encoder)
71 {
72         struct drm_crtc *crtc = encoder->crtc;
73
74         if (crtc && crtc->enabled) {
75                 drm_crtc_helper_set_mode(crtc, &crtc->mode,
76                                          crtc->x, crtc->y, crtc->fb);
77         }
78 }
79 static void
80 radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
81 {
82         struct drm_device *dev = connector->dev;
83         struct radeon_device *rdev = dev->dev_private;
84         struct drm_encoder *best_encoder = NULL;
85         struct drm_encoder *encoder = NULL;
86         struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
87         struct drm_mode_object *obj;
88         bool connected;
89         int i;
90
91         best_encoder = connector_funcs->best_encoder(connector);
92
93         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
94                 if (connector->encoder_ids[i] == 0)
95                         break;
96
97                 obj = drm_mode_object_find(connector->dev,
98                                            connector->encoder_ids[i],
99                                            DRM_MODE_OBJECT_ENCODER);
100                 if (!obj)
101                         continue;
102
103                 encoder = obj_to_encoder(obj);
104
105                 if ((encoder == best_encoder) && (status == connector_status_connected))
106                         connected = true;
107                 else
108                         connected = false;
109
110                 if (rdev->is_atom_bios)
111                         radeon_atombios_connected_scratch_regs(connector, encoder, connected);
112                 else
113                         radeon_combios_connected_scratch_regs(connector, encoder, connected);
114
115         }
116 }
117
118 struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
119 {
120         struct drm_mode_object *obj;
121         struct drm_encoder *encoder;
122         int i;
123
124         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
125                 if (connector->encoder_ids[i] == 0)
126                         break;
127
128                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
129                 if (!obj)
130                         continue;
131
132                 encoder = obj_to_encoder(obj);
133                 if (encoder->encoder_type == encoder_type)
134                         return encoder;
135         }
136         return NULL;
137 }
138
139 struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
140 {
141         int enc_id = connector->encoder_ids[0];
142         struct drm_mode_object *obj;
143         struct drm_encoder *encoder;
144
145         /* pick the encoder ids */
146         if (enc_id) {
147                 obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
148                 if (!obj)
149                         return NULL;
150                 encoder = obj_to_encoder(obj);
151                 return encoder;
152         }
153         return NULL;
154 }
155
156 /*
157  * radeon_connector_analog_encoder_conflict_solve
158  * - search for other connectors sharing this encoder
159  *   if priority is true, then set them disconnected if this is connected
160  *   if priority is false, set us disconnected if they are connected
161  */
162 static enum drm_connector_status
163 radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
164                                                struct drm_encoder *encoder,
165                                                enum drm_connector_status current_status,
166                                                bool priority)
167 {
168         struct drm_device *dev = connector->dev;
169         struct drm_connector *conflict;
170         struct radeon_connector *radeon_conflict;
171         int i;
172
173         list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
174                 if (conflict == connector)
175                         continue;
176
177                 radeon_conflict = to_radeon_connector(conflict);
178                 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
179                         if (conflict->encoder_ids[i] == 0)
180                                 break;
181
182                         /* if the IDs match */
183                         if (conflict->encoder_ids[i] == encoder->base.id) {
184                                 if (conflict->status != connector_status_connected)
185                                         continue;
186
187                                 if (radeon_conflict->use_digital)
188                                         continue;
189
190                                 if (priority == true) {
191                                         DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
192                                         DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(connector));
193                                         conflict->status = connector_status_disconnected;
194                                         radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
195                                 } else {
196                                         DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector));
197                                         DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(conflict));
198                                         current_status = connector_status_disconnected;
199                                 }
200                                 break;
201                         }
202                 }
203         }
204         return current_status;
205
206 }
207
208 static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
209 {
210         struct drm_device *dev = encoder->dev;
211         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
212         struct drm_display_mode *mode = NULL;
213         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
214
215         if (native_mode->hdisplay != 0 &&
216             native_mode->vdisplay != 0 &&
217             native_mode->clock != 0) {
218                 mode = drm_mode_duplicate(dev, native_mode);
219                 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
220                 drm_mode_set_name(mode);
221
222                 DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);
223         } else if (native_mode->hdisplay != 0 &&
224                    native_mode->vdisplay != 0) {
225                 /* mac laptops without an edid */
226                 /* Note that this is not necessarily the exact panel mode,
227                  * but an approximation based on the cvt formula.  For these
228                  * systems we should ideally read the mode info out of the
229                  * registers or add a mode table, but this works and is much
230                  * simpler.
231                  */
232                 mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);
233                 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
234                 DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);
235         }
236         return mode;
237 }
238
239 static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)
240 {
241         struct drm_device *dev = encoder->dev;
242         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
243         struct drm_display_mode *mode = NULL;
244         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
245         int i;
246         struct mode_size {
247                 int w;
248                 int h;
249         } common_modes[17] = {
250                 { 640,  480},
251                 { 720,  480},
252                 { 800,  600},
253                 { 848,  480},
254                 {1024,  768},
255                 {1152,  768},
256                 {1280,  720},
257                 {1280,  800},
258                 {1280,  854},
259                 {1280,  960},
260                 {1280, 1024},
261                 {1440,  900},
262                 {1400, 1050},
263                 {1680, 1050},
264                 {1600, 1200},
265                 {1920, 1080},
266                 {1920, 1200}
267         };
268
269         for (i = 0; i < 17; i++) {
270                 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {
271                         if (common_modes[i].w > 1024 ||
272                             common_modes[i].h > 768)
273                                 continue;
274                 }
275                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
276                         if (common_modes[i].w > native_mode->hdisplay ||
277                             common_modes[i].h > native_mode->vdisplay ||
278                             (common_modes[i].w == native_mode->hdisplay &&
279                              common_modes[i].h == native_mode->vdisplay))
280                                 continue;
281                 }
282                 if (common_modes[i].w < 320 || common_modes[i].h < 200)
283                         continue;
284
285                 mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
286                 drm_mode_probed_add(connector, mode);
287         }
288 }
289
290 int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
291                                   uint64_t val)
292 {
293         struct drm_device *dev = connector->dev;
294         struct radeon_device *rdev = dev->dev_private;
295         struct drm_encoder *encoder;
296         struct radeon_encoder *radeon_encoder;
297
298         if (property == rdev->mode_info.coherent_mode_property) {
299                 struct radeon_encoder_atom_dig *dig;
300                 bool new_coherent_mode;
301
302                 /* need to find digital encoder on connector */
303                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
304                 if (!encoder)
305                         return 0;
306
307                 radeon_encoder = to_radeon_encoder(encoder);
308
309                 if (!radeon_encoder->enc_priv)
310                         return 0;
311
312                 dig = radeon_encoder->enc_priv;
313                 new_coherent_mode = val ? true : false;
314                 if (dig->coherent_mode != new_coherent_mode) {
315                         dig->coherent_mode = new_coherent_mode;
316                         radeon_property_change_mode(&radeon_encoder->base);
317                 }
318         }
319
320         if (property == rdev->mode_info.underscan_property) {
321                 /* need to find digital encoder on connector */
322                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
323                 if (!encoder)
324                         return 0;
325
326                 radeon_encoder = to_radeon_encoder(encoder);
327
328                 if (radeon_encoder->underscan_type != val) {
329                         radeon_encoder->underscan_type = val;
330                         radeon_property_change_mode(&radeon_encoder->base);
331                 }
332         }
333
334         if (property == rdev->mode_info.underscan_hborder_property) {
335                 /* need to find digital encoder on connector */
336                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
337                 if (!encoder)
338                         return 0;
339
340                 radeon_encoder = to_radeon_encoder(encoder);
341
342                 if (radeon_encoder->underscan_hborder != val) {
343                         radeon_encoder->underscan_hborder = val;
344                         radeon_property_change_mode(&radeon_encoder->base);
345                 }
346         }
347
348         if (property == rdev->mode_info.underscan_vborder_property) {
349                 /* need to find digital encoder on connector */
350                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
351                 if (!encoder)
352                         return 0;
353
354                 radeon_encoder = to_radeon_encoder(encoder);
355
356                 if (radeon_encoder->underscan_vborder != val) {
357                         radeon_encoder->underscan_vborder = val;
358                         radeon_property_change_mode(&radeon_encoder->base);
359                 }
360         }
361
362         if (property == rdev->mode_info.tv_std_property) {
363                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
364                 if (!encoder) {
365                         encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);
366                 }
367
368                 if (!encoder)
369                         return 0;
370
371                 radeon_encoder = to_radeon_encoder(encoder);
372                 if (!radeon_encoder->enc_priv)
373                         return 0;
374                 if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {
375                         struct radeon_encoder_atom_dac *dac_int;
376                         dac_int = radeon_encoder->enc_priv;
377                         dac_int->tv_std = val;
378                 } else {
379                         struct radeon_encoder_tv_dac *dac_int;
380                         dac_int = radeon_encoder->enc_priv;
381                         dac_int->tv_std = val;
382                 }
383                 radeon_property_change_mode(&radeon_encoder->base);
384         }
385
386         if (property == rdev->mode_info.load_detect_property) {
387                 struct radeon_connector *radeon_connector =
388                         to_radeon_connector(connector);
389
390                 if (val == 0)
391                         radeon_connector->dac_load_detect = false;
392                 else
393                         radeon_connector->dac_load_detect = true;
394         }
395
396         if (property == rdev->mode_info.tmds_pll_property) {
397                 struct radeon_encoder_int_tmds *tmds = NULL;
398                 bool ret = false;
399                 /* need to find digital encoder on connector */
400                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
401                 if (!encoder)
402                         return 0;
403
404                 radeon_encoder = to_radeon_encoder(encoder);
405
406                 tmds = radeon_encoder->enc_priv;
407                 if (!tmds)
408                         return 0;
409
410                 if (val == 0) {
411                         if (rdev->is_atom_bios)
412                                 ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);
413                         else
414                                 ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);
415                 }
416                 if (val == 1 || ret == false) {
417                         radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);
418                 }
419                 radeon_property_change_mode(&radeon_encoder->base);
420         }
421
422         return 0;
423 }
424
425 static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
426                                           struct drm_connector *connector)
427 {
428         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
429         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
430
431         /* Try to get native mode details from EDID if necessary */
432         if (!native_mode->clock) {
433                 struct drm_display_mode *t, *mode;
434
435                 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
436                         if (mode->hdisplay == native_mode->hdisplay &&
437                             mode->vdisplay == native_mode->vdisplay) {
438                                 *native_mode = *mode;
439                                 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
440                                 DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
441                                 break;
442                         }
443                 }
444         }
445         if (!native_mode->clock) {
446                 DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
447                 radeon_encoder->rmx_type = RMX_OFF;
448         }
449 }
450
451 static int radeon_lvds_get_modes(struct drm_connector *connector)
452 {
453         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
454         struct drm_encoder *encoder;
455         int ret = 0;
456         struct drm_display_mode *mode;
457
458         if (radeon_connector->ddc_bus) {
459                 ret = radeon_ddc_get_modes(radeon_connector);
460                 if (ret > 0) {
461                         encoder = radeon_best_single_encoder(connector);
462                         if (encoder) {
463                                 radeon_fixup_lvds_native_mode(encoder, connector);
464                                 /* add scaled modes */
465                                 radeon_add_common_modes(encoder, connector);
466                         }
467                         return ret;
468                 }
469         }
470
471         encoder = radeon_best_single_encoder(connector);
472         if (!encoder)
473                 return 0;
474
475         /* we have no EDID modes */
476         mode = radeon_fp_native_mode(encoder);
477         if (mode) {
478                 ret = 1;
479                 drm_mode_probed_add(connector, mode);
480                 /* add the width/height from vbios tables if available */
481                 connector->display_info.width_mm = mode->width_mm;
482                 connector->display_info.height_mm = mode->height_mm;
483                 /* add scaled modes */
484                 radeon_add_common_modes(encoder, connector);
485         }
486
487         return ret;
488 }
489
490 static int radeon_lvds_mode_valid(struct drm_connector *connector,
491                                   struct drm_display_mode *mode)
492 {
493         struct drm_encoder *encoder = radeon_best_single_encoder(connector);
494
495         if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
496                 return MODE_PANEL;
497
498         if (encoder) {
499                 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
500                 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
501
502                 /* AVIVO hardware supports downscaling modes larger than the panel
503                  * to the panel size, but I'm not sure this is desirable.
504                  */
505                 if ((mode->hdisplay > native_mode->hdisplay) ||
506                     (mode->vdisplay > native_mode->vdisplay))
507                         return MODE_PANEL;
508
509                 /* if scaling is disabled, block non-native modes */
510                 if (radeon_encoder->rmx_type == RMX_OFF) {
511                         if ((mode->hdisplay != native_mode->hdisplay) ||
512                             (mode->vdisplay != native_mode->vdisplay))
513                                 return MODE_PANEL;
514                 }
515         }
516
517         return MODE_OK;
518 }
519
520 static enum drm_connector_status
521 radeon_lvds_detect(struct drm_connector *connector, bool force)
522 {
523         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
524         struct drm_encoder *encoder = radeon_best_single_encoder(connector);
525         enum drm_connector_status ret = connector_status_disconnected;
526
527         if (encoder) {
528                 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
529                 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
530
531                 /* check if panel is valid */
532                 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
533                         ret = connector_status_connected;
534
535         }
536
537         /* check for edid as well */
538         if (radeon_connector->edid)
539                 ret = connector_status_connected;
540         else {
541                 if (radeon_connector->ddc_bus) {
542                         radeon_connector->edid = drm_get_edid(&radeon_connector->base,
543                                                               &radeon_connector->ddc_bus->adapter);
544                         if (radeon_connector->edid)
545                                 ret = connector_status_connected;
546                 }
547         }
548         /* check acpi lid status ??? */
549
550         radeon_connector_update_scratch_regs(connector, ret);
551         return ret;
552 }
553
554 static void radeon_connector_destroy(struct drm_connector *connector)
555 {
556         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
557
558         if (radeon_connector->edid)
559                 kfree(radeon_connector->edid);
560         kfree(radeon_connector->con_priv);
561         drm_sysfs_connector_remove(connector);
562         drm_connector_cleanup(connector);
563         kfree(connector);
564 }
565
566 static int radeon_lvds_set_property(struct drm_connector *connector,
567                                     struct drm_property *property,
568                                     uint64_t value)
569 {
570         struct drm_device *dev = connector->dev;
571         struct radeon_encoder *radeon_encoder;
572         enum radeon_rmx_type rmx_type;
573
574         DRM_DEBUG_KMS("\n");
575         if (property != dev->mode_config.scaling_mode_property)
576                 return 0;
577
578         if (connector->encoder)
579                 radeon_encoder = to_radeon_encoder(connector->encoder);
580         else {
581                 struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
582                 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
583         }
584
585         switch (value) {
586         case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
587         case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
588         case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
589         default:
590         case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
591         }
592         if (radeon_encoder->rmx_type == rmx_type)
593                 return 0;
594
595         radeon_encoder->rmx_type = rmx_type;
596
597         radeon_property_change_mode(&radeon_encoder->base);
598         return 0;
599 }
600
601
602 struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
603         .get_modes = radeon_lvds_get_modes,
604         .mode_valid = radeon_lvds_mode_valid,
605         .best_encoder = radeon_best_single_encoder,
606 };
607
608 struct drm_connector_funcs radeon_lvds_connector_funcs = {
609         .dpms = drm_helper_connector_dpms,
610         .detect = radeon_lvds_detect,
611         .fill_modes = drm_helper_probe_single_connector_modes,
612         .destroy = radeon_connector_destroy,
613         .set_property = radeon_lvds_set_property,
614 };
615
616 static int radeon_vga_get_modes(struct drm_connector *connector)
617 {
618         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
619         int ret;
620
621         ret = radeon_ddc_get_modes(radeon_connector);
622
623         return ret;
624 }
625
626 static int radeon_vga_mode_valid(struct drm_connector *connector,
627                                   struct drm_display_mode *mode)
628 {
629         /* XXX check mode bandwidth */
630         /* XXX verify against max DAC output frequency */
631         return MODE_OK;
632 }
633
634 static enum drm_connector_status
635 radeon_vga_detect(struct drm_connector *connector, bool force)
636 {
637         struct drm_device *dev = connector->dev;
638         struct radeon_device *rdev = dev->dev_private;
639         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
640         struct drm_encoder *encoder;
641         struct drm_encoder_helper_funcs *encoder_funcs;
642         bool dret = false;
643         enum drm_connector_status ret = connector_status_disconnected;
644
645         encoder = radeon_best_single_encoder(connector);
646         if (!encoder)
647                 ret = connector_status_disconnected;
648
649         if (radeon_connector->ddc_bus)
650                 dret = radeon_ddc_probe(radeon_connector);
651         if (dret) {
652                 if (radeon_connector->edid) {
653                         kfree(radeon_connector->edid);
654                         radeon_connector->edid = NULL;
655                 }
656                 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
657
658                 if (!radeon_connector->edid) {
659                         DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
660                                         drm_get_connector_name(connector));
661                         ret = connector_status_connected;
662                 } else {
663                         radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
664
665                         /* some oems have boards with separate digital and analog connectors
666                          * with a shared ddc line (often vga + hdmi)
667                          */
668                         if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
669                                 kfree(radeon_connector->edid);
670                                 radeon_connector->edid = NULL;
671                                 ret = connector_status_disconnected;
672                         } else
673                                 ret = connector_status_connected;
674                 }
675         } else {
676
677                 /* if we aren't forcing don't do destructive polling */
678                 if (!force)
679                         return connector->status;
680
681                 if (radeon_connector->dac_load_detect && encoder) {
682                         encoder_funcs = encoder->helper_private;
683                         ret = encoder_funcs->detect(encoder, connector);
684                 }
685         }
686
687         if (ret == connector_status_connected)
688                 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
689
690         /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
691          * vbios to deal with KVMs. If we have one and are not able to detect a monitor
692          * by other means, assume the CRT is connected and use that EDID.
693          */
694         if ((!rdev->is_atom_bios) &&
695             (ret == connector_status_disconnected) &&
696             rdev->mode_info.bios_hardcoded_edid_size) {
697                 ret = connector_status_connected;
698         }
699
700         radeon_connector_update_scratch_regs(connector, ret);
701         return ret;
702 }
703
704 struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
705         .get_modes = radeon_vga_get_modes,
706         .mode_valid = radeon_vga_mode_valid,
707         .best_encoder = radeon_best_single_encoder,
708 };
709
710 struct drm_connector_funcs radeon_vga_connector_funcs = {
711         .dpms = drm_helper_connector_dpms,
712         .detect = radeon_vga_detect,
713         .fill_modes = drm_helper_probe_single_connector_modes,
714         .destroy = radeon_connector_destroy,
715         .set_property = radeon_connector_set_property,
716 };
717
718 static int radeon_tv_get_modes(struct drm_connector *connector)
719 {
720         struct drm_device *dev = connector->dev;
721         struct radeon_device *rdev = dev->dev_private;
722         struct drm_display_mode *tv_mode;
723         struct drm_encoder *encoder;
724
725         encoder = radeon_best_single_encoder(connector);
726         if (!encoder)
727                 return 0;
728
729         /* avivo chips can scale any mode */
730         if (rdev->family >= CHIP_RS600)
731                 /* add scaled modes */
732                 radeon_add_common_modes(encoder, connector);
733         else {
734                 /* only 800x600 is supported right now on pre-avivo chips */
735                 tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false);
736                 tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
737                 drm_mode_probed_add(connector, tv_mode);
738         }
739         return 1;
740 }
741
742 static int radeon_tv_mode_valid(struct drm_connector *connector,
743                                 struct drm_display_mode *mode)
744 {
745         if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))
746                 return MODE_CLOCK_RANGE;
747         return MODE_OK;
748 }
749
750 static enum drm_connector_status
751 radeon_tv_detect(struct drm_connector *connector, bool force)
752 {
753         struct drm_encoder *encoder;
754         struct drm_encoder_helper_funcs *encoder_funcs;
755         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
756         enum drm_connector_status ret = connector_status_disconnected;
757
758         if (!radeon_connector->dac_load_detect)
759                 return ret;
760
761         encoder = radeon_best_single_encoder(connector);
762         if (!encoder)
763                 ret = connector_status_disconnected;
764         else {
765                 encoder_funcs = encoder->helper_private;
766                 ret = encoder_funcs->detect(encoder, connector);
767         }
768         if (ret == connector_status_connected)
769                 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);
770         radeon_connector_update_scratch_regs(connector, ret);
771         return ret;
772 }
773
774 struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {
775         .get_modes = radeon_tv_get_modes,
776         .mode_valid = radeon_tv_mode_valid,
777         .best_encoder = radeon_best_single_encoder,
778 };
779
780 struct drm_connector_funcs radeon_tv_connector_funcs = {
781         .dpms = drm_helper_connector_dpms,
782         .detect = radeon_tv_detect,
783         .fill_modes = drm_helper_probe_single_connector_modes,
784         .destroy = radeon_connector_destroy,
785         .set_property = radeon_connector_set_property,
786 };
787
788 static int radeon_dvi_get_modes(struct drm_connector *connector)
789 {
790         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
791         int ret;
792
793         ret = radeon_ddc_get_modes(radeon_connector);
794         return ret;
795 }
796
797 /*
798  * DVI is complicated
799  * Do a DDC probe, if DDC probe passes, get the full EDID so
800  * we can do analog/digital monitor detection at this point.
801  * If the monitor is an analog monitor or we got no DDC,
802  * we need to find the DAC encoder object for this connector.
803  * If we got no DDC, we do load detection on the DAC encoder object.
804  * If we got analog DDC or load detection passes on the DAC encoder
805  * we have to check if this analog encoder is shared with anyone else (TV)
806  * if its shared we have to set the other connector to disconnected.
807  */
808 static enum drm_connector_status
809 radeon_dvi_detect(struct drm_connector *connector, bool force)
810 {
811         struct drm_device *dev = connector->dev;
812         struct radeon_device *rdev = dev->dev_private;
813         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
814         struct drm_encoder *encoder = NULL;
815         struct drm_encoder_helper_funcs *encoder_funcs;
816         struct drm_mode_object *obj;
817         int i;
818         enum drm_connector_status ret = connector_status_disconnected;
819         bool dret = false;
820
821         if (radeon_connector->ddc_bus)
822                 dret = radeon_ddc_probe(radeon_connector);
823         if (dret) {
824                 if (radeon_connector->edid) {
825                         kfree(radeon_connector->edid);
826                         radeon_connector->edid = NULL;
827                 }
828                 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
829
830                 if (!radeon_connector->edid) {
831                         DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
832                                         drm_get_connector_name(connector));
833                 } else {
834                         radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
835
836                         /* some oems have boards with separate digital and analog connectors
837                          * with a shared ddc line (often vga + hdmi)
838                          */
839                         if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
840                                 kfree(radeon_connector->edid);
841                                 radeon_connector->edid = NULL;
842                                 ret = connector_status_disconnected;
843                         } else
844                                 ret = connector_status_connected;
845
846                         /* This gets complicated.  We have boards with VGA + HDMI with a
847                          * shared DDC line and we have boards with DVI-D + HDMI with a shared
848                          * DDC line.  The latter is more complex because with DVI<->HDMI adapters
849                          * you don't really know what's connected to which port as both are digital.
850                          */
851                         if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
852                                 struct drm_connector *list_connector;
853                                 struct radeon_connector *list_radeon_connector;
854                                 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
855                                         if (connector == list_connector)
856                                                 continue;
857                                         list_radeon_connector = to_radeon_connector(list_connector);
858                                         if (list_radeon_connector->shared_ddc &&
859                                             (list_radeon_connector->ddc_bus->rec.i2c_id ==
860                                              radeon_connector->ddc_bus->rec.i2c_id)) {
861                                                 /* cases where both connectors are digital */
862                                                 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
863                                                         /* hpd is our only option in this case */
864                                                         if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
865                                                                 kfree(radeon_connector->edid);
866                                                                 radeon_connector->edid = NULL;
867                                                                 ret = connector_status_disconnected;
868                                                         }
869                                                 }
870                                         }
871                                 }
872                         }
873                 }
874         }
875
876         if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
877                 goto out;
878
879         if (!force) {
880                 ret = connector->status;
881                 goto out;
882         }
883
884         /* find analog encoder */
885         if (radeon_connector->dac_load_detect) {
886                 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
887                         if (connector->encoder_ids[i] == 0)
888                                 break;
889
890                         obj = drm_mode_object_find(connector->dev,
891                                                    connector->encoder_ids[i],
892                                                    DRM_MODE_OBJECT_ENCODER);
893                         if (!obj)
894                                 continue;
895
896                         encoder = obj_to_encoder(obj);
897
898                         encoder_funcs = encoder->helper_private;
899                         if (encoder_funcs->detect) {
900                                 if (ret != connector_status_connected) {
901                                         ret = encoder_funcs->detect(encoder, connector);
902                                         if (ret == connector_status_connected) {
903                                                 radeon_connector->use_digital = false;
904                                         }
905                                 }
906                                 break;
907                         }
908                 }
909         }
910
911         if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&
912             encoder) {
913                 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
914         }
915
916         /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
917          * vbios to deal with KVMs. If we have one and are not able to detect a monitor
918          * by other means, assume the DFP is connected and use that EDID.  In most
919          * cases the DVI port is actually a virtual KVM port connected to the service
920          * processor.
921          */
922         if ((!rdev->is_atom_bios) &&
923             (ret == connector_status_disconnected) &&
924             rdev->mode_info.bios_hardcoded_edid_size) {
925                 radeon_connector->use_digital = true;
926                 ret = connector_status_connected;
927         }
928
929 out:
930         /* updated in get modes as well since we need to know if it's analog or digital */
931         radeon_connector_update_scratch_regs(connector, ret);
932         return ret;
933 }
934
935 /* okay need to be smart in here about which encoder to pick */
936 struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
937 {
938         int enc_id = connector->encoder_ids[0];
939         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
940         struct drm_mode_object *obj;
941         struct drm_encoder *encoder;
942         int i;
943         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
944                 if (connector->encoder_ids[i] == 0)
945                         break;
946
947                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
948                 if (!obj)
949                         continue;
950
951                 encoder = obj_to_encoder(obj);
952
953                 if (radeon_connector->use_digital == true) {
954                         if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
955                                 return encoder;
956                 } else {
957                         if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
958                             encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
959                                 return encoder;
960                 }
961         }
962
963         /* see if we have a default encoder  TODO */
964
965         /* then check use digitial */
966         /* pick the first one */
967         if (enc_id) {
968                 obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
969                 if (!obj)
970                         return NULL;
971                 encoder = obj_to_encoder(obj);
972                 return encoder;
973         }
974         return NULL;
975 }
976
977 static void radeon_dvi_force(struct drm_connector *connector)
978 {
979         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
980         if (connector->force == DRM_FORCE_ON)
981                 radeon_connector->use_digital = false;
982         if (connector->force == DRM_FORCE_ON_DIGITAL)
983                 radeon_connector->use_digital = true;
984 }
985
986 static int radeon_dvi_mode_valid(struct drm_connector *connector,
987                                   struct drm_display_mode *mode)
988 {
989         struct drm_device *dev = connector->dev;
990         struct radeon_device *rdev = dev->dev_private;
991         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
992
993         /* XXX check mode bandwidth */
994
995         /* clocks over 135 MHz have heat issues with DVI on RV100 */
996         if (radeon_connector->use_digital &&
997             (rdev->family == CHIP_RV100) &&
998             (mode->clock > 135000))
999                 return MODE_CLOCK_HIGH;
1000
1001         if (radeon_connector->use_digital && (mode->clock > 165000)) {
1002                 if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
1003                     (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
1004                     (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
1005                         return MODE_OK;
1006                 else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
1007                         if (ASIC_IS_DCE3(rdev)) {
1008                                 /* HDMI 1.3+ supports max clock of 340 Mhz */
1009                                 if (mode->clock > 340000)
1010                                         return MODE_CLOCK_HIGH;
1011                                 else
1012                                         return MODE_OK;
1013                         } else
1014                                 return MODE_CLOCK_HIGH;
1015                 } else
1016                         return MODE_CLOCK_HIGH;
1017         }
1018         return MODE_OK;
1019 }
1020
1021 struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
1022         .get_modes = radeon_dvi_get_modes,
1023         .mode_valid = radeon_dvi_mode_valid,
1024         .best_encoder = radeon_dvi_encoder,
1025 };
1026
1027 struct drm_connector_funcs radeon_dvi_connector_funcs = {
1028         .dpms = drm_helper_connector_dpms,
1029         .detect = radeon_dvi_detect,
1030         .fill_modes = drm_helper_probe_single_connector_modes,
1031         .set_property = radeon_connector_set_property,
1032         .destroy = radeon_connector_destroy,
1033         .force = radeon_dvi_force,
1034 };
1035
1036 static void radeon_dp_connector_destroy(struct drm_connector *connector)
1037 {
1038         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1039         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1040
1041         if (radeon_connector->edid)
1042                 kfree(radeon_connector->edid);
1043         if (radeon_dig_connector->dp_i2c_bus)
1044                 radeon_i2c_destroy(radeon_dig_connector->dp_i2c_bus);
1045         kfree(radeon_connector->con_priv);
1046         drm_sysfs_connector_remove(connector);
1047         drm_connector_cleanup(connector);
1048         kfree(connector);
1049 }
1050
1051 static int radeon_dp_get_modes(struct drm_connector *connector)
1052 {
1053         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1054         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1055         int ret;
1056
1057         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1058                 struct drm_encoder *encoder;
1059                 struct drm_display_mode *mode;
1060
1061                 if (!radeon_dig_connector->edp_on)
1062                         atombios_set_edp_panel_power(connector,
1063                                                      ATOM_TRANSMITTER_ACTION_POWER_ON);
1064                 ret = radeon_ddc_get_modes(radeon_connector);
1065                 if (!radeon_dig_connector->edp_on)
1066                         atombios_set_edp_panel_power(connector,
1067                                                      ATOM_TRANSMITTER_ACTION_POWER_OFF);
1068
1069                 if (ret > 0) {
1070                         encoder = radeon_best_single_encoder(connector);
1071                         if (encoder) {
1072                                 radeon_fixup_lvds_native_mode(encoder, connector);
1073                                 /* add scaled modes */
1074                                 radeon_add_common_modes(encoder, connector);
1075                         }
1076                         return ret;
1077                 }
1078
1079                 encoder = radeon_best_single_encoder(connector);
1080                 if (!encoder)
1081                         return 0;
1082
1083                 /* we have no EDID modes */
1084                 mode = radeon_fp_native_mode(encoder);
1085                 if (mode) {
1086                         ret = 1;
1087                         drm_mode_probed_add(connector, mode);
1088                         /* add the width/height from vbios tables if available */
1089                         connector->display_info.width_mm = mode->width_mm;
1090                         connector->display_info.height_mm = mode->height_mm;
1091                         /* add scaled modes */
1092                         radeon_add_common_modes(encoder, connector);
1093                 }
1094         } else
1095                 ret = radeon_ddc_get_modes(radeon_connector);
1096
1097         return ret;
1098 }
1099
1100 bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector)
1101 {
1102         struct drm_mode_object *obj;
1103         struct drm_encoder *encoder;
1104         struct radeon_encoder *radeon_encoder;
1105         int i;
1106         bool found = false;
1107
1108         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1109                 if (connector->encoder_ids[i] == 0)
1110                         break;
1111
1112                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1113                 if (!obj)
1114                         continue;
1115
1116                 encoder = obj_to_encoder(obj);
1117                 radeon_encoder = to_radeon_encoder(encoder);
1118
1119                 switch (radeon_encoder->encoder_id) {
1120                 case ENCODER_OBJECT_ID_TRAVIS:
1121                 case ENCODER_OBJECT_ID_NUTMEG:
1122                         found = true;
1123                         break;
1124                 default:
1125                         break;
1126                 }
1127         }
1128
1129         return found;
1130 }
1131
1132 bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
1133 {
1134         struct drm_mode_object *obj;
1135         struct drm_encoder *encoder;
1136         struct radeon_encoder *radeon_encoder;
1137         int i;
1138         bool found = false;
1139
1140         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1141                 if (connector->encoder_ids[i] == 0)
1142                         break;
1143
1144                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1145                 if (!obj)
1146                         continue;
1147
1148                 encoder = obj_to_encoder(obj);
1149                 radeon_encoder = to_radeon_encoder(encoder);
1150                 if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
1151                         found = true;
1152         }
1153
1154         return found;
1155 }
1156
1157 bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
1158 {
1159         struct drm_device *dev = connector->dev;
1160         struct radeon_device *rdev = dev->dev_private;
1161
1162         if (ASIC_IS_DCE5(rdev) &&
1163             (rdev->clock.dp_extclk >= 53900) &&
1164             radeon_connector_encoder_is_hbr2(connector)) {
1165                 return true;
1166         }
1167
1168         return false;
1169 }
1170
1171 static enum drm_connector_status
1172 radeon_dp_detect(struct drm_connector *connector, bool force)
1173 {
1174         struct drm_device *dev = connector->dev;
1175         struct radeon_device *rdev = dev->dev_private;
1176         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1177         enum drm_connector_status ret = connector_status_disconnected;
1178         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1179
1180         if (radeon_connector->edid) {
1181                 kfree(radeon_connector->edid);
1182                 radeon_connector->edid = NULL;
1183         }
1184
1185         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1186                 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1187                 if (encoder) {
1188                         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1189                         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1190
1191                         /* check if panel is valid */
1192                         if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
1193                                 ret = connector_status_connected;
1194                 }
1195                 /* eDP is always DP */
1196                 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1197                 if (!radeon_dig_connector->edp_on)
1198                         atombios_set_edp_panel_power(connector,
1199                                                      ATOM_TRANSMITTER_ACTION_POWER_ON);
1200                 if (radeon_dp_getdpcd(radeon_connector))
1201                         ret = connector_status_connected;
1202                 if (!radeon_dig_connector->edp_on)
1203                         atombios_set_edp_panel_power(connector,
1204                                                      ATOM_TRANSMITTER_ACTION_POWER_OFF);
1205         } else {
1206                 radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
1207                 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
1208                         ret = connector_status_connected;
1209                         if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
1210                                 radeon_dp_getdpcd(radeon_connector);
1211                 } else {
1212                         if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1213                                 if (radeon_dp_getdpcd(radeon_connector))
1214                                         ret = connector_status_connected;
1215                         } else {
1216                                 if (radeon_ddc_probe(radeon_connector))
1217                                         ret = connector_status_connected;
1218                         }
1219                 }
1220         }
1221
1222         radeon_connector_update_scratch_regs(connector, ret);
1223         return ret;
1224 }
1225
1226 static int radeon_dp_mode_valid(struct drm_connector *connector,
1227                                   struct drm_display_mode *mode)
1228 {
1229         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1230         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1231
1232         /* XXX check mode bandwidth */
1233
1234         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1235                 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1236
1237                 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
1238                         return MODE_PANEL;
1239
1240                 if (encoder) {
1241                         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1242                         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1243
1244                 /* AVIVO hardware supports downscaling modes larger than the panel
1245                          * to the panel size, but I'm not sure this is desirable.
1246                          */
1247                         if ((mode->hdisplay > native_mode->hdisplay) ||
1248                             (mode->vdisplay > native_mode->vdisplay))
1249                                 return MODE_PANEL;
1250
1251                         /* if scaling is disabled, block non-native modes */
1252                         if (radeon_encoder->rmx_type == RMX_OFF) {
1253                                 if ((mode->hdisplay != native_mode->hdisplay) ||
1254                                     (mode->vdisplay != native_mode->vdisplay))
1255                                         return MODE_PANEL;
1256                         }
1257                 }
1258                 return MODE_OK;
1259         } else {
1260                 if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
1261                     (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
1262                         return radeon_dp_mode_valid_helper(connector, mode);
1263                 else
1264                         return MODE_OK;
1265         }
1266 }
1267
1268 struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
1269         .get_modes = radeon_dp_get_modes,
1270         .mode_valid = radeon_dp_mode_valid,
1271         .best_encoder = radeon_dvi_encoder,
1272 };
1273
1274 struct drm_connector_funcs radeon_dp_connector_funcs = {
1275         .dpms = drm_helper_connector_dpms,
1276         .detect = radeon_dp_detect,
1277         .fill_modes = drm_helper_probe_single_connector_modes,
1278         .set_property = radeon_connector_set_property,
1279         .destroy = radeon_dp_connector_destroy,
1280         .force = radeon_dvi_force,
1281 };
1282
1283 void
1284 radeon_add_atom_connector(struct drm_device *dev,
1285                           uint32_t connector_id,
1286                           uint32_t supported_device,
1287                           int connector_type,
1288                           struct radeon_i2c_bus_rec *i2c_bus,
1289                           uint32_t igp_lane_info,
1290                           uint16_t connector_object_id,
1291                           struct radeon_hpd *hpd,
1292                           struct radeon_router *router)
1293 {
1294         struct radeon_device *rdev = dev->dev_private;
1295         struct drm_connector *connector;
1296         struct radeon_connector *radeon_connector;
1297         struct radeon_connector_atom_dig *radeon_dig_connector;
1298         struct drm_encoder *encoder;
1299         struct radeon_encoder *radeon_encoder;
1300         uint32_t subpixel_order = SubPixelNone;
1301         bool shared_ddc = false;
1302         bool is_dp_bridge = false;
1303
1304         if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1305                 return;
1306
1307         /* if the user selected tv=0 don't try and add the connector */
1308         if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
1309              (connector_type == DRM_MODE_CONNECTOR_Composite) ||
1310              (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
1311             (radeon_tv == 0))
1312                 return;
1313
1314         /* see if we already added it */
1315         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1316                 radeon_connector = to_radeon_connector(connector);
1317                 if (radeon_connector->connector_id == connector_id) {
1318                         radeon_connector->devices |= supported_device;
1319                         return;
1320                 }
1321                 if (radeon_connector->ddc_bus && i2c_bus->valid) {
1322                         if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
1323                                 radeon_connector->shared_ddc = true;
1324                                 shared_ddc = true;
1325                         }
1326                         if (radeon_connector->router_bus && router->ddc_valid &&
1327                             (radeon_connector->router.router_id == router->router_id)) {
1328                                 radeon_connector->shared_ddc = false;
1329                                 shared_ddc = false;
1330                         }
1331                 }
1332         }
1333
1334         /* check if it's a dp bridge */
1335         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1336                 radeon_encoder = to_radeon_encoder(encoder);
1337                 if (radeon_encoder->devices & supported_device) {
1338                         switch (radeon_encoder->encoder_id) {
1339                         case ENCODER_OBJECT_ID_TRAVIS:
1340                         case ENCODER_OBJECT_ID_NUTMEG:
1341                                 is_dp_bridge = true;
1342                                 break;
1343                         default:
1344                                 break;
1345                         }
1346                 }
1347         }
1348
1349         radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1350         if (!radeon_connector)
1351                 return;
1352
1353         connector = &radeon_connector->base;
1354
1355         radeon_connector->connector_id = connector_id;
1356         radeon_connector->devices = supported_device;
1357         radeon_connector->shared_ddc = shared_ddc;
1358         radeon_connector->connector_object_id = connector_object_id;
1359         radeon_connector->hpd = *hpd;
1360         radeon_connector->router = *router;
1361         if (router->ddc_valid || router->cd_valid) {
1362                 radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
1363                 if (!radeon_connector->router_bus)
1364                         DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
1365         }
1366
1367         if (is_dp_bridge) {
1368                 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1369                 if (!radeon_dig_connector)
1370                         goto failed;
1371                 radeon_dig_connector->igp_lane_info = igp_lane_info;
1372                 radeon_connector->con_priv = radeon_dig_connector;
1373                 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1374                 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1375                 if (i2c_bus->valid) {
1376                         /* add DP i2c bus */
1377                         if (connector_type == DRM_MODE_CONNECTOR_eDP)
1378                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1379                         else
1380                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1381                         if (!radeon_dig_connector->dp_i2c_bus)
1382                                 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1383                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1384                         if (!radeon_connector->ddc_bus)
1385                                 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1386                 }
1387                 switch (connector_type) {
1388                 case DRM_MODE_CONNECTOR_VGA:
1389                 case DRM_MODE_CONNECTOR_DVIA:
1390                 default:
1391                         connector->interlace_allowed = true;
1392                         connector->doublescan_allowed = true;
1393                         break;
1394                 case DRM_MODE_CONNECTOR_DVII:
1395                 case DRM_MODE_CONNECTOR_DVID:
1396                 case DRM_MODE_CONNECTOR_HDMIA:
1397                 case DRM_MODE_CONNECTOR_HDMIB:
1398                 case DRM_MODE_CONNECTOR_DisplayPort:
1399                         drm_connector_attach_property(&radeon_connector->base,
1400                                                       rdev->mode_info.underscan_property,
1401                                                       UNDERSCAN_OFF);
1402                         drm_connector_attach_property(&radeon_connector->base,
1403                                                       rdev->mode_info.underscan_hborder_property,
1404                                                       0);
1405                         drm_connector_attach_property(&radeon_connector->base,
1406                                                       rdev->mode_info.underscan_vborder_property,
1407                                                       0);
1408                         subpixel_order = SubPixelHorizontalRGB;
1409                         connector->interlace_allowed = true;
1410                         if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1411                                 connector->doublescan_allowed = true;
1412                         else
1413                                 connector->doublescan_allowed = false;
1414                         break;
1415                 case DRM_MODE_CONNECTOR_LVDS:
1416                 case DRM_MODE_CONNECTOR_eDP:
1417                         drm_connector_attach_property(&radeon_connector->base,
1418                                                       dev->mode_config.scaling_mode_property,
1419                                                       DRM_MODE_SCALE_FULLSCREEN);
1420                         subpixel_order = SubPixelHorizontalRGB;
1421                         connector->interlace_allowed = false;
1422                         connector->doublescan_allowed = false;
1423                         break;
1424                 }
1425         } else {
1426                 switch (connector_type) {
1427                 case DRM_MODE_CONNECTOR_VGA:
1428                         drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1429                         drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1430                         if (i2c_bus->valid) {
1431                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1432                                 if (!radeon_connector->ddc_bus)
1433                                         DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1434                         }
1435                         radeon_connector->dac_load_detect = true;
1436                         drm_connector_attach_property(&radeon_connector->base,
1437                                                       rdev->mode_info.load_detect_property,
1438                                                       1);
1439                         /* no HPD on analog connectors */
1440                         radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1441                         connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1442                         connector->interlace_allowed = true;
1443                         connector->doublescan_allowed = true;
1444                         break;
1445                 case DRM_MODE_CONNECTOR_DVIA:
1446                         drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1447                         drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1448                         if (i2c_bus->valid) {
1449                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1450                                 if (!radeon_connector->ddc_bus)
1451                                         DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1452                         }
1453                         radeon_connector->dac_load_detect = true;
1454                         drm_connector_attach_property(&radeon_connector->base,
1455                                                       rdev->mode_info.load_detect_property,
1456                                                       1);
1457                         /* no HPD on analog connectors */
1458                         radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1459                         connector->interlace_allowed = true;
1460                         connector->doublescan_allowed = true;
1461                         break;
1462                 case DRM_MODE_CONNECTOR_DVII:
1463                 case DRM_MODE_CONNECTOR_DVID:
1464                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1465                         if (!radeon_dig_connector)
1466                                 goto failed;
1467                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1468                         radeon_connector->con_priv = radeon_dig_connector;
1469                         drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1470                         drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1471                         if (i2c_bus->valid) {
1472                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1473                                 if (!radeon_connector->ddc_bus)
1474                                         DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1475                         }
1476                         subpixel_order = SubPixelHorizontalRGB;
1477                         drm_connector_attach_property(&radeon_connector->base,
1478                                                       rdev->mode_info.coherent_mode_property,
1479                                                       1);
1480                         if (ASIC_IS_AVIVO(rdev)) {
1481                                 drm_connector_attach_property(&radeon_connector->base,
1482                                                               rdev->mode_info.underscan_property,
1483                                                               UNDERSCAN_OFF);
1484                                 drm_connector_attach_property(&radeon_connector->base,
1485                                                               rdev->mode_info.underscan_hborder_property,
1486                                                               0);
1487                                 drm_connector_attach_property(&radeon_connector->base,
1488                                                               rdev->mode_info.underscan_vborder_property,
1489                                                               0);
1490                         }
1491                         if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1492                                 radeon_connector->dac_load_detect = true;
1493                                 drm_connector_attach_property(&radeon_connector->base,
1494                                                               rdev->mode_info.load_detect_property,
1495                                                               1);
1496                         }
1497                         connector->interlace_allowed = true;
1498                         if (connector_type == DRM_MODE_CONNECTOR_DVII)
1499                                 connector->doublescan_allowed = true;
1500                         else
1501                                 connector->doublescan_allowed = false;
1502                         break;
1503                 case DRM_MODE_CONNECTOR_HDMIA:
1504                 case DRM_MODE_CONNECTOR_HDMIB:
1505                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1506                         if (!radeon_dig_connector)
1507                                 goto failed;
1508                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1509                         radeon_connector->con_priv = radeon_dig_connector;
1510                         drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1511                         drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1512                         if (i2c_bus->valid) {
1513                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1514                                 if (!radeon_connector->ddc_bus)
1515                                         DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1516                         }
1517                         drm_connector_attach_property(&radeon_connector->base,
1518                                                       rdev->mode_info.coherent_mode_property,
1519                                                       1);
1520                         if (ASIC_IS_AVIVO(rdev)) {
1521                                 drm_connector_attach_property(&radeon_connector->base,
1522                                                               rdev->mode_info.underscan_property,
1523                                                               UNDERSCAN_OFF);
1524                                 drm_connector_attach_property(&radeon_connector->base,
1525                                                               rdev->mode_info.underscan_hborder_property,
1526                                                               0);
1527                                 drm_connector_attach_property(&radeon_connector->base,
1528                                                               rdev->mode_info.underscan_vborder_property,
1529                                                               0);
1530                         }
1531                         subpixel_order = SubPixelHorizontalRGB;
1532                         connector->interlace_allowed = true;
1533                         if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1534                                 connector->doublescan_allowed = true;
1535                         else
1536                                 connector->doublescan_allowed = false;
1537                         break;
1538                 case DRM_MODE_CONNECTOR_DisplayPort:
1539                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1540                         if (!radeon_dig_connector)
1541                                 goto failed;
1542                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1543                         radeon_connector->con_priv = radeon_dig_connector;
1544                         drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1545                         drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1546                         if (i2c_bus->valid) {
1547                                 /* add DP i2c bus */
1548                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1549                                 if (!radeon_dig_connector->dp_i2c_bus)
1550                                         DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1551                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1552                                 if (!radeon_connector->ddc_bus)
1553                                         DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1554                         }
1555                         subpixel_order = SubPixelHorizontalRGB;
1556                         drm_connector_attach_property(&radeon_connector->base,
1557                                                       rdev->mode_info.coherent_mode_property,
1558                                                       1);
1559                         if (ASIC_IS_AVIVO(rdev)) {
1560                                 drm_connector_attach_property(&radeon_connector->base,
1561                                                               rdev->mode_info.underscan_property,
1562                                                               UNDERSCAN_OFF);
1563                                 drm_connector_attach_property(&radeon_connector->base,
1564                                                               rdev->mode_info.underscan_hborder_property,
1565                                                               0);
1566                                 drm_connector_attach_property(&radeon_connector->base,
1567                                                               rdev->mode_info.underscan_vborder_property,
1568                                                               0);
1569                         }
1570                         connector->interlace_allowed = true;
1571                         /* in theory with a DP to VGA converter... */
1572                         connector->doublescan_allowed = false;
1573                         break;
1574                 case DRM_MODE_CONNECTOR_eDP:
1575                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1576                         if (!radeon_dig_connector)
1577                                 goto failed;
1578                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1579                         radeon_connector->con_priv = radeon_dig_connector;
1580                         drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1581                         drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1582                         if (i2c_bus->valid) {
1583                                 /* add DP i2c bus */
1584                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1585                                 if (!radeon_dig_connector->dp_i2c_bus)
1586                                         DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1587                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1588                                 if (!radeon_connector->ddc_bus)
1589                                         DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1590                         }
1591                         drm_connector_attach_property(&radeon_connector->base,
1592                                                       dev->mode_config.scaling_mode_property,
1593                                                       DRM_MODE_SCALE_FULLSCREEN);
1594                         subpixel_order = SubPixelHorizontalRGB;
1595                         connector->interlace_allowed = false;
1596                         connector->doublescan_allowed = false;
1597                         break;
1598                 case DRM_MODE_CONNECTOR_SVIDEO:
1599                 case DRM_MODE_CONNECTOR_Composite:
1600                 case DRM_MODE_CONNECTOR_9PinDIN:
1601                         drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1602                         drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1603                         radeon_connector->dac_load_detect = true;
1604                         drm_connector_attach_property(&radeon_connector->base,
1605                                                       rdev->mode_info.load_detect_property,
1606                                                       1);
1607                         drm_connector_attach_property(&radeon_connector->base,
1608                                                       rdev->mode_info.tv_std_property,
1609                                                       radeon_atombios_get_tv_info(rdev));
1610                         /* no HPD on analog connectors */
1611                         radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1612                         connector->interlace_allowed = false;
1613                         connector->doublescan_allowed = false;
1614                         break;
1615                 case DRM_MODE_CONNECTOR_LVDS:
1616                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1617                         if (!radeon_dig_connector)
1618                                 goto failed;
1619                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1620                         radeon_connector->con_priv = radeon_dig_connector;
1621                         drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1622                         drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1623                         if (i2c_bus->valid) {
1624                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1625                                 if (!radeon_connector->ddc_bus)
1626                                         DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1627                         }
1628                         drm_connector_attach_property(&radeon_connector->base,
1629                                                       dev->mode_config.scaling_mode_property,
1630                                                       DRM_MODE_SCALE_FULLSCREEN);
1631                         subpixel_order = SubPixelHorizontalRGB;
1632                         connector->interlace_allowed = false;
1633                         connector->doublescan_allowed = false;
1634                         break;
1635                 }
1636         }
1637
1638         if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
1639                 if (i2c_bus->valid)
1640                         connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1641         } else
1642                 connector->polled = DRM_CONNECTOR_POLL_HPD;
1643
1644         connector->display_info.subpixel_order = subpixel_order;
1645         drm_sysfs_connector_add(connector);
1646         return;
1647
1648 failed:
1649         drm_connector_cleanup(connector);
1650         kfree(connector);
1651 }
1652
1653 void
1654 radeon_add_legacy_connector(struct drm_device *dev,
1655                             uint32_t connector_id,
1656                             uint32_t supported_device,
1657                             int connector_type,
1658                             struct radeon_i2c_bus_rec *i2c_bus,
1659                             uint16_t connector_object_id,
1660                             struct radeon_hpd *hpd)
1661 {
1662         struct radeon_device *rdev = dev->dev_private;
1663         struct drm_connector *connector;
1664         struct radeon_connector *radeon_connector;
1665         uint32_t subpixel_order = SubPixelNone;
1666
1667         if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1668                 return;
1669
1670         /* if the user selected tv=0 don't try and add the connector */
1671         if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
1672              (connector_type == DRM_MODE_CONNECTOR_Composite) ||
1673              (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
1674             (radeon_tv == 0))
1675                 return;
1676
1677         /* see if we already added it */
1678         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1679                 radeon_connector = to_radeon_connector(connector);
1680                 if (radeon_connector->connector_id == connector_id) {
1681                         radeon_connector->devices |= supported_device;
1682                         return;
1683                 }
1684         }
1685
1686         radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1687         if (!radeon_connector)
1688                 return;
1689
1690         connector = &radeon_connector->base;
1691
1692         radeon_connector->connector_id = connector_id;
1693         radeon_connector->devices = supported_device;
1694         radeon_connector->connector_object_id = connector_object_id;
1695         radeon_connector->hpd = *hpd;
1696         switch (connector_type) {
1697         case DRM_MODE_CONNECTOR_VGA:
1698                 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1699                 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1700                 if (i2c_bus->valid) {
1701                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1702                         if (!radeon_connector->ddc_bus)
1703                                 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1704                 }
1705                 radeon_connector->dac_load_detect = true;
1706                 drm_connector_attach_property(&radeon_connector->base,
1707                                               rdev->mode_info.load_detect_property,
1708                                               1);
1709                 /* no HPD on analog connectors */
1710                 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1711                 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1712                 connector->interlace_allowed = true;
1713                 connector->doublescan_allowed = true;
1714                 break;
1715         case DRM_MODE_CONNECTOR_DVIA:
1716                 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1717                 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1718                 if (i2c_bus->valid) {
1719                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1720                         if (!radeon_connector->ddc_bus)
1721                                 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1722                 }
1723                 radeon_connector->dac_load_detect = true;
1724                 drm_connector_attach_property(&radeon_connector->base,
1725                                               rdev->mode_info.load_detect_property,
1726                                               1);
1727                 /* no HPD on analog connectors */
1728                 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1729                 connector->interlace_allowed = true;
1730                 connector->doublescan_allowed = true;
1731                 break;
1732         case DRM_MODE_CONNECTOR_DVII:
1733         case DRM_MODE_CONNECTOR_DVID:
1734                 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1735                 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1736                 if (i2c_bus->valid) {
1737                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1738                         if (!radeon_connector->ddc_bus)
1739                                 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1740                 }
1741                 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1742                         radeon_connector->dac_load_detect = true;
1743                         drm_connector_attach_property(&radeon_connector->base,
1744                                                       rdev->mode_info.load_detect_property,
1745                                                       1);
1746                 }
1747                 subpixel_order = SubPixelHorizontalRGB;
1748                 connector->interlace_allowed = true;
1749                 if (connector_type == DRM_MODE_CONNECTOR_DVII)
1750                         connector->doublescan_allowed = true;
1751                 else
1752                         connector->doublescan_allowed = false;
1753                 break;
1754         case DRM_MODE_CONNECTOR_SVIDEO:
1755         case DRM_MODE_CONNECTOR_Composite:
1756         case DRM_MODE_CONNECTOR_9PinDIN:
1757                 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1758                 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1759                 radeon_connector->dac_load_detect = true;
1760                 /* RS400,RC410,RS480 chipset seems to report a lot
1761                  * of false positive on load detect, we haven't yet
1762                  * found a way to make load detect reliable on those
1763                  * chipset, thus just disable it for TV.
1764                  */
1765                 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)
1766                         radeon_connector->dac_load_detect = false;
1767                 drm_connector_attach_property(&radeon_connector->base,
1768                                               rdev->mode_info.load_detect_property,
1769                                               radeon_connector->dac_load_detect);
1770                 drm_connector_attach_property(&radeon_connector->base,
1771                                               rdev->mode_info.tv_std_property,
1772                                               radeon_combios_get_tv_info(rdev));
1773                 /* no HPD on analog connectors */
1774                 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1775                 connector->interlace_allowed = false;
1776                 connector->doublescan_allowed = false;
1777                 break;
1778         case DRM_MODE_CONNECTOR_LVDS:
1779                 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1780                 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1781                 if (i2c_bus->valid) {
1782                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1783                         if (!radeon_connector->ddc_bus)
1784                                 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1785                 }
1786                 drm_connector_attach_property(&radeon_connector->base,
1787                                               dev->mode_config.scaling_mode_property,
1788                                               DRM_MODE_SCALE_FULLSCREEN);
1789                 subpixel_order = SubPixelHorizontalRGB;
1790                 connector->interlace_allowed = false;
1791                 connector->doublescan_allowed = false;
1792                 break;
1793         }
1794
1795         if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
1796                 if (i2c_bus->valid)
1797                         connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1798         } else
1799                 connector->polled = DRM_CONNECTOR_POLL_HPD;
1800         connector->display_info.subpixel_order = subpixel_order;
1801         drm_sysfs_connector_add(connector);
1802         if (connector_type == DRM_MODE_CONNECTOR_LVDS) {
1803                 struct drm_encoder *drm_encoder;
1804
1805                 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
1806                         struct radeon_encoder *radeon_encoder;
1807
1808                         radeon_encoder = to_radeon_encoder(drm_encoder);
1809                         if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS)
1810                                 radeon_legacy_backlight_init(radeon_encoder, connector);
1811                 }
1812         }
1813 }