aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/greybus/connection.c
diff options
context:
space:
mode:
authorGravatar Johan Hovold <johan@hovoldconsulting.com> 2016-01-19 12:51:02 +0100
committerGravatar Greg Kroah-Hartman <gregkh@google.com> 2016-01-19 12:12:40 -0800
commitbfa9a5e2d07937a7620d55ff6eb55b480bc13100 (patch)
tree735273bfafedadaf0ccce030267e2778a79db607 /drivers/staging/greybus/connection.c
parentgreybus: connection: remove disable from destructor (diff)
downloadlinux-bfa9a5e2d07937a7620d55ff6eb55b480bc13100.tar.gz
linux-bfa9a5e2d07937a7620d55ff6eb55b480bc13100.tar.bz2
linux-bfa9a5e2d07937a7620d55ff6eb55b480bc13100.zip
greybus: connection: add per-connection request handlers
Add a connection request-handler field to struct gb_connection that is set when the connection is enabled. This is a step towards removing the legacy protocol abstraction from core, and will also be used to implement unidirectional connection states (e.g. only outgoing operations are allowed). Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/connection.c')
-rw-r--r--drivers/staging/greybus/connection.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c
index 29a8193931b3..3d7a9ca9ce2b 100644
--- a/drivers/staging/greybus/connection.c
+++ b/drivers/staging/greybus/connection.c
@@ -387,7 +387,8 @@ static int gb_connection_protocol_get_version(struct gb_connection *connection)
return 0;
}
-int gb_connection_enable(struct gb_connection *connection)
+int gb_connection_enable(struct gb_connection *connection,
+ gb_request_handler_t handler)
{
int ret;
@@ -400,6 +401,7 @@ int gb_connection_enable(struct gb_connection *connection)
goto err_hd_cport_disable;
spin_lock_irq(&connection->lock);
+ connection->handler = handler;
connection->state = GB_CONNECTION_STATE_ENABLED;
spin_unlock_irq(&connection->lock);
@@ -435,15 +437,28 @@ void gb_connection_disable(struct gb_connection *connection)
}
EXPORT_SYMBOL_GPL(gb_connection_disable);
+static int gb_legacy_request_handler(struct gb_operation *operation)
+{
+ struct gb_protocol *protocol = operation->connection->protocol;
+
+ return protocol->request_recv(operation->type, operation);
+}
+
int gb_connection_legacy_init(struct gb_connection *connection)
{
+ gb_request_handler_t handler;
int ret;
ret = gb_connection_bind_protocol(connection);
if (ret)
return ret;
- ret = gb_connection_enable(connection);
+ if (connection->protocol->request_recv)
+ handler = gb_legacy_request_handler;
+ else
+ handler = NULL;
+
+ ret = gb_connection_enable(connection, handler);
if (ret)
goto err_unbind_protocol;