drm/radeon/kms: track audio engine state, do not use not setup timer
authorRafał Miłecki <zajec5@gmail.com>
Sat, 19 Jun 2010 10:24:56 +0000 (12:24 +0200)
committerDave Airlie <airlied@redhat.com>
Mon, 2 Aug 2010 00:00:06 +0000 (10:00 +1000)
This is needed to enable audio support on devices using polling. In case user
decides to disable audio (module parameter) we still will try to use timer in
r600_audio_enable_polling. This would lead to BUG in kernel/timer.c.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/r600_audio.c
drivers/gpu/drm/radeon/radeon.h

index 2b26553c352cdf6bd63495ae9f40b3f95a259030..631e1edc373a60b0dbc34b4bf71c39fa5b8e24e0 100644 (file)
@@ -160,6 +160,7 @@ static void r600_audio_engine_enable(struct radeon_device *rdev, bool enable)
 {
        DRM_INFO("%s audio support", enable ? "Enabling" : "Disabling");
        WREG32_P(R600_AUDIO_ENABLE, enable ? 0x81000000 : 0x0, ~0x81000000);
+       rdev->audio_enabled = enable;
 }
 
 /*
@@ -200,7 +201,8 @@ void r600_audio_enable_polling(struct drm_encoder *encoder)
                return;
 
        radeon_encoder->audio_polling_active = 1;
-       mod_timer(&rdev->audio_timer, jiffies + 1);
+       if (rdev->audio_enabled)
+               mod_timer(&rdev->audio_timer, jiffies + 1);
 }
 
 /*
@@ -266,7 +268,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock)
  */
 void r600_audio_fini(struct radeon_device *rdev)
 {
-       if (!radeon_audio || !r600_audio_chipset_supported(rdev))
+       if (!rdev->audio_enabled)
                return;
 
        del_timer(&rdev->audio_timer);
index be8420e65f01b8b15a30249d514ff3b42b31401c..03141755c2eab2fdcc83b8d47825f784d409e9c7 100644 (file)
@@ -1084,6 +1084,7 @@ struct radeon_device {
        struct mutex vram_mutex;
 
        /* audio stuff */
+       bool                    audio_enabled;
        struct timer_list       audio_timer;
        int                     audio_channels;
        int                     audio_rate;