summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/svc.c
diff options
context:
space:
mode:
authorGeorgi Dobrev <dobrev_georgi@projectara.com>2016-03-24 13:37:21 +0200
committerAkash Choudhari <akashtc@google.com>2016-04-01 14:41:49 -0700
commit88a3011e91f7c557798301d47f830320580795cf (patch)
treeb97ca845f74a2053459d96a8fe87c8619e5fd0be /drivers/staging/greybus/svc.c
parentd9984cf0f24860bc3a9d3c8f48d90a148827c5c6 (diff)
downloadop-kernel-dev-88a3011e91f7c557798301d47f830320580795cf.zip
op-kernel-dev-88a3011e91f7c557798301d47f830320580795cf.tar.gz
greybus: Added a sysfs entry to power down the SVC
Added a sysfs entry called pwr_off. When a "1" is passed to it, it sends a GB_SVC_TYPE_PWR_DOWN command to the SVC, powering it down along with the switch and INA231 chips. Testing Done: Tested on EVT1_5, works. Signed-off-by: Georgi Dobrev <dobrev_georgi@projectara.com>
Diffstat (limited to 'drivers/staging/greybus/svc.c')
-rw-r--r--drivers/staging/greybus/svc.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/staging/greybus/svc.c b/drivers/staging/greybus/svc.c
index a19e575..f96c645 100644
--- a/drivers/staging/greybus/svc.c
+++ b/drivers/staging/greybus/svc.c
@@ -99,11 +99,31 @@ static ssize_t watchdog_store(struct device *dev,
}
static DEVICE_ATTR_RW(watchdog);
+static ssize_t pwr_off_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t len)
+{
+ struct gb_svc *svc = to_gb_svc(dev);
+ int retval;
+ bool user_request;
+
+ retval = strtobool(buf, &user_request);
+ if (retval) {
+ return retval;
+ }
+ if (user_request) {
+ retval = gb_svc_pwr_off(svc);
+ }
+ return len;
+}
+static DEVICE_ATTR_WO(pwr_off);
+
static struct attribute *svc_attrs[] = {
&dev_attr_endo_id.attr,
&dev_attr_ap_intf_id.attr,
&dev_attr_intf_eject.attr,
&dev_attr_watchdog.attr,
+ &dev_attr_pwr_off.attr,
NULL,
};
ATTRIBUTE_GROUPS(svc);
@@ -320,6 +340,14 @@ int gb_svc_ping(struct gb_svc *svc)
}
EXPORT_SYMBOL_GPL(gb_svc_ping);
+int gb_svc_pwr_off(struct gb_svc *svc)
+{
+ return gb_operation_sync_timeout(svc->connection, GB_SVC_TYPE_PWR_DOWN,
+ NULL, 0, NULL, 0,
+ GB_OPERATION_TIMEOUT_DEFAULT * 2);
+}
+EXPORT_SYMBOL_GPL(gb_svc_pwr_off);
+
static int gb_svc_version_request(struct gb_operation *op)
{
struct gb_connection *connection = op->connection;
OpenPOWER on IntegriCloud