This ops is called by the rpmsg flow control service to inform a rpmsg local device of a remote endpoint flow control state. Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@xxxxxxxxxxx> --- drivers/rpmsg/rpmsg_core.c | 24 ++++++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 7 +++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c index 8de8aadd9b27..6bbc3b3ace50 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/rpmsg_core.c @@ -67,6 +67,30 @@ int rpmsg_release_channel(struct rpmsg_device *rpdev, } EXPORT_SYMBOL(rpmsg_release_channel); +/** + * rpmsg_channel_remote_fc() - announce remote endpoint flow control state + * using source and destination endpoint address info. + * @rpdev: rpmsg device + * @chinfo: channel_info + * @enable: state of the remote endpoint + * + * Return: 0 on success or an appropriate error value. + */ +int rpmsg_channel_remote_fc(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo, + bool enable) +{ + if (WARN_ON(!rpdev)) + return -EINVAL; + if (!rpdev->ops || !rpdev->ops->announce_remote_fc) { + dev_err(&rpdev->dev, "no flow control ops found\n"); + return -ENXIO; + } + + return rpdev->ops->announce_remote_fc(rpdev, chinfo, enable); +} +EXPORT_SYMBOL(rpmsg_channel_remote_fc); + /** * rpmsg_create_ept() - create a new rpmsg_endpoint * @rpdev: rpmsg channel device diff --git a/drivers/rpmsg/rpmsg_internal.h b/drivers/rpmsg/rpmsg_internal.h index 4ce58e68af30..44e2c0f2f5ea 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -43,6 +43,9 @@ struct rpmsg_device_ops { int (*announce_create)(struct rpmsg_device *ept); int (*announce_destroy)(struct rpmsg_device *ept); + int (*announce_remote_fc)(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo, + bool enable); }; /** @@ -87,6 +90,10 @@ struct rpmsg_device *rpmsg_create_channel(struct rpmsg_device *rpdev, struct rpmsg_channel_info *chinfo); int rpmsg_release_channel(struct rpmsg_device *rpdev, struct rpmsg_channel_info *chinfo); + +int rpmsg_channel_remote_fc(struct rpmsg_device *rpdev, + struct rpmsg_channel_info *chinfo, + bool enable); /** * rpmsg_ctrldev_register_device() - register a char device for control based on rpdev * @rpdev: prepared rpdev to be used for creating endpoints -- 2.25.1