Skip to content

Commit d4f4a36

Browse files
tlebAndi Shyti
authored andcommitted
i2c: nomadik: simplify IRQ masking logic
IRQ_MASK and I2C_CLEAR_ALL_INTS both mask available interrupts. IRQ_MASK removes top options (bits 29-31). I2C_CLEAR_ALL_INTS removes reserved options including top bits. Keep the latter. 31 29 27 25 23 21 19 17 15 13 11 09 07 05 03 01 30 28 26 24 22 20 18 16 14 12 10 08 06 04 02 00 -- IRQ_MASK: --------------------------------------------------- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 -- I2C_CLEAR_ALL_INTS: ----------------------------------------- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Notice I2C_CLEAR_ALL_INTS is more restrictive than IRQ_MASK. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
1 parent ae9977e commit d4f4a36

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

drivers/i2c/busses/i2c-nomadik.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,6 @@
9494
/* some bits in ICR are reserved */
9595
#define I2C_CLEAR_ALL_INTS 0x131f007f
9696

97-
/* first three msb bits are reserved */
98-
#define IRQ_MASK(mask) (mask & 0x1fffffff)
99-
10097
/* maximum threshold value */
10198
#define MAX_I2C_FIFO_THRESHOLD 15
10299

@@ -249,8 +246,7 @@ static int flush_i2c_fifo(struct nmk_i2c_dev *priv)
249246
*/
250247
static void disable_all_interrupts(struct nmk_i2c_dev *priv)
251248
{
252-
u32 mask = IRQ_MASK(0);
253-
writel(mask, priv->virtbase + I2C_IMSCR);
249+
writel(0, priv->virtbase + I2C_IMSCR);
254250
}
255251

256252
/**
@@ -259,9 +255,7 @@ static void disable_all_interrupts(struct nmk_i2c_dev *priv)
259255
*/
260256
static void clear_all_interrupts(struct nmk_i2c_dev *priv)
261257
{
262-
u32 mask;
263-
mask = IRQ_MASK(I2C_CLEAR_ALL_INTS);
264-
writel(mask, priv->virtbase + I2C_ICR);
258+
writel(I2C_CLEAR_ALL_INTS, priv->virtbase + I2C_ICR);
265259
}
266260

267261
/**
@@ -468,7 +462,7 @@ static int read_i2c(struct nmk_i2c_dev *priv, u16 flags)
468462
else
469463
irq_mask |= I2C_IT_MTDWS;
470464

471-
irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask);
465+
irq_mask &= I2C_CLEAR_ALL_INTS;
472466

473467
writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask,
474468
priv->virtbase + I2C_IMSCR);
@@ -547,7 +541,7 @@ static int write_i2c(struct nmk_i2c_dev *priv, u16 flags)
547541
else
548542
irq_mask |= I2C_IT_MTDWS;
549543

550-
irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask);
544+
irq_mask &= I2C_CLEAR_ALL_INTS;
551545

552546
writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask,
553547
priv->virtbase + I2C_IMSCR);
@@ -703,8 +697,8 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap,
703697
*/
704698
static int disable_interrupts(struct nmk_i2c_dev *priv, u32 irq)
705699
{
706-
irq = IRQ_MASK(irq);
707-
writel(readl(priv->virtbase + I2C_IMSCR) & ~(I2C_CLEAR_ALL_INTS & irq),
700+
irq &= I2C_CLEAR_ALL_INTS;
701+
writel(readl(priv->virtbase + I2C_IMSCR) & ~irq,
708702
priv->virtbase + I2C_IMSCR);
709703
return 0;
710704
}

0 commit comments

Comments
 (0)