From: Greg Kroah-Hartman Date: Mon, 11 Aug 2014 11:03:20 +0000 (+0800) Subject: greybus: add framework for 'struct gbuf' X-Git-Tag: v5.15~12752^2~378^2~21^2~2188 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5d1903dcd158e220275a64f9f4df6cd06addb82;p=platform%2Fkernel%2Flinux-starfive.git greybus: add framework for 'struct gbuf' This is the equlivant of sk_buf or urbs for Greybus. --- diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile index 753436d..cc9c3a7 100644 --- a/drivers/staging/greybus/Makefile +++ b/drivers/staging/greybus/Makefile @@ -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 index 0000000..de31da8 --- /dev/null +++ b/drivers/staging/greybus/gbuf.c @@ -0,0 +1,42 @@ +/* + * Greybus gbuf handling + * + * Copyright 2014 Google Inc. + * + * Released under the GPLv2 only. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +#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; +} + + + diff --git a/drivers/staging/greybus/greybus.h b/drivers/staging/greybus/greybus.h index 28b3148..51b9f5b 100644 --- a/drivers/staging/greybus/greybus.h +++ b/drivers/staging/greybus/greybus.h @@ -29,19 +29,68 @@ .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;