lkml.org 
[lkml]   [2021]   [Jul]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 13/15] firmware: arm_scmi: Add optional link_supplier() transport op
    Date
    From: Peter Hilber <peter.hilber@opensynergy.com>

    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 platform instance device.

    Signed-off-by: Peter Hilber <peter.hilber@opensynergy.com>
    [ Cristian: reworded commit message ]
    Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
    ---
    drivers/firmware/arm_scmi/common.h | 2 ++
    drivers/firmware/arm_scmi/driver.c | 6 ++++++
    2 files changed, 8 insertions(+)

    diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
    index 7cd7aa8c9b3d..1cd8e7141495 100644
    --- a/drivers/firmware/arm_scmi/common.h
    +++ b/drivers/firmware/arm_scmi/common.h
    @@ -331,6 +331,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
    @@ -345,6 +346,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);
    diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
    index 774a5c399ef3..f0325ef089fc 100644
    --- a/drivers/firmware/arm_scmi/driver.c
    +++ b/drivers/firmware/arm_scmi/driver.c
    @@ -1963,6 +1963,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;
    --
    2.17.1
    \
     
     \ /
      Last update: 2021-07-05 16:51    [W:3.195 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site