6
6
* Author: Colin Cross <[email protected] >
7
7
*/
8
8
9
+ #include <linux/bitfield.h>
9
10
#include <linux/clk.h>
10
11
#include <linux/delay.h>
11
12
#include <linux/dmaengine.h>
29
30
#define BYTES_PER_FIFO_WORD 4
30
31
31
32
#define I2C_CNFG 0x000
32
- #define I2C_CNFG_DEBOUNCE_CNT_SHIFT 12
33
+ #define I2C_CNFG_DEBOUNCE_CNT GENMASK(14, 12)
33
34
#define I2C_CNFG_PACKET_MODE_EN BIT(10)
34
35
#define I2C_CNFG_NEW_MASTER_FSM BIT(11)
35
36
#define I2C_CNFG_MULTI_MASTER_MODE BIT(17)
36
- #define I2C_STATUS 0x01C
37
+ #define I2C_STATUS 0x01c
37
38
#define I2C_SL_CNFG 0x020
38
39
#define I2C_SL_CNFG_NACK BIT(1)
39
40
#define I2C_SL_CNFG_NEWSL BIT(2)
48
49
#define I2C_FIFO_CONTROL_TX_TRIG (x ) (((x) - 1) << 5)
49
50
#define I2C_FIFO_CONTROL_RX_TRIG (x ) (((x) - 1) << 2)
50
51
#define I2C_FIFO_STATUS 0x060
51
- #define I2C_FIFO_STATUS_TX_MASK 0xF0
52
- #define I2C_FIFO_STATUS_TX_SHIFT 4
53
- #define I2C_FIFO_STATUS_RX_MASK 0x0F
54
- #define I2C_FIFO_STATUS_RX_SHIFT 0
52
+ #define I2C_FIFO_STATUS_TX GENMASK(7, 4)
53
+ #define I2C_FIFO_STATUS_RX GENMASK(3, 0)
55
54
#define I2C_INT_MASK 0x064
56
55
#define I2C_INT_STATUS 0x068
57
56
#define I2C_INT_BUS_CLR_DONE BIT(11)
61
60
#define I2C_INT_TX_FIFO_DATA_REQ BIT(1)
62
61
#define I2C_INT_RX_FIFO_DATA_REQ BIT(0)
63
62
#define I2C_CLK_DIVISOR 0x06c
64
- #define I2C_CLK_DIVISOR_STD_FAST_MODE_SHIFT 16
63
+ #define I2C_CLK_DIVISOR_STD_FAST_MODE GENMASK(31, 16)
64
+ #define I2C_CLK_DIVISOR_HSMODE GENMASK(15, 0)
65
65
66
66
#define DVC_CTRL_REG1 0x000
67
67
#define DVC_CTRL_REG1_INTR_EN BIT(10)
77
77
#define I2C_ERR_UNKNOWN_INTERRUPT BIT(2)
78
78
#define I2C_ERR_RX_BUFFER_OVERFLOW BIT(3)
79
79
80
- #define PACKET_HEADER0_HEADER_SIZE_SHIFT 28
81
- #define PACKET_HEADER0_PACKET_ID_SHIFT 16
82
- #define PACKET_HEADER0_CONT_ID_SHIFT 12
83
- #define PACKET_HEADER0_PROTOCOL_I2C BIT(4)
80
+ #define PACKET_HEADER0_HEADER_SIZE GENMASK(29, 28)
81
+ #define PACKET_HEADER0_PACKET_ID GENMASK(23, 16)
82
+ #define PACKET_HEADER0_CONT_ID GENMASK(15, 12)
83
+ #define PACKET_HEADER0_PROTOCOL GENMASK(7, 4)
84
+ #define PACKET_HEADER0_PROTOCOL_I2C 1
84
85
85
86
#define I2C_HEADER_CONT_ON_NAK BIT(21)
86
87
#define I2C_HEADER_READ BIT(19)
91
92
#define I2C_HEADER_SLAVE_ADDR_SHIFT 1
92
93
93
94
#define I2C_BUS_CLEAR_CNFG 0x084
94
- #define I2C_BC_SCLK_THRESHOLD 9
95
- #define I2C_BC_SCLK_THRESHOLD_SHIFT 16
95
+ #define I2C_BC_SCLK_THRESHOLD GENMASK(23, 16)
96
96
#define I2C_BC_STOP_COND BIT(2)
97
97
#define I2C_BC_TERMINATE BIT(1)
98
98
#define I2C_BC_ENABLE BIT(0)
99
99
#define I2C_BUS_CLEAR_STATUS 0x088
100
100
#define I2C_BC_STATUS BIT(0)
101
101
102
- #define I2C_CONFIG_LOAD 0x08C
102
+ #define I2C_CONFIG_LOAD 0x08c
103
103
#define I2C_MSTR_CONFIG_LOAD BIT(0)
104
104
105
105
#define I2C_CLKEN_OVERRIDE 0x090
106
106
#define I2C_MST_CORE_CLKEN_OVR BIT(0)
107
107
108
- #define I2C_CONFIG_LOAD_TIMEOUT 1000000
108
+ #define I2C_INTERFACE_TIMING_0 0x094
109
+ #define I2C_INTERFACE_TIMING_THIGH GENMASK(13, 8)
110
+ #define I2C_INTERFACE_TIMING_TLOW GENMASK(5, 0)
111
+ #define I2C_INTERFACE_TIMING_1 0x098
109
112
110
113
#define I2C_MST_FIFO_CONTROL 0x0b4
111
114
#define I2C_MST_FIFO_CONTROL_RX_FLUSH BIT(0)
114
117
#define I2C_MST_FIFO_CONTROL_TX_TRIG (x ) (((x) - 1) << 16)
115
118
116
119
#define I2C_MST_FIFO_STATUS 0x0b8
117
- #define I2C_MST_FIFO_STATUS_RX_MASK 0xff
118
- #define I2C_MST_FIFO_STATUS_RX_SHIFT 0
119
- #define I2C_MST_FIFO_STATUS_TX_MASK 0xff0000
120
- #define I2C_MST_FIFO_STATUS_TX_SHIFT 16
120
+ #define I2C_MST_FIFO_STATUS_TX GENMASK(23, 16)
121
+ #define I2C_MST_FIFO_STATUS_RX GENMASK(7, 0)
121
122
122
- #define I2C_INTERFACE_TIMING_0 0x94
123
- #define I2C_THIGH_SHIFT 8
124
- #define I2C_INTERFACE_TIMING_1 0x98
123
+ /* configuration load timeout in microseconds */
124
+ #define I2C_CONFIG_LOAD_TIMEOUT 1000000
125
125
126
126
/* Packet header size in bytes */
127
127
#define I2C_PACKET_HEADER_SIZE 12
@@ -495,12 +495,10 @@ static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_dev *i2c_dev)
495
495
496
496
if (i2c_dev -> hw -> has_mst_fifo ) {
497
497
val = i2c_readl (i2c_dev , I2C_MST_FIFO_STATUS );
498
- rx_fifo_avail = (val & I2C_MST_FIFO_STATUS_RX_MASK ) >>
499
- I2C_MST_FIFO_STATUS_RX_SHIFT ;
498
+ rx_fifo_avail = FIELD_GET (I2C_MST_FIFO_STATUS_RX , val );
500
499
} else {
501
500
val = i2c_readl (i2c_dev , I2C_FIFO_STATUS );
502
- rx_fifo_avail = (val & I2C_FIFO_STATUS_RX_MASK ) >>
503
- I2C_FIFO_STATUS_RX_SHIFT ;
501
+ rx_fifo_avail = FIELD_GET (I2C_FIFO_STATUS_RX , val );
504
502
}
505
503
506
504
/* Rounds down to not include partial word at the end of buf */
@@ -551,12 +549,10 @@ static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_dev *i2c_dev)
551
549
552
550
if (i2c_dev -> hw -> has_mst_fifo ) {
553
551
val = i2c_readl (i2c_dev , I2C_MST_FIFO_STATUS );
554
- tx_fifo_avail = (val & I2C_MST_FIFO_STATUS_TX_MASK ) >>
555
- I2C_MST_FIFO_STATUS_TX_SHIFT ;
552
+ tx_fifo_avail = FIELD_GET (I2C_MST_FIFO_STATUS_TX , val );
556
553
} else {
557
554
val = i2c_readl (i2c_dev , I2C_FIFO_STATUS );
558
- tx_fifo_avail = (val & I2C_FIFO_STATUS_TX_MASK ) >>
559
- I2C_FIFO_STATUS_TX_SHIFT ;
555
+ tx_fifo_avail = FIELD_GET (I2C_FIFO_STATUS_TX , val );
560
556
}
561
557
562
558
/* Rounds down to not include partial word at the end of buf */
@@ -719,7 +715,7 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev, bool clk_reinit)
719
715
tegra_dvc_init (i2c_dev );
720
716
721
717
val = I2C_CNFG_NEW_MASTER_FSM | I2C_CNFG_PACKET_MODE_EN |
722
- ( 0x2 << I2C_CNFG_DEBOUNCE_CNT_SHIFT );
718
+ FIELD_PREP ( I2C_CNFG_DEBOUNCE_CNT , 2 );
723
719
724
720
if (i2c_dev -> hw -> has_multi_master_mode )
725
721
val |= I2C_CNFG_MULTI_MASTER_MODE ;
@@ -728,9 +724,10 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev, bool clk_reinit)
728
724
i2c_writel (i2c_dev , 0 , I2C_INT_MASK );
729
725
730
726
/* Make sure clock divisor programmed correctly */
731
- clk_divisor = i2c_dev -> hw -> clk_divisor_hs_mode ;
732
- clk_divisor |= i2c_dev -> clk_divisor_non_hs_mode <<
733
- I2C_CLK_DIVISOR_STD_FAST_MODE_SHIFT ;
727
+ clk_divisor = FIELD_PREP (I2C_CLK_DIVISOR_HSMODE ,
728
+ i2c_dev -> hw -> clk_divisor_hs_mode ) |
729
+ FIELD_PREP (I2C_CLK_DIVISOR_STD_FAST_MODE ,
730
+ i2c_dev -> clk_divisor_non_hs_mode );
734
731
i2c_writel (i2c_dev , clk_divisor , I2C_CLK_DIVISOR );
735
732
736
733
if (i2c_dev -> bus_clk_rate > I2C_MAX_STANDARD_MODE_FREQ &&
@@ -745,7 +742,8 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev, bool clk_reinit)
745
742
}
746
743
747
744
if (i2c_dev -> hw -> has_interface_timing_reg ) {
748
- val = (thigh << I2C_THIGH_SHIFT ) | tlow ;
745
+ val = FIELD_PREP (I2C_INTERFACE_TIMING_THIGH , thigh ) |
746
+ FIELD_PREP (I2C_INTERFACE_TIMING_TLOW , tlow );
749
747
i2c_writel (i2c_dev , val , I2C_INTERFACE_TIMING_0 );
750
748
}
751
749
@@ -1054,8 +1052,8 @@ static int tegra_i2c_issue_bus_clear(struct i2c_adapter *adap)
1054
1052
u32 reg ;
1055
1053
1056
1054
reinit_completion (& i2c_dev -> msg_complete );
1057
- reg = (I2C_BC_SCLK_THRESHOLD << I2C_BC_SCLK_THRESHOLD_SHIFT ) |
1058
- I2C_BC_STOP_COND | I2C_BC_TERMINATE ;
1055
+ reg = FIELD_PREP (I2C_BC_SCLK_THRESHOLD , 9 ) | I2C_BC_STOP_COND |
1056
+ I2C_BC_TERMINATE ;
1059
1057
i2c_writel (i2c_dev , reg , I2C_BUS_CLEAR_CNFG );
1060
1058
if (i2c_dev -> hw -> has_config_load_reg ) {
1061
1059
err = tegra_i2c_wait_for_config_load (i2c_dev );
@@ -1148,10 +1146,11 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
1148
1146
}
1149
1147
}
1150
1148
1151
- packet_header = (0 << PACKET_HEADER0_HEADER_SIZE_SHIFT ) |
1152
- PACKET_HEADER0_PROTOCOL_I2C |
1153
- (i2c_dev -> cont_id << PACKET_HEADER0_CONT_ID_SHIFT ) |
1154
- (1 << PACKET_HEADER0_PACKET_ID_SHIFT );
1149
+ packet_header = FIELD_PREP (PACKET_HEADER0_HEADER_SIZE , 0 ) |
1150
+ FIELD_PREP (PACKET_HEADER0_PROTOCOL ,
1151
+ PACKET_HEADER0_PROTOCOL_I2C ) |
1152
+ FIELD_PREP (PACKET_HEADER0_CONT_ID , i2c_dev -> cont_id ) |
1153
+ FIELD_PREP (PACKET_HEADER0_PACKET_ID , 1 );
1155
1154
if (dma && !i2c_dev -> msg_read )
1156
1155
* buffer ++ = packet_header ;
1157
1156
else
0 commit comments