blob: 085b632b8422f78ee772ed538da0b1b906574606 [file] [log] [blame]
Harini Jayaraman9fffe012012-01-23 17:01:14 -07001/* Copyright (c) 2009-2012, Code Aurora Forum. 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;
166 int clk_state;
167 struct timer_list pwr_timer;
168 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
200 if (!dev->msg || !dev->complete) {
201 /* Clear Error interrupt if it's a level triggered interrupt*/
202 if (dev->num_irqs == 1) {
203 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
204 /* Ensure that state is written before ISR exits */
205 mb();
206 }
207 return IRQ_HANDLED;
208 }
209
210 if (status & I2C_STATUS_ERROR_MASK) {
211 dev_err(dev->dev, "QUP: I2C status flags :0x%x, irq:%d\n",
212 status, irq);
213 err = status;
214 /* Clear Error interrupt if it's a level triggered interrupt*/
215 if (dev->num_irqs == 1) {
216 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
217 /* Ensure that state is written before ISR exits */
218 mb();
219 }
220 goto intr_done;
221 }
222
223 if (status1 & 0x7F) {
224 dev_err(dev->dev, "QUP: QUP status flags :0x%x\n", status1);
225 err = -status1;
226 /* Clear Error interrupt if it's a level triggered interrupt*/
227 if (dev->num_irqs == 1) {
228 writel_relaxed((status1 & QUP_STATUS_ERROR_FLAGS),
229 dev->base + QUP_ERROR_FLAGS);
230 /* Ensure that error flags are cleared before ISR
231 * exits
232 */
233 mb();
234 }
235 goto intr_done;
236 }
237
238 if ((dev->num_irqs == 3) && (dev->msg->flags == I2C_M_RD)
239 && (irq == dev->out_irq))
240 return IRQ_HANDLED;
241 if (op_flgs & QUP_OUT_SVC_FLAG) {
242 writel_relaxed(QUP_OUT_SVC_FLAG, dev->base + QUP_OPERATIONAL);
243 /* Ensure that service flag is acknowledged before ISR exits */
244 mb();
245 }
246 if (dev->msg->flags == I2C_M_RD) {
247 if ((op_flgs & QUP_MX_INPUT_DONE) ||
248 (op_flgs & QUP_IN_SVC_FLAG)) {
249 writel_relaxed(QUP_IN_SVC_FLAG, dev->base
250 + QUP_OPERATIONAL);
251 /* Ensure that service flag is acknowledged before ISR
252 * exits
253 */
254 mb();
255 } else
256 return IRQ_HANDLED;
257 }
258
259intr_done:
260 dev_dbg(dev->dev, "QUP intr= %d, i2c status=0x%x, qup status = 0x%x\n",
261 irq, status, status1);
262 qup_print_status(dev);
263 dev->err = err;
264 complete(dev->complete);
265 return IRQ_HANDLED;
266}
267
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600268static int
269qup_i2c_poll_state(struct qup_i2c_dev *dev, uint32_t req_state, bool only_valid)
270{
271 uint32_t retries = 0;
272
273 dev_dbg(dev->dev, "Polling for state:0x%x, or valid-only:%d\n",
274 req_state, only_valid);
275
276 while (retries != 2000) {
277 uint32_t status = readl_relaxed(dev->base + QUP_STATE);
278
279 /*
280 * If only valid bit needs to be checked, requested state is
281 * 'don't care'
282 */
283 if (status & QUP_STATE_VALID) {
284 if (only_valid)
285 return 0;
286 else if ((req_state & QUP_I2C_MAST_GEN) &&
287 (status & QUP_I2C_MAST_GEN))
288 return 0;
289 else if ((status & QUP_STATE_MASK) == req_state)
290 return 0;
291 }
292 if (retries++ == 1000)
293 udelay(100);
294 }
295 return -ETIMEDOUT;
296}
297
298static int
299qup_update_state(struct qup_i2c_dev *dev, uint32_t state)
300{
301 if (qup_i2c_poll_state(dev, 0, true) != 0)
302 return -EIO;
303 writel_relaxed(state, dev->base + QUP_STATE);
304 if (qup_i2c_poll_state(dev, state, false) != 0)
305 return -EIO;
306 return 0;
307}
308
Trilok Sonif0274f12011-08-19 12:26:13 +0530309/*
310 * Before calling qup_config_core_on_en(), please make
311 * sure that QuPE core is in RESET state.
Trilok Sonif0274f12011-08-19 12:26:13 +0530312 */
313static void
314qup_config_core_on_en(struct qup_i2c_dev *dev)
315{
316 uint32_t status;
317
Trilok Sonif0274f12011-08-19 12:26:13 +0530318 status = readl_relaxed(dev->base + QUP_CONFIG);
319 status |= BIT(13);
320 writel_relaxed(status, dev->base + QUP_CONFIG);
321 /* making sure that write has really gone through */
322 mb();
323}
324
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700325static void
326qup_i2c_pwr_mgmt(struct qup_i2c_dev *dev, unsigned int state)
327{
328 dev->clk_state = state;
329 if (state != 0) {
Sagar Dharia75a57192012-02-12 20:47:32 -0700330 clk_enable(dev->clk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +0530331 if (!dev->pdata->keep_ahb_clk_on)
332 clk_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700333 } else {
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600334 qup_update_state(dev, QUP_RESET_STATE);
Sagar Dharia75a57192012-02-12 20:47:32 -0700335 clk_disable(dev->clk);
Trilok Sonif0274f12011-08-19 12:26:13 +0530336 qup_config_core_on_en(dev);
Kiran Gunda9aa5e912012-08-16 18:37:46 +0530337 if (!dev->pdata->keep_ahb_clk_on)
338 clk_disable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700339 }
340}
341
342static void
343qup_i2c_pwr_timer(unsigned long data)
344{
345 struct qup_i2c_dev *dev = (struct qup_i2c_dev *) data;
346 dev_dbg(dev->dev, "QUP_Power: Inactivity based power management\n");
347 if (dev->clk_state == 1)
348 qup_i2c_pwr_mgmt(dev, 0);
349}
350
351static int
352qup_i2c_poll_writeready(struct qup_i2c_dev *dev, int rem)
353{
354 uint32_t retries = 0;
355
356 while (retries != 2000) {
357 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
358
359 if (!(status & I2C_STATUS_WR_BUFFER_FULL)) {
360 if (((dev->msg->flags & I2C_M_RD) || (rem == 0)) &&
361 !(status & I2C_STATUS_BUS_ACTIVE))
362 return 0;
363 else if ((dev->msg->flags == 0) && (rem > 0))
364 return 0;
365 else /* 1-bit delay before we check for bus busy */
366 udelay(dev->one_bit_t);
367 }
Harini Jayaramand997b3b2011-10-11 14:25:29 -0600368 if (retries++ == 1000) {
369 /*
370 * Wait for FIFO number of bytes to be absolutely sure
371 * that I2C write state machine is not idle. Each byte
372 * takes 9 clock cycles. (8 bits + 1 ack)
373 */
374 usleep_range((dev->one_bit_t * (dev->out_fifo_sz * 9)),
375 (dev->one_bit_t * (dev->out_fifo_sz * 9)));
376 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700377 }
378 qup_print_status(dev);
379 return -ETIMEDOUT;
380}
381
382static int qup_i2c_poll_clock_ready(struct qup_i2c_dev *dev)
383{
384 uint32_t retries = 0;
385
386 /*
387 * Wait for the clock state to transition to either IDLE or FORCED
388 * LOW. This will usually happen within one cycle of the i2c clock.
389 */
390
391 while (retries++ < QUP_MAX_CLK_STATE_RETRIES) {
392 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
393 uint32_t clk_state = (status >> 13) & 0x7;
394
395 if (clk_state == I2C_CLK_RESET_BUSIDLE_STATE ||
396 clk_state == I2C_CLK_FORCED_LOW_STATE)
397 return 0;
398 /* 1-bit delay before we check again */
399 udelay(dev->one_bit_t);
400 }
401
402 dev_err(dev->dev, "Error waiting for clk ready\n");
403 return -ETIMEDOUT;
404}
405
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700406static inline int qup_i2c_request_gpios(struct qup_i2c_dev *dev)
407{
408 int i;
409 int result = 0;
410
411 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
412 if (dev->i2c_gpios[i] >= 0) {
413 result = gpio_request(dev->i2c_gpios[i], i2c_rsrcs[i]);
414 if (result) {
415 dev_err(dev->dev,
416 "gpio_request for pin %d failed\
417 with error %d\n", dev->i2c_gpios[i],
418 result);
419 goto error;
420 }
421 }
422 }
423 return 0;
424
425error:
426 for (; --i >= 0;) {
427 if (dev->i2c_gpios[i] >= 0)
428 gpio_free(dev->i2c_gpios[i]);
429 }
430 return result;
431}
432
433static inline void qup_i2c_free_gpios(struct qup_i2c_dev *dev)
434{
435 int i;
436
437 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
438 if (dev->i2c_gpios[i] >= 0)
439 gpio_free(dev->i2c_gpios[i]);
440 }
441}
442
443#ifdef DEBUG
444static void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
445 uint32_t addr, int rdwr)
446{
447 if (rdwr)
448 dev_dbg(dev->dev, "RD:Wrote 0x%x to out_ff:0x%x\n", val, addr);
449 else
450 dev_dbg(dev->dev, "WR:Wrote 0x%x to out_ff:0x%x\n", val, addr);
451}
452#else
453static inline void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
454 uint32_t addr, int rdwr)
455{
456}
457#endif
458
459static void
460qup_issue_read(struct qup_i2c_dev *dev, struct i2c_msg *msg, int *idx,
461 uint32_t carry_over)
462{
463 uint16_t addr = (msg->addr << 1) | 1;
464 /* QUP limit 256 bytes per read. By HW design, 0 in the 8-bit field
465 * is treated as 256 byte read.
466 */
467 uint16_t rd_len = ((dev->cnt == 256) ? 0 : dev->cnt);
468
469 if (*idx % 4) {
470 writel_relaxed(carry_over | ((QUP_OUT_START | addr) << 16),
471 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx-2)); */
472
473 qup_verify_fifo(dev, carry_over |
474 ((QUP_OUT_START | addr) << 16), (uint32_t)dev->base
475 + QUP_OUT_FIFO_BASE + (*idx - 2), 1);
476 writel_relaxed((QUP_OUT_REC | rd_len),
477 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx+2)); */
478
479 qup_verify_fifo(dev, (QUP_OUT_REC | rd_len),
480 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx + 2), 1);
481 } else {
482 writel_relaxed(((QUP_OUT_REC | rd_len) << 16)
483 | QUP_OUT_START | addr,
484 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx)); */
485
486 qup_verify_fifo(dev, QUP_OUT_REC << 16 | rd_len << 16 |
487 QUP_OUT_START | addr,
488 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx), 1);
489 }
490 *idx += 4;
491}
492
493static void
494qup_issue_write(struct qup_i2c_dev *dev, struct i2c_msg *msg, int rem,
495 int *idx, uint32_t *carry_over)
496{
497 int entries = dev->cnt;
498 int empty_sl = dev->wr_sz - ((*idx) >> 1);
499 int i = 0;
500 uint32_t val = 0;
501 uint32_t last_entry = 0;
502 uint16_t addr = msg->addr << 1;
503
504 if (dev->pos == 0) {
505 if (*idx % 4) {
506 writel_relaxed(*carry_over | ((QUP_OUT_START |
507 addr) << 16),
508 dev->base + QUP_OUT_FIFO_BASE);
509
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600510 qup_verify_fifo(dev, *carry_over | QUP_OUT_START << 16 |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700511 addr << 16, (uint32_t)dev->base +
512 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
513 } else
514 val = QUP_OUT_START | addr;
515 *idx += 2;
516 i++;
517 entries++;
518 } else {
519 /* Avoid setp time issue by adding 1 NOP when number of bytes
520 * are more than FIFO/BLOCK size. setup time issue can't appear
521 * otherwise since next byte to be written will always be ready
522 */
523 val = (QUP_OUT_NOP | 1);
524 *idx += 2;
525 i++;
526 entries++;
527 }
528 if (entries > empty_sl)
529 entries = empty_sl;
530
531 for (; i < (entries - 1); i++) {
532 if (*idx % 4) {
533 writel_relaxed(val | ((QUP_OUT_DATA |
534 msg->buf[dev->pos]) << 16),
535 dev->base + QUP_OUT_FIFO_BASE);
536
537 qup_verify_fifo(dev, val | QUP_OUT_DATA << 16 |
538 msg->buf[dev->pos] << 16, (uint32_t)dev->base +
539 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
540 } else
541 val = QUP_OUT_DATA | msg->buf[dev->pos];
542 (*idx) += 2;
543 dev->pos++;
544 }
545 if (dev->pos < (msg->len - 1))
546 last_entry = QUP_OUT_DATA;
547 else if (rem > 1) /* not last array entry */
548 last_entry = QUP_OUT_DATA;
549 else
550 last_entry = QUP_OUT_STOP;
551 if ((*idx % 4) == 0) {
552 /*
553 * If read-start and read-command end up in different fifos, it
554 * may result in extra-byte being read due to extra-read cycle.
555 * Avoid that by inserting NOP as the last entry of fifo only
556 * if write command(s) leave 1 space in fifo.
557 */
558 if (rem > 1) {
559 struct i2c_msg *next = msg + 1;
Harini Jayaraman24bea432011-10-11 16:06:28 -0600560 if (next->addr == msg->addr && (next->flags & I2C_M_RD)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700561 && *idx == ((dev->wr_sz*2) - 4)) {
562 writel_relaxed(((last_entry |
563 msg->buf[dev->pos]) |
564 ((1 | QUP_OUT_NOP) << 16)), dev->base +
565 QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
566
567 qup_verify_fifo(dev,
568 ((last_entry | msg->buf[dev->pos]) |
569 ((1 | QUP_OUT_NOP) << 16)),
570 (uint32_t)dev->base +
571 QUP_OUT_FIFO_BASE + (*idx), 0);
572 *idx += 2;
573 } else if (next->flags == 0 && dev->pos == msg->len - 1
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600574 && *idx < (dev->wr_sz*2) &&
575 (next->addr != msg->addr)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700576 /* Last byte of an intermittent write */
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600577 writel_relaxed((QUP_OUT_STOP |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700578 msg->buf[dev->pos]),
579 dev->base + QUP_OUT_FIFO_BASE);
580
581 qup_verify_fifo(dev,
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600582 QUP_OUT_STOP | msg->buf[dev->pos],
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700583 (uint32_t)dev->base +
584 QUP_OUT_FIFO_BASE + (*idx), 0);
585 *idx += 2;
586 } else
587 *carry_over = (last_entry | msg->buf[dev->pos]);
588 } else {
589 writel_relaxed((last_entry | msg->buf[dev->pos]),
590 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
591
592 qup_verify_fifo(dev, last_entry | msg->buf[dev->pos],
593 (uint32_t)dev->base + QUP_OUT_FIFO_BASE +
594 (*idx), 0);
595 }
596 } else {
597 writel_relaxed(val | ((last_entry | msg->buf[dev->pos]) << 16),
598 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
599
600 qup_verify_fifo(dev, val | (last_entry << 16) |
601 (msg->buf[dev->pos] << 16), (uint32_t)dev->base +
602 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
603 }
604
605 *idx += 2;
606 dev->pos++;
607 dev->cnt = msg->len - dev->pos;
608}
609
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700610static void
611qup_set_read_mode(struct qup_i2c_dev *dev, int rd_len)
612{
613 uint32_t wr_mode = (dev->wr_sz < dev->out_fifo_sz) ?
614 QUP_WR_BLK_MODE : 0;
615 if (rd_len > 256) {
616 dev_dbg(dev->dev, "HW limit: Breaking reads in chunk of 256\n");
617 rd_len = 256;
618 }
619 if (rd_len <= dev->in_fifo_sz) {
620 writel_relaxed(wr_mode | QUP_PACK_EN | QUP_UNPACK_EN,
621 dev->base + QUP_IO_MODE);
622 writel_relaxed(rd_len, dev->base + QUP_MX_READ_CNT);
623 } else {
624 writel_relaxed(wr_mode | QUP_RD_BLK_MODE |
625 QUP_PACK_EN | QUP_UNPACK_EN, dev->base + QUP_IO_MODE);
626 writel_relaxed(rd_len, dev->base + QUP_MX_INPUT_CNT);
627 }
628}
629
630static int
631qup_set_wr_mode(struct qup_i2c_dev *dev, int rem)
632{
633 int total_len = 0;
634 int ret = 0;
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600635 int len = dev->msg->len;
636 struct i2c_msg *next = NULL;
637 if (rem > 1)
638 next = dev->msg + 1;
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600639 while (rem > 1 && next->flags == 0 && (next->addr == dev->msg->addr)) {
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600640 len += next->len + 1;
641 next = next + 1;
642 rem--;
643 }
644 if (len >= (dev->out_fifo_sz - 1)) {
645 total_len = len + 1 + (len/(dev->out_blk_sz-1));
646
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700647 writel_relaxed(QUP_WR_BLK_MODE | QUP_PACK_EN | QUP_UNPACK_EN,
648 dev->base + QUP_IO_MODE);
649 dev->wr_sz = dev->out_blk_sz;
650 } else
651 writel_relaxed(QUP_PACK_EN | QUP_UNPACK_EN,
652 dev->base + QUP_IO_MODE);
653
654 if (rem > 1) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700655 if (next->addr == dev->msg->addr &&
656 next->flags == I2C_M_RD) {
657 qup_set_read_mode(dev, next->len);
658 /* make sure read start & read command are in 1 blk */
659 if ((total_len % dev->out_blk_sz) ==
660 (dev->out_blk_sz - 1))
661 total_len += 3;
662 else
663 total_len += 2;
664 }
665 }
666 /* WRITE COUNT register valid/used only in block mode */
667 if (dev->wr_sz == dev->out_blk_sz)
668 writel_relaxed(total_len, dev->base + QUP_MX_WR_CNT);
669 return ret;
670}
671
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700672
673static void qup_i2c_recover_bus_busy(struct qup_i2c_dev *dev)
674{
675 int i;
676 int gpio_clk;
677 int gpio_dat;
678 bool gpio_clk_status = false;
679 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
680 struct gpiomux_setting old_gpio_setting;
681
682 if (dev->pdata->msm_i2c_config_gpio)
683 return;
684
685 if (!(status & (I2C_STATUS_BUS_ACTIVE)) ||
686 (status & (I2C_STATUS_BUS_MASTER)))
687 return;
688
689 gpio_clk = dev->i2c_gpios[0];
690 gpio_dat = dev->i2c_gpios[1];
691
692 if ((gpio_clk == -1) && (gpio_dat == -1)) {
693 dev_err(dev->dev, "Recovery failed due to undefined GPIO's\n");
694 return;
695 }
696
697 disable_irq(dev->err_irq);
698 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
699 if (msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
700 &recovery_config, &old_gpio_setting)) {
701 dev_err(dev->dev, "GPIO pins have no active setting\n");
702 goto recovery_end;
703 }
704 }
705
706 dev_warn(dev->dev, "i2c_scl: %d, i2c_sda: %d\n",
707 gpio_get_value(gpio_clk), gpio_get_value(gpio_dat));
708
709 for (i = 0; i < 9; i++) {
710 if (gpio_get_value(gpio_dat) && gpio_clk_status)
711 break;
712 gpio_direction_output(gpio_clk, 0);
713 udelay(5);
714 gpio_direction_output(gpio_dat, 0);
715 udelay(5);
716 gpio_direction_input(gpio_clk);
717 udelay(5);
718 if (!gpio_get_value(gpio_clk))
719 udelay(20);
720 if (!gpio_get_value(gpio_clk))
721 usleep_range(10000, 10000);
722 gpio_clk_status = gpio_get_value(gpio_clk);
723 gpio_direction_input(gpio_dat);
724 udelay(5);
725 }
726
727 /* Configure ALT funciton to QUP I2C*/
728 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
729 msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
730 &old_gpio_setting, NULL);
731 }
732
733 udelay(10);
734
735 status = readl_relaxed(dev->base + QUP_I2C_STATUS);
736 if (!(status & I2C_STATUS_BUS_ACTIVE)) {
737 dev_info(dev->dev, "Bus busy cleared after %d clock cycles, "
738 "status %x\n",
739 i, status);
740 goto recovery_end;
741 }
742
743 dev_warn(dev->dev, "Bus still busy, status %x\n", status);
744
745recovery_end:
746 enable_irq(dev->err_irq);
747}
748
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700749static int
750qup_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
751{
752 DECLARE_COMPLETION_ONSTACK(complete);
753 struct qup_i2c_dev *dev = i2c_get_adapdata(adap);
754 int ret;
755 int rem = num;
756 long timeout;
757 int err;
758
759 del_timer_sync(&dev->pwr_timer);
760 mutex_lock(&dev->mlock);
761
762 if (dev->suspended) {
763 mutex_unlock(&dev->mlock);
764 return -EIO;
765 }
766
Harini Jayaramand59ee0a2012-04-06 10:43:44 -0600767 if (dev->clk_state == 0)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700768 qup_i2c_pwr_mgmt(dev, 1);
Harini Jayaramand59ee0a2012-04-06 10:43:44 -0600769
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700770 /* Initialize QUP registers during first transfer */
771 if (dev->clk_ctl == 0) {
772 int fs_div;
773 int hs_div;
774 uint32_t fifo_reg;
775
776 if (dev->gsbi) {
777 writel_relaxed(0x2 << 4, dev->gsbi);
778 /* GSBI memory is not in the same 1K region as other
779 * QUP registers. mb() here ensures that the GSBI
780 * register is updated in correct order and that the
781 * write has gone through before programming QUP core
782 * registers
783 */
784 mb();
785 }
786
787 fs_div = ((dev->pdata->src_clk_rate
788 / dev->pdata->clk_freq) / 2) - 3;
789 hs_div = 3;
790 dev->clk_ctl = ((hs_div & 0x7) << 8) | (fs_div & 0xff);
791 fifo_reg = readl_relaxed(dev->base + QUP_IO_MODE);
792 if (fifo_reg & 0x3)
793 dev->out_blk_sz = (fifo_reg & 0x3) * 16;
794 else
795 dev->out_blk_sz = 16;
796 if (fifo_reg & 0x60)
797 dev->in_blk_sz = ((fifo_reg & 0x60) >> 5) * 16;
798 else
799 dev->in_blk_sz = 16;
800 /*
801 * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag'
802 * associated with each byte written/received
803 */
804 dev->out_blk_sz /= 2;
805 dev->in_blk_sz /= 2;
806 dev->out_fifo_sz = dev->out_blk_sz *
807 (2 << ((fifo_reg & 0x1C) >> 2));
808 dev->in_fifo_sz = dev->in_blk_sz *
809 (2 << ((fifo_reg & 0x380) >> 7));
810 dev_dbg(dev->dev, "QUP IN:bl:%d, ff:%d, OUT:bl:%d, ff:%d\n",
811 dev->in_blk_sz, dev->in_fifo_sz,
812 dev->out_blk_sz, dev->out_fifo_sz);
813 }
814
815 writel_relaxed(1, dev->base + QUP_SW_RESET);
Sagar Dharia518e2302011-08-05 11:03:03 -0600816 ret = qup_i2c_poll_state(dev, QUP_RESET_STATE, false);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700817 if (ret) {
818 dev_err(dev->dev, "QUP Busy:Trying to recover\n");
819 goto out_err;
820 }
821
822 if (dev->num_irqs == 3) {
823 enable_irq(dev->in_irq);
824 enable_irq(dev->out_irq);
825 }
826 enable_irq(dev->err_irq);
827
828 /* Initialize QUP registers */
829 writel_relaxed(0, dev->base + QUP_CONFIG);
830 writel_relaxed(QUP_OPERATIONAL_RESET, dev->base + QUP_OPERATIONAL);
831 writel_relaxed(QUP_STATUS_ERROR_FLAGS, dev->base + QUP_ERROR_FLAGS_EN);
832
833 writel_relaxed(I2C_MINI_CORE | I2C_N_VAL, dev->base + QUP_CONFIG);
834
835 /* Initialize I2C mini core registers */
836 writel_relaxed(0, dev->base + QUP_I2C_CLK_CTL);
837 writel_relaxed(QUP_I2C_STATUS_RESET, dev->base + QUP_I2C_STATUS);
838
839 while (rem) {
840 bool filled = false;
841
842 dev->cnt = msgs->len - dev->pos;
843 dev->msg = msgs;
844
845 dev->wr_sz = dev->out_fifo_sz;
846 dev->err = 0;
847 dev->complete = &complete;
848
Sagar Dharia518e2302011-08-05 11:03:03 -0600849 if (qup_i2c_poll_state(dev, QUP_I2C_MAST_GEN, false) != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700850 ret = -EIO;
851 goto out_err;
852 }
853
854 qup_print_status(dev);
855 /* HW limits Read upto 256 bytes in 1 read without stop */
856 if (dev->msg->flags & I2C_M_RD) {
857 qup_set_read_mode(dev, dev->cnt);
858 if (dev->cnt > 256)
859 dev->cnt = 256;
860 } else {
861 ret = qup_set_wr_mode(dev, rem);
862 if (ret != 0)
863 goto out_err;
864 /* Don't fill block till we get interrupt */
865 if (dev->wr_sz == dev->out_blk_sz)
866 filled = true;
867 }
868
869 err = qup_update_state(dev, QUP_RUN_STATE);
870 if (err < 0) {
871 ret = err;
872 goto out_err;
873 }
874
875 qup_print_status(dev);
876 writel_relaxed(dev->clk_ctl, dev->base + QUP_I2C_CLK_CTL);
877 /* CLK_CTL register is not in the same 1K region as other QUP
878 * registers. Ensure that clock control is written before
879 * programming other QUP registers
880 */
881 mb();
882
883 do {
884 int idx = 0;
885 uint32_t carry_over = 0;
886
887 /* Transition to PAUSE state only possible from RUN */
888 err = qup_update_state(dev, QUP_PAUSE_STATE);
889 if (err < 0) {
890 ret = err;
891 goto out_err;
892 }
893
894 qup_print_status(dev);
895 /* This operation is Write, check the next operation
896 * and decide mode
897 */
898 while (filled == false) {
899 if ((msgs->flags & I2C_M_RD))
900 qup_issue_read(dev, msgs, &idx,
901 carry_over);
902 else if (!(msgs->flags & I2C_M_RD))
903 qup_issue_write(dev, msgs, rem, &idx,
904 &carry_over);
905 if (idx >= (dev->wr_sz << 1))
906 filled = true;
907 /* Start new message */
908 if (filled == false) {
909 if (msgs->flags & I2C_M_RD)
910 filled = true;
911 else if (rem > 1) {
912 /* Only combine operations with
913 * same address
914 */
915 struct i2c_msg *next = msgs + 1;
916 if (next->addr != msgs->addr)
917 filled = true;
918 else {
919 rem--;
920 msgs++;
921 dev->msg = msgs;
922 dev->pos = 0;
923 dev->cnt = msgs->len;
924 if (msgs->len > 256)
925 dev->cnt = 256;
926 }
927 } else
928 filled = true;
929 }
930 }
931 err = qup_update_state(dev, QUP_RUN_STATE);
932 if (err < 0) {
933 ret = err;
934 goto out_err;
935 }
936 dev_dbg(dev->dev, "idx:%d, rem:%d, num:%d, mode:%d\n",
937 idx, rem, num, dev->mode);
938
939 qup_print_status(dev);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700940 timeout = wait_for_completion_timeout(&complete,
941 msecs_to_jiffies(dev->out_fifo_sz));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700942 if (!timeout) {
943 uint32_t istatus = readl_relaxed(dev->base +
944 QUP_I2C_STATUS);
945 uint32_t qstatus = readl_relaxed(dev->base +
946 QUP_ERROR_FLAGS);
947 uint32_t op_flgs = readl_relaxed(dev->base +
948 QUP_OPERATIONAL);
949
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700950 /*
951 * Dont wait for 1 sec if i2c sees the bus
952 * active and controller is not master.
953 * A slave has pulled line low. Try to recover
954 */
955 if (!(istatus & I2C_STATUS_BUS_ACTIVE) ||
956 (istatus & I2C_STATUS_BUS_MASTER)) {
957 timeout =
958 wait_for_completion_timeout(&complete,
959 HZ);
960 if (timeout)
961 goto timeout_err;
962 }
963 qup_i2c_recover_bus_busy(dev);
964 dev_err(dev->dev,
965 "Transaction timed out, SL-AD = 0x%x\n",
966 dev->msg->addr);
967
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700968 dev_err(dev->dev, "I2C Status: %x\n", istatus);
969 dev_err(dev->dev, "QUP Status: %x\n", qstatus);
970 dev_err(dev->dev, "OP Flags: %x\n", op_flgs);
971 writel_relaxed(1, dev->base + QUP_SW_RESET);
972 /* Make sure that the write has gone through
973 * before returning from the function
974 */
975 mb();
976 ret = -ETIMEDOUT;
977 goto out_err;
978 }
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700979timeout_err:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700980 if (dev->err) {
981 if (dev->err > 0 &&
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700982 dev->err & QUP_I2C_NACK_FLAG) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700983 dev_err(dev->dev,
984 "I2C slave addr:0x%x not connected\n",
985 dev->msg->addr);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700986 dev->err = ENOTCONN;
987 } else if (dev->err < 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700988 dev_err(dev->dev,
989 "QUP data xfer error %d\n", dev->err);
990 ret = dev->err;
991 goto out_err;
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700992 } else if (dev->err > 0) {
993 /*
994 * ISR returns +ve error if error code
995 * is I2C related, e.g. unexpected start
996 * So you may call recover-bus-busy when
997 * this error happens
998 */
999 qup_i2c_recover_bus_busy(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001000 }
1001 ret = -dev->err;
1002 goto out_err;
1003 }
1004 if (dev->msg->flags & I2C_M_RD) {
1005 int i;
1006 uint32_t dval = 0;
1007 for (i = 0; dev->pos < dev->msg->len; i++,
1008 dev->pos++) {
1009 uint32_t rd_status =
1010 readl_relaxed(dev->base
1011 + QUP_OPERATIONAL);
1012 if (i % 2 == 0) {
1013 if ((rd_status &
1014 QUP_IN_NOT_EMPTY) == 0)
1015 break;
1016 dval = readl_relaxed(dev->base +
1017 QUP_IN_FIFO_BASE);
1018 dev->msg->buf[dev->pos] =
1019 dval & 0xFF;
1020 } else
1021 dev->msg->buf[dev->pos] =
1022 ((dval & 0xFF0000) >>
1023 16);
1024 }
1025 dev->cnt -= i;
1026 } else
1027 filled = false; /* refill output FIFO */
1028 dev_dbg(dev->dev, "pos:%d, len:%d, cnt:%d\n",
1029 dev->pos, msgs->len, dev->cnt);
1030 } while (dev->cnt > 0);
1031 if (dev->cnt == 0) {
1032 if (msgs->len == dev->pos) {
1033 rem--;
1034 msgs++;
1035 dev->pos = 0;
1036 }
1037 if (rem) {
1038 err = qup_i2c_poll_clock_ready(dev);
1039 if (err < 0) {
1040 ret = err;
1041 goto out_err;
1042 }
1043 err = qup_update_state(dev, QUP_RESET_STATE);
1044 if (err < 0) {
1045 ret = err;
1046 goto out_err;
1047 }
1048 }
1049 }
1050 /* Wait for I2C bus to be idle */
1051 ret = qup_i2c_poll_writeready(dev, rem);
1052 if (ret) {
1053 dev_err(dev->dev,
1054 "Error waiting for write ready\n");
1055 goto out_err;
1056 }
1057 }
1058
1059 ret = num;
1060 out_err:
1061 disable_irq(dev->err_irq);
1062 if (dev->num_irqs == 3) {
1063 disable_irq(dev->in_irq);
1064 disable_irq(dev->out_irq);
1065 }
1066 dev->complete = NULL;
1067 dev->msg = NULL;
1068 dev->pos = 0;
1069 dev->err = 0;
1070 dev->cnt = 0;
1071 dev->pwr_timer.expires = jiffies + 3*HZ;
1072 add_timer(&dev->pwr_timer);
1073 mutex_unlock(&dev->mlock);
1074 return ret;
1075}
1076
1077static u32
1078qup_i2c_func(struct i2c_adapter *adap)
1079{
1080 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
1081}
1082
1083static const struct i2c_algorithm qup_i2c_algo = {
1084 .master_xfer = qup_i2c_xfer,
1085 .functionality = qup_i2c_func,
1086};
1087
1088static int __devinit
1089qup_i2c_probe(struct platform_device *pdev)
1090{
1091 struct qup_i2c_dev *dev;
1092 struct resource *qup_mem, *gsbi_mem, *qup_io, *gsbi_io, *res;
1093 struct resource *in_irq, *out_irq, *err_irq;
1094 struct clk *clk, *pclk;
1095 int ret = 0;
1096 int i;
1097 struct msm_i2c_platform_data *pdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001098
1099 gsbi_mem = NULL;
1100 dev_dbg(&pdev->dev, "qup_i2c_probe\n");
1101
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001102 if (pdev->dev.of_node) {
1103 struct device_node *node = pdev->dev.of_node;
1104 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
1105 if (!pdata)
1106 return -ENOMEM;
1107 ret = of_property_read_u32(node, "qcom,i2c-bus-freq",
1108 &pdata->clk_freq);
1109 if (ret)
1110 goto get_res_failed;
1111 ret = of_property_read_u32(node, "cell-index", &pdev->id);
1112 if (ret)
1113 goto get_res_failed;
1114 /* Optional property */
1115 of_property_read_u32(node, "qcom,i2c-src-freq",
1116 &pdata->src_clk_rate);
1117 } else
1118 pdata = pdev->dev.platform_data;
1119
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001120 if (!pdata) {
1121 dev_err(&pdev->dev, "platform data not initialized\n");
1122 return -ENOSYS;
1123 }
1124 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1125 "qup_phys_addr");
1126 if (!qup_mem) {
1127 dev_err(&pdev->dev, "no qup mem resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001128 ret = -ENODEV;
1129 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001130 }
1131
1132 /*
1133 * We only have 1 interrupt for new hardware targets and in_irq,
1134 * out_irq will be NULL for those platforms
1135 */
1136 in_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1137 "qup_in_intr");
1138
1139 out_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1140 "qup_out_intr");
1141
1142 err_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1143 "qup_err_intr");
1144 if (!err_irq) {
1145 dev_err(&pdev->dev, "no error irq resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001146 ret = -ENODEV;
1147 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001148 }
1149
1150 qup_io = request_mem_region(qup_mem->start, resource_size(qup_mem),
1151 pdev->name);
1152 if (!qup_io) {
1153 dev_err(&pdev->dev, "QUP region already claimed\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001154 ret = -EBUSY;
1155 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001156 }
1157 if (!pdata->use_gsbi_shared_mode) {
1158 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1159 "gsbi_qup_i2c_addr");
1160 if (!gsbi_mem) {
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001161 dev_dbg(&pdev->dev, "Assume BLSP\n");
1162 /*
1163 * BLSP core does not need protocol programming so this
1164 * resource is not expected
1165 */
1166 goto blsp_core_init;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001167 }
1168 gsbi_io = request_mem_region(gsbi_mem->start,
1169 resource_size(gsbi_mem),
1170 pdev->name);
1171 if (!gsbi_io) {
1172 dev_err(&pdev->dev, "GSBI region already claimed\n");
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001173 ret = -EBUSY;
1174 goto err_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001175 }
1176 }
1177
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001178blsp_core_init:
Matt Wagantallac294852011-08-17 15:44:58 -07001179 clk = clk_get(&pdev->dev, "core_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001180 if (IS_ERR(clk)) {
Matt Wagantallac294852011-08-17 15:44:58 -07001181 dev_err(&pdev->dev, "Could not get core_clk\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001182 ret = PTR_ERR(clk);
1183 goto err_clk_get_failed;
1184 }
1185
Matt Wagantallac294852011-08-17 15:44:58 -07001186 pclk = clk_get(&pdev->dev, "iface_clk");
1187 if (IS_ERR(pclk)) {
1188 dev_err(&pdev->dev, "Could not get iface_clk\n");
1189 ret = PTR_ERR(pclk);
1190 clk_put(clk);
1191 goto err_clk_get_failed;
1192 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001193
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001194 /* We support frequencies upto FAST Mode(400KHz) */
1195 if (pdata->clk_freq <= 0 ||
1196 pdata->clk_freq > 400000) {
1197 dev_err(&pdev->dev, "clock frequency not supported\n");
1198 ret = -EIO;
1199 goto err_config_failed;
1200 }
1201
1202 dev = kzalloc(sizeof(struct qup_i2c_dev), GFP_KERNEL);
1203 if (!dev) {
1204 ret = -ENOMEM;
1205 goto err_alloc_dev_failed;
1206 }
1207
1208 dev->dev = &pdev->dev;
1209 if (in_irq)
1210 dev->in_irq = in_irq->start;
1211 if (out_irq)
1212 dev->out_irq = out_irq->start;
1213 dev->err_irq = err_irq->start;
1214 if (in_irq && out_irq)
1215 dev->num_irqs = 3;
1216 else
1217 dev->num_irqs = 1;
1218 dev->clk = clk;
1219 dev->pclk = pclk;
1220 dev->base = ioremap(qup_mem->start, resource_size(qup_mem));
1221 if (!dev->base) {
1222 ret = -ENOMEM;
1223 goto err_ioremap_failed;
1224 }
1225
1226 /* Configure GSBI block to use I2C functionality */
1227 if (gsbi_mem) {
1228 dev->gsbi = ioremap(gsbi_mem->start, resource_size(gsbi_mem));
1229 if (!dev->gsbi) {
1230 ret = -ENOMEM;
1231 goto err_gsbi_failed;
1232 }
1233 }
1234
1235 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
1236 res = platform_get_resource_byname(pdev, IORESOURCE_IO,
1237 i2c_rsrcs[i]);
1238 dev->i2c_gpios[i] = res ? res->start : -1;
1239 }
1240
1241 ret = qup_i2c_request_gpios(dev);
1242 if (ret)
1243 goto err_request_gpio_failed;
1244
1245 platform_set_drvdata(pdev, dev);
1246
Harini Jayaramand997b3b2011-10-11 14:25:29 -06001247 dev->one_bit_t = (USEC_PER_SEC/pdata->clk_freq) + 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001248 dev->pdata = pdata;
1249 dev->clk_ctl = 0;
1250 dev->pos = 0;
1251
1252 /*
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001253 * If bootloaders leave a pending interrupt on certain GSBI's,
1254 * then we reset the core before registering for interrupts.
1255 */
Harini Jayaramand59ee0a2012-04-06 10:43:44 -06001256
1257 if (dev->pdata->src_clk_rate > 0)
1258 clk_set_rate(dev->clk, dev->pdata->src_clk_rate);
1259 else
1260 dev->pdata->src_clk_rate = 19200000;
1261
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001262 clk_prepare_enable(dev->clk);
1263 clk_prepare_enable(dev->pclk);
1264 writel_relaxed(1, dev->base + QUP_SW_RESET);
1265 if (qup_i2c_poll_state(dev, 0, true) != 0)
1266 goto err_reset_failed;
1267 clk_disable_unprepare(dev->clk);
1268 clk_disable_unprepare(dev->pclk);
1269
1270 /*
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001271 * We use num_irqs to also indicate if we got 3 interrupts or just 1.
1272 * If we have just 1, we use err_irq as the general purpose irq
1273 * and handle the changes in ISR accordingly
1274 * Per Hardware guidelines, if we have 3 interrupts, they are always
1275 * edge triggering, and if we have 1, it's always level-triggering
1276 */
1277 if (dev->num_irqs == 3) {
1278 ret = request_irq(dev->in_irq, qup_i2c_interrupt,
1279 IRQF_TRIGGER_RISING, "qup_in_intr", dev);
1280 if (ret) {
1281 dev_err(&pdev->dev, "request_in_irq failed\n");
1282 goto err_request_irq_failed;
1283 }
1284 /*
1285 * We assume out_irq exists if in_irq does since platform
1286 * configuration either has 3 interrupts assigned to QUP or 1
1287 */
1288 ret = request_irq(dev->out_irq, qup_i2c_interrupt,
1289 IRQF_TRIGGER_RISING, "qup_out_intr", dev);
1290 if (ret) {
1291 dev_err(&pdev->dev, "request_out_irq failed\n");
1292 free_irq(dev->in_irq, dev);
1293 goto err_request_irq_failed;
1294 }
1295 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1296 IRQF_TRIGGER_RISING, "qup_err_intr", dev);
1297 if (ret) {
1298 dev_err(&pdev->dev, "request_err_irq failed\n");
1299 free_irq(dev->out_irq, dev);
1300 free_irq(dev->in_irq, dev);
1301 goto err_request_irq_failed;
1302 }
1303 } else {
1304 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1305 IRQF_TRIGGER_HIGH, "qup_err_intr", dev);
1306 if (ret) {
1307 dev_err(&pdev->dev, "request_err_irq failed\n");
1308 goto err_request_irq_failed;
1309 }
1310 }
1311 disable_irq(dev->err_irq);
1312 if (dev->num_irqs == 3) {
1313 disable_irq(dev->in_irq);
1314 disable_irq(dev->out_irq);
1315 }
1316 i2c_set_adapdata(&dev->adapter, dev);
1317 dev->adapter.algo = &qup_i2c_algo;
1318 strlcpy(dev->adapter.name,
1319 "QUP I2C adapter",
1320 sizeof(dev->adapter.name));
1321 dev->adapter.nr = pdev->id;
Harini Jayaramance67cf82011-08-05 09:26:06 -06001322 if (pdata->msm_i2c_config_gpio)
1323 pdata->msm_i2c_config_gpio(dev->adapter.nr, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001324
1325 dev->suspended = 0;
1326 mutex_init(&dev->mlock);
1327 dev->clk_state = 0;
Sagar Dharia75a57192012-02-12 20:47:32 -07001328 clk_prepare(dev->clk);
1329 clk_prepare(dev->pclk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301330 /* If the same AHB clock is used on Modem side
1331 * switch it on here itself and don't switch it
1332 * on and off during suspend and resume.
1333 */
1334 if (dev->pdata->keep_ahb_clk_on)
1335 clk_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001336 setup_timer(&dev->pwr_timer, qup_i2c_pwr_timer, (unsigned long) dev);
1337
1338 pm_runtime_set_active(&pdev->dev);
1339 pm_runtime_enable(&pdev->dev);
1340
1341 ret = i2c_add_numbered_adapter(&dev->adapter);
1342 if (ret) {
1343 dev_err(&pdev->dev, "i2c_add_adapter failed\n");
1344 if (dev->num_irqs == 3) {
1345 free_irq(dev->out_irq, dev);
1346 free_irq(dev->in_irq, dev);
1347 }
1348 free_irq(dev->err_irq, dev);
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001349 } else {
Amy Malochef8f1a462012-08-13 22:55:26 -07001350 if (dev->dev->of_node) {
1351 dev->adapter.dev.of_node = pdev->dev.of_node;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001352 of_i2c_register_devices(&dev->adapter);
Amy Malochef8f1a462012-08-13 22:55:26 -07001353 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001354 return 0;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001355 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001356
1357
1358err_request_irq_failed:
1359 qup_i2c_free_gpios(dev);
1360 if (dev->gsbi)
1361 iounmap(dev->gsbi);
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001362err_reset_failed:
1363 clk_disable_unprepare(dev->clk);
1364 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001365err_request_gpio_failed:
1366err_gsbi_failed:
1367 iounmap(dev->base);
1368err_ioremap_failed:
1369 kfree(dev);
1370err_alloc_dev_failed:
1371err_config_failed:
1372 clk_put(clk);
Matt Wagantallac294852011-08-17 15:44:58 -07001373 clk_put(pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001374err_clk_get_failed:
1375 if (gsbi_mem)
1376 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001377err_res_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001378 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001379get_res_failed:
1380 if (pdev->dev.of_node)
1381 kfree(pdata);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001382 return ret;
1383}
1384
1385static int __devexit
1386qup_i2c_remove(struct platform_device *pdev)
1387{
1388 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1389 struct resource *qup_mem, *gsbi_mem;
1390
1391 /* Grab mutex to ensure ongoing transaction is over */
1392 mutex_lock(&dev->mlock);
1393 dev->suspended = 1;
1394 mutex_unlock(&dev->mlock);
1395 mutex_destroy(&dev->mlock);
1396 del_timer_sync(&dev->pwr_timer);
1397 if (dev->clk_state != 0)
1398 qup_i2c_pwr_mgmt(dev, 0);
1399 platform_set_drvdata(pdev, NULL);
1400 if (dev->num_irqs == 3) {
1401 free_irq(dev->out_irq, dev);
1402 free_irq(dev->in_irq, dev);
1403 }
1404 free_irq(dev->err_irq, dev);
1405 i2c_del_adapter(&dev->adapter);
Sagar Dharia75a57192012-02-12 20:47:32 -07001406 clk_unprepare(dev->clk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301407 if (!dev->pdata->keep_ahb_clk_on) {
1408 clk_unprepare(dev->pclk);
1409 clk_put(dev->pclk);
1410 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001411 clk_put(dev->clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001412 qup_i2c_free_gpios(dev);
1413 if (dev->gsbi)
1414 iounmap(dev->gsbi);
1415 iounmap(dev->base);
1416
1417 pm_runtime_disable(&pdev->dev);
1418
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001419 if (!(dev->pdata->use_gsbi_shared_mode)) {
1420 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1421 "gsbi_qup_i2c_addr");
1422 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
1423 }
1424 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1425 "qup_phys_addr");
1426 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001427 if (dev->dev->of_node)
1428 kfree(dev->pdata);
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001429 kfree(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001430 return 0;
1431}
1432
1433#ifdef CONFIG_PM
1434static int qup_i2c_suspend(struct device *device)
1435{
1436 struct platform_device *pdev = to_platform_device(device);
1437 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1438
1439 /* Grab mutex to ensure ongoing transaction is over */
1440 mutex_lock(&dev->mlock);
1441 dev->suspended = 1;
1442 mutex_unlock(&dev->mlock);
1443 del_timer_sync(&dev->pwr_timer);
1444 if (dev->clk_state != 0)
1445 qup_i2c_pwr_mgmt(dev, 0);
Sagar Dharia75a57192012-02-12 20:47:32 -07001446 clk_unprepare(dev->clk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301447 if (!dev->pdata->keep_ahb_clk_on)
1448 clk_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001449 qup_i2c_free_gpios(dev);
1450 return 0;
1451}
1452
1453static int qup_i2c_resume(struct device *device)
1454{
1455 struct platform_device *pdev = to_platform_device(device);
1456 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1457 BUG_ON(qup_i2c_request_gpios(dev) != 0);
Sagar Dharia75a57192012-02-12 20:47:32 -07001458 clk_prepare(dev->clk);
Kiran Gunda9aa5e912012-08-16 18:37:46 +05301459 if (!dev->pdata->keep_ahb_clk_on)
1460 clk_prepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001461 dev->suspended = 0;
1462 return 0;
1463}
1464#endif /* CONFIG_PM */
1465
1466#ifdef CONFIG_PM_RUNTIME
1467static int i2c_qup_runtime_idle(struct device *dev)
1468{
1469 dev_dbg(dev, "pm_runtime: idle...\n");
1470 return 0;
1471}
1472
1473static int i2c_qup_runtime_suspend(struct device *dev)
1474{
1475 dev_dbg(dev, "pm_runtime: suspending...\n");
1476 return 0;
1477}
1478
1479static int i2c_qup_runtime_resume(struct device *dev)
1480{
1481 dev_dbg(dev, "pm_runtime: resuming...\n");
1482 return 0;
1483}
1484#endif
1485
1486static const struct dev_pm_ops i2c_qup_dev_pm_ops = {
1487 SET_SYSTEM_SLEEP_PM_OPS(
1488 qup_i2c_suspend,
1489 qup_i2c_resume
1490 )
1491 SET_RUNTIME_PM_OPS(
1492 i2c_qup_runtime_suspend,
1493 i2c_qup_runtime_resume,
1494 i2c_qup_runtime_idle
1495 )
1496};
1497
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001498static struct of_device_id i2c_qup_dt_match[] = {
1499 {
1500 .compatible = "qcom,i2c-qup",
1501 },
1502 {}
1503};
1504
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001505static struct platform_driver qup_i2c_driver = {
1506 .probe = qup_i2c_probe,
1507 .remove = __devexit_p(qup_i2c_remove),
1508 .driver = {
1509 .name = "qup_i2c",
1510 .owner = THIS_MODULE,
1511 .pm = &i2c_qup_dev_pm_ops,
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001512 .of_match_table = i2c_qup_dt_match,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001513 },
1514};
1515
1516/* QUP may be needed to bring up other drivers */
1517static int __init
1518qup_i2c_init_driver(void)
1519{
1520 return platform_driver_register(&qup_i2c_driver);
1521}
1522arch_initcall(qup_i2c_init_driver);
1523
1524static void __exit qup_i2c_exit_driver(void)
1525{
1526 platform_driver_unregister(&qup_i2c_driver);
1527}
1528module_exit(qup_i2c_exit_driver);
1529