From bfa9a5e2d07937a7620d55ff6eb55b480bc13100 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 19 Jan 2016 12:51:02 +0100 Subject: 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 Signed-off-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/connection.c | 19 +++++++++++++++++-- drivers/staging/greybus/connection.h | 9 ++++++++- drivers/staging/greybus/operation.c | 8 ++------ 3 files changed, 27 insertions(+), 9 deletions(-) (limited to 'drivers') 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; diff --git a/drivers/staging/greybus/connection.h b/drivers/staging/greybus/connection.h index b0a67f279fb1..ec0e46903819 100644 --- a/drivers/staging/greybus/connection.h +++ b/drivers/staging/greybus/connection.h @@ -20,6 +20,10 @@ enum gb_connection_state { GB_CONNECTION_STATE_DESTROYING = 3, }; +struct gb_operation; + +typedef int (*gb_request_handler_t)(struct gb_operation *); + struct gb_connection { struct gb_host_device *hd; struct gb_interface *intf; @@ -31,6 +35,8 @@ struct gb_connection { struct list_head hd_links; struct list_head bundle_links; + gb_request_handler_t handler; + struct gb_protocol *protocol; u8 protocol_id; u8 major; @@ -62,7 +68,8 @@ static inline bool gb_connection_is_static(struct gb_connection *connection) return !connection->intf; } -int gb_connection_enable(struct gb_connection *connection); +int gb_connection_enable(struct gb_connection *connection, + gb_request_handler_t handler); void gb_connection_disable(struct gb_connection *connection); int gb_connection_legacy_init(struct gb_connection *connection); diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index ae3ada0b54e3..4dc79cb12397 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -218,15 +218,11 @@ static void gb_message_cancel(struct gb_message *message) static void gb_operation_request_handle(struct gb_operation *operation) { struct gb_connection *connection = operation->connection; - struct gb_protocol *protocol = connection->protocol; int status; int ret; - if (!protocol) - return; - - if (protocol->request_recv) { - status = protocol->request_recv(operation->type, operation); + if (connection->handler) { + status = connection->handler(operation); } else { dev_err(&connection->hd->dev, "%s: unexpected incoming request of type 0x%02x\n", -- cgit v1.2.3