aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_connector.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_connector.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_connector.c54
1 files changed, 15 insertions, 39 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 939d4df07777..cea6696b1906 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -39,7 +39,7 @@
39 39
40static void nouveau_connector_hotplug(void *, int); 40static void nouveau_connector_hotplug(void *, int);
41 41
42static struct nouveau_encoder * 42struct nouveau_encoder *
43find_encoder(struct drm_connector *connector, int type) 43find_encoder(struct drm_connector *connector, int type)
44{ 44{
45 struct drm_device *dev = connector->dev; 45 struct drm_device *dev = connector->dev;
@@ -116,10 +116,6 @@ nouveau_connector_destroy(struct drm_connector *connector)
116 nouveau_connector_hotplug, connector); 116 nouveau_connector_hotplug, connector);
117 } 117 }
118 118
119 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
120 connector->connector_type == DRM_MODE_CONNECTOR_eDP)
121 nouveau_backlight_exit(connector);
122
123 kfree(nv_connector->edid); 119 kfree(nv_connector->edid);
124 drm_sysfs_connector_remove(connector); 120 drm_sysfs_connector_remove(connector);
125 drm_connector_cleanup(connector); 121 drm_connector_cleanup(connector);
@@ -712,12 +708,9 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
712 case OUTPUT_TV: 708 case OUTPUT_TV:
713 return get_slave_funcs(encoder)->mode_valid(encoder, mode); 709 return get_slave_funcs(encoder)->mode_valid(encoder, mode);
714 case OUTPUT_DP: 710 case OUTPUT_DP:
715 if (nv_encoder->dp.link_bw == DP_LINK_BW_2_7) 711 max_clock = nv_encoder->dp.link_nr;
716 max_clock = nv_encoder->dp.link_nr * 270000; 712 max_clock *= nv_encoder->dp.link_bw;
717 else 713 clock = clock * nouveau_connector_bpp(connector) / 10;
718 max_clock = nv_encoder->dp.link_nr * 162000;
719
720 clock = clock * nouveau_connector_bpp(connector) / 8;
721 break; 714 break;
722 default: 715 default:
723 BUG_ON(1); 716 BUG_ON(1);
@@ -871,7 +864,6 @@ nouveau_connector_create(struct drm_device *dev, int index)
871 dev->mode_config.scaling_mode_property, 864 dev->mode_config.scaling_mode_property,
872 nv_connector->scaling_mode); 865 nv_connector->scaling_mode);
873 } 866 }
874 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
875 /* fall-through */ 867 /* fall-through */
876 case DCB_CONNECTOR_TV_0: 868 case DCB_CONNECTOR_TV_0:
877 case DCB_CONNECTOR_TV_1: 869 case DCB_CONNECTOR_TV_1:
@@ -888,27 +880,20 @@ nouveau_connector_create(struct drm_device *dev, int index)
888 dev->mode_config.dithering_mode_property, 880 dev->mode_config.dithering_mode_property,
889 nv_connector->use_dithering ? 881 nv_connector->use_dithering ?
890 DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF); 882 DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF);
891
892 if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS) {
893 if (dev_priv->card_type >= NV_50)
894 connector->polled = DRM_CONNECTOR_POLL_HPD;
895 else
896 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
897 }
898 break; 883 break;
899 } 884 }
900 885
901 if (pgpio->irq_register) { 886 if (nv_connector->dcb->gpio_tag != 0xff && pgpio->irq_register) {
902 pgpio->irq_register(dev, nv_connector->dcb->gpio_tag, 887 pgpio->irq_register(dev, nv_connector->dcb->gpio_tag,
903 nouveau_connector_hotplug, connector); 888 nouveau_connector_hotplug, connector);
889
890 connector->polled = DRM_CONNECTOR_POLL_HPD;
891 } else {
892 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
904 } 893 }
905 894
906 drm_sysfs_connector_add(connector); 895 drm_sysfs_connector_add(connector);
907 896
908 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
909 connector->connector_type == DRM_MODE_CONNECTOR_eDP)
910 nouveau_backlight_init(connector);
911
912 dcb->drm = connector; 897 dcb->drm = connector;
913 return dcb->drm; 898 return dcb->drm;
914 899
@@ -925,22 +910,13 @@ nouveau_connector_hotplug(void *data, int plugged)
925 struct drm_connector *connector = data; 910 struct drm_connector *connector = data;
926 struct drm_device *dev = connector->dev; 911 struct drm_device *dev = connector->dev;
927 912
928 NV_INFO(dev, "%splugged %s\n", plugged ? "" : "un", 913 NV_DEBUG(dev, "%splugged %s\n", plugged ? "" : "un",
929 drm_get_connector_name(connector)); 914 drm_get_connector_name(connector));
930
931 if (connector->encoder && connector->encoder->crtc &&
932 connector->encoder->crtc->enabled) {
933 struct nouveau_encoder *nv_encoder = nouveau_encoder(connector->encoder);
934 struct drm_encoder_helper_funcs *helper =
935 connector->encoder->helper_private;
936 915
937 if (nv_encoder->dcb->type == OUTPUT_DP) { 916 if (plugged)
938 if (plugged) 917 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
939 helper->dpms(connector->encoder, DRM_MODE_DPMS_ON); 918 else
940 else 919 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
941 helper->dpms(connector->encoder, DRM_MODE_DPMS_OFF);
942 }
943 }
944 920
945 drm_helper_hpd_irq_event(dev); 921 drm_helper_hpd_irq_event(dev);
946} 922}