-/*
- * Mailbox queue handling API
- */
-
-#define MBQ_DEPTH 16
-struct omap_mbq {
- rwlock_t lock;
- mbox_msg_t msg[MBQ_DEPTH];
- mbox_msg_t *rp, *wp;
- int cnt;
-};
-
-static inline int mbq_init(struct omap_mbq **addr)
-{
- struct omap_mbq *m = kmalloc(sizeof(struct omap_mbq), GFP_KERNEL);
- if (!m)
- return -ENOMEM;
-
- rwlock_init(&m->lock);
-
- write_lock_irq(&m->lock);
- m->rp = m->wp = &m->msg[0];
- m->cnt = 0;
- write_unlock_irq(&m->lock);
-
- *addr = m;
-
- return 0;
-}
-
-static inline int mbq_empty(struct omap_mbq *mbq)
-{
- int ret;
-
- read_lock_irq(&mbq->lock);
- ret = (mbq->cnt == 0);
- read_unlock_irq(&mbq->lock);
-
- return ret;
-}
-
-static inline int mbq_full(struct omap_mbq *mbq)
-{
- int ret;
-
- read_lock_irq(&mbq->lock);
- ret = (mbq->cnt == MBQ_DEPTH);
- read_unlock_irq(&mbq->lock);
-
- return ret;
-}
-
-static inline int mbq_add(struct omap_mbq *mbq, mbox_msg_t msg)
-{
- int ret = 0;
-
- write_lock_irq(&mbq->lock);
-
- *mbq->wp = msg;
- if (++mbq->wp == &mbq->msg[MBQ_DEPTH])
- mbq->wp = &mbq->msg[0];
-
- if (++mbq->cnt == MBQ_DEPTH) /* full */
- ret = -1;
-
- write_unlock_irq(&mbq->lock);
-
- return ret;
-}
-
-static inline mbox_msg_t mbq_get(struct omap_mbq *mbq)
-{
- mbox_msg_t msg;
-
- write_lock_irq(&mbq->lock);
-
- msg = *mbq->rp;
-
- if (++mbq->rp == &mbq->msg[MBQ_DEPTH])
- mbq->rp = &mbq->msg[0];
- mbq->cnt--;
-
- write_unlock_irq(&mbq->lock);
-
- return msg;
-}
-
-static inline void mbq_exit(struct omap_mbq **addr)
-{
- if (*addr)
- kfree(*addr);
-}