aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-09-18 17:26:39 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-10-01 09:00:03 -0400
commitd3d8c141a333879719173a522a89532bf8d32229 (patch)
tree61ec67e97f701c524711e2ee7854b78c9dbf6cdc /drivers/gpu/drm
parent721566768787f3b4790d22d993d70befdd440f64 (diff)
drm/radeon: split audio enable between eg and r600 (v2)
Clean up the enable sequence as well. V2: clean up duplicate defines Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/radeon/dce3_1_afmt.c4
-rw-r--r--drivers/gpu/drm/radeon/dce6_afmt.c4
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c39
-rw-r--r--drivers/gpu/drm/radeon/r600_hdmi.c37
-rw-r--r--drivers/gpu/drm/radeon/r600d.h17
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
6 files changed, 81 insertions, 24 deletions
diff --git a/drivers/gpu/drm/radeon/dce3_1_afmt.c b/drivers/gpu/drm/radeon/dce3_1_afmt.c
index 51800e340a57..950af153f30e 100644
--- a/drivers/gpu/drm/radeon/dce3_1_afmt.c
+++ b/drivers/gpu/drm/radeon/dce3_1_afmt.c
@@ -165,7 +165,7 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m
165 165
166 /* disable audio prior to setting up hw */ 166 /* disable audio prior to setting up hw */
167 dig->afmt->pin = r600_audio_get_pin(rdev); 167 dig->afmt->pin = r600_audio_get_pin(rdev);
168 r600_audio_enable(rdev, dig->afmt->pin, false); 168 r600_audio_enable(rdev, dig->afmt->pin, 0);
169 169
170 r600_audio_set_dto(encoder, mode->clock); 170 r600_audio_set_dto(encoder, mode->clock);
171 171
@@ -240,5 +240,5 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m
240 r600_hdmi_audio_workaround(encoder); 240 r600_hdmi_audio_workaround(encoder);
241 241
242 /* enable audio after to setting up hw */ 242 /* enable audio after to setting up hw */
243 r600_audio_enable(rdev, dig->afmt->pin, true); 243 r600_audio_enable(rdev, dig->afmt->pin, 0xf);
244} 244}
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c
index 088d19c8f27e..c0bbf68dbc27 100644
--- a/drivers/gpu/drm/radeon/dce6_afmt.c
+++ b/drivers/gpu/drm/radeon/dce6_afmt.c
@@ -284,13 +284,13 @@ static int dce6_audio_chipset_supported(struct radeon_device *rdev)
284 284
285void dce6_audio_enable(struct radeon_device *rdev, 285void dce6_audio_enable(struct radeon_device *rdev,
286 struct r600_audio_pin *pin, 286 struct r600_audio_pin *pin,
287 bool enable) 287 u8 enable_mask)
288{ 288{
289 if (!pin) 289 if (!pin)
290 return; 290 return;
291 291
292 WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 292 WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
293 enable ? AUDIO_ENABLED : 0); 293 enable_mask ? AUDIO_ENABLED : 0);
294} 294}
295 295
296static const u32 pin_offsets[7] = 296static const u32 pin_offsets[7] =
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 278c7a139d74..8d5497e34b42 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -38,6 +38,37 @@ extern void dce6_afmt_select_pin(struct drm_encoder *encoder);
38extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, 38extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder,
39 struct drm_display_mode *mode); 39 struct drm_display_mode *mode);
40 40
41/* enable the audio stream */
42static void dce4_audio_enable(struct radeon_device *rdev,
43 struct r600_audio_pin *pin,
44 u8 enable_mask)
45{
46 u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL);
47
48 if (!pin)
49 return;
50
51 if (enable_mask) {
52 tmp |= AUDIO_ENABLED;
53 if (enable_mask & 1)
54 tmp |= PIN0_AUDIO_ENABLED;
55 if (enable_mask & 2)
56 tmp |= PIN1_AUDIO_ENABLED;
57 if (enable_mask & 4)
58 tmp |= PIN2_AUDIO_ENABLED;
59 if (enable_mask & 8)
60 tmp |= PIN3_AUDIO_ENABLED;
61 } else {
62 tmp &= ~(AUDIO_ENABLED |
63 PIN0_AUDIO_ENABLED |
64 PIN1_AUDIO_ENABLED |
65 PIN2_AUDIO_ENABLED |
66 PIN3_AUDIO_ENABLED);
67 }
68
69 WREG32(AZ_HOT_PLUG_CONTROL, tmp);
70}
71
41/* 72/*
42 * update the N and CTS parameters for a given pixel clock rate 73 * update the N and CTS parameters for a given pixel clock rate
43 */ 74 */
@@ -318,10 +349,10 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
318 /* disable audio prior to setting up hw */ 349 /* disable audio prior to setting up hw */
319 if (ASIC_IS_DCE6(rdev)) { 350 if (ASIC_IS_DCE6(rdev)) {
320 dig->afmt->pin = dce6_audio_get_pin(rdev); 351 dig->afmt->pin = dce6_audio_get_pin(rdev);
321 dce6_audio_enable(rdev, dig->afmt->pin, false); 352 dce6_audio_enable(rdev, dig->afmt->pin, 0);
322 } else { 353 } else {
323 dig->afmt->pin = r600_audio_get_pin(rdev); 354 dig->afmt->pin = r600_audio_get_pin(rdev);
324 r600_audio_enable(rdev, dig->afmt->pin, false); 355 dce4_audio_enable(rdev, dig->afmt->pin, 0);
325 } 356 }
326 357
327 evergreen_audio_set_dto(encoder, mode->clock); 358 evergreen_audio_set_dto(encoder, mode->clock);
@@ -463,9 +494,9 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
463 494
464 /* enable audio after to setting up hw */ 495 /* enable audio after to setting up hw */
465 if (ASIC_IS_DCE6(rdev)) 496 if (ASIC_IS_DCE6(rdev))
466 dce6_audio_enable(rdev, dig->afmt->pin, true); 497 dce6_audio_enable(rdev, dig->afmt->pin, 1);
467 else 498 else
468 r600_audio_enable(rdev, dig->afmt->pin, true); 499 dce4_audio_enable(rdev, dig->afmt->pin, 0xf);
469} 500}
470 501
471void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) 502void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
index 29e5f49334be..a51068923490 100644
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
@@ -163,23 +163,32 @@ void r600_audio_update_hdmi(struct work_struct *work)
163/* enable the audio stream */ 163/* enable the audio stream */
164void r600_audio_enable(struct radeon_device *rdev, 164void r600_audio_enable(struct radeon_device *rdev,
165 struct r600_audio_pin *pin, 165 struct r600_audio_pin *pin,
166 bool enable) 166 u8 enable_mask)
167{ 167{
168 u32 value = 0; 168 u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL);
169 169
170 if (!pin) 170 if (!pin)
171 return; 171 return;
172 172
173 if (ASIC_IS_DCE4(rdev)) { 173 if (enable_mask) {
174 if (enable) { 174 tmp |= AUDIO_ENABLED;
175 value |= 0x81000000; /* Required to enable audio */ 175 if (enable_mask & 1)
176 value |= 0x0e1000f0; /* fglrx sets that too */ 176 tmp |= PIN0_AUDIO_ENABLED;
177 } 177 if (enable_mask & 2)
178 WREG32(EVERGREEN_AUDIO_ENABLE, value); 178 tmp |= PIN1_AUDIO_ENABLED;
179 if (enable_mask & 4)
180 tmp |= PIN2_AUDIO_ENABLED;
181 if (enable_mask & 8)
182 tmp |= PIN3_AUDIO_ENABLED;
179 } else { 183 } else {
180 WREG32_P(R600_AUDIO_ENABLE, 184 tmp &= ~(AUDIO_ENABLED |
181 enable ? 0x81000000 : 0x0, ~0x81000000); 185 PIN0_AUDIO_ENABLED |
186 PIN1_AUDIO_ENABLED |
187 PIN2_AUDIO_ENABLED |
188 PIN3_AUDIO_ENABLED);
182 } 189 }
190
191 WREG32(AZ_HOT_PLUG_CONTROL, tmp);
183} 192}
184 193
185/* 194/*
@@ -200,7 +209,7 @@ int r600_audio_init(struct radeon_device *rdev)
200 rdev->audio.pin[0].category_code = 0; 209 rdev->audio.pin[0].category_code = 0;
201 rdev->audio.pin[0].id = 0; 210 rdev->audio.pin[0].id = 0;
202 /* disable audio. it will be set up later */ 211 /* disable audio. it will be set up later */
203 r600_audio_enable(rdev, &rdev->audio.pin[0], false); 212 r600_audio_enable(rdev, &rdev->audio.pin[0], 0);
204 213
205 return 0; 214 return 0;
206} 215}
@@ -214,7 +223,7 @@ void r600_audio_fini(struct radeon_device *rdev)
214 if (!rdev->audio.enabled) 223 if (!rdev->audio.enabled)
215 return; 224 return;
216 225
217 r600_audio_enable(rdev, &rdev->audio.pin[0], false); 226 r600_audio_enable(rdev, &rdev->audio.pin[0], 0);
218 227
219 rdev->audio.enabled = false; 228 rdev->audio.enabled = false;
220} 229}
@@ -511,7 +520,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
511 520
512 /* disable audio prior to setting up hw */ 521 /* disable audio prior to setting up hw */
513 dig->afmt->pin = r600_audio_get_pin(rdev); 522 dig->afmt->pin = r600_audio_get_pin(rdev);
514 r600_audio_enable(rdev, dig->afmt->pin, false); 523 r600_audio_enable(rdev, dig->afmt->pin, 0xf);
515 524
516 r600_audio_set_dto(encoder, mode->clock); 525 r600_audio_set_dto(encoder, mode->clock);
517 526
@@ -597,7 +606,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
597 WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); 606 WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001);
598 607
599 /* enable audio after to setting up hw */ 608 /* enable audio after to setting up hw */
600 r600_audio_enable(rdev, dig->afmt->pin, true); 609 r600_audio_enable(rdev, dig->afmt->pin, 0xf);
601} 610}
602 611
603/** 612/**
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
index 671b48032a3d..ebf68fa6d1f1 100644
--- a/drivers/gpu/drm/radeon/r600d.h
+++ b/drivers/gpu/drm/radeon/r600d.h
@@ -934,6 +934,23 @@
934# define TARGET_LINK_SPEED_MASK (0xf << 0) 934# define TARGET_LINK_SPEED_MASK (0xf << 0)
935# define SELECTABLE_DEEMPHASIS (1 << 6) 935# define SELECTABLE_DEEMPHASIS (1 << 6)
936 936
937/* Audio */
938#define AZ_HOT_PLUG_CONTROL 0x7300
939# define AZ_FORCE_CODEC_WAKE (1 << 0)
940# define JACK_DETECTION_ENABLE (1 << 4)
941# define UNSOLICITED_RESPONSE_ENABLE (1 << 8)
942# define CODEC_HOT_PLUG_ENABLE (1 << 12)
943# define AUDIO_ENABLED (1 << 31)
944/* DCE3 adds */
945# define PIN0_JACK_DETECTION_ENABLE (1 << 4)
946# define PIN1_JACK_DETECTION_ENABLE (1 << 5)
947# define PIN2_JACK_DETECTION_ENABLE (1 << 6)
948# define PIN3_JACK_DETECTION_ENABLE (1 << 7)
949# define PIN0_AUDIO_ENABLED (1 << 24)
950# define PIN1_AUDIO_ENABLED (1 << 25)
951# define PIN2_AUDIO_ENABLED (1 << 26)
952# define PIN3_AUDIO_ENABLED (1 << 27)
953
937/* Audio clocks DCE 2.0/3.0 */ 954/* Audio clocks DCE 2.0/3.0 */
938#define AUDIO_DTO 0x7340 955#define AUDIO_DTO 0x7340
939# define AUDIO_DTO_PHASE(x) (((x) & 0xffff) << 0) 956# define AUDIO_DTO_PHASE(x) (((x) & 0xffff) << 0)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index ef91ebb7c671..510fe9677e84 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -2977,10 +2977,10 @@ struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev);
2977struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); 2977struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev);
2978void r600_audio_enable(struct radeon_device *rdev, 2978void r600_audio_enable(struct radeon_device *rdev,
2979 struct r600_audio_pin *pin, 2979 struct r600_audio_pin *pin,
2980 bool enable); 2980 u8 enable_mask);
2981void dce6_audio_enable(struct radeon_device *rdev, 2981void dce6_audio_enable(struct radeon_device *rdev,
2982 struct r600_audio_pin *pin, 2982 struct r600_audio_pin *pin,
2983 bool enable); 2983 u8 enable_mask);
2984 2984
2985/* 2985/*
2986 * R600 vram scratch functions 2986 * R600 vram scratch functions