diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2014-09-18 17:26:39 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-10-01 09:00:03 -0400 |
commit | d3d8c141a333879719173a522a89532bf8d32229 (patch) | |
tree | 61ec67e97f701c524711e2ee7854b78c9dbf6cdc | |
parent | 721566768787f3b4790d22d993d70befdd440f64 (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>
-rw-r--r-- | drivers/gpu/drm/radeon/dce3_1_afmt.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/dce6_afmt.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_hdmi.c | 39 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 37 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 |
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 | ||
285 | void dce6_audio_enable(struct radeon_device *rdev, | 285 | void 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 | ||
296 | static const u32 pin_offsets[7] = | 296 | static 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); | |||
38 | extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, | 38 | extern 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 */ | ||
42 | static 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 | ||
471 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | 502 | void 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 */ |
164 | void r600_audio_enable(struct radeon_device *rdev, | 164 | void 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); | |||
2977 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); | 2977 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); |
2978 | void r600_audio_enable(struct radeon_device *rdev, | 2978 | void 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); |
2981 | void dce6_audio_enable(struct radeon_device *rdev, | 2981 | void 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 |