瀏覽代碼

drm/radeon/kms: track audio engine state, do not use not setup timer

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>
Rafał Miłecki 15 年之前
父節點
當前提交
7eea7e9eea
共有 2 個文件被更改,包括 5 次插入2 次删除
  1. 4 2
      drivers/gpu/drm/radeon/r600_audio.c
  2. 1 0
      drivers/gpu/drm/radeon/radeon.h

+ 4 - 2
drivers/gpu/drm/radeon/r600_audio.c

@@ -160,6 +160,7 @@ static void r600_audio_engine_enable(struct radeon_device *rdev, bool enable)
 {
 {
 	DRM_INFO("%s audio support", enable ? "Enabling" : "Disabling");
 	DRM_INFO("%s audio support", enable ? "Enabling" : "Disabling");
 	WREG32_P(R600_AUDIO_ENABLE, enable ? 0x81000000 : 0x0, ~0x81000000);
 	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;
 		return;
 
 
 	radeon_encoder->audio_polling_active = 1;
 	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)
 void r600_audio_fini(struct radeon_device *rdev)
 {
 {
-	if (!radeon_audio || !r600_audio_chipset_supported(rdev))
+	if (!rdev->audio_enabled)
 		return;
 		return;
 
 
 	del_timer(&rdev->audio_timer);
 	del_timer(&rdev->audio_timer);

+ 1 - 0
drivers/gpu/drm/radeon/radeon.h

@@ -1084,6 +1084,7 @@ struct radeon_device {
 	struct mutex vram_mutex;
 	struct mutex vram_mutex;
 
 
 	/* audio stuff */
 	/* audio stuff */
+	bool			audio_enabled;
 	struct timer_list	audio_timer;
 	struct timer_list	audio_timer;
 	int			audio_channels;
 	int			audio_channels;
 	int			audio_rate;
 	int			audio_rate;