summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Gilling <konkers@android.com>2011-04-07 14:33:20 -0700
committerErik Gilling <konkers@android.com>2011-04-07 14:34:06 -0700
commit8426dbfc3a189907ce3a309065ebd6126ac0d555 (patch)
tree2130ce01723e31386cb135f72de9efc5f6f5c1ff
parent17a2400a982bbf7aaabe89d7bacf32f600d4e751 (diff)
parent237d326d61bbda05e90dd531d2057efe365db498 (diff)
Merge branch linux-tegra-2.6.36 into android-tegra-2.6.36
Change-Id: If54be4c2e106e24beb0ae3063156a0659fcbb943
-rw-r--r--drivers/video/tegra/dc/hdmi.c3
-rw-r--r--drivers/video/tegra/dc/nvhdcp.c35
2 files changed, 24 insertions, 14 deletions
diff --git a/drivers/video/tegra/dc/hdmi.c b/drivers/video/tegra/dc/hdmi.c
index 46c599d14b75..e390f233d43e 100644
--- a/drivers/video/tegra/dc/hdmi.c
+++ b/drivers/video/tegra/dc/hdmi.c
@@ -1137,8 +1137,7 @@ static void tegra_dc_hdmi_enable(struct tegra_dc *dc)
tegra_dc_writel(dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL);
tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
- if (!hdmi->dvi)
- tegra_nvhdcp_set_plug(hdmi->nvhdcp, 1);
+ tegra_nvhdcp_set_plug(hdmi->nvhdcp, 1);
}
static void tegra_dc_hdmi_disable(struct tegra_dc *dc)
diff --git a/drivers/video/tegra/dc/nvhdcp.c b/drivers/video/tegra/dc/nvhdcp.c
index fe8beb97c38a..2229c6b93ad3 100644
--- a/drivers/video/tegra/dc/nvhdcp.c
+++ b/drivers/video/tegra/dc/nvhdcp.c
@@ -116,6 +116,7 @@ static int nvhdcp_i2c_read(struct tegra_nvhdcp *nvhdcp, u8 reg,
size_t len, void *data)
{
int status;
+ int retries = 15;
struct i2c_msg msg[] = {
{
.addr = 0x74 >> 1, /* primary link */
@@ -131,7 +132,16 @@ static int nvhdcp_i2c_read(struct tegra_nvhdcp *nvhdcp, u8 reg,
},
};
- status = i2c_transfer(nvhdcp->client->adapter, msg, ARRAY_SIZE(msg));
+ do {
+ if (!nvhdcp_is_plugged(nvhdcp)) {
+ nvhdcp_err("disconnect during i2c xfer\n");
+ return -EIO;
+ }
+ status = i2c_transfer(nvhdcp->client->adapter,
+ msg, ARRAY_SIZE(msg));
+ if (retries > 1)
+ msleep(250);
+ } while ((status < 0) && retries--);
if (status < 0) {
nvhdcp_err("i2c xfer error %d\n", status);
@@ -154,11 +164,21 @@ static int nvhdcp_i2c_write(struct tegra_nvhdcp *nvhdcp, u8 reg,
.buf = buf,
},
};
+ int retries = 15;
buf[0] = reg;
memcpy(buf + 1, data, len);
- status = i2c_transfer(nvhdcp->client->adapter, msg, ARRAY_SIZE(msg));
+ do {
+ if (!nvhdcp_is_plugged(nvhdcp)) {
+ nvhdcp_err("disconnect during i2c xfer\n");
+ return -EIO;
+ }
+ status = i2c_transfer(nvhdcp->client->adapter,
+ msg, ARRAY_SIZE(msg));
+ if (retries > 1)
+ msleep(250);
+ } while ((status < 0) && retries--);
if (status < 0) {
nvhdcp_err("i2c xfer error %d\n", status);
@@ -320,16 +340,7 @@ static inline int get_receiver_ri(struct tegra_nvhdcp *nvhdcp, u16 *r)
static int get_bcaps(struct tegra_nvhdcp *nvhdcp, u8 *b_caps)
{
- int e, retries = 4;
- do {
- e = nvhdcp_i2c_read8(nvhdcp, 0x40, b_caps);
- if (!e)
- return 0;
- if (retries > 1)
- msleep(100);
- } while (--retries);
-
- return -EIO;
+ return nvhdcp_i2c_read8(nvhdcp, 0x40, b_caps);
}
static int get_ksvfifo(struct tegra_nvhdcp *nvhdcp,