Commit b4ed3e3c authored by Kylene Jo Hall's avatar Kylene Jo Hall Committed by Linus Torvalds

[PATCH] tpm: add status function to allow non-lpc bus chips

This patch is in preparation of supporting chips that are not necessarily on
the lpc bus and thus are not accessed with inb's and outb's.  The patch
replaces the call to get the chip's status in the tpm.c file with a vendor
specific status function.  The patch also defines the function for each of the
current supported devices.
Signed-off-by: default avatarKylene Hall <kjhall@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 162a88f7
...@@ -79,7 +79,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, ...@@ -79,7 +79,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
stop = jiffies + 2 * 60 * HZ; stop = jiffies + 2 * 60 * HZ;
do { do {
u8 status = inb(chip->vendor->base + 1); u8 status = chip->vendor->status(chip);
if ((status & chip->vendor->req_complete_mask) == if ((status & chip->vendor->req_complete_mask) ==
chip->vendor->req_complete_val) { chip->vendor->req_complete_val) {
goto out_recv; goto out_recv;
......
...@@ -55,6 +55,7 @@ struct tpm_vendor_specific { ...@@ -55,6 +55,7 @@ struct tpm_vendor_specific {
int (*recv) (struct tpm_chip *, u8 *, size_t); int (*recv) (struct tpm_chip *, u8 *, size_t);
int (*send) (struct tpm_chip *, u8 *, size_t); int (*send) (struct tpm_chip *, u8 *, size_t);
void (*cancel) (struct tpm_chip *); void (*cancel) (struct tpm_chip *);
u8 (*status) (struct tpm_chip *);
struct miscdevice miscdev; struct miscdevice miscdev;
struct attribute_group *attr_group; struct attribute_group *attr_group;
}; };
......
...@@ -118,6 +118,11 @@ static void tpm_atml_cancel(struct tpm_chip *chip) ...@@ -118,6 +118,11 @@ static void tpm_atml_cancel(struct tpm_chip *chip)
outb(ATML_STATUS_ABORT, chip->vendor->base + 1); outb(ATML_STATUS_ABORT, chip->vendor->base + 1);
} }
static u8 tpm_atml_status(struct tpm_chip *chip)
{
return inb(chip->vendor->base + 1);
}
static struct file_operations atmel_ops = { static struct file_operations atmel_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.llseek = no_llseek, .llseek = no_llseek,
...@@ -146,6 +151,7 @@ static struct tpm_vendor_specific tpm_atmel = { ...@@ -146,6 +151,7 @@ static struct tpm_vendor_specific tpm_atmel = {
.recv = tpm_atml_recv, .recv = tpm_atml_recv,
.send = tpm_atml_send, .send = tpm_atml_send,
.cancel = tpm_atml_cancel, .cancel = tpm_atml_cancel,
.status = tpm_atml_status,
.req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL, .req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL,
.req_complete_val = ATML_STATUS_DATA_AVAIL, .req_complete_val = ATML_STATUS_DATA_AVAIL,
.req_canceled = ATML_STATUS_READY, .req_canceled = ATML_STATUS_READY,
......
...@@ -316,6 +316,11 @@ static void tpm_inf_cancel(struct tpm_chip *chip) ...@@ -316,6 +316,11 @@ static void tpm_inf_cancel(struct tpm_chip *chip)
*/ */
} }
static u8 tpm_inf_status(struct tpm_chip *chip)
{
return inb(chip->vendor->base + 1);
}
static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL); static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL); static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL); static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL);
...@@ -344,6 +349,7 @@ static struct tpm_vendor_specific tpm_inf = { ...@@ -344,6 +349,7 @@ static struct tpm_vendor_specific tpm_inf = {
.recv = tpm_inf_recv, .recv = tpm_inf_recv,
.send = tpm_inf_send, .send = tpm_inf_send,
.cancel = tpm_inf_cancel, .cancel = tpm_inf_cancel,
.status = tpm_inf_status,
.req_complete_mask = 0, .req_complete_mask = 0,
.req_complete_val = 0, .req_complete_val = 0,
.attr_group = &inf_attr_grp, .attr_group = &inf_attr_grp,
......
...@@ -220,6 +220,11 @@ static void tpm_nsc_cancel(struct tpm_chip *chip) ...@@ -220,6 +220,11 @@ static void tpm_nsc_cancel(struct tpm_chip *chip)
outb(NSC_COMMAND_CANCEL, chip->vendor->base + NSC_COMMAND); outb(NSC_COMMAND_CANCEL, chip->vendor->base + NSC_COMMAND);
} }
static u8 tpm_nsc_status(struct tpm_chip *chip)
{
return inb(chip->vendor->base + NSC_STATUS);
}
static struct file_operations nsc_ops = { static struct file_operations nsc_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.llseek = no_llseek, .llseek = no_llseek,
...@@ -248,6 +253,7 @@ static struct tpm_vendor_specific tpm_nsc = { ...@@ -248,6 +253,7 @@ static struct tpm_vendor_specific tpm_nsc = {
.recv = tpm_nsc_recv, .recv = tpm_nsc_recv,
.send = tpm_nsc_send, .send = tpm_nsc_send,
.cancel = tpm_nsc_cancel, .cancel = tpm_nsc_cancel,
.status = tpm_nsc_status,
.req_complete_mask = NSC_STATUS_OBF, .req_complete_mask = NSC_STATUS_OBF,
.req_complete_val = NSC_STATUS_OBF, .req_complete_val = NSC_STATUS_OBF,
.req_canceled = NSC_STATUS_RDY, .req_canceled = NSC_STATUS_RDY,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment