aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Sang <wsa+renesas@sang-engineering.com>2016-01-03 21:33:45 -0500
committerWolfram Sang <wsa@the-dreams.de>2016-02-02 09:37:49 -0500
commitd0be8584b01160eb6f49e77f8e9c1da286bb4ffb (patch)
tree0a4348c99c2b47e324e16b028fdd860ee864098b
parent1df59b8497f47495e873c23abd6d3d290c730505 (diff)
drm: adv7511: really enable interrupts for EDID detection
The interrupts for EDID_READY or DDC_ERROR were never enabled in this driver, so reading EDID always timed out when chip was powered down and interrupts were used. Fix this and also remove clearing the interrupt flags, they are cleared in POWER_DOWN mode anyhow (unlike the interrupt enable flags) according to docs and my tests. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Tested-by: Archit Taneja <architt@codeaurora.org>
-rw-r--r--drivers/gpu/drm/i2c/adv7511.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i2c/adv7511.c b/drivers/gpu/drm/i2c/adv7511.c
index 533d1e3d4a99..db7435a4517f 100644
--- a/drivers/gpu/drm/i2c/adv7511.c
+++ b/drivers/gpu/drm/i2c/adv7511.c
@@ -362,12 +362,19 @@ static void adv7511_power_on(struct adv7511 *adv7511)
362{ 362{
363 adv7511->current_edid_segment = -1; 363 adv7511->current_edid_segment = -1;
364 364
365 regmap_write(adv7511->regmap, ADV7511_REG_INT(0),
366 ADV7511_INT0_EDID_READY);
367 regmap_write(adv7511->regmap, ADV7511_REG_INT(1),
368 ADV7511_INT1_DDC_ERROR);
369 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, 365 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
370 ADV7511_POWER_POWER_DOWN, 0); 366 ADV7511_POWER_POWER_DOWN, 0);
367 if (adv7511->i2c_main->irq) {
368 /*
369 * Documentation says the INT_ENABLE registers are reset in
370 * POWER_DOWN mode. My 7511w preserved the bits, however.
371 * Still, let's be safe and stick to the documentation.
372 */
373 regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(0),
374 ADV7511_INT0_EDID_READY);
375 regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(1),
376 ADV7511_INT1_DDC_ERROR);
377 }
371 378
372 /* 379 /*
373 * Per spec it is allowed to pulse the HDP signal to indicate that the 380 * Per spec it is allowed to pulse the HDP signal to indicate that the
@@ -567,12 +574,14 @@ static int adv7511_get_modes(struct drm_encoder *encoder,
567 574
568 /* Reading the EDID only works if the device is powered */ 575 /* Reading the EDID only works if the device is powered */
569 if (!adv7511->powered) { 576 if (!adv7511->powered) {
570 regmap_write(adv7511->regmap, ADV7511_REG_INT(0),
571 ADV7511_INT0_EDID_READY);
572 regmap_write(adv7511->regmap, ADV7511_REG_INT(1),
573 ADV7511_INT1_DDC_ERROR);
574 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, 577 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
575 ADV7511_POWER_POWER_DOWN, 0); 578 ADV7511_POWER_POWER_DOWN, 0);
579 if (adv7511->i2c_main->irq) {
580 regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(0),
581 ADV7511_INT0_EDID_READY);
582 regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(1),
583 ADV7511_INT1_DDC_ERROR);
584 }
576 adv7511->current_edid_segment = -1; 585 adv7511->current_edid_segment = -1;
577 } 586 }
578 587