1
2
3
4
5
6
7
8
9
10
11
12#include <linux/i2c.h>
13#include <linux/pm_qos.h>
14
15#define DW_IC_DEFAULT_FUNCTIONALITY (I2C_FUNC_I2C | \
16 I2C_FUNC_SMBUS_BYTE | \
17 I2C_FUNC_SMBUS_BYTE_DATA | \
18 I2C_FUNC_SMBUS_WORD_DATA | \
19 I2C_FUNC_SMBUS_BLOCK_DATA | \
20 I2C_FUNC_SMBUS_I2C_BLOCK)
21
22#define DW_IC_CON_MASTER 0x1
23#define DW_IC_CON_SPEED_STD 0x2
24#define DW_IC_CON_SPEED_FAST 0x4
25#define DW_IC_CON_SPEED_HIGH 0x6
26#define DW_IC_CON_SPEED_MASK 0x6
27#define DW_IC_CON_10BITADDR_SLAVE 0x8
28#define DW_IC_CON_10BITADDR_MASTER 0x10
29#define DW_IC_CON_RESTART_EN 0x20
30#define DW_IC_CON_SLAVE_DISABLE 0x40
31#define DW_IC_CON_STOP_DET_IFADDRESSED 0x80
32#define DW_IC_CON_TX_EMPTY_CTRL 0x100
33#define DW_IC_CON_RX_FIFO_FULL_HLD_CTRL 0x200
34
35
36
37
38#define DW_IC_CON 0x0
39#define DW_IC_TAR 0x4
40#define DW_IC_SAR 0x8
41#define DW_IC_DATA_CMD 0x10
42#define DW_IC_SS_SCL_HCNT 0x14
43#define DW_IC_SS_SCL_LCNT 0x18
44#define DW_IC_FS_SCL_HCNT 0x1c
45#define DW_IC_FS_SCL_LCNT 0x20
46#define DW_IC_HS_SCL_HCNT 0x24
47#define DW_IC_HS_SCL_LCNT 0x28
48#define DW_IC_INTR_STAT 0x2c
49#define DW_IC_INTR_MASK 0x30
50#define DW_IC_RAW_INTR_STAT 0x34
51#define DW_IC_RX_TL 0x38
52#define DW_IC_TX_TL 0x3c
53#define DW_IC_CLR_INTR 0x40
54#define DW_IC_CLR_RX_UNDER 0x44
55#define DW_IC_CLR_RX_OVER 0x48
56#define DW_IC_CLR_TX_OVER 0x4c
57#define DW_IC_CLR_RD_REQ 0x50
58#define DW_IC_CLR_TX_ABRT 0x54
59#define DW_IC_CLR_RX_DONE 0x58
60#define DW_IC_CLR_ACTIVITY 0x5c
61#define DW_IC_CLR_STOP_DET 0x60
62#define DW_IC_CLR_START_DET 0x64
63#define DW_IC_CLR_GEN_CALL 0x68
64#define DW_IC_ENABLE 0x6c
65#define DW_IC_STATUS 0x70
66#define DW_IC_TXFLR 0x74
67#define DW_IC_RXFLR 0x78
68#define DW_IC_SDA_HOLD 0x7c
69#define DW_IC_TX_ABRT_SOURCE 0x80
70#define DW_IC_ENABLE_STATUS 0x9c
71#define DW_IC_CLR_RESTART_DET 0xa8
72#define DW_IC_COMP_PARAM_1 0xf4
73#define DW_IC_COMP_VERSION 0xf8
74#define DW_IC_SDA_HOLD_MIN_VERS 0x3131312A
75#define DW_IC_COMP_TYPE 0xfc
76#define DW_IC_COMP_TYPE_VALUE 0x44570140
77
78#define DW_IC_INTR_RX_UNDER 0x001
79#define DW_IC_INTR_RX_OVER 0x002
80#define DW_IC_INTR_RX_FULL 0x004
81#define DW_IC_INTR_TX_OVER 0x008
82#define DW_IC_INTR_TX_EMPTY 0x010
83#define DW_IC_INTR_RD_REQ 0x020
84#define DW_IC_INTR_TX_ABRT 0x040
85#define DW_IC_INTR_RX_DONE 0x080
86#define DW_IC_INTR_ACTIVITY 0x100
87#define DW_IC_INTR_STOP_DET 0x200
88#define DW_IC_INTR_START_DET 0x400
89#define DW_IC_INTR_GEN_CALL 0x800
90#define DW_IC_INTR_RESTART_DET 0x1000
91
92#define DW_IC_INTR_DEFAULT_MASK (DW_IC_INTR_RX_FULL | \
93 DW_IC_INTR_TX_ABRT | \
94 DW_IC_INTR_STOP_DET)
95#define DW_IC_INTR_MASTER_MASK (DW_IC_INTR_DEFAULT_MASK | \
96 DW_IC_INTR_TX_EMPTY)
97#define DW_IC_INTR_SLAVE_MASK (DW_IC_INTR_DEFAULT_MASK | \
98 DW_IC_INTR_RX_DONE | \
99 DW_IC_INTR_RX_UNDER | \
100 DW_IC_INTR_RD_REQ)
101
102#define DW_IC_STATUS_ACTIVITY 0x1
103#define DW_IC_STATUS_TFE BIT(2)
104#define DW_IC_STATUS_MASTER_ACTIVITY BIT(5)
105#define DW_IC_STATUS_SLAVE_ACTIVITY BIT(6)
106
107#define DW_IC_SDA_HOLD_RX_SHIFT 16
108#define DW_IC_SDA_HOLD_RX_MASK GENMASK(23, DW_IC_SDA_HOLD_RX_SHIFT)
109
110#define DW_IC_ERR_TX_ABRT 0x1
111
112#define DW_IC_TAR_10BITADDR_MASTER BIT(12)
113
114#define DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH (BIT(2) | BIT(3))
115#define DW_IC_COMP_PARAM_1_SPEED_MODE_MASK GENMASK(3, 2)
116
117
118
119
120#define STATUS_IDLE 0x0
121#define STATUS_WRITE_IN_PROGRESS 0x1
122#define STATUS_READ_IN_PROGRESS 0x2
123
124#define TIMEOUT 20
125
126
127
128
129#define DW_IC_MASTER 0
130#define DW_IC_SLAVE 1
131
132
133
134
135
136
137
138#define ABRT_7B_ADDR_NOACK 0
139#define ABRT_10ADDR1_NOACK 1
140#define ABRT_10ADDR2_NOACK 2
141#define ABRT_TXDATA_NOACK 3
142#define ABRT_GCALL_NOACK 4
143#define ABRT_GCALL_READ 5
144#define ABRT_SBYTE_ACKDET 7
145#define ABRT_SBYTE_NORSTRT 9
146#define ABRT_10B_RD_NORSTRT 10
147#define ABRT_MASTER_DIS 11
148#define ARB_LOST 12
149#define ABRT_SLAVE_FLUSH_TXFIFO 13
150#define ABRT_SLAVE_ARBLOST 14
151#define ABRT_SLAVE_RD_INTX 15
152
153#define DW_IC_TX_ABRT_7B_ADDR_NOACK (1UL << ABRT_7B_ADDR_NOACK)
154#define DW_IC_TX_ABRT_10ADDR1_NOACK (1UL << ABRT_10ADDR1_NOACK)
155#define DW_IC_TX_ABRT_10ADDR2_NOACK (1UL << ABRT_10ADDR2_NOACK)
156#define DW_IC_TX_ABRT_TXDATA_NOACK (1UL << ABRT_TXDATA_NOACK)
157#define DW_IC_TX_ABRT_GCALL_NOACK (1UL << ABRT_GCALL_NOACK)
158#define DW_IC_TX_ABRT_GCALL_READ (1UL << ABRT_GCALL_READ)
159#define DW_IC_TX_ABRT_SBYTE_ACKDET (1UL << ABRT_SBYTE_ACKDET)
160#define DW_IC_TX_ABRT_SBYTE_NORSTRT (1UL << ABRT_SBYTE_NORSTRT)
161#define DW_IC_TX_ABRT_10B_RD_NORSTRT (1UL << ABRT_10B_RD_NORSTRT)
162#define DW_IC_TX_ABRT_MASTER_DIS (1UL << ABRT_MASTER_DIS)
163#define DW_IC_TX_ARB_LOST (1UL << ARB_LOST)
164#define DW_IC_RX_ABRT_SLAVE_RD_INTX (1UL << ABRT_SLAVE_RD_INTX)
165#define DW_IC_RX_ABRT_SLAVE_ARBLOST (1UL << ABRT_SLAVE_ARBLOST)
166#define DW_IC_RX_ABRT_SLAVE_FLUSH_TXFIFO (1UL << ABRT_SLAVE_FLUSH_TXFIFO)
167
168#define DW_IC_TX_ABRT_NOACK (DW_IC_TX_ABRT_7B_ADDR_NOACK | \
169 DW_IC_TX_ABRT_10ADDR1_NOACK | \
170 DW_IC_TX_ABRT_10ADDR2_NOACK | \
171 DW_IC_TX_ABRT_TXDATA_NOACK | \
172 DW_IC_TX_ABRT_GCALL_NOACK)
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225struct dw_i2c_dev {
226 struct device *dev;
227 void __iomem *base;
228 struct completion cmd_complete;
229 struct clk *clk;
230 struct reset_control *rst;
231 struct i2c_client *slave;
232 u32 (*get_clk_rate_khz) (struct dw_i2c_dev *dev);
233 struct dw_pci_controller *controller;
234 int cmd_err;
235 struct i2c_msg *msgs;
236 int msgs_num;
237 int msg_write_idx;
238 u32 tx_buf_len;
239 u8 *tx_buf;
240 int msg_read_idx;
241 u32 rx_buf_len;
242 u8 *rx_buf;
243 int msg_err;
244 unsigned int status;
245 u32 abort_source;
246 int irq;
247 u32 flags;
248 struct i2c_adapter adapter;
249 u32 functionality;
250 u32 master_cfg;
251 u32 slave_cfg;
252 unsigned int tx_fifo_depth;
253 unsigned int rx_fifo_depth;
254 int rx_outstanding;
255 struct i2c_timings timings;
256 u32 sda_hold_time;
257 u16 ss_hcnt;
258 u16 ss_lcnt;
259 u16 fs_hcnt;
260 u16 fs_lcnt;
261 u16 fp_hcnt;
262 u16 fp_lcnt;
263 u16 hs_hcnt;
264 u16 hs_lcnt;
265 struct pm_qos_request pm_qos;
266 int (*acquire_lock)(struct dw_i2c_dev *dev);
267 void (*release_lock)(struct dw_i2c_dev *dev);
268 bool pm_disabled;
269 void (*disable)(struct dw_i2c_dev *dev);
270 void (*disable_int)(struct dw_i2c_dev *dev);
271 int (*init)(struct dw_i2c_dev *dev);
272 int mode;
273 struct i2c_bus_recovery_info rinfo;
274};
275
276#define ACCESS_SWAP 0x00000001
277#define ACCESS_16BIT 0x00000002
278#define ACCESS_INTR_MASK 0x00000004
279
280#define MODEL_CHERRYTRAIL 0x00000100
281
282u32 dw_readl(struct dw_i2c_dev *dev, int offset);
283void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset);
284int i2c_dw_set_reg_access(struct dw_i2c_dev *dev);
285u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset);
286u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset);
287int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev);
288unsigned long i2c_dw_clk_rate(struct dw_i2c_dev *dev);
289int i2c_dw_prepare_clk(struct dw_i2c_dev *dev, bool prepare);
290int i2c_dw_acquire_lock(struct dw_i2c_dev *dev);
291void i2c_dw_release_lock(struct dw_i2c_dev *dev);
292int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev);
293int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev);
294u32 i2c_dw_func(struct i2c_adapter *adap);
295void i2c_dw_disable(struct dw_i2c_dev *dev);
296void i2c_dw_disable_int(struct dw_i2c_dev *dev);
297
298static inline void __i2c_dw_enable(struct dw_i2c_dev *dev)
299{
300 dw_writel(dev, 1, DW_IC_ENABLE);
301}
302
303static inline void __i2c_dw_disable_nowait(struct dw_i2c_dev *dev)
304{
305 dw_writel(dev, 0, DW_IC_ENABLE);
306}
307
308void __i2c_dw_disable(struct dw_i2c_dev *dev);
309
310extern u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev);
311extern int i2c_dw_probe(struct dw_i2c_dev *dev);
312#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_SLAVE)
313extern int i2c_dw_probe_slave(struct dw_i2c_dev *dev);
314#else
315static inline int i2c_dw_probe_slave(struct dw_i2c_dev *dev) { return -EINVAL; }
316#endif
317
318#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_BAYTRAIL)
319extern int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev);
320extern void i2c_dw_remove_lock_support(struct dw_i2c_dev *dev);
321#else
322static inline int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev) { return 0; }
323static inline void i2c_dw_remove_lock_support(struct dw_i2c_dev *dev) {}
324#endif
325