blob: eaf3519e8511bd12ab3813c4a48e2132af42a2b6 [file] [log] [blame]
Alok Chauhanebe211d2012-11-19 21:53:12 +05301/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13/*
14 * QUP driver for Qualcomm MSM platforms
15 *
16 */
17
18/* #define DEBUG */
19
Steve Mucklef132c6c2012-06-06 18:30:57 -070020#include <linux/module.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070021#include <linux/clk.h>
22#include <linux/err.h>
23#include <linux/init.h>
24#include <linux/i2c.h>
25#include <linux/interrupt.h>
26#include <linux/platform_device.h>
27#include <linux/delay.h>
28#include <linux/io.h>
29#include <linux/mutex.h>
30#include <linux/timer.h>
31#include <linux/slab.h>
32#include <mach/board.h>
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -070033#include <mach/gpiomux.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070034#include <linux/slab.h>
35#include <linux/pm_runtime.h>
36#include <linux/gpio.h>
Sagar Dharia4c5bef32012-03-14 17:00:29 -060037#include <linux/of.h>
38#include <linux/of_i2c.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070039
40MODULE_LICENSE("GPL v2");
41MODULE_VERSION("0.2");
42MODULE_ALIAS("platform:i2c_qup");
43
44/* QUP Registers */
45enum {
46 QUP_CONFIG = 0x0,
47 QUP_STATE = 0x4,
48 QUP_IO_MODE = 0x8,
49 QUP_SW_RESET = 0xC,
50 QUP_OPERATIONAL = 0x18,
51 QUP_ERROR_FLAGS = 0x1C,
52 QUP_ERROR_FLAGS_EN = 0x20,
53 QUP_MX_READ_CNT = 0x208,
54 QUP_MX_INPUT_CNT = 0x200,
55 QUP_MX_WR_CNT = 0x100,
56 QUP_OUT_DEBUG = 0x108,
57 QUP_OUT_FIFO_CNT = 0x10C,
58 QUP_OUT_FIFO_BASE = 0x110,
59 QUP_IN_READ_CUR = 0x20C,
60 QUP_IN_DEBUG = 0x210,
61 QUP_IN_FIFO_CNT = 0x214,
62 QUP_IN_FIFO_BASE = 0x218,
63 QUP_I2C_CLK_CTL = 0x400,
64 QUP_I2C_STATUS = 0x404,
65};
66
67/* QUP States and reset values */
68enum {
69 QUP_RESET_STATE = 0,
70 QUP_RUN_STATE = 1U,
71 QUP_STATE_MASK = 3U,
72 QUP_PAUSE_STATE = 3U,
73 QUP_STATE_VALID = 1U << 2,
74 QUP_I2C_MAST_GEN = 1U << 4,
75 QUP_OPERATIONAL_RESET = 0xFF0,
76 QUP_I2C_STATUS_RESET = 0xFFFFFC,
77};
78
79/* QUP OPERATIONAL FLAGS */
80enum {
81 QUP_OUT_SVC_FLAG = 1U << 8,
82 QUP_IN_SVC_FLAG = 1U << 9,
83 QUP_MX_INPUT_DONE = 1U << 11,
84};
85
86/* I2C mini core related values */
87enum {
88 I2C_MINI_CORE = 2U << 8,
89 I2C_N_VAL = 0xF,
90
91};
92
93/* Packing Unpacking words in FIFOs , and IO modes*/
94enum {
95 QUP_WR_BLK_MODE = 1U << 10,
96 QUP_RD_BLK_MODE = 1U << 12,
97 QUP_UNPACK_EN = 1U << 14,
98 QUP_PACK_EN = 1U << 15,
99};
100
101/* QUP tags */
102enum {
103 QUP_OUT_NOP = 0,
104 QUP_OUT_START = 1U << 8,
105 QUP_OUT_DATA = 2U << 8,
106 QUP_OUT_STOP = 3U << 8,
107 QUP_OUT_REC = 4U << 8,
108 QUP_IN_DATA = 5U << 8,
109 QUP_IN_STOP = 6U << 8,
110 QUP_IN_NACK = 7U << 8,
111};
112
113/* Status, Error flags */
114enum {
115 I2C_STATUS_WR_BUFFER_FULL = 1U << 0,
116 I2C_STATUS_BUS_ACTIVE = 1U << 8,
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700117 I2C_STATUS_BUS_MASTER = 1U << 9,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700118 I2C_STATUS_ERROR_MASK = 0x38000FC,
119 QUP_I2C_NACK_FLAG = 1U << 3,
120 QUP_IN_NOT_EMPTY = 1U << 5,
121 QUP_STATUS_ERROR_FLAGS = 0x7C,
122};
123
124/* Master status clock states */
125enum {
126 I2C_CLK_RESET_BUSIDLE_STATE = 0,
127 I2C_CLK_FORCED_LOW_STATE = 5,
128};
129
130#define QUP_MAX_CLK_STATE_RETRIES 300
Gilad Avidovf8f54dd2013-02-12 16:39:07 -0700131#define DEFAULT_CLK_RATE (19200000)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700132
133static char const * const i2c_rsrcs[] = {"i2c_clk", "i2c_sda"};
134
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700135static struct gpiomux_setting recovery_config = {
136 .func = GPIOMUX_FUNC_GPIO,
137 .drv = GPIOMUX_DRV_8MA,
138 .pull = GPIOMUX_PULL_NONE,
139};
140
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700141struct qup_i2c_dev {
142 struct device *dev;
143 void __iomem *base; /* virtual */
144 void __iomem *gsbi; /* virtual */
145 int in_irq;
146 int out_irq;
147 int err_irq;
148 int num_irqs;
149 struct clk *clk;
150 struct clk *pclk;
151 struct i2c_adapter adapter;
152
153 struct i2c_msg *msg;
154 int pos;
155 int cnt;
156 int err;
157 int mode;
158 int clk_ctl;
159 int one_bit_t;
160 int out_fifo_sz;
161 int in_fifo_sz;
162 int out_blk_sz;
163 int in_blk_sz;
164 int wr_sz;
165 struct msm_i2c_platform_data *pdata;
166 int suspended;
Alok Chauhan3acb67e2012-12-17 12:32:14 +0530167 int pwr_state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700168 struct mutex mlock;
169 void *complete;
170 int i2c_gpios[ARRAY_SIZE(i2c_rsrcs)];
171};
172
173#ifdef DEBUG
174static void
175qup_print_status(struct qup_i2c_dev *dev)
176{
177 uint32_t val;
178 val = readl_relaxed(dev->base+QUP_CONFIG);
179 dev_dbg(dev->dev, "Qup config is :0x%x\n", val);
180 val = readl_relaxed(dev->base+QUP_STATE);
181 dev_dbg(dev->dev, "Qup state is :0x%x\n", val);
182 val = readl_relaxed(dev->base+QUP_IO_MODE);
183 dev_dbg(dev->dev, "Qup mode is :0x%x\n", val);
184}
185#else
186static inline void qup_print_status(struct qup_i2c_dev *dev)
187{
188}
189#endif
190
191static irqreturn_t
192qup_i2c_interrupt(int irq, void *devid)
193{
194 struct qup_i2c_dev *dev = devid;
195 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
196 uint32_t status1 = readl_relaxed(dev->base + QUP_ERROR_FLAGS);
197 uint32_t op_flgs = readl_relaxed(dev->base + QUP_OPERATIONAL);
198 int err = 0;
199
Alok Chauhanebe211d2012-11-19 21:53:12 +0530200 if (pm_runtime_suspended(dev->dev))
201 return IRQ_NONE;
202
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700203 if (!dev->msg || !dev->complete) {
204 /* Clear Error interrupt if it's a level triggered interrupt*/
205 if (dev->num_irqs == 1) {
206 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
207 /* Ensure that state is written before ISR exits */
208 mb();
209 }
210 return IRQ_HANDLED;
211 }
212
213 if (status & I2C_STATUS_ERROR_MASK) {
214 dev_err(dev->dev, "QUP: I2C status flags :0x%x, irq:%d\n",
215 status, irq);
216 err = status;
217 /* Clear Error interrupt if it's a level triggered interrupt*/
218 if (dev->num_irqs == 1) {
219 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
220 /* Ensure that state is written before ISR exits */
221 mb();
222 }
223 goto intr_done;
224 }
225
226 if (status1 & 0x7F) {
227 dev_err(dev->dev, "QUP: QUP status flags :0x%x\n", status1);
228 err = -status1;
229 /* Clear Error interrupt if it's a level triggered interrupt*/
230 if (dev->num_irqs == 1) {
231 writel_relaxed((status1 & QUP_STATUS_ERROR_FLAGS),
232 dev->base + QUP_ERROR_FLAGS);
233 /* Ensure that error flags are cleared before ISR
234 * exits
235 */
236 mb();
237 }
238 goto intr_done;
239 }
240
241 if ((dev->num_irqs == 3) && (dev->msg->flags == I2C_M_RD)
242 && (irq == dev->out_irq))
243 return IRQ_HANDLED;
244 if (op_flgs & QUP_OUT_SVC_FLAG) {
245 writel_relaxed(QUP_OUT_SVC_FLAG, dev->base + QUP_OPERATIONAL);
246 /* Ensure that service flag is acknowledged before ISR exits */
247 mb();
248 }
249 if (dev->msg->flags == I2C_M_RD) {
250 if ((op_flgs & QUP_MX_INPUT_DONE) ||
251 (op_flgs & QUP_IN_SVC_FLAG)) {
252 writel_relaxed(QUP_IN_SVC_FLAG, dev->base
253 + QUP_OPERATIONAL);
254 /* Ensure that service flag is acknowledged before ISR
255 * exits
256 */
257 mb();
258 } else
259 return IRQ_HANDLED;
260 }
261
262intr_done:
263 dev_dbg(dev->dev, "QUP intr= %d, i2c status=0x%x, qup status = 0x%x\n",
264 irq, status, status1);
265 qup_print_status(dev);
266 dev->err = err;
267 complete(dev->complete);
268 return IRQ_HANDLED;
269}
270
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600271static int
272qup_i2c_poll_state(struct qup_i2c_dev *dev, uint32_t req_state, bool only_valid)
273{
274 uint32_t retries = 0;
275
276 dev_dbg(dev->dev, "Polling for state:0x%x, or valid-only:%d\n",
277 req_state, only_valid);
278
279 while (retries != 2000) {
280 uint32_t status = readl_relaxed(dev->base + QUP_STATE);
281
282 /*
283 * If only valid bit needs to be checked, requested state is
284 * 'don't care'
285 */
286 if (status & QUP_STATE_VALID) {
287 if (only_valid)
288 return 0;
289 else if ((req_state & QUP_I2C_MAST_GEN) &&
290 (status & QUP_I2C_MAST_GEN))
291 return 0;
292 else if ((status & QUP_STATE_MASK) == req_state)
293 return 0;
294 }
295 if (retries++ == 1000)
296 udelay(100);
297 }
298 return -ETIMEDOUT;
299}
300
301static int
302qup_update_state(struct qup_i2c_dev *dev, uint32_t state)
303{
304 if (qup_i2c_poll_state(dev, 0, true) != 0)
305 return -EIO;
306 writel_relaxed(state, dev->base + QUP_STATE);
307 if (qup_i2c_poll_state(dev, state, false) != 0)
308 return -EIO;
309 return 0;
310}
311
Trilok Sonif0274f12011-08-19 12:26:13 +0530312/*
313 * Before calling qup_config_core_on_en(), please make
314 * sure that QuPE core is in RESET state.
Trilok Sonif0274f12011-08-19 12:26:13 +0530315 */
316static void
317qup_config_core_on_en(struct qup_i2c_dev *dev)
318{
319 uint32_t status;
320
Trilok Sonif0274f12011-08-19 12:26:13 +0530321 status = readl_relaxed(dev->base + QUP_CONFIG);
322 status |= BIT(13);
323 writel_relaxed(status, dev->base + QUP_CONFIG);
324 /* making sure that write has really gone through */
325 mb();
326}
327
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700328static void
329qup_i2c_pwr_mgmt(struct qup_i2c_dev *dev, unsigned int state)
330{
Alok Chauhan3acb67e2012-12-17 12:32:14 +0530331 dev->pwr_state = state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700332 if (state != 0) {
Alok Chauhanebe211d2012-11-19 21:53:12 +0530333 clk_prepare_enable(dev->clk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +0530334 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhanebe211d2012-11-19 21:53:12 +0530335 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700336 } else {
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600337 qup_update_state(dev, QUP_RESET_STATE);
Alok Chauhanebe211d2012-11-19 21:53:12 +0530338 clk_disable_unprepare(dev->clk);
Trilok Sonif0274f12011-08-19 12:26:13 +0530339 qup_config_core_on_en(dev);
Kiran Gunda9aa5e912012-08-16 18:37:46 +0530340 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhanebe211d2012-11-19 21:53:12 +0530341 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700342 }
343}
344
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700345static int
346qup_i2c_poll_writeready(struct qup_i2c_dev *dev, int rem)
347{
348 uint32_t retries = 0;
349
350 while (retries != 2000) {
351 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
352
353 if (!(status & I2C_STATUS_WR_BUFFER_FULL)) {
354 if (((dev->msg->flags & I2C_M_RD) || (rem == 0)) &&
355 !(status & I2C_STATUS_BUS_ACTIVE))
356 return 0;
357 else if ((dev->msg->flags == 0) && (rem > 0))
358 return 0;
359 else /* 1-bit delay before we check for bus busy */
360 udelay(dev->one_bit_t);
361 }
Harini Jayaramand997b3b2011-10-11 14:25:29 -0600362 if (retries++ == 1000) {
363 /*
364 * Wait for FIFO number of bytes to be absolutely sure
365 * that I2C write state machine is not idle. Each byte
366 * takes 9 clock cycles. (8 bits + 1 ack)
367 */
368 usleep_range((dev->one_bit_t * (dev->out_fifo_sz * 9)),
369 (dev->one_bit_t * (dev->out_fifo_sz * 9)));
370 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700371 }
372 qup_print_status(dev);
373 return -ETIMEDOUT;
374}
375
376static int qup_i2c_poll_clock_ready(struct qup_i2c_dev *dev)
377{
378 uint32_t retries = 0;
379
380 /*
381 * Wait for the clock state to transition to either IDLE or FORCED
382 * LOW. This will usually happen within one cycle of the i2c clock.
383 */
384
385 while (retries++ < QUP_MAX_CLK_STATE_RETRIES) {
386 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
387 uint32_t clk_state = (status >> 13) & 0x7;
388
389 if (clk_state == I2C_CLK_RESET_BUSIDLE_STATE ||
390 clk_state == I2C_CLK_FORCED_LOW_STATE)
391 return 0;
392 /* 1-bit delay before we check again */
393 udelay(dev->one_bit_t);
394 }
395
396 dev_err(dev->dev, "Error waiting for clk ready\n");
397 return -ETIMEDOUT;
398}
399
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700400static inline int qup_i2c_request_gpios(struct qup_i2c_dev *dev)
401{
402 int i;
403 int result = 0;
404
405 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
406 if (dev->i2c_gpios[i] >= 0) {
407 result = gpio_request(dev->i2c_gpios[i], i2c_rsrcs[i]);
408 if (result) {
409 dev_err(dev->dev,
410 "gpio_request for pin %d failed\
411 with error %d\n", dev->i2c_gpios[i],
412 result);
413 goto error;
414 }
415 }
416 }
417 return 0;
418
419error:
420 for (; --i >= 0;) {
421 if (dev->i2c_gpios[i] >= 0)
422 gpio_free(dev->i2c_gpios[i]);
423 }
424 return result;
425}
426
427static inline void qup_i2c_free_gpios(struct qup_i2c_dev *dev)
428{
429 int i;
430
431 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
432 if (dev->i2c_gpios[i] >= 0)
433 gpio_free(dev->i2c_gpios[i]);
434 }
435}
436
437#ifdef DEBUG
438static void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
439 uint32_t addr, int rdwr)
440{
441 if (rdwr)
442 dev_dbg(dev->dev, "RD:Wrote 0x%x to out_ff:0x%x\n", val, addr);
443 else
444 dev_dbg(dev->dev, "WR:Wrote 0x%x to out_ff:0x%x\n", val, addr);
445}
446#else
447static inline void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
448 uint32_t addr, int rdwr)
449{
450}
451#endif
452
453static void
454qup_issue_read(struct qup_i2c_dev *dev, struct i2c_msg *msg, int *idx,
455 uint32_t carry_over)
456{
457 uint16_t addr = (msg->addr << 1) | 1;
458 /* QUP limit 256 bytes per read. By HW design, 0 in the 8-bit field
459 * is treated as 256 byte read.
460 */
461 uint16_t rd_len = ((dev->cnt == 256) ? 0 : dev->cnt);
462
463 if (*idx % 4) {
464 writel_relaxed(carry_over | ((QUP_OUT_START | addr) << 16),
465 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx-2)); */
466
467 qup_verify_fifo(dev, carry_over |
468 ((QUP_OUT_START | addr) << 16), (uint32_t)dev->base
469 + QUP_OUT_FIFO_BASE + (*idx - 2), 1);
470 writel_relaxed((QUP_OUT_REC | rd_len),
471 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx+2)); */
472
473 qup_verify_fifo(dev, (QUP_OUT_REC | rd_len),
474 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx + 2), 1);
475 } else {
476 writel_relaxed(((QUP_OUT_REC | rd_len) << 16)
477 | QUP_OUT_START | addr,
478 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx)); */
479
480 qup_verify_fifo(dev, QUP_OUT_REC << 16 | rd_len << 16 |
481 QUP_OUT_START | addr,
482 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx), 1);
483 }
484 *idx += 4;
485}
486
487static void
488qup_issue_write(struct qup_i2c_dev *dev, struct i2c_msg *msg, int rem,
489 int *idx, uint32_t *carry_over)
490{
491 int entries = dev->cnt;
492 int empty_sl = dev->wr_sz - ((*idx) >> 1);
493 int i = 0;
494 uint32_t val = 0;
495 uint32_t last_entry = 0;
496 uint16_t addr = msg->addr << 1;
497
498 if (dev->pos == 0) {
499 if (*idx % 4) {
500 writel_relaxed(*carry_over | ((QUP_OUT_START |
501 addr) << 16),
502 dev->base + QUP_OUT_FIFO_BASE);
503
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600504 qup_verify_fifo(dev, *carry_over | QUP_OUT_START << 16 |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700505 addr << 16, (uint32_t)dev->base +
506 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
507 } else
508 val = QUP_OUT_START | addr;
509 *idx += 2;
510 i++;
511 entries++;
512 } else {
513 /* Avoid setp time issue by adding 1 NOP when number of bytes
514 * are more than FIFO/BLOCK size. setup time issue can't appear
515 * otherwise since next byte to be written will always be ready
516 */
517 val = (QUP_OUT_NOP | 1);
518 *idx += 2;
519 i++;
520 entries++;
521 }
522 if (entries > empty_sl)
523 entries = empty_sl;
524
525 for (; i < (entries - 1); i++) {
526 if (*idx % 4) {
527 writel_relaxed(val | ((QUP_OUT_DATA |
528 msg->buf[dev->pos]) << 16),
529 dev->base + QUP_OUT_FIFO_BASE);
530
531 qup_verify_fifo(dev, val | QUP_OUT_DATA << 16 |
532 msg->buf[dev->pos] << 16, (uint32_t)dev->base +
533 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
534 } else
535 val = QUP_OUT_DATA | msg->buf[dev->pos];
536 (*idx) += 2;
537 dev->pos++;
538 }
539 if (dev->pos < (msg->len - 1))
540 last_entry = QUP_OUT_DATA;
541 else if (rem > 1) /* not last array entry */
542 last_entry = QUP_OUT_DATA;
543 else
544 last_entry = QUP_OUT_STOP;
545 if ((*idx % 4) == 0) {
546 /*
547 * If read-start and read-command end up in different fifos, it
548 * may result in extra-byte being read due to extra-read cycle.
549 * Avoid that by inserting NOP as the last entry of fifo only
550 * if write command(s) leave 1 space in fifo.
551 */
552 if (rem > 1) {
553 struct i2c_msg *next = msg + 1;
Harini Jayaraman24bea432011-10-11 16:06:28 -0600554 if (next->addr == msg->addr && (next->flags & I2C_M_RD)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700555 && *idx == ((dev->wr_sz*2) - 4)) {
556 writel_relaxed(((last_entry |
557 msg->buf[dev->pos]) |
558 ((1 | QUP_OUT_NOP) << 16)), dev->base +
559 QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
560
561 qup_verify_fifo(dev,
562 ((last_entry | msg->buf[dev->pos]) |
563 ((1 | QUP_OUT_NOP) << 16)),
564 (uint32_t)dev->base +
565 QUP_OUT_FIFO_BASE + (*idx), 0);
566 *idx += 2;
567 } else if (next->flags == 0 && dev->pos == msg->len - 1
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600568 && *idx < (dev->wr_sz*2) &&
569 (next->addr != msg->addr)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700570 /* Last byte of an intermittent write */
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600571 writel_relaxed((QUP_OUT_STOP |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700572 msg->buf[dev->pos]),
573 dev->base + QUP_OUT_FIFO_BASE);
574
575 qup_verify_fifo(dev,
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600576 QUP_OUT_STOP | msg->buf[dev->pos],
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700577 (uint32_t)dev->base +
578 QUP_OUT_FIFO_BASE + (*idx), 0);
579 *idx += 2;
580 } else
581 *carry_over = (last_entry | msg->buf[dev->pos]);
582 } else {
583 writel_relaxed((last_entry | msg->buf[dev->pos]),
584 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
585
586 qup_verify_fifo(dev, last_entry | msg->buf[dev->pos],
587 (uint32_t)dev->base + QUP_OUT_FIFO_BASE +
588 (*idx), 0);
589 }
590 } else {
591 writel_relaxed(val | ((last_entry | msg->buf[dev->pos]) << 16),
592 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
593
594 qup_verify_fifo(dev, val | (last_entry << 16) |
595 (msg->buf[dev->pos] << 16), (uint32_t)dev->base +
596 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
597 }
598
599 *idx += 2;
600 dev->pos++;
601 dev->cnt = msg->len - dev->pos;
602}
603
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700604static void
605qup_set_read_mode(struct qup_i2c_dev *dev, int rd_len)
606{
607 uint32_t wr_mode = (dev->wr_sz < dev->out_fifo_sz) ?
608 QUP_WR_BLK_MODE : 0;
609 if (rd_len > 256) {
610 dev_dbg(dev->dev, "HW limit: Breaking reads in chunk of 256\n");
611 rd_len = 256;
612 }
613 if (rd_len <= dev->in_fifo_sz) {
614 writel_relaxed(wr_mode | QUP_PACK_EN | QUP_UNPACK_EN,
615 dev->base + QUP_IO_MODE);
616 writel_relaxed(rd_len, dev->base + QUP_MX_READ_CNT);
617 } else {
618 writel_relaxed(wr_mode | QUP_RD_BLK_MODE |
619 QUP_PACK_EN | QUP_UNPACK_EN, dev->base + QUP_IO_MODE);
620 writel_relaxed(rd_len, dev->base + QUP_MX_INPUT_CNT);
621 }
622}
623
624static int
625qup_set_wr_mode(struct qup_i2c_dev *dev, int rem)
626{
627 int total_len = 0;
628 int ret = 0;
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600629 int len = dev->msg->len;
630 struct i2c_msg *next = NULL;
631 if (rem > 1)
632 next = dev->msg + 1;
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600633 while (rem > 1 && next->flags == 0 && (next->addr == dev->msg->addr)) {
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600634 len += next->len + 1;
635 next = next + 1;
636 rem--;
637 }
638 if (len >= (dev->out_fifo_sz - 1)) {
639 total_len = len + 1 + (len/(dev->out_blk_sz-1));
640
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700641 writel_relaxed(QUP_WR_BLK_MODE | QUP_PACK_EN | QUP_UNPACK_EN,
642 dev->base + QUP_IO_MODE);
643 dev->wr_sz = dev->out_blk_sz;
644 } else
645 writel_relaxed(QUP_PACK_EN | QUP_UNPACK_EN,
646 dev->base + QUP_IO_MODE);
647
648 if (rem > 1) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700649 if (next->addr == dev->msg->addr &&
650 next->flags == I2C_M_RD) {
651 qup_set_read_mode(dev, next->len);
652 /* make sure read start & read command are in 1 blk */
653 if ((total_len % dev->out_blk_sz) ==
654 (dev->out_blk_sz - 1))
655 total_len += 3;
656 else
657 total_len += 2;
658 }
659 }
660 /* WRITE COUNT register valid/used only in block mode */
661 if (dev->wr_sz == dev->out_blk_sz)
662 writel_relaxed(total_len, dev->base + QUP_MX_WR_CNT);
663 return ret;
664}
665
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700666
667static void qup_i2c_recover_bus_busy(struct qup_i2c_dev *dev)
668{
669 int i;
670 int gpio_clk;
671 int gpio_dat;
672 bool gpio_clk_status = false;
673 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
674 struct gpiomux_setting old_gpio_setting;
675
676 if (dev->pdata->msm_i2c_config_gpio)
677 return;
678
679 if (!(status & (I2C_STATUS_BUS_ACTIVE)) ||
680 (status & (I2C_STATUS_BUS_MASTER)))
681 return;
682
683 gpio_clk = dev->i2c_gpios[0];
684 gpio_dat = dev->i2c_gpios[1];
685
686 if ((gpio_clk == -1) && (gpio_dat == -1)) {
687 dev_err(dev->dev, "Recovery failed due to undefined GPIO's\n");
688 return;
689 }
690
691 disable_irq(dev->err_irq);
692 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
693 if (msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
694 &recovery_config, &old_gpio_setting)) {
695 dev_err(dev->dev, "GPIO pins have no active setting\n");
696 goto recovery_end;
697 }
698 }
699
700 dev_warn(dev->dev, "i2c_scl: %d, i2c_sda: %d\n",
701 gpio_get_value(gpio_clk), gpio_get_value(gpio_dat));
702
703 for (i = 0; i < 9; i++) {
704 if (gpio_get_value(gpio_dat) && gpio_clk_status)
705 break;
706 gpio_direction_output(gpio_clk, 0);
707 udelay(5);
708 gpio_direction_output(gpio_dat, 0);
709 udelay(5);
710 gpio_direction_input(gpio_clk);
711 udelay(5);
712 if (!gpio_get_value(gpio_clk))
713 udelay(20);
714 if (!gpio_get_value(gpio_clk))
715 usleep_range(10000, 10000);
716 gpio_clk_status = gpio_get_value(gpio_clk);
717 gpio_direction_input(gpio_dat);
718 udelay(5);
719 }
720
721 /* Configure ALT funciton to QUP I2C*/
722 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
723 msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
724 &old_gpio_setting, NULL);
725 }
726
727 udelay(10);
728
729 status = readl_relaxed(dev->base + QUP_I2C_STATUS);
730 if (!(status & I2C_STATUS_BUS_ACTIVE)) {
731 dev_info(dev->dev, "Bus busy cleared after %d clock cycles, "
732 "status %x\n",
733 i, status);
734 goto recovery_end;
735 }
736
737 dev_warn(dev->dev, "Bus still busy, status %x\n", status);
738
739recovery_end:
740 enable_irq(dev->err_irq);
741}
742
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700743static int
744qup_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
745{
746 DECLARE_COMPLETION_ONSTACK(complete);
747 struct qup_i2c_dev *dev = i2c_get_adapdata(adap);
748 int ret;
749 int rem = num;
750 long timeout;
751 int err;
752
Alok Chauhanebe211d2012-11-19 21:53:12 +0530753 pm_runtime_get_sync(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700754 mutex_lock(&dev->mlock);
755
756 if (dev->suspended) {
757 mutex_unlock(&dev->mlock);
758 return -EIO;
759 }
760
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700761 /* Initialize QUP registers during first transfer */
762 if (dev->clk_ctl == 0) {
763 int fs_div;
764 int hs_div;
765 uint32_t fifo_reg;
766
767 if (dev->gsbi) {
768 writel_relaxed(0x2 << 4, dev->gsbi);
769 /* GSBI memory is not in the same 1K region as other
770 * QUP registers. mb() here ensures that the GSBI
771 * register is updated in correct order and that the
772 * write has gone through before programming QUP core
773 * registers
774 */
775 mb();
776 }
777
778 fs_div = ((dev->pdata->src_clk_rate
779 / dev->pdata->clk_freq) / 2) - 3;
780 hs_div = 3;
781 dev->clk_ctl = ((hs_div & 0x7) << 8) | (fs_div & 0xff);
782 fifo_reg = readl_relaxed(dev->base + QUP_IO_MODE);
783 if (fifo_reg & 0x3)
784 dev->out_blk_sz = (fifo_reg & 0x3) * 16;
785 else
786 dev->out_blk_sz = 16;
787 if (fifo_reg & 0x60)
788 dev->in_blk_sz = ((fifo_reg & 0x60) >> 5) * 16;
789 else
790 dev->in_blk_sz = 16;
791 /*
792 * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag'
793 * associated with each byte written/received
794 */
795 dev->out_blk_sz /= 2;
796 dev->in_blk_sz /= 2;
797 dev->out_fifo_sz = dev->out_blk_sz *
798 (2 << ((fifo_reg & 0x1C) >> 2));
799 dev->in_fifo_sz = dev->in_blk_sz *
800 (2 << ((fifo_reg & 0x380) >> 7));
801 dev_dbg(dev->dev, "QUP IN:bl:%d, ff:%d, OUT:bl:%d, ff:%d\n",
802 dev->in_blk_sz, dev->in_fifo_sz,
803 dev->out_blk_sz, dev->out_fifo_sz);
804 }
805
806 writel_relaxed(1, dev->base + QUP_SW_RESET);
Sagar Dharia518e2302011-08-05 11:03:03 -0600807 ret = qup_i2c_poll_state(dev, QUP_RESET_STATE, false);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700808 if (ret) {
809 dev_err(dev->dev, "QUP Busy:Trying to recover\n");
810 goto out_err;
811 }
812
813 if (dev->num_irqs == 3) {
814 enable_irq(dev->in_irq);
815 enable_irq(dev->out_irq);
816 }
817 enable_irq(dev->err_irq);
818
819 /* Initialize QUP registers */
820 writel_relaxed(0, dev->base + QUP_CONFIG);
821 writel_relaxed(QUP_OPERATIONAL_RESET, dev->base + QUP_OPERATIONAL);
822 writel_relaxed(QUP_STATUS_ERROR_FLAGS, dev->base + QUP_ERROR_FLAGS_EN);
823
824 writel_relaxed(I2C_MINI_CORE | I2C_N_VAL, dev->base + QUP_CONFIG);
825
826 /* Initialize I2C mini core registers */
827 writel_relaxed(0, dev->base + QUP_I2C_CLK_CTL);
828 writel_relaxed(QUP_I2C_STATUS_RESET, dev->base + QUP_I2C_STATUS);
829
830 while (rem) {
831 bool filled = false;
832
833 dev->cnt = msgs->len - dev->pos;
834 dev->msg = msgs;
835
836 dev->wr_sz = dev->out_fifo_sz;
837 dev->err = 0;
838 dev->complete = &complete;
839
Sagar Dharia518e2302011-08-05 11:03:03 -0600840 if (qup_i2c_poll_state(dev, QUP_I2C_MAST_GEN, false) != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700841 ret = -EIO;
842 goto out_err;
843 }
844
845 qup_print_status(dev);
846 /* HW limits Read upto 256 bytes in 1 read without stop */
847 if (dev->msg->flags & I2C_M_RD) {
848 qup_set_read_mode(dev, dev->cnt);
849 if (dev->cnt > 256)
850 dev->cnt = 256;
851 } else {
852 ret = qup_set_wr_mode(dev, rem);
853 if (ret != 0)
854 goto out_err;
855 /* Don't fill block till we get interrupt */
856 if (dev->wr_sz == dev->out_blk_sz)
857 filled = true;
858 }
859
860 err = qup_update_state(dev, QUP_RUN_STATE);
861 if (err < 0) {
862 ret = err;
863 goto out_err;
864 }
865
866 qup_print_status(dev);
867 writel_relaxed(dev->clk_ctl, dev->base + QUP_I2C_CLK_CTL);
868 /* CLK_CTL register is not in the same 1K region as other QUP
869 * registers. Ensure that clock control is written before
870 * programming other QUP registers
871 */
872 mb();
873
874 do {
875 int idx = 0;
876 uint32_t carry_over = 0;
877
878 /* Transition to PAUSE state only possible from RUN */
879 err = qup_update_state(dev, QUP_PAUSE_STATE);
880 if (err < 0) {
881 ret = err;
882 goto out_err;
883 }
884
885 qup_print_status(dev);
886 /* This operation is Write, check the next operation
887 * and decide mode
888 */
889 while (filled == false) {
890 if ((msgs->flags & I2C_M_RD))
891 qup_issue_read(dev, msgs, &idx,
892 carry_over);
893 else if (!(msgs->flags & I2C_M_RD))
894 qup_issue_write(dev, msgs, rem, &idx,
895 &carry_over);
896 if (idx >= (dev->wr_sz << 1))
897 filled = true;
898 /* Start new message */
899 if (filled == false) {
900 if (msgs->flags & I2C_M_RD)
901 filled = true;
902 else if (rem > 1) {
903 /* Only combine operations with
904 * same address
905 */
906 struct i2c_msg *next = msgs + 1;
907 if (next->addr != msgs->addr)
908 filled = true;
909 else {
910 rem--;
911 msgs++;
912 dev->msg = msgs;
913 dev->pos = 0;
914 dev->cnt = msgs->len;
915 if (msgs->len > 256)
916 dev->cnt = 256;
917 }
918 } else
919 filled = true;
920 }
921 }
922 err = qup_update_state(dev, QUP_RUN_STATE);
923 if (err < 0) {
924 ret = err;
925 goto out_err;
926 }
927 dev_dbg(dev->dev, "idx:%d, rem:%d, num:%d, mode:%d\n",
928 idx, rem, num, dev->mode);
929
930 qup_print_status(dev);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700931 timeout = wait_for_completion_timeout(&complete,
932 msecs_to_jiffies(dev->out_fifo_sz));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700933 if (!timeout) {
934 uint32_t istatus = readl_relaxed(dev->base +
935 QUP_I2C_STATUS);
936 uint32_t qstatus = readl_relaxed(dev->base +
937 QUP_ERROR_FLAGS);
938 uint32_t op_flgs = readl_relaxed(dev->base +
939 QUP_OPERATIONAL);
940
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700941 /*
942 * Dont wait for 1 sec if i2c sees the bus
943 * active and controller is not master.
944 * A slave has pulled line low. Try to recover
945 */
946 if (!(istatus & I2C_STATUS_BUS_ACTIVE) ||
947 (istatus & I2C_STATUS_BUS_MASTER)) {
948 timeout =
949 wait_for_completion_timeout(&complete,
950 HZ);
951 if (timeout)
952 goto timeout_err;
953 }
954 qup_i2c_recover_bus_busy(dev);
955 dev_err(dev->dev,
956 "Transaction timed out, SL-AD = 0x%x\n",
957 dev->msg->addr);
958
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700959 dev_err(dev->dev, "I2C Status: %x\n", istatus);
960 dev_err(dev->dev, "QUP Status: %x\n", qstatus);
961 dev_err(dev->dev, "OP Flags: %x\n", op_flgs);
962 writel_relaxed(1, dev->base + QUP_SW_RESET);
963 /* Make sure that the write has gone through
964 * before returning from the function
965 */
966 mb();
967 ret = -ETIMEDOUT;
968 goto out_err;
969 }
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700970timeout_err:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700971 if (dev->err) {
972 if (dev->err > 0 &&
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700973 dev->err & QUP_I2C_NACK_FLAG) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700974 dev_err(dev->dev,
975 "I2C slave addr:0x%x not connected\n",
976 dev->msg->addr);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700977 dev->err = ENOTCONN;
978 } else if (dev->err < 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700979 dev_err(dev->dev,
980 "QUP data xfer error %d\n", dev->err);
981 ret = dev->err;
982 goto out_err;
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700983 } else if (dev->err > 0) {
984 /*
985 * ISR returns +ve error if error code
986 * is I2C related, e.g. unexpected start
987 * So you may call recover-bus-busy when
988 * this error happens
989 */
990 qup_i2c_recover_bus_busy(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700991 }
992 ret = -dev->err;
993 goto out_err;
994 }
995 if (dev->msg->flags & I2C_M_RD) {
996 int i;
997 uint32_t dval = 0;
998 for (i = 0; dev->pos < dev->msg->len; i++,
999 dev->pos++) {
1000 uint32_t rd_status =
1001 readl_relaxed(dev->base
1002 + QUP_OPERATIONAL);
1003 if (i % 2 == 0) {
1004 if ((rd_status &
1005 QUP_IN_NOT_EMPTY) == 0)
1006 break;
1007 dval = readl_relaxed(dev->base +
1008 QUP_IN_FIFO_BASE);
1009 dev->msg->buf[dev->pos] =
1010 dval & 0xFF;
1011 } else
1012 dev->msg->buf[dev->pos] =
1013 ((dval & 0xFF0000) >>
1014 16);
1015 }
1016 dev->cnt -= i;
1017 } else
1018 filled = false; /* refill output FIFO */
1019 dev_dbg(dev->dev, "pos:%d, len:%d, cnt:%d\n",
1020 dev->pos, msgs->len, dev->cnt);
1021 } while (dev->cnt > 0);
1022 if (dev->cnt == 0) {
1023 if (msgs->len == dev->pos) {
1024 rem--;
1025 msgs++;
1026 dev->pos = 0;
1027 }
1028 if (rem) {
1029 err = qup_i2c_poll_clock_ready(dev);
1030 if (err < 0) {
1031 ret = err;
1032 goto out_err;
1033 }
1034 err = qup_update_state(dev, QUP_RESET_STATE);
1035 if (err < 0) {
1036 ret = err;
1037 goto out_err;
1038 }
1039 }
1040 }
1041 /* Wait for I2C bus to be idle */
1042 ret = qup_i2c_poll_writeready(dev, rem);
1043 if (ret) {
1044 dev_err(dev->dev,
1045 "Error waiting for write ready\n");
1046 goto out_err;
1047 }
1048 }
1049
1050 ret = num;
1051 out_err:
1052 disable_irq(dev->err_irq);
1053 if (dev->num_irqs == 3) {
1054 disable_irq(dev->in_irq);
1055 disable_irq(dev->out_irq);
1056 }
1057 dev->complete = NULL;
1058 dev->msg = NULL;
1059 dev->pos = 0;
1060 dev->err = 0;
1061 dev->cnt = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001062 mutex_unlock(&dev->mlock);
Alok Chauhanebe211d2012-11-19 21:53:12 +05301063 pm_runtime_mark_last_busy(dev->dev);
1064 pm_runtime_put_autosuspend(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001065 return ret;
1066}
1067
1068static u32
1069qup_i2c_func(struct i2c_adapter *adap)
1070{
1071 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
1072}
1073
1074static const struct i2c_algorithm qup_i2c_algo = {
1075 .master_xfer = qup_i2c_xfer,
1076 .functionality = qup_i2c_func,
1077};
1078
1079static int __devinit
1080qup_i2c_probe(struct platform_device *pdev)
1081{
1082 struct qup_i2c_dev *dev;
1083 struct resource *qup_mem, *gsbi_mem, *qup_io, *gsbi_io, *res;
1084 struct resource *in_irq, *out_irq, *err_irq;
1085 struct clk *clk, *pclk;
1086 int ret = 0;
1087 int i;
1088 struct msm_i2c_platform_data *pdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001089
1090 gsbi_mem = NULL;
1091 dev_dbg(&pdev->dev, "qup_i2c_probe\n");
1092
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001093 if (pdev->dev.of_node) {
1094 struct device_node *node = pdev->dev.of_node;
1095 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
1096 if (!pdata)
1097 return -ENOMEM;
1098 ret = of_property_read_u32(node, "qcom,i2c-bus-freq",
1099 &pdata->clk_freq);
1100 if (ret)
1101 goto get_res_failed;
1102 ret = of_property_read_u32(node, "cell-index", &pdev->id);
1103 if (ret)
1104 goto get_res_failed;
1105 /* Optional property */
1106 of_property_read_u32(node, "qcom,i2c-src-freq",
1107 &pdata->src_clk_rate);
1108 } else
1109 pdata = pdev->dev.platform_data;
1110
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001111 if (!pdata) {
1112 dev_err(&pdev->dev, "platform data not initialized\n");
1113 return -ENOSYS;
1114 }
1115 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1116 "qup_phys_addr");
1117 if (!qup_mem) {
1118 dev_err(&pdev->dev, "no qup mem resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001119 ret = -ENODEV;
1120 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001121 }
1122
1123 /*
1124 * We only have 1 interrupt for new hardware targets and in_irq,
1125 * out_irq will be NULL for those platforms
1126 */
1127 in_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1128 "qup_in_intr");
1129
1130 out_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1131 "qup_out_intr");
1132
1133 err_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1134 "qup_err_intr");
1135 if (!err_irq) {
1136 dev_err(&pdev->dev, "no error irq resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001137 ret = -ENODEV;
1138 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001139 }
1140
1141 qup_io = request_mem_region(qup_mem->start, resource_size(qup_mem),
1142 pdev->name);
1143 if (!qup_io) {
1144 dev_err(&pdev->dev, "QUP region already claimed\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001145 ret = -EBUSY;
1146 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001147 }
1148 if (!pdata->use_gsbi_shared_mode) {
1149 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1150 "gsbi_qup_i2c_addr");
1151 if (!gsbi_mem) {
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001152 dev_dbg(&pdev->dev, "Assume BLSP\n");
1153 /*
1154 * BLSP core does not need protocol programming so this
1155 * resource is not expected
1156 */
1157 goto blsp_core_init;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001158 }
1159 gsbi_io = request_mem_region(gsbi_mem->start,
1160 resource_size(gsbi_mem),
1161 pdev->name);
1162 if (!gsbi_io) {
1163 dev_err(&pdev->dev, "GSBI region already claimed\n");
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001164 ret = -EBUSY;
1165 goto err_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001166 }
1167 }
1168
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001169blsp_core_init:
Matt Wagantallac294852011-08-17 15:44:58 -07001170 clk = clk_get(&pdev->dev, "core_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001171 if (IS_ERR(clk)) {
Matt Wagantallac294852011-08-17 15:44:58 -07001172 dev_err(&pdev->dev, "Could not get core_clk\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001173 ret = PTR_ERR(clk);
1174 goto err_clk_get_failed;
1175 }
1176
Matt Wagantallac294852011-08-17 15:44:58 -07001177 pclk = clk_get(&pdev->dev, "iface_clk");
1178 if (IS_ERR(pclk)) {
1179 dev_err(&pdev->dev, "Could not get iface_clk\n");
1180 ret = PTR_ERR(pclk);
1181 clk_put(clk);
1182 goto err_clk_get_failed;
1183 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001184
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001185 /* We support frequencies upto FAST Mode(400KHz) */
1186 if (pdata->clk_freq <= 0 ||
1187 pdata->clk_freq > 400000) {
1188 dev_err(&pdev->dev, "clock frequency not supported\n");
1189 ret = -EIO;
1190 goto err_config_failed;
1191 }
1192
1193 dev = kzalloc(sizeof(struct qup_i2c_dev), GFP_KERNEL);
1194 if (!dev) {
1195 ret = -ENOMEM;
1196 goto err_alloc_dev_failed;
1197 }
1198
1199 dev->dev = &pdev->dev;
1200 if (in_irq)
1201 dev->in_irq = in_irq->start;
1202 if (out_irq)
1203 dev->out_irq = out_irq->start;
1204 dev->err_irq = err_irq->start;
1205 if (in_irq && out_irq)
1206 dev->num_irqs = 3;
1207 else
1208 dev->num_irqs = 1;
1209 dev->clk = clk;
1210 dev->pclk = pclk;
1211 dev->base = ioremap(qup_mem->start, resource_size(qup_mem));
1212 if (!dev->base) {
1213 ret = -ENOMEM;
1214 goto err_ioremap_failed;
1215 }
1216
1217 /* Configure GSBI block to use I2C functionality */
1218 if (gsbi_mem) {
1219 dev->gsbi = ioremap(gsbi_mem->start, resource_size(gsbi_mem));
1220 if (!dev->gsbi) {
1221 ret = -ENOMEM;
1222 goto err_gsbi_failed;
1223 }
1224 }
1225
1226 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
1227 res = platform_get_resource_byname(pdev, IORESOURCE_IO,
1228 i2c_rsrcs[i]);
1229 dev->i2c_gpios[i] = res ? res->start : -1;
1230 }
1231
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001232 platform_set_drvdata(pdev, dev);
1233
Harini Jayaramand997b3b2011-10-11 14:25:29 -06001234 dev->one_bit_t = (USEC_PER_SEC/pdata->clk_freq) + 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001235 dev->pdata = pdata;
1236 dev->clk_ctl = 0;
1237 dev->pos = 0;
1238
Gilad Avidovf8f54dd2013-02-12 16:39:07 -07001239 if (dev->pdata->src_clk_rate <= 0) {
1240 dev_info(&pdev->dev,
1241 "No src_clk_rate specified in platfrom data or "
1242 "qcom,i2c-src-freq in DT\n");
1243 dev_info(&pdev->dev, "Using default clock rate %dHz\n",
1244 DEFAULT_CLK_RATE);
1245 dev->pdata->src_clk_rate = DEFAULT_CLK_RATE;
1246 }
1247
1248 ret = clk_set_rate(dev->clk, dev->pdata->src_clk_rate);
1249 if (ret)
1250 dev_info(&pdev->dev, "clk_set_rate(core_clk, %dHz):%d\n",
1251 dev->pdata->src_clk_rate, ret);
1252
1253 clk_prepare_enable(dev->clk);
1254 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001255 /*
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001256 * If bootloaders leave a pending interrupt on certain GSBI's,
1257 * then we reset the core before registering for interrupts.
1258 */
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001259 writel_relaxed(1, dev->base + QUP_SW_RESET);
1260 if (qup_i2c_poll_state(dev, 0, true) != 0)
1261 goto err_reset_failed;
1262 clk_disable_unprepare(dev->clk);
1263 clk_disable_unprepare(dev->pclk);
1264
1265 /*
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001266 * We use num_irqs to also indicate if we got 3 interrupts or just 1.
1267 * If we have just 1, we use err_irq as the general purpose irq
1268 * and handle the changes in ISR accordingly
1269 * Per Hardware guidelines, if we have 3 interrupts, they are always
1270 * edge triggering, and if we have 1, it's always level-triggering
1271 */
1272 if (dev->num_irqs == 3) {
1273 ret = request_irq(dev->in_irq, qup_i2c_interrupt,
1274 IRQF_TRIGGER_RISING, "qup_in_intr", dev);
1275 if (ret) {
1276 dev_err(&pdev->dev, "request_in_irq failed\n");
1277 goto err_request_irq_failed;
1278 }
1279 /*
1280 * We assume out_irq exists if in_irq does since platform
1281 * configuration either has 3 interrupts assigned to QUP or 1
1282 */
1283 ret = request_irq(dev->out_irq, qup_i2c_interrupt,
1284 IRQF_TRIGGER_RISING, "qup_out_intr", dev);
1285 if (ret) {
1286 dev_err(&pdev->dev, "request_out_irq failed\n");
1287 free_irq(dev->in_irq, dev);
1288 goto err_request_irq_failed;
1289 }
1290 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1291 IRQF_TRIGGER_RISING, "qup_err_intr", dev);
1292 if (ret) {
1293 dev_err(&pdev->dev, "request_err_irq failed\n");
1294 free_irq(dev->out_irq, dev);
1295 free_irq(dev->in_irq, dev);
1296 goto err_request_irq_failed;
1297 }
1298 } else {
1299 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1300 IRQF_TRIGGER_HIGH, "qup_err_intr", dev);
1301 if (ret) {
1302 dev_err(&pdev->dev, "request_err_irq failed\n");
1303 goto err_request_irq_failed;
1304 }
1305 }
1306 disable_irq(dev->err_irq);
1307 if (dev->num_irqs == 3) {
1308 disable_irq(dev->in_irq);
1309 disable_irq(dev->out_irq);
1310 }
1311 i2c_set_adapdata(&dev->adapter, dev);
1312 dev->adapter.algo = &qup_i2c_algo;
1313 strlcpy(dev->adapter.name,
1314 "QUP I2C adapter",
1315 sizeof(dev->adapter.name));
1316 dev->adapter.nr = pdev->id;
Kenneth Heitke9b702862013-01-30 13:39:13 -07001317 dev->adapter.dev.parent = &pdev->dev;
Harini Jayaramance67cf82011-08-05 09:26:06 -06001318 if (pdata->msm_i2c_config_gpio)
1319 pdata->msm_i2c_config_gpio(dev->adapter.nr, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001320
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001321 mutex_init(&dev->mlock);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301322 dev->pwr_state = 0;
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301323 /* If the same AHB clock is used on Modem side
1324 * switch it on here itself and don't switch it
1325 * on and off during suspend and resume.
1326 */
1327 if (dev->pdata->keep_ahb_clk_on)
Alok Chauhanebe211d2012-11-19 21:53:12 +05301328 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001329
1330 ret = i2c_add_numbered_adapter(&dev->adapter);
1331 if (ret) {
1332 dev_err(&pdev->dev, "i2c_add_adapter failed\n");
1333 if (dev->num_irqs == 3) {
1334 free_irq(dev->out_irq, dev);
1335 free_irq(dev->in_irq, dev);
1336 }
1337 free_irq(dev->err_irq, dev);
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001338 } else {
Amy Malochef8f1a462012-08-13 22:55:26 -07001339 if (dev->dev->of_node) {
1340 dev->adapter.dev.of_node = pdev->dev.of_node;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001341 of_i2c_register_devices(&dev->adapter);
Amy Malochef8f1a462012-08-13 22:55:26 -07001342 }
Alok Chauhanebe211d2012-11-19 21:53:12 +05301343
1344 pm_runtime_set_autosuspend_delay(&pdev->dev, MSEC_PER_SEC);
1345 pm_runtime_use_autosuspend(&pdev->dev);
1346 pm_runtime_enable(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001347 return 0;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001348 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001349
1350
1351err_request_irq_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001352 if (dev->gsbi)
1353 iounmap(dev->gsbi);
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001354err_reset_failed:
1355 clk_disable_unprepare(dev->clk);
1356 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001357err_gsbi_failed:
1358 iounmap(dev->base);
1359err_ioremap_failed:
1360 kfree(dev);
1361err_alloc_dev_failed:
1362err_config_failed:
1363 clk_put(clk);
Matt Wagantallac294852011-08-17 15:44:58 -07001364 clk_put(pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001365err_clk_get_failed:
1366 if (gsbi_mem)
1367 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001368err_res_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001369 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001370get_res_failed:
1371 if (pdev->dev.of_node)
1372 kfree(pdata);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001373 return ret;
1374}
1375
1376static int __devexit
1377qup_i2c_remove(struct platform_device *pdev)
1378{
1379 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1380 struct resource *qup_mem, *gsbi_mem;
1381
1382 /* Grab mutex to ensure ongoing transaction is over */
1383 mutex_lock(&dev->mlock);
1384 dev->suspended = 1;
1385 mutex_unlock(&dev->mlock);
1386 mutex_destroy(&dev->mlock);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301387 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001388 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301389 qup_i2c_free_gpios(dev);
1390 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001391 platform_set_drvdata(pdev, NULL);
1392 if (dev->num_irqs == 3) {
1393 free_irq(dev->out_irq, dev);
1394 free_irq(dev->in_irq, dev);
1395 }
1396 free_irq(dev->err_irq, dev);
1397 i2c_del_adapter(&dev->adapter);
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301398 if (!dev->pdata->keep_ahb_clk_on) {
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301399 clk_put(dev->pclk);
1400 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001401 clk_put(dev->clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001402 if (dev->gsbi)
1403 iounmap(dev->gsbi);
1404 iounmap(dev->base);
1405
1406 pm_runtime_disable(&pdev->dev);
Alok Chauhanebe211d2012-11-19 21:53:12 +05301407 pm_runtime_set_suspended(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001408
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001409 if (!(dev->pdata->use_gsbi_shared_mode)) {
1410 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1411 "gsbi_qup_i2c_addr");
1412 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
1413 }
1414 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1415 "qup_phys_addr");
1416 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001417 if (dev->dev->of_node)
1418 kfree(dev->pdata);
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001419 kfree(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001420 return 0;
1421}
1422
1423#ifdef CONFIG_PM
Alok Chauhanebe211d2012-11-19 21:53:12 +05301424static int i2c_qup_pm_suspend_runtime(struct device *device)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001425{
1426 struct platform_device *pdev = to_platform_device(device);
1427 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhanebe211d2012-11-19 21:53:12 +05301428 dev_dbg(device, "pm_runtime: suspending...\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001429 /* Grab mutex to ensure ongoing transaction is over */
1430 mutex_lock(&dev->mlock);
1431 dev->suspended = 1;
1432 mutex_unlock(&dev->mlock);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301433 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001434 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301435 qup_i2c_free_gpios(dev);
1436 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001437 return 0;
1438}
1439
Alok Chauhanebe211d2012-11-19 21:53:12 +05301440static int i2c_qup_pm_resume_runtime(struct device *device)
1441{
1442 struct platform_device *pdev = to_platform_device(device);
1443 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301444 int ret = 0;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301445 dev_dbg(device, "pm_runtime: resuming...\n");
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301446 if (dev->pwr_state == 0) {
1447 ret = qup_i2c_request_gpios(dev);
1448 if (ret != 0)
1449 return ret;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301450 qup_i2c_pwr_mgmt(dev, 1);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301451 }
Alok Chauhanebe211d2012-11-19 21:53:12 +05301452 dev->suspended = 0;
1453 return 0;
1454}
1455
1456static int qup_i2c_suspend(struct device *device)
1457{
1458 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1459 dev_dbg(device, "system suspend");
1460 i2c_qup_pm_suspend_runtime(device);
1461 }
1462 return 0;
1463}
1464
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001465static int qup_i2c_resume(struct device *device)
1466{
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301467 int ret = 0;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301468 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1469 dev_dbg(device, "system resume");
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301470 ret = i2c_qup_pm_resume_runtime(device);
1471 if (!ret) {
1472 pm_runtime_mark_last_busy(device);
1473 pm_request_autosuspend(device);
1474 }
1475 return ret;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301476 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001477 return 0;
1478}
1479#endif /* CONFIG_PM */
1480
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001481static const struct dev_pm_ops i2c_qup_dev_pm_ops = {
1482 SET_SYSTEM_SLEEP_PM_OPS(
1483 qup_i2c_suspend,
1484 qup_i2c_resume
1485 )
1486 SET_RUNTIME_PM_OPS(
Alok Chauhanebe211d2012-11-19 21:53:12 +05301487 i2c_qup_pm_suspend_runtime,
1488 i2c_qup_pm_resume_runtime,
1489 NULL
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001490 )
1491};
1492
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001493static struct of_device_id i2c_qup_dt_match[] = {
1494 {
1495 .compatible = "qcom,i2c-qup",
1496 },
1497 {}
1498};
1499
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001500static struct platform_driver qup_i2c_driver = {
1501 .probe = qup_i2c_probe,
1502 .remove = __devexit_p(qup_i2c_remove),
1503 .driver = {
1504 .name = "qup_i2c",
1505 .owner = THIS_MODULE,
1506 .pm = &i2c_qup_dev_pm_ops,
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001507 .of_match_table = i2c_qup_dt_match,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001508 },
1509};
1510
1511/* QUP may be needed to bring up other drivers */
1512static int __init
1513qup_i2c_init_driver(void)
1514{
1515 return platform_driver_register(&qup_i2c_driver);
1516}
1517arch_initcall(qup_i2c_init_driver);
1518
1519static void __exit qup_i2c_exit_driver(void)
1520{
1521 platform_driver_unregister(&qup_i2c_driver);
1522}
1523module_exit(qup_i2c_exit_driver);
1524