staging: nvec: Introduce new internal API for msg alloc/free
Introduce two new functions nvec_msg_alloc() and nvec_msg_free() that allocate and free message buffers from the internal pool of messages. Signed-off-by: Julian Andres Klode <jak@jak-linux.org> Acked-by: Marc Dietrich <marvin24@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
b414e2eb3a
commit
0b1076c4b2
@ -17,6 +17,7 @@
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
@ -91,6 +92,28 @@ static int nvec_status_notifier(struct notifier_block *nb,
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct nvec_msg *nvec_msg_alloc(struct nvec_chip *nvec)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NVEC_POOL_SIZE; i++) {
|
||||
if (atomic_xchg(&nvec->msg_pool[i].used, 1) == 0) {
|
||||
dev_vdbg(nvec->dev, "INFO: Allocate %i\n", i);
|
||||
return &nvec->msg_pool[i];
|
||||
}
|
||||
}
|
||||
|
||||
dev_err(nvec->dev, "could not allocate buffer\n");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void nvec_msg_free(struct nvec_chip *nvec, struct nvec_msg *msg)
|
||||
{
|
||||
dev_vdbg(nvec->dev, "INFO: Free %ti\n", msg - nvec->msg_pool);
|
||||
atomic_set(&msg->used, 0);
|
||||
}
|
||||
|
||||
void nvec_write_async(struct nvec_chip *nvec, const unsigned char *data,
|
||||
short size)
|
||||
{
|
||||
|
@ -16,9 +16,13 @@
|
||||
#ifndef __LINUX_MFD_NVEC
|
||||
#define __LINUX_MFD_NVEC
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/semaphore.h>
|
||||
|
||||
/* NVEC_POOL_SIZE - Size of the pool in &struct nvec_msg */
|
||||
#define NVEC_POOL_SIZE 64
|
||||
|
||||
typedef enum {
|
||||
NVEC_2BYTES,
|
||||
NVEC_3BYTES,
|
||||
@ -52,6 +56,7 @@ struct nvec_msg {
|
||||
unsigned short size;
|
||||
unsigned short pos;
|
||||
struct list_head node;
|
||||
atomic_t used;
|
||||
};
|
||||
|
||||
struct nvec_subdev {
|
||||
@ -78,6 +83,7 @@ struct nvec_chip {
|
||||
struct notifier_block nvec_status_notifier;
|
||||
struct work_struct rx_work, tx_work;
|
||||
struct nvec_msg *rx, *tx;
|
||||
struct nvec_msg msg_pool[NVEC_POOL_SIZE];
|
||||
|
||||
/* sync write stuff */
|
||||
struct semaphore sync_write_mutex;
|
||||
|
Loading…
Reference in New Issue
Block a user