greybus: add framework for 'struct gbuf'
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 11 Aug 2014 11:03:20 +0000 (19:03 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 11 Aug 2014 11:03:20 +0000 (19:03 +0800)
This is the equlivant of sk_buf or urbs for Greybus.

drivers/staging/greybus/Makefile
drivers/staging/greybus/gbuf.c [new file with mode: 0644]
drivers/staging/greybus/greybus.h

index 753436d..cc9c3a7 100644 (file)
@@ -1,4 +1,4 @@
-greybus-y := core.o
+greybus-y := core.o gbuf.o
 
 obj-m += greybus.o
 obj-m += i2c-gb.o
diff --git a/drivers/staging/greybus/gbuf.c b/drivers/staging/greybus/gbuf.c
new file mode 100644 (file)
index 0000000..de31da8
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Greybus gbuf handling
+ *
+ * Copyright 2014 Google Inc.
+ *
+ * Released under the GPLv2 only.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/types.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+
+#include "greybus.h"
+
+
+struct gbuf *greybus_alloc_gbuf(struct greybus_device *gdev,
+                               struct cport *cport,
+                               gfp_t mem_flags)
+{
+       return NULL;
+}
+
+void greybus_free_gbuf(struct gbuf *gbuf)
+{
+}
+
+int greybus_submit_gbuf(struct gbuf *gbuf, gfp_t mem_flags)
+{
+       return -ENOMEM;
+}
+
+int greybus_kill_gbuf(struct gbuf *gbuf)
+{
+       return -ENOMEM;
+}
+
+
+
index 28b3148..51b9f5b 100644 (file)
        .match_flags    = GREYBUS_DEVICE_ID_MATCH_SERIAL,       \
        .lSerial        = (serial),
 
-
 struct greybus_descriptor {
        __u16   wVendor;
        __u16   wProduct;
        __u64   lSerialNumber;
 };
 
+
+struct gbuf;
+
+struct cport {
+       u16     number;
+       // FIXME, what else?
+};
+
+typedef void (*gbuf_complete_t)(struct gbuf *gbuf);
+
+struct gbuf {
+       struct kref kref;
+       void *hcpriv;
+
+       struct list_head anchor_list;
+       struct gbuf_anchor *anchor;     // FIXME do we need?
+
+       struct greybus_device *gdev;
+       struct cport *cport;
+       int status;
+       void *transfer_buffer;
+       u32 transfer_flags;             /* flags for the transfer buffer */
+       u32 transfer_buffer_length;
+       u32 actual_length;
+
+       struct scatterlist *sg;         // FIXME do we need?
+       int num_sgs;
+
+       void *context;
+       gbuf_complete_t complete;
+};
+
+/*
+ * gbuf->transfer_flags
+ */
+#define GBUF_FREE_BUFFER       BIT(0)  /* Free the transfer buffer with the gbuf */
+
+
 struct greybus_device {
        struct device dev;
        struct greybus_descriptor descriptor;
+       int num_cport;
+       struct cport cport[0];
 };
 #define to_greybus_device(d) container_of(d, struct greybus_device, dev)
 
+
+struct gbuf *greybus_alloc_gbuf(struct greybus_device *gdev,
+                               struct cport *cport,
+                               gfp_t mem_flags);
+void greybus_free_gbuf(struct gbuf *gbuf);
+
+int greybus_submit_gbuf(struct gbuf *gbuf, gfp_t mem_flags);
+int greybus_kill_gbuf(struct gbuf *gbuf);
+
+
 struct greybus_driver {
        const char *name;