]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/gpu/drm/i915/i915_dma.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt...
[net-next-2.6.git] / drivers / gpu / drm / i915 / i915_dma.c
index e50ae3c6cb6e437adbfdb8239b7048cfba211a59..f00c5ae9556ccb47358ce1f5267dd9cc5cb17a21 100644 (file)
@@ -1322,12 +1322,14 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
        struct drm_device *dev = pci_get_drvdata(pdev);
        pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
        if (state == VGA_SWITCHEROO_ON) {
-               printk(KERN_INFO "i915: switched off\n");
+               printk(KERN_INFO "i915: switched on\n");
                /* i915 resume handler doesn't set to D0 */
                pci_set_power_state(dev->pdev, PCI_D0);
                i915_resume(dev);
+               drm_kms_helper_poll_enable(dev);
        } else {
                printk(KERN_ERR "i915: switched off\n");
+               drm_kms_helper_poll_disable(dev);
                i915_suspend(dev, pmm);
        }
 }
@@ -1402,13 +1404,13 @@ static int i915_load_modeset_init(struct drm_device *dev,
        /* if we have > 1 VGA cards, then disable the radeon VGA resources */
        ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
        if (ret)
-               goto destroy_ringbuffer;
+               goto cleanup_ringbuffer;
 
        ret = vga_switcheroo_register_client(dev->pdev,
                                             i915_switcheroo_set_state,
                                             i915_switcheroo_can_switch);
        if (ret)
-               goto destroy_ringbuffer;
+               goto cleanup_vga_client;
 
        /* IIR "flip pending" bit means done if this bit is set */
        if (IS_GEN3(dev) && (I915_READ(ECOSKPD) & ECO_FLIP_DONE))
@@ -1418,7 +1420,7 @@ static int i915_load_modeset_init(struct drm_device *dev,
 
        ret = drm_irq_install(dev);
        if (ret)
-               goto destroy_ringbuffer;
+               goto cleanup_vga_switcheroo;
 
        /* Always safe in the mode setting case. */
        /* FIXME: do pre/post-mode set stuff in core KMS code */
@@ -1430,11 +1432,20 @@ static int i915_load_modeset_init(struct drm_device *dev,
 
        I915_WRITE(INSTPM, (1 << 5) | (1 << 21));
 
-       intel_fbdev_init(dev);
+       ret = intel_fbdev_init(dev);
+       if (ret)
+               goto cleanup_irq;
+
        drm_kms_helper_poll_init(dev);
        return 0;
 
-destroy_ringbuffer:
+cleanup_irq:
+       drm_irq_uninstall(dev);
+cleanup_vga_switcheroo:
+       vga_switcheroo_unregister_client(dev->pdev);
+cleanup_vga_client:
+       vga_client_register(dev->pdev, NULL, NULL, NULL);
+cleanup_ringbuffer:
        mutex_lock(&dev->struct_mutex);
        i915_gem_cleanup_ringbuffer(dev);
        mutex_unlock(&dev->struct_mutex);