Skip to content

Commit

Permalink
greybus: control: add interface suspend prepare operation
Browse files Browse the repository at this point in the history
Add the AP implementation for the Greybus Control Interface Suspend
Prepare Operation. AP uses this Operation during the Suspend transition
to request the Interface to enter a low-power mode after it detects a
subsequent UniPro link hibernation.

Signed-off-by: David Lin <[email protected]>
Reviewed-by: Johan Hovold <[email protected]>
Signed-off-by: Alex Elder <[email protected]>
  • Loading branch information
dtwlin authored and Alex Elder committed Jul 8, 2016
1 parent f61908f commit f53be0e
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
35 changes: 35 additions & 0 deletions drivers/staging/greybus/control.c
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,41 @@ int gb_control_bundle_activate(struct gb_control *control, u8 bundle_id)
return 0;
}

static int gb_control_interface_pm_status_map(u8 status)
{
switch (status) {
case GB_CONTROL_INTF_PM_BUSY:
return -EBUSY;
case GB_CONTROL_INTF_PM_NA:
return -ENOMSG;
default:
return -EREMOTEIO;
}
}

int gb_control_interface_suspend_prepare(struct gb_control *control)
{
struct gb_control_intf_pm_response response;
int ret;

ret = gb_operation_sync(control->connection,
GB_CONTROL_TYPE_INTF_SUSPEND_PREPARE, NULL, 0,
&response, sizeof(response));
if (ret) {
dev_err(&control->dev,
"failed to send interface suspend prepare: %d\n", ret);
return ret;
}

if (response.status != GB_CONTROL_INTF_PM_OK) {
dev_err(&control->dev, "interface error while preparing suspend: %d\n",
response.status);
return gb_control_interface_pm_status_map(response.status);
}

return 0;
}

static ssize_t vendor_string_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/greybus/control.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,5 @@ int gb_control_bundle_suspend(struct gb_control *control, u8 bundle_id);
int gb_control_bundle_resume(struct gb_control *control, u8 bundle_id);
int gb_control_bundle_deactivate(struct gb_control *control, u8 bundle_id);
int gb_control_bundle_activate(struct gb_control *control, u8 bundle_id);
int gb_control_interface_suspend_prepare(struct gb_control *control);
#endif /* __CONTROL_H */
15 changes: 15 additions & 0 deletions drivers/staging/greybus/greybus_protocols.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ struct gb_protocol_version_response {
#define GB_CONTROL_TYPE_BUNDLE_RESUME 0x10
#define GB_CONTROL_TYPE_BUNDLE_DEACTIVATE 0x11
#define GB_CONTROL_TYPE_BUNDLE_ACTIVATE 0x12
#define GB_CONTROL_TYPE_INTF_SUSPEND_PREPARE 0x13

struct gb_control_version_request {
__u8 major;
Expand Down Expand Up @@ -214,6 +215,20 @@ struct gb_control_bundle_pm_response {
__u8 status;
} __packed;

/*
* Interface Suspend Prepare and Deactivate Prepare operations use the same
* response layout and error codes. Define a single response structure and reuse
* it. Both operations have no payload.
*/

#define GB_CONTROL_INTF_PM_OK 0x00
#define GB_CONTROL_INTF_PM_BUSY 0x01
#define GB_CONTROL_INTF_PM_NA 0x02

struct gb_control_intf_pm_response {
__u8 status;
} __packed;

/* APBridge protocol */

/* request APB1 log */
Expand Down

0 comments on commit f53be0e

Please sign in to comment.