| From 854043ead1064d575a48475d2728ef7eff0a5fd9 Mon Sep 17 00:00:00 2001 |
| From: John Stultz <john.stultz@linaro.org> |
| Date: Mon, 16 Jan 2017 16:52:52 -0800 |
| Subject: [PATCH 007/255] drm/bridge: adv7511: Re-write the i2c address before |
| EDID probing |
| |
| I've found that by just turning the chip on and off via the |
| POWER_DOWN register, I end up getting i2c_transfer errors on |
| HiKey. |
| |
| Investigating further, it turns out that some of the register |
| state in hardware is getting lost, as the device registers are |
| reset when the chip is powered down. |
| |
| Thus this patch simply re-writes the i2c address to the |
| ADV7511_REG_EDID_I2C_ADDR register to ensure its properly set |
| before we try to read the EDID data. |
| |
| Cc: David Airlie <airlied@linux.ie> |
| Cc: Archit Taneja <architt@codeaurora.org> |
| Cc: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Cc: Lars-Peter Clausen <lars@metafoo.de> |
| Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Cc: dri-devel@lists.freedesktop.org |
| Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: John Stultz <john.stultz@linaro.org> |
| Signed-off-by: Archit Taneja <architt@codeaurora.org> |
| Link: http://patchwork.freedesktop.org/patch/msgid/1484614372-15342-7-git-send-email-john.stultz@linaro.org |
| (cherry picked from commit 3587c856675c45809010c2cee5b21096f6e8e938) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 10 +++++++++- |
| 1 file changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
| +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
| @@ -573,9 +573,17 @@ static int adv7511_get_modes(struct adv7 |
| unsigned int count; |
| |
| /* Reading the EDID only works if the device is powered */ |
| - if (!adv7511->powered) |
| + if (!adv7511->powered) { |
| + unsigned int edid_i2c_addr = |
| + (adv7511->i2c_main->addr << 1) + 4; |
| + |
| __adv7511_power_on(adv7511); |
| |
| + /* Reset the EDID_I2C_ADDR register as it might be cleared */ |
| + regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR, |
| + edid_i2c_addr); |
| + } |
| + |
| edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511); |
| |
| if (!adv7511->powered) |