]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firmware: arm_scmi: Allow transport properties for multiple instances
authorCristian Marussi <cristian.marussi@arm.com>
Tue, 3 Dec 2024 19:35:44 +0000 (19:35 +0000)
committerSudeep Holla <sudeep.holla@arm.com>
Mon, 9 Dec 2024 10:00:06 +0000 (10:00 +0000)
Default SCMI transport properties values can be overridden with devicetree
provided descriptors; in order to support multiple SCMI instances, make the
properties-update happen on a per-instance copy of the original transport
descriptor.

Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Message-Id: <20241203193544.3895173-1-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 48b12f81141ddc62199694548ec02b1278531555..10ea7962323e43e03e7c5636c56d707803d4ea55 100644 (file)
@@ -442,7 +442,7 @@ struct scmi_transport_core_operations {
  */
 struct scmi_transport {
        struct device *supplier;
-       struct scmi_desc *desc;
+       struct scmi_desc desc;
        struct scmi_transport_core_operations **core_ops;
 };
 
@@ -468,7 +468,7 @@ static int __tag##_probe(struct platform_device *pdev)                             \
        device_set_of_node_from_dev(&spdev->dev, dev);                         \
                                                                               \
        strans.supplier = dev;                                                 \
-       strans.desc = &(__desc);                                               \
+       memcpy(&strans.desc, &(__desc), sizeof(strans.desc));                  \
        strans.core_ops = &(__core_ops);                                       \
                                                                               \
        ret = platform_device_add_data(spdev, &strans, sizeof(strans));        \
index 1b5fb2c4ce8682901a954555d8aacf2f19c0dc85..eeed1689b208077549fbe617af7e980d720834ea 100644 (file)
@@ -3028,7 +3028,7 @@ static const struct scmi_desc *scmi_transport_setup(struct device *dev)
        int ret;
 
        trans = dev_get_platdata(dev);
-       if (!trans || !trans->desc || !trans->supplier || !trans->core_ops)
+       if (!trans || !trans->supplier || !trans->core_ops)
                return NULL;
 
        if (!device_link_add(dev, trans->supplier, DL_FLAG_AUTOREMOVE_CONSUMER)) {
@@ -3043,33 +3043,33 @@ static const struct scmi_desc *scmi_transport_setup(struct device *dev)
        dev_info(dev, "Using %s\n", dev_driver_string(trans->supplier));
 
        ret = of_property_read_u32(dev->of_node, "arm,max-rx-timeout-ms",
-                                  &trans->desc->max_rx_timeout_ms);
+                                  &trans->desc.max_rx_timeout_ms);
        if (ret && ret != -EINVAL)
                dev_err(dev, "Malformed arm,max-rx-timeout-ms DT property.\n");
 
        ret = of_property_read_u32(dev->of_node, "arm,max-msg-size",
-                                  &trans->desc->max_msg_size);
+                                  &trans->desc.max_msg_size);
        if (ret && ret != -EINVAL)
                dev_err(dev, "Malformed arm,max-msg-size DT property.\n");
 
        ret = of_property_read_u32(dev->of_node, "arm,max-msg",
-                                  &trans->desc->max_msg);
+                                  &trans->desc.max_msg);
        if (ret && ret != -EINVAL)
                dev_err(dev, "Malformed arm,max-msg DT property.\n");
 
        dev_info(dev,
                 "SCMI max-rx-timeout: %dms / max-msg-size: %dbytes / max-msg: %d\n",
-                trans->desc->max_rx_timeout_ms, trans->desc->max_msg_size,
-                trans->desc->max_msg);
+                trans->desc.max_rx_timeout_ms, trans->desc.max_msg_size,
+                trans->desc.max_msg);
 
        /* System wide atomic threshold for atomic ops .. if any */
        if (!of_property_read_u32(dev->of_node, "atomic-threshold-us",
-                                 &trans->desc->atomic_threshold))
+                                 &trans->desc.atomic_threshold))
                dev_info(dev,
                         "SCMI System wide atomic threshold set to %u us\n",
-                        trans->desc->atomic_threshold);
+                        trans->desc.atomic_threshold);
 
-       return trans->desc;
+       return &trans->desc;
 }
 
 static int scmi_probe(struct platform_device *pdev)