diff --git a/arch/arm/boards/optimus/optimus.c b/arch/arm/boards/optimus/optimus.c
index b7c326b..83db7b7 100644
--- a/arch/arm/boards/optimus/optimus.c
+++ b/arch/arm/boards/optimus/optimus.c
@@ -56,6 +56,8 @@
 
 #define SPACECAST_EMAC1_PHY_ADDR	1
 
+#define SPACECAST_TPM_I2C_ADDR		0x20
+
 #ifdef CONFIG_SPI
 //Legacy spi
 
@@ -187,11 +189,17 @@
 	.platform_data = &pdata,
 };
 
-static struct i2c_board_info i2c_devices[] = {
+static struct i2c_board_info i2c_devices_optimus[] = {
 	{
 		I2C_BOARD_INFO("eeprom", CFG_I2C_EEPROM0_ADDR),
 	},
 };
+
+static struct i2c_board_info i2c_devices_spacecast[] = {
+	{
+		I2C_BOARD_INFO("tpm_i2c_infineon", SPACECAST_TPM_I2C_ADDR),
+	},
+};
 #endif
 
 #ifdef CONFIG_OTP
@@ -259,7 +267,13 @@
 	register_device(&fast_uart_device);
 
 #ifdef CONFIG_I2C_C2K
-	i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
+	if (get_board_id() == SPACECAST_BOARD_ID) {
+		i2c_register_board_info(0, i2c_devices_spacecast,
+					ARRAY_SIZE(i2c_devices_spacecast));
+	} else {
+		i2c_register_board_info(0, i2c_devices_optimus,
+					ARRAY_SIZE(i2c_devices_optimus));
+	}
 	register_device(&c2k_i2c_dev);
 #endif
 
diff --git a/arch/arm/configs/spacecast_defconfig b/arch/arm/configs/spacecast_defconfig
index f7887a7..bba1fe1 100644
--- a/arch/arm/configs/spacecast_defconfig
+++ b/arch/arm/configs/spacecast_defconfig
@@ -51,6 +51,8 @@
 CONFIG_MTD=y
 CONFIG_UBI=y
 CONFIG_DRIVER_OTP=y
+CONFIG_TPM=y
+CONFIG_TPM_I2C_INFINEON=y
 CONFIG_FS_CRAMFS=y
 CONFIG_DIGEST=y
 CONFIG_SHA1=y
diff --git a/common/Kconfig b/common/Kconfig
index 42696ce..54749c2 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -490,6 +490,14 @@
 	  detect this situation and switch back to a different kernel/rootfs
 	  image.
 
+if TPM
+
+config TPM_LITE
+	bool "Lightweight TPM library"
+	default y
+
+endif
+
 endmenu
 
 menu "Debugging                     "
diff --git a/common/Makefile b/common/Makefile
index bb476ca..9bdeef7 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -27,6 +27,7 @@
 obj-$(CONFIG_PASSWORD) += password.o
 obj-$(CONFIG_MODULES) += module.o
 extra-$(CONFIG_MODULES) += module.lds
+obj-$(CONFIG_TPM_LITE) += tlcl.o
 
 ifdef CONFIG_DEFAULT_ENVIRONMENT
 $(obj)/startup.o: include/generated/barebox_default_env.h
diff --git a/common/tlcl.c b/common/tlcl.c
new file mode 100644
index 0000000..5e1ecae
--- /dev/null
+++ b/common/tlcl.c
@@ -0,0 +1,334 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* A lightweight TPM command library.
+ *
+ * The general idea is that TPM commands are array of bytes whose
+ * fields are mostly compile-time constant.  The goal is to build much
+ * of the commands at compile time (or build time) and change some of
+ * the fields at run time as needed.  The code in
+ * utility/tlcl_generator.c builds structures containing the commands,
+ * as well as the offsets of the fields that need to be set at run
+ * time.
+ */
+
+#include <common.h>
+#include <string.h>
+#include <tpm_lite/tlcl.h>
+#include <tpm.h>
+#include "tlcl_internal.h"
+#include "tlcl_structures.h"
+
+#ifdef FOR_TEST
+#include <stdio.h>
+#define VBDEBUG(format, args...) printf(format, ## args)
+#else
+#define VBDEBUG(format, args...) printk(KERN_DEBUG format, ## args)
+#endif
+
+#ifdef DEBUG
+#include <assert.h>
+#else
+#define assert(x) ((void)0)
+#endif
+
+#define VB2_ERROR_UNKNOWN	-1
+#define VB2_SUCCESS		0
+
+static int tpm_send_receive(const uint8_t *request,
+                     uint32_t request_length,
+                     uint8_t *response,
+                     uint32_t *response_length)
+{
+	size_t len = *response_length;
+	if (tis_sendrecv(request, request_length, response, &len))
+		return VB2_ERROR_UNKNOWN;
+	/* check 64->32bit overflow and (re)check response buffer overflow */
+	if (len > *response_length)
+		return VB2_ERROR_UNKNOWN;
+	*response_length = len;
+	return VB2_SUCCESS;
+}
+
+/* Sets the size field of a TPM command. */
+static inline void set_tpm_command_size(uint8_t* buffer, uint32_t size) {
+	to_tpm_uint32(buffer + sizeof(uint16_t), size);
+}
+
+/* Gets the size field of a TPM command. */
+__attribute__((unused))
+static inline int tpm_command_size(const uint8_t* buffer) {
+	uint32_t size;
+	from_tpm_uint32(buffer + sizeof(uint16_t), &size);
+	return (int) size;
+}
+
+/* Gets the code field of a TPM command. */
+static inline int tpm_command_code(const uint8_t* buffer) {
+	uint32_t code;
+	from_tpm_uint32(buffer + sizeof(uint16_t) + sizeof(uint32_t), &code);
+	return code;
+}
+
+/* Gets the return code field of a TPM result. */
+static inline int tpm_return_code(const uint8_t* buffer) {
+	return tpm_command_code(buffer);
+}
+
+/* Like TlclSendReceive below, but do not retry if NEEDS_SELFTEST or
+ * DOING_SELFTEST errors are returned.
+ */
+static uint32_t tlcl_send_receive_no_retry(const uint8_t* request,
+                                           uint8_t* response, int max_length) {
+	uint32_t response_length = max_length;
+	uint32_t result;
+
+        result = tpm_send_receive(request, tpm_command_size(request),
+                                  response, &response_length);
+        if (0 != result) {
+        	/* Communication with TPM failed, so response is garbage */
+        	VBDEBUG("TPM: command 0x%x send/receive failed: 0x%x\n",
+        		tpm_command_code(request), result);
+        	return result;
+        }
+        /* Otherwise, use the result code from the response */
+        result = tpm_return_code(response);
+
+        /* TODO: add paranoia about returned response_length vs. max_length
+         * (and possibly expected length from the response header).  See
+         * crosbug.com/17017 */
+
+        VBDEBUG("TPM: command 0x%x returned 0x%x\n",
+        	tpm_command_code(request), result);
+
+        return result;
+}
+
+
+/* Sends a TPM command and gets a response.  Returns 0 if success or the TPM
+ * error code if error. Waits for the self test to complete if needed. */
+uint32_t tlcl_send_receive(const uint8_t* request, uint8_t* response,
+			   int max_length) {
+	uint32_t result = tlcl_send_receive_no_retry(request, response,
+						     max_length);
+	/* If the command fails because the self test has not completed, try it
+	 * again after attempting to ensure that the self test has completed. */
+	if (result == TPM_E_NEEDS_SELFTEST || result == TPM_E_DOING_SELFTEST) {
+		result = tlcl_continue_self_test();
+		if (result != TPM_SUCCESS)
+			return result;
+#if defined(TPM_BLOCKING_CONTINUESELFTEST) || defined(VB_RECOVERY_MODE)
+		/* Retry only once */
+		result = tlcl_send_receive_no_retry(request, response,
+		                                    max_length);
+#else
+                /* This needs serious testing. The TPM specification says: "iii.
+                 * The caller MUST wait for the actions of TPM_ContinueSelfTest
+                 * to complete before reissuing the command C1."  But, if
+                 * ContinueSelfTest is non-blocking, how do we know that the
+                 * actions have completed other than trying again? */
+		do {
+			result = tlcl_send_receive_no_retry(request, response,
+			                                    max_length);
+		} while (result == TPM_E_DOING_SELFTEST);
+#endif
+	}
+	return result;
+}
+
+/* Sends a command and returns the error code. */
+static uint32_t send(const uint8_t* command) {
+	uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE];
+	return tlcl_send_receive(command, response, sizeof(response));
+}
+
+/* Exported functions. */
+
+uint32_t tlcl_lib_init(void) {
+	if (tis_init())
+		return VB2_ERROR_UNKNOWN;
+	if (tis_open())
+		return VB2_ERROR_UNKNOWN;
+	return VB2_SUCCESS;
+}
+
+uint32_t tlcl_startup(void) {
+	VBDEBUG("TPM: Startup\n");
+	return send(tpm_startup_cmd.buffer);
+}
+
+uint32_t tlcl_resume(void) {
+  VBDEBUG("TPM: Resume\n");
+  return send(tpm_resume_cmd.buffer);
+}
+
+uint32_t tlcl_self_test_full(void)
+{
+	VBDEBUG("TPM: Self test full\n");
+	return send(tpm_selftestfull_cmd.buffer);
+}
+
+uint32_t tlcl_continue_self_test(void)
+{
+	uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE];
+	VBDEBUG("TPM: Continue self test\n");
+	/* Call the No Retry version of SendReceive to avoid recursion. */
+	return tlcl_send_receive_no_retry(tpm_continueselftest_cmd.buffer,
+	                                  response, sizeof(response));
+}
+
+uint32_t tlcl_define_space(uint32_t index, uint32_t perm, uint32_t size)
+{
+	struct s_tpm_nv_definespace_cmd cmd;
+	VBDEBUG("TPM: TlclDefineSpace(0x%x, 0x%x, %d)\n", index, perm, size);
+	memcpy(&cmd, &tpm_nv_definespace_cmd, sizeof(cmd));
+	to_tpm_uint32(cmd.buffer + tpm_nv_definespace_cmd.index, index);
+	to_tpm_uint32(cmd.buffer + tpm_nv_definespace_cmd.perm, perm);
+	to_tpm_uint32(cmd.buffer + tpm_nv_definespace_cmd.size, size);
+	return send(cmd.buffer);
+}
+
+uint32_t tlcl_write(uint32_t index, const void* data, uint32_t length)
+{
+	struct s_tpm_nv_write_cmd cmd;
+	uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE];
+	const int total_length =
+			kTpmRequestHeaderLength + kWriteInfoLength + length;
+
+	VBDEBUG("TPM: tlcl_write(0x%x, %d)\n", index, length);
+	memcpy(&cmd, &tpm_nv_write_cmd, sizeof(cmd));
+	assert(total_length <= TPM_LARGE_ENOUGH_COMMAND_SIZE);
+	set_tpm_command_size(cmd.buffer, total_length);
+
+	to_tpm_uint32(cmd.buffer + tpm_nv_write_cmd.index, index);
+	to_tpm_uint32(cmd.buffer + tpm_nv_write_cmd.length, length);
+	memcpy(cmd.buffer + tpm_nv_write_cmd.data, data, length);
+
+	return tlcl_send_receive(cmd.buffer, response, sizeof(response));
+}
+
+uint32_t tlcl_read(uint32_t index, void* data, uint32_t length)
+{
+	struct s_tpm_nv_read_cmd cmd;
+	uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE];
+	uint32_t result_length;
+	uint32_t result;
+
+	VBDEBUG("TPM: tlcl_read(0x%x, %d)\n", index, length);
+	memcpy(&cmd, &tpm_nv_read_cmd, sizeof(cmd));
+	to_tpm_uint32(cmd.buffer + tpm_nv_read_cmd.index, index);
+	to_tpm_uint32(cmd.buffer + tpm_nv_read_cmd.length, length);
+
+	result = tlcl_send_receive(cmd.buffer, response, sizeof(response));
+	if (result == TPM_SUCCESS && length > 0) {
+                uint8_t* nv_read_cursor = response + kTpmResponseHeaderLength;
+                from_tpm_uint32(nv_read_cursor, &result_length);
+                nv_read_cursor += sizeof(uint32_t);
+                memcpy(data, nv_read_cursor, result_length);
+	}
+
+	return result;
+}
+
+
+uint32_t tlcl_assert_physical_presence(void) {
+	VBDEBUG("TPM: Asserting physical presence\n");
+	return send(tpm_ppassert_cmd.buffer);
+}
+
+uint32_t tlcl_physical_presence_cmd_enable(void) {
+	VBDEBUG("TPM: Enable the physical presence command\n");
+	return send(tpm_ppenable_cmd.buffer);
+}
+
+uint32_t tlcl_finalize_physical_presence(void) {
+	VBDEBUG("TPM: Enable PP cmd, disable HW pp, and set lifetime lock\n");
+	return send(tpm_finalizepp_cmd.buffer);
+}
+
+uint32_t tlcl_set_nv_locked(void) {
+	VBDEBUG("TPM: Set NV locked\n");
+	return tlcl_define_space(TPM_NV_INDEX_LOCK, 0, 0);
+}
+
+uint32_t tlcl_force_clear(void) {
+	VBDEBUG("TPM: Force clear\n");
+	return send(tpm_forceclear_cmd.buffer);
+}
+
+uint32_t tlcl_set_enable(void) {
+	VBDEBUG("TPM: Enabling TPM\n");
+	return send(tpm_physicalenable_cmd.buffer);
+}
+
+uint32_t tlcl_set_deactivated(uint8_t flag)
+{
+	struct s_tpm_physicalsetdeactivated_cmd cmd;
+	VBDEBUG("TPM: SetDeactivated(%d)\n", flag);
+	memcpy(&cmd, &tpm_physicalsetdeactivated_cmd, sizeof(cmd));
+	*(cmd.buffer + cmd.deactivated) = flag;
+	return send(cmd.buffer);
+}
+
+uint32_t tlcl_get_permanent_flags(TPM_PERMANENT_FLAGS* pflags)
+{
+	uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE];
+	uint32_t size;
+	uint32_t result = tlcl_send_receive(tpm_getflags_cmd.buffer, response,
+	                                    sizeof(response));
+	if (result != TPM_SUCCESS)
+		return result;
+	from_tpm_uint32(response + kTpmResponseHeaderLength, &size);
+	assert(size == sizeof(TPM_PERMANENT_FLAGS));
+	memcpy(pflags, response + kTpmResponseHeaderLength + sizeof(size),
+	       sizeof(TPM_PERMANENT_FLAGS));
+	return result;
+}
+
+uint32_t tlcl_get_flags(uint8_t* disable, uint8_t* deactivated,
+                        uint8_t *nvlocked)
+{
+	TPM_PERMANENT_FLAGS pflags;
+	uint32_t result = tlcl_get_permanent_flags(&pflags);
+	if (result == TPM_SUCCESS) {
+                if (disable)
+                        *disable = pflags.disable;
+                if (deactivated)
+                        *deactivated = pflags.deactivated;
+                if (nvlocked)
+                        *nvlocked = pflags.nvLocked;
+                VBDEBUG("TPM: flags disable=%d, deactivated=%d, nvlocked=%d\n",
+                	pflags.disable, pflags.deactivated, pflags.nvLocked);
+	}
+	return result;
+}
+
+uint32_t tlcl_set_global_lock(void)
+{
+	uint32_t x;
+	VBDEBUG("TPM: Set global lock\n");
+	return tlcl_write(TPM_NV_INDEX0, (uint8_t*) &x, 0);
+}
+
+uint32_t tlcl_extend(int pcr_num, const uint8_t* in_digest,
+                     uint8_t* out_digest)
+{
+	struct s_tpm_extend_cmd cmd;
+	uint8_t response[kTpmResponseHeaderLength + kPcrDigestLength];
+	uint32_t result;
+
+	memcpy(&cmd, &tpm_extend_cmd, sizeof(cmd));
+	to_tpm_uint32(cmd.buffer + tpm_extend_cmd.pcrNum, pcr_num);
+	memcpy(cmd.buffer + cmd.inDigest, in_digest, kPcrDigestLength);
+
+	result = tlcl_send_receive(cmd.buffer, response, sizeof(response));
+	if (result != TPM_SUCCESS)
+		return result;
+
+	if (out_digest)
+		memcpy(out_digest, response + kTpmResponseHeaderLength,
+		       kPcrDigestLength);
+	return result;
+}
diff --git a/common/tlcl_internal.h b/common/tlcl_internal.h
new file mode 100644
index 0000000..8261b0d
--- /dev/null
+++ b/common/tlcl_internal.h
@@ -0,0 +1,61 @@
+/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef TPM_LITE_TLCL_INTERNAL_H_
+#define TPM_LITE_TLCL_INTERNAL_H_
+
+/*
+ * These numbers derive from adding the sizes of command fields as shown in the
+ * TPM commands manual.
+ */
+#define kTpmRequestHeaderLength 10
+#define kTpmResponseHeaderLength 10
+#define kTpmReadInfoLength 12
+#define kEncAuthLength 20
+#define kPcrDigestLength 20
+
+
+/*
+ * Conversion functions.  to_tpm_TYPE puts a value of type TYPE into a TPM
+ * command buffer. from_tpm_TYPE gets a value of type TYPE from a TPM command
+ * buffer into a variable.
+ */
+__attribute__((unused))
+static inline void to_tpm_uint32(uint8_t *buffer, uint32_t x) {
+	buffer[0] = (uint8_t)(x >> 24);
+	buffer[1] = (uint8_t)((x >> 16) & 0xff);
+	buffer[2] = (uint8_t)((x >> 8) & 0xff);
+	buffer[3] = (uint8_t)(x & 0xff);
+}
+
+/*
+ * See comment for above function.
+ */
+__attribute__((unused))
+static inline void from_tpm_uint32(const uint8_t *buffer, uint32_t *x) {
+	*x = ((buffer[0] << 24) |
+	      (buffer[1] << 16) |
+	      (buffer[2] << 8) |
+	      buffer[3]);
+}
+
+/*
+ * See comment for above function.
+ */
+__attribute__((unused))
+static inline void to_tpm_uint16(uint8_t *buffer, uint16_t x) {
+	buffer[0] = (uint8_t)(x >> 8);
+	buffer[1] = (uint8_t)(x & 0xff);
+}
+
+/*
+ * See comment for above function.
+ */
+__attribute__((unused))
+static inline void from_tpm_uint16(const uint8_t *buffer, uint16_t *x) {
+	*x = (buffer[0] << 8) | buffer[1];
+}
+
+#endif  /* TPM_LITE_TLCL_INTERNAL_H_ */
diff --git a/common/tlcl_structures.h b/common/tlcl_structures.h
new file mode 100644
index 0000000..36c1bb9
--- /dev/null
+++ b/common/tlcl_structures.h
@@ -0,0 +1,138 @@
+/* This file is automatically generated */
+
+const struct s_tpm_extend_cmd{
+  uint8_t buffer[34];
+  uint16_t pcrNum;
+  uint16_t inDigest;
+} tpm_extend_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x14, },
+10, 14, };
+
+const struct s_tpm_get_random_cmd{
+  uint8_t buffer[14];
+  uint16_t bytesRequested;
+} tpm_get_random_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x46, },
+10, };
+
+const struct s_tpm_getownership_cmd{
+  uint8_t buffer[22];
+} tpm_getownership_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x11, },
+};
+
+const struct s_tpm_getpermissions_cmd{
+  uint8_t buffer[22];
+  uint16_t index;
+} tpm_getpermissions_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x4, },
+18, };
+
+const struct s_tpm_getstclearflags_cmd{
+  uint8_t buffer[22];
+} tpm_getstclearflags_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x9, },
+};
+
+const struct s_tpm_getflags_cmd{
+  uint8_t buffer[22];
+} tpm_getflags_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x8, },
+};
+
+const struct s_tpm_physicalsetdeactivated_cmd{
+  uint8_t buffer[11];
+  uint16_t deactivated;
+} tpm_physicalsetdeactivated_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x72, },
+10, };
+
+const struct s_tpm_physicalenable_cmd{
+  uint8_t buffer[10];
+} tpm_physicalenable_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x6f, },
+};
+
+const struct s_tpm_physicaldisable_cmd{
+  uint8_t buffer[10];
+} tpm_physicaldisable_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x70, },
+};
+
+const struct s_tpm_forceclear_cmd{
+  uint8_t buffer[10];
+} tpm_forceclear_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x5d, },
+};
+
+const struct s_tpm_readpubek_cmd{
+  uint8_t buffer[30];
+} tpm_readpubek_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x7c, },
+};
+
+const struct s_tpm_continueselftest_cmd{
+  uint8_t buffer[10];
+} tpm_continueselftest_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x53, },
+};
+
+const struct s_tpm_selftestfull_cmd{
+  uint8_t buffer[10];
+} tpm_selftestfull_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x50, },
+};
+
+const struct s_tpm_resume_cmd{
+  uint8_t buffer[12];
+} tpm_resume_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x99, 0x0, 0x2, },
+};
+
+const struct s_tpm_savestate_cmd{
+  uint8_t buffer[10];
+} tpm_savestate_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x98, },
+};
+
+const struct s_tpm_startup_cmd{
+  uint8_t buffer[12];
+} tpm_startup_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x99, 0x0, 0x1, },
+};
+
+const struct s_tpm_finalizepp_cmd{
+  uint8_t buffer[12];
+} tpm_finalizepp_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x2, 0xa0, },
+};
+
+const struct s_tpm_pplock_cmd{
+  uint8_t buffer[12];
+} tpm_pplock_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x0, 0x4, },
+};
+
+const struct s_tpm_ppenable_cmd{
+  uint8_t buffer[12];
+} tpm_ppenable_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x0, 0x20, },
+};
+
+const struct s_tpm_ppassert_cmd{
+  uint8_t buffer[12];
+} tpm_ppassert_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x0, 0x8, },
+};
+
+const struct s_tpm_pcr_read_cmd{
+  uint8_t buffer[14];
+  uint16_t pcrNum;
+} tpm_pcr_read_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x15, },
+10, };
+
+const struct s_tpm_nv_read_cmd{
+  uint8_t buffer[22];
+  uint16_t index;
+  uint16_t length;
+} tpm_nv_read_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0xcf, },
+10, 18, };
+
+const struct s_tpm_nv_write_cmd{
+  uint8_t buffer[256];
+  uint16_t index;
+  uint16_t length;
+  uint16_t data;
+} tpm_nv_write_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, },
+10, 18, 22, };
+
+const struct s_tpm_nv_definespace_cmd{
+  uint8_t buffer[101];
+  uint16_t index;
+  uint16_t perm;
+  uint16_t size;
+} tpm_nv_definespace_cmd = {{0x0, 0xc1, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x18, 0, 0, 0, 0, 0x0, 0x3, 0, 0, 0, 0x1f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0, 0x3, 0, 0, 0, 0x1f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0, 0x17, },
+12, 70, 77, };
+
+const int kWriteInfoLength = 12;
+const int kNvDataPublicPermissionsOffset = 60;
diff --git a/drivers/Kconfig b/drivers/Kconfig
index db351f7..eb7d815 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -14,5 +14,6 @@
 source "drivers/mfd/Kconfig"
 source "drivers/led/Kconfig"
 source "drivers/otp/Kconfig"
+source "drivers/tpm/Kconfig"
 
 endmenu
diff --git a/drivers/Makefile b/drivers/Makefile
index 7ee324e..a7cce32 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -13,4 +13,5 @@
 obj-$(CONFIG_LED) += led/
 obj-y += otp/
 obj-$(CONFIG_COMCERTO_SATA)	+= sata/
+obj-y += tpm/
 
diff --git a/drivers/tpm/Kconfig b/drivers/tpm/Kconfig
new file mode 100644
index 0000000..6a82130
--- /dev/null
+++ b/drivers/tpm/Kconfig
@@ -0,0 +1,12 @@
+menu "TPM driver                "
+
+config TPM
+	bool "Enable TPM driver support"
+	default n
+
+config TPM_I2C_INFINEON
+	depends on TPM && I2C
+	bool "Enable driver for Infineon TPMs connected to an I2C bus"
+	default n
+
+endmenu
diff --git a/drivers/tpm/Makefile b/drivers/tpm/Makefile
new file mode 100644
index 0000000..9eb918f
--- /dev/null
+++ b/drivers/tpm/Makefile
@@ -0,0 +1,2 @@
+obj-$(CONFIG_TPM) += tis.o
+obj-$(CONFIG_TPM_I2C_INFINEON) += tpm_i2c_infineon.o
diff --git a/drivers/tpm/tis.c b/drivers/tpm/tis.c
new file mode 100644
index 0000000..7c9a89b
--- /dev/null
+++ b/drivers/tpm/tis.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2011 Infineon Technologies
+ * Copyright 2013 Google Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but without any warranty; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <asm/byteorder.h>
+#include <common.h>
+#include <stdint.h>
+#include <string.h>
+#include <tpm.h>
+#include "tpm.h"
+
+#ifdef DEBUG
+#include <assert.h>
+#define ASSERT(x) assert(x)
+#else
+#define ASSERT(x) ((void)0)
+#endif
+
+#define BIOS_DEBUG KERN_DEBUG
+
+/* global structure for tpm chip data */
+struct tpm_chip g_chip;
+
+#define TPM_CMD_COUNT_BYTE 2
+#define TPM_CMD_ORDINAL_BYTE 6
+#define TPM_VALID_STATUS (1 << 7)
+
+int tis_open(void)
+{
+	if (!g_chip.is_open) {
+		printk(BIOS_DEBUG "TPM is not available.\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+int tis_close(void)
+{
+	return 0;
+}
+
+int tis_init(void)
+{
+	if (!g_chip.is_open) {
+		printk(BIOS_DEBUG "TPM is not available.\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+static ssize_t tpm_transmit(const uint8_t *buf, size_t bufsiz)
+{
+	int rc;
+	uint32_t count, ordinal;
+
+	struct tpm_chip *chip = &g_chip;
+
+	memcpy(&count, buf + TPM_CMD_COUNT_BYTE, sizeof(count));
+	count = be32_to_cpu(count);
+	memcpy(&ordinal, buf + TPM_CMD_ORDINAL_BYTE, sizeof(ordinal));
+	ordinal = be32_to_cpu(ordinal);
+
+	if (count == 0) {
+		printk(BIOS_DEBUG "tpm_transmit: no data\n");
+		return -1;
+	}
+	if (count > bufsiz) {
+		printk(BIOS_DEBUG "tpm_transmit: invalid count value %x %zx\n",
+			count, bufsiz);
+		return -1;
+	}
+
+	ASSERT(chip->vendor.send);
+	rc = chip->vendor.send(chip, (uint8_t *) buf, count);
+	if (rc < 0) {
+		printk(BIOS_DEBUG "tpm_transmit: tpm_send error\n");
+		goto out;
+	}
+
+	if (chip->vendor.irq)
+		goto out_recv;
+
+	int timeout = 2 * 60 * 1000; /* two minutes timeout */
+	while (timeout) {
+		ASSERT(chip->vendor.status);
+		uint8_t status = chip->vendor.status(chip);
+		if ((status & chip->vendor.req_complete_mask) ==
+		    chip->vendor.req_complete_val) {
+			goto out_recv;
+		}
+
+		if ((status == chip->vendor.req_canceled)) {
+			printk(BIOS_DEBUG "tpm_transmit: Operation Canceled\n");
+			rc = -1;
+			goto out;
+		}
+		mdelay(TPM_TIMEOUT);
+		timeout--;
+	}
+
+	ASSERT(chip->vendor.cancel);
+	chip->vendor.cancel(chip);
+	printk(BIOS_DEBUG "tpm_transmit: Operation Timed out\n");
+	rc = -1; //ETIME;
+	goto out;
+
+out_recv:
+
+	rc = chip->vendor.recv(chip, (uint8_t *) buf, TPM_BUFSIZE);
+	if (rc < 0)
+		printk(BIOS_DEBUG "tpm_transmit: tpm_recv: error %d\n", rc);
+out:
+	return rc;
+}
+
+int tis_sendrecv(const uint8_t *sendbuf, size_t sbuf_size,
+		uint8_t *recvbuf, size_t *rbuf_len)
+{
+	uint8_t buf[TPM_BUFSIZE];
+
+	if (sizeof(buf) < sbuf_size)
+		return -1;
+
+	memcpy(buf, sendbuf, sbuf_size);
+
+	int len = tpm_transmit(buf, sbuf_size);
+
+	if (len < 10) {
+		*rbuf_len = 0;
+		return -1;
+	}
+
+	if (len > *rbuf_len) {
+		*rbuf_len = len;
+		return -1;
+	}
+
+	memcpy(recvbuf, buf, len);
+	*rbuf_len = len;
+
+	return 0;
+}
diff --git a/drivers/tpm/tpm.h b/drivers/tpm/tpm.h
new file mode 100644
index 0000000..a34a0d5
--- /dev/null
+++ b/drivers/tpm/tpm.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011 Infineon Technologies
+ *
+ * Authors:
+ * Peter Huewe <huewe.external@infineon.com>
+ *
+ * Version: 2.1.1
+ *
+ * Description:
+ * Device driver for TCG/TCPA TPM (trusted platform module).
+ * Specifications at www.trustedcomputinggroup.org
+ *
+ * It is based on the Linux kernel driver tpm.c from Leendert van
+ * Dorn, Dave Safford, Reiner Sailer, and Kyleen Hall.
+ *
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __DRIVERS_TPM_TPM_H__
+#define __DRIVERS_TPM_TPM_H__
+
+#include <stdint.h>
+
+enum tpm_timeout {
+	TPM_TIMEOUT = 1,	/* msecs */
+};
+
+/* Size of external transmit buffer (used for stack buffer in tpm_sendrecv) */
+#define TPM_BUFSIZE 1260
+
+/* Index of fields in TPM command buffer */
+#define TPM_CMD_SIZE_BYTE 2
+#define TPM_CMD_ORDINAL_BYTE 6
+
+/* Index of Count field in TPM response buffer */
+#define TPM_RSP_SIZE_BYTE 2
+#define TPM_RSP_RC_BYTE 6
+
+struct tpm_chip;
+
+struct tpm_vendor_specific {
+	const uint8_t req_complete_mask;
+	const uint8_t req_complete_val;
+	const uint8_t req_canceled;
+	int irq;
+	int (*recv)(struct tpm_chip *, uint8_t *, size_t);
+	int (*send)(struct tpm_chip *, uint8_t *, size_t);
+	void (*cancel)(struct tpm_chip *);
+	uint8_t(*status)(struct tpm_chip *);
+	int locality;
+};
+
+struct tpm_chip {
+	int is_open;
+	struct tpm_vendor_specific vendor;
+};
+
+struct tpm_input_header {
+	uint16_t tag;
+	uint32_t length;
+	uint32_t ordinal;
+} __attribute__ ((packed));
+
+struct tpm_output_header {
+	uint16_t tag;
+	uint32_t length;
+	uint32_t return_code;
+} __attribute__ ((packed));
+
+struct timeout_t {
+	uint32_t a;
+	uint32_t b;
+	uint32_t c;
+	uint32_t d;
+} __attribute__ ((packed));
+
+struct duration_t {
+	uint32_t tpm_short;
+	uint32_t tpm_medium;
+	uint32_t tpm_long;
+} __attribute__ ((packed));
+
+typedef union {
+	struct timeout_t timeout;
+	struct duration_t duration;
+} cap_t;
+
+struct tpm_getcap_params_in {
+	uint32_t cap;
+	uint32_t subcap_size;
+	uint32_t subcap;
+} __attribute__ ((packed));
+
+struct tpm_getcap_params_out {
+	uint32_t cap_size;
+	cap_t cap;
+} __attribute__ ((packed));
+
+typedef union {
+	struct tpm_input_header in;
+	struct tpm_output_header out;
+} tpm_cmd_header;
+
+typedef union {
+	struct tpm_getcap_params_out getcap_out;
+	struct tpm_getcap_params_in getcap_in;
+} tpm_cmd_params;
+
+struct tpm_cmd_t {
+	tpm_cmd_header header;
+	tpm_cmd_params params;
+} __attribute__ ((packed));
+
+#endif /* __DRIVERS_TPM_H__ */
diff --git a/drivers/tpm/tpm_i2c_infineon.c b/drivers/tpm/tpm_i2c_infineon.c
new file mode 100644
index 0000000..bd566ae
--- /dev/null
+++ b/drivers/tpm/tpm_i2c_infineon.c
@@ -0,0 +1,584 @@
+/*
+ * Copyright (C) 2011 Infineon Technologies
+ *
+ * Authors:
+ * Peter Huewe <huewe.external@infineon.com>
+ *
+ * Description:
+ * Device driver for TCG/TCPA TPM (trusted platform module).
+ * Specifications at www.trustedcomputinggroup.org
+ *
+ * This device driver implements the TPM interface as defined in
+ * the TCG TPM Interface Spec version 1.2, revision 1.0 and the
+ * Infineon I2C Protocol Stack Specification v0.20.
+ *
+ * It is based on the Linux kernel driver tpm.c from Leendert van
+ * Dorn, Dave Safford, Reiner Sailer, and Kyleen Hall.
+ *
+ * Version: 2.1.1
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <asm/byteorder.h>
+#include <common.h>
+#include <stdint.h>
+#include <string.h>
+#include <types.h>
+#include <clock.h>
+#include <driver.h>
+#include <init.h>
+#include <i2c/i2c.h>
+#include "tpm.h"
+
+#define DRIVER_NAME "tpm_i2c_infineon"
+
+#define BIOS_DEBUG KERN_DEBUG
+
+/* Address of the TPM on the I2C bus */
+#define TPM_I2C_ADDR 0x20
+
+/* max. number of iterations after I2C NAK */
+#define MAX_COUNT 3
+
+#define SLEEP_DURATION 60 /* in usec */
+
+/* max. number of iterations after I2C NAK for 'long' commands
+ * we need this especially for sending TPM_READY, since the cleanup after the
+ * transtion to the ready state may take some time, but it is unpredictable
+ * how long it will take.
+ */
+#define MAX_COUNT_LONG 50
+
+#define SLEEP_DURATION_LONG 210 /* in usec */
+
+/* expected value for DIDVID register */
+#define TPM_TIS_I2C_DID_VID_9635 0x000b15d1L
+#define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
+
+enum i2c_chip_type {
+	SLB9635,
+	SLB9645,
+	UNKNOWN,
+};
+
+static const char * const chip_name[] = {
+	[SLB9635] = "slb9635tt",
+	[SLB9645] = "slb9645tt",
+	[UNKNOWN] = "unknown/fallback to slb9635",
+};
+
+/* Structure to store I2C TPM specific stuff */
+struct tpm_inf_dev {
+	struct cdev cdev;
+	struct i2c_client *client;
+	uint8_t buf[TPM_BUFSIZE + sizeof(uint8_t)]; // max. buffer size + addr
+	enum i2c_chip_type chip_type;
+};
+
+static struct tpm_inf_dev tpm_dev;
+
+/*
+ * iic_tpm_read() - read from TPM register
+ * @addr: register address to read from
+ * @buffer: provided by caller
+ * @len: number of bytes to read
+ *
+ * Read len bytes from TPM register and put them into
+ * buffer (little-endian format, i.e. first byte is put into buffer[0]).
+ *
+ * NOTE: TPM is big-endian for multi-byte values. Multi-byte
+ * values have to be swapped.
+ *
+ * Return -1 on error, 0 on success.
+ */
+static int iic_tpm_read(uint8_t addr, uint8_t *buffer, size_t len)
+{
+	int rc;
+	int count;
+
+	if (!tpm_dev.client)
+		return -1;
+	if ((tpm_dev.chip_type == SLB9635) || (tpm_dev.chip_type == UNKNOWN)) {
+		/* slb9635 protocol should work in both cases */
+		for (count = 0; count < MAX_COUNT; count++) {
+			rc = (i2c_master_send(tpm_dev.client, &addr, 1) <= 0);
+			if (rc == 0)
+				break;  /* success, break to skip sleep */
+
+			udelay(SLEEP_DURATION);
+		}
+
+		if (rc)
+			return -1;
+
+		/* After the TPM has successfully received the register address
+		 * it needs some time, thus we're sleeping here again, before
+		 * retrieving the data
+		 */
+		for (count = 0; count < MAX_COUNT; count++) {
+			udelay(SLEEP_DURATION);
+			rc = (i2c_master_recv(tpm_dev.client, buffer, len) <= 0);
+			if (rc == 0)
+				break;  /* success, break to skip sleep */
+
+		}
+	} else {
+		/* use a combined read for newer chips
+		 * unfortunately the smbus functions are not suitable due to
+		 * the 32 byte limit of the smbus.
+		 * retries should usually not be needed, but are kept just to
+		 * be safe on the safe side.
+		 */
+		struct i2c_msg msgs[] = {
+			{
+				.addr	= tpm_dev.client->addr,
+				.flags	= 0,
+				.buf	= &addr,
+				.len	= 1,
+			},
+			{
+				.addr	= tpm_dev.client->addr,
+				.flags	= I2C_M_RD,
+				.buf	= buffer,
+				.len	= len,
+			},
+		};
+
+		for (count = 0; count < MAX_COUNT; count++) {
+			rc = (i2c_transfer(tpm_dev.client->adapter, msgs, 2) != 2);
+			if (rc == 0)
+				break;  /* break here to skip sleep */
+			udelay(SLEEP_DURATION);
+		}
+	}
+
+	/* take care of 'guard time' */
+	udelay(SLEEP_DURATION);
+	if (rc)
+		return -1;
+
+	return 0;
+}
+
+static int iic_tpm_write_generic(uint8_t addr, uint8_t *buffer, size_t len,
+				unsigned int sleep_time,
+				uint8_t max_count)
+{
+	int rc = 0;
+	int count;
+
+	if (len > TPM_BUFSIZE) {
+		printk(BIOS_DEBUG "%s: Length %zd is too large\n", __func__, len);
+		return -1;
+	}
+
+	/* prepare send buffer */
+	tpm_dev.buf[0] = addr;
+	memcpy(&(tpm_dev.buf[1]), buffer, len);
+
+	if (!tpm_dev.client)
+		return -1;
+	for (count = 0; count < max_count; count++) {
+		rc = (i2c_master_send(tpm_dev.client,
+					tpm_dev.buf, len + 1) <= 0);
+		if (rc == 0)
+			break;  /* success, break to skip sleep */
+
+		udelay(sleep_time);
+	}
+
+	/* take care of 'guard time' */
+	udelay(SLEEP_DURATION);
+	if (rc)
+		return -1;
+
+	return 0;
+}
+
+/*
+ * iic_tpm_write() - write to TPM register
+ * @addr: register address to write to
+ * @buffer: containing data to be written
+ * @len: number of bytes to write
+ *
+ * Write len bytes from provided buffer to TPM register (little
+ * endian format, i.e. buffer[0] is written as first byte).
+ *
+ * NOTE: TPM is big-endian for multi-byte values. Multi-byte
+ * values have to be swapped.
+ *
+ * NOTE: use this function instead of the iic_tpm_write_generic function.
+ *
+ * Return -EIO on error, 0 on success
+ */
+static int iic_tpm_write(uint8_t addr, uint8_t *buffer, size_t len)
+{
+	return iic_tpm_write_generic(addr, buffer, len, SLEEP_DURATION,
+			MAX_COUNT);
+}
+
+/*
+ * This function is needed especially for the cleanup situation after
+ * sending TPM_READY
+ * */
+static int iic_tpm_write_long(uint8_t addr, uint8_t *buffer, size_t len)
+{
+	return iic_tpm_write_generic(addr, buffer, len, SLEEP_DURATION_LONG,
+			MAX_COUNT_LONG);
+}
+
+#define TPM_HEADER_SIZE 10
+
+enum tis_access {
+	TPM_ACCESS_VALID = 0x80,
+	TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
+	TPM_ACCESS_REQUEST_PENDING = 0x04,
+	TPM_ACCESS_REQUEST_USE = 0x02,
+};
+
+enum tis_status {
+	TPM_STS_VALID = 0x80,
+	TPM_STS_COMMAND_READY = 0x40,
+	TPM_STS_GO = 0x20,
+	TPM_STS_DATA_AVAIL = 0x10,
+	TPM_STS_DATA_EXPECT = 0x08,
+};
+
+#define	TPM_ACCESS(l)			(0x0000 | ((l) << 4))
+#define	TPM_STS(l)			(0x0001 | ((l) << 4))
+#define	TPM_DATA_FIFO(l)		(0x0005 | ((l) << 4))
+#define	TPM_DID_VID(l)			(0x0006 | ((l) << 4))
+
+static int check_locality(struct tpm_chip *chip, int loc)
+{
+	uint8_t buf;
+
+	if (iic_tpm_read(TPM_ACCESS(loc), &buf, 1) < 0)
+		return -1;
+
+	if ((buf & (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
+		(TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) {
+		chip->vendor.locality = loc;
+		return loc;
+	}
+
+	return -1;
+}
+
+static void release_locality(struct tpm_chip *chip, int loc, int force)
+{
+	uint8_t buf;
+	if (iic_tpm_read(TPM_ACCESS(loc), &buf, 1) < 0)
+		return;
+
+	if (force || (buf & (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) ==
+			(TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) {
+		buf = TPM_ACCESS_ACTIVE_LOCALITY;
+		iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
+	}
+}
+
+static int request_locality(struct tpm_chip *chip, int loc)
+{
+	uint8_t buf = TPM_ACCESS_REQUEST_USE;
+
+	if (check_locality(chip, loc) >= 0)
+		return loc; /* we already have the locality */
+
+	iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
+
+	/* wait for burstcount */
+	int timeout = 2 * 1000; /* 2s timeout */
+	while (timeout) {
+		if (check_locality(chip, loc) >= 0)
+			return loc;
+		mdelay(TPM_TIMEOUT);
+		timeout--;
+	}
+
+	return -1;
+}
+
+static uint8_t tpm_tis_i2c_status(struct tpm_chip *chip)
+{
+	/* NOTE: Since I2C read may fail, return 0 in this case --> time-out */
+	uint8_t buf;
+	if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0)
+		return 0;
+	else
+		return buf;
+}
+
+static void tpm_tis_i2c_ready(struct tpm_chip *chip)
+{
+	/* this causes the current command to be aborted */
+	uint8_t buf = TPM_STS_COMMAND_READY;
+	iic_tpm_write_long(TPM_STS(chip->vendor.locality), &buf, 1);
+}
+
+static ssize_t get_burstcount(struct tpm_chip *chip)
+{
+	ssize_t burstcnt;
+	uint8_t buf[3];
+
+	/* wait for burstcount */
+	int timeout = 2 * 1000; /* 2s timeout */
+	while (timeout) {
+		/* Note: STS is little endian */
+		if (iic_tpm_read(TPM_STS(chip->vendor.locality) + 1, buf, 3) < 0)
+			burstcnt = 0;
+		else
+			burstcnt = (buf[2] << 16) + (buf[1] << 8) + buf[0];
+
+		if (burstcnt)
+			return burstcnt;
+		mdelay(TPM_TIMEOUT);
+		timeout--;
+	}
+	return -1;
+}
+
+static int wait_for_stat(struct tpm_chip *chip, uint8_t mask, int *status)
+{
+	unsigned long timeout = 2 * 1024;
+	while (timeout) {
+		*status = tpm_tis_i2c_status(chip);
+		if ((*status & mask) == mask)
+			return 0;
+		mdelay(TPM_TIMEOUT);
+		timeout--;
+	}
+
+	return -1;
+}
+
+static int recv_data(struct tpm_chip *chip, uint8_t *buf, size_t count)
+{
+	size_t size = 0;
+
+	while (size < count) {
+		ssize_t burstcnt = get_burstcount(chip);
+		int rc;
+
+		/* burstcount < 0 = TPM is busy */
+		if (burstcnt < 0)
+			return burstcnt;
+
+		/* limit received data to max. left */
+		if (burstcnt > (count - size))
+			burstcnt = count - size;
+
+		rc = iic_tpm_read(TPM_DATA_FIFO(chip->vendor.locality),
+				  &(buf[size]),
+				  burstcnt);
+		if (rc == 0)
+			size += burstcnt;
+
+	}
+	return size;
+}
+
+static int tpm_tis_i2c_recv(struct tpm_chip *chip, uint8_t *buf, size_t count)
+{
+	int size = 0;
+	uint32_t expected;
+	int status;
+
+	if (count < TPM_HEADER_SIZE) {
+		size = -1;
+		goto out;
+	}
+
+	/* read first 10 bytes, including tag, paramsize, and result */
+	size = recv_data(chip, buf, TPM_HEADER_SIZE);
+	if (size < TPM_HEADER_SIZE) {
+		printk(BIOS_DEBUG "tpm_tis_i2c_recv: Unable to read header\n");
+		goto out;
+	}
+
+	memcpy(&expected, buf + TPM_RSP_SIZE_BYTE, sizeof(expected));
+	expected = be32_to_cpu(expected);
+	if ((size_t)expected > count) {
+		size = -1;
+		goto out;
+	}
+
+	size += recv_data(chip, &buf[TPM_HEADER_SIZE],
+				expected - TPM_HEADER_SIZE);
+	if (size < expected) {
+		printk(BIOS_DEBUG "tpm_tis_i2c_recv: Unable to "
+			"read remainder of result\n");
+		size = -1;
+		goto out;
+	}
+
+	wait_for_stat(chip, TPM_STS_VALID, &status);
+	if (status & TPM_STS_DATA_AVAIL) {	/* retry? */
+		printk(BIOS_DEBUG "tpm_tis_i2c_recv: Error left over data\n");
+		size = -1;
+		goto out;
+	}
+
+out:
+	tpm_tis_i2c_ready(chip);
+
+	return size;
+}
+
+static int tpm_tis_i2c_send(struct tpm_chip *chip, uint8_t *buf, size_t len)
+{
+	int status;
+	size_t count = 0;
+	uint8_t sts = TPM_STS_GO;
+
+	if (len > TPM_BUFSIZE)
+		return -1; /* command is too long for our TPM, sorry */
+
+	status = tpm_tis_i2c_status(chip);
+	if ((status & TPM_STS_COMMAND_READY) == 0) {
+		tpm_tis_i2c_ready(chip);
+		if (wait_for_stat(chip, TPM_STS_COMMAND_READY, &status) < 0)
+			goto out_err;
+	}
+
+	while (count < len - 1) {
+		ssize_t burstcnt = get_burstcount(chip);
+
+		/* burstcount < 0 = TPM is busy */
+		if (burstcnt < 0)
+			return burstcnt;
+
+		if (burstcnt > (len-1-count))
+			burstcnt = len-1-count;
+
+#ifdef CONFIG_TPM_I2C_BURST_LIMITATION
+		if (burstcnt > CONFIG_TPM_I2C_BURST_LIMITATION)
+			burstcnt = CONFIG_TPM_I2C_BURST_LIMITATION;
+#endif /* CONFIG_TPM_I2C_BURST_LIMITATION */
+
+		if (iic_tpm_write(TPM_DATA_FIFO(chip->vendor.locality),
+						&(buf[count]), burstcnt) == 0)
+			count += burstcnt;
+
+		wait_for_stat(chip, TPM_STS_VALID, &status);
+		if ((status & TPM_STS_DATA_EXPECT) == 0)
+			goto out_err;
+	}
+
+	/* write last byte */
+	iic_tpm_write(TPM_DATA_FIFO(chip->vendor.locality), &(buf[count]), 1);
+
+	wait_for_stat(chip, TPM_STS_VALID, &status);
+	if ((status & TPM_STS_DATA_EXPECT) != 0)
+		goto out_err;
+
+	/* go and do it */
+	iic_tpm_write(TPM_STS(chip->vendor.locality), &sts, 1);
+
+	return len;
+
+out_err:
+	tpm_tis_i2c_ready(chip);
+
+	return -1;
+}
+
+static struct tpm_vendor_specific tpm_tis_i2c = {
+	.status = tpm_tis_i2c_status,
+	.recv = tpm_tis_i2c_recv,
+	.send = tpm_tis_i2c_send,
+	.cancel = tpm_tis_i2c_ready,
+	.req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
+	.req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
+	.req_canceled = TPM_STS_COMMAND_READY,
+};
+
+/* Initialization of I2C TPM */
+
+static int tpm_probe(struct device_d *dev)
+{
+	uint32_t vendor;
+	struct tpm_chip *chip;
+	extern struct tpm_chip g_chip;
+
+	chip = &g_chip;
+	memcpy(&chip->vendor, &tpm_tis_i2c, sizeof(struct tpm_vendor_specific));
+
+	tpm_dev.cdev.name = DRIVER_NAME;
+	tpm_dev.client = to_i2c_client(dev);
+	tpm_dev.cdev.size = 1024; // ?
+	tpm_dev.cdev.dev = dev;
+
+	/* Disable interrupts (not supported) */
+	chip->vendor.irq = 0;
+
+	if (request_locality(chip, 0) != 0)
+		goto out_err;
+
+	/* Read four bytes from DID_VID register */
+	if (iic_tpm_read(TPM_DID_VID(0), (uint8_t *)&vendor, 4) < 0)
+		goto out_release;
+
+	if (vendor == TPM_TIS_I2C_DID_VID_9645) {
+		tpm_dev.chip_type = SLB9645;
+	} else if (be32_to_cpu(vendor) == TPM_TIS_I2C_DID_VID_9635) {
+		tpm_dev.chip_type = SLB9635;
+	} else {
+		printk(BIOS_DEBUG "Vendor ID 0x%08x not recognized.\n", vendor);
+		goto out_release;
+	}
+
+	printk(BIOS_DEBUG "1.2 TPM (chip type %s device-id 0x%X)\n",
+		 chip_name[tpm_dev.chip_type], vendor >> 16);
+
+	/*
+	 * A timeout query to TPM can be placed here.
+	 * Standard timeout values are used so far
+	 */
+
+	devfs_create(&tpm_dev.cdev);
+	chip->is_open = 1;
+
+	return 0;
+
+out_release:
+	release_locality(chip, 0, 1);
+
+out_err:
+	return -1;
+}
+
+void tpm_vendor_cleanup(struct tpm_chip *chip)
+{
+	release_locality(chip, chip->vendor.locality, 1);
+}
+
+static struct driver_d tpm_i2c_infineon_driver = {
+        .name  = DRIVER_NAME,
+        .probe = tpm_probe,
+};
+
+static int tpm_i2c_infineon_init(void)
+{
+        register_driver(&tpm_i2c_infineon_driver);
+        return 0;
+}
+
+device_initcall(tpm_i2c_infineon_init);
diff --git a/include/tpm.h b/include/tpm.h
new file mode 100644
index 0000000..e25ad6a
--- /dev/null
+++ b/include/tpm.h
@@ -0,0 +1,69 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2011 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef TPM_H_
+#define TPM_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+/*
+ * tis_init()
+ *
+ * Initialize the TPM device. Returns 0 on success or -1 on
+ * failure (in case device probing did not succeed).
+ */
+int tis_init(void);
+
+/*
+ * tis_open()
+ *
+ * Requests access to locality 0 for the caller. After all commands have been
+ * completed the caller is supposed to call tis_close().
+ *
+ * Returns 0 on success, -1 on failure.
+ */
+int tis_open(void);
+
+/*
+ * tis_close()
+ *
+ * terminate the currect session with the TPM by releasing the locked
+ * locality. Returns 0 on success of -1 on failure (in case lock
+ * removal did not succeed).
+ */
+int tis_close(void);
+
+/*
+ * tis_sendrecv()
+ *
+ * Send the requested data to the TPM and then try to get its response
+ *
+ * @sendbuf - buffer of the data to send
+ * @send_size size of the data to send
+ * @recvbuf - memory to save the response to
+ * @recv_len - pointer to the size of the response buffer
+ *
+ * Returns 0 on success (and places the number of response bytes at recv_len)
+ * or -1 on failure.
+ */
+int tis_sendrecv(const u8 *sendbuf, size_t send_size, u8 *recvbuf,
+			size_t *recv_len);
+
+#endif /* TPM_H_ */
diff --git a/include/tpm_lite/tlcl.h b/include/tpm_lite/tlcl.h
new file mode 100644
index 0000000..7724592
--- /dev/null
+++ b/include/tpm_lite/tlcl.h
@@ -0,0 +1,137 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/*
+ * TPM Lightweight Command Library.
+ *
+ * A low-level library for interfacing to TPM hardware or an emulator.
+ */
+
+#ifndef TPM_LITE_TLCL_H_
+#define TPM_LITE_TLCL_H_
+#include <stdint.h>
+
+#include "tss_constants.h"
+
+/*****************************************************************************/
+/* Functions implemented in tlcl.c */
+
+/**
+ * Call this first.  Returns 0 if success, nonzero if error.
+ */
+uint32_t tlcl_lib_init(void);
+
+/**
+ * Perform a raw TPM request/response transaction.
+ */
+uint32_t tlcl_send_receive(const uint8_t *request, uint8_t *response,
+                         int max_length);
+
+/* Commands */
+
+/**
+ * Send a TPM_Startup(ST_CLEAR).  The TPM error code is returned (0 for
+ * success).
+ */
+uint32_t tlcl_startup(void);
+
+/**
+ * Resume by sending a TPM_Startup(ST_STATE).  The TPM error code is returned
+ * (0 for success).
+ */
+uint32_t tlcl_resume(void);
+
+/**
+ * Run the self test.
+ *
+ * Note---this is synchronous.  To run this in parallel with other firmware,
+ * use ContinueSelfTest().  The TPM error code is returned.
+ */
+uint32_t tlcl_self_test_full(void);
+
+/**
+ * Run the self test in the background.
+ */
+uint32_t tlcl_continue_self_test(void);
+
+/**
+ * Define a space with permission [perm].  [index] is the index for the space,
+ * [size] the usable data size.  The TPM error code is returned.
+ */
+uint32_t tlcl_define_space(uint32_t index, uint32_t perm, uint32_t size);
+
+/**
+ * Write [length] bytes of [data] to space at [index].  The TPM error code is
+ * returned.
+ */
+uint32_t tlcl_write(uint32_t index, const void *data, uint32_t length);
+
+/**
+ * Read [length] bytes from space at [index] into [data].  The TPM error code
+ * is returned.
+ */
+uint32_t tlcl_read(uint32_t index, void *data, uint32_t length);
+
+/**
+ * Assert physical presence in software.  The TPM error code is returned.
+ */
+uint32_t tlcl_assert_physical_presence(void);
+
+/**
+ * Enable the physical presence command.  The TPM error code is returned.
+ */
+uint32_t tlcl_physical_presence_cmd_enable(void);
+
+/**
+ * Finalize the physical presence settings: sofware PP is enabled, hardware PP
+ * is disabled, and the lifetime lock is set.  The TPM error code is returned.
+ */
+uint32_t tlcl_finalize_physical_presence(void);
+
+/**
+ * Set the nvLocked bit.  The TPM error code is returned.
+ */
+uint32_t tlcl_set_nv_locked(void);
+
+/**
+ * Issue a ForceClear.  The TPM error code is returned.
+ */
+uint32_t tlcl_force_clear(void);
+
+/**
+ * Issue a PhysicalEnable.  The TPM error code is returned.
+ */
+uint32_t tlcl_set_enable(void);
+
+/**
+ * Issue a SetDeactivated.  Pass 0 to activate.  Returns result code.
+ */
+uint32_t tlcl_set_deactivated(uint8_t flag);
+
+/**
+ * Get flags of interest.  Pointers for flags you aren't interested in may
+ * be NULL.  The TPM error code is returned.
+ */
+uint32_t tlcl_get_flags(uint8_t *disable, uint8_t *deactivated,
+                        uint8_t *nvlocked);
+
+/**
+ * Set the bGlobalLock flag, which only a reboot can clear.  The TPM error
+ * code is returned.
+ */
+uint32_t tlcl_set_global_lock(void);
+
+/**
+ * Perform a TPM_Extend.
+ */
+uint32_t tlcl_extend(int pcr_num, const uint8_t *in_digest,
+                     uint8_t *out_digest);
+
+/**
+ * Get the entire set of permanent flags.
+ */
+uint32_t tlcl_get_permanent_flags(TPM_PERMANENT_FLAGS *pflags);
+
+#endif  /* TPM_LITE_TLCL_H_ */
diff --git a/include/tpm_lite/tss_constants.h b/include/tpm_lite/tss_constants.h
new file mode 100644
index 0000000..883a5ad
--- /dev/null
+++ b/include/tpm_lite/tss_constants.h
@@ -0,0 +1,96 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Some TPM constants and type definitions for standalone compilation for use
+ * in the firmware
+ */
+#ifndef VBOOT_REFERENCE_TSS_CONSTANTS_H_
+#define VBOOT_REFERENCE_TSS_CONSTANTS_H_
+#include <stdint.h>
+
+#define TPM_MAX_COMMAND_SIZE 4096
+#define TPM_LARGE_ENOUGH_COMMAND_SIZE 256  /* saves space in the firmware */
+#define TPM_PUBEK_SIZE 256
+#define TPM_PCR_DIGEST 20
+
+#define TPM_E_NON_FATAL 0x800
+
+#define TPM_SUCCESS ((uint32_t)0x00000000)
+
+#define TPM_E_AREA_LOCKED           ((uint32_t)0x0000003c)
+#define TPM_E_BADINDEX              ((uint32_t)0x00000002)
+#define TPM_E_BAD_PRESENCE          ((uint32_t)0x0000002d)
+#define TPM_E_IOERROR               ((uint32_t)0x0000001f)
+#define TPM_E_INVALID_POSTINIT      ((uint32_t)0x00000026)
+#define TPM_E_MAXNVWRITES           ((uint32_t)0x00000048)
+#define TPM_E_OWNER_SET             ((uint32_t)0x00000014)
+
+#define TPM_E_NEEDS_SELFTEST ((uint32_t)(TPM_E_NON_FATAL + 1))
+#define TPM_E_DOING_SELFTEST ((uint32_t)(TPM_E_NON_FATAL + 2))
+
+#define TPM_E_ALREADY_INITIALIZED    ((uint32_t)0x00005000)  /* vboot local */
+#define TPM_E_INTERNAL_INCONSISTENCY ((uint32_t)0x00005001)  /* vboot local */
+#define TPM_E_MUST_REBOOT            ((uint32_t)0x00005002)  /* vboot local */
+#define TPM_E_CORRUPTED_STATE        ((uint32_t)0x00005003)  /* vboot local */
+#define TPM_E_COMMUNICATION_ERROR    ((uint32_t)0x00005004)  /* vboot local */
+#define TPM_E_RESPONSE_TOO_LARGE     ((uint32_t)0x00005005)  /* vboot local */
+#define TPM_E_NO_DEVICE              ((uint32_t)0x00005006)  /* vboot local */
+#define TPM_E_INPUT_TOO_SMALL        ((uint32_t)0x00005007)  /* vboot local */
+#define TPM_E_WRITE_FAILURE          ((uint32_t)0x00005008)  /* vboot local */
+#define TPM_E_READ_EMPTY             ((uint32_t)0x00005009)  /* vboot local */
+#define TPM_E_READ_FAILURE           ((uint32_t)0x0000500a)  /* vboot local */
+
+#define TPM_NV_INDEX0 ((uint32_t)0x00000000)
+#define TPM_NV_INDEX_LOCK ((uint32_t)0xffffffff)
+#define TPM_NV_PER_GLOBALLOCK (((uint32_t)1)<<15)
+#define TPM_NV_PER_PPWRITE (((uint32_t)1)<<0)
+#define TPM_NV_PER_READ_STCLEAR (((uint32_t)1)<<31)
+#define TPM_NV_PER_WRITE_STCLEAR (((uint32_t)1)<<14)
+
+#define TPM_TAG_RQU_COMMAND       ((uint16_t) 0xc1)
+#define TPM_TAG_RQU_AUTH1_COMMAND ((uint16_t) 0xc2)
+#define TPM_TAG_RQU_AUTH2_COMMAND ((uint16_t) 0xc3)
+
+#define TPM_TAG_RSP_COMMAND       ((uint16_t) 0xc4)
+#define TPM_TAG_RSP_AUTH1_COMMAND ((uint16_t) 0xc5)
+#define TPM_TAG_RSP_AUTH2_COMMAND ((uint16_t) 0xc6)
+
+typedef uint8_t TSS_BOOL;
+typedef uint16_t TPM_STRUCTURE_TAG;
+
+typedef struct tdTPM_PERMANENT_FLAGS
+{
+	TPM_STRUCTURE_TAG tag;
+	TSS_BOOL disable;
+	TSS_BOOL ownership;
+	TSS_BOOL deactivated;
+	TSS_BOOL readPubek;
+	TSS_BOOL disableOwnerClear;
+	TSS_BOOL allowMaintenance;
+	TSS_BOOL physicalPresenceLifetimeLock;
+	TSS_BOOL physicalPresenceHWEnable;
+	TSS_BOOL physicalPresenceCMDEnable;
+	TSS_BOOL CEKPUsed;
+	TSS_BOOL TPMpost;
+	TSS_BOOL TPMpostLock;
+	TSS_BOOL FIPS;
+	TSS_BOOL Operator;
+	TSS_BOOL enableRevokeEK;
+	TSS_BOOL nvLocked;
+	TSS_BOOL readSRKPub;
+	TSS_BOOL tpmEstablished;
+	TSS_BOOL maintenanceDone;
+	TSS_BOOL disableFullDALogicInfo;
+} TPM_PERMANENT_FLAGS;
+
+typedef struct tdTPM_STCLEAR_FLAGS{
+	TPM_STRUCTURE_TAG tag;
+	TSS_BOOL deactivated;
+	TSS_BOOL disableForceClear;
+	TSS_BOOL physicalPresence;
+	TSS_BOOL physicalPresenceLock;
+	TSS_BOOL bGlobalLock;
+} TPM_STCLEAR_FLAGS;
+
+#endif  /* VBOOT_REFERENCE_TSS_CONSTANTS_H_ */
