]> git.karo-electronics.de Git - linux-beck.git/commitdiff
greybus: svc: add interface resume operation
authorDavid Lin <dtwlin@google.com>
Fri, 8 Jul 2016 03:07:00 +0000 (22:07 -0500)
committerAlex Elder <elder@linaro.org>
Fri, 8 Jul 2016 19:56:28 +0000 (14:56 -0500)
Add the AP implementation for the Greybus SVC Interface Resume
Operation. This operation allows the AP to request the SVC to resume an
Interface which was previously SUSPENDED, allowing it to later be
ENUMERATED.

Signed-off-by: David Lin <dtwlin@google.com>
Reviewed-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Alex Elder <elder@linaro.org>
drivers/staging/greybus/greybus_protocols.h
drivers/staging/greybus/svc.c
drivers/staging/greybus/svc.h

index dfee73716df7cc540fee5cd7317ba8d7881bca0d..1a12531944e9d7413181331dca118215a3d032fe 100644 (file)
@@ -1001,6 +1001,7 @@ struct gb_spi_transfer_response {
 #define GB_SVC_TYPE_INTF_UNIPRO_ENABLE         0x25
 #define GB_SVC_TYPE_INTF_UNIPRO_DISABLE                0x26
 #define GB_SVC_TYPE_INTF_ACTIVATE              0x27
+#define GB_SVC_TYPE_INTF_RESUME                        0x28
 #define GB_SVC_TYPE_INTF_MAILBOX_EVENT         0x29
 
 /* Greybus SVC protocol status values */
@@ -1321,6 +1322,14 @@ struct gb_svc_intf_activate_response {
        __u8    intf_type;
 } __packed;
 
+struct gb_svc_intf_resume_request {
+       __u8    intf_id;
+} __packed;
+
+struct gb_svc_intf_resume_response {
+       __u8    status;
+} __packed;
+
 #define GB_SVC_INTF_MAILBOX_NONE               0x00
 #define GB_SVC_INTF_MAILBOX_AP                 0x01
 #define GB_SVC_INTF_MAILBOX_GREYBUS            0x02
index 63d2a53b624f5d85a1e8a80f487ad73865673bd3..a46d7fb0139bf60fb74fd05b58418acc11e0c6f0 100644 (file)
@@ -14,6 +14,7 @@
 
 #define SVC_INTF_EJECT_TIMEOUT         9000
 #define SVC_INTF_ACTIVATE_TIMEOUT      6000
+#define SVC_INTF_RESUME_TIMEOUT        3000
 
 struct gb_svc_deferred_request {
        struct work_struct work;
@@ -354,6 +355,34 @@ int gb_svc_intf_activate(struct gb_svc *svc, u8 intf_id, u8 *intf_type)
        return 0;
 }
 
+int gb_svc_intf_resume(struct gb_svc *svc, u8 intf_id)
+{
+       struct gb_svc_intf_resume_request request;
+       struct gb_svc_intf_resume_response response;
+       int ret;
+
+       request.intf_id = intf_id;
+
+       ret = gb_operation_sync_timeout(svc->connection,
+                                       GB_SVC_TYPE_INTF_RESUME,
+                                       &request, sizeof(request),
+                                       &response, sizeof(response),
+                                       SVC_INTF_RESUME_TIMEOUT);
+       if (ret < 0) {
+               dev_err(&svc->dev, "failed to send interface resume %u: %d\n",
+                       intf_id, ret);
+               return ret;
+       }
+
+       if (response.status != GB_SVC_OP_SUCCESS) {
+               dev_err(&svc->dev, "failed to resume interface %u: %u\n",
+                       intf_id, response.status);
+               return -EREMOTEIO;
+       }
+
+       return 0;
+}
+
 int gb_svc_dme_peer_get(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
                        u32 *value)
 {
index 7f5e534238bc88b0bf9d1f729bfbb48786773041..750eaff7d0cdb42f7615f84e9ecd40e17aebd60f 100644 (file)
@@ -71,6 +71,8 @@ int gb_svc_intf_vsys_set(struct gb_svc *svc, u8 intf_id, bool enable);
 int gb_svc_intf_refclk_set(struct gb_svc *svc, u8 intf_id, bool enable);
 int gb_svc_intf_unipro_set(struct gb_svc *svc, u8 intf_id, bool enable);
 int gb_svc_intf_activate(struct gb_svc *svc, u8 intf_id, u8 *intf_type);
+int gb_svc_intf_resume(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,