From: Greg Kroah-Hartman Date: Sat, 11 Nov 2017 13:01:27 +0000 (+0100) Subject: 4.9-stable patches X-Git-Tag: v3.18.81~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ea0bad7607dc7aea07e2860ea1794396c8e0b734;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: drm-bridge-adv7511-re-write-the-i2c-address-before-edid-probing.patch drm-bridge-adv7511-reuse-__adv7511_power_on-off-when-probing-edid.patch drm-bridge-adv7511-rework-adv7511_power_on-off-so-they-can-be-reused-internally.patch --- diff --git a/queue-4.9/drm-bridge-adv7511-re-write-the-i2c-address-before-edid-probing.patch b/queue-4.9/drm-bridge-adv7511-re-write-the-i2c-address-before-edid-probing.patch new file mode 100644 index 00000000000..066d62f1d2f --- /dev/null +++ b/queue-4.9/drm-bridge-adv7511-re-write-the-i2c-address-before-edid-probing.patch @@ -0,0 +1,60 @@ +From 3587c856675c45809010c2cee5b21096f6e8e938 Mon Sep 17 00:00:00 2001 +From: John Stultz +Date: Mon, 16 Jan 2017 16:52:52 -0800 +Subject: drm/bridge: adv7511: Re-write the i2c address before EDID probing + +From: John Stultz + +commit 3587c856675c45809010c2cee5b21096f6e8e938 upstream. + +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 +Cc: Archit Taneja +Cc: Wolfram Sang +Cc: Lars-Peter Clausen +Cc: Laurent Pinchart +Cc: dri-devel@lists.freedesktop.org +Reviewed-by: Laurent Pinchart +Tested-by: Laurent Pinchart +Signed-off-by: John Stultz +Signed-off-by: Archit Taneja +Link: http://patchwork.freedesktop.org/patch/msgid/1484614372-15342-7-git-send-email-john.stultz@linaro.org +Signed-off-by: Nhan Nguyen +Signed-off-by: Greg Kroah-Hartman + +--- + 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) diff --git a/queue-4.9/drm-bridge-adv7511-reuse-__adv7511_power_on-off-when-probing-edid.patch b/queue-4.9/drm-bridge-adv7511-reuse-__adv7511_power_on-off-when-probing-edid.patch new file mode 100644 index 00000000000..746443ec4e5 --- /dev/null +++ b/queue-4.9/drm-bridge-adv7511-reuse-__adv7511_power_on-off-when-probing-edid.patch @@ -0,0 +1,68 @@ +From 4226d9b127cf4758ba0e07931b3f0d59f1b1a50c Mon Sep 17 00:00:00 2001 +From: John Stultz +Date: Mon, 16 Jan 2017 16:52:51 -0800 +Subject: drm/bridge: adv7511: Reuse __adv7511_power_on/off() when probing EDID + +From: John Stultz + +commit 4226d9b127cf4758ba0e07931b3f0d59f1b1a50c upstream. + +Thus this patch changes the EDID probing logic so that we +re-use the __adv7511_power_on/off() calls instead of duplciating +logic. + +This does change behavior slightly as it adds the HPD signal +pulse to the EDID probe path, but Archit has had a patch to +add HPD signal pulse to the EDID probe path before, so this +should address the cases where that helped. Another difference +is that regcache_mark_dirty() is also called in the power off +path once EDID is probed. + +Cc: David Airlie +Cc: Archit Taneja +Cc: Wolfram Sang +Cc: Lars-Peter Clausen +Cc: Laurent Pinchart +Cc: dri-devel@lists.freedesktop.org +Reviewed-by: Laurent Pinchart +Tested-by: Laurent Pinchart +Signed-off-by: John Stultz +Signed-off-by: Archit Taneja +Link: http://patchwork.freedesktop.org/patch/msgid/1484614372-15342-6-git-send-email-john.stultz@linaro.org +Signed-off-by: Nhan Nguyen +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 17 +++-------------- + 1 file changed, 3 insertions(+), 14 deletions(-) + +--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c ++++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +@@ -573,24 +573,13 @@ static int adv7511_get_modes(struct adv7 + unsigned int count; + + /* Reading the EDID only works if the device is powered */ +- if (!adv7511->powered) { +- regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, +- ADV7511_POWER_POWER_DOWN, 0); +- if (adv7511->i2c_main->irq) { +- regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(0), +- ADV7511_INT0_EDID_READY); +- regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(1), +- ADV7511_INT1_DDC_ERROR); +- } +- adv7511->current_edid_segment = -1; +- } ++ if (!adv7511->powered) ++ __adv7511_power_on(adv7511); + + edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511); + + if (!adv7511->powered) +- regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, +- ADV7511_POWER_POWER_DOWN, +- ADV7511_POWER_POWER_DOWN); ++ __adv7511_power_off(adv7511); + + kfree(adv7511->edid); + adv7511->edid = edid; diff --git a/queue-4.9/drm-bridge-adv7511-rework-adv7511_power_on-off-so-they-can-be-reused-internally.patch b/queue-4.9/drm-bridge-adv7511-rework-adv7511_power_on-off-so-they-can-be-reused-internally.patch new file mode 100644 index 00000000000..d8ed38ed4ff --- /dev/null +++ b/queue-4.9/drm-bridge-adv7511-rework-adv7511_power_on-off-so-they-can-be-reused-internally.patch @@ -0,0 +1,82 @@ +From 651e4769ba2a9f20c4b8a823ae2727bf7fa9c9f0 Mon Sep 17 00:00:00 2001 +From: John Stultz +Date: Mon, 16 Jan 2017 16:52:50 -0800 +Subject: drm/bridge: adv7511: Rework adv7511_power_on/off() so they can be reused internally + +From: John Stultz + +commit 651e4769ba2a9f20c4b8a823ae2727bf7fa9c9f0 upstream. + +In chasing down issues with EDID probing, I found some +duplicated but incomplete logic used to power the chip on and +off. + +This patch refactors the adv7511_power_on/off functions, so +they can be used for internal needs. + +Cc: David Airlie +Cc: Archit Taneja +Cc: Wolfram Sang +Cc: Lars-Peter Clausen +Cc: Laurent Pinchart +Cc: dri-devel@lists.freedesktop.org +Signed-off-by: John Stultz +Signed-off-by: Archit Taneja +Link: http://patchwork.freedesktop.org/patch/msgid/1484614372-15342-5-git-send-email-john.stultz@linaro.org +Signed-off-by: Nhan Nguyen +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c ++++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +@@ -325,7 +325,7 @@ static void adv7511_set_link_config(stru + adv7511->rgb = config->input_colorspace == HDMI_COLORSPACE_RGB; + } + +-static void adv7511_power_on(struct adv7511 *adv7511) ++static void __adv7511_power_on(struct adv7511 *adv7511) + { + adv7511->current_edid_segment = -1; + +@@ -354,6 +354,11 @@ static void adv7511_power_on(struct adv7 + 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) ++{ ++ __adv7511_power_on(adv7511); + + /* + * Most of the registers are reset during power down or when HPD is low. +@@ -362,21 +367,23 @@ static void adv7511_power_on(struct adv7 + + if (adv7511->type == ADV7533) + adv7533_dsi_power_on(adv7511); +- + adv7511->powered = true; + } + +-static void adv7511_power_off(struct adv7511 *adv7511) ++static void __adv7511_power_off(struct adv7511 *adv7511) + { + /* TODO: setup additional power down modes */ + regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, + ADV7511_POWER_POWER_DOWN, + ADV7511_POWER_POWER_DOWN); + regcache_mark_dirty(adv7511->regmap); ++} + ++static void adv7511_power_off(struct adv7511 *adv7511) ++{ ++ __adv7511_power_off(adv7511); + if (adv7511->type == ADV7533) + adv7533_dsi_power_off(adv7511); +- + adv7511->powered = false; + } + diff --git a/queue-4.9/series b/queue-4.9/series index d234309e154..64b72d32ea1 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -77,3 +77,6 @@ mips-ar7-ensure-that-serial-ports-are-properly-set-up.patch input-elan_i2c-add-elan060c-to-the-acpi-table.patch rbd-use-gfp_noio-for-parent-stat-and-data-requests.patch drm-vmwgfx-fix-ubuntu-17.10-wayland-black-screen-issue.patch +drm-bridge-adv7511-rework-adv7511_power_on-off-so-they-can-be-reused-internally.patch +drm-bridge-adv7511-reuse-__adv7511_power_on-off-when-probing-edid.patch +drm-bridge-adv7511-re-write-the-i2c-address-before-edid-probing.patch