summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2016-05-27 17:26:26 +0200
committerGreg Kroah-Hartman <gregkh@google.com>2016-05-27 12:19:29 -0700
commit197616e227b5b562814828df4dac9477e27b0149 (patch)
tree3de269658a3bb33d8f9f8d75882d5c242388cead
parentaca7aab39aa2d69d0a5b1cfc9319506b7c26b79d (diff)
greybus: control: implement disconnecting operation
Implement the new disconnecting control operation needed for proper connection tear down. 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>
-rw-r--r--drivers/staging/greybus/control.c12
-rw-r--r--drivers/staging/greybus/control.h2
-rw-r--r--drivers/staging/greybus/greybus_protocols.h6
3 files changed, 20 insertions, 0 deletions
diff --git a/drivers/staging/greybus/control.c b/drivers/staging/greybus/control.c
index a5effcf09f56..c5cdf3c8ccf8 100644
--- a/drivers/staging/greybus/control.c
+++ b/drivers/staging/greybus/control.c
@@ -149,6 +149,18 @@ int gb_control_disconnected_operation(struct gb_control *control, u16 cport_id)
sizeof(request), NULL, 0);
}
+int gb_control_disconnecting_operation(struct gb_control *control,
+ u16 cport_id)
+{
+ struct gb_control_disconnecting_request request;
+
+ request.cport_id = cpu_to_le16(cport_id);
+
+ return gb_operation_sync(control->connection,
+ GB_CONTROL_TYPE_DISCONNECTING, &request,
+ sizeof(request), NULL, 0);
+}
+
int gb_control_mode_switch_operation(struct gb_control *control)
{
return gb_operation_unidirectional(control->connection,
diff --git a/drivers/staging/greybus/control.h b/drivers/staging/greybus/control.h
index 33e7e2795d1e..9891fbdd1ff7 100644
--- a/drivers/staging/greybus/control.h
+++ b/drivers/staging/greybus/control.h
@@ -36,6 +36,8 @@ void gb_control_put(struct gb_control *control);
int gb_control_get_bundle_versions(struct gb_control *control);
int gb_control_connected_operation(struct gb_control *control, u16 cport_id);
int gb_control_disconnected_operation(struct gb_control *control, u16 cport_id);
+int gb_control_disconnecting_operation(struct gb_control *control,
+ u16 cport_id);
int gb_control_mode_switch_operation(struct gb_control *control);
int gb_control_get_manifest_size_operation(struct gb_interface *intf);
int gb_control_get_manifest_operation(struct gb_interface *intf, void *manifest,
diff --git a/drivers/staging/greybus/greybus_protocols.h b/drivers/staging/greybus/greybus_protocols.h
index b98f02c93b1a..216a1d1c3481 100644
--- a/drivers/staging/greybus/greybus_protocols.h
+++ b/drivers/staging/greybus/greybus_protocols.h
@@ -123,6 +123,7 @@ struct gb_protocol_version_response {
#define GB_CONTROL_TYPE_TIMESYNC_AUTHORITATIVE 0x09
/* Unused 0x0a */
#define GB_CONTROL_TYPE_BUNDLE_VERSION 0x0b
+#define GB_CONTROL_TYPE_DISCONNECTING 0x0c
#define GB_CONTROL_TYPE_TIMESYNC_GET_LAST_EVENT 0x0d
#define GB_CONTROL_TYPE_MODE_SWITCH 0x0e
@@ -160,6 +161,11 @@ struct gb_control_connected_request {
__le16 cport_id;
} __packed;
+struct gb_control_disconnecting_request {
+ __le16 cport_id;
+} __packed;
+/* disconnecting response has no payload */
+
struct gb_control_disconnected_request {
__le16 cport_id;
} __packed;