Commit 0b1076c4 authored by Julian Andres Klode's avatar Julian Andres Klode Committed by Greg Kroah-Hartman

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: default avatarJulian Andres Klode <jak@jak-linux.org>
Acked-by: default avatarMarc Dietrich <marvin24@gmx.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b414e2eb
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <linux/atomic.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -91,6 +92,28 @@ static int nvec_status_notifier(struct notifier_block *nb, ...@@ -91,6 +92,28 @@ static int nvec_status_notifier(struct notifier_block *nb,
return NOTIFY_OK; 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, void nvec_write_async(struct nvec_chip *nvec, const unsigned char *data,
short size) short size)
{ {
......
...@@ -16,9 +16,13 @@ ...@@ -16,9 +16,13 @@
#ifndef __LINUX_MFD_NVEC #ifndef __LINUX_MFD_NVEC
#define __LINUX_MFD_NVEC #define __LINUX_MFD_NVEC
#include <linux/atomic.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/semaphore.h> #include <linux/semaphore.h>
/* NVEC_POOL_SIZE - Size of the pool in &struct nvec_msg */
#define NVEC_POOL_SIZE 64
typedef enum { typedef enum {
NVEC_2BYTES, NVEC_2BYTES,
NVEC_3BYTES, NVEC_3BYTES,
...@@ -52,6 +56,7 @@ struct nvec_msg { ...@@ -52,6 +56,7 @@ struct nvec_msg {
unsigned short size; unsigned short size;
unsigned short pos; unsigned short pos;
struct list_head node; struct list_head node;
atomic_t used;
}; };
struct nvec_subdev { struct nvec_subdev {
...@@ -78,6 +83,7 @@ struct nvec_chip { ...@@ -78,6 +83,7 @@ struct nvec_chip {
struct notifier_block nvec_status_notifier; struct notifier_block nvec_status_notifier;
struct work_struct rx_work, tx_work; struct work_struct rx_work, tx_work;
struct nvec_msg *rx, *tx; struct nvec_msg *rx, *tx;
struct nvec_msg msg_pool[NVEC_POOL_SIZE];
/* sync write stuff */ /* sync write stuff */
struct semaphore sync_write_mutex; struct semaphore sync_write_mutex;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment