mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
75 lines
2.1 KiB
Diff
75 lines
2.1 KiB
Diff
From 8a4bb71a27420d66c52e0b0347dddb5853c69a15 Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Tue, 8 Feb 2022 16:57:47 +0900
|
|
Subject: [PATCH 041/171] mailbox: apple: Implement flush() operation
|
|
|
|
This allows clients to use the atomic-safe mailbox API style.
|
|
|
|
Signed-off-by: Hector Martin <marcan@marcan.st>
|
|
---
|
|
drivers/mailbox/apple-mailbox.c | 27 +++++++++++++++++++++++++++
|
|
1 file changed, 27 insertions(+)
|
|
|
|
diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c
|
|
index 496c4951ccb1..33e7acf71e3e 100644
|
|
--- a/drivers/mailbox/apple-mailbox.c
|
|
+++ b/drivers/mailbox/apple-mailbox.c
|
|
@@ -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,
|
|
};
|
|
--
|
|
2.34.1
|
|
|