Skip to content

Commit a9f5cd8

Browse files
tlebAndi Shyti
authored andcommitted
i2c: nomadik: use bitops helpers
Constant register bit fields are declared using hardcoded hex values; replace them by calls to BIT() and GENMASK(). Replace custom GEN_MASK() macro by the generic FIELD_PREP(). Replace manual bit manipulations by the generic FIELD_GET() macro. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
1 parent d4f4a36 commit a9f5cd8

File tree

1 file changed

+88
-73
lines changed

1 file changed

+88
-73
lines changed

drivers/i2c/busses/i2c-nomadik.c

Lines changed: 88 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
1010
* Author: Sachin Verma <sachin.verma@st.com>
1111
*/
12+
#include <linux/bitfield.h>
1213
#include <linux/init.h>
1314
#include <linux/module.h>
1415
#include <linux/amba/bus.h>
@@ -42,54 +43,59 @@
4243
#define I2C_ICR (0x038)
4344

4445
/* Control registers */
45-
#define I2C_CR_PE (0x1 << 0) /* Peripheral Enable */
46-
#define I2C_CR_OM (0x3 << 1) /* Operating mode */
47-
#define I2C_CR_SAM (0x1 << 3) /* Slave addressing mode */
48-
#define I2C_CR_SM (0x3 << 4) /* Speed mode */
49-
#define I2C_CR_SGCM (0x1 << 6) /* Slave general call mode */
50-
#define I2C_CR_FTX (0x1 << 7) /* Flush Transmit */
51-
#define I2C_CR_FRX (0x1 << 8) /* Flush Receive */
52-
#define I2C_CR_DMA_TX_EN (0x1 << 9) /* DMA Tx enable */
53-
#define I2C_CR_DMA_RX_EN (0x1 << 10) /* DMA Rx Enable */
54-
#define I2C_CR_DMA_SLE (0x1 << 11) /* DMA sync. logic enable */
55-
#define I2C_CR_LM (0x1 << 12) /* Loopback mode */
56-
#define I2C_CR_FON (0x3 << 13) /* Filtering on */
57-
#define I2C_CR_FS (0x3 << 15) /* Force stop enable */
46+
#define I2C_CR_PE BIT(0) /* Peripheral Enable */
47+
#define I2C_CR_OM GENMASK(2, 1) /* Operating mode */
48+
#define I2C_CR_SAM BIT(3) /* Slave addressing mode */
49+
#define I2C_CR_SM GENMASK(5, 4) /* Speed mode */
50+
#define I2C_CR_SGCM BIT(6) /* Slave general call mode */
51+
#define I2C_CR_FTX BIT(7) /* Flush Transmit */
52+
#define I2C_CR_FRX BIT(8) /* Flush Receive */
53+
#define I2C_CR_DMA_TX_EN BIT(9) /* DMA Tx enable */
54+
#define I2C_CR_DMA_RX_EN BIT(10) /* DMA Rx Enable */
55+
#define I2C_CR_DMA_SLE BIT(11) /* DMA sync. logic enable */
56+
#define I2C_CR_LM BIT(12) /* Loopback mode */
57+
#define I2C_CR_FON GENMASK(14, 13) /* Filtering on */
58+
#define I2C_CR_FS GENMASK(16, 15) /* Force stop enable */
59+
60+
/* Slave control register (SCR) */
61+
#define I2C_SCR_SLSU GENMASK(31, 16) /* Slave data setup time */
5862

5963
/* Master controller (MCR) register */
60-
#define I2C_MCR_OP (0x1 << 0) /* Operation */
61-
#define I2C_MCR_A7 (0x7f << 1) /* 7-bit address */
62-
#define I2C_MCR_EA10 (0x7 << 8) /* 10-bit Extended address */
63-
#define I2C_MCR_SB (0x1 << 11) /* Extended address */
64-
#define I2C_MCR_AM (0x3 << 12) /* Address type */
65-
#define I2C_MCR_STOP (0x1 << 14) /* Stop condition */
66-
#define I2C_MCR_LENGTH (0x7ff << 15) /* Transaction length */
64+
#define I2C_MCR_OP BIT(0) /* Operation */
65+
#define I2C_MCR_A7 GENMASK(7, 1) /* 7-bit address */
66+
#define I2C_MCR_EA10 GENMASK(10, 8) /* 10-bit Extended address */
67+
#define I2C_MCR_SB BIT(11) /* Extended address */
68+
#define I2C_MCR_AM GENMASK(13, 12) /* Address type */
69+
#define I2C_MCR_STOP BIT(14) /* Stop condition */
70+
#define I2C_MCR_LENGTH GENMASK(25, 15) /* Transaction length */
6771

6872
/* Status register (SR) */
69-
#define I2C_SR_OP (0x3 << 0) /* Operation */
70-
#define I2C_SR_STATUS (0x3 << 2) /* controller status */
71-
#define I2C_SR_CAUSE (0x7 << 4) /* Abort cause */
72-
#define I2C_SR_TYPE (0x3 << 7) /* Receive type */
73-
#define I2C_SR_LENGTH (0x7ff << 9) /* Transfer length */
73+
#define I2C_SR_OP GENMASK(1, 0) /* Operation */
74+
#define I2C_SR_STATUS GENMASK(3, 2) /* controller status */
75+
#define I2C_SR_CAUSE GENMASK(6, 4) /* Abort cause */
76+
#define I2C_SR_TYPE GENMASK(8, 7) /* Receive type */
77+
#define I2C_SR_LENGTH GENMASK(19, 9) /* Transfer length */
78+
79+
/* Baud-rate counter register (BRCR) */
80+
#define I2C_BRCR_BRCNT1 GENMASK(31, 16) /* Baud-rate counter 1 */
81+
#define I2C_BRCR_BRCNT2 GENMASK(15, 0) /* Baud-rate counter 2 */
7482

7583
/* Interrupt mask set/clear (IMSCR) bits */
76-
#define I2C_IT_TXFE (0x1 << 0)
77-
#define I2C_IT_TXFNE (0x1 << 1)
78-
#define I2C_IT_TXFF (0x1 << 2)
79-
#define I2C_IT_TXFOVR (0x1 << 3)
80-
#define I2C_IT_RXFE (0x1 << 4)
81-
#define I2C_IT_RXFNF (0x1 << 5)
82-
#define I2C_IT_RXFF (0x1 << 6)
83-
#define I2C_IT_RFSR (0x1 << 16)
84-
#define I2C_IT_RFSE (0x1 << 17)
85-
#define I2C_IT_WTSR (0x1 << 18)
86-
#define I2C_IT_MTD (0x1 << 19)
87-
#define I2C_IT_STD (0x1 << 20)
88-
#define I2C_IT_MAL (0x1 << 24)
89-
#define I2C_IT_BERR (0x1 << 25)
90-
#define I2C_IT_MTDWS (0x1 << 28)
91-
92-
#define GEN_MASK(val, mask, sb) (((val) << (sb)) & (mask))
84+
#define I2C_IT_TXFE BIT(0)
85+
#define I2C_IT_TXFNE BIT(1)
86+
#define I2C_IT_TXFF BIT(2)
87+
#define I2C_IT_TXFOVR BIT(3)
88+
#define I2C_IT_RXFE BIT(4)
89+
#define I2C_IT_RXFNF BIT(5)
90+
#define I2C_IT_RXFF BIT(6)
91+
#define I2C_IT_RFSR BIT(16)
92+
#define I2C_IT_RFSE BIT(17)
93+
#define I2C_IT_WTSR BIT(18)
94+
#define I2C_IT_MTD BIT(19)
95+
#define I2C_IT_STD BIT(20)
96+
#define I2C_IT_MAL BIT(24)
97+
#define I2C_IT_BERR BIT(25)
98+
#define I2C_IT_MTDWS BIT(28)
9399

94100
/* some bits in ICR are reserved */
95101
#define I2C_CLEAR_ALL_INTS 0x131f007f
@@ -128,6 +134,12 @@ enum i2c_operation {
128134
I2C_READ = 0x01
129135
};
130136

137+
enum i2c_operating_mode {
138+
I2C_OM_SLAVE,
139+
I2C_OM_MASTER,
140+
I2C_OM_MASTER_OR_SLAVE,
141+
};
142+
131143
/**
132144
* struct i2c_nmk_client - client specific data
133145
* @slave_adr: 7-bit slave address
@@ -284,7 +296,10 @@ static int init_hw(struct nmk_i2c_dev *priv)
284296
}
285297

286298
/* enable peripheral, master mode operation */
287-
#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE)
299+
#define DEFAULT_I2C_REG_CR (FIELD_PREP(I2C_CR_OM, I2C_OM_MASTER) | I2C_CR_PE)
300+
301+
/* grab top three bits from extended I2C addresses */
302+
#define ADR_3MSB_BITS GENMASK(9, 7)
288303

289304
/**
290305
* load_i2c_mcr_reg() - load the MCR register
@@ -296,41 +311,42 @@ static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *priv, u16 flags)
296311
u32 mcr = 0;
297312
unsigned short slave_adr_3msb_bits;
298313

299-
mcr |= GEN_MASK(priv->cli.slave_adr, I2C_MCR_A7, 1);
314+
mcr |= FIELD_PREP(I2C_MCR_A7, priv->cli.slave_adr);
300315

301316
if (unlikely(flags & I2C_M_TEN)) {
302317
/* 10-bit address transaction */
303-
mcr |= GEN_MASK(2, I2C_MCR_AM, 12);
318+
mcr |= FIELD_PREP(I2C_MCR_AM, 2);
304319
/*
305320
* Get the top 3 bits.
306321
* EA10 represents extended address in MCR. This includes
307322
* the extension (MSB bits) of the 7 bit address loaded
308323
* in A7
309324
*/
310-
slave_adr_3msb_bits = (priv->cli.slave_adr >> 7) & 0x7;
325+
slave_adr_3msb_bits = FIELD_GET(ADR_3MSB_BITS,
326+
priv->cli.slave_adr);
311327

312-
mcr |= GEN_MASK(slave_adr_3msb_bits, I2C_MCR_EA10, 8);
328+
mcr |= FIELD_PREP(I2C_MCR_EA10, slave_adr_3msb_bits);
313329
} else {
314330
/* 7-bit address transaction */
315-
mcr |= GEN_MASK(1, I2C_MCR_AM, 12);
331+
mcr |= FIELD_PREP(I2C_MCR_AM, 1);
316332
}
317333

318334
/* start byte procedure not applied */
319-
mcr |= GEN_MASK(0, I2C_MCR_SB, 11);
335+
mcr |= FIELD_PREP(I2C_MCR_SB, 0);
320336

321337
/* check the operation, master read/write? */
322338
if (priv->cli.operation == I2C_WRITE)
323-
mcr |= GEN_MASK(I2C_WRITE, I2C_MCR_OP, 0);
339+
mcr |= FIELD_PREP(I2C_MCR_OP, I2C_WRITE);
324340
else
325-
mcr |= GEN_MASK(I2C_READ, I2C_MCR_OP, 0);
341+
mcr |= FIELD_PREP(I2C_MCR_OP, I2C_READ);
326342

327343
/* stop or repeated start? */
328344
if (priv->stop)
329-
mcr |= GEN_MASK(1, I2C_MCR_STOP, 14);
345+
mcr |= FIELD_PREP(I2C_MCR_STOP, 1);
330346
else
331-
mcr &= ~(GEN_MASK(1, I2C_MCR_STOP, 14));
347+
mcr &= ~FIELD_PREP(I2C_MCR_STOP, 1);
332348

333-
mcr |= GEN_MASK(priv->cli.count, I2C_MCR_LENGTH, 15);
349+
mcr |= FIELD_PREP(I2C_MCR_LENGTH, priv->cli.count);
334350

335351
return mcr;
336352
}
@@ -383,7 +399,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv)
383399
slsu += 1;
384400

385401
dev_dbg(&priv->adev->dev, "calculated SLSU = %04x\n", slsu);
386-
writel(slsu << 16, priv->virtbase + I2C_SCR);
402+
writel(FIELD_PREP(I2C_SCR_SLSU, slsu), priv->virtbase + I2C_SCR);
387403

388404
/*
389405
* The spec says, in case of std. mode the divider is
@@ -399,8 +415,8 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv)
399415
* plus operation. Currently we do not supprt high speed mode
400416
* so set brcr1 to 0.
401417
*/
402-
brcr1 = 0 << 16;
403-
brcr2 = (i2c_clk / (priv->clk_freq * div)) & 0xffff;
418+
brcr1 = FIELD_PREP(I2C_BRCR_BRCNT1, 0);
419+
brcr2 = FIELD_PREP(I2C_BRCR_BRCNT2, i2c_clk / (priv->clk_freq * div));
404420

405421
/* set the baud rate counter register */
406422
writel((brcr1 | brcr2), priv->virtbase + I2C_BRCR);
@@ -414,12 +430,13 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv)
414430
if (priv->sm > I2C_FREQ_MODE_FAST) {
415431
dev_err(&priv->adev->dev,
416432
"do not support this mode defaulting to std. mode\n");
417-
brcr2 = i2c_clk / (I2C_MAX_STANDARD_MODE_FREQ * 2) & 0xffff;
433+
brcr2 = FIELD_PREP(I2C_BRCR_BRCNT2,
434+
i2c_clk / (I2C_MAX_STANDARD_MODE_FREQ * 2));
418435
writel((brcr1 | brcr2), priv->virtbase + I2C_BRCR);
419-
writel(I2C_FREQ_MODE_STANDARD << 4,
420-
priv->virtbase + I2C_CR);
436+
writel(FIELD_PREP(I2C_CR_SM, I2C_FREQ_MODE_STANDARD),
437+
priv->virtbase + I2C_CR);
421438
}
422-
writel(priv->sm << 4, priv->virtbase + I2C_CR);
439+
writel(FIELD_PREP(I2C_CR_SM, priv->sm), priv->virtbase + I2C_CR);
423440

424441
/* set the Tx and Rx FIFO threshold */
425442
writel(priv->tft, priv->virtbase + I2C_TFTR);
@@ -583,13 +600,8 @@ static int nmk_i2c_xfer_one(struct nmk_i2c_dev *priv, u16 flags)
583600
u32 cause;
584601

585602
i2c_sr = readl(priv->virtbase + I2C_SR);
586-
/*
587-
* Check if the controller I2C operation status
588-
* is set to ABORT(11b).
589-
*/
590-
if (((i2c_sr >> 2) & 0x3) == 0x3) {
591-
/* get the abort cause */
592-
cause = (i2c_sr >> 4) & 0x7;
603+
if (FIELD_GET(I2C_SR_STATUS, i2c_sr) == I2C_ABORT) {
604+
cause = FIELD_GET(I2C_SR_CAUSE, i2c_sr);
593605
dev_err(&priv->adev->dev, "%s\n",
594606
cause >= ARRAY_SIZE(abort_causes) ?
595607
"unknown reason" :
@@ -730,7 +742,7 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg)
730742
misr = readl(priv->virtbase + I2C_MISR);
731743

732744
src = __ffs(misr);
733-
switch ((1 << src)) {
745+
switch (BIT(src)) {
734746

735747
/* Transmit FIFO nearly empty interrupt */
736748
case I2C_IT_TXFNE:
@@ -824,15 +836,18 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg)
824836
* during the transaction.
825837
*/
826838
case I2C_IT_BERR:
839+
{
840+
u32 sr;
841+
842+
sr = readl(priv->virtbase + I2C_SR);
827843
priv->result = -EIO;
828-
/* get the status */
829-
if (((readl(priv->virtbase + I2C_SR) >> 2) & 0x3) == I2C_ABORT)
844+
if (FIELD_GET(I2C_SR_STATUS, sr) == I2C_ABORT)
830845
init_hw(priv);
831846

832847
i2c_set_bit(priv->virtbase + I2C_ICR, I2C_IT_BERR);
833848
complete(&priv->xfer_complete);
834-
835-
break;
849+
}
850+
break;
836851

837852
/*
838853
* Tx FIFO overrun interrupt.

0 commit comments

Comments
 (0)