From: Andre Przywara <andre.przywara@arm.com>
To: Samuel Holland <samuel@sholland.org>
Cc: Chen-Yu Tsai <wens@csie.org>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
linux-arm-kernel@lists.infradead.org,
Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>,
linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev
Subject: Re: [PATCH v2 2/2] bus: sunxi-rsb: Support atomic transfers
Date: Mon, 7 Nov 2022 11:30:29 +0000 [thread overview]
Message-ID: <20221107112949.21f52e50@donnerap.cambridge.arm.com> (raw)
In-Reply-To: <20221107052201.65477-3-samuel@sholland.org>
On Sun, 6 Nov 2022 23:22:00 -0600
Samuel Holland <samuel@sholland.org> wrote:
Hi,
> When communicating with a PMIC during system poweroff (pm_power_off()),
> IRQs are disabled and we are in a RCU read-side critical section, so we
> cannot use wait_for_completion_io_timeout(). Instead, poll the status
> register for transfer completion.
>
> Fixes: d787dcdb9c8f ("bus: sunxi-rsb: Add driver for Allwinner Reduced Serial Bus")
> Signed-off-by: Samuel Holland <samuel@sholland.org>
> ---
>
> Changes in v2:
> - Add Fixes tag to patch 2
> - Only check for specific status bits when polling
>
> drivers/bus/sunxi-rsb.c | 27 ++++++++++++++++++++-------
> 1 file changed, 20 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/bus/sunxi-rsb.c b/drivers/bus/sunxi-rsb.c
> index 17343cd75338..012e82f9b7b0 100644
> --- a/drivers/bus/sunxi-rsb.c
> +++ b/drivers/bus/sunxi-rsb.c
> @@ -267,6 +267,9 @@ EXPORT_SYMBOL_GPL(sunxi_rsb_driver_register);
> /* common code that starts a transfer */
> static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
> {
> + u32 int_mask, status;
> + bool timeout;
> +
> if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) {
> dev_dbg(rsb->dev, "RSB transfer still in progress\n");
> return -EBUSY;
> @@ -274,13 +277,23 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
>
> reinit_completion(&rsb->complete);
>
> - writel(RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER,
> + int_mask = RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER;
> + writel(int_mask,
> rsb->regs + RSB_INTE);
> writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB,
> rsb->regs + RSB_CTRL);
>
> - if (!wait_for_completion_io_timeout(&rsb->complete,
> - msecs_to_jiffies(100))) {
> + if (irqs_disabled()) {
> + timeout = readl_poll_timeout_atomic(rsb->regs + RSB_INTS,
> + status, (status & int_mask),
> + 10, 100000);
So if I understand correctly, this mimics the operation of
sunxi_rsb_irq(), just replacing rsb->status with status.
But wouldn't that also mean that we need to clear the interrupt bits in
INTS, since we are about to handle them below?
It probably doesn't matter in practise, since we call this during power
down only, but looks like more robust to do, from a driver's perspective.
Cheers,
Andre
> + } else {
> + timeout = !wait_for_completion_io_timeout(&rsb->complete,
> + msecs_to_jiffies(100));
> + status = rsb->status;
> + }
> +
> + if (timeout) {
> dev_dbg(rsb->dev, "RSB timeout\n");
>
> /* abort the transfer */
> @@ -292,18 +305,18 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
> return -ETIMEDOUT;
> }
>
> - if (rsb->status & RSB_INTS_LOAD_BSY) {
> + if (status & RSB_INTS_LOAD_BSY) {
> dev_dbg(rsb->dev, "RSB busy\n");
> return -EBUSY;
> }
>
> - if (rsb->status & RSB_INTS_TRANS_ERR) {
> - if (rsb->status & RSB_INTS_TRANS_ERR_ACK) {
> + if (status & RSB_INTS_TRANS_ERR) {
> + if (status & RSB_INTS_TRANS_ERR_ACK) {
> dev_dbg(rsb->dev, "RSB slave nack\n");
> return -EINVAL;
> }
>
> - if (rsb->status & RSB_INTS_TRANS_ERR_DATA) {
> + if (status & RSB_INTS_TRANS_ERR_DATA) {
> dev_dbg(rsb->dev, "RSB transfer data error\n");
> return -EIO;
> }
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-11-07 11:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-07 5:21 [PATCH v2 0/2] bus: sunxi-rsb: Fix poweroff issues Samuel Holland
2022-11-07 5:21 ` [PATCH v2 1/2] bus: sunxi-rsb: Remove shutdown callback Samuel Holland
2022-11-07 5:22 ` [PATCH v2 2/2] bus: sunxi-rsb: Support atomic transfers Samuel Holland
2022-11-07 11:30 ` Andre Przywara [this message]
2022-11-07 18:05 ` Jernej Škrabec
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=20221107112949.21f52e50@donnerap.cambridge.arm.com \
--to=andre.przywara@arm.com \
--cc=ivo.g.dimitrov.75@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@csie.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox