blob: 717f763836a627e4ba0f47f518d5d1a296b84091 [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
131
132static char const * const i2c_rsrcs[] = {"i2c_clk", "i2c_sda"};
133
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700134static struct gpiomux_setting recovery_config = {
135 .func = GPIOMUX_FUNC_GPIO,
136 .drv = GPIOMUX_DRV_8MA,
137 .pull = GPIOMUX_PULL_NONE,
138};
139
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700140struct qup_i2c_dev {
141 struct device *dev;
142 void __iomem *base; /* virtual */
143 void __iomem *gsbi; /* virtual */
144 int in_irq;
145 int out_irq;
146 int err_irq;
147 int num_irqs;
148 struct clk *clk;
149 struct clk *pclk;
150 struct i2c_adapter adapter;
151
152 struct i2c_msg *msg;
153 int pos;
154 int cnt;
155 int err;
156 int mode;
157 int clk_ctl;
158 int one_bit_t;
159 int out_fifo_sz;
160 int in_fifo_sz;
161 int out_blk_sz;
162 int in_blk_sz;
163 int wr_sz;
164 struct msm_i2c_platform_data *pdata;
165 int suspended;
Alok Chauhan3acb67e2012-12-17 12:32:14 +0530166 int pwr_state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700167 struct mutex mlock;
168 void *complete;
169 int i2c_gpios[ARRAY_SIZE(i2c_rsrcs)];
170};
171
172#ifdef DEBUG
173static void
174qup_print_status(struct qup_i2c_dev *dev)
175{
176 uint32_t val;
177 val = readl_relaxed(dev->base+QUP_CONFIG);
178 dev_dbg(dev->dev, "Qup config is :0x%x\n", val);
179 val = readl_relaxed(dev->base+QUP_STATE);
180 dev_dbg(dev->dev, "Qup state is :0x%x\n", val);
181 val = readl_relaxed(dev->base+QUP_IO_MODE);
182 dev_dbg(dev->dev, "Qup mode is :0x%x\n", val);
183}
184#else
185static inline void qup_print_status(struct qup_i2c_dev *dev)
186{
187}
188#endif
189
190static irqreturn_t
191qup_i2c_interrupt(int irq, void *devid)
192{
193 struct qup_i2c_dev *dev = devid;
194 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
195 uint32_t status1 = readl_relaxed(dev->base + QUP_ERROR_FLAGS);
196 uint32_t op_flgs = readl_relaxed(dev->base + QUP_OPERATIONAL);
197 int err = 0;
198
Alok Chauhanebe211d2012-11-19 21:53:12 +0530199 if (pm_runtime_suspended(dev->dev))
200 return IRQ_NONE;
201
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700202 if (!dev->msg || !dev->complete) {
203 /* Clear Error interrupt if it's a level triggered interrupt*/
204 if (dev->num_irqs == 1) {
205 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
206 /* Ensure that state is written before ISR exits */
207 mb();
208 }
209 return IRQ_HANDLED;
210 }
211
212 if (status & I2C_STATUS_ERROR_MASK) {
213 dev_err(dev->dev, "QUP: I2C status flags :0x%x, irq:%d\n",
214 status, irq);
215 err = status;
216 /* Clear Error interrupt if it's a level triggered interrupt*/
217 if (dev->num_irqs == 1) {
218 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
219 /* Ensure that state is written before ISR exits */
220 mb();
221 }
222 goto intr_done;
223 }
224
225 if (status1 & 0x7F) {
226 dev_err(dev->dev, "QUP: QUP status flags :0x%x\n", status1);
227 err = -status1;
228 /* Clear Error interrupt if it's a level triggered interrupt*/
229 if (dev->num_irqs == 1) {
230 writel_relaxed((status1 & QUP_STATUS_ERROR_FLAGS),
231 dev->base + QUP_ERROR_FLAGS);
232 /* Ensure that error flags are cleared before ISR
233 * exits
234 */
235 mb();
236 }
237 goto intr_done;
238 }
239
240 if ((dev->num_irqs == 3) && (dev->msg->flags == I2C_M_RD)
241 && (irq == dev->out_irq))
242 return IRQ_HANDLED;
243 if (op_flgs & QUP_OUT_SVC_FLAG) {
244 writel_relaxed(QUP_OUT_SVC_FLAG, dev->base + QUP_OPERATIONAL);
245 /* Ensure that service flag is acknowledged before ISR exits */
246 mb();
247 }
248 if (dev->msg->flags == I2C_M_RD) {
249 if ((op_flgs & QUP_MX_INPUT_DONE) ||
250 (op_flgs & QUP_IN_SVC_FLAG)) {
251 writel_relaxed(QUP_IN_SVC_FLAG, dev->base
252 + QUP_OPERATIONAL);
253 /* Ensure that service flag is acknowledged before ISR
254 * exits
255 */
256 mb();
257 } else
258 return IRQ_HANDLED;
259 }
260
261intr_done:
262 dev_dbg(dev->dev, "QUP intr= %d, i2c status=0x%x, qup status = 0x%x\n",
263 irq, status, status1);
264 qup_print_status(dev);
265 dev->err = err;
266 complete(dev->complete);
267 return IRQ_HANDLED;
268}
269
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600270static int
271qup_i2c_poll_state(struct qup_i2c_dev *dev, uint32_t req_state, bool only_valid)
272{
273 uint32_t retries = 0;
274
275 dev_dbg(dev->dev, "Polling for state:0x%x, or valid-only:%d\n",
276 req_state, only_valid);
277
278 while (retries != 2000) {
279 uint32_t status = readl_relaxed(dev->base + QUP_STATE);
280
281 /*
282 * If only valid bit needs to be checked, requested state is
283 * 'don't care'
284 */
285 if (status & QUP_STATE_VALID) {
286 if (only_valid)
287 return 0;
288 else if ((req_state & QUP_I2C_MAST_GEN) &&
289 (status & QUP_I2C_MAST_GEN))
290 return 0;
291 else if ((status & QUP_STATE_MASK) == req_state)
292 return 0;
293 }
294 if (retries++ == 1000)
295 udelay(100);
296 }
297 return -ETIMEDOUT;
298}
299
300static int
301qup_update_state(struct qup_i2c_dev *dev, uint32_t state)
302{
303 if (qup_i2c_poll_state(dev, 0, true) != 0)
304 return -EIO;
305 writel_relaxed(state, dev->base + QUP_STATE);
306 if (qup_i2c_poll_state(dev, state, false) != 0)
307 return -EIO;
308 return 0;
309}
310
Trilok Sonif0274f12011-08-19 12:26:13 +0530311/*
312 * Before calling qup_config_core_on_en(), please make
313 * sure that QuPE core is in RESET state.
Trilok Sonif0274f12011-08-19 12:26:13 +0530314 */
315static void
316qup_config_core_on_en(struct qup_i2c_dev *dev)
317{
318 uint32_t status;
319
Trilok Sonif0274f12011-08-19 12:26:13 +0530320 status = readl_relaxed(dev->base + QUP_CONFIG);
321 status |= BIT(13);
322 writel_relaxed(status, dev->base + QUP_CONFIG);
323 /* making sure that write has really gone through */
324 mb();
325}
326
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700327static void
328qup_i2c_pwr_mgmt(struct qup_i2c_dev *dev, unsigned int state)
329{
Alok Chauhan3acb67e2012-12-17 12:32:14 +0530330 dev->pwr_state = state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700331 if (state != 0) {
Alok Chauhanebe211d2012-11-19 21:53:12 +0530332 clk_prepare_enable(dev->clk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +0530333 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhanebe211d2012-11-19 21:53:12 +0530334 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700335 } else {
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600336 qup_update_state(dev, QUP_RESET_STATE);
Alok Chauhanebe211d2012-11-19 21:53:12 +0530337 clk_disable_unprepare(dev->clk);
Trilok Sonif0274f12011-08-19 12:26:13 +0530338 qup_config_core_on_en(dev);
Kiran Gunda9aa5e912012-08-16 18:37:46 +0530339 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhanebe211d2012-11-19 21:53:12 +0530340 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700341 }
342}
343
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700344static int
345qup_i2c_poll_writeready(struct qup_i2c_dev *dev, int rem)
346{
347 uint32_t retries = 0;
348
349 while (retries != 2000) {
350 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
351
352 if (!(status & I2C_STATUS_WR_BUFFER_FULL)) {
353 if (((dev->msg->flags & I2C_M_RD) || (rem == 0)) &&
354 !(status & I2C_STATUS_BUS_ACTIVE))
355 return 0;
356 else if ((dev->msg->flags == 0) && (rem > 0))
357 return 0;
358 else /* 1-bit delay before we check for bus busy */
359 udelay(dev->one_bit_t);
360 }
Harini Jayaramand997b3b2011-10-11 14:25:29 -0600361 if (retries++ == 1000) {
362 /*
363 * Wait for FIFO number of bytes to be absolutely sure
364 * that I2C write state machine is not idle. Each byte
365 * takes 9 clock cycles. (8 bits + 1 ack)
366 */
367 usleep_range((dev->one_bit_t * (dev->out_fifo_sz * 9)),
368 (dev->one_bit_t * (dev->out_fifo_sz * 9)));
369 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700370 }
371 qup_print_status(dev);
372 return -ETIMEDOUT;
373}
374
375static int qup_i2c_poll_clock_ready(struct qup_i2c_dev *dev)
376{
377 uint32_t retries = 0;
378
379 /*
380 * Wait for the clock state to transition to either IDLE or FORCED
381 * LOW. This will usually happen within one cycle of the i2c clock.
382 */
383
384 while (retries++ < QUP_MAX_CLK_STATE_RETRIES) {
385 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
386 uint32_t clk_state = (status >> 13) & 0x7;
387
388 if (clk_state == I2C_CLK_RESET_BUSIDLE_STATE ||
389 clk_state == I2C_CLK_FORCED_LOW_STATE)
390 return 0;
391 /* 1-bit delay before we check again */
392 udelay(dev->one_bit_t);
393 }
394
395 dev_err(dev->dev, "Error waiting for clk ready\n");
396 return -ETIMEDOUT;
397}
398
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700399static inline int qup_i2c_request_gpios(struct qup_i2c_dev *dev)
400{
401 int i;
402 int result = 0;
403
404 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
405 if (dev->i2c_gpios[i] >= 0) {
406 result = gpio_request(dev->i2c_gpios[i], i2c_rsrcs[i]);
407 if (result) {
408 dev_err(dev->dev,
409 "gpio_request for pin %d failed\
410 with error %d\n", dev->i2c_gpios[i],
411 result);
412 goto error;
413 }
414 }
415 }
416 return 0;
417
418error:
419 for (; --i >= 0;) {
420 if (dev->i2c_gpios[i] >= 0)
421 gpio_free(dev->i2c_gpios[i]);
422 }
423 return result;
424}
425
426static inline void qup_i2c_free_gpios(struct qup_i2c_dev *dev)
427{
428 int i;
429
430 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
431 if (dev->i2c_gpios[i] >= 0)
432 gpio_free(dev->i2c_gpios[i]);
433 }
434}
435
436#ifdef DEBUG
437static void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
438 uint32_t addr, int rdwr)
439{
440 if (rdwr)
441 dev_dbg(dev->dev, "RD:Wrote 0x%x to out_ff:0x%x\n", val, addr);
442 else
443 dev_dbg(dev->dev, "WR:Wrote 0x%x to out_ff:0x%x\n", val, addr);
444}
445#else
446static inline void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
447 uint32_t addr, int rdwr)
448{
449}
450#endif
451
452static void
453qup_issue_read(struct qup_i2c_dev *dev, struct i2c_msg *msg, int *idx,
454 uint32_t carry_over)
455{
456 uint16_t addr = (msg->addr << 1) | 1;
457 /* QUP limit 256 bytes per read. By HW design, 0 in the 8-bit field
458 * is treated as 256 byte read.
459 */
460 uint16_t rd_len = ((dev->cnt == 256) ? 0 : dev->cnt);
461
462 if (*idx % 4) {
463 writel_relaxed(carry_over | ((QUP_OUT_START | addr) << 16),
464 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx-2)); */
465
466 qup_verify_fifo(dev, carry_over |
467 ((QUP_OUT_START | addr) << 16), (uint32_t)dev->base
468 + QUP_OUT_FIFO_BASE + (*idx - 2), 1);
469 writel_relaxed((QUP_OUT_REC | rd_len),
470 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx+2)); */
471
472 qup_verify_fifo(dev, (QUP_OUT_REC | rd_len),
473 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx + 2), 1);
474 } else {
475 writel_relaxed(((QUP_OUT_REC | rd_len) << 16)
476 | QUP_OUT_START | addr,
477 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx)); */
478
479 qup_verify_fifo(dev, QUP_OUT_REC << 16 | rd_len << 16 |
480 QUP_OUT_START | addr,
481 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx), 1);
482 }
483 *idx += 4;
484}
485
486static void
487qup_issue_write(struct qup_i2c_dev *dev, struct i2c_msg *msg, int rem,
488 int *idx, uint32_t *carry_over)
489{
490 int entries = dev->cnt;
491 int empty_sl = dev->wr_sz - ((*idx) >> 1);
492 int i = 0;
493 uint32_t val = 0;
494 uint32_t last_entry = 0;
495 uint16_t addr = msg->addr << 1;
496
497 if (dev->pos == 0) {
498 if (*idx % 4) {
499 writel_relaxed(*carry_over | ((QUP_OUT_START |
500 addr) << 16),
501 dev->base + QUP_OUT_FIFO_BASE);
502
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600503 qup_verify_fifo(dev, *carry_over | QUP_OUT_START << 16 |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700504 addr << 16, (uint32_t)dev->base +
505 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
506 } else
507 val = QUP_OUT_START | addr;
508 *idx += 2;
509 i++;
510 entries++;
511 } else {
512 /* Avoid setp time issue by adding 1 NOP when number of bytes
513 * are more than FIFO/BLOCK size. setup time issue can't appear
514 * otherwise since next byte to be written will always be ready
515 */
516 val = (QUP_OUT_NOP | 1);
517 *idx += 2;
518 i++;
519 entries++;
520 }
521 if (entries > empty_sl)
522 entries = empty_sl;
523
524 for (; i < (entries - 1); i++) {
525 if (*idx % 4) {
526 writel_relaxed(val | ((QUP_OUT_DATA |
527 msg->buf[dev->pos]) << 16),
528 dev->base + QUP_OUT_FIFO_BASE);
529
530 qup_verify_fifo(dev, val | QUP_OUT_DATA << 16 |
531 msg->buf[dev->pos] << 16, (uint32_t)dev->base +
532 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
533 } else
534 val = QUP_OUT_DATA | msg->buf[dev->pos];
535 (*idx) += 2;
536 dev->pos++;
537 }
538 if (dev->pos < (msg->len - 1))
539 last_entry = QUP_OUT_DATA;
540 else if (rem > 1) /* not last array entry */
541 last_entry = QUP_OUT_DATA;
542 else
543 last_entry = QUP_OUT_STOP;
544 if ((*idx % 4) == 0) {
545 /*
546 * If read-start and read-command end up in different fifos, it
547 * may result in extra-byte being read due to extra-read cycle.
548 * Avoid that by inserting NOP as the last entry of fifo only
549 * if write command(s) leave 1 space in fifo.
550 */
551 if (rem > 1) {
552 struct i2c_msg *next = msg + 1;
Harini Jayaraman24bea432011-10-11 16:06:28 -0600553 if (next->addr == msg->addr && (next->flags & I2C_M_RD)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700554 && *idx == ((dev->wr_sz*2) - 4)) {
555 writel_relaxed(((last_entry |
556 msg->buf[dev->pos]) |
557 ((1 | QUP_OUT_NOP) << 16)), dev->base +
558 QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
559
560 qup_verify_fifo(dev,
561 ((last_entry | msg->buf[dev->pos]) |
562 ((1 | QUP_OUT_NOP) << 16)),
563 (uint32_t)dev->base +
564 QUP_OUT_FIFO_BASE + (*idx), 0);
565 *idx += 2;
566 } else if (next->flags == 0 && dev->pos == msg->len - 1
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600567 && *idx < (dev->wr_sz*2) &&
568 (next->addr != msg->addr)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700569 /* Last byte of an intermittent write */
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600570 writel_relaxed((QUP_OUT_STOP |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700571 msg->buf[dev->pos]),
572 dev->base + QUP_OUT_FIFO_BASE);
573
574 qup_verify_fifo(dev,
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600575 QUP_OUT_STOP | msg->buf[dev->pos],
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700576 (uint32_t)dev->base +
577 QUP_OUT_FIFO_BASE + (*idx), 0);
578 *idx += 2;
579 } else
580 *carry_over = (last_entry | msg->buf[dev->pos]);
581 } else {
582 writel_relaxed((last_entry | msg->buf[dev->pos]),
583 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
584
585 qup_verify_fifo(dev, last_entry | msg->buf[dev->pos],
586 (uint32_t)dev->base + QUP_OUT_FIFO_BASE +
587 (*idx), 0);
588 }
589 } else {
590 writel_relaxed(val | ((last_entry | msg->buf[dev->pos]) << 16),
591 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
592
593 qup_verify_fifo(dev, val | (last_entry << 16) |
594 (msg->buf[dev->pos] << 16), (uint32_t)dev->base +
595 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
596 }
597
598 *idx += 2;
599 dev->pos++;
600 dev->cnt = msg->len - dev->pos;
601}
602
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700603static void
604qup_set_read_mode(struct qup_i2c_dev *dev, int rd_len)
605{
606 uint32_t wr_mode = (dev->wr_sz < dev->out_fifo_sz) ?
607 QUP_WR_BLK_MODE : 0;
608 if (rd_len > 256) {
609 dev_dbg(dev->dev, "HW limit: Breaking reads in chunk of 256\n");
610 rd_len = 256;
611 }
612 if (rd_len <= dev->in_fifo_sz) {
613 writel_relaxed(wr_mode | QUP_PACK_EN | QUP_UNPACK_EN,
614 dev->base + QUP_IO_MODE);
615 writel_relaxed(rd_len, dev->base + QUP_MX_READ_CNT);
616 } else {
617 writel_relaxed(wr_mode | QUP_RD_BLK_MODE |
618 QUP_PACK_EN | QUP_UNPACK_EN, dev->base + QUP_IO_MODE);
619 writel_relaxed(rd_len, dev->base + QUP_MX_INPUT_CNT);
620 }
621}
622
623static int
624qup_set_wr_mode(struct qup_i2c_dev *dev, int rem)
625{
626 int total_len = 0;
627 int ret = 0;
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600628 int len = dev->msg->len;
629 struct i2c_msg *next = NULL;
630 if (rem > 1)
631 next = dev->msg + 1;
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600632 while (rem > 1 && next->flags == 0 && (next->addr == dev->msg->addr)) {
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600633 len += next->len + 1;
634 next = next + 1;
635 rem--;
636 }
637 if (len >= (dev->out_fifo_sz - 1)) {
638 total_len = len + 1 + (len/(dev->out_blk_sz-1));
639
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700640 writel_relaxed(QUP_WR_BLK_MODE | QUP_PACK_EN | QUP_UNPACK_EN,
641 dev->base + QUP_IO_MODE);
642 dev->wr_sz = dev->out_blk_sz;
643 } else
644 writel_relaxed(QUP_PACK_EN | QUP_UNPACK_EN,
645 dev->base + QUP_IO_MODE);
646
647 if (rem > 1) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700648 if (next->addr == dev->msg->addr &&
649 next->flags == I2C_M_RD) {
650 qup_set_read_mode(dev, next->len);
651 /* make sure read start & read command are in 1 blk */
652 if ((total_len % dev->out_blk_sz) ==
653 (dev->out_blk_sz - 1))
654 total_len += 3;
655 else
656 total_len += 2;
657 }
658 }
659 /* WRITE COUNT register valid/used only in block mode */
660 if (dev->wr_sz == dev->out_blk_sz)
661 writel_relaxed(total_len, dev->base + QUP_MX_WR_CNT);
662 return ret;
663}
664
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700665
666static void qup_i2c_recover_bus_busy(struct qup_i2c_dev *dev)
667{
668 int i;
669 int gpio_clk;
670 int gpio_dat;
671 bool gpio_clk_status = false;
672 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
673 struct gpiomux_setting old_gpio_setting;
674
675 if (dev->pdata->msm_i2c_config_gpio)
676 return;
677
678 if (!(status & (I2C_STATUS_BUS_ACTIVE)) ||
679 (status & (I2C_STATUS_BUS_MASTER)))
680 return;
681
682 gpio_clk = dev->i2c_gpios[0];
683 gpio_dat = dev->i2c_gpios[1];
684
685 if ((gpio_clk == -1) && (gpio_dat == -1)) {
686 dev_err(dev->dev, "Recovery failed due to undefined GPIO's\n");
687 return;
688 }
689
690 disable_irq(dev->err_irq);
691 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
692 if (msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
693 &recovery_config, &old_gpio_setting)) {
694 dev_err(dev->dev, "GPIO pins have no active setting\n");
695 goto recovery_end;
696 }
697 }
698
699 dev_warn(dev->dev, "i2c_scl: %d, i2c_sda: %d\n",
700 gpio_get_value(gpio_clk), gpio_get_value(gpio_dat));
701
702 for (i = 0; i < 9; i++) {
703 if (gpio_get_value(gpio_dat) && gpio_clk_status)
704 break;
705 gpio_direction_output(gpio_clk, 0);
706 udelay(5);
707 gpio_direction_output(gpio_dat, 0);
708 udelay(5);
709 gpio_direction_input(gpio_clk);
710 udelay(5);
711 if (!gpio_get_value(gpio_clk))
712 udelay(20);
713 if (!gpio_get_value(gpio_clk))
714 usleep_range(10000, 10000);
715 gpio_clk_status = gpio_get_value(gpio_clk);
716 gpio_direction_input(gpio_dat);
717 udelay(5);
718 }
719
720 /* Configure ALT funciton to QUP I2C*/
721 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
722 msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
723 &old_gpio_setting, NULL);
724 }
725
726 udelay(10);
727
728 status = readl_relaxed(dev->base + QUP_I2C_STATUS);
729 if (!(status & I2C_STATUS_BUS_ACTIVE)) {
730 dev_info(dev->dev, "Bus busy cleared after %d clock cycles, "
731 "status %x\n",
732 i, status);
733 goto recovery_end;
734 }
735
736 dev_warn(dev->dev, "Bus still busy, status %x\n", status);
737
738recovery_end:
739 enable_irq(dev->err_irq);
740}
741
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700742static int
743qup_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
744{
745 DECLARE_COMPLETION_ONSTACK(complete);
746 struct qup_i2c_dev *dev = i2c_get_adapdata(adap);
747 int ret;
748 int rem = num;
749 long timeout;
750 int err;
751
Alok Chauhanebe211d2012-11-19 21:53:12 +0530752 pm_runtime_get_sync(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700753 mutex_lock(&dev->mlock);
754
755 if (dev->suspended) {
756 mutex_unlock(&dev->mlock);
757 return -EIO;
758 }
759
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700760 /* Initialize QUP registers during first transfer */
761 if (dev->clk_ctl == 0) {
762 int fs_div;
763 int hs_div;
764 uint32_t fifo_reg;
765
766 if (dev->gsbi) {
767 writel_relaxed(0x2 << 4, dev->gsbi);
768 /* GSBI memory is not in the same 1K region as other
769 * QUP registers. mb() here ensures that the GSBI
770 * register is updated in correct order and that the
771 * write has gone through before programming QUP core
772 * registers
773 */
774 mb();
775 }
776
777 fs_div = ((dev->pdata->src_clk_rate
778 / dev->pdata->clk_freq) / 2) - 3;
779 hs_div = 3;
780 dev->clk_ctl = ((hs_div & 0x7) << 8) | (fs_div & 0xff);
781 fifo_reg = readl_relaxed(dev->base + QUP_IO_MODE);
782 if (fifo_reg & 0x3)
783 dev->out_blk_sz = (fifo_reg & 0x3) * 16;
784 else
785 dev->out_blk_sz = 16;
786 if (fifo_reg & 0x60)
787 dev->in_blk_sz = ((fifo_reg & 0x60) >> 5) * 16;
788 else
789 dev->in_blk_sz = 16;
790 /*
791 * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag'
792 * associated with each byte written/received
793 */
794 dev->out_blk_sz /= 2;
795 dev->in_blk_sz /= 2;
796 dev->out_fifo_sz = dev->out_blk_sz *
797 (2 << ((fifo_reg & 0x1C) >> 2));
798 dev->in_fifo_sz = dev->in_blk_sz *
799 (2 << ((fifo_reg & 0x380) >> 7));
800 dev_dbg(dev->dev, "QUP IN:bl:%d, ff:%d, OUT:bl:%d, ff:%d\n",
801 dev->in_blk_sz, dev->in_fifo_sz,
802 dev->out_blk_sz, dev->out_fifo_sz);
803 }
804
805 writel_relaxed(1, dev->base + QUP_SW_RESET);
Sagar Dharia518e2302011-08-05 11:03:03 -0600806 ret = qup_i2c_poll_state(dev, QUP_RESET_STATE, false);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700807 if (ret) {
808 dev_err(dev->dev, "QUP Busy:Trying to recover\n");
809 goto out_err;
810 }
811
812 if (dev->num_irqs == 3) {
813 enable_irq(dev->in_irq);
814 enable_irq(dev->out_irq);
815 }
816 enable_irq(dev->err_irq);
817
818 /* Initialize QUP registers */
819 writel_relaxed(0, dev->base + QUP_CONFIG);
820 writel_relaxed(QUP_OPERATIONAL_RESET, dev->base + QUP_OPERATIONAL);
821 writel_relaxed(QUP_STATUS_ERROR_FLAGS, dev->base + QUP_ERROR_FLAGS_EN);
822
823 writel_relaxed(I2C_MINI_CORE | I2C_N_VAL, dev->base + QUP_CONFIG);
824
825 /* Initialize I2C mini core registers */
826 writel_relaxed(0, dev->base + QUP_I2C_CLK_CTL);
827 writel_relaxed(QUP_I2C_STATUS_RESET, dev->base + QUP_I2C_STATUS);
828
829 while (rem) {
830 bool filled = false;
831
832 dev->cnt = msgs->len - dev->pos;
833 dev->msg = msgs;
834
835 dev->wr_sz = dev->out_fifo_sz;
836 dev->err = 0;
837 dev->complete = &complete;
838
Sagar Dharia518e2302011-08-05 11:03:03 -0600839 if (qup_i2c_poll_state(dev, QUP_I2C_MAST_GEN, false) != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700840 ret = -EIO;
841 goto out_err;
842 }
843
844 qup_print_status(dev);
845 /* HW limits Read upto 256 bytes in 1 read without stop */
846 if (dev->msg->flags & I2C_M_RD) {
847 qup_set_read_mode(dev, dev->cnt);
848 if (dev->cnt > 256)
849 dev->cnt = 256;
850 } else {
851 ret = qup_set_wr_mode(dev, rem);
852 if (ret != 0)
853 goto out_err;
854 /* Don't fill block till we get interrupt */
855 if (dev->wr_sz == dev->out_blk_sz)
856 filled = true;
857 }
858
859 err = qup_update_state(dev, QUP_RUN_STATE);
860 if (err < 0) {
861 ret = err;
862 goto out_err;
863 }
864
865 qup_print_status(dev);
866 writel_relaxed(dev->clk_ctl, dev->base + QUP_I2C_CLK_CTL);
867 /* CLK_CTL register is not in the same 1K region as other QUP
868 * registers. Ensure that clock control is written before
869 * programming other QUP registers
870 */
871 mb();
872
873 do {
874 int idx = 0;
875 uint32_t carry_over = 0;
876
877 /* Transition to PAUSE state only possible from RUN */
878 err = qup_update_state(dev, QUP_PAUSE_STATE);
879 if (err < 0) {
880 ret = err;
881 goto out_err;
882 }
883
884 qup_print_status(dev);
885 /* This operation is Write, check the next operation
886 * and decide mode
887 */
888 while (filled == false) {
889 if ((msgs->flags & I2C_M_RD))
890 qup_issue_read(dev, msgs, &idx,
891 carry_over);
892 else if (!(msgs->flags & I2C_M_RD))
893 qup_issue_write(dev, msgs, rem, &idx,
894 &carry_over);
895 if (idx >= (dev->wr_sz << 1))
896 filled = true;
897 /* Start new message */
898 if (filled == false) {
899 if (msgs->flags & I2C_M_RD)
900 filled = true;
901 else if (rem > 1) {
902 /* Only combine operations with
903 * same address
904 */
905 struct i2c_msg *next = msgs + 1;
906 if (next->addr != msgs->addr)
907 filled = true;
908 else {
909 rem--;
910 msgs++;
911 dev->msg = msgs;
912 dev->pos = 0;
913 dev->cnt = msgs->len;
914 if (msgs->len > 256)
915 dev->cnt = 256;
916 }
917 } else
918 filled = true;
919 }
920 }
921 err = qup_update_state(dev, QUP_RUN_STATE);
922 if (err < 0) {
923 ret = err;
924 goto out_err;
925 }
926 dev_dbg(dev->dev, "idx:%d, rem:%d, num:%d, mode:%d\n",
927 idx, rem, num, dev->mode);
928
929 qup_print_status(dev);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700930 timeout = wait_for_completion_timeout(&complete,
931 msecs_to_jiffies(dev->out_fifo_sz));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700932 if (!timeout) {
933 uint32_t istatus = readl_relaxed(dev->base +
934 QUP_I2C_STATUS);
935 uint32_t qstatus = readl_relaxed(dev->base +
936 QUP_ERROR_FLAGS);
937 uint32_t op_flgs = readl_relaxed(dev->base +
938 QUP_OPERATIONAL);
939
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700940 /*
941 * Dont wait for 1 sec if i2c sees the bus
942 * active and controller is not master.
943 * A slave has pulled line low. Try to recover
944 */
945 if (!(istatus & I2C_STATUS_BUS_ACTIVE) ||
946 (istatus & I2C_STATUS_BUS_MASTER)) {
947 timeout =
948 wait_for_completion_timeout(&complete,
949 HZ);
950 if (timeout)
951 goto timeout_err;
952 }
953 qup_i2c_recover_bus_busy(dev);
954 dev_err(dev->dev,
955 "Transaction timed out, SL-AD = 0x%x\n",
956 dev->msg->addr);
957
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700958 dev_err(dev->dev, "I2C Status: %x\n", istatus);
959 dev_err(dev->dev, "QUP Status: %x\n", qstatus);
960 dev_err(dev->dev, "OP Flags: %x\n", op_flgs);
961 writel_relaxed(1, dev->base + QUP_SW_RESET);
962 /* Make sure that the write has gone through
963 * before returning from the function
964 */
965 mb();
966 ret = -ETIMEDOUT;
967 goto out_err;
968 }
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700969timeout_err:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700970 if (dev->err) {
971 if (dev->err > 0 &&
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700972 dev->err & QUP_I2C_NACK_FLAG) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700973 dev_err(dev->dev,
974 "I2C slave addr:0x%x not connected\n",
975 dev->msg->addr);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700976 dev->err = ENOTCONN;
977 } else if (dev->err < 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700978 dev_err(dev->dev,
979 "QUP data xfer error %d\n", dev->err);
980 ret = dev->err;
981 goto out_err;
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700982 } else if (dev->err > 0) {
983 /*
984 * ISR returns +ve error if error code
985 * is I2C related, e.g. unexpected start
986 * So you may call recover-bus-busy when
987 * this error happens
988 */
989 qup_i2c_recover_bus_busy(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700990 }
991 ret = -dev->err;
992 goto out_err;
993 }
994 if (dev->msg->flags & I2C_M_RD) {
995 int i;
996 uint32_t dval = 0;
997 for (i = 0; dev->pos < dev->msg->len; i++,
998 dev->pos++) {
999 uint32_t rd_status =
1000 readl_relaxed(dev->base
1001 + QUP_OPERATIONAL);
1002 if (i % 2 == 0) {
1003 if ((rd_status &
1004 QUP_IN_NOT_EMPTY) == 0)
1005 break;
1006 dval = readl_relaxed(dev->base +
1007 QUP_IN_FIFO_BASE);
1008 dev->msg->buf[dev->pos] =
1009 dval & 0xFF;
1010 } else
1011 dev->msg->buf[dev->pos] =
1012 ((dval & 0xFF0000) >>
1013 16);
1014 }
1015 dev->cnt -= i;
1016 } else
1017 filled = false; /* refill output FIFO */
1018 dev_dbg(dev->dev, "pos:%d, len:%d, cnt:%d\n",
1019 dev->pos, msgs->len, dev->cnt);
1020 } while (dev->cnt > 0);
1021 if (dev->cnt == 0) {
1022 if (msgs->len == dev->pos) {
1023 rem--;
1024 msgs++;
1025 dev->pos = 0;
1026 }
1027 if (rem) {
1028 err = qup_i2c_poll_clock_ready(dev);
1029 if (err < 0) {
1030 ret = err;
1031 goto out_err;
1032 }
1033 err = qup_update_state(dev, QUP_RESET_STATE);
1034 if (err < 0) {
1035 ret = err;
1036 goto out_err;
1037 }
1038 }
1039 }
1040 /* Wait for I2C bus to be idle */
1041 ret = qup_i2c_poll_writeready(dev, rem);
1042 if (ret) {
1043 dev_err(dev->dev,
1044 "Error waiting for write ready\n");
1045 goto out_err;
1046 }
1047 }
1048
1049 ret = num;
1050 out_err:
1051 disable_irq(dev->err_irq);
1052 if (dev->num_irqs == 3) {
1053 disable_irq(dev->in_irq);
1054 disable_irq(dev->out_irq);
1055 }
1056 dev->complete = NULL;
1057 dev->msg = NULL;
1058 dev->pos = 0;
1059 dev->err = 0;
1060 dev->cnt = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001061 mutex_unlock(&dev->mlock);
Alok Chauhanebe211d2012-11-19 21:53:12 +05301062 pm_runtime_mark_last_busy(dev->dev);
1063 pm_runtime_put_autosuspend(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001064 return ret;
1065}
1066
1067static u32
1068qup_i2c_func(struct i2c_adapter *adap)
1069{
1070 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
1071}
1072
1073static const struct i2c_algorithm qup_i2c_algo = {
1074 .master_xfer = qup_i2c_xfer,
1075 .functionality = qup_i2c_func,
1076};
1077
1078static int __devinit
1079qup_i2c_probe(struct platform_device *pdev)
1080{
1081 struct qup_i2c_dev *dev;
1082 struct resource *qup_mem, *gsbi_mem, *qup_io, *gsbi_io, *res;
1083 struct resource *in_irq, *out_irq, *err_irq;
1084 struct clk *clk, *pclk;
1085 int ret = 0;
1086 int i;
1087 struct msm_i2c_platform_data *pdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001088
1089 gsbi_mem = NULL;
1090 dev_dbg(&pdev->dev, "qup_i2c_probe\n");
1091
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001092 if (pdev->dev.of_node) {
1093 struct device_node *node = pdev->dev.of_node;
1094 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
1095 if (!pdata)
1096 return -ENOMEM;
1097 ret = of_property_read_u32(node, "qcom,i2c-bus-freq",
1098 &pdata->clk_freq);
1099 if (ret)
1100 goto get_res_failed;
1101 ret = of_property_read_u32(node, "cell-index", &pdev->id);
1102 if (ret)
1103 goto get_res_failed;
1104 /* Optional property */
1105 of_property_read_u32(node, "qcom,i2c-src-freq",
1106 &pdata->src_clk_rate);
1107 } else
1108 pdata = pdev->dev.platform_data;
1109
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001110 if (!pdata) {
1111 dev_err(&pdev->dev, "platform data not initialized\n");
1112 return -ENOSYS;
1113 }
1114 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1115 "qup_phys_addr");
1116 if (!qup_mem) {
1117 dev_err(&pdev->dev, "no qup mem resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001118 ret = -ENODEV;
1119 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001120 }
1121
1122 /*
1123 * We only have 1 interrupt for new hardware targets and in_irq,
1124 * out_irq will be NULL for those platforms
1125 */
1126 in_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1127 "qup_in_intr");
1128
1129 out_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1130 "qup_out_intr");
1131
1132 err_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1133 "qup_err_intr");
1134 if (!err_irq) {
1135 dev_err(&pdev->dev, "no error irq resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001136 ret = -ENODEV;
1137 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001138 }
1139
1140 qup_io = request_mem_region(qup_mem->start, resource_size(qup_mem),
1141 pdev->name);
1142 if (!qup_io) {
1143 dev_err(&pdev->dev, "QUP region already claimed\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001144 ret = -EBUSY;
1145 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001146 }
1147 if (!pdata->use_gsbi_shared_mode) {
1148 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1149 "gsbi_qup_i2c_addr");
1150 if (!gsbi_mem) {
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001151 dev_dbg(&pdev->dev, "Assume BLSP\n");
1152 /*
1153 * BLSP core does not need protocol programming so this
1154 * resource is not expected
1155 */
1156 goto blsp_core_init;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001157 }
1158 gsbi_io = request_mem_region(gsbi_mem->start,
1159 resource_size(gsbi_mem),
1160 pdev->name);
1161 if (!gsbi_io) {
1162 dev_err(&pdev->dev, "GSBI region already claimed\n");
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001163 ret = -EBUSY;
1164 goto err_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001165 }
1166 }
1167
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001168blsp_core_init:
Matt Wagantallac294852011-08-17 15:44:58 -07001169 clk = clk_get(&pdev->dev, "core_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001170 if (IS_ERR(clk)) {
Matt Wagantallac294852011-08-17 15:44:58 -07001171 dev_err(&pdev->dev, "Could not get core_clk\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001172 ret = PTR_ERR(clk);
1173 goto err_clk_get_failed;
1174 }
1175
Matt Wagantallac294852011-08-17 15:44:58 -07001176 pclk = clk_get(&pdev->dev, "iface_clk");
1177 if (IS_ERR(pclk)) {
1178 dev_err(&pdev->dev, "Could not get iface_clk\n");
1179 ret = PTR_ERR(pclk);
1180 clk_put(clk);
1181 goto err_clk_get_failed;
1182 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001183
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001184 /* We support frequencies upto FAST Mode(400KHz) */
1185 if (pdata->clk_freq <= 0 ||
1186 pdata->clk_freq > 400000) {
1187 dev_err(&pdev->dev, "clock frequency not supported\n");
1188 ret = -EIO;
1189 goto err_config_failed;
1190 }
1191
1192 dev = kzalloc(sizeof(struct qup_i2c_dev), GFP_KERNEL);
1193 if (!dev) {
1194 ret = -ENOMEM;
1195 goto err_alloc_dev_failed;
1196 }
1197
1198 dev->dev = &pdev->dev;
1199 if (in_irq)
1200 dev->in_irq = in_irq->start;
1201 if (out_irq)
1202 dev->out_irq = out_irq->start;
1203 dev->err_irq = err_irq->start;
1204 if (in_irq && out_irq)
1205 dev->num_irqs = 3;
1206 else
1207 dev->num_irqs = 1;
1208 dev->clk = clk;
1209 dev->pclk = pclk;
1210 dev->base = ioremap(qup_mem->start, resource_size(qup_mem));
1211 if (!dev->base) {
1212 ret = -ENOMEM;
1213 goto err_ioremap_failed;
1214 }
1215
1216 /* Configure GSBI block to use I2C functionality */
1217 if (gsbi_mem) {
1218 dev->gsbi = ioremap(gsbi_mem->start, resource_size(gsbi_mem));
1219 if (!dev->gsbi) {
1220 ret = -ENOMEM;
1221 goto err_gsbi_failed;
1222 }
1223 }
1224
1225 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
1226 res = platform_get_resource_byname(pdev, IORESOURCE_IO,
1227 i2c_rsrcs[i]);
1228 dev->i2c_gpios[i] = res ? res->start : -1;
1229 }
1230
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001231 platform_set_drvdata(pdev, dev);
1232
Harini Jayaramand997b3b2011-10-11 14:25:29 -06001233 dev->one_bit_t = (USEC_PER_SEC/pdata->clk_freq) + 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001234 dev->pdata = pdata;
1235 dev->clk_ctl = 0;
1236 dev->pos = 0;
1237
1238 /*
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001239 * If bootloaders leave a pending interrupt on certain GSBI's,
1240 * then we reset the core before registering for interrupts.
1241 */
Harini Jayaramand59ee0a2012-04-06 10:43:44 -06001242
1243 if (dev->pdata->src_clk_rate > 0)
1244 clk_set_rate(dev->clk, dev->pdata->src_clk_rate);
1245 else
1246 dev->pdata->src_clk_rate = 19200000;
1247
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001248 clk_prepare_enable(dev->clk);
1249 clk_prepare_enable(dev->pclk);
1250 writel_relaxed(1, dev->base + QUP_SW_RESET);
1251 if (qup_i2c_poll_state(dev, 0, true) != 0)
1252 goto err_reset_failed;
1253 clk_disable_unprepare(dev->clk);
1254 clk_disable_unprepare(dev->pclk);
1255
1256 /*
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001257 * We use num_irqs to also indicate if we got 3 interrupts or just 1.
1258 * If we have just 1, we use err_irq as the general purpose irq
1259 * and handle the changes in ISR accordingly
1260 * Per Hardware guidelines, if we have 3 interrupts, they are always
1261 * edge triggering, and if we have 1, it's always level-triggering
1262 */
1263 if (dev->num_irqs == 3) {
1264 ret = request_irq(dev->in_irq, qup_i2c_interrupt,
1265 IRQF_TRIGGER_RISING, "qup_in_intr", dev);
1266 if (ret) {
1267 dev_err(&pdev->dev, "request_in_irq failed\n");
1268 goto err_request_irq_failed;
1269 }
1270 /*
1271 * We assume out_irq exists if in_irq does since platform
1272 * configuration either has 3 interrupts assigned to QUP or 1
1273 */
1274 ret = request_irq(dev->out_irq, qup_i2c_interrupt,
1275 IRQF_TRIGGER_RISING, "qup_out_intr", dev);
1276 if (ret) {
1277 dev_err(&pdev->dev, "request_out_irq failed\n");
1278 free_irq(dev->in_irq, dev);
1279 goto err_request_irq_failed;
1280 }
1281 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1282 IRQF_TRIGGER_RISING, "qup_err_intr", dev);
1283 if (ret) {
1284 dev_err(&pdev->dev, "request_err_irq failed\n");
1285 free_irq(dev->out_irq, dev);
1286 free_irq(dev->in_irq, dev);
1287 goto err_request_irq_failed;
1288 }
1289 } else {
1290 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1291 IRQF_TRIGGER_HIGH, "qup_err_intr", dev);
1292 if (ret) {
1293 dev_err(&pdev->dev, "request_err_irq failed\n");
1294 goto err_request_irq_failed;
1295 }
1296 }
1297 disable_irq(dev->err_irq);
1298 if (dev->num_irqs == 3) {
1299 disable_irq(dev->in_irq);
1300 disable_irq(dev->out_irq);
1301 }
1302 i2c_set_adapdata(&dev->adapter, dev);
1303 dev->adapter.algo = &qup_i2c_algo;
1304 strlcpy(dev->adapter.name,
1305 "QUP I2C adapter",
1306 sizeof(dev->adapter.name));
1307 dev->adapter.nr = pdev->id;
Kenneth Heitke9b702862013-01-30 13:39:13 -07001308 dev->adapter.dev.parent = &pdev->dev;
Harini Jayaramance67cf82011-08-05 09:26:06 -06001309 if (pdata->msm_i2c_config_gpio)
1310 pdata->msm_i2c_config_gpio(dev->adapter.nr, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001311
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001312 mutex_init(&dev->mlock);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301313 dev->pwr_state = 0;
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301314 /* If the same AHB clock is used on Modem side
1315 * switch it on here itself and don't switch it
1316 * on and off during suspend and resume.
1317 */
1318 if (dev->pdata->keep_ahb_clk_on)
Alok Chauhanebe211d2012-11-19 21:53:12 +05301319 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001320
1321 ret = i2c_add_numbered_adapter(&dev->adapter);
1322 if (ret) {
1323 dev_err(&pdev->dev, "i2c_add_adapter failed\n");
1324 if (dev->num_irqs == 3) {
1325 free_irq(dev->out_irq, dev);
1326 free_irq(dev->in_irq, dev);
1327 }
1328 free_irq(dev->err_irq, dev);
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001329 } else {
Amy Malochef8f1a462012-08-13 22:55:26 -07001330 if (dev->dev->of_node) {
1331 dev->adapter.dev.of_node = pdev->dev.of_node;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001332 of_i2c_register_devices(&dev->adapter);
Amy Malochef8f1a462012-08-13 22:55:26 -07001333 }
Alok Chauhanebe211d2012-11-19 21:53:12 +05301334
1335 pm_runtime_set_autosuspend_delay(&pdev->dev, MSEC_PER_SEC);
1336 pm_runtime_use_autosuspend(&pdev->dev);
1337 pm_runtime_enable(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001338 return 0;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001339 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001340
1341
1342err_request_irq_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001343 if (dev->gsbi)
1344 iounmap(dev->gsbi);
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001345err_reset_failed:
1346 clk_disable_unprepare(dev->clk);
1347 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001348err_gsbi_failed:
1349 iounmap(dev->base);
1350err_ioremap_failed:
1351 kfree(dev);
1352err_alloc_dev_failed:
1353err_config_failed:
1354 clk_put(clk);
Matt Wagantallac294852011-08-17 15:44:58 -07001355 clk_put(pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001356err_clk_get_failed:
1357 if (gsbi_mem)
1358 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001359err_res_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001360 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001361get_res_failed:
1362 if (pdev->dev.of_node)
1363 kfree(pdata);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001364 return ret;
1365}
1366
1367static int __devexit
1368qup_i2c_remove(struct platform_device *pdev)
1369{
1370 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1371 struct resource *qup_mem, *gsbi_mem;
1372
1373 /* Grab mutex to ensure ongoing transaction is over */
1374 mutex_lock(&dev->mlock);
1375 dev->suspended = 1;
1376 mutex_unlock(&dev->mlock);
1377 mutex_destroy(&dev->mlock);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301378 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001379 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301380 qup_i2c_free_gpios(dev);
1381 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001382 platform_set_drvdata(pdev, NULL);
1383 if (dev->num_irqs == 3) {
1384 free_irq(dev->out_irq, dev);
1385 free_irq(dev->in_irq, dev);
1386 }
1387 free_irq(dev->err_irq, dev);
1388 i2c_del_adapter(&dev->adapter);
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301389 if (!dev->pdata->keep_ahb_clk_on) {
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301390 clk_put(dev->pclk);
1391 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001392 clk_put(dev->clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001393 if (dev->gsbi)
1394 iounmap(dev->gsbi);
1395 iounmap(dev->base);
1396
1397 pm_runtime_disable(&pdev->dev);
Alok Chauhanebe211d2012-11-19 21:53:12 +05301398 pm_runtime_set_suspended(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001399
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001400 if (!(dev->pdata->use_gsbi_shared_mode)) {
1401 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1402 "gsbi_qup_i2c_addr");
1403 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
1404 }
1405 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1406 "qup_phys_addr");
1407 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001408 if (dev->dev->of_node)
1409 kfree(dev->pdata);
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001410 kfree(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001411 return 0;
1412}
1413
1414#ifdef CONFIG_PM
Alok Chauhanebe211d2012-11-19 21:53:12 +05301415static int i2c_qup_pm_suspend_runtime(struct device *device)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001416{
1417 struct platform_device *pdev = to_platform_device(device);
1418 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhanebe211d2012-11-19 21:53:12 +05301419 dev_dbg(device, "pm_runtime: suspending...\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001420 /* Grab mutex to ensure ongoing transaction is over */
1421 mutex_lock(&dev->mlock);
1422 dev->suspended = 1;
1423 mutex_unlock(&dev->mlock);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301424 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001425 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301426 qup_i2c_free_gpios(dev);
1427 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001428 return 0;
1429}
1430
Alok Chauhanebe211d2012-11-19 21:53:12 +05301431static int i2c_qup_pm_resume_runtime(struct device *device)
1432{
1433 struct platform_device *pdev = to_platform_device(device);
1434 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301435 int ret = 0;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301436 dev_dbg(device, "pm_runtime: resuming...\n");
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301437 if (dev->pwr_state == 0) {
1438 ret = qup_i2c_request_gpios(dev);
1439 if (ret != 0)
1440 return ret;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301441 qup_i2c_pwr_mgmt(dev, 1);
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301442 }
Alok Chauhanebe211d2012-11-19 21:53:12 +05301443 dev->suspended = 0;
1444 return 0;
1445}
1446
1447static int qup_i2c_suspend(struct device *device)
1448{
1449 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1450 dev_dbg(device, "system suspend");
1451 i2c_qup_pm_suspend_runtime(device);
1452 }
1453 return 0;
1454}
1455
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001456static int qup_i2c_resume(struct device *device)
1457{
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301458 int ret = 0;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301459 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1460 dev_dbg(device, "system resume");
Alok Chauhan3acb67e2012-12-17 12:32:14 +05301461 ret = i2c_qup_pm_resume_runtime(device);
1462 if (!ret) {
1463 pm_runtime_mark_last_busy(device);
1464 pm_request_autosuspend(device);
1465 }
1466 return ret;
Alok Chauhanebe211d2012-11-19 21:53:12 +05301467 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001468 return 0;
1469}
1470#endif /* CONFIG_PM */
1471
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001472static const struct dev_pm_ops i2c_qup_dev_pm_ops = {
1473 SET_SYSTEM_SLEEP_PM_OPS(
1474 qup_i2c_suspend,
1475 qup_i2c_resume
1476 )
1477 SET_RUNTIME_PM_OPS(
Alok Chauhanebe211d2012-11-19 21:53:12 +05301478 i2c_qup_pm_suspend_runtime,
1479 i2c_qup_pm_resume_runtime,
1480 NULL
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001481 )
1482};
1483
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001484static struct of_device_id i2c_qup_dt_match[] = {
1485 {
1486 .compatible = "qcom,i2c-qup",
1487 },
1488 {}
1489};
1490
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001491static struct platform_driver qup_i2c_driver = {
1492 .probe = qup_i2c_probe,
1493 .remove = __devexit_p(qup_i2c_remove),
1494 .driver = {
1495 .name = "qup_i2c",
1496 .owner = THIS_MODULE,
1497 .pm = &i2c_qup_dev_pm_ops,
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001498 .of_match_table = i2c_qup_dt_match,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001499 },
1500};
1501
1502/* QUP may be needed to bring up other drivers */
1503static int __init
1504qup_i2c_init_driver(void)
1505{
1506 return platform_driver_register(&qup_i2c_driver);
1507}
1508arch_initcall(qup_i2c_init_driver);
1509
1510static void __exit qup_i2c_exit_driver(void)
1511{
1512 platform_driver_unregister(&qup_i2c_driver);
1513}
1514module_exit(qup_i2c_exit_driver);
1515