drm/amdgpu: stop touching sched.ready in the backend
[linux-2.6-microblaze.git] / drivers / remoteproc / remoteproc_sysfs.c
index 1dbef89..ea8b89f 100644 (file)
@@ -15,7 +15,7 @@ static ssize_t recovery_show(struct device *dev,
 {
        struct rproc *rproc = to_rproc(dev);
 
-       return sprintf(buf, "%s", rproc->recovery_disabled ? "disabled\n" : "enabled\n");
+       return sysfs_emit(buf, "%s", rproc->recovery_disabled ? "disabled\n" : "enabled\n");
 }
 
 /*
@@ -82,7 +82,7 @@ static ssize_t coredump_show(struct device *dev,
 {
        struct rproc *rproc = to_rproc(dev);
 
-       return sprintf(buf, "%s\n", rproc_coredump_str[rproc->dump_conf]);
+       return sysfs_emit(buf, "%s\n", rproc_coredump_str[rproc->dump_conf]);
 }
 
 /*
@@ -138,11 +138,8 @@ static ssize_t firmware_show(struct device *dev, struct device_attribute *attr,
         * If the remote processor has been started by an external
         * entity we have no idea of what image it is running.  As such
         * simply display a generic string rather then rproc->firmware.
-        *
-        * Here we rely on the autonomous flag because a remote processor
-        * may have been attached to and currently in a running state.
         */
-       if (rproc->autonomous)
+       if (rproc->state == RPROC_ATTACHED)
                firmware = "unknown";
 
        return sprintf(buf, "%s\n", firmware);
@@ -172,6 +169,7 @@ static const char * const rproc_state_string[] = {
        [RPROC_RUNNING]         = "running",
        [RPROC_CRASHED]         = "crashed",
        [RPROC_DELETED]         = "deleted",
+       [RPROC_ATTACHED]        = "attached",
        [RPROC_DETACHED]        = "detached",
        [RPROC_LAST]            = "invalid",
 };
@@ -196,17 +194,24 @@ static ssize_t state_store(struct device *dev,
        int ret = 0;
 
        if (sysfs_streq(buf, "start")) {
-               if (rproc->state == RPROC_RUNNING)
+               if (rproc->state == RPROC_RUNNING ||
+                   rproc->state == RPROC_ATTACHED)
                        return -EBUSY;
 
                ret = rproc_boot(rproc);
                if (ret)
                        dev_err(&rproc->dev, "Boot failed: %d\n", ret);
        } else if (sysfs_streq(buf, "stop")) {
-               if (rproc->state != RPROC_RUNNING)
+               if (rproc->state != RPROC_RUNNING &&
+                   rproc->state != RPROC_ATTACHED)
                        return -EINVAL;
 
                rproc_shutdown(rproc);
+       } else if (sysfs_streq(buf, "detach")) {
+               if (rproc->state != RPROC_ATTACHED)
+                       return -EINVAL;
+
+               ret = rproc_detach(rproc);
        } else {
                dev_err(&rproc->dev, "Unrecognised option: %s\n", buf);
                ret = -EINVAL;