greybus: define gb_operation_status_map()

Define a common function that maps an operation status value to a
Linux negative errno.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c
index 3011020..cfc341e 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -288,6 +288,35 @@
 }
 
 /*
+ * Map an enum gb_operation_status value (which is represted in a
+ * message as a single back a single byte) to an appropriate Linux
+ * negative errno.
+ */
+int gb_operation_status_map(u8 status)
+{
+	switch (status) {
+	case GB_OP_SUCCESS:
+		return 0;
+	case GB_OP_INVALID:
+		return -EINVAL;
+	case GB_OP_NO_MEMORY:
+		return -ENOMEM;
+	case GB_OP_INTERRUPTED:
+		return -EINTR;
+	case GB_OP_RETRY:
+		return -EAGAIN;
+	case GB_OP_PROTOCOL_BAD:
+		return -EPROTONOSUPPORT;
+	case GB_OP_OVERFLOW:
+		return -E2BIG;
+	case GB_OP_TIMEOUT:
+		return -ETIMEDOUT;
+	default:
+		return -EIO;
+	}
+}
+
+/*
  * Create a Greybus operation to be sent over the given connection.
  * The request buffer will big enough for a payload of the given
  * size.  Outgoing requests must specify the size of the response
diff --git a/drivers/staging/greybus/operation.h b/drivers/staging/greybus/operation.h
index 80ee158..6547291 100644
--- a/drivers/staging/greybus/operation.h
+++ b/drivers/staging/greybus/operation.h
@@ -101,6 +101,8 @@
 void gb_operation_cancel(struct gb_operation *operation);
 int gb_operation_wait(struct gb_operation *operation);
 
+int gb_operation_status_map(u8 status);
+
 int gb_operation_init(void);
 void gb_operation_exit(void);