9
9
* Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
10
10
* Author: Sachin Verma <sachin.verma@st.com>
11
11
*/
12
+ #include <linux/bitfield.h>
12
13
#include <linux/init.h>
13
14
#include <linux/module.h>
14
15
#include <linux/amba/bus.h>
42
43
#define I2C_ICR (0x038)
43
44
44
45
/* 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 */
58
62
59
63
/* 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 */
67
71
68
72
/* 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 */
74
82
75
83
/* 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)
93
99
94
100
/* some bits in ICR are reserved */
95
101
#define I2C_CLEAR_ALL_INTS 0x131f007f
@@ -128,6 +134,12 @@ enum i2c_operation {
128
134
I2C_READ = 0x01
129
135
};
130
136
137
+ enum i2c_operating_mode {
138
+ I2C_OM_SLAVE ,
139
+ I2C_OM_MASTER ,
140
+ I2C_OM_MASTER_OR_SLAVE ,
141
+ };
142
+
131
143
/**
132
144
* struct i2c_nmk_client - client specific data
133
145
* @slave_adr: 7-bit slave address
@@ -284,7 +296,10 @@ static int init_hw(struct nmk_i2c_dev *priv)
284
296
}
285
297
286
298
/* 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)
288
303
289
304
/**
290
305
* 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)
296
311
u32 mcr = 0 ;
297
312
unsigned short slave_adr_3msb_bits ;
298
313
299
- mcr |= GEN_MASK ( priv -> cli .slave_adr , I2C_MCR_A7 , 1 );
314
+ mcr |= FIELD_PREP ( I2C_MCR_A7 , priv -> cli .slave_adr );
300
315
301
316
if (unlikely (flags & I2C_M_TEN )) {
302
317
/* 10-bit address transaction */
303
- mcr |= GEN_MASK ( 2 , I2C_MCR_AM , 12 );
318
+ mcr |= FIELD_PREP ( I2C_MCR_AM , 2 );
304
319
/*
305
320
* Get the top 3 bits.
306
321
* EA10 represents extended address in MCR. This includes
307
322
* the extension (MSB bits) of the 7 bit address loaded
308
323
* in A7
309
324
*/
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 );
311
327
312
- mcr |= GEN_MASK ( slave_adr_3msb_bits , I2C_MCR_EA10 , 8 );
328
+ mcr |= FIELD_PREP ( I2C_MCR_EA10 , slave_adr_3msb_bits );
313
329
} else {
314
330
/* 7-bit address transaction */
315
- mcr |= GEN_MASK ( 1 , I2C_MCR_AM , 12 );
331
+ mcr |= FIELD_PREP ( I2C_MCR_AM , 1 );
316
332
}
317
333
318
334
/* start byte procedure not applied */
319
- mcr |= GEN_MASK ( 0 , I2C_MCR_SB , 11 );
335
+ mcr |= FIELD_PREP ( I2C_MCR_SB , 0 );
320
336
321
337
/* check the operation, master read/write? */
322
338
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 );
324
340
else
325
- mcr |= GEN_MASK ( I2C_READ , I2C_MCR_OP , 0 );
341
+ mcr |= FIELD_PREP ( I2C_MCR_OP , I2C_READ );
326
342
327
343
/* stop or repeated start? */
328
344
if (priv -> stop )
329
- mcr |= GEN_MASK ( 1 , I2C_MCR_STOP , 14 );
345
+ mcr |= FIELD_PREP ( I2C_MCR_STOP , 1 );
330
346
else
331
- mcr &= ~( GEN_MASK ( 1 , I2C_MCR_STOP , 14 ) );
347
+ mcr &= ~FIELD_PREP ( I2C_MCR_STOP , 1 );
332
348
333
- mcr |= GEN_MASK ( priv -> cli .count , I2C_MCR_LENGTH , 15 );
349
+ mcr |= FIELD_PREP ( I2C_MCR_LENGTH , priv -> cli .count );
334
350
335
351
return mcr ;
336
352
}
@@ -383,7 +399,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv)
383
399
slsu += 1 ;
384
400
385
401
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 );
387
403
388
404
/*
389
405
* 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)
399
415
* plus operation. Currently we do not supprt high speed mode
400
416
* so set brcr1 to 0.
401
417
*/
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 ));
404
420
405
421
/* set the baud rate counter register */
406
422
writel ((brcr1 | brcr2 ), priv -> virtbase + I2C_BRCR );
@@ -414,12 +430,13 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv)
414
430
if (priv -> sm > I2C_FREQ_MODE_FAST ) {
415
431
dev_err (& priv -> adev -> dev ,
416
432
"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 ));
418
435
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 );
421
438
}
422
- writel (priv -> sm << 4 , priv -> virtbase + I2C_CR );
439
+ writel (FIELD_PREP ( I2C_CR_SM , priv -> sm ) , priv -> virtbase + I2C_CR );
423
440
424
441
/* set the Tx and Rx FIFO threshold */
425
442
writel (priv -> tft , priv -> virtbase + I2C_TFTR );
@@ -583,13 +600,8 @@ static int nmk_i2c_xfer_one(struct nmk_i2c_dev *priv, u16 flags)
583
600
u32 cause ;
584
601
585
602
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 );
593
605
dev_err (& priv -> adev -> dev , "%s\n" ,
594
606
cause >= ARRAY_SIZE (abort_causes ) ?
595
607
"unknown reason" :
@@ -730,7 +742,7 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg)
730
742
misr = readl (priv -> virtbase + I2C_MISR );
731
743
732
744
src = __ffs (misr );
733
- switch (( 1 << src )) {
745
+ switch (BIT ( src )) {
734
746
735
747
/* Transmit FIFO nearly empty interrupt */
736
748
case I2C_IT_TXFNE :
@@ -824,15 +836,18 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg)
824
836
* during the transaction.
825
837
*/
826
838
case I2C_IT_BERR :
839
+ {
840
+ u32 sr ;
841
+
842
+ sr = readl (priv -> virtbase + I2C_SR );
827
843
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 )
830
845
init_hw (priv );
831
846
832
847
i2c_set_bit (priv -> virtbase + I2C_ICR , I2C_IT_BERR );
833
848
complete (& priv -> xfer_complete );
834
-
835
- break ;
849
+ }
850
+ break ;
836
851
837
852
/*
838
853
* Tx FIFO overrun interrupt.
0 commit comments