[PATCH v2] drm/vc4: hdmi: Don't poll for the infoframes status on setup
Dave Stevenson
dave.stevenson at raspberrypi.com
Fri Dec 4 10:36:11 EST 2020
Hi Maxime
On Thu, 3 Dec 2020 at 07:46, Maxime Ripard <maxime at cerno.tech> wrote:
>
> The infoframes are sent at a regular interval as a data island packet,
> so we don't need to wait for them to be sent when we're setting them up.
>
> However, we do need to poll when we're enabling since the we can't
> update the packet RAM until it has been sent.
>
> Let's add a boolean flag to tell whether we want to poll or not to
> support both cases.
>
> Suggested-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
> Signed-off-by: Maxime Ripard <maxime at cerno.tech>
That looks like it should do what was intended - thanks.
Reviewed-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
> ---
>
> Changes from v1:
> - Inverted when to poll
> ---
> drivers/gpu/drm/vc4/vc4_hdmi.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> index a2c5b5e9786a..d3c4a9b5bb6d 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> @@ -265,7 +265,8 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
> }
>
> static int vc4_hdmi_stop_packet(struct drm_encoder *encoder,
> - enum hdmi_infoframe_type type)
> + enum hdmi_infoframe_type type,
> + bool poll)
> {
> struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
> u32 packet_id = type - 0x80;
> @@ -273,6 +274,9 @@ static int vc4_hdmi_stop_packet(struct drm_encoder *encoder,
> HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
> HDMI_READ(HDMI_RAM_PACKET_CONFIG) & ~BIT(packet_id));
>
> + if (!poll)
> + return 0;
> +
> return wait_for(!(HDMI_READ(HDMI_RAM_PACKET_STATUS) &
> BIT(packet_id)), 100);
> }
> @@ -299,7 +303,7 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder,
> if (len < 0)
> return;
>
> - ret = vc4_hdmi_stop_packet(encoder, frame->any.type);
> + ret = vc4_hdmi_stop_packet(encoder, frame->any.type, true);
> if (ret) {
> DRM_ERROR("Failed to wait for infoframe to go idle: %d\n", ret);
> return;
> @@ -1056,7 +1060,7 @@ static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi)
> int ret;
>
> vc4_hdmi->audio.streaming = false;
> - ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO);
> + ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO, false);
> if (ret)
> dev_err(dev, "Failed to stop audio infoframe: %d\n", ret);
>
> --
> 2.28.0
>
More information about the linux-arm-kernel
mailing list