dm: tpm: Add Driver Model support for tpm_atmel_twi driver
authorChristophe Ricard <christophe.ricard@gmail.com>
Tue, 6 Oct 2015 20:54:42 +0000 (22:54 +0200)
committerSimon Glass <sjg@chromium.org>
Fri, 23 Oct 2015 15:42:28 +0000 (09:42 -0600)
tpm_atmel_twi can fit perfectly to the new UCLASS_TPM class.

Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Acked-by: Simon Glass <sjg@chromium.org>
configs/controlcenterd_36BIT_SDCARD_DEVELOP_defconfig
configs/controlcenterd_36BIT_SDCARD_defconfig
configs/controlcenterd_TRAILBLAZER_DEVELOP_defconfig
configs/controlcenterd_TRAILBLAZER_defconfig
drivers/tpm/Kconfig
drivers/tpm/tpm_atmel_twi.c

index c8ab862..58566c1 100644 (file)
@@ -6,6 +6,8 @@ CONFIG_SYS_EXTRA_OPTIONS="36BIT,SDCARD,DEVELOP"
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_TPM=y
 CONFIG_SPI_FLASH=y
+CONFIG_DM=y
+CONFIG_DM_TPM=y
 CONFIG_TPM_ATMEL_TWI=y
 CONFIG_TPM_AUTH_SESSIONS=y
 CONFIG_TPM=y
index 21c0eab..56a4910 100644 (file)
@@ -6,6 +6,8 @@ CONFIG_SYS_EXTRA_OPTIONS="36BIT,SDCARD"
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_TPM=y
 CONFIG_SPI_FLASH=y
+CONFIG_DM=y
+CONFIG_DM_TPM=y
 CONFIG_TPM_ATMEL_TWI=y
 CONFIG_TPM_AUTH_SESSIONS=y
 CONFIG_TPM=y
index c3a0920..cbf43ef 100644 (file)
@@ -7,6 +7,8 @@ CONFIG_SYS_EXTRA_OPTIONS="TRAILBLAZER,SPIFLASH,DEVELOP"
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_TPM=y
+CONFIG_DM=y
+CONFIG_DM_TPM=y
 CONFIG_TPM_ATMEL_TWI=y
 CONFIG_TPM_AUTH_SESSIONS=y
 CONFIG_TPM=y
index 08aae9a..e897422 100644 (file)
@@ -7,6 +7,8 @@ CONFIG_SYS_EXTRA_OPTIONS="TRAILBLAZER,SPIFLASH"
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_TPM=y
+CONFIG_DM=y
+CONFIG_DM_TPM=y
 CONFIG_TPM_ATMEL_TWI=y
 CONFIG_TPM_AUTH_SESSIONS=y
 CONFIG_TPM=y
index dacb847..ff2cdbe 100644 (file)
@@ -24,7 +24,7 @@ config TPM_TIS_SANDBOX
 
 config TPM_ATMEL_TWI
        bool "Enable Atmel TWI TPM device driver"
-       depends on TPM
+       depends on TPM && DM_I2C
        help
          This driver supports an Atmel TPM device connected on the I2C bus.
          The usual tpm operations and the 'tpm' command can be used to talk
index 205d7a5..2aa9381 100644 (file)
@@ -7,51 +7,56 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <tpm.h>
 #include <i2c.h>
 #include <asm/unaligned.h>
 
+#include "tpm_internal.h"
+
 #define ATMEL_TPM_TIMEOUT_MS 5000 /* sufficient for anything but
                                     generating/exporting keys */
 
 /*
- * 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)
-{
-       return 0;
-}
-
-/*
- * tis_open()
+ * tpm_atmel_twi_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)
+static int tpm_atmel_twi_open(struct udevice *dev)
 {
        return 0;
 }
 
 /*
- * tis_close()
+ * tpm_atmel_twi_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)
+static int tpm_atmel_twi_close(struct udevice *dev)
+{
+       return 0;
+}
+
+/*
+ * tpm_atmel_twi_get_desc()
+ *
+ * @dev:        Device to check
+ * @buf:        Buffer to put the string
+ * @size:       Maximum size of buffer
+ * @return length of string, or -ENOSPC it no space
+ */
+static int tpm_atmel_twi_get_desc(struct udevice *dev, char *buf, int size)
 {
        return 0;
 }
 
 /*
- * tis_sendrecv()
+ * tpm_atmel_twi_xfer()
  *
  * Send the requested data to the TPM and then try to get its response
  *
@@ -63,8 +68,9 @@ int tis_close(void)
  * Returns 0 on success (and places the number of response bytes at recv_len)
  * or -1 on failure.
  */
-int tis_sendrecv(const uint8_t *sendbuf, size_t send_size, uint8_t *recvbuf,
-                       size_t *recv_len)
+static int tpm_atmel_twi_xfer(struct udevice *dev,
+                             const uint8_t *sendbuf, size_t send_size,
+                             uint8_t *recvbuf, size_t *recv_len)
 {
        int res;
        unsigned long start;
@@ -83,6 +89,7 @@ int tis_sendrecv(const uint8_t *sendbuf, size_t send_size, uint8_t *recvbuf,
 
        start = get_timer(0);
        while ((res = i2c_read(0x29, 0, 0, recvbuf, 10))) {
+               /* TODO Use TIS_TIMEOUT from tpm_tis_infineon.h */
                if (get_timer(start) > ATMEL_TPM_TIMEOUT_MS) {
                        puts("tpm timed out\n");
                        return -1;
@@ -110,3 +117,28 @@ int tis_sendrecv(const uint8_t *sendbuf, size_t send_size, uint8_t *recvbuf,
 
        return res;
 }
+
+static int tpm_atmel_twi_probe(struct udevice *dev)
+{
+       return 0;
+}
+
+static const struct udevice_id tpm_atmel_twi_ids[] = {
+       { .compatible = "atmel,at97sc3204t"},
+       { }
+};
+
+static const struct tpm_ops tpm_atmel_twi_ops = {
+       .open = tpm_atmel_twi_open,
+       .close = tpm_atmel_twi_close,
+       .xfer = tpm_atmel_twi_xfer,
+       .get_desc = tpm_atmel_twi_get_desc,
+};
+
+U_BOOT_DRIVER(tpm_atmel_twi) = {
+       .name = "tpm_atmel_twi",
+       .id = UCLASS_TPM,
+       .of_match = tpm_atmel_twi_ids,
+       .ops = &tpm_atmel_twi_ops,
+       .probe = tpm_atmel_twi_probe,
+};