Commit fe50ac78 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Dave Airlie

drm/radeon/kms: enable HDMI audio on RS600/RS690/RS740

We will need method of selecting encoder that should receive HDMI block. For
now we assign HDMI block to first enabled encoder. Hopefully there are not many
RS6x0 chips with two digital encoders.

[airlied: add RS740 checks as per Alex suggestion.]
Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 7eea7e9e
...@@ -435,7 +435,8 @@ static int r600_hdmi_find_free_block(struct drm_device *dev) ...@@ -435,7 +435,8 @@ static int r600_hdmi_find_free_block(struct drm_device *dev)
} }
} }
if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690) { if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690 ||
rdev->family == CHIP_RS740) {
return free_blocks[0] ? R600_HDMI_BLOCK1 : 0; return free_blocks[0] ? R600_HDMI_BLOCK1 : 0;
} else if (rdev->family >= CHIP_R600) { } else if (rdev->family >= CHIP_R600) {
if (free_blocks[0]) if (free_blocks[0])
...@@ -466,7 +467,8 @@ static void r600_hdmi_assign_block(struct drm_encoder *encoder) ...@@ -466,7 +467,8 @@ static void r600_hdmi_assign_block(struct drm_encoder *encoder)
if (ASIC_IS_DCE32(rdev)) if (ASIC_IS_DCE32(rdev))
radeon_encoder->hdmi_config_offset = dig->dig_encoder ? radeon_encoder->hdmi_config_offset = dig->dig_encoder ?
R600_HDMI_CONFIG2 : R600_HDMI_CONFIG1; R600_HDMI_CONFIG2 : R600_HDMI_CONFIG1;
} else if (rdev->family >= CHIP_R600) { } else if (rdev->family >= CHIP_R600 || rdev->family == CHIP_RS600 ||
rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {
radeon_encoder->hdmi_offset = r600_hdmi_find_free_block(dev); radeon_encoder->hdmi_offset = r600_hdmi_find_free_block(dev);
} }
} }
......
...@@ -812,6 +812,13 @@ static int rs600_startup(struct radeon_device *rdev) ...@@ -812,6 +812,13 @@ static int rs600_startup(struct radeon_device *rdev)
dev_err(rdev->dev, "failled initializing IB (%d).\n", r); dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
return r; return r;
} }
r = r600_audio_init(rdev);
if (r) {
dev_err(rdev->dev, "failed initializing audio\n");
return r;
}
return 0; return 0;
} }
...@@ -838,6 +845,7 @@ int rs600_resume(struct radeon_device *rdev) ...@@ -838,6 +845,7 @@ int rs600_resume(struct radeon_device *rdev)
int rs600_suspend(struct radeon_device *rdev) int rs600_suspend(struct radeon_device *rdev)
{ {
r600_audio_fini(rdev);
r100_cp_disable(rdev); r100_cp_disable(rdev);
r100_wb_disable(rdev); r100_wb_disable(rdev);
rs600_irq_disable(rdev); rs600_irq_disable(rdev);
...@@ -847,6 +855,7 @@ int rs600_suspend(struct radeon_device *rdev) ...@@ -847,6 +855,7 @@ int rs600_suspend(struct radeon_device *rdev)
void rs600_fini(struct radeon_device *rdev) void rs600_fini(struct radeon_device *rdev)
{ {
r600_audio_fini(rdev);
r100_cp_fini(rdev); r100_cp_fini(rdev);
r100_wb_fini(rdev); r100_wb_fini(rdev);
r100_ib_fini(rdev); r100_ib_fini(rdev);
......
...@@ -640,6 +640,13 @@ static int rs690_startup(struct radeon_device *rdev) ...@@ -640,6 +640,13 @@ static int rs690_startup(struct radeon_device *rdev)
dev_err(rdev->dev, "failled initializing IB (%d).\n", r); dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
return r; return r;
} }
r = r600_audio_init(rdev);
if (r) {
dev_err(rdev->dev, "failed initializing audio\n");
return r;
}
return 0; return 0;
} }
...@@ -666,6 +673,7 @@ int rs690_resume(struct radeon_device *rdev) ...@@ -666,6 +673,7 @@ int rs690_resume(struct radeon_device *rdev)
int rs690_suspend(struct radeon_device *rdev) int rs690_suspend(struct radeon_device *rdev)
{ {
r600_audio_fini(rdev);
r100_cp_disable(rdev); r100_cp_disable(rdev);
r100_wb_disable(rdev); r100_wb_disable(rdev);
rs600_irq_disable(rdev); rs600_irq_disable(rdev);
...@@ -675,6 +683,7 @@ int rs690_suspend(struct radeon_device *rdev) ...@@ -675,6 +683,7 @@ int rs690_suspend(struct radeon_device *rdev)
void rs690_fini(struct radeon_device *rdev) void rs690_fini(struct radeon_device *rdev)
{ {
r600_audio_fini(rdev);
r100_cp_fini(rdev); r100_cp_fini(rdev);
r100_wb_fini(rdev); r100_wb_fini(rdev);
r100_ib_fini(rdev); r100_ib_fini(rdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment