[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