Commit 38ed8c88 authored by Hector Martin's avatar Hector Martin Committed by Jassi Brar

mailbox: apple: Implement flush() operation

This allows clients to use the atomic-safe mailbox API style.
Signed-off-by: default avatarHector Martin <marcan@marcan.st>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarJassi Brar <jaswinder.singh@linaro.org>
parent 3245cb65
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
*/ */
#include <linux/apple-mailbox.h> #include <linux/apple-mailbox.h>
#include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -112,6 +113,14 @@ static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox) ...@@ -112,6 +113,14 @@ static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox)
return !(mbox_ctrl & apple_mbox->hw->control_full); 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, static int apple_mbox_hw_send(struct apple_mbox *apple_mbox,
struct apple_mbox_msg *msg) struct apple_mbox_msg *msg)
{ {
...@@ -219,6 +228,23 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data) ...@@ -219,6 +228,23 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data)
return IRQ_HANDLED; 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) static int apple_mbox_chan_startup(struct mbox_chan *chan)
{ {
struct apple_mbox *apple_mbox = chan->con_priv; struct apple_mbox *apple_mbox = chan->con_priv;
...@@ -250,6 +276,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan) ...@@ -250,6 +276,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan)
static const struct mbox_chan_ops apple_mbox_ops = { static const struct mbox_chan_ops apple_mbox_ops = {
.send_data = apple_mbox_chan_send_data, .send_data = apple_mbox_chan_send_data,
.flush = apple_mbox_chan_flush,
.startup = apple_mbox_chan_startup, .startup = apple_mbox_chan_startup,
.shutdown = apple_mbox_chan_shutdown, .shutdown = apple_mbox_chan_shutdown,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment