]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm: adv7511: Add hpd_override_enable variable to struct adv7511_chip_info
authorBiju Das <biju.das.jz@bp.renesas.com>
Wed, 30 Aug 2023 14:23:58 +0000 (15:23 +0100)
committerRobert Foss <rfoss@kernel.org>
Mon, 16 Oct 2023 09:09:33 +0000 (11:09 +0200)
As per spec, it is allowed to pulse the HPD signal to indicate that the
EDID information has changed. Some monitors do this when they wake up
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. On the other hand,
adv7535 require to enable HPD Override bit for proper HPD.

Add hpd_override_enable variable to struct adv7511_chip_info to handle
this scenario.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Robert Foss <rfoss@kernel.org>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230830142358.275459-9-biju.das.jz@bp.renesas.com
drivers/gpu/drm/bridge/adv7511/adv7511.h
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c

index 0d39e32b0793fea770bd5b09847c6403f66c6611..39c9ece373b04685a5cfb045ddf7a3146be6617c 100644 (file)
@@ -342,6 +342,7 @@ struct adv7511_chip_info {
        unsigned int reg_cec_offset;
        bool has_dsi;
        bool link_config;
+       bool hpd_override_enable;
 };
 
 struct adv7511 {
index d076cee05e68ded808e058ea697230e0fdf0c29a..8be235144f6d948cfe5de21e2ccdc198021a09bb 100644 (file)
@@ -354,7 +354,7 @@ static void __adv7511_power_on(struct adv7511 *adv7511)
         * first few seconds after enabling the output. On the other hand
         * adv7535 require to enable HPD Override bit for proper HPD.
         */
-       if (adv7511->info->type == ADV7535)
+       if (adv7511->info->hpd_override_enable)
                regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
                                   ADV7535_REG_POWER2_HPD_OVERRIDE,
                                   ADV7535_REG_POWER2_HPD_OVERRIDE);
@@ -381,7 +381,7 @@ static void adv7511_power_on(struct adv7511 *adv7511)
 static void __adv7511_power_off(struct adv7511 *adv7511)
 {
        /* TODO: setup additional power down modes */
-       if (adv7511->info->type == ADV7535)
+       if (adv7511->info->hpd_override_enable)
                regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
                                   ADV7535_REG_POWER2_HPD_OVERRIDE, 0);
 
@@ -682,7 +682,7 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector)
                        status = connector_status_disconnected;
        } else {
                /* Renable HPD sensing */
-               if (adv7511->info->type == ADV7535)
+               if (adv7511->info->hpd_override_enable)
                        regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
                                           ADV7535_REG_POWER2_HPD_OVERRIDE,
                                           ADV7535_REG_POWER2_HPD_OVERRIDE);
@@ -1379,6 +1379,7 @@ static const struct adv7511_chip_info adv7535_chip_info = {
        .num_supplies = ARRAY_SIZE(adv7533_supply_names),
        .reg_cec_offset = ADV7533_REG_CEC_OFFSET,
        .has_dsi = true,
+       .hpd_override_enable = true,
 };
 
 static const struct i2c_device_id adv7511_i2c_ids[] = {