]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firmware: arm_scmi: Add optional link_supplier() transport op
authorPeter Hilber <peter.hilber@opensynergy.com>
Tue, 3 Aug 2021 13:10:21 +0000 (14:10 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Thu, 5 Aug 2021 09:23:23 +0000 (10:23 +0100)
Some transports are also effectively registered with other kernel subsystem
in order to be properly probed and initialized; as a consequence such kind
of transports, and their related devices, might still not have been probed
and initialized at the time the main SCMI core driver is probed.

Add an optional .link_supplier() transport operation which can be used by
the core SCMI stack to dynamically check if the transport is ready and
dynamically link its device to the SCMI platform instance device.

Link: https://lore.kernel.org/r/20210803131024.40280-13-cristian.marussi@arm.com
Signed-off-by: Peter Hilber <peter.hilber@opensynergy.com>
[ Cristian: reworded commit message ]
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/common.h
drivers/firmware/arm_scmi/driver.c

index 4da6cecc0a1c675d01df181623e20b82d7af8d0a..024d97fbf97b2e3d8f4ce595651d5f964048659b 100644 (file)
@@ -348,6 +348,7 @@ struct scmi_chan_info {
 /**
  * struct scmi_transport_ops - Structure representing a SCMI transport ops
  *
+ * @link_supplier: Optional callback to add link to a supplier device
  * @chan_available: Callback to check if channel is available or not
  * @chan_setup: Callback to allocate and setup a channel
  * @chan_free: Callback to free a channel
@@ -362,6 +363,7 @@ struct scmi_chan_info {
  * @poll_done: Callback to poll transfer status
  */
 struct scmi_transport_ops {
+       int (*link_supplier)(struct device *dev);
        bool (*chan_available)(struct device *dev, int idx);
        int (*chan_setup)(struct scmi_chan_info *cinfo, struct device *dev,
                          bool tx);
index a907f3fe4c08925e069371e162e25bdce0d7e6b4..7ae4ec8f8d1ffaae18bed4cb7cb5854d54f1bab7 100644 (file)
@@ -1814,6 +1814,12 @@ static int scmi_probe(struct platform_device *pdev)
        handle->devm_protocol_get = scmi_devm_protocol_get;
        handle->devm_protocol_put = scmi_devm_protocol_put;
 
+       if (desc->ops->link_supplier) {
+               ret = desc->ops->link_supplier(dev);
+               if (ret)
+                       return ret;
+       }
+
        ret = scmi_txrx_setup(info, dev, SCMI_PROTOCOL_BASE);
        if (ret)
                return ret;