]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mailbox: apple: Implement flush() operation
authorHector Martin <marcan@marcan.st>
Wed, 14 Sep 2022 08:34:21 +0000 (09:34 +0100)
committerJassi Brar <jaswinder.singh@linaro.org>
Thu, 15 Sep 2022 18:14:01 +0000 (13:14 -0500)
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>
drivers/mailbox/apple-mailbox.c

index 496c4951ccb13735535ee1eb8493c55c8848c569..33e7acf71e3e92c63e69569d486463778203694d 100644 (file)
@@ -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,
 };