diff options
author | Cristian Marussi <cristian.marussi@arm.com> | 2021-08-03 14:10:16 +0100 |
---|---|---|
committer | Sudeep Holla <sudeep.holla@arm.com> | 2021-08-05 10:23:22 +0100 |
commit | 2930abcffd9f0b36e8fd4df01f6311eede686817 (patch) | |
tree | ac13c6f80501e2de631e362388e43216ebc9fa77 /drivers/firmware/arm_scmi | |
parent | e9b21c96181c36343597ce789e386d296f93a23b (diff) | |
download | linux-stable-2930abcffd9f0b36e8fd4df01f6311eede686817.tar.gz linux-stable-2930abcffd9f0b36e8fd4df01f6311eede686817.tar.bz2 linux-stable-2930abcffd9f0b36e8fd4df01f6311eede686817.zip |
firmware: arm_scmi: Make polling mode optional
Add a check for the presence of .poll_done transport operation so that
transports that do not need to support polling mode have no need to provide
a dummy .poll_done callback either and polling mode can be disabled in the
SCMI core for that tranport.
Link: https://lore.kernel.org/r/20210803131024.40280-8-cristian.marussi@arm.com
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Diffstat (limited to 'drivers/firmware/arm_scmi')
-rw-r--r-- | drivers/firmware/arm_scmi/driver.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c index 6c77fcc1bcb7..5ff0bcbb4db4 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -751,6 +751,12 @@ static int do_xfer(const struct scmi_protocol_handle *ph, struct device *dev = info->dev; struct scmi_chan_info *cinfo; + if (xfer->hdr.poll_completion && !info->desc->ops->poll_done) { + dev_warn_once(dev, + "Polling mode is not supported by transport.\n"); + return -EINVAL; + } + /* * Initialise protocol id now from protocol handle to avoid it being * overridden by mistake (or malice) by the protocol code mangling with @@ -787,7 +793,6 @@ static int do_xfer(const struct scmi_protocol_handle *ph, ktime_t stop = ktime_add_ns(ktime_get(), SCMI_MAX_POLL_TO_NS); spin_until_cond(scmi_xfer_done_no_timeout(cinfo, xfer, stop)); - if (ktime_before(ktime_get(), stop)) { unsigned long flags; |