drm/connector: Allow max possible encoders to attach to a connector
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_connectors.c
index 73b2ede773d33708f0b9649a203f59a6c5433fb5..d8729285f7310f510858a971559388b21f65a6a7 100644 (file)
@@ -217,11 +217,10 @@ amdgpu_connector_update_scratch_regs(struct drm_connector *connector,
        struct drm_encoder *encoder;
        const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
        bool connected;
-       int i;
 
        best_encoder = connector_funcs->best_encoder(connector);
 
-       drm_connector_for_each_possible_encoder(connector, encoder, i) {
+       drm_connector_for_each_possible_encoder(connector, encoder) {
                if ((encoder == best_encoder) && (status == connector_status_connected))
                        connected = true;
                else
@@ -236,9 +235,8 @@ amdgpu_connector_find_encoder(struct drm_connector *connector,
                               int encoder_type)
 {
        struct drm_encoder *encoder;
-       int i;
 
-       drm_connector_for_each_possible_encoder(connector, encoder, i) {
+       drm_connector_for_each_possible_encoder(connector, encoder) {
                if (encoder->encoder_type == encoder_type)
                        return encoder;
        }
@@ -347,10 +345,9 @@ static struct drm_encoder *
 amdgpu_connector_best_single_encoder(struct drm_connector *connector)
 {
        struct drm_encoder *encoder;
-       int i;
 
        /* pick the first one */
-       drm_connector_for_each_possible_encoder(connector, encoder, i)
+       drm_connector_for_each_possible_encoder(connector, encoder)
                return encoder;
 
        return NULL;
@@ -1065,9 +1062,8 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
        /* find analog encoder */
        if (amdgpu_connector->dac_load_detect) {
                struct drm_encoder *encoder;
-               int i;
 
-               drm_connector_for_each_possible_encoder(connector, encoder, i) {
+               drm_connector_for_each_possible_encoder(connector, encoder) {
                        if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
                            encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
                                continue;
@@ -1117,9 +1113,8 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
 {
        struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
        struct drm_encoder *encoder;
-       int i;
 
-       drm_connector_for_each_possible_encoder(connector, encoder, i) {
+       drm_connector_for_each_possible_encoder(connector, encoder) {
                if (amdgpu_connector->use_digital == true) {
                        if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
                                return encoder;
@@ -1134,7 +1129,7 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
 
        /* then check use digitial */
        /* pick the first one */
-       drm_connector_for_each_possible_encoder(connector, encoder, i)
+       drm_connector_for_each_possible_encoder(connector, encoder)
                return encoder;
 
        return NULL;
@@ -1271,9 +1266,8 @@ u16 amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
 {
        struct drm_encoder *encoder;
        struct amdgpu_encoder *amdgpu_encoder;
-       int i;
 
-       drm_connector_for_each_possible_encoder(connector, encoder, i) {
+       drm_connector_for_each_possible_encoder(connector, encoder) {
                amdgpu_encoder = to_amdgpu_encoder(encoder);
 
                switch (amdgpu_encoder->encoder_id) {
@@ -1292,10 +1286,9 @@ static bool amdgpu_connector_encoder_is_hbr2(struct drm_connector *connector)
 {
        struct drm_encoder *encoder;
        struct amdgpu_encoder *amdgpu_encoder;
-       int i;
        bool found = false;
 
-       drm_connector_for_each_possible_encoder(connector, encoder, i) {
+       drm_connector_for_each_possible_encoder(connector, encoder) {
                amdgpu_encoder = to_amdgpu_encoder(encoder);
                if (amdgpu_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
                        found = true;
@@ -1505,6 +1498,7 @@ amdgpu_connector_add(struct amdgpu_device *adev,
        struct amdgpu_connector_atom_dig *amdgpu_dig_connector;
        struct drm_encoder *encoder;
        struct amdgpu_encoder *amdgpu_encoder;
+       struct i2c_adapter *ddc = NULL;
        uint32_t subpixel_order = SubPixelNone;
        bool shared_ddc = false;
        bool is_dp_bridge = false;
@@ -1574,17 +1568,21 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                amdgpu_connector->con_priv = amdgpu_dig_connector;
                if (i2c_bus->valid) {
                        amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
-                       if (amdgpu_connector->ddc_bus)
+                       if (amdgpu_connector->ddc_bus) {
                                has_aux = true;
-                       else
+                               ddc = &amdgpu_connector->ddc_bus->adapter;
+                       } else {
                                DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                       }
                }
                switch (connector_type) {
                case DRM_MODE_CONNECTOR_VGA:
                case DRM_MODE_CONNECTOR_DVIA:
                default:
-                       drm_connector_init(dev, &amdgpu_connector->base,
-                                          &amdgpu_connector_dp_funcs, connector_type);
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_dp_funcs,
+                                                   connector_type,
+                                                   ddc);
                        drm_connector_helper_add(&amdgpu_connector->base,
                                                 &amdgpu_connector_dp_helper_funcs);
                        connector->interlace_allowed = true;
@@ -1602,8 +1600,10 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                case DRM_MODE_CONNECTOR_HDMIA:
                case DRM_MODE_CONNECTOR_HDMIB:
                case DRM_MODE_CONNECTOR_DisplayPort:
-                       drm_connector_init(dev, &amdgpu_connector->base,
-                                          &amdgpu_connector_dp_funcs, connector_type);
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_dp_funcs,
+                                                   connector_type,
+                                                   ddc);
                        drm_connector_helper_add(&amdgpu_connector->base,
                                                 &amdgpu_connector_dp_helper_funcs);
                        drm_object_attach_property(&amdgpu_connector->base.base,
@@ -1644,8 +1644,10 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        break;
                case DRM_MODE_CONNECTOR_LVDS:
                case DRM_MODE_CONNECTOR_eDP:
-                       drm_connector_init(dev, &amdgpu_connector->base,
-                                          &amdgpu_connector_edp_funcs, connector_type);
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_edp_funcs,
+                                                   connector_type,
+                                                   ddc);
                        drm_connector_helper_add(&amdgpu_connector->base,
                                                 &amdgpu_connector_dp_helper_funcs);
                        drm_object_attach_property(&amdgpu_connector->base.base,
@@ -1659,13 +1661,18 @@ amdgpu_connector_add(struct amdgpu_device *adev,
        } else {
                switch (connector_type) {
                case DRM_MODE_CONNECTOR_VGA:
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_vga_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_vga_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
                                if (!amdgpu_connector->ddc_bus)
                                        DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_vga_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_vga_helper_funcs);
                        amdgpu_connector->dac_load_detect = true;
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      adev->mode_info.load_detect_property,
@@ -1679,13 +1686,18 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        connector->doublescan_allowed = true;
                        break;
                case DRM_MODE_CONNECTOR_DVIA:
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_vga_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_vga_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
                                if (!amdgpu_connector->ddc_bus)
                                        DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_vga_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_vga_helper_funcs);
                        amdgpu_connector->dac_load_detect = true;
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      adev->mode_info.load_detect_property,
@@ -1704,13 +1716,18 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        if (!amdgpu_dig_connector)
                                goto failed;
                        amdgpu_connector->con_priv = amdgpu_dig_connector;
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_dvi_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dvi_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
                                if (!amdgpu_connector->ddc_bus)
                                        DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_dvi_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dvi_helper_funcs);
                        subpixel_order = SubPixelHorizontalRGB;
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      adev->mode_info.coherent_mode_property,
@@ -1754,13 +1771,18 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        if (!amdgpu_dig_connector)
                                goto failed;
                        amdgpu_connector->con_priv = amdgpu_dig_connector;
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_dvi_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dvi_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
                                if (!amdgpu_connector->ddc_bus)
                                        DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_dvi_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dvi_helper_funcs);
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      adev->mode_info.coherent_mode_property,
                                                      1);
@@ -1796,15 +1818,20 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        if (!amdgpu_dig_connector)
                                goto failed;
                        amdgpu_connector->con_priv = amdgpu_dig_connector;
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_dp_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dp_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
-                               if (amdgpu_connector->ddc_bus)
+                               if (amdgpu_connector->ddc_bus) {
                                        has_aux = true;
-                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
+                               } else {
                                        DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               }
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_dp_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dp_helper_funcs);
                        subpixel_order = SubPixelHorizontalRGB;
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      adev->mode_info.coherent_mode_property,
@@ -1838,15 +1865,20 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        if (!amdgpu_dig_connector)
                                goto failed;
                        amdgpu_connector->con_priv = amdgpu_dig_connector;
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_edp_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dp_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
-                               if (amdgpu_connector->ddc_bus)
+                               if (amdgpu_connector->ddc_bus) {
                                        has_aux = true;
-                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
+                               } else {
                                        DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               }
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_edp_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dp_helper_funcs);
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      dev->mode_config.scaling_mode_property,
                                                      DRM_MODE_SCALE_FULLSCREEN);
@@ -1859,13 +1891,18 @@ amdgpu_connector_add(struct amdgpu_device *adev,
                        if (!amdgpu_dig_connector)
                                goto failed;
                        amdgpu_connector->con_priv = amdgpu_dig_connector;
-                       drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_lvds_funcs, connector_type);
-                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_lvds_helper_funcs);
                        if (i2c_bus->valid) {
                                amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
                                if (!amdgpu_connector->ddc_bus)
                                        DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
+                               else
+                                       ddc = &amdgpu_connector->ddc_bus->adapter;
                        }
+                       drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
+                                                   &amdgpu_connector_lvds_funcs,
+                                                   connector_type,
+                                                   ddc);
+                       drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_lvds_helper_funcs);
                        drm_object_attach_property(&amdgpu_connector->base.base,
                                                      dev->mode_config.scaling_mode_property,
                                                      DRM_MODE_SCALE_FULLSCREEN);