[PATCH 4/4] drivers/mailbox: Add ASpeed mailbox driver
Joel Stanley
joel at jms.id.au
Tue Feb 7 16:40:25 AEDT 2017
On Thu, Jan 12, 2017 at 10:59 AM, Cyril Bur <cyrilbur at gmail.com> wrote:
> This provides access to the mbox registers on the ast2400 and ast2500
> boards.
s/boards/SoCs/
>
> This driver allows arbitrary reads and writes to the 16 data registers as
> the other end may have configured the mbox hardware to provide an
> interrupt when a specific register gets written to.
>
> Signed-off-by: Cyril Bur <cyrilbur at gmail.com>
Send this to lkml as well next time you submit.
> ---
> drivers/mailbox/Kconfig | 9 ++
> drivers/mailbox/Makefile | 2 +
> drivers/mailbox/aspeed-mbox.c | 334 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 345 insertions(+)
> create mode 100644 drivers/mailbox/aspeed-mbox.c
>
> diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
> index ceff415f201c..10a7f3f2765c 100644
> --- a/drivers/mailbox/Kconfig
> +++ b/drivers/mailbox/Kconfig
> @@ -152,4 +152,13 @@ config BCM_PDC_MBOX
> Mailbox implementation for the Broadcom PDC ring manager,
> which provides access to various offload engines on Broadcom
> SoCs. Say Y here if you want to use the Broadcom PDC.
> +
> +config ASPEED_MBOX
Call this ASPEED_LPC_MAILBOX, as it's a in the LPC IP block.
> + depends on (ARCH_ASPEED || COMPILE_TEST) && REGMAP && MFD_SYSCON
> + bool "Aspeed ast2400/2500 Mailbox Controller"
Call this Aspeed LPC Mailbox Controller, as the layout is shared by
SoCs other than the 2500 and 2400.
> + default "y"
> + ---help---
> + Provides a driver for the MBOX registers found on Aspeed SOCs
> + (AST2400 and AST2500). This driver provides a device for aspeed
> + mbox registers
> endif
> diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile
> index 7dde4f609ae8..db5b4f3f29e0 100644
> --- a/drivers/mailbox/Makefile
> +++ b/drivers/mailbox/Makefile
> @@ -31,3 +31,5 @@ obj-$(CONFIG_HI6220_MBOX) += hi6220-mailbox.o
> obj-$(CONFIG_BCM_PDC_MBOX) += bcm-pdc-mailbox.o
>
> obj-$(CONFIG_TEGRA_HSP_MBOX) += tegra-hsp.o
> +
> +obj-$(CONFIG_ASPEED_MBOX) += aspeed-mbox.o
> diff --git a/drivers/mailbox/aspeed-mbox.c b/drivers/mailbox/aspeed-mbox.c
> new file mode 100644
> index 000000000000..c4ee6ba228ea
> --- /dev/null
> +++ b/drivers/mailbox/aspeed-mbox.c
> +
> +static ssize_t aspeed_mbox_read(struct file *file, char __user *buf,
> + size_t count, loff_t *ppos)
> +{
> + struct aspeed_mbox *mbox = file_mbox(file);
> + char __user *p = buf;
> + ssize_t ret;
> + int i;
> +
> + if (!access_ok(VERIFY_WRITE, buf, count))
> + return -EFAULT;
As discussed in the LPC driver review:
"And don't call access_ok(), it's racy and no driver should ever do that."
Make sure all of the things you fixed in that driver are fixed in this one.
> +
> + if (count + *ppos > ASPEED_MBOX_NUM_REGS)
> + return -EINVAL;
> +
> + if (file->f_flags & O_NONBLOCK) {
> + if (!(aspeed_mbox_inb(mbox, ASPEED_MBOX_BMC_CTRL) &
> + ASPEED_MBOX_CTRL_RECV))
> + return -EAGAIN;
> + } else if (wait_event_interruptible(mbox->queue,
> + aspeed_mbox_inb(mbox, ASPEED_MBOX_BMC_CTRL) &
> + ASPEED_MBOX_CTRL_RECV)) {
> + return -ERESTARTSYS;
> + }
> +
> + mutex_lock(&mbox->mutex);
> +
> + for (i = *ppos; count > 0 && i < ASPEED_MBOX_NUM_REGS; i++) {
> + uint8_t reg = aspeed_mbox_inb(mbox, ASPEED_MBOX_DATA_0 + (i * 4));
> +
> + ret = __put_user(reg, p);
> + if (ret)
> + goto out_unlock;
> +
> + p++;
> + count--;
> + }
> +
> + /* ASPEED_MBOX_CTRL_RECV bit is W1C, this also unmasks in 1 step */
W1C? Write to clear?
> + aspeed_mbox_outb(mbox, ASPEED_MBOX_CTRL_RECV, ASPEED_MBOX_BMC_CTRL);
> + ret = p - buf;
> +
> +out_unlock:
> + mutex_unlock(&mbox->mutex);
> + return ret;
> +}
> +
> +module_platform_driver(aspeed_mbox_driver);
> +
> +MODULE_DEVICE_TABLE(of, aspeed_mbox_match);
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Cyril Bur <cyrilbur at gmail.com>");
> +MODULE_DESCRIPTION("ASpeed mailbox device driver");
ASPEED or Aspeed.
> --
> 2.11.0
>
More information about the openbmc
mailing list