diff options
author | Johan Hovold <johan@hovoldconsulting.com> | 2016-01-21 17:34:17 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@google.com> | 2016-01-21 22:46:38 -0800 |
commit | 431b3ebb3d9e0c25081006fc7a1f97621dca6192 (patch) | |
tree | edb6fc3419ba44c68aa9c16f0505a905646532cc /drivers/staging/greybus/legacy.c | |
parent | 24e094d687a23878024589a854ce66a070b769cc (diff) |
greybus: legacy: refactor legacy-connection handling
Add wrapper structure for legacy connections and add helpers to create
and destroy legacy connections.
This is a step in removing legacy connection fields from the core
structures.
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/legacy.c')
-rw-r--r-- | drivers/staging/greybus/legacy.c | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/drivers/staging/greybus/legacy.c b/drivers/staging/greybus/legacy.c index fc19b8bc75c9..37c421248611 100644 --- a/drivers/staging/greybus/legacy.c +++ b/drivers/staging/greybus/legacy.c @@ -12,9 +12,13 @@ #include "protocol.h" +struct legacy_connection { + struct gb_connection *connection; +}; + struct legacy_data { size_t num_cports; - struct gb_connection **connections; + struct legacy_connection *connections; }; @@ -78,12 +82,16 @@ static int legacy_request_handler(struct gb_operation *operation) return protocol->request_recv(operation->type, operation); } -static int legacy_connection_init(struct gb_connection *connection) +static int legacy_connection_init(struct legacy_connection *lc) { + struct gb_connection *connection = lc->connection; gb_request_handler_t handler; int ret; - ret = legacy_connection_bind_protocol(connection); + dev_dbg(&connection->bundle->dev, "%s - %s\n", __func__, + connection->name); + + ret = legacy_connection_bind_protocol(lc->connection); if (ret) return ret; @@ -114,8 +122,10 @@ err_unbind_protocol: return ret; } -static void legacy_connection_exit(struct gb_connection *connection) +static void legacy_connection_exit(struct legacy_connection *lc) { + struct gb_connection *connection = lc->connection; + if (!connection->protocol) return; @@ -126,12 +136,33 @@ static void legacy_connection_exit(struct gb_connection *connection) legacy_connection_unbind_protocol(connection); } +static int legacy_connection_create(struct legacy_connection *lc, + struct gb_bundle *bundle, + struct greybus_descriptor_cport *desc) +{ + struct gb_connection *connection; + + connection = gb_connection_create(bundle, le16_to_cpu(desc->id)); + if (IS_ERR(connection)) + return PTR_ERR(connection); + + lc->connection = connection; + lc->connection->protocol_id = desc->protocol_id; + + return 0; +} + +static void legacy_connection_destroy(struct legacy_connection *lc) +{ + gb_connection_destroy(lc->connection); +} + static int legacy_probe(struct gb_bundle *bundle, const struct greybus_bundle_id *id) { struct greybus_descriptor_cport *cport_desc; struct legacy_data *data; - struct gb_connection *connection; + struct legacy_connection *lc; int i; int ret; @@ -154,27 +185,19 @@ static int legacy_probe(struct gb_bundle *bundle, for (i = 0; i < data->num_cports; ++i) { cport_desc = &bundle->cport_desc[i]; + lc = &data->connections[i]; - connection = gb_connection_create(bundle, - le16_to_cpu(cport_desc->id)); - if (IS_ERR(connection)) { - ret = PTR_ERR(connection); + ret = legacy_connection_create(lc, bundle, cport_desc); + if (ret) goto err_connections_destroy; - } - - connection->protocol_id = cport_desc->protocol_id; - - data->connections[i] = connection; } greybus_set_drvdata(bundle, data); for (i = 0; i < data->num_cports; ++i) { - connection = data->connections[i]; - dev_dbg(&bundle->dev, "enabling connection %s\n", - connection->name); + lc = &data->connections[i]; - ret = legacy_connection_init(connection); + ret = legacy_connection_init(lc); if (ret) goto err_connections_disable; } @@ -183,10 +206,10 @@ static int legacy_probe(struct gb_bundle *bundle, err_connections_disable: for (--i; i >= 0; --i) - legacy_connection_exit(data->connections[i]); + legacy_connection_exit(&data->connections[i]); err_connections_destroy: for (i = 0; i < data->num_cports; ++i) - gb_connection_destroy(data->connections[i]); + legacy_connection_destroy(&data->connections[i]); kfree(data->connections); err_free_data: kfree(data); @@ -203,8 +226,8 @@ static void legacy_disconnect(struct gb_bundle *bundle) bundle->class); for (i = 0; i < data->num_cports; ++i) { - legacy_connection_exit(data->connections[i]); - gb_connection_destroy(data->connections[i]); + legacy_connection_exit(&data->connections[i]); + legacy_connection_destroy(&data->connections[i]); } kfree(data->connections); |