MLK-14938-23 mailbox: enable mbox_send non-blocking use

Add a timeout to allow non-blocking use in the
same way as mbox_recv

Signed-off-by: Teo Hall <teo.hall@nxp.com>
(cherry picked from commit c2296701fa91dc8d4144c84c19ffe40dba3df88c)
This commit is contained in:
Teo Hall 2016-09-12 14:12:25 -05:00 committed by Ye Li
parent 3733fc85c1
commit afcfb7e510
2 changed files with 19 additions and 3 deletions

View File

@ -100,13 +100,29 @@ int mbox_free(struct mbox_chan *chan)
return ops->free(chan);
}
int mbox_send(struct mbox_chan *chan, const void *data)
int mbox_send(struct mbox_chan *chan, const void *data, ulong timeout_us)
{
struct mbox_ops *ops = mbox_dev_ops(chan->dev);
ulong start_time;
int ret;
debug("%s(chan=%p, data=%p)\n", __func__, chan, data);
return ops->send(chan, data);
start_time = timer_get_us();
/*
* Account for partial us ticks, but if timeout_us is 0, ensure we
* still don't wait at all.
*/
if (timeout_us)
timeout_us++;
for (;;) {
ret = ops->send(chan, data);
if (ret != -EBUSY)
return ret;
if ((timer_get_us() - start_time) >= timeout_us)
return -ETIMEDOUT;
}
}
int mbox_recv(struct mbox_chan *chan, void *data, ulong timeout_us)

View File

@ -124,7 +124,7 @@ int mbox_free(struct mbox_chan *chan);
* will ignore this parameter.
* @return 0 if OK, or a negative error code.
*/
int mbox_send(struct mbox_chan *chan, const void *data);
int mbox_send(struct mbox_chan *chan, const void *data, ulong timeout_us);
/**
* mbox_recv - Receive any available message from a mailbox channel