If initializing accel on resume fails, fallback to no
accel.  This should fix resume if accel setup failed
initially or was forced off by the user.

Signed-off-by: Alex Deucher <alexdeucher at gmail.com>
---
 drivers/gpu/drm/radeon/evergreen.c |   40 ++++++++++++++++++---------------
 drivers/gpu/drm/radeon/r100.c      |   35 +++++++++++++++++++----------
 drivers/gpu/drm/radeon/r300.c      |   41 ++++++++++++++++++++++------------
 drivers/gpu/drm/radeon/r420.c      |   42 +++++++++++++++++++++++------------
 drivers/gpu/drm/radeon/r520.c      |   36 ++++++++++++++++++++----------
 drivers/gpu/drm/radeon/r600.c      |   39 ++++++++++++++++++---------------
 drivers/gpu/drm/radeon/rs400.c     |   34 +++++++++++++++++++---------
 drivers/gpu/drm/radeon/rs600.c     |   34 +++++++++++++++++++---------
 drivers/gpu/drm/radeon/rs690.c     |   34 +++++++++++++++++++---------
 drivers/gpu/drm/radeon/rv515.c     |   36 ++++++++++++++++++++----------
 drivers/gpu/drm/radeon/rv770.c     |   40 ++++++++++++++++++---------------
 11 files changed, 258 insertions(+), 153 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen.c 
b/drivers/gpu/drm/radeon/evergreen.c
index 480a362..4ac3998 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1992,6 +1992,17 @@ static int evergreen_startup(struct radeon_device *rdev)
        return 0;
 }

+static void evergreen_disable_accel(struct radeon_device *rdev)
+{
+       dev_err(rdev->dev, "disabling GPU acceleration\n");
+       r700_cp_fini(rdev);
+       r600_wb_fini(rdev);
+       r600_irq_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       evergreen_pcie_gart_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int evergreen_resume(struct radeon_device *rdev)
 {
        int r;
@@ -2009,15 +2020,14 @@ int evergreen_resume(struct radeon_device *rdev)
        }

        r = evergreen_startup(rdev);
-       if (r) {
-               DRM_ERROR("r600 startup failed on resume\n");
-               return r;
-       }
-
-       r = r600_ib_test(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
-               return r;
+       if (r || (radeon_accel == 0))
+               evergreen_disable_accel(rdev);
+       else {
+               r = r600_ib_test(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+                       return r;
+               }
        }

        return r;
@@ -2152,15 +2162,9 @@ int evergreen_init(struct radeon_device *rdev)

        rdev->accel_working = false;
        r = evergreen_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               dev_err(rdev->dev, "disabling GPU acceleration\n");
-               r700_cp_fini(rdev);
-               r600_wb_fini(rdev);
-               r600_irq_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               evergreen_pcie_gart_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               evergreen_disable_accel(rdev);
+
        if (rdev->accel_working) {
                r = radeon_ib_pool_init(rdev);
                if (r) {
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 54cc9df..71c076f 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -3778,8 +3778,23 @@ static int r100_startup(struct radeon_device *rdev)
        return 0;
 }

+static void r100_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       if (rdev->flags & RADEON_IS_PCI)
+               r100_pci_gart_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int r100_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        if (rdev->flags & RADEON_IS_PCI)
                r100_pci_gart_disable(rdev);
@@ -3797,7 +3812,11 @@ int r100_resume(struct radeon_device *rdev)
        r100_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return r100_startup(rdev);
+
+       r = r100_startup(rdev);
+       if (r || (radeon_accel == 0))
+               r100_disable_accel(rdev);
+       return 0;
 }

 int r100_suspend(struct radeon_device *rdev)
@@ -3898,16 +3917,8 @@ int r100_init(struct radeon_device *rdev)
        r100_set_safe_registers(rdev);
        rdev->accel_working = true;
        r = r100_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               if (rdev->flags & RADEON_IS_PCI)
-                       r100_pci_gart_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               r100_disable_accel(rdev);
+
        return 0;
 }
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index 30a9112..49a2855 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -1314,8 +1314,26 @@ static int r300_startup(struct radeon_device *rdev)
        return 0;
 }

+static void r300_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       if (rdev->flags & RADEON_IS_PCIE)
+               rv370_pcie_gart_fini(rdev);
+       if (rdev->flags & RADEON_IS_PCI)
+               r100_pci_gart_fini(rdev);
+       radeon_agp_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int r300_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        if (rdev->flags & RADEON_IS_PCIE)
                rv370_pcie_gart_disable(rdev);
@@ -1335,7 +1353,11 @@ int r300_resume(struct radeon_device *rdev)
        r300_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return r300_startup(rdev);
+
+       r = r300_startup(rdev);
+       if (r || (radeon_accel == 0))
+               r300_disable_accel(rdev);
+       return 0;
 }

 int r300_suspend(struct radeon_device *rdev)
@@ -1443,19 +1465,8 @@ int r300_init(struct radeon_device *rdev)
        r300_set_reg_safe(rdev);
        rdev->accel_working = true;
        r = r300_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               if (rdev->flags & RADEON_IS_PCIE)
-                       rv370_pcie_gart_fini(rdev);
-               if (rdev->flags & RADEON_IS_PCI)
-                       r100_pci_gart_fini(rdev);
-               radeon_agp_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               r300_disable_accel(rdev);
+
        return 0;
 }
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index ebb9017..4ef5b8f 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -231,8 +231,26 @@ static int r420_startup(struct radeon_device *rdev)
        return 0;
 }

+static void r420_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       if (rdev->flags & RADEON_IS_PCIE)
+               rv370_pcie_gart_fini(rdev);
+       if (rdev->flags & RADEON_IS_PCI)
+               r100_pci_gart_fini(rdev);
+       radeon_agp_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int r420_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        if (rdev->flags & RADEON_IS_PCIE)
                rv370_pcie_gart_disable(rdev);
@@ -256,7 +274,12 @@ int r420_resume(struct radeon_device *rdev)
        r420_clock_resume(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return r420_startup(rdev);
+
+       r = r420_startup(rdev);
+       if (r || (radeon_accel == 0))
+               r420_disable_accel(rdev);
+
+       return 0;
 }

 int r420_suspend(struct radeon_device *rdev)
@@ -376,20 +399,9 @@ int r420_init(struct radeon_device *rdev)
        r420_set_reg_safe(rdev);
        rdev->accel_working = true;
        r = r420_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               if (rdev->flags & RADEON_IS_PCIE)
-                       rv370_pcie_gart_fini(rdev);
-               if (rdev->flags & RADEON_IS_PCI)
-                       r100_pci_gart_fini(rdev);
-               radeon_agp_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               r420_disable_accel(rdev);
+
        return 0;
 }

diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c
index 38caca5..6b6b0ce 100644
--- a/drivers/gpu/drm/radeon/r520.c
+++ b/drivers/gpu/drm/radeon/r520.c
@@ -200,8 +200,23 @@ static int r520_startup(struct radeon_device *rdev)
        return 0;
 }

+static void r520_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+        dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       rv370_pcie_gart_fini(rdev);
+       radeon_agp_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int r520_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        if (rdev->flags & RADEON_IS_PCIE)
                rv370_pcie_gart_disable(rdev);
@@ -219,7 +234,12 @@ int r520_resume(struct radeon_device *rdev)
        rv515_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return r520_startup(rdev);
+
+       r = r520_startup(rdev);
+       if (r || (radeon_accel == 0))
+               r520_disable_accel(rdev);
+
+       return 0;
 }

 int r520_init(struct radeon_device *rdev)
@@ -290,16 +310,8 @@ int r520_init(struct radeon_device *rdev)
        rv515_set_safe_registers(rdev);
        rdev->accel_working = true;
        r = r520_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               rv370_pcie_gart_fini(rdev);
-               radeon_agp_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               r520_disable_accel(rdev);
+
        return 0;
 }
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 7876b58..5482ee7 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2197,6 +2197,17 @@ void r600_vga_set_state(struct radeon_device *rdev, bool 
state)
        WREG32(CONFIG_CNTL, temp);
 }

+static void r600_disable_accel(struct radeon_device *rdev)
+{
+       dev_err(rdev->dev, "disabling GPU acceleration\n");
+       r600_cp_fini(rdev);
+       r600_wb_fini(rdev);
+       r600_irq_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       r600_pcie_gart_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int r600_resume(struct radeon_device *rdev)
 {
        int r;
@@ -2214,15 +2225,14 @@ int r600_resume(struct radeon_device *rdev)
        }

        r = r600_startup(rdev);
-       if (r) {
-               DRM_ERROR("r600 startup failed on resume\n");
-               return r;
-       }
-
-       r = r600_ib_test(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
-               return r;
+       if (r || (radeon_accel == 0))
+               r600_disable_accel(rdev);
+       else {
+               r = r600_ib_test(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+                       return r;
+               }
        }

        r = r600_audio_init(rdev);
@@ -2342,15 +2352,8 @@ int r600_init(struct radeon_device *rdev)

        rdev->accel_working = true;
        r = r600_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               dev_err(rdev->dev, "disabling GPU acceleration\n");
-               r600_cp_fini(rdev);
-               r600_wb_fini(rdev);
-               r600_irq_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               r600_pcie_gart_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               r600_disable_accel(rdev);
        if (rdev->accel_working) {
                r = radeon_ib_pool_init(rdev);
                if (r) {
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index e36f193..1b930b4 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -422,8 +422,22 @@ static int rs400_startup(struct radeon_device *rdev)
        return 0;
 }

+static void rs400_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       rs400_gart_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int rs400_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        rs400_gart_disable(rdev);
        /* Resume clock before doing reset */
@@ -442,7 +456,12 @@ int rs400_resume(struct radeon_device *rdev)
        r300_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return rs400_startup(rdev);
+
+       r = rs400_startup(rdev);
+       if (r || (radeon_accel == 0))
+               rs400_disable_accel(rdev);
+
+       return 0;
 }

 int rs400_suspend(struct radeon_device *rdev)
@@ -528,15 +547,8 @@ int rs400_init(struct radeon_device *rdev)
        r300_set_reg_safe(rdev);
        rdev->accel_working = true;
        r = rs400_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               rs400_gart_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               rs400_disable_accel(rdev);
+
        return 0;
 }
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 0390a54..b9b5128 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -808,8 +808,22 @@ static int rs600_startup(struct radeon_device *rdev)
        return 0;
 }

+static void rs600_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       rs600_gart_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int rs600_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        rs600_gart_disable(rdev);
        /* Resume clock before doing reset */
@@ -826,7 +840,12 @@ int rs600_resume(struct radeon_device *rdev)
        rv515_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return rs600_startup(rdev);
+
+       r = rs600_startup(rdev);
+       if (r || (radeon_accel == 0))
+               rs600_disable_accel(rdev);
+
+       return 0;
 }

 int rs600_suspend(struct radeon_device *rdev)
@@ -912,15 +931,8 @@ int rs600_init(struct radeon_device *rdev)
        rs600_set_safe_registers(rdev);
        rdev->accel_working = true;
        r = rs600_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               rs600_gart_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               rs600_disable_accel(rdev);
+
        return 0;
 }
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index 1a38699..694927d 100644
--- a/drivers/gpu/drm/radeon/rs690.c
+++ b/drivers/gpu/drm/radeon/rs690.c
@@ -644,8 +644,22 @@ static int rs690_startup(struct radeon_device *rdev)
        return 0;
 }

+static void rs690_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       rs400_gart_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int rs690_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        rs400_gart_disable(rdev);
        /* Resume clock before doing reset */
@@ -662,7 +676,12 @@ int rs690_resume(struct radeon_device *rdev)
        rv515_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return rs690_startup(rdev);
+
+       r = rs690_startup(rdev);
+       if (r || (radeon_accel == 0))
+               rs690_disable_accel(rdev);
+
+       return 0;
 }

 int rs690_suspend(struct radeon_device *rdev)
@@ -749,15 +768,8 @@ int rs690_init(struct radeon_device *rdev)
        rs600_set_safe_registers(rdev);
        rdev->accel_working = true;
        r = rs690_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               rs400_gart_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               rs690_disable_accel(rdev);
+
        return 0;
 }
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index 104e285..e337842 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -405,8 +405,23 @@ static int rv515_startup(struct radeon_device *rdev)
        return 0;
 }

+static void rv515_disable_accel(struct radeon_device *rdev)
+{
+       /* Something went wrong with the accel init stop accel */
+       dev_err(rdev->dev, "Disabling GPU acceleration\n");
+       r100_cp_fini(rdev);
+       r100_wb_fini(rdev);
+       r100_ib_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       rv370_pcie_gart_fini(rdev);
+       radeon_agp_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int rv515_resume(struct radeon_device *rdev)
 {
+       int r;
+
        /* Make sur GART are not working */
        if (rdev->flags & RADEON_IS_PCIE)
                rv370_pcie_gart_disable(rdev);
@@ -424,7 +439,12 @@ int rv515_resume(struct radeon_device *rdev)
        rv515_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
-       return rv515_startup(rdev);
+
+       r = rv515_startup(rdev);
+       if (r || (radeon_accel == 0))
+               rv515_disable_accel(rdev);
+
+       return 0;
 }

 int rv515_suspend(struct radeon_device *rdev)
@@ -523,17 +543,9 @@ int rv515_init(struct radeon_device *rdev)
        rv515_set_safe_registers(rdev);
        rdev->accel_working = true;
        r = rv515_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               /* Somethings want wront with the accel init stop accel */
-               dev_err(rdev->dev, "Disabling GPU acceleration\n");
-               r100_cp_fini(rdev);
-               r100_wb_fini(rdev);
-               r100_ib_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               rv370_pcie_gart_fini(rdev);
-               radeon_agp_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               rv515_disable_accel(rdev);
+
        return 0;
 }

diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 7a959fa..7f03d4e 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -983,6 +983,17 @@ static int rv770_startup(struct radeon_device *rdev)
        return 0;
 }

+static void rv770_disable_accel(struct radeon_device *rdev)
+{
+       dev_err(rdev->dev, "disabling GPU acceleration\n");
+       r700_cp_fini(rdev);
+       r600_wb_fini(rdev);
+       r600_irq_fini(rdev);
+       radeon_irq_kms_fini(rdev);
+       rv770_pcie_gart_fini(rdev);
+       rdev->accel_working = false;
+}
+
 int rv770_resume(struct radeon_device *rdev)
 {
        int r;
@@ -1000,15 +1011,14 @@ int rv770_resume(struct radeon_device *rdev)
        }

        r = rv770_startup(rdev);
-       if (r) {
-               DRM_ERROR("r600 startup failed on resume\n");
-               return r;
-       }
-
-       r = r600_ib_test(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
-               return r;
+       if (r || (radeon_accel == 0))
+               rv770_disable_accel(rdev);
+       else {
+               r = r600_ib_test(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+                       return r;
+               }
        }

        r = r600_audio_init(rdev);
@@ -1127,15 +1137,9 @@ int rv770_init(struct radeon_device *rdev)

        rdev->accel_working = true;
        r = rv770_startup(rdev);
-       if (r || (radeon_accel == 0)) {
-               dev_err(rdev->dev, "disabling GPU acceleration\n");
-               r700_cp_fini(rdev);
-               r600_wb_fini(rdev);
-               r600_irq_fini(rdev);
-               radeon_irq_kms_fini(rdev);
-               rv770_pcie_gart_fini(rdev);
-               rdev->accel_working = false;
-       }
+       if (r || (radeon_accel == 0))
+               rv770_disable_accel(rdev);
+
        if (rdev->accel_working) {
                r = radeon_ib_pool_init(rdev);
                if (r) {
-- 
1.5.6.3

Reply via email to