gma500: Fix crash on D2700MUD and various other boards
authorAlan Cox <alan@linux.intel.com>
Mon, 14 May 2012 11:03:34 +0000 (12:03 +0100)
committerDave Airlie <airlied@redhat.com>
Thu, 17 May 2012 10:05:29 +0000 (11:05 +0100)
The recent changes led to the lid timer code being run on various devices.
It does no harm on most but isn't needed. It also calls unconditionally
into the Poulsbo backlight code which goes bang on Cedartrail.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/gma500/psb_device.c
drivers/gpu/drm/gma500/psb_drv.c

index 651af6768e144aaa76a7f3c2e9d90864e852e4a7..6a67cec33845b3b38f99a4667fe56b8f7cfd075f 100644 (file)
@@ -352,8 +352,17 @@ static int psb_chip_setup(struct drm_device *dev)
        return 0;
 }
 
+/* Not exactly an erratum more an irritation */
+static int psb_chip_errata(struct drm_device *dev)
+{
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       psb_lid_timer_init(dev_priv);
+}
+
 static void psb_chip_teardown(struct drm_device *dev)
 {
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       psb_lid_timer_takedown(dev_priv);
        gma_intel_teardown_gmbus(dev);
 }
 
@@ -367,6 +376,7 @@ const struct psb_ops psb_chip_ops = {
        .sgx_offset = PSB_SGX_OFFSET,
        .chip_setup = psb_chip_setup,
        .chip_teardown = psb_chip_teardown,
+       .errata = psb_chip_errata,
 
        .crtc_helper = &psb_intel_helper_funcs,
        .crtc_funcs = &psb_intel_crtc_funcs,
index 7473d3b8fffe20ffcd643ea1609f8512b89cbd6c..c4c6c8ea129ab1aac99d80d77307bdfe7518be4c 100644 (file)
@@ -208,11 +208,11 @@ static int psb_driver_unload(struct drm_device *dev)
        psb_modeset_cleanup(dev);
 
        if (dev_priv) {
-               psb_intel_opregion_fini(dev);
-               psb_lid_timer_takedown(dev_priv);
 
                if (dev_priv->ops->chip_teardown)
                        dev_priv->ops->chip_teardown(dev);
+
+               psb_intel_opregion_fini(dev);
                psb_do_takedown(dev);
 
 
@@ -336,8 +336,6 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
        PSB_WSGX32(0x30000000, PSB_CR_BIF_3D_REQ_BASE);
 
        acpi_video_register();
-       if (dev_priv->opregion.lid_state)
-               psb_lid_timer_init(dev_priv);
 
        ret = drm_vblank_init(dev, dev_priv->num_pipe);
        if (ret)