summaryrefslogtreecommitdiff
path: root/drivers/staging/greybus/legacy.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2016-01-21 17:34:17 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2016-01-21 22:46:38 -0800
commit431b3ebb3d9e0c25081006fc7a1f97621dca6192 (patch)
treeedb6fc3419ba44c68aa9c16f0505a905646532cc /drivers/staging/greybus/legacy.c
parent24e094d687a23878024589a854ce66a070b769cc (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.c67
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);