[PATCH] drm: bridge: adv7511: Fix ADV7535 HPD enablement

Robert Foss robert.foss at linaro.org
Mon Jan 10 11:07:28 UTC 2022


Hey Jagan,

Thanks for submitting this fix.

On Sun, 9 Jan 2022 at 18:30, Jagan Teki <jagan at amarulasolutions.com> wrote:
>
> Existing HPD enablement logic is not compatible with ADV7535
> bridge, thus any runtime plug-in of HDMI cable is not working
> on these bridge designs.
>
> Unlike other ADV7511 family of bridges, the ADV7535 require
> HPD_OVERRIDE bit to set and reset for proper handling of HPD
> functionality.
>
> Fix it.
>
> Fixes: 8501fe4b14a3 ("drm: bridge: adv7511: Add support for ADV7535")
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
> ---
>  drivers/gpu/drm/bridge/adv7511/adv7511.h     |  1 +
>  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 29 +++++++++++++++-----
>  2 files changed, 23 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h b/drivers/gpu/drm/bridge/adv7511/adv7511.h
> index 592ecfcf00ca..6a882891d91c 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h
> @@ -169,6 +169,7 @@
>  #define ADV7511_PACKET_ENABLE_SPARE2           BIT(1)
>  #define ADV7511_PACKET_ENABLE_SPARE1           BIT(0)
>
> +#define ADV7535_REG_POWER2_HPD_OVERRIDE                BIT(6)
>  #define ADV7511_REG_POWER2_HPD_SRC_MASK                0xc0
>  #define ADV7511_REG_POWER2_HPD_SRC_BOTH                0x00
>  #define ADV7511_REG_POWER2_HPD_SRC_HPD         0x40
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> index f8e5da148599..77118c3395bf 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> @@ -351,11 +351,17 @@ static void __adv7511_power_on(struct adv7511 *adv7511)
>          * from standby or are enabled. When the HPD goes low the adv7511 is
>          * reset and the outputs are disabled which might cause the monitor to
>          * go to standby again. To avoid this we ignore the HPD pin for the
> -        * first few seconds after enabling the output.
> +        * first few seconds after enabling the output. On the other hand
> +        * adv7535 require to enable HPD Override bit for proper HPD.
>          */
> -       regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> -                          ADV7511_REG_POWER2_HPD_SRC_MASK,
> -                          ADV7511_REG_POWER2_HPD_SRC_NONE);
> +       if (adv7511->type == ADV7535)
> +               regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> +                                  ADV7535_REG_POWER2_HPD_OVERRIDE,
> +                                  ADV7535_REG_POWER2_HPD_OVERRIDE);
> +       else
> +               regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> +                                  ADV7511_REG_POWER2_HPD_SRC_MASK,
> +                                  ADV7511_REG_POWER2_HPD_SRC_NONE);
>  }
>
>  static void adv7511_power_on(struct adv7511 *adv7511)
> @@ -375,6 +381,10 @@ static void adv7511_power_on(struct adv7511 *adv7511)
>  static void __adv7511_power_off(struct adv7511 *adv7511)
>  {
>         /* TODO: setup additional power down modes */
> +       if (adv7511->type == ADV7535)
> +               regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> +                                  ADV7535_REG_POWER2_HPD_OVERRIDE, 0);
> +
>         regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
>                            ADV7511_POWER_POWER_DOWN,
>                            ADV7511_POWER_POWER_DOWN);
> @@ -672,9 +682,14 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector)
>                         status = connector_status_disconnected;
>         } else {
>                 /* Renable HPD sensing */
> -               regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> -                                  ADV7511_REG_POWER2_HPD_SRC_MASK,
> -                                  ADV7511_REG_POWER2_HPD_SRC_BOTH);
> +               if (adv7511->type == ADV7535)
> +                       regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> +                                          ADV7535_REG_POWER2_HPD_OVERRIDE,
> +                                          ADV7535_REG_POWER2_HPD_OVERRIDE);
> +               else
> +                       regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
> +                                          ADV7511_REG_POWER2_HPD_SRC_MASK,
> +                                          ADV7511_REG_POWER2_HPD_SRC_BOTH);
>         }
>
>         adv7511->status = status;
> --
> 2.25.1
>

Reviewed-by: Robert Foss  <robert.foss at linaro.org>

Applied to drm-misc-next


More information about the dri-devel mailing list