| From 73dff9ed8a2a1b59d017322f30050ac724cff737 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Oct 2019 12:44:06 -0700 |
| Subject: drm/bridge: dw-hdmi: Refuse DDC/CI transfers on the internal I2C |
| controller |
| |
| From: Matthias Kaehlcke <mka@chromium.org> |
| |
| [ Upstream commit bee447e224b2645911c5d06e35dc90d8433fcef6 ] |
| |
| The DDC/CI protocol involves sending a multi-byte request to the |
| display via I2C, which is typically followed by a multi-byte |
| response. The internal I2C controller only allows single byte |
| reads/writes or reads of 8 sequential bytes, hence DDC/CI is not |
| supported when the internal I2C controller is used. The I2C |
| transfers complete without errors, however the data in the response |
| is garbage. Abort transfers to/from slave address 0x37 (DDC) with |
| -EOPNOTSUPP, to make it evident that the communication is failing. |
| |
| Signed-off-by: Matthias Kaehlcke <mka@chromium.org> |
| Reviewed-by: Douglas Anderson <dianders@chromium.org> |
| Reviewed-by: Sean Paul <sean@poorly.run> |
| Acked-by: Neil Armstrong <narmstrong@baylibre.com> |
| Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20191002124354.v2.1.I709dfec496f5f0b44a7b61dcd4937924da8d8382@changeid |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| index 521d689413c8..3e82d604201e 100644 |
| --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| @@ -36,6 +36,7 @@ |
| #include "dw-hdmi-cec.h" |
| #include "dw-hdmi.h" |
| |
| +#define DDC_CI_ADDR 0x37 |
| #define DDC_SEGMENT_ADDR 0x30 |
| |
| #define HDMI_EDID_LEN 512 |
| @@ -398,6 +399,15 @@ static int dw_hdmi_i2c_xfer(struct i2c_adapter *adap, |
| u8 addr = msgs[0].addr; |
| int i, ret = 0; |
| |
| + if (addr == DDC_CI_ADDR) |
| + /* |
| + * The internal I2C controller does not support the multi-byte |
| + * read and write operations needed for DDC/CI. |
| + * TOFIX: Blacklist the DDC/CI address until we filter out |
| + * unsupported I2C operations. |
| + */ |
| + return -EOPNOTSUPP; |
| + |
| dev_dbg(hdmi->dev, "xfer: num: %d, addr: %#x\n", num, addr); |
| |
| for (i = 0; i < num; i++) { |
| -- |
| 2.20.1 |
| |