in hisi-spmi-controller.c [82:109]
static int spmi_controller_wait_for_done(struct device *dev,
struct spmi_controller_dev *ctrl_dev,
void __iomem *base, u8 sid, u16 addr)
{
u32 timeout = SPMI_CONTROLLER_TIMEOUT_US;
u32 status, offset;
offset = SPMI_APB_SPMI_STATUS_BASE_ADDR;
offset += SPMI_CHANNEL_OFFSET * ctrl_dev->channel + SPMI_SLAVE_OFFSET * sid;
do {
status = readl(base + offset);
if (status & SPMI_APB_TRANS_DONE) {
if (status & SPMI_APB_TRANS_FAIL) {
dev_err(dev, "%s: transaction failed (0x%x)\n",
__func__, status);
return -EIO;
}
dev_dbg(dev, "%s: status 0x%x\n", __func__, status);
return 0;
}
udelay(1);
} while (timeout--);
dev_err(dev, "%s: timeout, status 0x%x\n", __func__, status);
return -ETIMEDOUT;
}