linux-tegra.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dmitry Osipenko <digetx@gmail.com>
To: Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	Laxman Dewangan <ldewangan@nvidia.com>,
	Wolfram Sang <wsa@the-dreams.de>
Cc: linux-i2c@vger.kernel.org, linux-tegra@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v2 01/17] i2c: tegra: Make tegra_i2c_flush_fifos() usable in atomic transfer
Date: Wed,  2 Sep 2020 00:10:46 +0300	[thread overview]
Message-ID: <20200901211102.11072-2-digetx@gmail.com> (raw)
In-Reply-To: <20200901211102.11072-1-digetx@gmail.com>

The tegra_i2c_flush_fifos() shouldn't sleep in atomic transfer and jiffies
are not updating if interrupts are disabled. Hence let's use proper delay
functions and use ktime API in order not to hang atomic transfer. Note
that this patch doesn't fix any known problem because normally FIFO is
flushed at the time of starting a new transfer.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/i2c/busses/i2c-tegra.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 00d3e4d7a01e..aab58395fb71 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -470,7 +470,8 @@ static int tegra_i2c_init_dma(struct tegra_i2c_dev *i2c_dev)
 
 static int tegra_i2c_flush_fifos(struct tegra_i2c_dev *i2c_dev)
 {
-	unsigned long timeout = jiffies + HZ;
+	ktime_t ktime = ktime_get();
+	ktime_t ktimeout = ktime_add_ms(ktime, 1000);
 	unsigned int offset;
 	u32 mask, val;
 
@@ -489,13 +490,22 @@ static int tegra_i2c_flush_fifos(struct tegra_i2c_dev *i2c_dev)
 	i2c_writel(i2c_dev, val, offset);
 
 	while (i2c_readl(i2c_dev, offset) & mask) {
-		if (time_after(jiffies, timeout)) {
-			dev_warn(i2c_dev->dev, "timeout waiting for fifo flush\n");
-			return -ETIMEDOUT;
-		}
-		usleep_range(1000, 2000);
+		if (ktime_after(ktime, ktimeout))
+			goto err_timeout;
+
+		if (i2c_dev->is_curr_atomic_xfer)
+			mdelay(1);
+		else
+			fsleep(1000);
+
+		ktime = ktime_get();
 	}
 	return 0;
+
+err_timeout:
+	dev_err(i2c_dev->dev, "fifo flush timed out\n");
+
+	return -ETIMEDOUT;
 }
 
 static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_dev *i2c_dev)
-- 
2.27.0


  reply	other threads:[~2020-09-01 21:13 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-01 21:10 [PATCH v2 00/17] Improvements for Tegra I2C driver Dmitry Osipenko
2020-09-01 21:10 ` Dmitry Osipenko [this message]
2020-09-01 21:10 ` [PATCH v2 02/17] i2c: tegra: Add missing newline before returns Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 03/17] i2c: tegra: Clean up messages in the code Dmitry Osipenko
     [not found]   ` <CAHp75Vf9ETJMibQGe4Nx7n4703GtgO1XBsE1yGwsk3TaSPTDHw@mail.gmail.com>
2020-09-01 21:37     ` Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 04/17] i2c: tegra: Don't ignore tegra_i2c_flush_fifos() error Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 05/17] i2c: tegra: Use reset_control_reset() Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 06/17] i2c: tegra: Improve formatting of function variables Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 07/17] i2c: tegra: Use dev_err_probe() Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 08/17] i2c: tegra: Runtime PM always available on Tegra Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 09/17] i2c: tegra: Clean up probe function Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 10/17] i2c: tegra: Drop '_timeout' from wait/poll function names Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 11/17] i2c: tegra: Remove likely/unlikely from the code Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 12/17] i2c: tegra: Factor out error recovery from tegra_i2c_xfer_msg() Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 13/17] i2c: tegra: Check errors for both positive and negative values Dmitry Osipenko
2020-09-01 21:10 ` [PATCH v2 14/17] i2c: tegra: Improve coding style of tegra_i2c_wait_for_config_load() Dmitry Osipenko
2020-09-01 21:11 ` [PATCH v2 15/17] i2c: tegra: Remove unnecessary whitespaces and newlines Dmitry Osipenko
2020-09-01 21:11 ` [PATCH v2 16/17] i2c: tegra: Rename variable in tegra_i2c_issue_bus_clear() Dmitry Osipenko
2020-09-01 21:11 ` [PATCH v2 17/17] i2c: tegra: Improve driver module description Dmitry Osipenko

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=20200901211102.11072-2-digetx@gmail.com \
    --to=digetx@gmail.com \
    --cc=jonathanh@nvidia.com \
    --cc=ldewangan@nvidia.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=wsa@the-dreams.de \
    /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;
as well as URLs for NNTP newsgroup(s).