From: Jason-JH.Lin <jason-jh.lin@mediatek.com>
To: Jassi Brar <jassisinghbrar@gmail.com>,
Chun-Kuang Hu <chunkuang.hu@kernel.org>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>,
"Jason-JH . Lin" <jason-jh.lin@mediatek.com>,
Singo Chang <singo.chang@mediatek.com>,
"Nancy Lin" <nancy.lin@mediatek.com>,
<linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-mediatek@lists.infradead.org>,
<Project_Global_Chrome_Upstream_Group@mediatek.com>
Subject: [PATCH 1/2] mailbox: Add power_get/power_put API to mbox_chan_ops
Date: Fri, 14 Jun 2024 12:01:32 +0800 [thread overview]
Message-ID: <20240614040133.24967-2-jason-jh.lin@mediatek.com> (raw)
In-Reply-To: <20240614040133.24967-1-jason-jh.lin@mediatek.com>
To avoid pm_runtime APIs calling sleep in all the atomic context APIs
in mbox_chan_ops, we add power_get/power_put API to let the controllers
implement them with pm_runtime APIs outside the other atomic context APIs
in mbox_chan_ops.
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
---
drivers/mailbox/mailbox.c | 55 ++++++++++++++++++++++++++++++
include/linux/mailbox_controller.h | 11 ++++++
2 files changed, 66 insertions(+)
diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index ebff3baf3045..bafcc7b0c0b8 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -58,6 +58,12 @@ static void msg_submit(struct mbox_chan *chan)
void *data;
int err = -EBUSY;
+ if (chan->mbox->ops->power_get) {
+ err = chan->mbox->ops->power_get(chan);
+ if (err < 0)
+ return;
+ }
+
spin_lock_irqsave(&chan->lock, flags);
if (!chan->msg_count || chan->active_req)
@@ -89,12 +95,16 @@ static void msg_submit(struct mbox_chan *chan)
hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL);
spin_unlock_irqrestore(&chan->mbox->poll_hrt_lock, flags);
}
+
+ if (chan->mbox->ops->power_put)
+ chan->mbox->ops->power_put(chan);
}
static void tx_tick(struct mbox_chan *chan, int r)
{
unsigned long flags;
void *mssg;
+ int ret;
spin_lock_irqsave(&chan->lock, flags);
mssg = chan->active_req;
@@ -107,10 +117,19 @@ static void tx_tick(struct mbox_chan *chan, int r)
if (!mssg)
return;
+ if (chan->mbox->ops->power_get) {
+ ret = chan->mbox->ops->power_get(chan);
+ if (ret < 0)
+ return;
+ }
+
/* Notify the client */
if (chan->cl->tx_done)
chan->cl->tx_done(chan->cl, mssg, r);
+ if (chan->mbox->ops->power_put)
+ chan->mbox->ops->power_put(chan);
+
if (r != -ETIME && chan->cl->tx_block)
complete(&chan->tx_complete);
}
@@ -223,9 +242,16 @@ EXPORT_SYMBOL_GPL(mbox_client_txdone);
*/
bool mbox_client_peek_data(struct mbox_chan *chan)
{
+ if (chan->mbox->ops->power_get)
+ if (chan->mbox->ops->power_get(chan) < 0)
+ return false;
+
if (chan->mbox->ops->peek_data)
return chan->mbox->ops->peek_data(chan);
+ if (chan->mbox->ops->power_put)
+ chan->mbox->ops->power_put(chan);
+
return false;
}
EXPORT_SYMBOL_GPL(mbox_client_peek_data);
@@ -310,10 +336,19 @@ int mbox_flush(struct mbox_chan *chan, unsigned long timeout)
if (!chan->mbox->ops->flush)
return -ENOTSUPP;
+ if (chan->mbox->ops->power_get) {
+ ret = chan->mbox->ops->power_get(chan);
+ if (ret < 0)
+ return ret;
+ }
+
ret = chan->mbox->ops->flush(chan, timeout);
if (ret < 0)
tx_tick(chan, ret);
+ if (chan->mbox->ops->power_put)
+ chan->mbox->ops->power_put(chan);
+
return ret;
}
EXPORT_SYMBOL_GPL(mbox_flush);
@@ -341,6 +376,12 @@ static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl)
spin_unlock_irqrestore(&chan->lock, flags);
+ if (chan->mbox->ops->power_get) {
+ ret = chan->mbox->ops->power_get(chan);
+ if (ret < 0)
+ return ERR_PTR(ret);
+ }
+
if (chan->mbox->ops->startup) {
ret = chan->mbox->ops->startup(chan);
@@ -441,7 +482,11 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
if (ret)
chan = ERR_PTR(ret);
+ if (chan->mbox->ops->power_put)
+ chan->mbox->ops->power_put(chan);
+
mutex_unlock(&con_mutex);
+
return chan;
}
EXPORT_SYMBOL_GPL(mbox_request_channel);
@@ -485,13 +530,23 @@ EXPORT_SYMBOL_GPL(mbox_request_channel_byname);
void mbox_free_channel(struct mbox_chan *chan)
{
unsigned long flags;
+ int ret;
if (!chan || !chan->cl)
return;
+ if (chan->mbox->ops->power_get) {
+ ret = chan->mbox->ops->power_get(chan);
+ if (ret < 0)
+ return;
+ }
+
if (chan->mbox->ops->shutdown)
chan->mbox->ops->shutdown(chan);
+ if (chan->mbox->ops->power_put)
+ chan->mbox->ops->power_put(chan);
+
/* The queued TX requests are simply aborted, no callbacks are made */
spin_lock_irqsave(&chan->lock, flags);
chan->cl = NULL;
diff --git a/include/linux/mailbox_controller.h b/include/linux/mailbox_controller.h
index 6fee33cb52f5..e8f26e7dabfd 100644
--- a/include/linux/mailbox_controller.h
+++ b/include/linux/mailbox_controller.h
@@ -42,6 +42,15 @@ struct mbox_chan;
* Used only if txdone_poll:=true && txdone_irq:=false
* @peek_data: Atomic check for any received data. Return true if controller
* has some data to push to the client. False otherwise.
+ * @power_get: Called when the controller need to get the reference to keep
+ * the power on for the device of mailbox controller. It is
+ * optional to implement this function with pm_runtime APIs or
+ * more complicated operation.
+ * Return 0 is success, otherwise are fail.
+ * @power_put: Called when the controller need to put the reference to release
+ * the power for the device of mailbox controller. It is optional
+ * to implement this function with pm_runtime APIs or more
+ * complicated operation.
*/
struct mbox_chan_ops {
int (*send_data)(struct mbox_chan *chan, void *data);
@@ -50,6 +59,8 @@ struct mbox_chan_ops {
void (*shutdown)(struct mbox_chan *chan);
bool (*last_tx_done)(struct mbox_chan *chan);
bool (*peek_data)(struct mbox_chan *chan);
+ int (*power_get)(struct mbox_chan *chan);
+ void (*power_put)(struct mbox_chan *chan);
};
/**
--
2.18.0
next prev parent reply other threads:[~2024-06-14 4:02 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-14 4:01 [PATCH 0/2] Fix sleeping function called from invalid context Jason-JH.Lin
2024-06-14 4:01 ` Jason-JH.Lin [this message]
2024-06-14 11:35 ` [PATCH 1/2] mailbox: Add power_get/power_put API to mbox_chan_ops Markus Elfring
2024-06-18 6:26 ` Jason-JH Lin (林睿祥)
2024-06-14 16:23 ` kernel test robot
2024-06-14 16:55 ` kernel test robot
2024-06-14 18:51 ` kernel test robot
2024-06-17 12:39 ` Dan Carpenter
2024-06-14 4:01 ` [PATCH 2/2] mailbox: mtk-cmdq: Move pm_runimte_get and put to mbox_chan_ops API Jason-JH.Lin
2024-06-17 18:18 ` Jassi Brar
2024-06-18 8:42 ` Jason-JH Lin (林睿祥)
2024-06-18 15:59 ` Jassi Brar
2024-06-19 8:18 ` AngeloGioacchino Del Regno
2024-06-19 15:38 ` Jassi Brar
2024-06-20 6:32 ` Jason-JH Lin (林睿祥)
2024-06-20 14:39 ` Jassi Brar
2024-06-24 11:29 ` AngeloGioacchino Del Regno
2024-06-24 17:45 ` Jassi Brar
2024-06-25 3:40 ` Jason-JH Lin (林睿祥)
2024-06-25 4:21 ` Jassi Brar
2024-06-26 9:32 ` Jason-JH Lin (林睿祥)
2024-06-28 3:40 ` Jassi Brar
2024-07-03 16:41 ` Jason-JH Lin (林睿祥)
2024-07-03 19:06 ` Jassi Brar
2024-07-05 6:11 ` Jason-JH Lin (林睿祥)
2024-07-05 16:43 ` Jassi Brar
2024-07-11 2:00 ` Jason-JH Lin (林睿祥)
2024-07-11 3:47 ` Jassi Brar
2024-07-12 7:23 ` Jason-JH Lin (林睿祥)
2024-07-15 9:45 ` Jason-JH Lin (林睿祥)
2024-07-17 16:17 ` Jassi Brar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240614040133.24967-2-jason-jh.lin@mediatek.com \
--to=jason-jh.lin@mediatek.com \
--cc=Project_Global_Chrome_Upstream_Group@mediatek.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=chunkuang.hu@kernel.org \
--cc=jassisinghbrar@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=nancy.lin@mediatek.com \
--cc=singo.chang@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox