Thread (1 message) 1 message, 1 author, 2017-01-04

[PATCH v1 2/4] mailbox: Add iProc mailbox controller driver

From: Jonathan Richardson <hidden>
Date: 2017-01-04 21:53:54
Also in: linux-devicetree


On 16-11-16 07:40 PM, Jassi Brar wrote:
Hi Jonathan,
Hi Jassi. Thanks for the review. I was away so sorry for the slow reply.
On Wed, Oct 19, 2016 at 12:30 AM, Jonathan Richardson
[off-list ref] wrote:
quoted
The Broadcom iProc mailbox controller handles all communication with a
Cortex-M0 MCU processor that provides support for power, clock, and
reset management.

Tested-by: Jonathan Richardson <redacted>
Reviewed-by: Jonathan Richardson <redacted>
Reviewed-by: Vikram Prakash <redacted>
Reviewed-by: Shreesha Rajashekar <redacted>
Reviewed-by: Ray Jui <redacted>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
Signed-off-by: Jonathan Richardson <redacted>
---
 drivers/mailbox/Kconfig             |  10 +
 drivers/mailbox/Makefile            |   2 +
 drivers/mailbox/bcm-iproc-mailbox.c | 422 ++++++++++++++++++++++++++++++++++++
 include/linux/bcm_iproc_mailbox.h   |  32 +++
This should be include/linux/mailbox/bcm_iproc_mailbox.h
I'll move it.
quoted
+++ b/drivers/mailbox/bcm-iproc-mailbox.c
@@ -0,0 +1,422 @@
+/*
+ * Copyright (C) 2016 Broadcom.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/irqchip/chained_irq.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+#include <linux/mailbox_controller.h>
+#include <linux/mailbox_client.h>
Need of mailbox_controller.h & client.h is a bad sign.
The controller is using this only for the tx_tout value from the client
to determine a reasonable timeout period. We could use a fixed value in
the controller instead.
quoted
+
+static int iproc_mbox_send_data_m0_imp(struct iproc_mbox *mbox,
+       struct iproc_mbox_msg *msg, int max_retries, int poll_period_us)
+{
+       unsigned long flags;
+       u32 val;
+       int err = 0;
+       int retries;
+
+       spin_lock_irqsave(&mbox->lock, flags);
+
+       dev_dbg(mbox->dev, "Send msg to M0: cmd=0x%x, param=0x%x, wait_ack=%d\n",
+               msg->cmd, msg->param, msg->wait_ack);
+
+       writel(msg->cmd, mbox->base + IPROC_CRMU_MAILBOX0_OFFSET);
+       writel(msg->param, mbox->base + IPROC_CRMU_MAILBOX1_OFFSET);
+
+       if (msg->wait_ack) {
+               err = msg->reply_code = -ETIMEDOUT;
+               for (retries = 0; retries < max_retries; retries++) {
+                       val = readl(mbox->base + IPROC_CRMU_MAILBOX0_OFFSET);
+                       if (val & M0_IPC_CMD_DONE_MASK) {
+                               /*
+                                * M0 replied - save reply code and
+                                * clear error.
+                                */
+                               msg->reply_code = (val &
+                                       M0_IPC_CMD_REPLY_MASK) >>
+                                       M0_IPC_CMD_REPLY_SHIFT;
+                               err = 0;
+                               break;
+                       }
+                       udelay(poll_period_us);
+               }
+       }
+
+       spin_unlock_irqrestore(&mbox->lock, flags);
+
+       return err;
+}
+
OK, so this is the real message passing voodoo.
quoted
+static void iproc_mbox_aon_gpio_forwarding_enable(struct iproc_mbox *mbox,
+       bool en)
+{
+       struct iproc_mbox_msg msg;
+       const int max_retries = 5;
+       const int poll_period_us = 200;
+
+       msg.cmd = M0_IPC_M0_CMD_AON_GPIO_FORWARDING_ENABLE;
+       msg.param = en ? 1 : 0;
+       msg.wait_ack = true;
+
+       iproc_mbox_send_data_m0_imp(mbox, &msg, max_retries, poll_period_us);
+}
+
+static void iproc_mbox_irq_unmask(struct irq_data *d)
+{
+       struct iproc_mbox *iproc_mbox = irq_data_get_irq_chip_data(d);
+
+       iproc_mbox_aon_gpio_forwarding_enable(iproc_mbox, true);
+}
+
+static void iproc_mbox_irq_mask(struct irq_data *d)
+{
+       /* Do nothing - Mask callback is not required, since upon GPIO event,
+        * M0 disables GPIO forwarding to A9. Hence, GPIO forwarding is already
+        * disabled  when in mbox irq handler, and no other mbox events from M0
+        * to A9 are expected until GPIO forwarding is enabled following
+        * iproc_mbox_irq_unmask()
+        */
+}
+
+static struct irq_chip iproc_mbox_irq_chip = {
+       .name = "bcm-iproc-mbox",
+       .irq_mask = iproc_mbox_irq_mask,
+       .irq_unmask = iproc_mbox_irq_unmask,
+};
+
.... these are simply using the mailbox controllers directly. So you
are actually clubbing a mailbox client (interrupt controller) with the
provider (mailbox) here.

I think you need move the IRQ controller part under drivers/irqchip/
that uses the mailbox api to manage its 'irq lines'.
Should be straight forward to change.

Thanks.
Thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help