greybus: svc: add interface eject operation
authorRui Miguel Silva <rui.silva@linaro.org>
Mon, 11 Jan 2016 13:46:31 +0000 (13:46 +0000)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 13 Jan 2016 01:00:12 +0000 (17:00 -0800)
Add a new svc operation which will be used to send a request to eject a
given interface.

Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Reviewed-by: Jeffrey Carlyle <jcarlyle@google.com>
drivers/staging/greybus/greybus_protocols.h
drivers/staging/greybus/svc.c
drivers/staging/greybus/svc.h

index dfa3d29b78b34ac7a42a0706d44d1f298971b9d1..2ffe07cb2a0144551c99861beb32dd0599e36bf7 100644 (file)
@@ -760,6 +760,7 @@ struct gb_spi_transfer_response {
 #define GB_SVC_TYPE_ROUTE_CREATE       0x0b
 #define GB_SVC_TYPE_ROUTE_DESTROY      0x0c
 #define GB_SVC_TYPE_INTF_SET_PWRM      0x10
+#define GB_SVC_TYPE_INTF_EJECT         0x11
 
 /*
  * SVC version request/response has the same payload as
@@ -801,6 +802,12 @@ struct gb_svc_intf_reset_request {
 } __packed;
 /* interface reset response has no payload */
 
+#define GB_SVC_EJECT_TIME      9000
+struct gb_svc_intf_eject_request {
+       __u8    intf_id;
+} __packed;
+/* interface eject response has no payload */
+
 struct gb_svc_conn_create_request {
        __u8    intf1_id;
        __le16  cport1_id;
index c4c3bb54c9f7245539a222e8755116f5d295b0fe..ef10b67c7bf5d83226d7746b78bdcaea0db0844c 100644 (file)
@@ -69,6 +69,23 @@ int gb_svc_intf_reset(struct gb_svc *svc, u8 intf_id)
 }
 EXPORT_SYMBOL_GPL(gb_svc_intf_reset);
 
+int gb_svc_intf_eject(struct gb_svc *svc, u8 intf_id)
+{
+       struct gb_svc_intf_eject_request request;
+
+       request.intf_id = intf_id;
+
+       /*
+        * The pulse width for module release in svc is long so we need to
+        * increase the timeout so the operation will not return to soon.
+        */
+       return gb_operation_sync_timeout(svc->connection,
+                                        GB_SVC_TYPE_INTF_EJECT, &request,
+                                        sizeof(request), NULL, 0,
+                                        GB_SVC_EJECT_TIME);
+}
+EXPORT_SYMBOL_GPL(gb_svc_intf_eject);
+
 int gb_svc_dme_peer_get(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
                        u32 *value)
 {
index 0ebbed9c791fc26e12ca44c9cbaf39a0d73834ff..8567615068a7faa7bb3a70209587fc5072b2d6a2 100644 (file)
@@ -40,6 +40,7 @@ int gb_svc_connection_create(struct gb_svc *svc, u8 intf1_id, u16 cport1_id,
                             u8 intf2_id, u16 cport2_id, bool boot_over_unipro);
 void gb_svc_connection_destroy(struct gb_svc *svc, u8 intf1_id, u16 cport1_id,
                               u8 intf2_id, u16 cport2_id);
+int gb_svc_intf_eject(struct gb_svc *svc, u8 intf_id);
 int gb_svc_dme_peer_get(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
                        u32 *value);
 int gb_svc_dme_peer_set(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,