From 9ed5e1ba33d12dfcc693c87779f39b91c16c15b9 Mon Sep 17 00:00:00 2001 From: Fabien Parent Date: Tue, 23 Feb 2016 18:46:08 +0100 Subject: [PATCH] greybus: connection: add api to {en,dis}able unipro fct flow In order to support mailbox-free control cport init on the bridges the AP must be able to enable/disable the flow of unipro fct tokens. Add a new API that will enable or disable on APBA the flow of fct tokens. Reviewed-by: Johan Hovold Signed-off-by: Fabien Parent Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/connection.c | 28 ++++++++++++++++++++++++++++ drivers/staging/greybus/hd.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 4f5e2adfa8c4..4ae7153ff863 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -274,6 +274,34 @@ static void gb_connection_hd_cport_disable(struct gb_connection *connection) hd->driver->cport_disable(hd, connection->hd_cport_id); } +static int gb_connection_hd_fct_flow_enable(struct gb_connection *connection) +{ + struct gb_host_device *hd = connection->hd; + int ret; + + if (!hd->driver->fct_flow_enable) + return 0; + + ret = hd->driver->fct_flow_enable(hd, connection->hd_cport_id); + if (ret) { + dev_err(&hd->dev, "%s: failed to enable FCT flow: %d\n", + connection->name, ret); + return ret; + } + + return 0; +} + +static void gb_connection_hd_fct_flow_disable(struct gb_connection *connection) +{ + struct gb_host_device *hd = connection->hd; + + if (!hd->driver->fct_flow_disable) + return; + + hd->driver->fct_flow_disable(hd, connection->hd_cport_id); +} + /* * Request the SVC to create a connection from AP's cport to interface's * cport. diff --git a/drivers/staging/greybus/hd.h b/drivers/staging/greybus/hd.h index e11359b145e6..eaddfc9befd6 100644 --- a/drivers/staging/greybus/hd.h +++ b/drivers/staging/greybus/hd.h @@ -25,6 +25,8 @@ struct gb_hd_driver { int (*latency_tag_disable)(struct gb_host_device *hd, u16 cport_id); int (*output)(struct gb_host_device *hd, void *req, u16 size, u8 cmd, bool async); + int (*fct_flow_enable)(struct gb_host_device *hd, u16 cport_id); + int (*fct_flow_disable)(struct gb_host_device *hd, u16 cport_id); }; struct gb_host_device {