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 feature bit to struct adv7511_chip_info to handle this scenario. While at it, drop the enum adv7511_type as it is unused. Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> --- drivers/gpu/drm/bridge/adv7511/adv7511.h | 8 +------- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 12 +++++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h b/drivers/gpu/drm/bridge/adv7511/adv7511.h index 627531f48f84..c523ac4c9bc8 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h @@ -325,22 +325,16 @@ struct adv7511_video_config { struct hdmi_avi_infoframe avi_infoframe; }; -enum adv7511_type { - ADV7511, - ADV7533, - ADV7535, -}; - #define ADV7511_MAX_ADDRS 3 struct adv7511_chip_info { - enum adv7511_type type; unsigned long max_mode_clock; unsigned long max_lane_freq; const char * const *supply_names; unsigned int num_supplies; unsigned has_dsi:1; unsigned link_config:1; + unsigned hpd_override_enable:1; }; struct adv7511 { diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index 6974c267b1d5..7b06a0a21685 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -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); @@ -1360,14 +1360,12 @@ static void adv7511_remove(struct i2c_client *i2c) } static const struct adv7511_chip_info adv7511_chip_info = { - .type = ADV7511, .supply_names = adv7511_supply_names, .num_supplies = ARRAY_SIZE(adv7511_supply_names), .link_config = 1 }; static const struct adv7511_chip_info adv7533_chip_info = { - .type = ADV7533, .max_mode_clock = 80000, .max_lane_freq = 800000, .supply_names = adv7533_supply_names, @@ -1376,12 +1374,12 @@ static const struct adv7511_chip_info adv7533_chip_info = { }; static const struct adv7511_chip_info adv7535_chip_info = { - .type = ADV7535, .max_mode_clock = 148500, .max_lane_freq = 891000, .supply_names = adv7533_supply_names, .num_supplies = ARRAY_SIZE(adv7533_supply_names), - .has_dsi = 1 + .has_dsi = 1, + .hpd_override_enable = 1 }; static const struct i2c_device_id adv7511_i2c_ids[] = { -- 2.25.1