linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed
@ 2016-08-30 19:11 Shardar Shariff Md
  2016-08-30 19:11 ` [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing Shardar Shariff Md
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Shardar Shariff Md @ 2016-08-30 19:11 UTC (permalink / raw)
  To: smohammed, wsa, swarren, thierry.reding, gnurou, linux-i2c,
	linux-tegra, linux-kernel, jonathanh

After CONFIG_LOAD register is programmed instead of explicitly waiting
for timeout, use readl_poll_timeout() to check for register value to get
updated or wait till timeout.

Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>
---
Changes in v4:
- Split timeout calculation to separate patch

Changes in v5:
- Move disabling of clock to separate patch

Changes in v8:
- 1st change of [PATCH v7] series is merged, v8 is rebased on top of
  merged change, here patch series is changed accordingly.
- Updated the commit message as per review to properly reflect change.
- calculate the register offset seperately to make code more readable.

Changes in v9:
- Use readl_poll_timeout() instead of readx_poll_timeout()

Changes in V10:
- Rebase on top of [PATCH V2 0/9] Some Tegra I2C Updates
---
---
 drivers/i2c/busses/i2c-tegra.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index d86a993..5eb37ab 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -30,6 +30,7 @@
 #include <linux/reset.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pm_runtime.h>
+#include <linux/iopoll.h>
 
 #include <asm/unaligned.h>
 
@@ -112,6 +113,8 @@
 #define I2C_CLKEN_OVERRIDE			0x090
 #define I2C_MST_CORE_CLKEN_OVR			BIT(0)
 
+#define I2C_CONFIG_LOAD_TIMEOUT			1000000
+
 /*
  * msg_end_type: The bus control which need to be send at end of transfer.
  * @MSG_END_STOP: Send stop pulse at end of transfer.
@@ -448,7 +451,6 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
 	u32 val;
 	int err;
 	u32 clk_divisor;
-	unsigned long timeout = jiffies + HZ;
 
 	err = pm_runtime_get_sync(i2c_dev->dev);
 	if (err < 0) {
@@ -497,15 +499,19 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
 		i2c_writel(i2c_dev, I2C_MST_CORE_CLKEN_OVR, I2C_CLKEN_OVERRIDE);
 
 	if (i2c_dev->hw->has_config_load_reg) {
+		unsigned long reg_offset;
+		void __iomem *addr;
+		u32 val;
+
+		reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_CONFIG_LOAD);
+		addr = i2c_dev->base + reg_offset;
 		i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, I2C_CONFIG_LOAD);
-		while (i2c_readl(i2c_dev, I2C_CONFIG_LOAD) != 0) {
-			if (time_after(jiffies, timeout)) {
-				dev_warn(i2c_dev->dev,
-					"timeout waiting for config load\n");
-				err = -ETIMEDOUT;
-				goto err;
-			}
-			msleep(1);
+		err = readl_poll_timeout(addr, val, val == 0, 1000,
+					 I2C_CONFIG_LOAD_TIMEOUT);
+		if (err) {
+			dev_warn(i2c_dev->dev,
+				 "timeout waiting for config load\n");
+			goto err;
 		}
 	}
 
-- 
1.8.1.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing
  2016-08-30 19:11 [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Shardar Shariff Md
@ 2016-08-30 19:11 ` Shardar Shariff Md
  2016-08-30 20:30   ` Wolfram Sang
  2016-08-30 19:11 ` [PATCH v10 3/4] i2c: tegra: use atomic poll function during configuration Shardar Shariff Md
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Shardar Shariff Md @ 2016-08-30 19:11 UTC (permalink / raw)
  To: smohammed, wsa, swarren, thierry.reding, gnurou, linux-i2c,
	linux-tegra, linux-kernel, jonathanh

Define separate function for configuration load register handling
to make it use by different functions later.

Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>

---
Changes in v2:
- Remove unnecessary paranthesis and align to 80 characters per line

Changes in v3:
- Add separate function for config load handling

Changes in v4:
- Move timeout calculation to separate patch

Changes in v9:
- Rebase with the changes to earlier patch1

Changes in v10:
- Rebase on top of [PATCH V2 0/9] Some Tegra I2C Updates
---
---
 drivers/i2c/busses/i2c-tegra.c | 42 ++++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 5eb37ab..5e94056 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -446,6 +446,29 @@ static int tegra_i2c_runtime_suspend(struct device *dev)
 	return pinctrl_pm_select_idle_state(i2c_dev->dev);
 }
 
+static int tegra_i2c_wait_for_config_load(struct tegra_i2c_dev *i2c_dev)
+{
+	unsigned long reg_offset;
+	void __iomem *addr;
+	u32 val;
+	int err;
+
+	if (i2c_dev->hw->has_config_load_reg) {
+		reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_CONFIG_LOAD);
+		addr = i2c_dev->base + reg_offset;
+		i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, I2C_CONFIG_LOAD);
+		err = readl_poll_timeout(addr, val, val == 0, 1000,
+					 I2C_CONFIG_LOAD_TIMEOUT);
+		if (err) {
+			dev_warn(i2c_dev->dev,
+				 "timeout waiting for config load\n");
+			return err;
+		}
+	}
+
+	return 0;
+}
+
 static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
 {
 	u32 val;
@@ -498,22 +521,9 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
 	if (i2c_dev->is_multimaster_mode && i2c_dev->hw->has_slcg_override_reg)
 		i2c_writel(i2c_dev, I2C_MST_CORE_CLKEN_OVR, I2C_CLKEN_OVERRIDE);
 
-	if (i2c_dev->hw->has_config_load_reg) {
-		unsigned long reg_offset;
-		void __iomem *addr;
-		u32 val;
-
-		reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_CONFIG_LOAD);
-		addr = i2c_dev->base + reg_offset;
-		i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, I2C_CONFIG_LOAD);
-		err = readl_poll_timeout(addr, val, val == 0, 1000,
-					 I2C_CONFIG_LOAD_TIMEOUT);
-		if (err) {
-			dev_warn(i2c_dev->dev,
-				 "timeout waiting for config load\n");
-			goto err;
-		}
-	}
+	err = tegra_i2c_wait_for_config_load(i2c_dev);
+	if (err)
+		goto err;
 
 	if (i2c_dev->irq_disabled) {
 		i2c_dev->irq_disabled = 0;
-- 
1.8.1.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v10 3/4] i2c: tegra: use atomic poll function during configuration
  2016-08-30 19:11 [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Shardar Shariff Md
  2016-08-30 19:11 ` [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing Shardar Shariff Md
@ 2016-08-30 19:11 ` Shardar Shariff Md
  2016-08-30 20:30   ` Wolfram Sang
  2016-08-30 19:11 ` [PATCH v10 4/4] i2c: tegra: proper handling of error cases Shardar Shariff Md
  2016-08-30 20:32 ` [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Wolfram Sang
  3 siblings, 1 reply; 7+ messages in thread
From: Shardar Shariff Md @ 2016-08-30 19:11 UTC (permalink / raw)
  To: smohammed, wsa, swarren, thierry.reding, gnurou, linux-i2c,
	linux-tegra, linux-kernel, jonathanh

Use readl_poll_timeout_atomic() function as *wait_for_config_load()
function can be called from atomic context.

Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>

---
Changes in v10:
- Rebase on top of [PATCH V2 0/9] Some Tegra I2C Updates
---
---
 drivers/i2c/busses/i2c-tegra.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 5e94056..840a9d3 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -457,8 +457,13 @@ static int tegra_i2c_wait_for_config_load(struct tegra_i2c_dev *i2c_dev)
 		reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_CONFIG_LOAD);
 		addr = i2c_dev->base + reg_offset;
 		i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, I2C_CONFIG_LOAD);
-		err = readl_poll_timeout(addr, val, val == 0, 1000,
-					 I2C_CONFIG_LOAD_TIMEOUT);
+		if (in_atomic() || irqs_disabled())
+			err = readl_poll_timeout_atomic(addr, val, val == 0,
+					1000, I2C_CONFIG_LOAD_TIMEOUT);
+		else
+			err = readl_poll_timeout(addr, val, val == 0,
+					1000, I2C_CONFIG_LOAD_TIMEOUT);
+
 		if (err) {
 			dev_warn(i2c_dev->dev,
 				 "timeout waiting for config load\n");
-- 
1.8.1.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v10 4/4] i2c: tegra: proper handling of error cases
  2016-08-30 19:11 [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Shardar Shariff Md
  2016-08-30 19:11 ` [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing Shardar Shariff Md
  2016-08-30 19:11 ` [PATCH v10 3/4] i2c: tegra: use atomic poll function during configuration Shardar Shariff Md
@ 2016-08-30 19:11 ` Shardar Shariff Md
  2016-08-30 20:32 ` [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Wolfram Sang
  3 siblings, 0 replies; 7+ messages in thread
From: Shardar Shariff Md @ 2016-08-30 19:11 UTC (permalink / raw)
  To: smohammed, wsa, swarren, thierry.reding, gnurou, linux-i2c,
	linux-tegra, linux-kernel, jonathanh

To summarize the issue observed in error cases:

SW Flow: For i2c message transfer, packet header and data payload is
posted and then required error/packet completion interrupts are enabled
later.

HW flow: HW process the packet just after packet header is posted, if
ARB lost/NACK error occurs (SW will not handle immediately when error
happens as error interrupts are not enabled at this point). HW assumes
error is acknowledged and clears current data in FIFO, But SW here posts
the remaining data payload which still stays in FIFO as stale data
(data without packet header).

Now once the interrupts are enabled, SW handles ARB lost/NACK error by
clearing the ARB lost/NACK interrupt. Now HW assumes that SW attended
the error and will parse/process stale data (data without packet header)
present in FIFO which causes invalid NACK errors.

Fix: Enable the error interrupts before posting the packet into FIFO
which make sure HW to not clear the fifo. Also disable the packet mode
before acknowledging errors (ARB lost/NACK error) to not process any
stale data. As error interrupts are enabled before posting the packet
header use spinlock to avoid preempting.

Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>

---
Changes in v2:
- Align the commit message to 72 characters per line.
- Removing unnecessary paranthesis.
- Handle error in isr

Changes in v3:
- Printing error if tegra_i2c_disable_packet_mode() fails
  is already present and handling error is not taken cared
  in ISR which was done in v2 but keeping return error in
  *wait_for_config_load() as its used in tegra_i2c_init()

Changes in V10:
- Rebase on top of [PATCH V2 0/9] Some Tegra I2C Updates
---
---
 drivers/i2c/busses/i2c-tegra.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 840a9d3..10f8fb8 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -196,6 +196,7 @@ struct tegra_i2c_dev {
 	u16 clk_divisor_non_hs_mode;
 	bool is_suspended;
 	bool is_multimaster_mode;
+	spinlock_t xfer_lock;
 };
 
 static void dvc_writel(struct tegra_i2c_dev *i2c_dev, u32 val,
@@ -540,14 +541,27 @@ err:
 	return err;
 }
 
+static int tegra_i2c_disable_packet_mode(struct tegra_i2c_dev *i2c_dev)
+{
+	u32 cnfg;
+
+	cnfg = i2c_readl(i2c_dev, I2C_CNFG);
+	if (cnfg & I2C_CNFG_PACKET_MODE_EN)
+		i2c_writel(i2c_dev, cnfg & ~I2C_CNFG_PACKET_MODE_EN, I2C_CNFG);
+
+	return tegra_i2c_wait_for_config_load(i2c_dev);
+}
+
 static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
 {
 	u32 status;
 	const u32 status_err = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
 	struct tegra_i2c_dev *i2c_dev = dev_id;
+	unsigned long flags;
 
 	status = i2c_readl(i2c_dev, I2C_INT_STATUS);
 
+	spin_lock_irqsave(&i2c_dev->xfer_lock, flags);
 	if (status == 0) {
 		dev_warn(i2c_dev->dev, "irq status 0 %08x %08x %08x\n",
 			 i2c_readl(i2c_dev, I2C_PACKET_TRANSFER_STATUS),
@@ -563,6 +577,7 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
 	}
 
 	if (unlikely(status & status_err)) {
+		tegra_i2c_disable_packet_mode(i2c_dev);
 		if (status & I2C_INT_NO_ACK)
 			i2c_dev->msg_err |= I2C_ERR_NO_ACK;
 		if (status & I2C_INT_ARBITRATION_LOST)
@@ -592,7 +607,7 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
 		BUG_ON(i2c_dev->msg_buf_remaining);
 		complete(&i2c_dev->msg_complete);
 	}
-	return IRQ_HANDLED;
+	goto done;
 err:
 	/* An error occurred, mask all interrupts */
 	tegra_i2c_mask_irq(i2c_dev, I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST |
@@ -603,6 +618,8 @@ err:
 		dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
 
 	complete(&i2c_dev->msg_complete);
+done:
+	spin_unlock_irqrestore(&i2c_dev->xfer_lock, flags);
 	return IRQ_HANDLED;
 }
 
@@ -612,6 +629,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	u32 packet_header;
 	u32 int_mask;
 	unsigned long time_left;
+	unsigned long flags;
 
 	tegra_i2c_flush_fifos(i2c_dev);
 
@@ -624,6 +642,11 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	i2c_dev->msg_read = (msg->flags & I2C_M_RD);
 	reinit_completion(&i2c_dev->msg_complete);
 
+	spin_lock_irqsave(&i2c_dev->xfer_lock, flags);
+
+	int_mask = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
+	tegra_i2c_unmask_irq(i2c_dev, int_mask);
+
 	packet_header = (0 << PACKET_HEADER0_HEADER_SIZE_SHIFT) |
 			PACKET_HEADER0_PROTOCOL_I2C |
 			(i2c_dev->cont_id << PACKET_HEADER0_CONT_ID_SHIFT) |
@@ -653,14 +676,15 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	if (!(msg->flags & I2C_M_RD))
 		tegra_i2c_fill_tx_fifo(i2c_dev);
 
-	int_mask = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
 	if (i2c_dev->hw->has_per_pkt_xfer_complete_irq)
 		int_mask |= I2C_INT_PACKET_XFER_COMPLETE;
 	if (msg->flags & I2C_M_RD)
 		int_mask |= I2C_INT_RX_FIFO_DATA_REQ;
 	else if (i2c_dev->msg_buf_remaining)
 		int_mask |= I2C_INT_TX_FIFO_DATA_REQ;
+
 	tegra_i2c_unmask_irq(i2c_dev, int_mask);
+	spin_unlock_irqrestore(&i2c_dev->xfer_lock, flags);
 	dev_dbg(i2c_dev->dev, "unmasked irq: %02x\n",
 		i2c_readl(i2c_dev, I2C_INT_MASK));
 
@@ -897,6 +921,7 @@ static int tegra_i2c_probe(struct platform_device *pdev)
 	i2c_dev->is_dvc = of_device_is_compatible(pdev->dev.of_node,
 						  "nvidia,tegra20-i2c-dvc");
 	init_completion(&i2c_dev->msg_complete);
+	spin_lock_init(&i2c_dev->xfer_lock);
 
 	if (!i2c_dev->hw->has_single_clk_source) {
 		fast_clk = devm_clk_get(&pdev->dev, "fast-clk");
-- 
1.8.1.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing
  2016-08-30 19:11 ` [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing Shardar Shariff Md
@ 2016-08-30 20:30   ` Wolfram Sang
  0 siblings, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2016-08-30 20:30 UTC (permalink / raw)
  To: Shardar Shariff Md
  Cc: swarren, thierry.reding, gnurou, linux-i2c, linux-tegra,
	linux-kernel, jonathanh

[-- Attachment #1: Type: text/plain, Size: 368 bytes --]

On Wed, Aug 31, 2016 at 12:41:17AM +0530, Shardar Shariff Md wrote:
> Define separate function for configuration load register handling
> to make it use by different functions later.
> 
> Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>

    SMATCH
drivers/i2c/busses/i2c-tegra.c:519 tegra_i2c_init warn: unused return: err = tegra_i2c_flush_fifos()


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v10 3/4] i2c: tegra: use atomic poll function during configuration
  2016-08-30 19:11 ` [PATCH v10 3/4] i2c: tegra: use atomic poll function during configuration Shardar Shariff Md
@ 2016-08-30 20:30   ` Wolfram Sang
  0 siblings, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2016-08-30 20:30 UTC (permalink / raw)
  To: Shardar Shariff Md
  Cc: swarren, thierry.reding, gnurou, linux-i2c, linux-tegra,
	linux-kernel, jonathanh

[-- Attachment #1: Type: text/plain, Size: 399 bytes --]

On Wed, Aug 31, 2016 at 12:41:18AM +0530, Shardar Shariff Md wrote:
> Use readl_poll_timeout_atomic() function as *wait_for_config_load()
> function can be called from atomic context.
> 
> Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>

    CHECKPATCH
ERROR: do not use in_atomic in drivers
#23: FILE: drivers/i2c/busses/i2c-tegra.c:460:
+		if (in_atomic() || irqs_disabled())


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed
  2016-08-30 19:11 [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Shardar Shariff Md
                   ` (2 preceding siblings ...)
  2016-08-30 19:11 ` [PATCH v10 4/4] i2c: tegra: proper handling of error cases Shardar Shariff Md
@ 2016-08-30 20:32 ` Wolfram Sang
  3 siblings, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2016-08-30 20:32 UTC (permalink / raw)
  To: Shardar Shariff Md
  Cc: swarren, thierry.reding, gnurou, linux-i2c, linux-tegra,
	linux-kernel, jonathanh

[-- Attachment #1: Type: text/plain, Size: 1171 bytes --]

On Wed, Aug 31, 2016 at 12:41:16AM +0530, Shardar Shariff Md wrote:
> After CONFIG_LOAD register is programmed instead of explicitly waiting
> for timeout, use readl_poll_timeout() to check for register value to get
> updated or wait till timeout.
> 
> Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>
> ---
> Changes in v4:
> - Split timeout calculation to separate patch
> 
> Changes in v5:
> - Move disabling of clock to separate patch
> 
> Changes in v8:
> - 1st change of [PATCH v7] series is merged, v8 is rebased on top of
>   merged change, here patch series is changed accordingly.
> - Updated the commit message as per review to properly reflect change.
> - calculate the register offset seperately to make code more readable.
> 
> Changes in v9:
> - Use readl_poll_timeout() instead of readx_poll_timeout()
> 
> Changes in V10:
> - Rebase on top of [PATCH V2 0/9] Some Tegra I2C Updates

Thanks for the rebase! However, my code checkers showed a few warnings:

    SPARSE
drivers/i2c/busses/i2c-tegra.c:504:21: warning: symbol 'val' shadows an earlier one
drivers/i2c/busses/i2c-tegra.c:451:13: originally declared here


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-08-30 20:33 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-30 19:11 [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Shardar Shariff Md
2016-08-30 19:11 ` [PATCH v10 2/4] i2c: tegra: add separate function for config_load programing Shardar Shariff Md
2016-08-30 20:30   ` Wolfram Sang
2016-08-30 19:11 ` [PATCH v10 3/4] i2c: tegra: use atomic poll function during configuration Shardar Shariff Md
2016-08-30 20:30   ` Wolfram Sang
2016-08-30 19:11 ` [PATCH v10 4/4] i2c: tegra: proper handling of error cases Shardar Shariff Md
2016-08-30 20:32 ` [PATCH v10 1/4] i2c: tegra: use readl_poll_timeout after config_load reg programmed Wolfram Sang

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).