diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-11 12:09:37 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-11 12:09:37 -0800 |
commit | 14ba9a2e4bacc6f5a0dbe0de5390daedd544508f (patch) | |
tree | 90b0d639f577feada25fb56837c3e8350b7de035 /drivers/mailbox/mailbox.c | |
parent | Merge tag 'spi-v3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi (diff) | |
parent | Mailbox: Add support for Platform Communication Channel (diff) | |
download | linux-dev-14ba9a2e4bacc6f5a0dbe0de5390daedd544508f.tar.xz linux-dev-14ba9a2e4bacc6f5a0dbe0de5390daedd544508f.zip |
Merge branch 'mailbox-devel' of git://git.linaro.org/landing-teams/working/fujitsu/integration
Pull mailbox framework updates from Jassi Brar.
* 'mailbox-devel' of git://git.linaro.org/landing-teams/working/fujitsu/integration:
Mailbox: Add support for Platform Communication Channel
mailbox/omap: adapt to the new mailbox framework
mailbox: add tx_prepare client callback
mailbox: Don't unnecessarily re-arm the polling timer
Diffstat (limited to 'drivers/mailbox/mailbox.c')
-rw-r--r-- | drivers/mailbox/mailbox.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c index afcb430508ec..59aad4d5da53 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c @@ -21,13 +21,13 @@ #include <linux/mailbox_client.h> #include <linux/mailbox_controller.h> -#define TXDONE_BY_IRQ BIT(0) /* controller has remote RTR irq */ -#define TXDONE_BY_POLL BIT(1) /* controller can read status of last TX */ -#define TXDONE_BY_ACK BIT(2) /* S/W ACK recevied by Client ticks the TX */ +#include "mailbox.h" static LIST_HEAD(mbox_cons); static DEFINE_MUTEX(con_mutex); +static void poll_txdone(unsigned long data); + static int add_to_rbuf(struct mbox_chan *chan, void *mssg) { int idx; @@ -60,7 +60,7 @@ static void msg_submit(struct mbox_chan *chan) unsigned count, idx; unsigned long flags; void *data; - int err; + int err = -EBUSY; spin_lock_irqsave(&chan->lock, flags); @@ -76,6 +76,8 @@ static void msg_submit(struct mbox_chan *chan) data = chan->msg_data[idx]; + if (chan->cl->tx_prepare) + chan->cl->tx_prepare(chan->cl, data); /* Try to submit a message to the MBOX controller */ err = chan->mbox->ops->send_data(chan, data); if (!err) { @@ -84,6 +86,9 @@ static void msg_submit(struct mbox_chan *chan) } exit: spin_unlock_irqrestore(&chan->lock, flags); + + if (!err && chan->txdone_method == TXDONE_BY_POLL) + poll_txdone((unsigned long)chan->mbox); } static void tx_tick(struct mbox_chan *chan, int r) @@ -117,10 +122,11 @@ static void poll_txdone(unsigned long data) struct mbox_chan *chan = &mbox->chans[i]; if (chan->active_req && chan->cl) { - resched = true; txdone = chan->mbox->ops->last_tx_done(chan); if (txdone) tx_tick(chan, 0); + else + resched = true; } } @@ -252,9 +258,6 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg) msg_submit(chan); - if (chan->txdone_method == TXDONE_BY_POLL) - poll_txdone((unsigned long)chan->mbox); - if (chan->cl->tx_block && chan->active_req) { unsigned long wait; int ret; |