mailbox: apple: Implement flush() operation
This allows clients to use the atomic-safe mailbox API style. Signed-off-by: Hector Martin <marcan@marcan.st> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
This commit is contained in:
parent
3245cb65fd
commit
38ed8c888e
@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/apple-mailbox.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/interrupt.h>
|
||||
@ -112,6 +113,14 @@ static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox)
|
||||
return !(mbox_ctrl & apple_mbox->hw->control_full);
|
||||
}
|
||||
|
||||
static bool apple_mbox_hw_send_empty(struct apple_mbox *apple_mbox)
|
||||
{
|
||||
u32 mbox_ctrl =
|
||||
readl_relaxed(apple_mbox->regs + apple_mbox->hw->a2i_control);
|
||||
|
||||
return mbox_ctrl & apple_mbox->hw->control_empty;
|
||||
}
|
||||
|
||||
static int apple_mbox_hw_send(struct apple_mbox *apple_mbox,
|
||||
struct apple_mbox_msg *msg)
|
||||
{
|
||||
@ -219,6 +228,23 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout)
|
||||
{
|
||||
struct apple_mbox *apple_mbox = chan->con_priv;
|
||||
unsigned long deadline = jiffies + msecs_to_jiffies(timeout);
|
||||
|
||||
while (time_before(jiffies, deadline)) {
|
||||
if (apple_mbox_hw_send_empty(apple_mbox)) {
|
||||
mbox_chan_txdone(&apple_mbox->chan, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
static int apple_mbox_chan_startup(struct mbox_chan *chan)
|
||||
{
|
||||
struct apple_mbox *apple_mbox = chan->con_priv;
|
||||
@ -250,6 +276,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan)
|
||||
|
||||
static const struct mbox_chan_ops apple_mbox_ops = {
|
||||
.send_data = apple_mbox_chan_send_data,
|
||||
.flush = apple_mbox_chan_flush,
|
||||
.startup = apple_mbox_chan_startup,
|
||||
.shutdown = apple_mbox_chan_shutdown,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user