staging: nvec: Introduce new internal API for msg alloc/free
authorJulian Andres Klode <jak@jak-linux.org>
Tue, 27 Sep 2011 17:00:48 +0000 (19:00 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 30 Sep 2011 00:40:40 +0000 (17:40 -0700)
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>
drivers/staging/nvec/nvec.c
drivers/staging/nvec/nvec.h

index 43a83a9..fb0f51a 100644 (file)
@@ -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)
 {
index fe11225..5440802 100644 (file)
 #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;