[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5
2013/8/15 Rafa? Mi?ecki : > 2013/8/15 Alex Deucher : >> +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) >> +{ >> + struct radeon_device *rdev = encoder->dev->dev_private; >> + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); >> + struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; >> + struct drm_connector *connector; >> + struct radeon_connector *radeon_connector = NULL; >> + u32 offset, tmp; >> + u8 *sadb; >> + int sad_count; >> + >> + if (!dig->afmt->pin) >> + return; >> + >> + offset = dig->afmt->pin->offset; > > You don't want that (offset) :) After that trivial fix Acked-by: Rafa? Mi?ecki -- Rafa?
[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5
2013/8/15 Alex Deucher : > +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) > +{ > + struct radeon_device *rdev = encoder->dev->dev_private; > + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); > + struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; > + struct drm_connector *connector; > + struct radeon_connector *radeon_connector = NULL; > + u32 offset, tmp; > + u8 *sadb; > + int sad_count; > + > + if (!dig->afmt->pin) > + return; > + > + offset = dig->afmt->pin->offset; You don't want that (offset) :)
[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5
This updates the audio driver to the speaker allocation block from the EDID. A similar change was just implemented for DCE6/8. Signed-off-by: Alex Deucher --- drivers/gpu/drm/radeon/evergreen_hdmi.c | 48 - drivers/gpu/drm/radeon/evergreend.h | 7 + 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 2cb0f90..efb67ed 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c @@ -58,6 +58,52 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t cloc WREG32(HDMI_ACR_48_1 + offset, acr.n_48khz); } +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) +{ + struct radeon_device *rdev = encoder->dev->dev_private; + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); + struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; + struct drm_connector *connector; + struct radeon_connector *radeon_connector = NULL; + u32 offset, tmp; + u8 *sadb; + int sad_count; + + if (!dig->afmt->pin) + return; + + offset = dig->afmt->pin->offset; + + list_for_each_entry(connector, >dev->mode_config.connector_list, head) { + if (connector->encoder == encoder) + radeon_connector = to_radeon_connector(connector); + } + + if (!radeon_connector) { + DRM_ERROR("Couldn't find encoder's connector\n"); + return; + } + + sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, ); + if (sad_count < 0) { + DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); + return; + } + + /* program the speaker allocation */ + tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER); + tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK); + /* set HDMI mode */ + tmp |= HDMI_CONNECTION; + if (sad_count) + tmp |= SPEAKER_ALLOCATION(sadb[0]); + else + tmp |= SPEAKER_ALLOCATION(5); /* stereo */ + WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp); + + kfree(sadb); +} + static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder) { struct radeon_device *rdev = encoder->dev->dev_private; @@ -271,7 +317,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode if (ASIC_IS_DCE6(rdev)) { dce6_afmt_write_speaker_allocation(encoder); } else { - /* fglrx sets 0x0001005f | (x & 0x00fc) in 0x5f78 here */ + dce4_afmt_write_speaker_allocation(encoder); } WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset, diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 0d582ac..430997a 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h @@ -714,6 +714,13 @@ #define AFMT_GENERIC0_7 0x7138 /* DCE4/5 ELD audio interface */ +#define AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER 0x5f78 +#defineSPEAKER_ALLOCATION(x) (((x) & 0x7f) << 0) +#defineSPEAKER_ALLOCATION_MASK (0x7f << 0) +#defineSPEAKER_ALLOCATION_SHIFT0 +#defineHDMI_CONNECTION (1 << 16) +#defineDP_CONNECTION (1 << 17) + #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR00x5f84 /* LPCM */ #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10x5f88 /* AC3 */ #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR20x5f8c /* MPEG1 */ -- 1.8.3.1
[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5
This updates the audio driver to the speaker allocation block from the EDID. A similar change was just implemented for DCE6/8. Signed-off-by: Alex Deucher alexander.deuc...@amd.com --- drivers/gpu/drm/radeon/evergreen_hdmi.c | 48 - drivers/gpu/drm/radeon/evergreend.h | 7 + 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 2cb0f90..efb67ed 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c @@ -58,6 +58,52 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t cloc WREG32(HDMI_ACR_48_1 + offset, acr.n_48khz); } +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) +{ + struct radeon_device *rdev = encoder-dev-dev_private; + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); + struct radeon_encoder_atom_dig *dig = radeon_encoder-enc_priv; + struct drm_connector *connector; + struct radeon_connector *radeon_connector = NULL; + u32 offset, tmp; + u8 *sadb; + int sad_count; + + if (!dig-afmt-pin) + return; + + offset = dig-afmt-pin-offset; + + list_for_each_entry(connector, encoder-dev-mode_config.connector_list, head) { + if (connector-encoder == encoder) + radeon_connector = to_radeon_connector(connector); + } + + if (!radeon_connector) { + DRM_ERROR(Couldn't find encoder's connector\n); + return; + } + + sad_count = drm_edid_to_speaker_allocation(radeon_connector-edid, sadb); + if (sad_count 0) { + DRM_ERROR(Couldn't read Speaker Allocation Data Block: %d\n, sad_count); + return; + } + + /* program the speaker allocation */ + tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER); + tmp = ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK); + /* set HDMI mode */ + tmp |= HDMI_CONNECTION; + if (sad_count) + tmp |= SPEAKER_ALLOCATION(sadb[0]); + else + tmp |= SPEAKER_ALLOCATION(5); /* stereo */ + WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp); + + kfree(sadb); +} + static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder) { struct radeon_device *rdev = encoder-dev-dev_private; @@ -271,7 +317,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode if (ASIC_IS_DCE6(rdev)) { dce6_afmt_write_speaker_allocation(encoder); } else { - /* fglrx sets 0x0001005f | (x 0x00fc) in 0x5f78 here */ + dce4_afmt_write_speaker_allocation(encoder); } WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset, diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 0d582ac..430997a 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h @@ -714,6 +714,13 @@ #define AFMT_GENERIC0_7 0x7138 /* DCE4/5 ELD audio interface */ +#define AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER 0x5f78 +#defineSPEAKER_ALLOCATION(x) (((x) 0x7f) 0) +#defineSPEAKER_ALLOCATION_MASK (0x7f 0) +#defineSPEAKER_ALLOCATION_SHIFT0 +#defineHDMI_CONNECTION (1 16) +#defineDP_CONNECTION (1 17) + #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR00x5f84 /* LPCM */ #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10x5f88 /* AC3 */ #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR20x5f8c /* MPEG1 */ -- 1.8.3.1 ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5
2013/8/15 Alex Deucher alexdeuc...@gmail.com: +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) +{ + struct radeon_device *rdev = encoder-dev-dev_private; + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); + struct radeon_encoder_atom_dig *dig = radeon_encoder-enc_priv; + struct drm_connector *connector; + struct radeon_connector *radeon_connector = NULL; + u32 offset, tmp; + u8 *sadb; + int sad_count; + + if (!dig-afmt-pin) + return; + + offset = dig-afmt-pin-offset; You don't want that (offset) :) ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5
2013/8/15 Rafał Miłecki zaj...@gmail.com: 2013/8/15 Alex Deucher alexdeuc...@gmail.com: +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) +{ + struct radeon_device *rdev = encoder-dev-dev_private; + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); + struct radeon_encoder_atom_dig *dig = radeon_encoder-enc_priv; + struct drm_connector *connector; + struct radeon_connector *radeon_connector = NULL; + u32 offset, tmp; + u8 *sadb; + int sad_count; + + if (!dig-afmt-pin) + return; + + offset = dig-afmt-pin-offset; You don't want that (offset) :) After that trivial fix Acked-by: Rafał Miłecki zaj...@gmail.com -- Rafał ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel