tpm: tpm_tis_lpc: Add support for AT97SC3204
The Atmel AT97SC3204 is also TIS compliant. Modify the tpm_tis_lpc driver to check for the vid/did used by the Atmel AT97SC3204 and report an appropriate description. Signed-off-by: George McCollister <george.mccollister@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
0427b9c525
commit
a982b6f514
|
@ -21,6 +21,21 @@
|
||||||
|
|
||||||
#define PREFIX "lpc_tpm: "
|
#define PREFIX "lpc_tpm: "
|
||||||
|
|
||||||
|
enum i2c_chip_type {
|
||||||
|
SLB9635,
|
||||||
|
AT97SC3204,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const chip_name[] = {
|
||||||
|
[SLB9635] = "Infineon SLB9635 TT 1.2",
|
||||||
|
[AT97SC3204] = "Atmel AT97SC3204",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 chip_didvid[] = {
|
||||||
|
[SLB9635] = 0xb15d1,
|
||||||
|
[AT97SC3204] = 0x32041114,
|
||||||
|
};
|
||||||
|
|
||||||
struct tpm_locality {
|
struct tpm_locality {
|
||||||
u32 access;
|
u32 access;
|
||||||
u8 padding0[4];
|
u8 padding0[4];
|
||||||
|
@ -146,9 +161,9 @@ static int tis_wait_reg(struct tpm_tis_lpc_priv *priv, u32 *reg, u8 mask,
|
||||||
static int tpm_tis_lpc_probe(struct udevice *dev)
|
static int tpm_tis_lpc_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
|
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
|
||||||
u32 vid, did;
|
|
||||||
fdt_addr_t addr;
|
fdt_addr_t addr;
|
||||||
u32 didvid;
|
u32 didvid;
|
||||||
|
ulong chip_type = dev_get_driver_data(dev);
|
||||||
|
|
||||||
addr = dev_get_addr(dev);
|
addr = dev_get_addr(dev);
|
||||||
if (addr == FDT_ADDR_T_NONE)
|
if (addr == FDT_ADDR_T_NONE)
|
||||||
|
@ -156,14 +171,15 @@ static int tpm_tis_lpc_probe(struct udevice *dev)
|
||||||
priv->regs = map_sysmem(addr, 0);
|
priv->regs = map_sysmem(addr, 0);
|
||||||
didvid = tpm_read_word(priv, &priv->regs[0].did_vid);
|
didvid = tpm_read_word(priv, &priv->regs[0].did_vid);
|
||||||
|
|
||||||
vid = didvid & 0xffff;
|
if (didvid != chip_didvid[chip_type]) {
|
||||||
did = (didvid >> 16) & 0xffff;
|
u32 vid, did;
|
||||||
if (vid != 0x15d1 || did != 0xb) {
|
vid = didvid & 0xffff;
|
||||||
|
did = (didvid >> 16) & 0xffff;
|
||||||
debug("Invalid vendor/device ID %04x/%04x\n", vid, did);
|
debug("Invalid vendor/device ID %04x/%04x\n", vid, did);
|
||||||
return -ENOSYS;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("Found TPM %s by %s\n", "SLB9635 TT 1.2", "Infineon");
|
debug("Found TPM: %s\n", chip_name[chip_type]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -421,11 +437,13 @@ static int tpm_tis_lpc_close(struct udevice *dev)
|
||||||
|
|
||||||
static int tpm_tis_get_desc(struct udevice *dev, char *buf, int size)
|
static int tpm_tis_get_desc(struct udevice *dev, char *buf, int size)
|
||||||
{
|
{
|
||||||
|
ulong chip_type = dev_get_driver_data(dev);
|
||||||
|
|
||||||
if (size < 50)
|
if (size < 50)
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
|
|
||||||
return snprintf(buf, size, "1.2 TPM (vendor %s, chip %s)",
|
return snprintf(buf, size, "1.2 TPM (%s)",
|
||||||
"Infineon", "SLB9635 TT 1.2");
|
chip_name[chip_type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -438,7 +456,8 @@ static const struct tpm_ops tpm_tis_lpc_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct udevice_id tpm_tis_lpc_ids[] = {
|
static const struct udevice_id tpm_tis_lpc_ids[] = {
|
||||||
{ .compatible = "infineon,slb9635lpc" },
|
{ .compatible = "infineon,slb9635lpc", .data = SLB9635 },
|
||||||
|
{ .compatible = "atmel,at97sc3204", .data = AT97SC3204 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue