From: Rosen Penev <rosenp@gmail.com>
To: linux-sunxi@lists.linux.dev
Cc: Jassi Brar <jassisinghbrar@gmail.com>,
Chen-Yu Tsai <wens@kernel.org>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
Samuel Holland <samuel@sholland.org>,
linux-kernel@vger.kernel.org (open list:MAILBOX API),
linux-arm-kernel@lists.infradead.org (moderated
list:ARM/Allwinner sunXi SoC support)
Subject: [PATCHv2] mailbox: sun6i: modernize probe and convert to fully managed
Date: Fri, 14 Aug 2026 13:55:53 -0700 [thread overview]
Message-ID: <20260814205553.39894-1-rosenp@gmail.com> (raw)
Replace irq_of_parse_and_map() with platform_get_irq() and move both
IRQ and MMIO resource acquisition to the top of probe, before any
allocations, for early error exit.
Switch from devm_clk_get() + clk_prepare_enable() to
devm_clk_get_enabled(), which combines both operations and registers
devres callbacks for automatic disable/unprepare on unbind. This
eliminates the manual err_disable_unprepare error path and the
remove callback entirely.
Use devm_mbox_controller_register() for devres-managed controller
registration, and drop the remove callback and platform_set_drvdata()
which are no longer needed.
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
v2: fix compilation
drivers/mailbox/sun6i-msgbox.c | 62 ++++++++++------------------------
1 file changed, 18 insertions(+), 44 deletions(-)
diff --git a/drivers/mailbox/sun6i-msgbox.c b/drivers/mailbox/sun6i-msgbox.c
index 6ba6920f4645..3b838f6c837a 100644
--- a/drivers/mailbox/sun6i-msgbox.c
+++ b/drivers/mailbox/sun6i-msgbox.c
@@ -198,7 +198,17 @@ static int sun6i_msgbox_probe(struct platform_device *pdev)
struct mbox_chan *chans;
struct reset_control *reset;
struct sun6i_msgbox *mbox;
+ void __iomem *regs;
int i, ret;
+ int irq;
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0)
+ return irq;
+
+ regs = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(regs))
+ return PTR_ERR(regs);
mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL);
if (!mbox)
@@ -211,24 +221,18 @@ static int sun6i_msgbox_probe(struct platform_device *pdev)
for (i = 0; i < NUM_CHANS; ++i)
chans[i].con_priv = mbox;
- mbox->clk = devm_clk_get(dev, NULL);
+ mbox->clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(mbox->clk)) {
ret = PTR_ERR(mbox->clk);
dev_err(dev, "Failed to get clock: %d\n", ret);
return ret;
}
- ret = clk_prepare_enable(mbox->clk);
- if (ret) {
- dev_err(dev, "Failed to enable clock: %d\n", ret);
- return ret;
- }
-
reset = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(reset)) {
ret = PTR_ERR(reset);
dev_err(dev, "Failed to get reset control: %d\n", ret);
- goto err_disable_unprepare;
+ return ret;
}
/*
@@ -242,25 +246,17 @@ static int sun6i_msgbox_probe(struct platform_device *pdev)
ret = reset_control_deassert(reset);
if (ret) {
dev_err(dev, "Failed to deassert reset: %d\n", ret);
- goto err_disable_unprepare;
+ return ret;
}
- mbox->regs = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(mbox->regs)) {
- ret = PTR_ERR(mbox->regs);
- dev_err(dev, "Failed to map MMIO resource: %d\n", ret);
- goto err_disable_unprepare;
- }
+ mbox->regs = regs;
/* Disable all IRQs for this end of the msgbox. */
writel(0, mbox->regs + LOCAL_IRQ_EN_REG);
- ret = devm_request_irq(dev, irq_of_parse_and_map(dev->of_node, 0),
- sun6i_msgbox_irq, 0, dev_name(dev), mbox);
- if (ret) {
- dev_err(dev, "Failed to register IRQ handler: %d\n", ret);
- goto err_disable_unprepare;
- }
+ ret = devm_request_irq(dev, irq, sun6i_msgbox_irq, 0, dev_name(dev), mbox);
+ if (ret)
+ return ret;
mbox->controller.dev = dev;
mbox->controller.ops = &sun6i_msgbox_chan_ops;
@@ -271,29 +267,8 @@ static int sun6i_msgbox_probe(struct platform_device *pdev)
mbox->controller.txpoll_period = 5;
spin_lock_init(&mbox->lock);
- platform_set_drvdata(pdev, mbox);
-
- ret = mbox_controller_register(&mbox->controller);
- if (ret) {
- dev_err(dev, "Failed to register controller: %d\n", ret);
- goto err_disable_unprepare;
- }
-
- return 0;
-
-err_disable_unprepare:
- clk_disable_unprepare(mbox->clk);
-
- return ret;
-}
-
-static void sun6i_msgbox_remove(struct platform_device *pdev)
-{
- struct sun6i_msgbox *mbox = platform_get_drvdata(pdev);
- mbox_controller_unregister(&mbox->controller);
- /* See the comment in sun6i_msgbox_probe about the reset line. */
- clk_disable_unprepare(mbox->clk);
+ return devm_mbox_controller_register(dev, &mbox->controller);
}
static const struct of_device_id sun6i_msgbox_of_match[] = {
@@ -308,7 +283,6 @@ static struct platform_driver sun6i_msgbox_driver = {
.of_match_table = sun6i_msgbox_of_match,
},
.probe = sun6i_msgbox_probe,
- .remove = sun6i_msgbox_remove,
};
module_platform_driver(sun6i_msgbox_driver);
--
2.55.0
next reply other threads:[~2026-08-14 20:55 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 20:55 Rosen Penev [this message]
2026-08-14 21:05 ` [PATCHv2] mailbox: sun6i: modernize probe and convert to fully managed sashiko-bot
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=20260814205553.39894-1-rosenp@gmail.com \
--to=rosenp@gmail.com \
--cc=jassisinghbrar@gmail.com \
--cc=jernej.skrabec@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sunxi@lists.linux.dev \
--cc=samuel@sholland.org \
--cc=wens@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.