Message ID | 1421171213-23977-6-git-send-email-alexander.deucher@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 13.01.2015 um 18:46 schrieb Alex Deucher: > From: Slava Grigorev <slava.grigorev@amd.com> > > Signed-off-by: Slava Grigorev <slava.grigorev@amd.com> > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/radeon/dce6_afmt.c | 16 +-------- > drivers/gpu/drm/radeon/evergreen_hdmi.c | 33 ++++-------------- > drivers/gpu/drm/radeon/radeon_audio.c | 62 +++++++++++++++++++++------------ > drivers/gpu/drm/radeon/radeon_audio.h | 4 +++ > 4 files changed, 51 insertions(+), 64 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c > index a24c95a..96f298c 100644 > --- a/drivers/gpu/drm/radeon/dce6_afmt.c > +++ b/drivers/gpu/drm/radeon/dce6_afmt.c > @@ -102,13 +102,11 @@ void dce6_afmt_select_pin(struct drm_encoder *encoder) > } > > void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, > - struct drm_display_mode *mode) > + struct drm_connector *connector, struct drm_display_mode *mode) > { > 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 tmp = 0, offset; > > if (!dig || !dig->afmt || !dig->afmt->pin) > @@ -116,18 +114,6 @@ void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, > > 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); > - break; > - } > - } > - > - if (!radeon_connector) { > - DRM_ERROR("Couldn't find encoder's connector\n"); > - return; > - } > - > if (mode->flags & DRM_MODE_FLAG_INTERLACE) { > if (connector->latency_present[1]) > tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | > diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c > index 3a9bb04..aa8a31b 100644 > --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c > +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c > @@ -34,8 +34,6 @@ > #include "atom.h" > > extern void dce6_afmt_select_pin(struct drm_encoder *encoder); > -extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, > - struct drm_display_mode *mode); > > /* enable the audio stream */ > static void dce4_audio_enable(struct radeon_device *rdev, > @@ -90,26 +88,12 @@ 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_latency_fields(struct drm_encoder *encoder, > - struct drm_display_mode *mode) > +void dce4_afmt_write_latency_fields(struct drm_encoder *encoder, > + struct drm_connector *connector, struct drm_display_mode *mode) > { > struct radeon_device *rdev = encoder->dev->dev_private; > - struct drm_connector *connector; > - struct radeon_connector *radeon_connector = NULL; > u32 tmp = 0; > > - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { > - if (connector->encoder == encoder) { > - radeon_connector = to_radeon_connector(connector); > - break; > - } > - } > - > - if (!radeon_connector) { > - DRM_ERROR("Couldn't find encoder's connector\n"); > - return; > - } > - > if (mode->flags & DRM_MODE_FLAG_INTERLACE) { > if (connector->latency_present[1]) > tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | > @@ -123,7 +107,7 @@ static void dce4_afmt_write_latency_fields(struct drm_encoder *encoder, > else > tmp = VIDEO_LIPSYNC(255) | AUDIO_LIPSYNC(255); > } > - WREG32(AZ_F0_CODEC_PIN0_CONTROL_RESPONSE_LIPSYNC, tmp); > + WREG32_ENDPOINT(0, AZ_F0_CODEC_PIN0_CONTROL_RESPONSE_LIPSYNC, tmp); > } > > void dce4_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, > @@ -418,14 +402,11 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode > > /* fglrx sets 0x40 in 0x5f80 here */ > > - if (ASIC_IS_DCE6(rdev)) { > + if (ASIC_IS_DCE6(rdev)) > dce6_afmt_select_pin(encoder); > - radeon_audio_write_sad_regs(encoder); > - dce6_afmt_write_latency_fields(encoder, mode); > - } else { > - radeon_audio_write_sad_regs(encoder); > - dce4_afmt_write_latency_fields(encoder, mode); > - } > + > + radeon_audio_write_sad_regs(encoder); > + radeon_audio_write_latency_fields(encoder, mode); > > err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); > if (err < 0) { > diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c > index f359a29..a95eee1 100644 > --- a/drivers/gpu/drm/radeon/radeon_audio.c > +++ b/drivers/gpu/drm/radeon/radeon_audio.c > @@ -53,6 +53,10 @@ void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, > u8 *sadb, int sad_count); > void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder, > u8 *sadb, int sad_count); > +void dce4_afmt_write_latency_fields(struct drm_encoder *encoder, > + struct drm_connector *connector, struct drm_display_mode *mode); > +void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, > + struct drm_connector *connector, struct drm_display_mode *mode); > > static const u32 pin_offsets[7] = > { > @@ -93,50 +97,36 @@ static struct radeon_audio_basic_funcs dce6_funcs = { > > static struct radeon_audio_funcs dce32_hdmi_funcs = { > .write_sad_regs = dce3_2_afmt_write_sad_regs, > -}; > - > -static struct radeon_audio_funcs dce32_dp_funcs = { > - .write_sad_regs = dce3_2_afmt_write_sad_regs, > -}; > - > -static struct radeon_audio_funcs dce4_hdmi_funcs = { > - .write_sad_regs = evergreen_hdmi_write_sad_regs, > -}; > - > -static struct radeon_audio_funcs dce4_dp_funcs = { > - .write_sad_regs = evergreen_hdmi_write_sad_regs, > -}; > - > -static struct radeon_audio_funcs dce6_hdmi_funcs = { > - .write_sad_regs = dce6_afmt_write_sad_regs, > -}; > - > -static struct radeon_audio_funcs dce6_dp_funcs = { > - .write_sad_regs = dce6_afmt_write_sad_regs, > -}; > - > -static struct radeon_audio_funcs dce32_hdmi_funcs = { Looks like that change doesn't belong into this patch, but rather into the patch consolidating the sad functions. Christian. > .write_speaker_allocation = dce3_2_afmt_hdmi_write_speaker_allocation, > }; > > static struct radeon_audio_funcs dce32_dp_funcs = { > + .write_sad_regs = dce3_2_afmt_write_sad_regs, > .write_speaker_allocation = dce3_2_afmt_dp_write_speaker_allocation, > }; > > static struct radeon_audio_funcs dce4_hdmi_funcs = { > + .write_sad_regs = evergreen_hdmi_write_sad_regs, > .write_speaker_allocation = dce4_afmt_hdmi_write_speaker_allocation, > + .write_latency_fields = dce4_afmt_write_latency_fields, > }; > > static struct radeon_audio_funcs dce4_dp_funcs = { > + .write_sad_regs = evergreen_hdmi_write_sad_regs, > .write_speaker_allocation = dce4_afmt_dp_write_speaker_allocation, > + .write_latency_fields = dce4_afmt_write_latency_fields, > }; > > static struct radeon_audio_funcs dce6_hdmi_funcs = { > + .write_sad_regs = dce6_afmt_write_sad_regs, > .write_speaker_allocation = dce6_afmt_hdmi_write_speaker_allocation, > + .write_latency_fields = dce6_afmt_write_latency_fields, > }; > > static struct radeon_audio_funcs dce6_dp_funcs = { > + .write_sad_regs = dce6_afmt_write_sad_regs, > .write_speaker_allocation = dce6_afmt_dp_write_speaker_allocation, > + .write_latency_fields = dce6_afmt_write_latency_fields, > }; > > static void radeon_audio_interface_init(struct radeon_device *rdev) > @@ -325,3 +315,29 @@ void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) > > kfree(sadb); > } > + > +void radeon_audio_write_latency_fields(struct drm_encoder *encoder, > + struct drm_display_mode *mode) > +{ > + struct radeon_encoder *radeon_encoder; > + struct drm_connector *connector; > + struct radeon_connector *radeon_connector = 0; > + > + list_for_each_entry(connector, > + &encoder->dev->mode_config.connector_list, head) { > + if (connector->encoder == encoder) { > + radeon_connector = to_radeon_connector(connector); > + break; > + } > + } > + > + if (!radeon_connector) { > + DRM_ERROR("Couldn't find encoder's connector\n"); > + return; > + } > + > + radeon_encoder = to_radeon_encoder(encoder); > + > + if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields) > + radeon_encoder->audio->write_latency_fields(encoder, connector, mode); > +} > diff --git a/drivers/gpu/drm/radeon/radeon_audio.h b/drivers/gpu/drm/radeon/radeon_audio.h > index cc0596f..33981c8 100644 > --- a/drivers/gpu/drm/radeon/radeon_audio.h > +++ b/drivers/gpu/drm/radeon/radeon_audio.h > @@ -41,6 +41,8 @@ struct radeon_audio_basic_funcs > > struct radeon_audio_funcs > { > + void (*write_latency_fields)(struct drm_encoder *encoder, > + struct drm_connector *connector, struct drm_display_mode *mode); > void (*write_sad_regs)(struct drm_encoder *encoder, > struct cea_sad *sads, int sad_count); > void (*write_speaker_allocation)(struct drm_encoder *encoder, > @@ -56,5 +58,7 @@ void radeon_audio_endpoint_wreg(struct radeon_device *rdev, > u32 offset, u32 reg, u32 v); > void radeon_audio_write_sad_regs(struct drm_encoder *encoder); > void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder); > +void radeon_audio_write_latency_fields(struct drm_encoder *encoder, > + struct drm_display_mode *mode); > > #endif
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index a24c95a..96f298c 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c @@ -102,13 +102,11 @@ void dce6_afmt_select_pin(struct drm_encoder *encoder) } void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, - struct drm_display_mode *mode) + struct drm_connector *connector, struct drm_display_mode *mode) { 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 tmp = 0, offset; if (!dig || !dig->afmt || !dig->afmt->pin) @@ -116,18 +114,6 @@ void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, 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); - break; - } - } - - if (!radeon_connector) { - DRM_ERROR("Couldn't find encoder's connector\n"); - return; - } - if (mode->flags & DRM_MODE_FLAG_INTERLACE) { if (connector->latency_present[1]) tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 3a9bb04..aa8a31b 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c @@ -34,8 +34,6 @@ #include "atom.h" extern void dce6_afmt_select_pin(struct drm_encoder *encoder); -extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, - struct drm_display_mode *mode); /* enable the audio stream */ static void dce4_audio_enable(struct radeon_device *rdev, @@ -90,26 +88,12 @@ 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_latency_fields(struct drm_encoder *encoder, - struct drm_display_mode *mode) +void dce4_afmt_write_latency_fields(struct drm_encoder *encoder, + struct drm_connector *connector, struct drm_display_mode *mode) { struct radeon_device *rdev = encoder->dev->dev_private; - struct drm_connector *connector; - struct radeon_connector *radeon_connector = NULL; u32 tmp = 0; - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { - if (connector->encoder == encoder) { - radeon_connector = to_radeon_connector(connector); - break; - } - } - - if (!radeon_connector) { - DRM_ERROR("Couldn't find encoder's connector\n"); - return; - } - if (mode->flags & DRM_MODE_FLAG_INTERLACE) { if (connector->latency_present[1]) tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | @@ -123,7 +107,7 @@ static void dce4_afmt_write_latency_fields(struct drm_encoder *encoder, else tmp = VIDEO_LIPSYNC(255) | AUDIO_LIPSYNC(255); } - WREG32(AZ_F0_CODEC_PIN0_CONTROL_RESPONSE_LIPSYNC, tmp); + WREG32_ENDPOINT(0, AZ_F0_CODEC_PIN0_CONTROL_RESPONSE_LIPSYNC, tmp); } void dce4_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, @@ -418,14 +402,11 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode /* fglrx sets 0x40 in 0x5f80 here */ - if (ASIC_IS_DCE6(rdev)) { + if (ASIC_IS_DCE6(rdev)) dce6_afmt_select_pin(encoder); - radeon_audio_write_sad_regs(encoder); - dce6_afmt_write_latency_fields(encoder, mode); - } else { - radeon_audio_write_sad_regs(encoder); - dce4_afmt_write_latency_fields(encoder, mode); - } + + radeon_audio_write_sad_regs(encoder); + radeon_audio_write_latency_fields(encoder, mode); err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); if (err < 0) { diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index f359a29..a95eee1 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c @@ -53,6 +53,10 @@ void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, u8 *sadb, int sad_count); void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder, u8 *sadb, int sad_count); +void dce4_afmt_write_latency_fields(struct drm_encoder *encoder, + struct drm_connector *connector, struct drm_display_mode *mode); +void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, + struct drm_connector *connector, struct drm_display_mode *mode); static const u32 pin_offsets[7] = { @@ -93,50 +97,36 @@ static struct radeon_audio_basic_funcs dce6_funcs = { static struct radeon_audio_funcs dce32_hdmi_funcs = { .write_sad_regs = dce3_2_afmt_write_sad_regs, -}; - -static struct radeon_audio_funcs dce32_dp_funcs = { - .write_sad_regs = dce3_2_afmt_write_sad_regs, -}; - -static struct radeon_audio_funcs dce4_hdmi_funcs = { - .write_sad_regs = evergreen_hdmi_write_sad_regs, -}; - -static struct radeon_audio_funcs dce4_dp_funcs = { - .write_sad_regs = evergreen_hdmi_write_sad_regs, -}; - -static struct radeon_audio_funcs dce6_hdmi_funcs = { - .write_sad_regs = dce6_afmt_write_sad_regs, -}; - -static struct radeon_audio_funcs dce6_dp_funcs = { - .write_sad_regs = dce6_afmt_write_sad_regs, -}; - -static struct radeon_audio_funcs dce32_hdmi_funcs = { .write_speaker_allocation = dce3_2_afmt_hdmi_write_speaker_allocation, }; static struct radeon_audio_funcs dce32_dp_funcs = { + .write_sad_regs = dce3_2_afmt_write_sad_regs, .write_speaker_allocation = dce3_2_afmt_dp_write_speaker_allocation, }; static struct radeon_audio_funcs dce4_hdmi_funcs = { + .write_sad_regs = evergreen_hdmi_write_sad_regs, .write_speaker_allocation = dce4_afmt_hdmi_write_speaker_allocation, + .write_latency_fields = dce4_afmt_write_latency_fields, }; static struct radeon_audio_funcs dce4_dp_funcs = { + .write_sad_regs = evergreen_hdmi_write_sad_regs, .write_speaker_allocation = dce4_afmt_dp_write_speaker_allocation, + .write_latency_fields = dce4_afmt_write_latency_fields, }; static struct radeon_audio_funcs dce6_hdmi_funcs = { + .write_sad_regs = dce6_afmt_write_sad_regs, .write_speaker_allocation = dce6_afmt_hdmi_write_speaker_allocation, + .write_latency_fields = dce6_afmt_write_latency_fields, }; static struct radeon_audio_funcs dce6_dp_funcs = { + .write_sad_regs = dce6_afmt_write_sad_regs, .write_speaker_allocation = dce6_afmt_dp_write_speaker_allocation, + .write_latency_fields = dce6_afmt_write_latency_fields, }; static void radeon_audio_interface_init(struct radeon_device *rdev) @@ -325,3 +315,29 @@ void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) kfree(sadb); } + +void radeon_audio_write_latency_fields(struct drm_encoder *encoder, + struct drm_display_mode *mode) +{ + struct radeon_encoder *radeon_encoder; + struct drm_connector *connector; + struct radeon_connector *radeon_connector = 0; + + list_for_each_entry(connector, + &encoder->dev->mode_config.connector_list, head) { + if (connector->encoder == encoder) { + radeon_connector = to_radeon_connector(connector); + break; + } + } + + if (!radeon_connector) { + DRM_ERROR("Couldn't find encoder's connector\n"); + return; + } + + radeon_encoder = to_radeon_encoder(encoder); + + if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields) + radeon_encoder->audio->write_latency_fields(encoder, connector, mode); +} diff --git a/drivers/gpu/drm/radeon/radeon_audio.h b/drivers/gpu/drm/radeon/radeon_audio.h index cc0596f..33981c8 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.h +++ b/drivers/gpu/drm/radeon/radeon_audio.h @@ -41,6 +41,8 @@ struct radeon_audio_basic_funcs struct radeon_audio_funcs { + void (*write_latency_fields)(struct drm_encoder *encoder, + struct drm_connector *connector, struct drm_display_mode *mode); void (*write_sad_regs)(struct drm_encoder *encoder, struct cea_sad *sads, int sad_count); void (*write_speaker_allocation)(struct drm_encoder *encoder, @@ -56,5 +58,7 @@ void radeon_audio_endpoint_wreg(struct radeon_device *rdev, u32 offset, u32 reg, u32 v); void radeon_audio_write_sad_regs(struct drm_encoder *encoder); void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder); +void radeon_audio_write_latency_fields(struct drm_encoder *encoder, + struct drm_display_mode *mode); #endif