diff options
author | Johan Hovold <johan@hovoldconsulting.com> | 2016-01-19 12:51:02 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@google.com> | 2016-01-19 12:12:40 -0800 |
commit | bfa9a5e2d07937a7620d55ff6eb55b480bc13100 (patch) | |
tree | 735273bfafedadaf0ccce030267e2778a79db607 /drivers/staging/greybus/connection.c | |
parent | 1cbfab3804b185ce2744b5b8064d06ca19491e36 (diff) |
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.c | 19 |
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; |