tpm_crb: encapsulate crb_wait_for_reg_32
Encapsulated crb_wait_for_reg32() so that state changes in other CRB registers than TPM_CRB_CTRL_REQ_x can be waited. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> Tested-by: Gang Wei <gang.wei@intel.com>
This commit is contained in:
parent
13b1f4a571
commit
38eb24ebb0
|
@ -121,6 +121,25 @@ static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value,
|
||||||
|
unsigned long timeout)
|
||||||
|
{
|
||||||
|
ktime_t start;
|
||||||
|
ktime_t stop;
|
||||||
|
|
||||||
|
start = ktime_get();
|
||||||
|
stop = ktime_add(start, ms_to_ktime(timeout));
|
||||||
|
|
||||||
|
do {
|
||||||
|
if ((ioread32(reg) & mask) == value)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
usleep_range(50, 100);
|
||||||
|
} while (ktime_before(ktime_get(), stop));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* crb_cmd_ready - request tpm crb device to enter ready state
|
* crb_cmd_ready - request tpm crb device to enter ready state
|
||||||
*
|
*
|
||||||
|
@ -138,24 +157,14 @@ static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv)
|
||||||
static int __maybe_unused crb_cmd_ready(struct device *dev,
|
static int __maybe_unused crb_cmd_ready(struct device *dev,
|
||||||
struct crb_priv *priv)
|
struct crb_priv *priv)
|
||||||
{
|
{
|
||||||
ktime_t stop, start;
|
|
||||||
u32 req;
|
|
||||||
|
|
||||||
if (priv->flags & CRB_FL_ACPI_START)
|
if (priv->flags & CRB_FL_ACPI_START)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req);
|
iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req);
|
||||||
|
if (!crb_wait_for_reg_32(&priv->regs_t->ctrl_req,
|
||||||
start = ktime_get();
|
CRB_CTRL_REQ_CMD_READY /* mask */,
|
||||||
stop = ktime_add(start, ms_to_ktime(TPM2_TIMEOUT_C));
|
0, /* value */
|
||||||
do {
|
TPM2_TIMEOUT_C)) {
|
||||||
req = ioread32(&priv->regs_t->ctrl_req);
|
|
||||||
if (!(req & CRB_CTRL_REQ_CMD_READY))
|
|
||||||
return 0;
|
|
||||||
usleep_range(50, 100);
|
|
||||||
} while (ktime_before(ktime_get(), stop));
|
|
||||||
|
|
||||||
if (ioread32(&priv->regs_t->ctrl_req) & CRB_CTRL_REQ_CMD_READY) {
|
|
||||||
dev_warn(dev, "cmdReady timed out\n");
|
dev_warn(dev, "cmdReady timed out\n");
|
||||||
return -ETIME;
|
return -ETIME;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue