]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mailbox: omap-mailbox: Check for pending msgs only when mbox is exclusive
authorBeleswar Padhi <b-padhi@ti.com>
Mon, 3 Nov 2025 20:11:11 +0000 (01:41 +0530)
committerJassi Brar <jassisinghbrar@gmail.com>
Fri, 28 Nov 2025 15:31:52 +0000 (09:31 -0600)
On TI K3 devices, the mailbox resides in the Always-On power domain
(LPSC_main_alwayson) and is shared among multiple processors. The
mailbox is not solely exclusive to Linux.

Currently, the suspend path checks all FIFO queues for pending messages
and blocks suspend if any are present. This behavior is unnecessary for
K3 devices, since some of the FIFOs are used for RTOS<->RTOS
communication and are independent of Linux.

For FIFOs used in Linux<->RTOS communication, any pending message would
trigger an interrupt, which naturally prevents suspend from completing.
Hence, there is no need for the mailbox driver to explicitly check for
pending messages on K3 platforms.

Introduce a device match flag to indicate whether the mailbox instance
is exclusive to Linux, and skip the pending message check for
non-exclusive instances (such as in K3).

Fixes: a49f991e740f ("arm64: dts: ti: k3-am62-verdin: Add missing cfg for TI IPC Firmware")
Closes: https://lore.kernel.org/all/sid7gtg5vay5qgicsl6smnzwg5mnneoa35cempt5ddwjvedaio@hzsgcx6oo74l/
Signed-off-by: Beleswar Padhi <b-padhi@ti.com>
Tested-by: Hiago De Franco <hiago.franco@toradex.com>
Reviewed-by: Andrew Davis <afd@ti.com>
Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
drivers/mailbox/omap-mailbox.c

index 680243751d625ff49cd16928a201d081332c9be4..17fe6545875d01606b80e678fca82bf44f6eaffa 100644 (file)
@@ -68,6 +68,7 @@ struct omap_mbox_fifo {
 
 struct omap_mbox_match_data {
        u32 intr_type;
+       bool is_exclusive;
 };
 
 struct omap_mbox_device {
@@ -78,6 +79,7 @@ struct omap_mbox_device {
        u32 num_users;
        u32 num_fifos;
        u32 intr_type;
+       const struct omap_mbox_match_data *mbox_data;
 };
 
 struct omap_mbox {
@@ -341,11 +343,13 @@ static int omap_mbox_suspend(struct device *dev)
        if (pm_runtime_status_suspended(dev))
                return 0;
 
-       for (fifo = 0; fifo < mdev->num_fifos; fifo++) {
-               if (mbox_read_reg(mdev, MAILBOX_MSGSTATUS(fifo))) {
-                       dev_err(mdev->dev, "fifo %d has unexpected unread messages\n",
-                               fifo);
-                       return -EBUSY;
+       if (mdev->mbox_data->is_exclusive) {
+               for (fifo = 0; fifo < mdev->num_fifos; fifo++) {
+                       if (mbox_read_reg(mdev, MAILBOX_MSGSTATUS(fifo))) {
+                               dev_err(mdev->dev, "fifo %d has unexpected unread messages\n",
+                                       fifo);
+                               return -EBUSY;
+                       }
                }
        }
 
@@ -378,8 +382,9 @@ static const struct dev_pm_ops omap_mbox_pm_ops = {
        SET_SYSTEM_SLEEP_PM_OPS(omap_mbox_suspend, omap_mbox_resume)
 };
 
-static const struct omap_mbox_match_data omap2_data = { MBOX_INTR_CFG_TYPE1 };
-static const struct omap_mbox_match_data omap4_data = { MBOX_INTR_CFG_TYPE2 };
+static const struct omap_mbox_match_data omap2_data = { MBOX_INTR_CFG_TYPE1, true };
+static const struct omap_mbox_match_data omap4_data = { MBOX_INTR_CFG_TYPE2, true };
+static const struct omap_mbox_match_data am654_data = { MBOX_INTR_CFG_TYPE2, false };
 
 static const struct of_device_id omap_mailbox_of_match[] = {
        {
@@ -396,11 +401,11 @@ static const struct of_device_id omap_mailbox_of_match[] = {
        },
        {
                .compatible     = "ti,am654-mailbox",
-               .data           = &omap4_data,
+               .data           = &am654_data,
        },
        {
                .compatible     = "ti,am64-mailbox",
-               .data           = &omap4_data,
+               .data           = &am654_data,
        },
        {
                /* end */
@@ -449,7 +454,6 @@ static int omap_mbox_probe(struct platform_device *pdev)
        struct omap_mbox_fifo *fifo;
        struct device_node *node = pdev->dev.of_node;
        struct device_node *child;
-       const struct omap_mbox_match_data *match_data;
        struct mbox_controller *controller;
        u32 intr_type, info_count;
        u32 num_users, num_fifos;
@@ -462,11 +466,6 @@ static int omap_mbox_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       match_data = of_device_get_match_data(&pdev->dev);
-       if (!match_data)
-               return -ENODEV;
-       intr_type = match_data->intr_type;
-
        if (of_property_read_u32(node, "ti,mbox-num-users", &num_users))
                return -ENODEV;
 
@@ -483,6 +482,12 @@ static int omap_mbox_probe(struct platform_device *pdev)
        if (!mdev)
                return -ENOMEM;
 
+       mdev->mbox_data = device_get_match_data(&pdev->dev);
+       if (!mdev->mbox_data)
+               return -ENODEV;
+
+       intr_type = mdev->mbox_data->intr_type;
+
        mdev->mbox_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(mdev->mbox_base))
                return PTR_ERR(mdev->mbox_base);