greybus: add framework for 'struct gbuf'

This is the equlivant of sk_buf or urbs for Greybus.
This commit is contained in:
Greg Kroah-Hartman 2014-08-11 19:03:20 +08:00
parent 83ddaaab01
commit d5d1903dcd
3 changed files with 93 additions and 2 deletions

View file

@ -1,4 +1,4 @@
greybus-y := core.o
greybus-y := core.o gbuf.o
obj-m += greybus.o
obj-m += i2c-gb.o

View file

@ -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;
}

View file

@ -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;