drm: Propagate error code from fb_create()
[deliverable/linux.git] / drivers / gpu / drm / radeon / radeon_display.c
index 12a54145b64a75484236825421e1567998b9a8e0..6130ec9ed502db0d049fee11296403049b3516aa 100644 (file)
@@ -319,6 +319,10 @@ static void radeon_print_display_setup(struct drm_device *dev)
                                 radeon_connector->ddc_bus->rec.en_data_reg,
                                 radeon_connector->ddc_bus->rec.y_clk_reg,
                                 radeon_connector->ddc_bus->rec.y_data_reg);
+                       if (radeon_connector->router_bus)
+                               DRM_INFO("  DDC Router 0x%x/0x%x\n",
+                                        radeon_connector->router.mux_control_pin,
+                                        radeon_connector->router.mux_state);
                } else {
                        if (connector->connector_type == DRM_MODE_CONNECTOR_VGA ||
                            connector->connector_type == DRM_MODE_CONNECTOR_DVII ||
@@ -395,6 +399,10 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
        struct radeon_device *rdev = dev->dev_private;
        int ret = 0;
 
+       /* on hw with routers, select right port */
+       if (radeon_connector->router.valid)
+               radeon_router_select_port(radeon_connector);
+
        if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
            (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
                struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
@@ -425,6 +433,10 @@ static int radeon_ddc_dump(struct drm_connector *connector)
        struct radeon_connector *radeon_connector = to_radeon_connector(connector);
        int ret = 0;
 
+       /* on hw with routers, select right port */
+       if (radeon_connector->router.valid)
+               radeon_router_select_port(radeon_connector);
+
        if (!radeon_connector->ddc_bus)
                return -1;
        edid = drm_get_edid(connector, &radeon_connector->ddc_bus->adapter);
@@ -876,13 +888,12 @@ radeon_user_framebuffer_create(struct drm_device *dev,
        if (obj ==  NULL) {
                dev_err(&dev->pdev->dev, "No GEM object associated to handle 0x%08X, "
                        "can't create framebuffer\n", mode_cmd->handle);
-               return NULL;
+               return ERR_PTR(-ENOENT);
        }
 
        radeon_fb = kzalloc(sizeof(*radeon_fb), GFP_KERNEL);
-       if (radeon_fb == NULL) {
-               return NULL;
-       }
+       if (radeon_fb == NULL)
+               return ERR_PTR(-ENOMEM);
 
        radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj);
 
@@ -921,6 +932,12 @@ static struct drm_prop_enum_list radeon_tv_std_enum_list[] =
        { TV_STD_SECAM, "secam" },
 };
 
+static struct drm_prop_enum_list radeon_underscan_enum_list[] =
+{      { UNDERSCAN_OFF, "off" },
+       { UNDERSCAN_ON, "on" },
+       { UNDERSCAN_AUTO, "auto" },
+};
+
 static int radeon_modeset_create_props(struct radeon_device *rdev)
 {
        int i, sz;
@@ -974,6 +991,18 @@ static int radeon_modeset_create_props(struct radeon_device *rdev)
                                      radeon_tv_std_enum_list[i].name);
        }
 
+       sz = ARRAY_SIZE(radeon_underscan_enum_list);
+       rdev->mode_info.underscan_property =
+               drm_property_create(rdev->ddev,
+                                   DRM_MODE_PROP_ENUM,
+                                   "underscan", sz);
+       for (i = 0; i < sz; i++) {
+               drm_property_add_enum(rdev->mode_info.underscan_property,
+                                     i,
+                                     radeon_underscan_enum_list[i].type,
+                                     radeon_underscan_enum_list[i].name);
+       }
+
        return 0;
 }
 
@@ -1022,6 +1051,9 @@ int radeon_modeset_init(struct radeon_device *rdev)
                return ret;
        }
 
+       /* init i2c buses */
+       radeon_i2c_init(rdev);
+
        /* check combios for a valid hardcoded EDID - Sun servers */
        if (!rdev->is_atom_bios) {
                /* check for hardcoded EDID in BIOS */
@@ -1062,6 +1094,8 @@ void radeon_modeset_fini(struct radeon_device *rdev)
                drm_mode_config_cleanup(rdev->ddev);
                rdev->mode_info.mode_config_initialized = false;
        }
+       /* free i2c buses */
+       radeon_i2c_fini(rdev);
 }
 
 bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
@@ -1069,17 +1103,26 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
                                struct drm_display_mode *adjusted_mode)
 {
        struct drm_device *dev = crtc->dev;
+       struct radeon_device *rdev = dev->dev_private;
        struct drm_encoder *encoder;
        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
        struct radeon_encoder *radeon_encoder;
+       struct drm_connector *connector;
+       struct radeon_connector *radeon_connector;
        bool first = true;
        u32 src_v = 1, dst_v = 1;
        u32 src_h = 1, dst_h = 1;
 
+       radeon_crtc->h_border = 0;
+       radeon_crtc->v_border = 0;
+
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
                if (encoder->crtc != crtc)
                        continue;
                radeon_encoder = to_radeon_encoder(encoder);
+               connector = radeon_get_connector_for_encoder(encoder);
+               radeon_connector = to_radeon_connector(connector);
+
                if (first) {
                        /* set scaling */
                        if (radeon_encoder->rmx_type == RMX_OFF)
@@ -1097,6 +1140,20 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
                        memcpy(&radeon_crtc->native_mode,
                               &radeon_encoder->native_mode,
                                sizeof(struct drm_display_mode));
+
+                       /* fix up for overscan on hdmi */
+                       if (ASIC_IS_AVIVO(rdev) &&
+                           ((radeon_encoder->underscan_type == UNDERSCAN_ON) ||
+                            ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
+                             drm_detect_hdmi_monitor(radeon_connector->edid)))) {
+                               radeon_crtc->h_border = (mode->hdisplay >> 5) + 16;
+                               radeon_crtc->v_border = (mode->vdisplay >> 5) + 16;
+                               radeon_crtc->rmx_type = RMX_FULL;
+                               src_v = crtc->mode.vdisplay;
+                               dst_v = crtc->mode.vdisplay - (radeon_crtc->v_border * 2);
+                               src_h = crtc->mode.hdisplay;
+                               dst_h = crtc->mode.hdisplay - (radeon_crtc->h_border * 2);
+                       }
                        first = false;
                } else {
                        if (radeon_crtc->rmx_type != radeon_encoder->rmx_type) {
This page took 0.157039 seconds and 5 git commands to generate.