u-boot/drivers/mailbox/renesas-mfis.c
Tuyen Dang 5353fc464f mailbox: renesas: Add Renesas MFIS Multifunctional Interface mailbox driver
Add support for the Renesas MFIS mailbox, 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.

Signed-off-by: Tuyen Dang <tuyen.dang.xa@renesas.com>
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org> # Update the driver
[Marek: Rename the driver to renesas-mfis, simplify the driver.
        Always use only one TX channel and no RX channel, drop all
	unnecessary code. Perform 1ms delay in send callback which
	is perfectly fine to do in U-Boot which does RX polling]
2025-12-03 00:17:15 +01:00

60 lines
1.1 KiB
C

// 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,
};