summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mailbox/Kconfig10
-rw-r--r--drivers/mailbox/Makefile1
-rw-r--r--drivers/mailbox/renesas-mfis.c59
3 files changed, 70 insertions, 0 deletions
diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
index f9531c1627c..cfd2a3be3fd 100644
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -66,6 +66,16 @@ config K3_SEC_PROXY
Select this driver if your platform has support for this hardware
block.
+config RCAR_MFIS_MBOX
+ bool "Renesas MFIS Multifunctional Interface mailbox driver"
+ depends on DM_MAILBOX && ARCH_RENESAS
+ help
+ This enables support for the Renesas MFIS mailbox module, which
+ provides an interface between the different CPU Cores, such as AP
+ System Core domain and the Realtime Core domain, SCP Core domain
+ and AP System Core domain or Realtime Core domain and AP System
+ Core domain or Realtime Core domain.
+
config ZYNQMP_IPI
bool "Xilinx ZynqMP IPI controller support"
depends on DM_MAILBOX && (ARCH_ZYNQMP || ARCH_VERSAL || ARCH_VERSAL_NET || ARCH_VERSAL2)
diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile
index b54fbdfff15..b3a36691497 100644
--- a/drivers/mailbox/Makefile
+++ b/drivers/mailbox/Makefile
@@ -12,4 +12,5 @@ obj-$(CONFIG_SANDBOX_MBOX) += sandbox-mbox-test.o
obj-$(CONFIG_STM32_IPCC) += stm32-ipcc.o
obj-$(CONFIG_TEGRA_HSP) += tegra-hsp.o
obj-$(CONFIG_K3_SEC_PROXY) += k3-sec-proxy.o
+obj-$(CONFIG_RCAR_MFIS_MBOX) += renesas-mfis.o
obj-$(CONFIG_ZYNQMP_IPI) += zynqmp-ipi.o
diff --git a/drivers/mailbox/renesas-mfis.c b/drivers/mailbox/renesas-mfis.c
new file mode 100644
index 00000000000..1e9e8285974
--- /dev/null
+++ b/drivers/mailbox/renesas-mfis.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2020-2025, Renesas Electronics Corporation.
+ */
+
+#include <asm/io.h>
+#include <dm.h>
+#include <linux/delay.h>
+#include <mailbox-uclass.h>
+
+#define COM 0x0
+#define IIR BIT(0)
+
+struct mfis_priv {
+ void __iomem *tx_base;
+};
+
+static int mfis_send(struct mbox_chan *chan, const void *data)
+{
+ struct mfis_priv *mfis = dev_get_priv(chan->dev);
+
+ writel(IIR, mfis->tx_base + COM);
+
+ /* Give the remote side some time. */
+ mdelay(1);
+
+ writel(0, mfis->tx_base + COM);
+
+ return 0;
+}
+
+struct mbox_ops mfis_mbox_ops = {
+ .send = mfis_send,
+};
+
+static int mfis_mbox_probe(struct udevice *dev)
+{
+ struct mfis_priv *mbox = dev_get_priv(dev);
+
+ mbox->tx_base = dev_read_addr_index_ptr(dev, 0);
+ if (!mbox->tx_base)
+ return -ENODEV;
+
+ return 0;
+}
+
+static const struct udevice_id mfis_mbox_of_match[] = {
+ { .compatible = "renesas,mfis-mbox", },
+ {},
+};
+
+U_BOOT_DRIVER(renesas_mfis) = {
+ .name = "renesas-mfis",
+ .id = UCLASS_MAILBOX,
+ .of_match = mfis_mbox_of_match,
+ .probe = mfis_mbox_probe,
+ .priv_auto = sizeof(struct mfis_priv),
+ .ops = &mfis_mbox_ops,
+};