drivers/i2c/tpm/cr50: Increase IRQ timeout

Increase the IRQ timeout to prevent issues if there is a delay
in the TPM responding to a command.  Split the no-IRQ case out
so it doesn't suffer unnecessarily.

BUG=chrome-os-partner:59191
TEST=suspend/resume testing on eve board

Change-Id: I1ea7859bc7a056a450b2b0ee32153ae43ee8699f
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://review.coreboot.org/17204
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
diff --git a/src/drivers/i2c/tpm/cr50.c b/src/drivers/i2c/tpm/cr50.c
index f7e667b..0877de0 100644
--- a/src/drivers/i2c/tpm/cr50.c
+++ b/src/drivers/i2c/tpm/cr50.c
@@ -48,6 +48,8 @@
 #define CR50_MAX_BUFSIZE	63
 #define CR50_TIMEOUT_LONG_MS	2000	/* Long timeout while waiting for TPM */
 #define CR50_TIMEOUT_SHORT_MS	2	/* Short timeout during transactions */
+#define CR50_TIMEOUT_NOIRQ_MS	20	/* Timeout for TPM ready without IRQ */
+#define CR50_TIMEOUT_IRQ_MS	100	/* Timeout for TPM ready with IRQ */
 #define CR50_DID_VID		0x00281ae0L
 
 struct tpm_inf_dev {
@@ -65,11 +67,11 @@
 
 	if (!chip->vendor.irq_status) {
 		/* Fixed delay if interrupt not supported */
-		mdelay(CR50_TIMEOUT_SHORT_MS);
+		mdelay(CR50_TIMEOUT_NOIRQ_MS);
 		return 0;
 	}
 
-	stopwatch_init_msecs_expire(&sw, 5 * CR50_TIMEOUT_SHORT_MS);
+	stopwatch_init_msecs_expire(&sw, CR50_TIMEOUT_IRQ_MS);
 
 	while (!chip->vendor.irq_status(chip->vendor.irq))
 		if (stopwatch_expired(&sw))
@@ -429,6 +431,11 @@
 		chip->vendor.irq = -1;
 #endif
 	}
+
+	if (chip->vendor.irq <= 0)
+		printk(BIOS_WARNING,
+		       "%s: No IRQ, will use %ums delay for TPM ready\n",
+		       __func__, CR50_TIMEOUT_NOIRQ_MS);
 }
 
 int tpm_vendor_probe(unsigned bus, uint32_t addr)