Commit | Line | Data |
---|---|---|
10c5a842 BA |
1 | /* |
2 | * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. | |
3 | * Copyright (c) 2014, Sony Mobile Communications AB. | |
4 | * | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 and | |
8 | * only version 2 as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | */ | |
16 | ||
9cedf3b2 | 17 | #include <linux/atomic.h> |
10c5a842 BA |
18 | #include <linux/clk.h> |
19 | #include <linux/delay.h> | |
9cedf3b2 S |
20 | #include <linux/dmaengine.h> |
21 | #include <linux/dmapool.h> | |
22 | #include <linux/dma-mapping.h> | |
10c5a842 BA |
23 | #include <linux/err.h> |
24 | #include <linux/i2c.h> | |
25 | #include <linux/interrupt.h> | |
26 | #include <linux/io.h> | |
27 | #include <linux/module.h> | |
28 | #include <linux/of.h> | |
29 | #include <linux/platform_device.h> | |
30 | #include <linux/pm_runtime.h> | |
9cedf3b2 | 31 | #include <linux/scatterlist.h> |
10c5a842 BA |
32 | |
33 | /* QUP Registers */ | |
34 | #define QUP_CONFIG 0x000 | |
35 | #define QUP_STATE 0x004 | |
36 | #define QUP_IO_MODE 0x008 | |
37 | #define QUP_SW_RESET 0x00c | |
38 | #define QUP_OPERATIONAL 0x018 | |
39 | #define QUP_ERROR_FLAGS 0x01c | |
40 | #define QUP_ERROR_FLAGS_EN 0x020 | |
9cedf3b2 | 41 | #define QUP_OPERATIONAL_MASK 0x028 |
10c5a842 BA |
42 | #define QUP_HW_VERSION 0x030 |
43 | #define QUP_MX_OUTPUT_CNT 0x100 | |
44 | #define QUP_OUT_FIFO_BASE 0x110 | |
45 | #define QUP_MX_WRITE_CNT 0x150 | |
46 | #define QUP_MX_INPUT_CNT 0x200 | |
47 | #define QUP_MX_READ_CNT 0x208 | |
48 | #define QUP_IN_FIFO_BASE 0x218 | |
49 | #define QUP_I2C_CLK_CTL 0x400 | |
50 | #define QUP_I2C_STATUS 0x404 | |
191424bb | 51 | #define QUP_I2C_MASTER_GEN 0x408 |
10c5a842 BA |
52 | |
53 | /* QUP States and reset values */ | |
54 | #define QUP_RESET_STATE 0 | |
55 | #define QUP_RUN_STATE 1 | |
56 | #define QUP_PAUSE_STATE 3 | |
57 | #define QUP_STATE_MASK 3 | |
58 | ||
59 | #define QUP_STATE_VALID BIT(2) | |
60 | #define QUP_I2C_MAST_GEN BIT(4) | |
9cedf3b2 | 61 | #define QUP_I2C_FLUSH BIT(6) |
10c5a842 BA |
62 | |
63 | #define QUP_OPERATIONAL_RESET 0x000ff0 | |
64 | #define QUP_I2C_STATUS_RESET 0xfffffc | |
65 | ||
66 | /* QUP OPERATIONAL FLAGS */ | |
67 | #define QUP_I2C_NACK_FLAG BIT(3) | |
68 | #define QUP_OUT_NOT_EMPTY BIT(4) | |
69 | #define QUP_IN_NOT_EMPTY BIT(5) | |
70 | #define QUP_OUT_FULL BIT(6) | |
71 | #define QUP_OUT_SVC_FLAG BIT(8) | |
72 | #define QUP_IN_SVC_FLAG BIT(9) | |
73 | #define QUP_MX_OUTPUT_DONE BIT(10) | |
74 | #define QUP_MX_INPUT_DONE BIT(11) | |
75 | ||
76 | /* I2C mini core related values */ | |
77 | #define QUP_CLOCK_AUTO_GATE BIT(13) | |
78 | #define I2C_MINI_CORE (2 << 8) | |
79 | #define I2C_N_VAL 15 | |
191424bb S |
80 | #define I2C_N_VAL_V2 7 |
81 | ||
10c5a842 BA |
82 | /* Most significant word offset in FIFO port */ |
83 | #define QUP_MSW_SHIFT (I2C_N_VAL + 1) | |
84 | ||
85 | /* Packing/Unpacking words in FIFOs, and IO modes */ | |
86 | #define QUP_OUTPUT_BLK_MODE (1 << 10) | |
9cedf3b2 | 87 | #define QUP_OUTPUT_BAM_MODE (3 << 10) |
10c5a842 | 88 | #define QUP_INPUT_BLK_MODE (1 << 12) |
9cedf3b2 S |
89 | #define QUP_INPUT_BAM_MODE (3 << 12) |
90 | #define QUP_BAM_MODE (QUP_OUTPUT_BAM_MODE | QUP_INPUT_BAM_MODE) | |
10c5a842 BA |
91 | #define QUP_UNPACK_EN BIT(14) |
92 | #define QUP_PACK_EN BIT(15) | |
93 | ||
94 | #define QUP_REPACK_EN (QUP_UNPACK_EN | QUP_PACK_EN) | |
191424bb | 95 | #define QUP_V2_TAGS_EN 1 |
10c5a842 BA |
96 | |
97 | #define QUP_OUTPUT_BLOCK_SIZE(x)(((x) >> 0) & 0x03) | |
98 | #define QUP_OUTPUT_FIFO_SIZE(x) (((x) >> 2) & 0x07) | |
99 | #define QUP_INPUT_BLOCK_SIZE(x) (((x) >> 5) & 0x03) | |
100 | #define QUP_INPUT_FIFO_SIZE(x) (((x) >> 7) & 0x07) | |
101 | ||
102 | /* QUP tags */ | |
103 | #define QUP_TAG_START (1 << 8) | |
104 | #define QUP_TAG_DATA (2 << 8) | |
105 | #define QUP_TAG_STOP (3 << 8) | |
106 | #define QUP_TAG_REC (4 << 8) | |
9cedf3b2 S |
107 | #define QUP_BAM_INPUT_EOT 0x93 |
108 | #define QUP_BAM_FLUSH_STOP 0x96 | |
10c5a842 | 109 | |
191424bb S |
110 | /* QUP v2 tags */ |
111 | #define QUP_TAG_V2_START 0x81 | |
112 | #define QUP_TAG_V2_DATAWR 0x82 | |
113 | #define QUP_TAG_V2_DATAWR_STOP 0x83 | |
114 | #define QUP_TAG_V2_DATARD 0x85 | |
115 | #define QUP_TAG_V2_DATARD_STOP 0x87 | |
116 | ||
10c5a842 BA |
117 | /* Status, Error flags */ |
118 | #define I2C_STATUS_WR_BUFFER_FULL BIT(0) | |
119 | #define I2C_STATUS_BUS_ACTIVE BIT(8) | |
120 | #define I2C_STATUS_ERROR_MASK 0x38000fc | |
121 | #define QUP_STATUS_ERROR_FLAGS 0x7c | |
122 | ||
123 | #define QUP_READ_LIMIT 256 | |
c4f0c5fb S |
124 | #define SET_BIT 0x1 |
125 | #define RESET_BIT 0x0 | |
126 | #define ONE_BYTE 0x1 | |
f7418793 | 127 | #define QUP_I2C_MX_CONFIG_DURING_RUN BIT(31) |
10c5a842 | 128 | |
9cedf3b2 S |
129 | #define MX_TX_RX_LEN SZ_64K |
130 | #define MX_BLOCKS (MX_TX_RX_LEN / QUP_READ_LIMIT) | |
131 | ||
132 | /* Max timeout in ms for 32k bytes */ | |
133 | #define TOUT_MAX 300 | |
134 | ||
191424bb S |
135 | struct qup_i2c_block { |
136 | int count; | |
137 | int pos; | |
138 | int tx_tag_len; | |
139 | int rx_tag_len; | |
140 | int data_len; | |
141 | u8 tags[6]; | |
142 | }; | |
143 | ||
9cedf3b2 S |
144 | struct qup_i2c_tag { |
145 | u8 *start; | |
146 | dma_addr_t addr; | |
147 | }; | |
148 | ||
149 | struct qup_i2c_bam { | |
150 | struct qup_i2c_tag tag; | |
151 | struct dma_chan *dma; | |
152 | struct scatterlist *sg; | |
153 | }; | |
154 | ||
10c5a842 BA |
155 | struct qup_i2c_dev { |
156 | struct device *dev; | |
157 | void __iomem *base; | |
158 | int irq; | |
159 | struct clk *clk; | |
160 | struct clk *pclk; | |
161 | struct i2c_adapter adap; | |
162 | ||
163 | int clk_ctl; | |
164 | int out_fifo_sz; | |
165 | int in_fifo_sz; | |
166 | int out_blk_sz; | |
167 | int in_blk_sz; | |
168 | ||
169 | unsigned long one_byte_t; | |
191424bb | 170 | struct qup_i2c_block blk; |
10c5a842 BA |
171 | |
172 | struct i2c_msg *msg; | |
173 | /* Current posion in user message buffer */ | |
174 | int pos; | |
175 | /* I2C protocol errors */ | |
176 | u32 bus_err; | |
177 | /* QUP core errors */ | |
178 | u32 qup_err; | |
179 | ||
f7418793 S |
180 | /* To check if this is the last msg */ |
181 | bool is_last; | |
182 | ||
183 | /* To configure when bus is in run state */ | |
184 | int config_run; | |
185 | ||
9cedf3b2 S |
186 | /* dma parameters */ |
187 | bool is_dma; | |
188 | struct dma_pool *dpool; | |
189 | struct qup_i2c_tag start_tag; | |
190 | struct qup_i2c_bam brx; | |
191 | struct qup_i2c_bam btx; | |
192 | ||
10c5a842 BA |
193 | struct completion xfer; |
194 | }; | |
195 | ||
196 | static irqreturn_t qup_i2c_interrupt(int irq, void *dev) | |
197 | { | |
198 | struct qup_i2c_dev *qup = dev; | |
199 | u32 bus_err; | |
200 | u32 qup_err; | |
201 | u32 opflags; | |
202 | ||
203 | bus_err = readl(qup->base + QUP_I2C_STATUS); | |
204 | qup_err = readl(qup->base + QUP_ERROR_FLAGS); | |
205 | opflags = readl(qup->base + QUP_OPERATIONAL); | |
206 | ||
207 | if (!qup->msg) { | |
208 | /* Clear Error interrupt */ | |
209 | writel(QUP_RESET_STATE, qup->base + QUP_STATE); | |
210 | return IRQ_HANDLED; | |
211 | } | |
212 | ||
213 | bus_err &= I2C_STATUS_ERROR_MASK; | |
214 | qup_err &= QUP_STATUS_ERROR_FLAGS; | |
215 | ||
216 | if (qup_err) { | |
217 | /* Clear Error interrupt */ | |
218 | writel(qup_err, qup->base + QUP_ERROR_FLAGS); | |
219 | goto done; | |
220 | } | |
221 | ||
222 | if (bus_err) { | |
223 | /* Clear Error interrupt */ | |
224 | writel(QUP_RESET_STATE, qup->base + QUP_STATE); | |
225 | goto done; | |
226 | } | |
227 | ||
228 | if (opflags & QUP_IN_SVC_FLAG) | |
229 | writel(QUP_IN_SVC_FLAG, qup->base + QUP_OPERATIONAL); | |
230 | ||
231 | if (opflags & QUP_OUT_SVC_FLAG) | |
232 | writel(QUP_OUT_SVC_FLAG, qup->base + QUP_OPERATIONAL); | |
233 | ||
234 | done: | |
235 | qup->qup_err = qup_err; | |
236 | qup->bus_err = bus_err; | |
237 | complete(&qup->xfer); | |
238 | return IRQ_HANDLED; | |
239 | } | |
240 | ||
241 | static int qup_i2c_poll_state_mask(struct qup_i2c_dev *qup, | |
242 | u32 req_state, u32 req_mask) | |
243 | { | |
244 | int retries = 1; | |
245 | u32 state; | |
246 | ||
247 | /* | |
248 | * State transition takes 3 AHB clocks cycles + 3 I2C master clock | |
249 | * cycles. So retry once after a 1uS delay. | |
250 | */ | |
251 | do { | |
252 | state = readl(qup->base + QUP_STATE); | |
253 | ||
254 | if (state & QUP_STATE_VALID && | |
255 | (state & req_mask) == req_state) | |
256 | return 0; | |
257 | ||
258 | udelay(1); | |
259 | } while (retries--); | |
260 | ||
261 | return -ETIMEDOUT; | |
262 | } | |
263 | ||
264 | static int qup_i2c_poll_state(struct qup_i2c_dev *qup, u32 req_state) | |
265 | { | |
266 | return qup_i2c_poll_state_mask(qup, req_state, QUP_STATE_MASK); | |
267 | } | |
268 | ||
9cedf3b2 S |
269 | static void qup_i2c_flush(struct qup_i2c_dev *qup) |
270 | { | |
271 | u32 val = readl(qup->base + QUP_STATE); | |
272 | ||
273 | val |= QUP_I2C_FLUSH; | |
274 | writel(val, qup->base + QUP_STATE); | |
275 | } | |
276 | ||
10c5a842 BA |
277 | static int qup_i2c_poll_state_valid(struct qup_i2c_dev *qup) |
278 | { | |
279 | return qup_i2c_poll_state_mask(qup, 0, 0); | |
280 | } | |
281 | ||
282 | static int qup_i2c_poll_state_i2c_master(struct qup_i2c_dev *qup) | |
283 | { | |
284 | return qup_i2c_poll_state_mask(qup, QUP_I2C_MAST_GEN, QUP_I2C_MAST_GEN); | |
285 | } | |
286 | ||
287 | static int qup_i2c_change_state(struct qup_i2c_dev *qup, u32 state) | |
288 | { | |
289 | if (qup_i2c_poll_state_valid(qup) != 0) | |
290 | return -EIO; | |
291 | ||
292 | writel(state, qup->base + QUP_STATE); | |
293 | ||
294 | if (qup_i2c_poll_state(qup, state) != 0) | |
295 | return -EIO; | |
296 | return 0; | |
297 | } | |
298 | ||
c4f0c5fb S |
299 | /** |
300 | * qup_i2c_wait_ready - wait for a give number of bytes in tx/rx path | |
301 | * @qup: The qup_i2c_dev device | |
302 | * @op: The bit/event to wait on | |
303 | * @val: value of the bit to wait on, 0 or 1 | |
304 | * @len: The length the bytes to be transferred | |
305 | */ | |
306 | static int qup_i2c_wait_ready(struct qup_i2c_dev *qup, int op, bool val, | |
307 | int len) | |
10c5a842 BA |
308 | { |
309 | unsigned long timeout; | |
310 | u32 opflags; | |
311 | u32 status; | |
c4f0c5fb | 312 | u32 shift = __ffs(op); |
10c5a842 | 313 | |
c4f0c5fb S |
314 | len *= qup->one_byte_t; |
315 | /* timeout after a wait of twice the max time */ | |
316 | timeout = jiffies + len * 4; | |
10c5a842 BA |
317 | |
318 | for (;;) { | |
319 | opflags = readl(qup->base + QUP_OPERATIONAL); | |
320 | status = readl(qup->base + QUP_I2C_STATUS); | |
321 | ||
c4f0c5fb | 322 | if (((opflags & op) >> shift) == val) { |
f7418793 | 323 | if ((op == QUP_OUT_NOT_EMPTY) && qup->is_last) { |
c4f0c5fb S |
324 | if (!(status & I2C_STATUS_BUS_ACTIVE)) |
325 | return 0; | |
326 | } else { | |
327 | return 0; | |
328 | } | |
329 | } | |
10c5a842 BA |
330 | |
331 | if (time_after(jiffies, timeout)) | |
332 | return -ETIMEDOUT; | |
333 | ||
c4f0c5fb | 334 | usleep_range(len, len * 2); |
10c5a842 BA |
335 | } |
336 | } | |
337 | ||
191424bb S |
338 | static void qup_i2c_set_write_mode_v2(struct qup_i2c_dev *qup, |
339 | struct i2c_msg *msg) | |
340 | { | |
341 | /* Number of entries to shift out, including the tags */ | |
342 | int total = msg->len + qup->blk.tx_tag_len; | |
343 | ||
f7418793 S |
344 | total |= qup->config_run; |
345 | ||
191424bb S |
346 | if (total < qup->out_fifo_sz) { |
347 | /* FIFO mode */ | |
348 | writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE); | |
349 | writel(total, qup->base + QUP_MX_WRITE_CNT); | |
350 | } else { | |
351 | /* BLOCK mode (transfer data on chunks) */ | |
352 | writel(QUP_OUTPUT_BLK_MODE | QUP_REPACK_EN, | |
353 | qup->base + QUP_IO_MODE); | |
354 | writel(total, qup->base + QUP_MX_OUTPUT_CNT); | |
355 | } | |
356 | } | |
357 | ||
10c5a842 BA |
358 | static void qup_i2c_set_write_mode(struct qup_i2c_dev *qup, struct i2c_msg *msg) |
359 | { | |
360 | /* Number of entries to shift out, including the start */ | |
361 | int total = msg->len + 1; | |
362 | ||
363 | if (total < qup->out_fifo_sz) { | |
364 | /* FIFO mode */ | |
365 | writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE); | |
366 | writel(total, qup->base + QUP_MX_WRITE_CNT); | |
367 | } else { | |
368 | /* BLOCK mode (transfer data on chunks) */ | |
369 | writel(QUP_OUTPUT_BLK_MODE | QUP_REPACK_EN, | |
370 | qup->base + QUP_IO_MODE); | |
371 | writel(total, qup->base + QUP_MX_OUTPUT_CNT); | |
372 | } | |
373 | } | |
374 | ||
c4f0c5fb | 375 | static int qup_i2c_issue_write(struct qup_i2c_dev *qup, struct i2c_msg *msg) |
10c5a842 BA |
376 | { |
377 | u32 addr = msg->addr << 1; | |
378 | u32 qup_tag; | |
10c5a842 BA |
379 | int idx; |
380 | u32 val; | |
c4f0c5fb | 381 | int ret = 0; |
10c5a842 BA |
382 | |
383 | if (qup->pos == 0) { | |
384 | val = QUP_TAG_START | addr; | |
385 | idx = 1; | |
386 | } else { | |
387 | val = 0; | |
388 | idx = 0; | |
389 | } | |
390 | ||
391 | while (qup->pos < msg->len) { | |
392 | /* Check that there's space in the FIFO for our pair */ | |
c4f0c5fb S |
393 | ret = qup_i2c_wait_ready(qup, QUP_OUT_FULL, RESET_BIT, |
394 | 4 * ONE_BYTE); | |
395 | if (ret) | |
396 | return ret; | |
10c5a842 BA |
397 | |
398 | if (qup->pos == msg->len - 1) | |
399 | qup_tag = QUP_TAG_STOP; | |
400 | else | |
401 | qup_tag = QUP_TAG_DATA; | |
402 | ||
403 | if (idx & 1) | |
404 | val |= (qup_tag | msg->buf[qup->pos]) << QUP_MSW_SHIFT; | |
405 | else | |
406 | val = qup_tag | msg->buf[qup->pos]; | |
407 | ||
408 | /* Write out the pair and the last odd value */ | |
409 | if (idx & 1 || qup->pos == msg->len - 1) | |
410 | writel(val, qup->base + QUP_OUT_FIFO_BASE); | |
411 | ||
412 | qup->pos++; | |
413 | idx++; | |
414 | } | |
c4f0c5fb S |
415 | |
416 | return ret; | |
10c5a842 BA |
417 | } |
418 | ||
191424bb S |
419 | static void qup_i2c_set_blk_data(struct qup_i2c_dev *qup, |
420 | struct i2c_msg *msg) | |
421 | { | |
422 | memset(&qup->blk, 0, sizeof(qup->blk)); | |
423 | ||
424 | qup->blk.data_len = msg->len; | |
425 | qup->blk.count = (msg->len + QUP_READ_LIMIT - 1) / QUP_READ_LIMIT; | |
426 | ||
427 | /* 4 bytes for first block and 2 writes for rest */ | |
428 | qup->blk.tx_tag_len = 4 + (qup->blk.count - 1) * 2; | |
429 | ||
430 | /* There are 2 tag bytes that are read in to fifo for every block */ | |
431 | if (msg->flags & I2C_M_RD) | |
432 | qup->blk.rx_tag_len = qup->blk.count * 2; | |
433 | } | |
434 | ||
435 | static int qup_i2c_send_data(struct qup_i2c_dev *qup, int tlen, u8 *tbuf, | |
436 | int dlen, u8 *dbuf) | |
437 | { | |
438 | u32 val = 0, idx = 0, pos = 0, i = 0, t; | |
439 | int len = tlen + dlen; | |
440 | u8 *buf = tbuf; | |
441 | int ret = 0; | |
442 | ||
443 | while (len > 0) { | |
444 | ret = qup_i2c_wait_ready(qup, QUP_OUT_FULL, | |
445 | RESET_BIT, 4 * ONE_BYTE); | |
446 | if (ret) { | |
447 | dev_err(qup->dev, "timeout for fifo out full"); | |
448 | return ret; | |
449 | } | |
450 | ||
451 | t = (len >= 4) ? 4 : len; | |
452 | ||
453 | while (idx < t) { | |
454 | if (!i && (pos >= tlen)) { | |
455 | buf = dbuf; | |
456 | pos = 0; | |
457 | i = 1; | |
458 | } | |
459 | val |= buf[pos++] << (idx++ * 8); | |
460 | } | |
461 | ||
462 | writel(val, qup->base + QUP_OUT_FIFO_BASE); | |
463 | idx = 0; | |
464 | val = 0; | |
465 | len -= 4; | |
466 | } | |
467 | ||
468 | return ret; | |
469 | } | |
470 | ||
471 | static int qup_i2c_get_data_len(struct qup_i2c_dev *qup) | |
472 | { | |
473 | int data_len; | |
474 | ||
475 | if (qup->blk.data_len > QUP_READ_LIMIT) | |
476 | data_len = QUP_READ_LIMIT; | |
477 | else | |
478 | data_len = qup->blk.data_len; | |
479 | ||
480 | return data_len; | |
481 | } | |
482 | ||
483 | static int qup_i2c_set_tags(u8 *tags, struct qup_i2c_dev *qup, | |
9cedf3b2 | 484 | struct i2c_msg *msg, int is_dma) |
191424bb S |
485 | { |
486 | u16 addr = (msg->addr << 1) | ((msg->flags & I2C_M_RD) == I2C_M_RD); | |
487 | int len = 0; | |
488 | int data_len; | |
489 | ||
9cedf3b2 S |
490 | int last = (qup->blk.pos == (qup->blk.count - 1)) && (qup->is_last); |
491 | ||
191424bb S |
492 | if (qup->blk.pos == 0) { |
493 | tags[len++] = QUP_TAG_V2_START; | |
494 | tags[len++] = addr & 0xff; | |
495 | ||
496 | if (msg->flags & I2C_M_TEN) | |
497 | tags[len++] = addr >> 8; | |
498 | } | |
499 | ||
500 | /* Send _STOP commands for the last block */ | |
9cedf3b2 | 501 | if (last) { |
191424bb S |
502 | if (msg->flags & I2C_M_RD) |
503 | tags[len++] = QUP_TAG_V2_DATARD_STOP; | |
504 | else | |
505 | tags[len++] = QUP_TAG_V2_DATAWR_STOP; | |
506 | } else { | |
507 | if (msg->flags & I2C_M_RD) | |
508 | tags[len++] = QUP_TAG_V2_DATARD; | |
509 | else | |
510 | tags[len++] = QUP_TAG_V2_DATAWR; | |
511 | } | |
512 | ||
513 | data_len = qup_i2c_get_data_len(qup); | |
514 | ||
515 | /* 0 implies 256 bytes */ | |
516 | if (data_len == QUP_READ_LIMIT) | |
517 | tags[len++] = 0; | |
518 | else | |
519 | tags[len++] = data_len; | |
520 | ||
9cedf3b2 S |
521 | if ((msg->flags & I2C_M_RD) && last && is_dma) { |
522 | tags[len++] = QUP_BAM_INPUT_EOT; | |
523 | tags[len++] = QUP_BAM_FLUSH_STOP; | |
524 | } | |
525 | ||
191424bb S |
526 | return len; |
527 | } | |
528 | ||
529 | static int qup_i2c_issue_xfer_v2(struct qup_i2c_dev *qup, struct i2c_msg *msg) | |
530 | { | |
531 | int data_len = 0, tag_len, index; | |
532 | int ret; | |
533 | ||
9cedf3b2 | 534 | tag_len = qup_i2c_set_tags(qup->blk.tags, qup, msg, 0); |
191424bb S |
535 | index = msg->len - qup->blk.data_len; |
536 | ||
537 | /* only tags are written for read */ | |
538 | if (!(msg->flags & I2C_M_RD)) | |
539 | data_len = qup_i2c_get_data_len(qup); | |
540 | ||
541 | ret = qup_i2c_send_data(qup, tag_len, qup->blk.tags, | |
542 | data_len, &msg->buf[index]); | |
543 | qup->blk.data_len -= data_len; | |
544 | ||
545 | return ret; | |
546 | } | |
547 | ||
9cedf3b2 S |
548 | static void qup_i2c_bam_cb(void *data) |
549 | { | |
550 | struct qup_i2c_dev *qup = data; | |
551 | ||
552 | complete(&qup->xfer); | |
553 | } | |
554 | ||
555 | static int qup_sg_set_buf(struct scatterlist *sg, void *buf, | |
556 | struct qup_i2c_tag *tg, unsigned int buflen, | |
557 | struct qup_i2c_dev *qup, int map, int dir) | |
558 | { | |
559 | int ret; | |
560 | ||
561 | sg_set_buf(sg, buf, buflen); | |
562 | ret = dma_map_sg(qup->dev, sg, 1, dir); | |
563 | if (!ret) | |
564 | return -EINVAL; | |
565 | ||
566 | if (!map) | |
567 | sg_dma_address(sg) = tg->addr + ((u8 *)buf - tg->start); | |
568 | ||
569 | return 0; | |
570 | } | |
571 | ||
572 | static void qup_i2c_rel_dma(struct qup_i2c_dev *qup) | |
573 | { | |
574 | if (qup->btx.dma) | |
575 | dma_release_channel(qup->btx.dma); | |
576 | if (qup->brx.dma) | |
577 | dma_release_channel(qup->brx.dma); | |
578 | qup->btx.dma = NULL; | |
579 | qup->brx.dma = NULL; | |
580 | } | |
581 | ||
582 | static int qup_i2c_req_dma(struct qup_i2c_dev *qup) | |
583 | { | |
584 | int err; | |
585 | ||
586 | if (!qup->btx.dma) { | |
587 | qup->btx.dma = dma_request_slave_channel_reason(qup->dev, "tx"); | |
588 | if (IS_ERR(qup->btx.dma)) { | |
589 | err = PTR_ERR(qup->btx.dma); | |
590 | qup->btx.dma = NULL; | |
591 | dev_err(qup->dev, "\n tx channel not available"); | |
592 | return err; | |
593 | } | |
594 | } | |
595 | ||
596 | if (!qup->brx.dma) { | |
597 | qup->brx.dma = dma_request_slave_channel_reason(qup->dev, "rx"); | |
598 | if (IS_ERR(qup->brx.dma)) { | |
599 | dev_err(qup->dev, "\n rx channel not available"); | |
600 | err = PTR_ERR(qup->brx.dma); | |
601 | qup->brx.dma = NULL; | |
602 | qup_i2c_rel_dma(qup); | |
603 | return err; | |
604 | } | |
605 | } | |
606 | return 0; | |
607 | } | |
608 | ||
609 | static int qup_i2c_bam_do_xfer(struct qup_i2c_dev *qup, struct i2c_msg *msg, | |
610 | int num) | |
611 | { | |
612 | struct dma_async_tx_descriptor *txd, *rxd = NULL; | |
613 | int ret = 0, idx = 0, limit = QUP_READ_LIMIT; | |
614 | dma_cookie_t cookie_rx, cookie_tx; | |
615 | u32 rx_nents = 0, tx_nents = 0, len, blocks, rem; | |
616 | u32 i, tlen, tx_len, tx_buf = 0, rx_buf = 0, off = 0; | |
617 | u8 *tags; | |
618 | ||
619 | while (idx < num) { | |
620 | blocks = (msg->len + limit) / limit; | |
621 | rem = msg->len % limit; | |
622 | tx_len = 0, len = 0, i = 0; | |
623 | ||
624 | qup->is_last = (idx == (num - 1)); | |
625 | ||
626 | qup_i2c_set_blk_data(qup, msg); | |
627 | ||
628 | if (msg->flags & I2C_M_RD) { | |
629 | rx_nents += (blocks * 2) + 1; | |
630 | tx_nents += 1; | |
631 | ||
632 | while (qup->blk.pos < blocks) { | |
633 | /* length set to '0' implies 256 bytes */ | |
634 | tlen = (i == (blocks - 1)) ? rem : 0; | |
635 | tags = &qup->start_tag.start[off + len]; | |
636 | len += qup_i2c_set_tags(tags, qup, msg, 1); | |
637 | ||
638 | /* scratch buf to read the start and len tags */ | |
639 | ret = qup_sg_set_buf(&qup->brx.sg[rx_buf++], | |
640 | &qup->brx.tag.start[0], | |
641 | &qup->brx.tag, | |
642 | 2, qup, 0, 0); | |
643 | ||
644 | if (ret) | |
645 | return ret; | |
646 | ||
647 | ret = qup_sg_set_buf(&qup->brx.sg[rx_buf++], | |
648 | &msg->buf[limit * i], | |
649 | NULL, tlen, qup, | |
650 | 1, DMA_FROM_DEVICE); | |
651 | if (ret) | |
652 | return ret; | |
653 | ||
654 | i++; | |
655 | qup->blk.pos = i; | |
656 | } | |
657 | ret = qup_sg_set_buf(&qup->btx.sg[tx_buf++], | |
658 | &qup->start_tag.start[off], | |
659 | &qup->start_tag, len, qup, 0, 0); | |
660 | if (ret) | |
661 | return ret; | |
662 | ||
663 | off += len; | |
664 | /* scratch buf to read the BAM EOT and FLUSH tags */ | |
665 | ret = qup_sg_set_buf(&qup->brx.sg[rx_buf++], | |
666 | &qup->brx.tag.start[0], | |
667 | &qup->brx.tag, 2, | |
668 | qup, 0, 0); | |
669 | if (ret) | |
670 | return ret; | |
671 | } else { | |
672 | tx_nents += (blocks * 2); | |
673 | ||
674 | while (qup->blk.pos < blocks) { | |
675 | tlen = (i == (blocks - 1)) ? rem : 0; | |
676 | tags = &qup->start_tag.start[off + tx_len]; | |
677 | len = qup_i2c_set_tags(tags, qup, msg, 1); | |
678 | ||
679 | ret = qup_sg_set_buf(&qup->btx.sg[tx_buf++], | |
680 | tags, | |
681 | &qup->start_tag, len, | |
682 | qup, 0, 0); | |
683 | if (ret) | |
684 | return ret; | |
685 | ||
686 | tx_len += len; | |
687 | ret = qup_sg_set_buf(&qup->btx.sg[tx_buf++], | |
688 | &msg->buf[limit * i], | |
689 | NULL, tlen, qup, 1, | |
690 | DMA_TO_DEVICE); | |
691 | if (ret) | |
692 | return ret; | |
693 | i++; | |
694 | qup->blk.pos = i; | |
695 | } | |
696 | off += tx_len; | |
697 | ||
698 | if (idx == (num - 1)) { | |
699 | len = 1; | |
700 | if (rx_nents) { | |
701 | qup->btx.tag.start[0] = | |
702 | QUP_BAM_INPUT_EOT; | |
703 | len++; | |
704 | } | |
705 | qup->btx.tag.start[len - 1] = | |
706 | QUP_BAM_FLUSH_STOP; | |
707 | ret = qup_sg_set_buf(&qup->btx.sg[tx_buf++], | |
708 | &qup->btx.tag.start[0], | |
709 | &qup->btx.tag, len, | |
710 | qup, 0, 0); | |
711 | if (ret) | |
712 | return ret; | |
713 | tx_nents += 1; | |
714 | } | |
715 | } | |
716 | idx++; | |
717 | msg++; | |
718 | } | |
719 | ||
720 | txd = dmaengine_prep_slave_sg(qup->btx.dma, qup->btx.sg, tx_nents, | |
721 | DMA_MEM_TO_DEV, | |
722 | DMA_PREP_INTERRUPT | DMA_PREP_FENCE); | |
723 | if (!txd) { | |
724 | dev_err(qup->dev, "failed to get tx desc\n"); | |
725 | ret = -EINVAL; | |
726 | goto desc_err; | |
727 | } | |
728 | ||
729 | if (!rx_nents) { | |
730 | txd->callback = qup_i2c_bam_cb; | |
731 | txd->callback_param = qup; | |
732 | } | |
733 | ||
734 | cookie_tx = dmaengine_submit(txd); | |
735 | if (dma_submit_error(cookie_tx)) { | |
736 | ret = -EINVAL; | |
737 | goto desc_err; | |
738 | } | |
739 | ||
740 | dma_async_issue_pending(qup->btx.dma); | |
741 | ||
742 | if (rx_nents) { | |
743 | rxd = dmaengine_prep_slave_sg(qup->brx.dma, qup->brx.sg, | |
744 | rx_nents, DMA_DEV_TO_MEM, | |
745 | DMA_PREP_INTERRUPT); | |
746 | if (!rxd) { | |
747 | dev_err(qup->dev, "failed to get rx desc\n"); | |
748 | ret = -EINVAL; | |
749 | ||
750 | /* abort TX descriptors */ | |
751 | dmaengine_terminate_all(qup->btx.dma); | |
752 | goto desc_err; | |
753 | } | |
754 | ||
755 | rxd->callback = qup_i2c_bam_cb; | |
756 | rxd->callback_param = qup; | |
757 | cookie_rx = dmaengine_submit(rxd); | |
758 | if (dma_submit_error(cookie_rx)) { | |
759 | ret = -EINVAL; | |
760 | goto desc_err; | |
761 | } | |
762 | ||
763 | dma_async_issue_pending(qup->brx.dma); | |
764 | } | |
765 | ||
766 | if (!wait_for_completion_timeout(&qup->xfer, TOUT_MAX * HZ)) { | |
767 | dev_err(qup->dev, "normal trans timed out\n"); | |
768 | ret = -ETIMEDOUT; | |
769 | } | |
770 | ||
771 | if (ret || qup->bus_err || qup->qup_err) { | |
772 | if (qup->bus_err & QUP_I2C_NACK_FLAG) { | |
773 | msg--; | |
774 | dev_err(qup->dev, "NACK from %x\n", msg->addr); | |
775 | ret = -EIO; | |
776 | ||
777 | if (qup_i2c_change_state(qup, QUP_RUN_STATE)) { | |
778 | dev_err(qup->dev, "change to run state timed out"); | |
779 | return ret; | |
780 | } | |
781 | ||
782 | if (rx_nents) | |
783 | writel(QUP_BAM_INPUT_EOT, | |
784 | qup->base + QUP_OUT_FIFO_BASE); | |
785 | ||
786 | writel(QUP_BAM_FLUSH_STOP, | |
787 | qup->base + QUP_OUT_FIFO_BASE); | |
788 | ||
789 | qup_i2c_flush(qup); | |
790 | ||
791 | /* wait for remaining interrupts to occur */ | |
792 | if (!wait_for_completion_timeout(&qup->xfer, HZ)) | |
793 | dev_err(qup->dev, "flush timed out\n"); | |
794 | ||
795 | qup_i2c_rel_dma(qup); | |
796 | } | |
797 | } | |
798 | ||
799 | dma_unmap_sg(qup->dev, qup->btx.sg, tx_nents, DMA_TO_DEVICE); | |
800 | ||
801 | if (rx_nents) | |
802 | dma_unmap_sg(qup->dev, qup->brx.sg, rx_nents, | |
803 | DMA_FROM_DEVICE); | |
804 | desc_err: | |
805 | return ret; | |
806 | } | |
807 | ||
808 | static int qup_i2c_bam_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, | |
809 | int num) | |
810 | { | |
811 | struct qup_i2c_dev *qup = i2c_get_adapdata(adap); | |
812 | int ret = 0; | |
813 | ||
814 | enable_irq(qup->irq); | |
815 | ret = qup_i2c_req_dma(qup); | |
816 | ||
817 | if (ret) | |
818 | goto out; | |
819 | ||
820 | qup->bus_err = 0; | |
821 | qup->qup_err = 0; | |
822 | ||
823 | writel(0, qup->base + QUP_MX_INPUT_CNT); | |
824 | writel(0, qup->base + QUP_MX_OUTPUT_CNT); | |
825 | ||
826 | /* set BAM mode */ | |
827 | writel(QUP_REPACK_EN | QUP_BAM_MODE, qup->base + QUP_IO_MODE); | |
828 | ||
829 | /* mask fifo irqs */ | |
830 | writel((0x3 << 8), qup->base + QUP_OPERATIONAL_MASK); | |
831 | ||
832 | /* set RUN STATE */ | |
833 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
834 | if (ret) | |
835 | goto out; | |
836 | ||
837 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | |
838 | ||
839 | qup->msg = msg; | |
840 | ret = qup_i2c_bam_do_xfer(qup, qup->msg, num); | |
841 | out: | |
842 | disable_irq(qup->irq); | |
843 | ||
844 | qup->msg = NULL; | |
845 | return ret; | |
846 | } | |
847 | ||
191424bb S |
848 | static int qup_i2c_wait_for_complete(struct qup_i2c_dev *qup, |
849 | struct i2c_msg *msg) | |
10c5a842 BA |
850 | { |
851 | unsigned long left; | |
191424bb S |
852 | int ret = 0; |
853 | ||
854 | left = wait_for_completion_timeout(&qup->xfer, HZ); | |
855 | if (!left) { | |
856 | writel(1, qup->base + QUP_SW_RESET); | |
857 | ret = -ETIMEDOUT; | |
858 | } | |
859 | ||
860 | if (qup->bus_err || qup->qup_err) { | |
861 | if (qup->bus_err & QUP_I2C_NACK_FLAG) { | |
862 | dev_err(qup->dev, "NACK from %x\n", msg->addr); | |
863 | ret = -EIO; | |
864 | } | |
865 | } | |
866 | ||
867 | return ret; | |
868 | } | |
869 | ||
870 | static int qup_i2c_write_one_v2(struct qup_i2c_dev *qup, struct i2c_msg *msg) | |
871 | { | |
872 | int ret = 0; | |
873 | ||
874 | qup->msg = msg; | |
875 | qup->pos = 0; | |
876 | enable_irq(qup->irq); | |
877 | qup_i2c_set_blk_data(qup, msg); | |
878 | qup_i2c_set_write_mode_v2(qup, msg); | |
879 | ||
880 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
881 | if (ret) | |
882 | goto err; | |
883 | ||
884 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | |
885 | ||
886 | do { | |
887 | ret = qup_i2c_issue_xfer_v2(qup, msg); | |
888 | if (ret) | |
889 | goto err; | |
890 | ||
891 | ret = qup_i2c_wait_for_complete(qup, msg); | |
892 | if (ret) | |
893 | goto err; | |
894 | ||
895 | qup->blk.pos++; | |
896 | } while (qup->blk.pos < qup->blk.count); | |
897 | ||
898 | ret = qup_i2c_wait_ready(qup, QUP_OUT_NOT_EMPTY, RESET_BIT, ONE_BYTE); | |
899 | ||
900 | err: | |
901 | disable_irq(qup->irq); | |
902 | qup->msg = NULL; | |
903 | ||
904 | return ret; | |
905 | } | |
906 | ||
907 | static int qup_i2c_write_one(struct qup_i2c_dev *qup, struct i2c_msg *msg) | |
908 | { | |
10c5a842 BA |
909 | int ret; |
910 | ||
911 | qup->msg = msg; | |
912 | qup->pos = 0; | |
913 | ||
914 | enable_irq(qup->irq); | |
915 | ||
916 | qup_i2c_set_write_mode(qup, msg); | |
917 | ||
918 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
919 | if (ret) | |
920 | goto err; | |
921 | ||
922 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | |
923 | ||
924 | do { | |
925 | ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE); | |
926 | if (ret) | |
927 | goto err; | |
928 | ||
c4f0c5fb S |
929 | ret = qup_i2c_issue_write(qup, msg); |
930 | if (ret) | |
931 | goto err; | |
10c5a842 BA |
932 | |
933 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
934 | if (ret) | |
935 | goto err; | |
936 | ||
191424bb S |
937 | ret = qup_i2c_wait_for_complete(qup, msg); |
938 | if (ret) | |
10c5a842 | 939 | goto err; |
10c5a842 BA |
940 | } while (qup->pos < msg->len); |
941 | ||
942 | /* Wait for the outstanding data in the fifo to drain */ | |
c4f0c5fb | 943 | ret = qup_i2c_wait_ready(qup, QUP_OUT_NOT_EMPTY, RESET_BIT, ONE_BYTE); |
10c5a842 BA |
944 | err: |
945 | disable_irq(qup->irq); | |
946 | qup->msg = NULL; | |
947 | ||
948 | return ret; | |
949 | } | |
950 | ||
951 | static void qup_i2c_set_read_mode(struct qup_i2c_dev *qup, int len) | |
952 | { | |
953 | if (len < qup->in_fifo_sz) { | |
954 | /* FIFO mode */ | |
955 | writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE); | |
956 | writel(len, qup->base + QUP_MX_READ_CNT); | |
957 | } else { | |
958 | /* BLOCK mode (transfer data on chunks) */ | |
959 | writel(QUP_INPUT_BLK_MODE | QUP_REPACK_EN, | |
960 | qup->base + QUP_IO_MODE); | |
961 | writel(len, qup->base + QUP_MX_INPUT_CNT); | |
962 | } | |
963 | } | |
964 | ||
191424bb S |
965 | static void qup_i2c_set_read_mode_v2(struct qup_i2c_dev *qup, int len) |
966 | { | |
967 | int tx_len = qup->blk.tx_tag_len; | |
968 | ||
969 | len += qup->blk.rx_tag_len; | |
f7418793 S |
970 | len |= qup->config_run; |
971 | tx_len |= qup->config_run; | |
191424bb S |
972 | |
973 | if (len < qup->in_fifo_sz) { | |
974 | /* FIFO mode */ | |
975 | writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE); | |
191424bb | 976 | writel(tx_len, qup->base + QUP_MX_WRITE_CNT); |
f7418793 | 977 | writel(len, qup->base + QUP_MX_READ_CNT); |
191424bb S |
978 | } else { |
979 | /* BLOCK mode (transfer data on chunks) */ | |
980 | writel(QUP_INPUT_BLK_MODE | QUP_REPACK_EN, | |
981 | qup->base + QUP_IO_MODE); | |
191424bb | 982 | writel(tx_len, qup->base + QUP_MX_OUTPUT_CNT); |
f7418793 | 983 | writel(len, qup->base + QUP_MX_INPUT_CNT); |
191424bb S |
984 | } |
985 | } | |
986 | ||
10c5a842 BA |
987 | static void qup_i2c_issue_read(struct qup_i2c_dev *qup, struct i2c_msg *msg) |
988 | { | |
989 | u32 addr, len, val; | |
990 | ||
991 | addr = (msg->addr << 1) | 1; | |
992 | ||
993 | /* 0 is used to specify a length 256 (QUP_READ_LIMIT) */ | |
994 | len = (msg->len == QUP_READ_LIMIT) ? 0 : msg->len; | |
995 | ||
996 | val = ((QUP_TAG_REC | len) << QUP_MSW_SHIFT) | QUP_TAG_START | addr; | |
997 | writel(val, qup->base + QUP_OUT_FIFO_BASE); | |
998 | } | |
999 | ||
1000 | ||
c4f0c5fb | 1001 | static int qup_i2c_read_fifo(struct qup_i2c_dev *qup, struct i2c_msg *msg) |
10c5a842 | 1002 | { |
10c5a842 BA |
1003 | u32 val = 0; |
1004 | int idx; | |
c4f0c5fb | 1005 | int ret = 0; |
10c5a842 BA |
1006 | |
1007 | for (idx = 0; qup->pos < msg->len; idx++) { | |
1008 | if ((idx & 1) == 0) { | |
1009 | /* Check that FIFO have data */ | |
c4f0c5fb S |
1010 | ret = qup_i2c_wait_ready(qup, QUP_IN_NOT_EMPTY, |
1011 | SET_BIT, 4 * ONE_BYTE); | |
1012 | if (ret) | |
1013 | return ret; | |
10c5a842 BA |
1014 | |
1015 | /* Reading 2 words at time */ | |
1016 | val = readl(qup->base + QUP_IN_FIFO_BASE); | |
1017 | ||
1018 | msg->buf[qup->pos++] = val & 0xFF; | |
1019 | } else { | |
1020 | msg->buf[qup->pos++] = val >> QUP_MSW_SHIFT; | |
1021 | } | |
1022 | } | |
c4f0c5fb S |
1023 | |
1024 | return ret; | |
10c5a842 BA |
1025 | } |
1026 | ||
191424bb S |
1027 | static int qup_i2c_read_fifo_v2(struct qup_i2c_dev *qup, |
1028 | struct i2c_msg *msg) | |
1029 | { | |
1030 | u32 val; | |
1031 | int idx, pos = 0, ret = 0, total; | |
1032 | ||
1033 | total = qup_i2c_get_data_len(qup); | |
1034 | ||
1035 | /* 2 extra bytes for read tags */ | |
1036 | while (pos < (total + 2)) { | |
1037 | /* Check that FIFO have data */ | |
1038 | ret = qup_i2c_wait_ready(qup, QUP_IN_NOT_EMPTY, | |
1039 | SET_BIT, 4 * ONE_BYTE); | |
1040 | if (ret) { | |
1041 | dev_err(qup->dev, "timeout for fifo not empty"); | |
1042 | return ret; | |
1043 | } | |
1044 | val = readl(qup->base + QUP_IN_FIFO_BASE); | |
1045 | ||
1046 | for (idx = 0; idx < 4; idx++, val >>= 8, pos++) { | |
1047 | /* first 2 bytes are tag bytes */ | |
1048 | if (pos < 2) | |
1049 | continue; | |
1050 | ||
1051 | if (pos >= (total + 2)) | |
1052 | goto out; | |
1053 | ||
1054 | msg->buf[qup->pos++] = val & 0xff; | |
1055 | } | |
1056 | } | |
1057 | ||
1058 | out: | |
1059 | qup->blk.data_len -= total; | |
1060 | ||
1061 | return ret; | |
1062 | } | |
1063 | ||
1064 | static int qup_i2c_read_one_v2(struct qup_i2c_dev *qup, struct i2c_msg *msg) | |
1065 | { | |
1066 | int ret = 0; | |
1067 | ||
1068 | qup->msg = msg; | |
1069 | qup->pos = 0; | |
1070 | enable_irq(qup->irq); | |
1071 | qup_i2c_set_blk_data(qup, msg); | |
1072 | qup_i2c_set_read_mode_v2(qup, msg->len); | |
1073 | ||
1074 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
1075 | if (ret) | |
1076 | goto err; | |
1077 | ||
1078 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | |
1079 | ||
1080 | do { | |
1081 | ret = qup_i2c_issue_xfer_v2(qup, msg); | |
1082 | if (ret) | |
1083 | goto err; | |
1084 | ||
1085 | ret = qup_i2c_wait_for_complete(qup, msg); | |
1086 | if (ret) | |
1087 | goto err; | |
1088 | ||
1089 | ret = qup_i2c_read_fifo_v2(qup, msg); | |
1090 | if (ret) | |
1091 | goto err; | |
1092 | ||
1093 | qup->blk.pos++; | |
1094 | } while (qup->blk.pos < qup->blk.count); | |
1095 | ||
1096 | err: | |
1097 | disable_irq(qup->irq); | |
1098 | qup->msg = NULL; | |
1099 | ||
1100 | return ret; | |
1101 | } | |
1102 | ||
10c5a842 BA |
1103 | static int qup_i2c_read_one(struct qup_i2c_dev *qup, struct i2c_msg *msg) |
1104 | { | |
10c5a842 BA |
1105 | int ret; |
1106 | ||
10c5a842 BA |
1107 | qup->msg = msg; |
1108 | qup->pos = 0; | |
1109 | ||
1110 | enable_irq(qup->irq); | |
10c5a842 BA |
1111 | qup_i2c_set_read_mode(qup, msg->len); |
1112 | ||
1113 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
1114 | if (ret) | |
1115 | goto err; | |
1116 | ||
1117 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | |
1118 | ||
1119 | ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE); | |
1120 | if (ret) | |
1121 | goto err; | |
1122 | ||
1123 | qup_i2c_issue_read(qup, msg); | |
1124 | ||
1125 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | |
1126 | if (ret) | |
1127 | goto err; | |
1128 | ||
1129 | do { | |
191424bb S |
1130 | ret = qup_i2c_wait_for_complete(qup, msg); |
1131 | if (ret) | |
10c5a842 | 1132 | goto err; |
10c5a842 | 1133 | |
c4f0c5fb S |
1134 | ret = qup_i2c_read_fifo(qup, msg); |
1135 | if (ret) | |
1136 | goto err; | |
10c5a842 BA |
1137 | } while (qup->pos < msg->len); |
1138 | ||
1139 | err: | |
1140 | disable_irq(qup->irq); | |
1141 | qup->msg = NULL; | |
1142 | ||
1143 | return ret; | |
1144 | } | |
1145 | ||
1146 | static int qup_i2c_xfer(struct i2c_adapter *adap, | |
1147 | struct i2c_msg msgs[], | |
1148 | int num) | |
1149 | { | |
1150 | struct qup_i2c_dev *qup = i2c_get_adapdata(adap); | |
1151 | int ret, idx; | |
1152 | ||
1153 | ret = pm_runtime_get_sync(qup->dev); | |
fa01d096 | 1154 | if (ret < 0) |
10c5a842 BA |
1155 | goto out; |
1156 | ||
1157 | writel(1, qup->base + QUP_SW_RESET); | |
1158 | ret = qup_i2c_poll_state(qup, QUP_RESET_STATE); | |
1159 | if (ret) | |
1160 | goto out; | |
1161 | ||
1162 | /* Configure QUP as I2C mini core */ | |
1163 | writel(I2C_MINI_CORE | I2C_N_VAL, qup->base + QUP_CONFIG); | |
1164 | ||
1165 | for (idx = 0; idx < num; idx++) { | |
1166 | if (msgs[idx].len == 0) { | |
1167 | ret = -EINVAL; | |
1168 | goto out; | |
1169 | } | |
1170 | ||
1171 | if (qup_i2c_poll_state_i2c_master(qup)) { | |
1172 | ret = -EIO; | |
1173 | goto out; | |
1174 | } | |
1175 | ||
1176 | if (msgs[idx].flags & I2C_M_RD) | |
1177 | ret = qup_i2c_read_one(qup, &msgs[idx]); | |
1178 | else | |
1179 | ret = qup_i2c_write_one(qup, &msgs[idx]); | |
1180 | ||
1181 | if (ret) | |
1182 | break; | |
1183 | ||
1184 | ret = qup_i2c_change_state(qup, QUP_RESET_STATE); | |
1185 | if (ret) | |
1186 | break; | |
1187 | } | |
1188 | ||
1189 | if (ret == 0) | |
1190 | ret = num; | |
1191 | out: | |
1192 | ||
1193 | pm_runtime_mark_last_busy(qup->dev); | |
1194 | pm_runtime_put_autosuspend(qup->dev); | |
1195 | ||
1196 | return ret; | |
1197 | } | |
1198 | ||
191424bb S |
1199 | static int qup_i2c_xfer_v2(struct i2c_adapter *adap, |
1200 | struct i2c_msg msgs[], | |
1201 | int num) | |
1202 | { | |
1203 | struct qup_i2c_dev *qup = i2c_get_adapdata(adap); | |
9cedf3b2 | 1204 | int ret, len, idx = 0, use_dma = 0; |
191424bb S |
1205 | |
1206 | ret = pm_runtime_get_sync(qup->dev); | |
1207 | if (ret < 0) | |
1208 | goto out; | |
1209 | ||
1210 | writel(1, qup->base + QUP_SW_RESET); | |
1211 | ret = qup_i2c_poll_state(qup, QUP_RESET_STATE); | |
1212 | if (ret) | |
1213 | goto out; | |
1214 | ||
1215 | /* Configure QUP as I2C mini core */ | |
1216 | writel(I2C_MINI_CORE | I2C_N_VAL_V2, qup->base + QUP_CONFIG); | |
1217 | writel(QUP_V2_TAGS_EN, qup->base + QUP_I2C_MASTER_GEN); | |
1218 | ||
9cedf3b2 S |
1219 | if ((qup->is_dma)) { |
1220 | /* All i2c_msgs should be transferred using either dma or cpu */ | |
1221 | for (idx = 0; idx < num; idx++) { | |
1222 | if (msgs[idx].len == 0) { | |
1223 | ret = -EINVAL; | |
1224 | goto out; | |
1225 | } | |
1226 | ||
1227 | len = (msgs[idx].len > qup->out_fifo_sz) || | |
1228 | (msgs[idx].len > qup->in_fifo_sz); | |
1229 | ||
1230 | if ((!is_vmalloc_addr(msgs[idx].buf)) && len) { | |
1231 | use_dma = 1; | |
1232 | } else { | |
1233 | use_dma = 0; | |
1234 | break; | |
1235 | } | |
1236 | } | |
1237 | } | |
1238 | ||
1239 | do { | |
191424bb S |
1240 | if (msgs[idx].len == 0) { |
1241 | ret = -EINVAL; | |
1242 | goto out; | |
1243 | } | |
1244 | ||
1245 | if (qup_i2c_poll_state_i2c_master(qup)) { | |
1246 | ret = -EIO; | |
1247 | goto out; | |
1248 | } | |
1249 | ||
f7418793 S |
1250 | qup->is_last = (idx == (num - 1)); |
1251 | if (idx) | |
1252 | qup->config_run = QUP_I2C_MX_CONFIG_DURING_RUN; | |
1253 | else | |
1254 | qup->config_run = 0; | |
1255 | ||
191424bb S |
1256 | reinit_completion(&qup->xfer); |
1257 | ||
9cedf3b2 S |
1258 | if (use_dma) { |
1259 | ret = qup_i2c_bam_xfer(adap, &msgs[idx], num); | |
1260 | } else { | |
1261 | if (msgs[idx].flags & I2C_M_RD) | |
1262 | ret = qup_i2c_read_one_v2(qup, &msgs[idx]); | |
1263 | else | |
1264 | ret = qup_i2c_write_one_v2(qup, &msgs[idx]); | |
1265 | } | |
1266 | } while ((idx++ < (num - 1)) && !use_dma && !ret); | |
191424bb | 1267 | |
f7418793 S |
1268 | if (!ret) |
1269 | ret = qup_i2c_change_state(qup, QUP_RESET_STATE); | |
1270 | ||
191424bb S |
1271 | if (ret == 0) |
1272 | ret = num; | |
1273 | out: | |
1274 | pm_runtime_mark_last_busy(qup->dev); | |
1275 | pm_runtime_put_autosuspend(qup->dev); | |
1276 | ||
1277 | return ret; | |
1278 | } | |
1279 | ||
10c5a842 BA |
1280 | static u32 qup_i2c_func(struct i2c_adapter *adap) |
1281 | { | |
1282 | return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); | |
1283 | } | |
1284 | ||
1285 | static const struct i2c_algorithm qup_i2c_algo = { | |
1286 | .master_xfer = qup_i2c_xfer, | |
1287 | .functionality = qup_i2c_func, | |
1288 | }; | |
1289 | ||
191424bb S |
1290 | static const struct i2c_algorithm qup_i2c_algo_v2 = { |
1291 | .master_xfer = qup_i2c_xfer_v2, | |
1292 | .functionality = qup_i2c_func, | |
1293 | }; | |
1294 | ||
994647db WS |
1295 | /* |
1296 | * The QUP block will issue a NACK and STOP on the bus when reaching | |
1297 | * the end of the read, the length of the read is specified as one byte | |
1298 | * which limits the possible read to 256 (QUP_READ_LIMIT) bytes. | |
1299 | */ | |
1300 | static struct i2c_adapter_quirks qup_i2c_quirks = { | |
1301 | .max_read_len = QUP_READ_LIMIT, | |
1302 | }; | |
1303 | ||
10c5a842 BA |
1304 | static void qup_i2c_enable_clocks(struct qup_i2c_dev *qup) |
1305 | { | |
1306 | clk_prepare_enable(qup->clk); | |
1307 | clk_prepare_enable(qup->pclk); | |
1308 | } | |
1309 | ||
1310 | static void qup_i2c_disable_clocks(struct qup_i2c_dev *qup) | |
1311 | { | |
1312 | u32 config; | |
1313 | ||
1314 | qup_i2c_change_state(qup, QUP_RESET_STATE); | |
1315 | clk_disable_unprepare(qup->clk); | |
1316 | config = readl(qup->base + QUP_CONFIG); | |
1317 | config |= QUP_CLOCK_AUTO_GATE; | |
1318 | writel(config, qup->base + QUP_CONFIG); | |
1319 | clk_disable_unprepare(qup->pclk); | |
1320 | } | |
1321 | ||
1322 | static int qup_i2c_probe(struct platform_device *pdev) | |
1323 | { | |
1324 | static const int blk_sizes[] = {4, 16, 32}; | |
1325 | struct device_node *node = pdev->dev.of_node; | |
1326 | struct qup_i2c_dev *qup; | |
1327 | unsigned long one_bit_t; | |
1328 | struct resource *res; | |
1329 | u32 io_mode, hw_ver, size; | |
1330 | int ret, fs_div, hs_div; | |
1331 | int src_clk_freq; | |
cf23e335 | 1332 | u32 clk_freq = 100000; |
9cedf3b2 | 1333 | int blocks; |
10c5a842 BA |
1334 | |
1335 | qup = devm_kzalloc(&pdev->dev, sizeof(*qup), GFP_KERNEL); | |
1336 | if (!qup) | |
1337 | return -ENOMEM; | |
1338 | ||
1339 | qup->dev = &pdev->dev; | |
1340 | init_completion(&qup->xfer); | |
1341 | platform_set_drvdata(pdev, qup); | |
1342 | ||
1343 | of_property_read_u32(node, "clock-frequency", &clk_freq); | |
1344 | ||
191424bb S |
1345 | if (of_device_is_compatible(pdev->dev.of_node, "qcom,i2c-qup-v1.1.1")) { |
1346 | qup->adap.algo = &qup_i2c_algo; | |
1347 | qup->adap.quirks = &qup_i2c_quirks; | |
1348 | } else { | |
1349 | qup->adap.algo = &qup_i2c_algo_v2; | |
9cedf3b2 S |
1350 | ret = qup_i2c_req_dma(qup); |
1351 | ||
1352 | if (ret == -EPROBE_DEFER) | |
1353 | goto fail_dma; | |
1354 | else if (ret != 0) | |
1355 | goto nodma; | |
1356 | ||
1357 | blocks = (MX_BLOCKS << 1) + 1; | |
1358 | qup->btx.sg = devm_kzalloc(&pdev->dev, | |
1359 | sizeof(*qup->btx.sg) * blocks, | |
1360 | GFP_KERNEL); | |
1361 | if (!qup->btx.sg) { | |
1362 | ret = -ENOMEM; | |
1363 | goto fail_dma; | |
1364 | } | |
1365 | sg_init_table(qup->btx.sg, blocks); | |
1366 | ||
1367 | qup->brx.sg = devm_kzalloc(&pdev->dev, | |
1368 | sizeof(*qup->brx.sg) * blocks, | |
1369 | GFP_KERNEL); | |
1370 | if (!qup->brx.sg) { | |
1371 | ret = -ENOMEM; | |
1372 | goto fail_dma; | |
1373 | } | |
1374 | sg_init_table(qup->brx.sg, blocks); | |
1375 | ||
1376 | /* 2 tag bytes for each block + 5 for start, stop tags */ | |
1377 | size = blocks * 2 + 5; | |
1378 | qup->dpool = dma_pool_create("qup_i2c-dma-pool", &pdev->dev, | |
1379 | size, 4, 0); | |
1380 | ||
1381 | qup->start_tag.start = dma_pool_alloc(qup->dpool, GFP_KERNEL, | |
1382 | &qup->start_tag.addr); | |
1383 | if (!qup->start_tag.start) { | |
1384 | ret = -ENOMEM; | |
1385 | goto fail_dma; | |
1386 | } | |
1387 | ||
1388 | qup->brx.tag.start = dma_pool_alloc(qup->dpool, | |
1389 | GFP_KERNEL, | |
1390 | &qup->brx.tag.addr); | |
1391 | if (!qup->brx.tag.start) { | |
1392 | ret = -ENOMEM; | |
1393 | goto fail_dma; | |
1394 | } | |
1395 | ||
1396 | qup->btx.tag.start = dma_pool_alloc(qup->dpool, | |
1397 | GFP_KERNEL, | |
1398 | &qup->btx.tag.addr); | |
1399 | if (!qup->btx.tag.start) { | |
1400 | ret = -ENOMEM; | |
1401 | goto fail_dma; | |
1402 | } | |
1403 | qup->is_dma = true; | |
191424bb S |
1404 | } |
1405 | ||
9cedf3b2 | 1406 | nodma: |
10c5a842 BA |
1407 | /* We support frequencies up to FAST Mode (400KHz) */ |
1408 | if (!clk_freq || clk_freq > 400000) { | |
1409 | dev_err(qup->dev, "clock frequency not supported %d\n", | |
1410 | clk_freq); | |
1411 | return -EINVAL; | |
1412 | } | |
1413 | ||
1414 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
1415 | qup->base = devm_ioremap_resource(qup->dev, res); | |
1416 | if (IS_ERR(qup->base)) | |
1417 | return PTR_ERR(qup->base); | |
1418 | ||
1419 | qup->irq = platform_get_irq(pdev, 0); | |
1420 | if (qup->irq < 0) { | |
1421 | dev_err(qup->dev, "No IRQ defined\n"); | |
1422 | return qup->irq; | |
1423 | } | |
1424 | ||
1425 | qup->clk = devm_clk_get(qup->dev, "core"); | |
1426 | if (IS_ERR(qup->clk)) { | |
1427 | dev_err(qup->dev, "Could not get core clock\n"); | |
1428 | return PTR_ERR(qup->clk); | |
1429 | } | |
1430 | ||
1431 | qup->pclk = devm_clk_get(qup->dev, "iface"); | |
1432 | if (IS_ERR(qup->pclk)) { | |
1433 | dev_err(qup->dev, "Could not get iface clock\n"); | |
1434 | return PTR_ERR(qup->pclk); | |
1435 | } | |
1436 | ||
1437 | qup_i2c_enable_clocks(qup); | |
1438 | ||
1439 | /* | |
1440 | * Bootloaders might leave a pending interrupt on certain QUP's, | |
1441 | * so we reset the core before registering for interrupts. | |
1442 | */ | |
1443 | writel(1, qup->base + QUP_SW_RESET); | |
1444 | ret = qup_i2c_poll_state_valid(qup); | |
1445 | if (ret) | |
1446 | goto fail; | |
1447 | ||
1448 | ret = devm_request_irq(qup->dev, qup->irq, qup_i2c_interrupt, | |
1449 | IRQF_TRIGGER_HIGH, "i2c_qup", qup); | |
1450 | if (ret) { | |
1451 | dev_err(qup->dev, "Request %d IRQ failed\n", qup->irq); | |
1452 | goto fail; | |
1453 | } | |
1454 | disable_irq(qup->irq); | |
1455 | ||
1456 | hw_ver = readl(qup->base + QUP_HW_VERSION); | |
1457 | dev_dbg(qup->dev, "Revision %x\n", hw_ver); | |
1458 | ||
1459 | io_mode = readl(qup->base + QUP_IO_MODE); | |
1460 | ||
1461 | /* | |
1462 | * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag' | |
1463 | * associated with each byte written/received | |
1464 | */ | |
1465 | size = QUP_OUTPUT_BLOCK_SIZE(io_mode); | |
3cf357df PG |
1466 | if (size >= ARRAY_SIZE(blk_sizes)) { |
1467 | ret = -EIO; | |
1468 | goto fail; | |
1469 | } | |
10c5a842 BA |
1470 | qup->out_blk_sz = blk_sizes[size] / 2; |
1471 | ||
1472 | size = QUP_INPUT_BLOCK_SIZE(io_mode); | |
3cf357df PG |
1473 | if (size >= ARRAY_SIZE(blk_sizes)) { |
1474 | ret = -EIO; | |
1475 | goto fail; | |
1476 | } | |
10c5a842 BA |
1477 | qup->in_blk_sz = blk_sizes[size] / 2; |
1478 | ||
1479 | size = QUP_OUTPUT_FIFO_SIZE(io_mode); | |
1480 | qup->out_fifo_sz = qup->out_blk_sz * (2 << size); | |
1481 | ||
1482 | size = QUP_INPUT_FIFO_SIZE(io_mode); | |
1483 | qup->in_fifo_sz = qup->in_blk_sz * (2 << size); | |
1484 | ||
1485 | src_clk_freq = clk_get_rate(qup->clk); | |
1486 | fs_div = ((src_clk_freq / clk_freq) / 2) - 3; | |
1487 | hs_div = 3; | |
1488 | qup->clk_ctl = (hs_div << 8) | (fs_div & 0xff); | |
1489 | ||
1490 | /* | |
1491 | * Time it takes for a byte to be clocked out on the bus. | |
1492 | * Each byte takes 9 clock cycles (8 bits + 1 ack). | |
1493 | */ | |
1494 | one_bit_t = (USEC_PER_SEC / clk_freq) + 1; | |
1495 | qup->one_byte_t = one_bit_t * 9; | |
1496 | ||
1497 | dev_dbg(qup->dev, "IN:block:%d, fifo:%d, OUT:block:%d, fifo:%d\n", | |
1498 | qup->in_blk_sz, qup->in_fifo_sz, | |
1499 | qup->out_blk_sz, qup->out_fifo_sz); | |
1500 | ||
1501 | i2c_set_adapdata(&qup->adap, qup); | |
10c5a842 BA |
1502 | qup->adap.dev.parent = qup->dev; |
1503 | qup->adap.dev.of_node = pdev->dev.of_node; | |
9cedf3b2 | 1504 | qup->is_last = true; |
f7418793 | 1505 | |
10c5a842 BA |
1506 | strlcpy(qup->adap.name, "QUP I2C adapter", sizeof(qup->adap.name)); |
1507 | ||
10c5a842 BA |
1508 | pm_runtime_set_autosuspend_delay(qup->dev, MSEC_PER_SEC); |
1509 | pm_runtime_use_autosuspend(qup->dev); | |
1510 | pm_runtime_set_active(qup->dev); | |
1511 | pm_runtime_enable(qup->dev); | |
86b59bbf AG |
1512 | |
1513 | ret = i2c_add_adapter(&qup->adap); | |
1514 | if (ret) | |
1515 | goto fail_runtime; | |
1516 | ||
10c5a842 BA |
1517 | return 0; |
1518 | ||
86b59bbf AG |
1519 | fail_runtime: |
1520 | pm_runtime_disable(qup->dev); | |
1521 | pm_runtime_set_suspended(qup->dev); | |
10c5a842 BA |
1522 | fail: |
1523 | qup_i2c_disable_clocks(qup); | |
9cedf3b2 S |
1524 | fail_dma: |
1525 | if (qup->btx.dma) | |
1526 | dma_release_channel(qup->btx.dma); | |
1527 | if (qup->brx.dma) | |
1528 | dma_release_channel(qup->brx.dma); | |
10c5a842 BA |
1529 | return ret; |
1530 | } | |
1531 | ||
1532 | static int qup_i2c_remove(struct platform_device *pdev) | |
1533 | { | |
1534 | struct qup_i2c_dev *qup = platform_get_drvdata(pdev); | |
1535 | ||
9cedf3b2 S |
1536 | if (qup->is_dma) { |
1537 | dma_pool_free(qup->dpool, qup->start_tag.start, | |
1538 | qup->start_tag.addr); | |
1539 | dma_pool_free(qup->dpool, qup->brx.tag.start, | |
1540 | qup->brx.tag.addr); | |
1541 | dma_pool_free(qup->dpool, qup->btx.tag.start, | |
1542 | qup->btx.tag.addr); | |
1543 | dma_pool_destroy(qup->dpool); | |
1544 | dma_release_channel(qup->btx.dma); | |
1545 | dma_release_channel(qup->brx.dma); | |
1546 | } | |
1547 | ||
10c5a842 BA |
1548 | disable_irq(qup->irq); |
1549 | qup_i2c_disable_clocks(qup); | |
1550 | i2c_del_adapter(&qup->adap); | |
1551 | pm_runtime_disable(qup->dev); | |
1552 | pm_runtime_set_suspended(qup->dev); | |
1553 | return 0; | |
1554 | } | |
1555 | ||
1556 | #ifdef CONFIG_PM | |
1557 | static int qup_i2c_pm_suspend_runtime(struct device *device) | |
1558 | { | |
1559 | struct qup_i2c_dev *qup = dev_get_drvdata(device); | |
1560 | ||
1561 | dev_dbg(device, "pm_runtime: suspending...\n"); | |
1562 | qup_i2c_disable_clocks(qup); | |
1563 | return 0; | |
1564 | } | |
1565 | ||
1566 | static int qup_i2c_pm_resume_runtime(struct device *device) | |
1567 | { | |
1568 | struct qup_i2c_dev *qup = dev_get_drvdata(device); | |
1569 | ||
1570 | dev_dbg(device, "pm_runtime: resuming...\n"); | |
1571 | qup_i2c_enable_clocks(qup); | |
1572 | return 0; | |
1573 | } | |
1574 | #endif | |
1575 | ||
1576 | #ifdef CONFIG_PM_SLEEP | |
1577 | static int qup_i2c_suspend(struct device *device) | |
1578 | { | |
1579 | qup_i2c_pm_suspend_runtime(device); | |
1580 | return 0; | |
1581 | } | |
1582 | ||
1583 | static int qup_i2c_resume(struct device *device) | |
1584 | { | |
1585 | qup_i2c_pm_resume_runtime(device); | |
1586 | pm_runtime_mark_last_busy(device); | |
1587 | pm_request_autosuspend(device); | |
1588 | return 0; | |
1589 | } | |
1590 | #endif | |
1591 | ||
1592 | static const struct dev_pm_ops qup_i2c_qup_pm_ops = { | |
1593 | SET_SYSTEM_SLEEP_PM_OPS( | |
1594 | qup_i2c_suspend, | |
1595 | qup_i2c_resume) | |
1596 | SET_RUNTIME_PM_OPS( | |
1597 | qup_i2c_pm_suspend_runtime, | |
1598 | qup_i2c_pm_resume_runtime, | |
1599 | NULL) | |
1600 | }; | |
1601 | ||
1602 | static const struct of_device_id qup_i2c_dt_match[] = { | |
1603 | { .compatible = "qcom,i2c-qup-v1.1.1" }, | |
1604 | { .compatible = "qcom,i2c-qup-v2.1.1" }, | |
1605 | { .compatible = "qcom,i2c-qup-v2.2.1" }, | |
1606 | {} | |
1607 | }; | |
1608 | MODULE_DEVICE_TABLE(of, qup_i2c_dt_match); | |
1609 | ||
1610 | static struct platform_driver qup_i2c_driver = { | |
1611 | .probe = qup_i2c_probe, | |
1612 | .remove = qup_i2c_remove, | |
1613 | .driver = { | |
1614 | .name = "i2c_qup", | |
10c5a842 BA |
1615 | .pm = &qup_i2c_qup_pm_ops, |
1616 | .of_match_table = qup_i2c_dt_match, | |
1617 | }, | |
1618 | }; | |
1619 | ||
1620 | module_platform_driver(qup_i2c_driver); | |
1621 | ||
1622 | MODULE_LICENSE("GPL v2"); | |
1623 | MODULE_ALIAS("platform:i2c_qup"); |