firmware: arm_scmi: Make polling mode optional
authorCristian Marussi <cristian.marussi@arm.com>
Tue, 3 Aug 2021 13:10:16 +0000 (14:10 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Thu, 5 Aug 2021 09:23:22 +0000 (10:23 +0100)
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>
drivers/firmware/arm_scmi/driver.c

index 6c77fcc..5ff0bcb 100644 (file)
@@ -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;