diff mbox series

[PATCHv3] i2c: cadence: Fix the driver in interrupt flurry case

Message ID 1550646789-11100-1-git-send-email-shubhrajyoti.datta@gmail.com
State Changes Requested
Headers show
Series [PATCHv3] i2c: cadence: Fix the driver in interrupt flurry case | expand

Commit Message

Shubhrajyoti Datta Feb. 20, 2019, 7:13 a.m. UTC
From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>

In case there are a lot of interrupts then the hold bit is not
released. Protect the code by making it atomic by disabling interrupts.

Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller"
Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
---
v2: Update the wording
v3: Add fixes tag

 drivers/i2c/busses/i2c-cadence.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Michal Simek Feb. 20, 2019, 7:18 a.m. UTC | #1
On 20. 02. 19 8:13, shubhrajyoti.datta@gmail.com wrote:
> From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
> 
> In case there are a lot of interrupts then the hold bit is not
> released. Protect the code by making it atomic by disabling interrupts.
> 
> Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller"

Nit. Missing ).

Otherwise
Acked-by: Michal Simek <michal.simek@xilinx.com>

Thanks,
Michal
Wolfram Sang Feb. 23, 2019, 9:56 a.m. UTC | #2
On Wed, Feb 20, 2019 at 08:18:17AM +0100, Michal Simek wrote:
> On 20. 02. 19 8:13, shubhrajyoti.datta@gmail.com wrote:
> > From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
> > 
> > In case there are a lot of interrupts then the hold bit is not
> > released. Protect the code by making it atomic by disabling interrupts.
> > 
> > Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller"
> 
> Nit. Missing ).

For, me this is not a nit in this case, so I want this fixed. As I said
before, your patches often feel rushed, and I don't want to be offloaded
with fixing all these nits all the time. So, please spend the few
seconds double checking everything about your patch.
diff mbox series

Patch

diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c
index b136057..92829be 100644
--- a/drivers/i2c/busses/i2c-cadence.c
+++ b/drivers/i2c/busses/i2c-cadence.c
@@ -365,6 +365,7 @@  static void cdns_i2c_mrecv(struct cdns_i2c *id)
 {
 	unsigned int ctrl_reg;
 	unsigned int isr_status;
+	unsigned long flags;
 
 	id->p_recv_buf = id->p_msg->buf;
 	id->recv_count = id->p_msg->len;
@@ -405,6 +406,7 @@  static void cdns_i2c_mrecv(struct cdns_i2c *id)
 		cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET);
 	}
 
+	local_irq_save(flags);
 	/* Set the slave address in address register - triggers operation */
 	cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK,
 						CDNS_I2C_ADDR_OFFSET);
@@ -413,6 +415,7 @@  static void cdns_i2c_mrecv(struct cdns_i2c *id)
 		((id->p_msg->flags & I2C_M_RECV_LEN) != I2C_M_RECV_LEN) &&
 		(id->recv_count <= CDNS_I2C_FIFO_DEPTH))
 			cdns_i2c_clear_bus_hold(id);
+	local_irq_restore(flags);
 	cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET);
 }