mirror of
https://github.com/torvalds/linux.git
synced 2025-11-30 23:16:01 +07:00
mailbox: omap-mailbox: Check for pending msgs only when mbox is exclusive
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: a49f991e74 ("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>
This commit is contained in:
committed by
Jassi Brar
parent
ac3fd01e4c
commit
060e4e835f
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user