33
33
#include <plat/mailbox.h>
35
static struct workqueue_struct *mboxd;
36
35
static struct omap_mbox **mboxes;
37
static DEFINE_MUTEX(mboxes_lock);
39
37
static int mbox_configured;
40
38
static DEFINE_MUTEX(mbox_configured_lock);
169
167
static void __mbox_tx_interrupt(struct omap_mbox *mbox)
171
struct omap_mbox *mbox_curr;
175
mbox_curr = mboxes[i];
176
if (!mbox_fifo_full(mbox_curr)) {
177
omap_mbox_disable_irq(mbox_curr, IRQ_TX);
178
ack_mbox_irq(mbox_curr, IRQ_TX);
179
tasklet_schedule(&mbox_curr->txq->tasklet);
169
omap_mbox_disable_irq(mbox, IRQ_TX);
170
ack_mbox_irq(mbox, IRQ_TX);
171
tasklet_schedule(&mbox->txq->tasklet);
185
174
static void __mbox_rx_interrupt(struct omap_mbox *mbox)
187
struct omap_mbox_queue *mq;
176
struct omap_mbox_queue *mq = mbox->rxq;
191
struct omap_mbox *mbox_curr;
195
mbox_curr = mboxes[i];
198
while (!mbox_fifo_empty(mbox_curr)) {
200
if (unlikely(kfifo_avail(&mq->fifo) < sizeof(msg))) {
201
omap_mbox_disable_irq(mbox_curr, IRQ_RX);
206
msg = mbox_fifo_read(mbox_curr);
208
len = kfifo_in(&mq->fifo, (unsigned char *)&msg,
210
if (unlikely(len != sizeof(msg)))
211
pr_err("%s: kfifo_in anomaly detected\n",
213
if (mbox->ops->type == OMAP_MBOX_TYPE1)
180
while (!mbox_fifo_empty(mbox)) {
181
if (unlikely(kfifo_avail(&mq->fifo) < sizeof(msg))) {
182
omap_mbox_disable_irq(mbox, IRQ_RX);
216
/* no more messages in the fifo. clear IRQ source. */
218
ack_mbox_irq(mbox_curr, IRQ_RX);
187
msg = mbox_fifo_read(mbox);
189
len = kfifo_in(&mq->fifo, (unsigned char *)&msg, sizeof(msg));
190
WARN_ON(len != sizeof(msg));
192
if (mbox->ops->type == OMAP_MBOX_TYPE1)
196
/* no more messages in the fifo. clear IRQ source. */
197
ack_mbox_irq(mbox, IRQ_RX);
220
queue_work(mboxd, &mbox->rxq->work);
199
schedule_work(&mbox->rxq->work);
226
202
static irqreturn_t mbox_interrupt(int irq, void *p)
330
306
if (!--mbox->use_count) {
331
307
free_irq(mbox->irq, mbox);
332
308
tasklet_kill(&mbox->txq->tasklet);
333
flush_work(&mbox->rxq->work);
309
flush_work_sync(&mbox->rxq->work);
334
310
mbox_queue_free(mbox->txq);
335
311
mbox_queue_free(mbox->rxq);
378
351
void omap_mbox_put(struct omap_mbox *mbox, struct notifier_block *nb)
381
blocking_notifier_chain_unregister(&mbox->notifier, nb);
353
blocking_notifier_chain_unregister(&mbox->notifier, nb);
382
354
omap_mbox_fini(mbox);
384
356
EXPORT_SYMBOL(omap_mbox_put);
444
mboxd = create_workqueue("mboxd");
448
411
/* kfifo size sanity check: alignment and minimal size */
449
412
mbox_kfifo_size = ALIGN(mbox_kfifo_size, sizeof(mbox_msg_t));
450
413
mbox_kfifo_size = max_t(unsigned int, mbox_kfifo_size,