blob: d9704589844779138c23664f48b6339676920833 [file] [log] [blame]
Abhishek Sahu0668bc42018-03-12 18:44:50 +05301// SPDX-License-Identifier: GPL-2.0
Bjorn Andersson10c5a842014-03-13 19:07:43 -07002/*
Abhishek Sahu0668bc42018-03-12 18:44:50 +05303 * Copyright (c) 2009-2013, 2016-2018, The Linux Foundation. All rights reserved.
Bjorn Andersson10c5a842014-03-13 19:07:43 -07004 * Copyright (c) 2014, Sony Mobile Communications AB.
5 *
Bjorn Andersson10c5a842014-03-13 19:07:43 -07006 */
7
Naveen Kaje515da742016-10-11 10:27:56 -06008#include <linux/acpi.h>
Sricharan R9cedf3b2016-02-22 17:38:15 +05309#include <linux/atomic.h>
Bjorn Andersson10c5a842014-03-13 19:07:43 -070010#include <linux/clk.h>
11#include <linux/delay.h>
Sricharan R9cedf3b2016-02-22 17:38:15 +053012#include <linux/dmaengine.h>
13#include <linux/dmapool.h>
14#include <linux/dma-mapping.h>
Bjorn Andersson10c5a842014-03-13 19:07:43 -070015#include <linux/err.h>
16#include <linux/i2c.h>
17#include <linux/interrupt.h>
18#include <linux/io.h>
19#include <linux/module.h>
20#include <linux/of.h>
21#include <linux/platform_device.h>
22#include <linux/pm_runtime.h>
Sricharan R9cedf3b2016-02-22 17:38:15 +053023#include <linux/scatterlist.h>
Bjorn Andersson10c5a842014-03-13 19:07:43 -070024
25/* QUP Registers */
26#define QUP_CONFIG 0x000
27#define QUP_STATE 0x004
28#define QUP_IO_MODE 0x008
29#define QUP_SW_RESET 0x00c
30#define QUP_OPERATIONAL 0x018
31#define QUP_ERROR_FLAGS 0x01c
32#define QUP_ERROR_FLAGS_EN 0x020
Sricharan R9cedf3b2016-02-22 17:38:15 +053033#define QUP_OPERATIONAL_MASK 0x028
Bjorn Andersson10c5a842014-03-13 19:07:43 -070034#define QUP_HW_VERSION 0x030
35#define QUP_MX_OUTPUT_CNT 0x100
36#define QUP_OUT_FIFO_BASE 0x110
37#define QUP_MX_WRITE_CNT 0x150
38#define QUP_MX_INPUT_CNT 0x200
39#define QUP_MX_READ_CNT 0x208
40#define QUP_IN_FIFO_BASE 0x218
41#define QUP_I2C_CLK_CTL 0x400
42#define QUP_I2C_STATUS 0x404
Sricharan R191424b2016-01-19 15:32:42 +053043#define QUP_I2C_MASTER_GEN 0x408
Bjorn Andersson10c5a842014-03-13 19:07:43 -070044
45/* QUP States and reset values */
46#define QUP_RESET_STATE 0
47#define QUP_RUN_STATE 1
48#define QUP_PAUSE_STATE 3
49#define QUP_STATE_MASK 3
50
51#define QUP_STATE_VALID BIT(2)
52#define QUP_I2C_MAST_GEN BIT(4)
Sricharan R9cedf3b2016-02-22 17:38:15 +053053#define QUP_I2C_FLUSH BIT(6)
Bjorn Andersson10c5a842014-03-13 19:07:43 -070054
55#define QUP_OPERATIONAL_RESET 0x000ff0
56#define QUP_I2C_STATUS_RESET 0xfffffc
57
58/* QUP OPERATIONAL FLAGS */
59#define QUP_I2C_NACK_FLAG BIT(3)
60#define QUP_OUT_NOT_EMPTY BIT(4)
61#define QUP_IN_NOT_EMPTY BIT(5)
62#define QUP_OUT_FULL BIT(6)
63#define QUP_OUT_SVC_FLAG BIT(8)
64#define QUP_IN_SVC_FLAG BIT(9)
65#define QUP_MX_OUTPUT_DONE BIT(10)
66#define QUP_MX_INPUT_DONE BIT(11)
67
68/* I2C mini core related values */
69#define QUP_CLOCK_AUTO_GATE BIT(13)
70#define I2C_MINI_CORE (2 << 8)
71#define I2C_N_VAL 15
Sricharan R191424b2016-01-19 15:32:42 +053072#define I2C_N_VAL_V2 7
73
Bjorn Andersson10c5a842014-03-13 19:07:43 -070074/* Most significant word offset in FIFO port */
75#define QUP_MSW_SHIFT (I2C_N_VAL + 1)
76
77/* Packing/Unpacking words in FIFOs, and IO modes */
78#define QUP_OUTPUT_BLK_MODE (1 << 10)
Sricharan R9cedf3b2016-02-22 17:38:15 +053079#define QUP_OUTPUT_BAM_MODE (3 << 10)
Bjorn Andersson10c5a842014-03-13 19:07:43 -070080#define QUP_INPUT_BLK_MODE (1 << 12)
Sricharan R9cedf3b2016-02-22 17:38:15 +053081#define QUP_INPUT_BAM_MODE (3 << 12)
82#define QUP_BAM_MODE (QUP_OUTPUT_BAM_MODE | QUP_INPUT_BAM_MODE)
Bjorn Andersson10c5a842014-03-13 19:07:43 -070083#define QUP_UNPACK_EN BIT(14)
84#define QUP_PACK_EN BIT(15)
85
86#define QUP_REPACK_EN (QUP_UNPACK_EN | QUP_PACK_EN)
Sricharan R191424b2016-01-19 15:32:42 +053087#define QUP_V2_TAGS_EN 1
Bjorn Andersson10c5a842014-03-13 19:07:43 -070088
89#define QUP_OUTPUT_BLOCK_SIZE(x)(((x) >> 0) & 0x03)
90#define QUP_OUTPUT_FIFO_SIZE(x) (((x) >> 2) & 0x07)
91#define QUP_INPUT_BLOCK_SIZE(x) (((x) >> 5) & 0x03)
92#define QUP_INPUT_FIFO_SIZE(x) (((x) >> 7) & 0x07)
93
94/* QUP tags */
95#define QUP_TAG_START (1 << 8)
96#define QUP_TAG_DATA (2 << 8)
97#define QUP_TAG_STOP (3 << 8)
98#define QUP_TAG_REC (4 << 8)
Sricharan R9cedf3b2016-02-22 17:38:15 +053099#define QUP_BAM_INPUT_EOT 0x93
100#define QUP_BAM_FLUSH_STOP 0x96
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700101
Sricharan R191424b2016-01-19 15:32:42 +0530102/* QUP v2 tags */
103#define QUP_TAG_V2_START 0x81
104#define QUP_TAG_V2_DATAWR 0x82
105#define QUP_TAG_V2_DATAWR_STOP 0x83
106#define QUP_TAG_V2_DATARD 0x85
107#define QUP_TAG_V2_DATARD_STOP 0x87
108
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700109/* Status, Error flags */
110#define I2C_STATUS_WR_BUFFER_FULL BIT(0)
111#define I2C_STATUS_BUS_ACTIVE BIT(8)
112#define I2C_STATUS_ERROR_MASK 0x38000fc
113#define QUP_STATUS_ERROR_FLAGS 0x7c
114
115#define QUP_READ_LIMIT 256
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530116#define SET_BIT 0x1
117#define RESET_BIT 0x0
118#define ONE_BYTE 0x1
Sricharan Rf7418792016-01-19 15:32:43 +0530119#define QUP_I2C_MX_CONFIG_DURING_RUN BIT(31)
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700120
Sricharan R9cedf3b2016-02-22 17:38:15 +0530121#define MX_TX_RX_LEN SZ_64K
122#define MX_BLOCKS (MX_TX_RX_LEN / QUP_READ_LIMIT)
123
124/* Max timeout in ms for 32k bytes */
125#define TOUT_MAX 300
126
Naveen Kaje515da742016-10-11 10:27:56 -0600127/* Default values. Use these if FW query fails */
128#define DEFAULT_CLK_FREQ 100000
129#define DEFAULT_SRC_CLK 20000000
130
Sricharan R191424b2016-01-19 15:32:42 +0530131struct qup_i2c_block {
132 int count;
133 int pos;
134 int tx_tag_len;
135 int rx_tag_len;
136 int data_len;
137 u8 tags[6];
138};
139
Sricharan R9cedf3b2016-02-22 17:38:15 +0530140struct qup_i2c_tag {
141 u8 *start;
142 dma_addr_t addr;
143};
144
145struct qup_i2c_bam {
146 struct qup_i2c_tag tag;
147 struct dma_chan *dma;
148 struct scatterlist *sg;
149};
150
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700151struct qup_i2c_dev {
152 struct device *dev;
153 void __iomem *base;
154 int irq;
155 struct clk *clk;
156 struct clk *pclk;
157 struct i2c_adapter adap;
158
159 int clk_ctl;
160 int out_fifo_sz;
161 int in_fifo_sz;
162 int out_blk_sz;
163 int in_blk_sz;
164
165 unsigned long one_byte_t;
Sricharan R191424b2016-01-19 15:32:42 +0530166 struct qup_i2c_block blk;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700167
168 struct i2c_msg *msg;
169 /* Current posion in user message buffer */
170 int pos;
171 /* I2C protocol errors */
172 u32 bus_err;
173 /* QUP core errors */
174 u32 qup_err;
175
Sricharan Rf7418792016-01-19 15:32:43 +0530176 /* To check if this is the last msg */
177 bool is_last;
178
179 /* To configure when bus is in run state */
180 int config_run;
181
Sricharan R9cedf3b2016-02-22 17:38:15 +0530182 /* dma parameters */
183 bool is_dma;
Abhishek Sahueb422b52018-03-12 18:44:52 +0530184 /* To check if the current transfer is using DMA */
185 bool use_dma;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530186 struct dma_pool *dpool;
187 struct qup_i2c_tag start_tag;
188 struct qup_i2c_bam brx;
189 struct qup_i2c_bam btx;
190
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700191 struct completion xfer;
192};
193
194static irqreturn_t qup_i2c_interrupt(int irq, void *dev)
195{
196 struct qup_i2c_dev *qup = dev;
197 u32 bus_err;
198 u32 qup_err;
199 u32 opflags;
200
201 bus_err = readl(qup->base + QUP_I2C_STATUS);
202 qup_err = readl(qup->base + QUP_ERROR_FLAGS);
203 opflags = readl(qup->base + QUP_OPERATIONAL);
204
205 if (!qup->msg) {
206 /* Clear Error interrupt */
207 writel(QUP_RESET_STATE, qup->base + QUP_STATE);
208 return IRQ_HANDLED;
209 }
210
211 bus_err &= I2C_STATUS_ERROR_MASK;
212 qup_err &= QUP_STATUS_ERROR_FLAGS;
213
Abhishek Sahu2b84a4d2016-05-09 18:14:30 +0530214 /* Clear the error bits in QUP_ERROR_FLAGS */
215 if (qup_err)
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700216 writel(qup_err, qup->base + QUP_ERROR_FLAGS);
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700217
Abhishek Sahu2b84a4d2016-05-09 18:14:30 +0530218 /* Clear the error bits in QUP_I2C_STATUS */
219 if (bus_err)
220 writel(bus_err, qup->base + QUP_I2C_STATUS);
221
222 /* Reset the QUP State in case of error */
223 if (qup_err || bus_err) {
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700224 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
234done:
235 qup->qup_err = qup_err;
236 qup->bus_err = bus_err;
237 complete(&qup->xfer);
238 return IRQ_HANDLED;
239}
240
241static 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
264static 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
Sricharan R9cedf3b2016-02-22 17:38:15 +0530269static 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
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700277static int qup_i2c_poll_state_valid(struct qup_i2c_dev *qup)
278{
279 return qup_i2c_poll_state_mask(qup, 0, 0);
280}
281
282static 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
287static 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
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530299/**
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 */
306static int qup_i2c_wait_ready(struct qup_i2c_dev *qup, int op, bool val,
307 int len)
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700308{
309 unsigned long timeout;
310 u32 opflags;
311 u32 status;
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530312 u32 shift = __ffs(op);
Sricharan Rfbf99212016-06-10 23:38:21 +0530313 int ret = 0;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700314
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530315 len *= qup->one_byte_t;
316 /* timeout after a wait of twice the max time */
317 timeout = jiffies + len * 4;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700318
319 for (;;) {
320 opflags = readl(qup->base + QUP_OPERATIONAL);
321 status = readl(qup->base + QUP_I2C_STATUS);
322
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530323 if (((opflags & op) >> shift) == val) {
Sricharan Rf7418792016-01-19 15:32:43 +0530324 if ((op == QUP_OUT_NOT_EMPTY) && qup->is_last) {
Sricharan Rfbf99212016-06-10 23:38:21 +0530325 if (!(status & I2C_STATUS_BUS_ACTIVE)) {
326 ret = 0;
327 goto done;
328 }
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530329 } else {
Sricharan Rfbf99212016-06-10 23:38:21 +0530330 ret = 0;
331 goto done;
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530332 }
333 }
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700334
Sricharan Rfbf99212016-06-10 23:38:21 +0530335 if (time_after(jiffies, timeout)) {
336 ret = -ETIMEDOUT;
337 goto done;
338 }
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530339 usleep_range(len, len * 2);
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700340 }
Sricharan Rfbf99212016-06-10 23:38:21 +0530341
342done:
343 if (qup->bus_err || qup->qup_err)
344 ret = (qup->bus_err & QUP_I2C_NACK_FLAG) ? -ENXIO : -EIO;
345
346 return ret;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700347}
348
Sricharan R191424b2016-01-19 15:32:42 +0530349static void qup_i2c_set_write_mode_v2(struct qup_i2c_dev *qup,
350 struct i2c_msg *msg)
351{
352 /* Number of entries to shift out, including the tags */
353 int total = msg->len + qup->blk.tx_tag_len;
354
Sricharan Rf7418792016-01-19 15:32:43 +0530355 total |= qup->config_run;
356
Sricharan R191424b2016-01-19 15:32:42 +0530357 if (total < qup->out_fifo_sz) {
358 /* FIFO mode */
359 writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE);
360 writel(total, qup->base + QUP_MX_WRITE_CNT);
361 } else {
362 /* BLOCK mode (transfer data on chunks) */
363 writel(QUP_OUTPUT_BLK_MODE | QUP_REPACK_EN,
364 qup->base + QUP_IO_MODE);
365 writel(total, qup->base + QUP_MX_OUTPUT_CNT);
366 }
367}
368
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700369static void qup_i2c_set_write_mode(struct qup_i2c_dev *qup, struct i2c_msg *msg)
370{
371 /* Number of entries to shift out, including the start */
372 int total = msg->len + 1;
373
374 if (total < qup->out_fifo_sz) {
375 /* FIFO mode */
376 writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE);
377 writel(total, qup->base + QUP_MX_WRITE_CNT);
378 } else {
379 /* BLOCK mode (transfer data on chunks) */
380 writel(QUP_OUTPUT_BLK_MODE | QUP_REPACK_EN,
381 qup->base + QUP_IO_MODE);
382 writel(total, qup->base + QUP_MX_OUTPUT_CNT);
383 }
384}
385
Sricharan R52db2232016-02-26 21:28:54 +0530386static int check_for_fifo_space(struct qup_i2c_dev *qup)
387{
388 int ret;
389
390 ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE);
391 if (ret)
392 goto out;
393
394 ret = qup_i2c_wait_ready(qup, QUP_OUT_FULL,
395 RESET_BIT, 4 * ONE_BYTE);
396 if (ret) {
397 /* Fifo is full. Drain out the fifo */
398 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
399 if (ret)
400 goto out;
401
402 ret = qup_i2c_wait_ready(qup, QUP_OUT_NOT_EMPTY,
403 RESET_BIT, 256 * ONE_BYTE);
404 if (ret) {
405 dev_err(qup->dev, "timeout for fifo out full");
406 goto out;
407 }
408
409 ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE);
410 if (ret)
411 goto out;
412 }
413
414out:
415 return ret;
416}
417
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530418static int qup_i2c_issue_write(struct qup_i2c_dev *qup, struct i2c_msg *msg)
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700419{
420 u32 addr = msg->addr << 1;
421 u32 qup_tag;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700422 int idx;
423 u32 val;
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530424 int ret = 0;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700425
426 if (qup->pos == 0) {
427 val = QUP_TAG_START | addr;
428 idx = 1;
429 } else {
430 val = 0;
431 idx = 0;
432 }
433
434 while (qup->pos < msg->len) {
435 /* Check that there's space in the FIFO for our pair */
Sricharan R52db2232016-02-26 21:28:54 +0530436 ret = check_for_fifo_space(qup);
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530437 if (ret)
438 return ret;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700439
440 if (qup->pos == msg->len - 1)
441 qup_tag = QUP_TAG_STOP;
442 else
443 qup_tag = QUP_TAG_DATA;
444
445 if (idx & 1)
446 val |= (qup_tag | msg->buf[qup->pos]) << QUP_MSW_SHIFT;
447 else
448 val = qup_tag | msg->buf[qup->pos];
449
450 /* Write out the pair and the last odd value */
451 if (idx & 1 || qup->pos == msg->len - 1)
452 writel(val, qup->base + QUP_OUT_FIFO_BASE);
453
454 qup->pos++;
455 idx++;
456 }
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530457
Sricharan R52db2232016-02-26 21:28:54 +0530458 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
459
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530460 return ret;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700461}
462
Sricharan R191424b2016-01-19 15:32:42 +0530463static void qup_i2c_set_blk_data(struct qup_i2c_dev *qup,
464 struct i2c_msg *msg)
465{
466 memset(&qup->blk, 0, sizeof(qup->blk));
467
468 qup->blk.data_len = msg->len;
469 qup->blk.count = (msg->len + QUP_READ_LIMIT - 1) / QUP_READ_LIMIT;
470
471 /* 4 bytes for first block and 2 writes for rest */
472 qup->blk.tx_tag_len = 4 + (qup->blk.count - 1) * 2;
473
474 /* There are 2 tag bytes that are read in to fifo for every block */
475 if (msg->flags & I2C_M_RD)
476 qup->blk.rx_tag_len = qup->blk.count * 2;
477}
478
479static int qup_i2c_send_data(struct qup_i2c_dev *qup, int tlen, u8 *tbuf,
480 int dlen, u8 *dbuf)
481{
482 u32 val = 0, idx = 0, pos = 0, i = 0, t;
483 int len = tlen + dlen;
484 u8 *buf = tbuf;
485 int ret = 0;
486
487 while (len > 0) {
Sricharan R52db2232016-02-26 21:28:54 +0530488 ret = check_for_fifo_space(qup);
489 if (ret)
Sricharan R191424b2016-01-19 15:32:42 +0530490 return ret;
Sricharan R191424b2016-01-19 15:32:42 +0530491
492 t = (len >= 4) ? 4 : len;
493
494 while (idx < t) {
495 if (!i && (pos >= tlen)) {
496 buf = dbuf;
497 pos = 0;
498 i = 1;
499 }
500 val |= buf[pos++] << (idx++ * 8);
501 }
502
503 writel(val, qup->base + QUP_OUT_FIFO_BASE);
504 idx = 0;
505 val = 0;
506 len -= 4;
507 }
508
Sricharan R52db2232016-02-26 21:28:54 +0530509 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
510
Sricharan R191424b2016-01-19 15:32:42 +0530511 return ret;
512}
513
514static int qup_i2c_get_data_len(struct qup_i2c_dev *qup)
515{
516 int data_len;
517
518 if (qup->blk.data_len > QUP_READ_LIMIT)
519 data_len = QUP_READ_LIMIT;
520 else
521 data_len = qup->blk.data_len;
522
523 return data_len;
524}
525
Naveen Kajecc9086e2016-10-11 10:27:57 -0600526static bool qup_i2c_check_msg_len(struct i2c_msg *msg)
527{
528 return ((msg->flags & I2C_M_RD) && (msg->flags & I2C_M_RECV_LEN));
529}
530
531static int qup_i2c_set_tags_smb(u16 addr, u8 *tags, struct qup_i2c_dev *qup,
532 struct i2c_msg *msg)
533{
534 int len = 0;
535
536 if (msg->len > 1) {
537 tags[len++] = QUP_TAG_V2_DATARD_STOP;
538 tags[len++] = qup_i2c_get_data_len(qup) - 1;
539 } else {
540 tags[len++] = QUP_TAG_V2_START;
541 tags[len++] = addr & 0xff;
542
543 if (msg->flags & I2C_M_TEN)
544 tags[len++] = addr >> 8;
545
546 tags[len++] = QUP_TAG_V2_DATARD;
547 /* Read 1 byte indicating the length of the SMBus message */
548 tags[len++] = 1;
549 }
550 return len;
551}
552
Sricharan R191424b2016-01-19 15:32:42 +0530553static int qup_i2c_set_tags(u8 *tags, struct qup_i2c_dev *qup,
Sricharan R9cedf3b2016-02-22 17:38:15 +0530554 struct i2c_msg *msg, int is_dma)
Sricharan R191424b2016-01-19 15:32:42 +0530555{
Wolfram Sange3c60f32016-04-03 20:44:58 +0200556 u16 addr = i2c_8bit_addr_from_msg(msg);
Sricharan R191424b2016-01-19 15:32:42 +0530557 int len = 0;
558 int data_len;
559
Sricharan R9cedf3b2016-02-22 17:38:15 +0530560 int last = (qup->blk.pos == (qup->blk.count - 1)) && (qup->is_last);
561
Naveen Kajecc9086e2016-10-11 10:27:57 -0600562 /* Handle tags for SMBus block read */
563 if (qup_i2c_check_msg_len(msg))
564 return qup_i2c_set_tags_smb(addr, tags, qup, msg);
565
Sricharan R191424b2016-01-19 15:32:42 +0530566 if (qup->blk.pos == 0) {
567 tags[len++] = QUP_TAG_V2_START;
568 tags[len++] = addr & 0xff;
569
570 if (msg->flags & I2C_M_TEN)
571 tags[len++] = addr >> 8;
572 }
573
574 /* Send _STOP commands for the last block */
Sricharan R9cedf3b2016-02-22 17:38:15 +0530575 if (last) {
Sricharan R191424b2016-01-19 15:32:42 +0530576 if (msg->flags & I2C_M_RD)
577 tags[len++] = QUP_TAG_V2_DATARD_STOP;
578 else
579 tags[len++] = QUP_TAG_V2_DATAWR_STOP;
580 } else {
581 if (msg->flags & I2C_M_RD)
582 tags[len++] = QUP_TAG_V2_DATARD;
583 else
584 tags[len++] = QUP_TAG_V2_DATAWR;
585 }
586
587 data_len = qup_i2c_get_data_len(qup);
588
589 /* 0 implies 256 bytes */
590 if (data_len == QUP_READ_LIMIT)
591 tags[len++] = 0;
592 else
593 tags[len++] = data_len;
594
Sricharan R9cedf3b2016-02-22 17:38:15 +0530595 if ((msg->flags & I2C_M_RD) && last && is_dma) {
596 tags[len++] = QUP_BAM_INPUT_EOT;
597 tags[len++] = QUP_BAM_FLUSH_STOP;
598 }
599
Sricharan R191424b2016-01-19 15:32:42 +0530600 return len;
601}
602
603static int qup_i2c_issue_xfer_v2(struct qup_i2c_dev *qup, struct i2c_msg *msg)
604{
605 int data_len = 0, tag_len, index;
606 int ret;
607
Sricharan R9cedf3b2016-02-22 17:38:15 +0530608 tag_len = qup_i2c_set_tags(qup->blk.tags, qup, msg, 0);
Sricharan R191424b2016-01-19 15:32:42 +0530609 index = msg->len - qup->blk.data_len;
610
611 /* only tags are written for read */
612 if (!(msg->flags & I2C_M_RD))
613 data_len = qup_i2c_get_data_len(qup);
614
615 ret = qup_i2c_send_data(qup, tag_len, qup->blk.tags,
616 data_len, &msg->buf[index]);
617 qup->blk.data_len -= data_len;
618
619 return ret;
620}
621
Sricharan R9cedf3b2016-02-22 17:38:15 +0530622static void qup_i2c_bam_cb(void *data)
623{
624 struct qup_i2c_dev *qup = data;
625
626 complete(&qup->xfer);
627}
628
629static int qup_sg_set_buf(struct scatterlist *sg, void *buf,
Sricharan R685983f2016-06-10 23:38:19 +0530630 unsigned int buflen, struct qup_i2c_dev *qup,
631 int dir)
Sricharan R9cedf3b2016-02-22 17:38:15 +0530632{
633 int ret;
634
635 sg_set_buf(sg, buf, buflen);
636 ret = dma_map_sg(qup->dev, sg, 1, dir);
637 if (!ret)
638 return -EINVAL;
639
Sricharan R9cedf3b2016-02-22 17:38:15 +0530640 return 0;
641}
642
643static void qup_i2c_rel_dma(struct qup_i2c_dev *qup)
644{
645 if (qup->btx.dma)
646 dma_release_channel(qup->btx.dma);
647 if (qup->brx.dma)
648 dma_release_channel(qup->brx.dma);
649 qup->btx.dma = NULL;
650 qup->brx.dma = NULL;
651}
652
653static int qup_i2c_req_dma(struct qup_i2c_dev *qup)
654{
655 int err;
656
657 if (!qup->btx.dma) {
658 qup->btx.dma = dma_request_slave_channel_reason(qup->dev, "tx");
659 if (IS_ERR(qup->btx.dma)) {
660 err = PTR_ERR(qup->btx.dma);
661 qup->btx.dma = NULL;
662 dev_err(qup->dev, "\n tx channel not available");
663 return err;
664 }
665 }
666
667 if (!qup->brx.dma) {
668 qup->brx.dma = dma_request_slave_channel_reason(qup->dev, "rx");
669 if (IS_ERR(qup->brx.dma)) {
670 dev_err(qup->dev, "\n rx channel not available");
671 err = PTR_ERR(qup->brx.dma);
672 qup->brx.dma = NULL;
673 qup_i2c_rel_dma(qup);
674 return err;
675 }
676 }
677 return 0;
678}
679
680static int qup_i2c_bam_do_xfer(struct qup_i2c_dev *qup, struct i2c_msg *msg,
681 int num)
682{
683 struct dma_async_tx_descriptor *txd, *rxd = NULL;
684 int ret = 0, idx = 0, limit = QUP_READ_LIMIT;
685 dma_cookie_t cookie_rx, cookie_tx;
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530686 u32 len, blocks, rem;
687 u32 i, tlen, tx_len, tx_cnt = 0, rx_cnt = 0, off = 0;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530688 u8 *tags;
689
690 while (idx < num) {
Sricharan R9cedf3b2016-02-22 17:38:15 +0530691 tx_len = 0, len = 0, i = 0;
692
693 qup->is_last = (idx == (num - 1));
694
695 qup_i2c_set_blk_data(qup, msg);
696
Abhishek Sahu5c135e12016-05-09 18:14:31 +0530697 blocks = qup->blk.count;
698 rem = msg->len - (blocks - 1) * limit;
699
Sricharan R9cedf3b2016-02-22 17:38:15 +0530700 if (msg->flags & I2C_M_RD) {
Sricharan R9cedf3b2016-02-22 17:38:15 +0530701 while (qup->blk.pos < blocks) {
Abhishek Sahu5c135e12016-05-09 18:14:31 +0530702 tlen = (i == (blocks - 1)) ? rem : limit;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530703 tags = &qup->start_tag.start[off + len];
704 len += qup_i2c_set_tags(tags, qup, msg, 1);
Abhishek Sahu5c135e12016-05-09 18:14:31 +0530705 qup->blk.data_len -= tlen;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530706
707 /* scratch buf to read the start and len tags */
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530708 ret = qup_sg_set_buf(&qup->brx.sg[rx_cnt++],
Sricharan R9cedf3b2016-02-22 17:38:15 +0530709 &qup->brx.tag.start[0],
Sricharan R685983f2016-06-10 23:38:19 +0530710 2, qup, DMA_FROM_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530711
712 if (ret)
713 return ret;
714
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530715 ret = qup_sg_set_buf(&qup->brx.sg[rx_cnt++],
Sricharan R9cedf3b2016-02-22 17:38:15 +0530716 &msg->buf[limit * i],
Sricharan R685983f2016-06-10 23:38:19 +0530717 tlen, qup,
718 DMA_FROM_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530719 if (ret)
720 return ret;
721
722 i++;
723 qup->blk.pos = i;
724 }
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530725 ret = qup_sg_set_buf(&qup->btx.sg[tx_cnt++],
Sricharan R9cedf3b2016-02-22 17:38:15 +0530726 &qup->start_tag.start[off],
Sricharan R685983f2016-06-10 23:38:19 +0530727 len, qup, DMA_TO_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530728 if (ret)
729 return ret;
730
731 off += len;
732 /* scratch buf to read the BAM EOT and FLUSH tags */
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530733 ret = qup_sg_set_buf(&qup->brx.sg[rx_cnt++],
Sricharan R9cedf3b2016-02-22 17:38:15 +0530734 &qup->brx.tag.start[0],
Sricharan R685983f2016-06-10 23:38:19 +0530735 2, qup, DMA_FROM_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530736 if (ret)
737 return ret;
738 } else {
Sricharan R9cedf3b2016-02-22 17:38:15 +0530739 while (qup->blk.pos < blocks) {
Abhishek Sahu5c135e12016-05-09 18:14:31 +0530740 tlen = (i == (blocks - 1)) ? rem : limit;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530741 tags = &qup->start_tag.start[off + tx_len];
742 len = qup_i2c_set_tags(tags, qup, msg, 1);
Abhishek Sahu5c135e12016-05-09 18:14:31 +0530743 qup->blk.data_len -= tlen;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530744
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530745 ret = qup_sg_set_buf(&qup->btx.sg[tx_cnt++],
Sricharan R685983f2016-06-10 23:38:19 +0530746 tags, len,
747 qup, DMA_TO_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530748 if (ret)
749 return ret;
750
751 tx_len += len;
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530752 ret = qup_sg_set_buf(&qup->btx.sg[tx_cnt++],
Sricharan R9cedf3b2016-02-22 17:38:15 +0530753 &msg->buf[limit * i],
Sricharan R685983f2016-06-10 23:38:19 +0530754 tlen, qup, DMA_TO_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530755 if (ret)
756 return ret;
757 i++;
758 qup->blk.pos = i;
759 }
760 off += tx_len;
761
762 if (idx == (num - 1)) {
763 len = 1;
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530764 if (rx_cnt) {
Sricharan R9cedf3b2016-02-22 17:38:15 +0530765 qup->btx.tag.start[0] =
766 QUP_BAM_INPUT_EOT;
767 len++;
768 }
769 qup->btx.tag.start[len - 1] =
770 QUP_BAM_FLUSH_STOP;
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530771 ret = qup_sg_set_buf(&qup->btx.sg[tx_cnt++],
Sricharan R9cedf3b2016-02-22 17:38:15 +0530772 &qup->btx.tag.start[0],
Sricharan R685983f2016-06-10 23:38:19 +0530773 len, qup, DMA_TO_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530774 if (ret)
775 return ret;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530776 }
777 }
778 idx++;
779 msg++;
780 }
781
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530782 txd = dmaengine_prep_slave_sg(qup->btx.dma, qup->btx.sg, tx_cnt,
Sricharan R9cedf3b2016-02-22 17:38:15 +0530783 DMA_MEM_TO_DEV,
784 DMA_PREP_INTERRUPT | DMA_PREP_FENCE);
785 if (!txd) {
786 dev_err(qup->dev, "failed to get tx desc\n");
787 ret = -EINVAL;
788 goto desc_err;
789 }
790
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530791 if (!rx_cnt) {
Sricharan R9cedf3b2016-02-22 17:38:15 +0530792 txd->callback = qup_i2c_bam_cb;
793 txd->callback_param = qup;
794 }
795
796 cookie_tx = dmaengine_submit(txd);
797 if (dma_submit_error(cookie_tx)) {
798 ret = -EINVAL;
799 goto desc_err;
800 }
801
802 dma_async_issue_pending(qup->btx.dma);
803
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530804 if (rx_cnt) {
Sricharan R9cedf3b2016-02-22 17:38:15 +0530805 rxd = dmaengine_prep_slave_sg(qup->brx.dma, qup->brx.sg,
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530806 rx_cnt, DMA_DEV_TO_MEM,
Sricharan R9cedf3b2016-02-22 17:38:15 +0530807 DMA_PREP_INTERRUPT);
808 if (!rxd) {
809 dev_err(qup->dev, "failed to get rx desc\n");
810 ret = -EINVAL;
811
812 /* abort TX descriptors */
813 dmaengine_terminate_all(qup->btx.dma);
814 goto desc_err;
815 }
816
817 rxd->callback = qup_i2c_bam_cb;
818 rxd->callback_param = qup;
819 cookie_rx = dmaengine_submit(rxd);
820 if (dma_submit_error(cookie_rx)) {
821 ret = -EINVAL;
822 goto desc_err;
823 }
824
825 dma_async_issue_pending(qup->brx.dma);
826 }
827
828 if (!wait_for_completion_timeout(&qup->xfer, TOUT_MAX * HZ)) {
829 dev_err(qup->dev, "normal trans timed out\n");
830 ret = -ETIMEDOUT;
831 }
832
833 if (ret || qup->bus_err || qup->qup_err) {
Abhishek Sahu72398722018-03-12 18:44:51 +0530834 reinit_completion(&qup->xfer);
835
Sricharan Rfbf99212016-06-10 23:38:21 +0530836 if (qup_i2c_change_state(qup, QUP_RUN_STATE)) {
837 dev_err(qup->dev, "change to run state timed out");
838 goto desc_err;
839 }
Sricharan R9cedf3b2016-02-22 17:38:15 +0530840
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530841 if (rx_cnt)
Sricharan Rfbf99212016-06-10 23:38:21 +0530842 writel(QUP_BAM_INPUT_EOT,
Sricharan R9cedf3b2016-02-22 17:38:15 +0530843 qup->base + QUP_OUT_FIFO_BASE);
844
Sricharan Rfbf99212016-06-10 23:38:21 +0530845 writel(QUP_BAM_FLUSH_STOP, qup->base + QUP_OUT_FIFO_BASE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530846
Sricharan Rfbf99212016-06-10 23:38:21 +0530847 qup_i2c_flush(qup);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530848
Sricharan Rfbf99212016-06-10 23:38:21 +0530849 /* wait for remaining interrupts to occur */
850 if (!wait_for_completion_timeout(&qup->xfer, HZ))
851 dev_err(qup->dev, "flush timed out\n");
852
853 qup_i2c_rel_dma(qup);
854
855 ret = (qup->bus_err & QUP_I2C_NACK_FLAG) ? -ENXIO : -EIO;
Sricharan R9cedf3b2016-02-22 17:38:15 +0530856 }
857
Sricharan Rfbf99212016-06-10 23:38:21 +0530858desc_err:
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530859 dma_unmap_sg(qup->dev, qup->btx.sg, tx_cnt, DMA_TO_DEVICE);
Sricharan R9cedf3b2016-02-22 17:38:15 +0530860
Abhishek Sahu6d5f37f2018-03-12 18:44:53 +0530861 if (rx_cnt)
862 dma_unmap_sg(qup->dev, qup->brx.sg, rx_cnt,
Sricharan R9cedf3b2016-02-22 17:38:15 +0530863 DMA_FROM_DEVICE);
Sricharan Rfbf99212016-06-10 23:38:21 +0530864
Sricharan R9cedf3b2016-02-22 17:38:15 +0530865 return ret;
866}
867
868static int qup_i2c_bam_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
869 int num)
870{
871 struct qup_i2c_dev *qup = i2c_get_adapdata(adap);
872 int ret = 0;
873
874 enable_irq(qup->irq);
875 ret = qup_i2c_req_dma(qup);
876
877 if (ret)
878 goto out;
879
Sricharan R9cedf3b2016-02-22 17:38:15 +0530880 writel(0, qup->base + QUP_MX_INPUT_CNT);
881 writel(0, qup->base + QUP_MX_OUTPUT_CNT);
882
883 /* set BAM mode */
884 writel(QUP_REPACK_EN | QUP_BAM_MODE, qup->base + QUP_IO_MODE);
885
886 /* mask fifo irqs */
887 writel((0x3 << 8), qup->base + QUP_OPERATIONAL_MASK);
888
889 /* set RUN STATE */
890 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
891 if (ret)
892 goto out;
893
894 writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL);
895
896 qup->msg = msg;
897 ret = qup_i2c_bam_do_xfer(qup, qup->msg, num);
898out:
899 disable_irq(qup->irq);
900
901 qup->msg = NULL;
902 return ret;
903}
904
Sricharan R191424b2016-01-19 15:32:42 +0530905static int qup_i2c_wait_for_complete(struct qup_i2c_dev *qup,
906 struct i2c_msg *msg)
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700907{
908 unsigned long left;
Sricharan R191424b2016-01-19 15:32:42 +0530909 int ret = 0;
910
911 left = wait_for_completion_timeout(&qup->xfer, HZ);
912 if (!left) {
913 writel(1, qup->base + QUP_SW_RESET);
914 ret = -ETIMEDOUT;
915 }
916
Sricharan Rfbf99212016-06-10 23:38:21 +0530917 if (qup->bus_err || qup->qup_err)
918 ret = (qup->bus_err & QUP_I2C_NACK_FLAG) ? -ENXIO : -EIO;
Sricharan R191424b2016-01-19 15:32:42 +0530919
920 return ret;
921}
922
923static int qup_i2c_write_one_v2(struct qup_i2c_dev *qup, struct i2c_msg *msg)
924{
925 int ret = 0;
926
927 qup->msg = msg;
928 qup->pos = 0;
929 enable_irq(qup->irq);
930 qup_i2c_set_blk_data(qup, msg);
931 qup_i2c_set_write_mode_v2(qup, msg);
932
933 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
934 if (ret)
935 goto err;
936
937 writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL);
938
939 do {
940 ret = qup_i2c_issue_xfer_v2(qup, msg);
941 if (ret)
942 goto err;
943
944 ret = qup_i2c_wait_for_complete(qup, msg);
945 if (ret)
946 goto err;
947
948 qup->blk.pos++;
949 } while (qup->blk.pos < qup->blk.count);
950
951 ret = qup_i2c_wait_ready(qup, QUP_OUT_NOT_EMPTY, RESET_BIT, ONE_BYTE);
952
953err:
954 disable_irq(qup->irq);
955 qup->msg = NULL;
956
957 return ret;
958}
959
960static int qup_i2c_write_one(struct qup_i2c_dev *qup, struct i2c_msg *msg)
961{
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700962 int ret;
963
964 qup->msg = msg;
965 qup->pos = 0;
966
967 enable_irq(qup->irq);
968
969 qup_i2c_set_write_mode(qup, msg);
970
971 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
972 if (ret)
973 goto err;
974
975 writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL);
976
977 do {
978 ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE);
979 if (ret)
980 goto err;
981
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530982 ret = qup_i2c_issue_write(qup, msg);
983 if (ret)
984 goto err;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700985
986 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
987 if (ret)
988 goto err;
989
Sricharan R191424b2016-01-19 15:32:42 +0530990 ret = qup_i2c_wait_for_complete(qup, msg);
991 if (ret)
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700992 goto err;
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700993 } while (qup->pos < msg->len);
994
995 /* Wait for the outstanding data in the fifo to drain */
Sricharan Rc4f0c5f2016-01-19 15:32:41 +0530996 ret = qup_i2c_wait_ready(qup, QUP_OUT_NOT_EMPTY, RESET_BIT, ONE_BYTE);
Bjorn Andersson10c5a842014-03-13 19:07:43 -0700997err:
998 disable_irq(qup->irq);
999 qup->msg = NULL;
1000
1001 return ret;
1002}
1003
1004static void qup_i2c_set_read_mode(struct qup_i2c_dev *qup, int len)
1005{
1006 if (len < qup->in_fifo_sz) {
1007 /* FIFO mode */
1008 writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE);
1009 writel(len, qup->base + QUP_MX_READ_CNT);
1010 } else {
1011 /* BLOCK mode (transfer data on chunks) */
1012 writel(QUP_INPUT_BLK_MODE | QUP_REPACK_EN,
1013 qup->base + QUP_IO_MODE);
1014 writel(len, qup->base + QUP_MX_INPUT_CNT);
1015 }
1016}
1017
Sricharan R191424b2016-01-19 15:32:42 +05301018static void qup_i2c_set_read_mode_v2(struct qup_i2c_dev *qup, int len)
1019{
1020 int tx_len = qup->blk.tx_tag_len;
1021
1022 len += qup->blk.rx_tag_len;
Sricharan Rf7418792016-01-19 15:32:43 +05301023 len |= qup->config_run;
1024 tx_len |= qup->config_run;
Sricharan R191424b2016-01-19 15:32:42 +05301025
1026 if (len < qup->in_fifo_sz) {
1027 /* FIFO mode */
1028 writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE);
Sricharan R191424b2016-01-19 15:32:42 +05301029 writel(tx_len, qup->base + QUP_MX_WRITE_CNT);
Sricharan Rf7418792016-01-19 15:32:43 +05301030 writel(len, qup->base + QUP_MX_READ_CNT);
Sricharan R191424b2016-01-19 15:32:42 +05301031 } else {
1032 /* BLOCK mode (transfer data on chunks) */
1033 writel(QUP_INPUT_BLK_MODE | QUP_REPACK_EN,
1034 qup->base + QUP_IO_MODE);
Sricharan R191424b2016-01-19 15:32:42 +05301035 writel(tx_len, qup->base + QUP_MX_OUTPUT_CNT);
Sricharan Rf7418792016-01-19 15:32:43 +05301036 writel(len, qup->base + QUP_MX_INPUT_CNT);
Sricharan R191424b2016-01-19 15:32:42 +05301037 }
1038}
1039
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001040static void qup_i2c_issue_read(struct qup_i2c_dev *qup, struct i2c_msg *msg)
1041{
1042 u32 addr, len, val;
1043
Naveen Kaje01309442016-05-05 12:33:17 -06001044 addr = i2c_8bit_addr_from_msg(msg);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001045
1046 /* 0 is used to specify a length 256 (QUP_READ_LIMIT) */
1047 len = (msg->len == QUP_READ_LIMIT) ? 0 : msg->len;
1048
1049 val = ((QUP_TAG_REC | len) << QUP_MSW_SHIFT) | QUP_TAG_START | addr;
1050 writel(val, qup->base + QUP_OUT_FIFO_BASE);
1051}
1052
1053
Sricharan Rc4f0c5f2016-01-19 15:32:41 +05301054static int qup_i2c_read_fifo(struct qup_i2c_dev *qup, struct i2c_msg *msg)
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001055{
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001056 u32 val = 0;
1057 int idx;
Sricharan Rc4f0c5f2016-01-19 15:32:41 +05301058 int ret = 0;
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001059
1060 for (idx = 0; qup->pos < msg->len; idx++) {
1061 if ((idx & 1) == 0) {
1062 /* Check that FIFO have data */
Sricharan Rc4f0c5f2016-01-19 15:32:41 +05301063 ret = qup_i2c_wait_ready(qup, QUP_IN_NOT_EMPTY,
1064 SET_BIT, 4 * ONE_BYTE);
1065 if (ret)
1066 return ret;
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001067
1068 /* Reading 2 words at time */
1069 val = readl(qup->base + QUP_IN_FIFO_BASE);
1070
1071 msg->buf[qup->pos++] = val & 0xFF;
1072 } else {
1073 msg->buf[qup->pos++] = val >> QUP_MSW_SHIFT;
1074 }
1075 }
Sricharan Rc4f0c5f2016-01-19 15:32:41 +05301076
1077 return ret;
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001078}
1079
Sricharan R191424b2016-01-19 15:32:42 +05301080static int qup_i2c_read_fifo_v2(struct qup_i2c_dev *qup,
1081 struct i2c_msg *msg)
1082{
1083 u32 val;
Naveen Kajecc9086e2016-10-11 10:27:57 -06001084 int idx, pos = 0, ret = 0, total, msg_offset = 0;
Sricharan R191424b2016-01-19 15:32:42 +05301085
Naveen Kajecc9086e2016-10-11 10:27:57 -06001086 /*
1087 * If the message length is already read in
1088 * the first byte of the buffer, account for
1089 * that by setting the offset
1090 */
1091 if (qup_i2c_check_msg_len(msg) && (msg->len > 1))
1092 msg_offset = 1;
Sricharan R191424b2016-01-19 15:32:42 +05301093 total = qup_i2c_get_data_len(qup);
Naveen Kajecc9086e2016-10-11 10:27:57 -06001094 total -= msg_offset;
Sricharan R191424b2016-01-19 15:32:42 +05301095
1096 /* 2 extra bytes for read tags */
1097 while (pos < (total + 2)) {
1098 /* Check that FIFO have data */
1099 ret = qup_i2c_wait_ready(qup, QUP_IN_NOT_EMPTY,
1100 SET_BIT, 4 * ONE_BYTE);
1101 if (ret) {
1102 dev_err(qup->dev, "timeout for fifo not empty");
1103 return ret;
1104 }
1105 val = readl(qup->base + QUP_IN_FIFO_BASE);
1106
1107 for (idx = 0; idx < 4; idx++, val >>= 8, pos++) {
1108 /* first 2 bytes are tag bytes */
1109 if (pos < 2)
1110 continue;
1111
1112 if (pos >= (total + 2))
1113 goto out;
Naveen Kajecc9086e2016-10-11 10:27:57 -06001114 msg->buf[qup->pos + msg_offset] = val & 0xff;
1115 qup->pos++;
Sricharan R191424b2016-01-19 15:32:42 +05301116 }
1117 }
1118
1119out:
1120 qup->blk.data_len -= total;
1121
1122 return ret;
1123}
1124
1125static int qup_i2c_read_one_v2(struct qup_i2c_dev *qup, struct i2c_msg *msg)
1126{
1127 int ret = 0;
1128
1129 qup->msg = msg;
1130 qup->pos = 0;
1131 enable_irq(qup->irq);
1132 qup_i2c_set_blk_data(qup, msg);
1133 qup_i2c_set_read_mode_v2(qup, msg->len);
1134
1135 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
1136 if (ret)
1137 goto err;
1138
1139 writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL);
1140
1141 do {
1142 ret = qup_i2c_issue_xfer_v2(qup, msg);
1143 if (ret)
1144 goto err;
1145
1146 ret = qup_i2c_wait_for_complete(qup, msg);
1147 if (ret)
1148 goto err;
1149
1150 ret = qup_i2c_read_fifo_v2(qup, msg);
1151 if (ret)
1152 goto err;
1153
1154 qup->blk.pos++;
Naveen Kajecc9086e2016-10-11 10:27:57 -06001155
1156 /* Handle SMBus block read length */
1157 if (qup_i2c_check_msg_len(msg) && (msg->len == 1)) {
1158 if (msg->buf[0] > I2C_SMBUS_BLOCK_MAX) {
1159 ret = -EPROTO;
1160 goto err;
1161 }
1162 msg->len += msg->buf[0];
1163 qup->pos = 0;
1164 qup_i2c_set_blk_data(qup, msg);
1165 /* set tag length for block read */
1166 qup->blk.tx_tag_len = 2;
1167 qup_i2c_set_read_mode_v2(qup, msg->buf[0]);
1168 }
Sricharan R191424b2016-01-19 15:32:42 +05301169 } while (qup->blk.pos < qup->blk.count);
1170
1171err:
1172 disable_irq(qup->irq);
1173 qup->msg = NULL;
1174
1175 return ret;
1176}
1177
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001178static int qup_i2c_read_one(struct qup_i2c_dev *qup, struct i2c_msg *msg)
1179{
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001180 int ret;
1181
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001182 qup->msg = msg;
1183 qup->pos = 0;
1184
1185 enable_irq(qup->irq);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001186 qup_i2c_set_read_mode(qup, msg->len);
1187
1188 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
1189 if (ret)
1190 goto err;
1191
1192 writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL);
1193
1194 ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE);
1195 if (ret)
1196 goto err;
1197
1198 qup_i2c_issue_read(qup, msg);
1199
1200 ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
1201 if (ret)
1202 goto err;
1203
1204 do {
Sricharan R191424b2016-01-19 15:32:42 +05301205 ret = qup_i2c_wait_for_complete(qup, msg);
1206 if (ret)
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001207 goto err;
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001208
Sricharan Rc4f0c5f2016-01-19 15:32:41 +05301209 ret = qup_i2c_read_fifo(qup, msg);
1210 if (ret)
1211 goto err;
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001212 } while (qup->pos < msg->len);
1213
1214err:
1215 disable_irq(qup->irq);
1216 qup->msg = NULL;
1217
1218 return ret;
1219}
1220
1221static int qup_i2c_xfer(struct i2c_adapter *adap,
1222 struct i2c_msg msgs[],
1223 int num)
1224{
1225 struct qup_i2c_dev *qup = i2c_get_adapdata(adap);
1226 int ret, idx;
1227
1228 ret = pm_runtime_get_sync(qup->dev);
Andy Grossfa01d092014-05-02 20:54:29 -05001229 if (ret < 0)
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001230 goto out;
1231
Sricharan Rfbf99212016-06-10 23:38:21 +05301232 qup->bus_err = 0;
1233 qup->qup_err = 0;
1234
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001235 writel(1, qup->base + QUP_SW_RESET);
1236 ret = qup_i2c_poll_state(qup, QUP_RESET_STATE);
1237 if (ret)
1238 goto out;
1239
1240 /* Configure QUP as I2C mini core */
1241 writel(I2C_MINI_CORE | I2C_N_VAL, qup->base + QUP_CONFIG);
1242
1243 for (idx = 0; idx < num; idx++) {
1244 if (msgs[idx].len == 0) {
1245 ret = -EINVAL;
1246 goto out;
1247 }
1248
1249 if (qup_i2c_poll_state_i2c_master(qup)) {
1250 ret = -EIO;
1251 goto out;
1252 }
1253
Naveen Kajecc9086e2016-10-11 10:27:57 -06001254 if (qup_i2c_check_msg_len(&msgs[idx])) {
1255 ret = -EINVAL;
1256 goto out;
1257 }
1258
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001259 if (msgs[idx].flags & I2C_M_RD)
1260 ret = qup_i2c_read_one(qup, &msgs[idx]);
1261 else
1262 ret = qup_i2c_write_one(qup, &msgs[idx]);
1263
1264 if (ret)
1265 break;
1266
1267 ret = qup_i2c_change_state(qup, QUP_RESET_STATE);
1268 if (ret)
1269 break;
1270 }
1271
1272 if (ret == 0)
1273 ret = num;
1274out:
1275
1276 pm_runtime_mark_last_busy(qup->dev);
1277 pm_runtime_put_autosuspend(qup->dev);
1278
1279 return ret;
1280}
1281
Sricharan R191424b2016-01-19 15:32:42 +05301282static int qup_i2c_xfer_v2(struct i2c_adapter *adap,
1283 struct i2c_msg msgs[],
1284 int num)
1285{
1286 struct qup_i2c_dev *qup = i2c_get_adapdata(adap);
Abhishek Sahueb422b52018-03-12 18:44:52 +05301287 int ret, len, idx = 0;
Sricharan R191424b2016-01-19 15:32:42 +05301288
Sricharan Rfbf99212016-06-10 23:38:21 +05301289 qup->bus_err = 0;
1290 qup->qup_err = 0;
1291
Sricharan R191424b2016-01-19 15:32:42 +05301292 ret = pm_runtime_get_sync(qup->dev);
1293 if (ret < 0)
1294 goto out;
1295
1296 writel(1, qup->base + QUP_SW_RESET);
1297 ret = qup_i2c_poll_state(qup, QUP_RESET_STATE);
1298 if (ret)
1299 goto out;
1300
1301 /* Configure QUP as I2C mini core */
1302 writel(I2C_MINI_CORE | I2C_N_VAL_V2, qup->base + QUP_CONFIG);
1303 writel(QUP_V2_TAGS_EN, qup->base + QUP_I2C_MASTER_GEN);
1304
Sricharan R9cedf3b2016-02-22 17:38:15 +05301305 if ((qup->is_dma)) {
1306 /* All i2c_msgs should be transferred using either dma or cpu */
1307 for (idx = 0; idx < num; idx++) {
1308 if (msgs[idx].len == 0) {
1309 ret = -EINVAL;
1310 goto out;
1311 }
1312
1313 len = (msgs[idx].len > qup->out_fifo_sz) ||
1314 (msgs[idx].len > qup->in_fifo_sz);
1315
Abhishek Sahueb422b52018-03-12 18:44:52 +05301316 if (is_vmalloc_addr(msgs[idx].buf) || !len)
Sricharan R9cedf3b2016-02-22 17:38:15 +05301317 break;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301318 }
Abhishek Sahueb422b52018-03-12 18:44:52 +05301319
1320 if (idx == num)
1321 qup->use_dma = true;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301322 }
1323
Sricharan Rd4f56c72016-06-10 23:38:20 +05301324 idx = 0;
1325
Sricharan R9cedf3b2016-02-22 17:38:15 +05301326 do {
Sricharan R191424b2016-01-19 15:32:42 +05301327 if (msgs[idx].len == 0) {
1328 ret = -EINVAL;
1329 goto out;
1330 }
1331
1332 if (qup_i2c_poll_state_i2c_master(qup)) {
1333 ret = -EIO;
1334 goto out;
1335 }
1336
Sricharan Rf7418792016-01-19 15:32:43 +05301337 qup->is_last = (idx == (num - 1));
1338 if (idx)
1339 qup->config_run = QUP_I2C_MX_CONFIG_DURING_RUN;
1340 else
1341 qup->config_run = 0;
1342
Sricharan R191424b2016-01-19 15:32:42 +05301343 reinit_completion(&qup->xfer);
1344
Abhishek Sahueb422b52018-03-12 18:44:52 +05301345 if (qup->use_dma) {
Sricharan R9cedf3b2016-02-22 17:38:15 +05301346 ret = qup_i2c_bam_xfer(adap, &msgs[idx], num);
Abhishek Sahueb422b52018-03-12 18:44:52 +05301347 qup->use_dma = false;
1348 break;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301349 } else {
1350 if (msgs[idx].flags & I2C_M_RD)
1351 ret = qup_i2c_read_one_v2(qup, &msgs[idx]);
1352 else
1353 ret = qup_i2c_write_one_v2(qup, &msgs[idx]);
1354 }
Abhishek Sahueb422b52018-03-12 18:44:52 +05301355 } while ((idx++ < (num - 1)) && !ret);
Sricharan R191424b2016-01-19 15:32:42 +05301356
Sricharan Rf7418792016-01-19 15:32:43 +05301357 if (!ret)
1358 ret = qup_i2c_change_state(qup, QUP_RESET_STATE);
1359
Sricharan R191424b2016-01-19 15:32:42 +05301360 if (ret == 0)
1361 ret = num;
1362out:
1363 pm_runtime_mark_last_busy(qup->dev);
1364 pm_runtime_put_autosuspend(qup->dev);
1365
1366 return ret;
1367}
1368
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001369static u32 qup_i2c_func(struct i2c_adapter *adap)
1370{
1371 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
1372}
1373
1374static const struct i2c_algorithm qup_i2c_algo = {
1375 .master_xfer = qup_i2c_xfer,
1376 .functionality = qup_i2c_func,
1377};
1378
Sricharan R191424b2016-01-19 15:32:42 +05301379static const struct i2c_algorithm qup_i2c_algo_v2 = {
1380 .master_xfer = qup_i2c_xfer_v2,
1381 .functionality = qup_i2c_func,
1382};
1383
Wolfram Sang994647d2015-01-07 12:24:10 +01001384/*
1385 * The QUP block will issue a NACK and STOP on the bus when reaching
1386 * the end of the read, the length of the read is specified as one byte
1387 * which limits the possible read to 256 (QUP_READ_LIMIT) bytes.
1388 */
Bhumika Goyalae3923a2017-08-21 17:42:04 +05301389static const struct i2c_adapter_quirks qup_i2c_quirks = {
Wolfram Sang994647d2015-01-07 12:24:10 +01001390 .max_read_len = QUP_READ_LIMIT,
1391};
1392
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001393static void qup_i2c_enable_clocks(struct qup_i2c_dev *qup)
1394{
1395 clk_prepare_enable(qup->clk);
1396 clk_prepare_enable(qup->pclk);
1397}
1398
1399static void qup_i2c_disable_clocks(struct qup_i2c_dev *qup)
1400{
1401 u32 config;
1402
1403 qup_i2c_change_state(qup, QUP_RESET_STATE);
1404 clk_disable_unprepare(qup->clk);
1405 config = readl(qup->base + QUP_CONFIG);
1406 config |= QUP_CLOCK_AUTO_GATE;
1407 writel(config, qup->base + QUP_CONFIG);
1408 clk_disable_unprepare(qup->pclk);
1409}
1410
1411static int qup_i2c_probe(struct platform_device *pdev)
1412{
1413 static const int blk_sizes[] = {4, 16, 32};
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001414 struct qup_i2c_dev *qup;
1415 unsigned long one_bit_t;
1416 struct resource *res;
1417 u32 io_mode, hw_ver, size;
1418 int ret, fs_div, hs_div;
Naveen Kaje515da742016-10-11 10:27:56 -06001419 u32 src_clk_freq = DEFAULT_SRC_CLK;
1420 u32 clk_freq = DEFAULT_CLK_FREQ;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301421 int blocks;
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001422
1423 qup = devm_kzalloc(&pdev->dev, sizeof(*qup), GFP_KERNEL);
1424 if (!qup)
1425 return -ENOMEM;
1426
1427 qup->dev = &pdev->dev;
1428 init_completion(&qup->xfer);
1429 platform_set_drvdata(pdev, qup);
1430
Naveen Kaje515da742016-10-11 10:27:56 -06001431 ret = device_property_read_u32(qup->dev, "clock-frequency", &clk_freq);
1432 if (ret) {
1433 dev_notice(qup->dev, "using default clock-frequency %d",
1434 DEFAULT_CLK_FREQ);
1435 }
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001436
Sricharan R191424b2016-01-19 15:32:42 +05301437 if (of_device_is_compatible(pdev->dev.of_node, "qcom,i2c-qup-v1.1.1")) {
1438 qup->adap.algo = &qup_i2c_algo;
1439 qup->adap.quirks = &qup_i2c_quirks;
1440 } else {
1441 qup->adap.algo = &qup_i2c_algo_v2;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301442 ret = qup_i2c_req_dma(qup);
1443
1444 if (ret == -EPROBE_DEFER)
1445 goto fail_dma;
1446 else if (ret != 0)
1447 goto nodma;
1448
1449 blocks = (MX_BLOCKS << 1) + 1;
1450 qup->btx.sg = devm_kzalloc(&pdev->dev,
1451 sizeof(*qup->btx.sg) * blocks,
1452 GFP_KERNEL);
1453 if (!qup->btx.sg) {
1454 ret = -ENOMEM;
1455 goto fail_dma;
1456 }
1457 sg_init_table(qup->btx.sg, blocks);
1458
1459 qup->brx.sg = devm_kzalloc(&pdev->dev,
1460 sizeof(*qup->brx.sg) * blocks,
1461 GFP_KERNEL);
1462 if (!qup->brx.sg) {
1463 ret = -ENOMEM;
1464 goto fail_dma;
1465 }
1466 sg_init_table(qup->brx.sg, blocks);
1467
1468 /* 2 tag bytes for each block + 5 for start, stop tags */
1469 size = blocks * 2 + 5;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301470
Sricharan R685983f2016-06-10 23:38:19 +05301471 qup->start_tag.start = devm_kzalloc(&pdev->dev,
1472 size, GFP_KERNEL);
Sricharan R9cedf3b2016-02-22 17:38:15 +05301473 if (!qup->start_tag.start) {
1474 ret = -ENOMEM;
1475 goto fail_dma;
1476 }
1477
Sricharan R685983f2016-06-10 23:38:19 +05301478 qup->brx.tag.start = devm_kzalloc(&pdev->dev, 2, GFP_KERNEL);
Sricharan R9cedf3b2016-02-22 17:38:15 +05301479 if (!qup->brx.tag.start) {
1480 ret = -ENOMEM;
1481 goto fail_dma;
1482 }
1483
Sricharan R685983f2016-06-10 23:38:19 +05301484 qup->btx.tag.start = devm_kzalloc(&pdev->dev, 2, GFP_KERNEL);
Sricharan R9cedf3b2016-02-22 17:38:15 +05301485 if (!qup->btx.tag.start) {
1486 ret = -ENOMEM;
1487 goto fail_dma;
1488 }
1489 qup->is_dma = true;
Sricharan R191424b2016-01-19 15:32:42 +05301490 }
1491
Sricharan R9cedf3b2016-02-22 17:38:15 +05301492nodma:
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001493 /* We support frequencies up to FAST Mode (400KHz) */
1494 if (!clk_freq || clk_freq > 400000) {
1495 dev_err(qup->dev, "clock frequency not supported %d\n",
1496 clk_freq);
1497 return -EINVAL;
1498 }
1499
1500 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1501 qup->base = devm_ioremap_resource(qup->dev, res);
1502 if (IS_ERR(qup->base))
1503 return PTR_ERR(qup->base);
1504
1505 qup->irq = platform_get_irq(pdev, 0);
1506 if (qup->irq < 0) {
1507 dev_err(qup->dev, "No IRQ defined\n");
1508 return qup->irq;
1509 }
1510
Naveen Kaje515da742016-10-11 10:27:56 -06001511 if (has_acpi_companion(qup->dev)) {
1512 ret = device_property_read_u32(qup->dev,
1513 "src-clock-hz", &src_clk_freq);
1514 if (ret) {
1515 dev_notice(qup->dev, "using default src-clock-hz %d",
1516 DEFAULT_SRC_CLK);
1517 }
1518 ACPI_COMPANION_SET(&qup->adap.dev, ACPI_COMPANION(qup->dev));
1519 } else {
1520 qup->clk = devm_clk_get(qup->dev, "core");
1521 if (IS_ERR(qup->clk)) {
1522 dev_err(qup->dev, "Could not get core clock\n");
1523 return PTR_ERR(qup->clk);
1524 }
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001525
Naveen Kaje515da742016-10-11 10:27:56 -06001526 qup->pclk = devm_clk_get(qup->dev, "iface");
1527 if (IS_ERR(qup->pclk)) {
1528 dev_err(qup->dev, "Could not get iface clock\n");
1529 return PTR_ERR(qup->pclk);
1530 }
1531 qup_i2c_enable_clocks(qup);
1532 src_clk_freq = clk_get_rate(qup->clk);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001533 }
1534
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001535 /*
1536 * Bootloaders might leave a pending interrupt on certain QUP's,
1537 * so we reset the core before registering for interrupts.
1538 */
1539 writel(1, qup->base + QUP_SW_RESET);
1540 ret = qup_i2c_poll_state_valid(qup);
1541 if (ret)
1542 goto fail;
1543
1544 ret = devm_request_irq(qup->dev, qup->irq, qup_i2c_interrupt,
1545 IRQF_TRIGGER_HIGH, "i2c_qup", qup);
1546 if (ret) {
1547 dev_err(qup->dev, "Request %d IRQ failed\n", qup->irq);
1548 goto fail;
1549 }
1550 disable_irq(qup->irq);
1551
1552 hw_ver = readl(qup->base + QUP_HW_VERSION);
1553 dev_dbg(qup->dev, "Revision %x\n", hw_ver);
1554
1555 io_mode = readl(qup->base + QUP_IO_MODE);
1556
1557 /*
1558 * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag'
1559 * associated with each byte written/received
1560 */
1561 size = QUP_OUTPUT_BLOCK_SIZE(io_mode);
Pramod Gurav3cf357d2014-08-06 18:03:25 +05301562 if (size >= ARRAY_SIZE(blk_sizes)) {
1563 ret = -EIO;
1564 goto fail;
1565 }
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001566 qup->out_blk_sz = blk_sizes[size] / 2;
1567
1568 size = QUP_INPUT_BLOCK_SIZE(io_mode);
Pramod Gurav3cf357d2014-08-06 18:03:25 +05301569 if (size >= ARRAY_SIZE(blk_sizes)) {
1570 ret = -EIO;
1571 goto fail;
1572 }
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001573 qup->in_blk_sz = blk_sizes[size] / 2;
1574
1575 size = QUP_OUTPUT_FIFO_SIZE(io_mode);
1576 qup->out_fifo_sz = qup->out_blk_sz * (2 << size);
1577
1578 size = QUP_INPUT_FIFO_SIZE(io_mode);
1579 qup->in_fifo_sz = qup->in_blk_sz * (2 << size);
1580
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001581 fs_div = ((src_clk_freq / clk_freq) / 2) - 3;
1582 hs_div = 3;
1583 qup->clk_ctl = (hs_div << 8) | (fs_div & 0xff);
1584
1585 /*
1586 * Time it takes for a byte to be clocked out on the bus.
1587 * Each byte takes 9 clock cycles (8 bits + 1 ack).
1588 */
1589 one_bit_t = (USEC_PER_SEC / clk_freq) + 1;
1590 qup->one_byte_t = one_bit_t * 9;
1591
1592 dev_dbg(qup->dev, "IN:block:%d, fifo:%d, OUT:block:%d, fifo:%d\n",
1593 qup->in_blk_sz, qup->in_fifo_sz,
1594 qup->out_blk_sz, qup->out_fifo_sz);
1595
1596 i2c_set_adapdata(&qup->adap, qup);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001597 qup->adap.dev.parent = qup->dev;
1598 qup->adap.dev.of_node = pdev->dev.of_node;
Sricharan R9cedf3b2016-02-22 17:38:15 +05301599 qup->is_last = true;
Sricharan Rf7418792016-01-19 15:32:43 +05301600
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001601 strlcpy(qup->adap.name, "QUP I2C adapter", sizeof(qup->adap.name));
1602
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001603 pm_runtime_set_autosuspend_delay(qup->dev, MSEC_PER_SEC);
1604 pm_runtime_use_autosuspend(qup->dev);
1605 pm_runtime_set_active(qup->dev);
1606 pm_runtime_enable(qup->dev);
Andy Gross86b59bb2014-09-29 17:00:51 -05001607
1608 ret = i2c_add_adapter(&qup->adap);
1609 if (ret)
1610 goto fail_runtime;
1611
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001612 return 0;
1613
Andy Gross86b59bb2014-09-29 17:00:51 -05001614fail_runtime:
1615 pm_runtime_disable(qup->dev);
1616 pm_runtime_set_suspended(qup->dev);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001617fail:
1618 qup_i2c_disable_clocks(qup);
Sricharan R9cedf3b2016-02-22 17:38:15 +05301619fail_dma:
1620 if (qup->btx.dma)
1621 dma_release_channel(qup->btx.dma);
1622 if (qup->brx.dma)
1623 dma_release_channel(qup->brx.dma);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001624 return ret;
1625}
1626
1627static int qup_i2c_remove(struct platform_device *pdev)
1628{
1629 struct qup_i2c_dev *qup = platform_get_drvdata(pdev);
1630
Sricharan R9cedf3b2016-02-22 17:38:15 +05301631 if (qup->is_dma) {
Sricharan R9cedf3b2016-02-22 17:38:15 +05301632 dma_release_channel(qup->btx.dma);
1633 dma_release_channel(qup->brx.dma);
1634 }
1635
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001636 disable_irq(qup->irq);
1637 qup_i2c_disable_clocks(qup);
1638 i2c_del_adapter(&qup->adap);
1639 pm_runtime_disable(qup->dev);
1640 pm_runtime_set_suspended(qup->dev);
1641 return 0;
1642}
1643
1644#ifdef CONFIG_PM
1645static int qup_i2c_pm_suspend_runtime(struct device *device)
1646{
1647 struct qup_i2c_dev *qup = dev_get_drvdata(device);
1648
1649 dev_dbg(device, "pm_runtime: suspending...\n");
1650 qup_i2c_disable_clocks(qup);
1651 return 0;
1652}
1653
1654static int qup_i2c_pm_resume_runtime(struct device *device)
1655{
1656 struct qup_i2c_dev *qup = dev_get_drvdata(device);
1657
1658 dev_dbg(device, "pm_runtime: resuming...\n");
1659 qup_i2c_enable_clocks(qup);
1660 return 0;
1661}
1662#endif
1663
1664#ifdef CONFIG_PM_SLEEP
1665static int qup_i2c_suspend(struct device *device)
1666{
Sudeep Holla331dcf42016-08-25 12:23:39 +01001667 if (!pm_runtime_suspended(device))
1668 return qup_i2c_pm_suspend_runtime(device);
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001669 return 0;
1670}
1671
1672static int qup_i2c_resume(struct device *device)
1673{
1674 qup_i2c_pm_resume_runtime(device);
1675 pm_runtime_mark_last_busy(device);
1676 pm_request_autosuspend(device);
1677 return 0;
1678}
1679#endif
1680
1681static const struct dev_pm_ops qup_i2c_qup_pm_ops = {
1682 SET_SYSTEM_SLEEP_PM_OPS(
1683 qup_i2c_suspend,
1684 qup_i2c_resume)
1685 SET_RUNTIME_PM_OPS(
1686 qup_i2c_pm_suspend_runtime,
1687 qup_i2c_pm_resume_runtime,
1688 NULL)
1689};
1690
1691static const struct of_device_id qup_i2c_dt_match[] = {
1692 { .compatible = "qcom,i2c-qup-v1.1.1" },
1693 { .compatible = "qcom,i2c-qup-v2.1.1" },
1694 { .compatible = "qcom,i2c-qup-v2.2.1" },
1695 {}
1696};
1697MODULE_DEVICE_TABLE(of, qup_i2c_dt_match);
1698
Naveen Kaje515da742016-10-11 10:27:56 -06001699#if IS_ENABLED(CONFIG_ACPI)
1700static const struct acpi_device_id qup_i2c_acpi_match[] = {
1701 { "QCOM8010"},
1702 { },
1703};
1704MODULE_DEVICE_TABLE(acpi, qup_i2c_acpi_match);
1705#endif
1706
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001707static struct platform_driver qup_i2c_driver = {
1708 .probe = qup_i2c_probe,
1709 .remove = qup_i2c_remove,
1710 .driver = {
1711 .name = "i2c_qup",
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001712 .pm = &qup_i2c_qup_pm_ops,
1713 .of_match_table = qup_i2c_dt_match,
Naveen Kaje515da742016-10-11 10:27:56 -06001714 .acpi_match_table = ACPI_PTR(qup_i2c_acpi_match),
Bjorn Andersson10c5a842014-03-13 19:07:43 -07001715 },
1716};
1717
1718module_platform_driver(qup_i2c_driver);
1719
1720MODULE_LICENSE("GPL v2");
1721MODULE_ALIAS("platform:i2c_qup");