drm/radeon/kms: respect single crtc cards, only create one crtc. (v2)
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / radeon / radeon_display.c
index 9d817a62e7f1aac65d7708eb593bc57a1ec84497..44cfcfdf1352d5e257fad7ad24032532cc533ab5 100644 (file)
@@ -365,7 +365,7 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
                return ret;
        }
        drm_mode_connector_update_edid_property(&radeon_connector->base, NULL);
-       return -1;
+       return 0;
 }
 
 static int radeon_ddc_dump(struct drm_connector *connector)
@@ -623,6 +623,83 @@ static const struct drm_mode_config_funcs radeon_mode_funcs = {
        .fb_changed = radeonfb_probe,
 };
 
+struct drm_prop_enum_list {
+       int type;
+       char *name;
+};
+
+static struct drm_prop_enum_list radeon_tmds_pll_enum_list[] =
+{      { 0, "driver" },
+       { 1, "bios" },
+};
+
+static struct drm_prop_enum_list radeon_tv_std_enum_list[] =
+{      { TV_STD_NTSC, "ntsc" },
+       { TV_STD_PAL, "pal" },
+       { TV_STD_PAL_M, "pal-m" },
+       { TV_STD_PAL_60, "pal-60" },
+       { TV_STD_NTSC_J, "ntsc-j" },
+       { TV_STD_SCART_PAL, "scart-pal" },
+       { TV_STD_PAL_CN, "pal-cn" },
+       { TV_STD_SECAM, "secam" },
+};
+
+int radeon_modeset_create_props(struct radeon_device *rdev)
+{
+       int i, sz;
+
+       if (rdev->is_atom_bios) {
+               rdev->mode_info.coherent_mode_property =
+                       drm_property_create(rdev->ddev,
+                                           DRM_MODE_PROP_RANGE,
+                                           "coherent", 2);
+               if (!rdev->mode_info.coherent_mode_property)
+                       return -ENOMEM;
+
+               rdev->mode_info.coherent_mode_property->values[0] = 0;
+               rdev->mode_info.coherent_mode_property->values[0] = 1;
+       }
+
+       if (!ASIC_IS_AVIVO(rdev)) {
+               sz = ARRAY_SIZE(radeon_tmds_pll_enum_list);
+               rdev->mode_info.tmds_pll_property =
+                       drm_property_create(rdev->ddev,
+                                           DRM_MODE_PROP_ENUM,
+                                           "tmds_pll", sz);
+               for (i = 0; i < sz; i++) {
+                       drm_property_add_enum(rdev->mode_info.tmds_pll_property,
+                                             i,
+                                             radeon_tmds_pll_enum_list[i].type,
+                                             radeon_tmds_pll_enum_list[i].name);
+               }
+       }
+
+       rdev->mode_info.load_detect_property =
+               drm_property_create(rdev->ddev,
+                                   DRM_MODE_PROP_RANGE,
+                                   "load detection", 2);
+       if (!rdev->mode_info.load_detect_property)
+               return -ENOMEM;
+       rdev->mode_info.load_detect_property->values[0] = 0;
+       rdev->mode_info.load_detect_property->values[0] = 1;
+
+       drm_mode_create_scaling_mode_property(rdev->ddev);
+
+       sz = ARRAY_SIZE(radeon_tv_std_enum_list);
+       rdev->mode_info.tv_std_property =
+               drm_property_create(rdev->ddev,
+                                   DRM_MODE_PROP_ENUM,
+                                   "tv standard", sz);
+       for (i = 0; i < sz; i++) {
+               drm_property_add_enum(rdev->mode_info.tv_std_property,
+                                     i,
+                                     radeon_tv_std_enum_list[i].type,
+                                     radeon_tv_std_enum_list[i].name);
+       }
+
+       return 0;
+}
+
 int radeon_modeset_init(struct radeon_device *rdev)
 {
        int num_crtc = 2, i;
@@ -643,7 +720,15 @@ int radeon_modeset_init(struct radeon_device *rdev)
 
        rdev->ddev->mode_config.fb_base = rdev->mc.aper_base;
 
-       /* allocate crtcs - TODO single crtc */
+       ret = radeon_modeset_create_props(rdev);
+       if (ret) {
+               return ret;
+       }
+
+       if (rdev->flags & RADEON_SINGLE_CRTC)
+               num_crtc = 1;
+
+       /* allocate crtcs */
        for (i = 0; i < num_crtc; i++) {
                radeon_crtc_init(rdev->ddev, i);
        }