remoteproc: k3_system_controller: Support optional boot_notification channel
authorNishanth Menon <nm@ti.com>
Tue, 25 Jan 2022 15:26:27 +0000 (20:56 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 8 Feb 2022 14:41:26 +0000 (09:41 -0500)
If there is an optional boot notification channel that an SoC uses
separate from the rx path, use the same.

Signed-off-by: Nishanth Menon <nm@ti.com>
doc/device-tree-bindings/remoteproc/k3-system-controller.txt
drivers/remoteproc/k3_system_controller.c

index 32f4720..33dc468 100644 (file)
@@ -13,6 +13,9 @@ Required properties:
                        "rx" for Receive channel
 - mboxes:              Corresponding phandles to mailbox channels.
 
+Optional properties:
+--------------------
+- mbox-names:          "boot_notify" for Optional alternate boot notification channel.
 
 Example:
 --------
index 89cb902..e2affe6 100644 (file)
@@ -77,14 +77,18 @@ struct k3_sysctrler_desc {
  * struct k3_sysctrler_privdata - Structure representing System Controller data.
  * @chan_tx:   Transmit mailbox channel
  * @chan_rx:   Receive mailbox channel
+ * @chan_boot_notify:  Boot notification channel
  * @desc:      SoC description for this instance
  * @seq_nr:    Counter for number of messages sent.
+ * @has_boot_notify:   Has separate boot notification channel
  */
 struct k3_sysctrler_privdata {
        struct mbox_chan chan_tx;
        struct mbox_chan chan_rx;
+       struct mbox_chan chan_boot_notify;
        struct k3_sysctrler_desc *desc;
        u32 seq_nr;
+       bool has_boot_notify;
 };
 
 static inline
@@ -223,7 +227,8 @@ static int k3_sysctrler_start(struct udevice *dev)
        debug("%s(dev=%p)\n", __func__, dev);
 
        /* Receive the boot notification. Note that it is sent only once. */
-       ret = mbox_recv(&priv->chan_rx, &msg, priv->desc->max_rx_timeout_us);
+       ret = mbox_recv(priv->has_boot_notify ? &priv->chan_boot_notify :
+                       &priv->chan_rx, &msg, priv->desc->max_rx_timeout_us);
        if (ret) {
                dev_err(dev, "%s: Boot Notification response failed. ret = %d\n",
                        __func__, ret);
@@ -272,6 +277,19 @@ static int k3_of_to_priv(struct udevice *dev,
                return ret;
        }
 
+       /* Some SoCs may have a optional channel for boot notification. */
+       priv->has_boot_notify = 1;
+       ret = mbox_get_by_name(dev, "boot_notify", &priv->chan_boot_notify);
+       if (ret == -ENODATA) {
+               dev_dbg(dev, "%s: Acquiring optional Boot_notify failed. ret = %d. Using Rx\n",
+                       __func__, ret);
+               priv->has_boot_notify = 0;
+       } else if (ret) {
+               dev_err(dev, "%s: Acquiring boot_notify channel failed. ret = %d\n",
+                       __func__, ret);
+               return ret;
+       }
+
        return 0;
 }