blob: 7765830d523ec8fc12f500a445935d5d7a31e8d8 [file] [log] [blame]
Alok Chauhancf2ce972012-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
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530131#define DEFAULT_CLK_RATE (19200000)
132#define I2C_STATUS_CLK_STATE 13
133#define QUP_OUT_FIFO_NOT_EMPTY 0x10
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700134
135static char const * const i2c_rsrcs[] = {"i2c_clk", "i2c_sda"};
136
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700137static struct gpiomux_setting recovery_config = {
138 .func = GPIOMUX_FUNC_GPIO,
139 .drv = GPIOMUX_DRV_8MA,
140 .pull = GPIOMUX_PULL_NONE,
141};
142
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700143struct qup_i2c_dev {
144 struct device *dev;
145 void __iomem *base; /* virtual */
146 void __iomem *gsbi; /* virtual */
147 int in_irq;
148 int out_irq;
149 int err_irq;
150 int num_irqs;
151 struct clk *clk;
152 struct clk *pclk;
153 struct i2c_adapter adapter;
154
155 struct i2c_msg *msg;
156 int pos;
157 int cnt;
158 int err;
159 int mode;
160 int clk_ctl;
161 int one_bit_t;
162 int out_fifo_sz;
163 int in_fifo_sz;
164 int out_blk_sz;
165 int in_blk_sz;
166 int wr_sz;
167 struct msm_i2c_platform_data *pdata;
168 int suspended;
Alok Chauhanb5dd0b42012-12-17 12:32:14 +0530169 int pwr_state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700170 struct mutex mlock;
171 void *complete;
172 int i2c_gpios[ARRAY_SIZE(i2c_rsrcs)];
173};
174
175#ifdef DEBUG
176static void
177qup_print_status(struct qup_i2c_dev *dev)
178{
179 uint32_t val;
180 val = readl_relaxed(dev->base+QUP_CONFIG);
181 dev_dbg(dev->dev, "Qup config is :0x%x\n", val);
182 val = readl_relaxed(dev->base+QUP_STATE);
183 dev_dbg(dev->dev, "Qup state is :0x%x\n", val);
184 val = readl_relaxed(dev->base+QUP_IO_MODE);
185 dev_dbg(dev->dev, "Qup mode is :0x%x\n", val);
186}
187#else
188static inline void qup_print_status(struct qup_i2c_dev *dev)
189{
190}
191#endif
192
193static irqreturn_t
194qup_i2c_interrupt(int irq, void *devid)
195{
196 struct qup_i2c_dev *dev = devid;
197 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
198 uint32_t status1 = readl_relaxed(dev->base + QUP_ERROR_FLAGS);
199 uint32_t op_flgs = readl_relaxed(dev->base + QUP_OPERATIONAL);
200 int err = 0;
201
Alok Chauhancf2ce972012-11-19 21:53:12 +0530202 if (pm_runtime_suspended(dev->dev))
203 return IRQ_NONE;
204
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700205 if (!dev->msg || !dev->complete) {
206 /* Clear Error interrupt if it's a level triggered interrupt*/
207 if (dev->num_irqs == 1) {
208 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
209 /* Ensure that state is written before ISR exits */
210 mb();
211 }
212 return IRQ_HANDLED;
213 }
214
215 if (status & I2C_STATUS_ERROR_MASK) {
216 dev_err(dev->dev, "QUP: I2C status flags :0x%x, irq:%d\n",
217 status, irq);
218 err = status;
219 /* Clear Error interrupt if it's a level triggered interrupt*/
220 if (dev->num_irqs == 1) {
221 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
222 /* Ensure that state is written before ISR exits */
223 mb();
224 }
225 goto intr_done;
226 }
227
228 if (status1 & 0x7F) {
229 dev_err(dev->dev, "QUP: QUP status flags :0x%x\n", status1);
230 err = -status1;
231 /* Clear Error interrupt if it's a level triggered interrupt*/
232 if (dev->num_irqs == 1) {
233 writel_relaxed((status1 & QUP_STATUS_ERROR_FLAGS),
234 dev->base + QUP_ERROR_FLAGS);
235 /* Ensure that error flags are cleared before ISR
236 * exits
237 */
238 mb();
239 }
240 goto intr_done;
241 }
242
243 if ((dev->num_irqs == 3) && (dev->msg->flags == I2C_M_RD)
244 && (irq == dev->out_irq))
245 return IRQ_HANDLED;
246 if (op_flgs & QUP_OUT_SVC_FLAG) {
247 writel_relaxed(QUP_OUT_SVC_FLAG, dev->base + QUP_OPERATIONAL);
248 /* Ensure that service flag is acknowledged before ISR exits */
249 mb();
250 }
251 if (dev->msg->flags == I2C_M_RD) {
252 if ((op_flgs & QUP_MX_INPUT_DONE) ||
253 (op_flgs & QUP_IN_SVC_FLAG)) {
254 writel_relaxed(QUP_IN_SVC_FLAG, dev->base
255 + QUP_OPERATIONAL);
256 /* Ensure that service flag is acknowledged before ISR
257 * exits
258 */
259 mb();
260 } else
261 return IRQ_HANDLED;
262 }
263
264intr_done:
265 dev_dbg(dev->dev, "QUP intr= %d, i2c status=0x%x, qup status = 0x%x\n",
266 irq, status, status1);
267 qup_print_status(dev);
268 dev->err = err;
269 complete(dev->complete);
270 return IRQ_HANDLED;
271}
272
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600273static int
274qup_i2c_poll_state(struct qup_i2c_dev *dev, uint32_t req_state, bool only_valid)
275{
276 uint32_t retries = 0;
277
278 dev_dbg(dev->dev, "Polling for state:0x%x, or valid-only:%d\n",
279 req_state, only_valid);
280
281 while (retries != 2000) {
282 uint32_t status = readl_relaxed(dev->base + QUP_STATE);
283
284 /*
285 * If only valid bit needs to be checked, requested state is
286 * 'don't care'
287 */
288 if (status & QUP_STATE_VALID) {
289 if (only_valid)
290 return 0;
291 else if ((req_state & QUP_I2C_MAST_GEN) &&
292 (status & QUP_I2C_MAST_GEN))
293 return 0;
294 else if ((status & QUP_STATE_MASK) == req_state)
295 return 0;
296 }
297 if (retries++ == 1000)
298 udelay(100);
299 }
300 return -ETIMEDOUT;
301}
302
303static int
304qup_update_state(struct qup_i2c_dev *dev, uint32_t state)
305{
306 if (qup_i2c_poll_state(dev, 0, true) != 0)
307 return -EIO;
308 writel_relaxed(state, dev->base + QUP_STATE);
309 if (qup_i2c_poll_state(dev, state, false) != 0)
310 return -EIO;
311 return 0;
312}
313
Trilok Sonif0274f12011-08-19 12:26:13 +0530314/*
315 * Before calling qup_config_core_on_en(), please make
316 * sure that QuPE core is in RESET state.
Trilok Sonif0274f12011-08-19 12:26:13 +0530317 */
318static void
319qup_config_core_on_en(struct qup_i2c_dev *dev)
320{
321 uint32_t status;
322
Trilok Sonif0274f12011-08-19 12:26:13 +0530323 status = readl_relaxed(dev->base + QUP_CONFIG);
324 status |= BIT(13);
325 writel_relaxed(status, dev->base + QUP_CONFIG);
326 /* making sure that write has really gone through */
327 mb();
328}
329
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700330static void
331qup_i2c_pwr_mgmt(struct qup_i2c_dev *dev, unsigned int state)
332{
Alok Chauhanb5dd0b42012-12-17 12:32:14 +0530333 dev->pwr_state = state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700334 if (state != 0) {
Alok Chauhancf2ce972012-11-19 21:53:12 +0530335 clk_prepare_enable(dev->clk);
Kiran Gundab4696c72012-08-16 18:37:46 +0530336 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhancf2ce972012-11-19 21:53:12 +0530337 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700338 } else {
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600339 qup_update_state(dev, QUP_RESET_STATE);
Alok Chauhancf2ce972012-11-19 21:53:12 +0530340 clk_disable_unprepare(dev->clk);
Trilok Sonif0274f12011-08-19 12:26:13 +0530341 qup_config_core_on_en(dev);
Kiran Gundab4696c72012-08-16 18:37:46 +0530342 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhancf2ce972012-11-19 21:53:12 +0530343 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700344 }
345}
346
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700347static int
348qup_i2c_poll_writeready(struct qup_i2c_dev *dev, int rem)
349{
350 uint32_t retries = 0;
351
352 while (retries != 2000) {
353 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
354
355 if (!(status & I2C_STATUS_WR_BUFFER_FULL)) {
356 if (((dev->msg->flags & I2C_M_RD) || (rem == 0)) &&
357 !(status & I2C_STATUS_BUS_ACTIVE))
358 return 0;
359 else if ((dev->msg->flags == 0) && (rem > 0))
360 return 0;
361 else /* 1-bit delay before we check for bus busy */
362 udelay(dev->one_bit_t);
363 }
Harini Jayaramand997b3b2011-10-11 14:25:29 -0600364 if (retries++ == 1000) {
365 /*
366 * Wait for FIFO number of bytes to be absolutely sure
367 * that I2C write state machine is not idle. Each byte
368 * takes 9 clock cycles. (8 bits + 1 ack)
369 */
370 usleep_range((dev->one_bit_t * (dev->out_fifo_sz * 9)),
371 (dev->one_bit_t * (dev->out_fifo_sz * 9)));
372 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700373 }
374 qup_print_status(dev);
375 return -ETIMEDOUT;
376}
377
378static int qup_i2c_poll_clock_ready(struct qup_i2c_dev *dev)
379{
380 uint32_t retries = 0;
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530381 uint32_t op_flgs = -1, clk_state = -1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700382
383 /*
384 * Wait for the clock state to transition to either IDLE or FORCED
385 * LOW. This will usually happen within one cycle of the i2c clock.
386 */
387
388 while (retries++ < QUP_MAX_CLK_STATE_RETRIES) {
389 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530390 clk_state = (status >> I2C_STATUS_CLK_STATE) & 0x7;
391 /* Read the operational register */
392 op_flgs = readl_relaxed(dev->base +
393 QUP_OPERATIONAL) & QUP_OUT_FIFO_NOT_EMPTY;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700394
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530395 /*
396 * In very corner case when slave do clock stretching and
397 * output fifo will have 1 block of data space empty at
398 * the same time. So i2c qup will get output service
399 * interrupt and as it doesn't have more data to be written.
400 * This can lead to issue where output fifo is not empty.
401 */
402 if (op_flgs == 0 &&
403 (clk_state == I2C_CLK_RESET_BUSIDLE_STATE ||
404 clk_state == I2C_CLK_FORCED_LOW_STATE)){
405 dev_dbg(dev->dev, "clk_state 0x%x op_flgs [%x]\n",
406 clk_state, op_flgs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700407 return 0;
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530408 }
409
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700410 /* 1-bit delay before we check again */
411 udelay(dev->one_bit_t);
412 }
413
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530414 dev_err(dev->dev, "Error waiting for clk ready clk_state: 0x%x op_flgs: 0x%x\n",
415 clk_state, op_flgs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700416 return -ETIMEDOUT;
417}
418
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700419static inline int qup_i2c_request_gpios(struct qup_i2c_dev *dev)
420{
421 int i;
422 int result = 0;
423
424 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
425 if (dev->i2c_gpios[i] >= 0) {
426 result = gpio_request(dev->i2c_gpios[i], i2c_rsrcs[i]);
427 if (result) {
428 dev_err(dev->dev,
429 "gpio_request for pin %d failed\
430 with error %d\n", dev->i2c_gpios[i],
431 result);
432 goto error;
433 }
434 }
435 }
436 return 0;
437
438error:
439 for (; --i >= 0;) {
440 if (dev->i2c_gpios[i] >= 0)
441 gpio_free(dev->i2c_gpios[i]);
442 }
443 return result;
444}
445
446static inline void qup_i2c_free_gpios(struct qup_i2c_dev *dev)
447{
448 int i;
449
450 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
451 if (dev->i2c_gpios[i] >= 0)
452 gpio_free(dev->i2c_gpios[i]);
453 }
454}
455
456#ifdef DEBUG
457static void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
458 uint32_t addr, int rdwr)
459{
460 if (rdwr)
461 dev_dbg(dev->dev, "RD:Wrote 0x%x to out_ff:0x%x\n", val, addr);
462 else
463 dev_dbg(dev->dev, "WR:Wrote 0x%x to out_ff:0x%x\n", val, addr);
464}
465#else
466static inline void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
467 uint32_t addr, int rdwr)
468{
469}
470#endif
471
472static void
473qup_issue_read(struct qup_i2c_dev *dev, struct i2c_msg *msg, int *idx,
474 uint32_t carry_over)
475{
476 uint16_t addr = (msg->addr << 1) | 1;
477 /* QUP limit 256 bytes per read. By HW design, 0 in the 8-bit field
478 * is treated as 256 byte read.
479 */
480 uint16_t rd_len = ((dev->cnt == 256) ? 0 : dev->cnt);
481
482 if (*idx % 4) {
483 writel_relaxed(carry_over | ((QUP_OUT_START | addr) << 16),
484 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx-2)); */
485
486 qup_verify_fifo(dev, carry_over |
487 ((QUP_OUT_START | addr) << 16), (uint32_t)dev->base
488 + QUP_OUT_FIFO_BASE + (*idx - 2), 1);
489 writel_relaxed((QUP_OUT_REC | rd_len),
490 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx+2)); */
491
492 qup_verify_fifo(dev, (QUP_OUT_REC | rd_len),
493 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx + 2), 1);
494 } else {
495 writel_relaxed(((QUP_OUT_REC | rd_len) << 16)
496 | QUP_OUT_START | addr,
497 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx)); */
498
499 qup_verify_fifo(dev, QUP_OUT_REC << 16 | rd_len << 16 |
500 QUP_OUT_START | addr,
501 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx), 1);
502 }
503 *idx += 4;
504}
505
506static void
507qup_issue_write(struct qup_i2c_dev *dev, struct i2c_msg *msg, int rem,
508 int *idx, uint32_t *carry_over)
509{
510 int entries = dev->cnt;
511 int empty_sl = dev->wr_sz - ((*idx) >> 1);
512 int i = 0;
513 uint32_t val = 0;
514 uint32_t last_entry = 0;
515 uint16_t addr = msg->addr << 1;
516
517 if (dev->pos == 0) {
518 if (*idx % 4) {
519 writel_relaxed(*carry_over | ((QUP_OUT_START |
520 addr) << 16),
521 dev->base + QUP_OUT_FIFO_BASE);
522
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600523 qup_verify_fifo(dev, *carry_over | QUP_OUT_START << 16 |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700524 addr << 16, (uint32_t)dev->base +
525 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
526 } else
527 val = QUP_OUT_START | addr;
528 *idx += 2;
529 i++;
530 entries++;
531 } else {
532 /* Avoid setp time issue by adding 1 NOP when number of bytes
533 * are more than FIFO/BLOCK size. setup time issue can't appear
534 * otherwise since next byte to be written will always be ready
535 */
536 val = (QUP_OUT_NOP | 1);
537 *idx += 2;
538 i++;
539 entries++;
540 }
541 if (entries > empty_sl)
542 entries = empty_sl;
543
544 for (; i < (entries - 1); i++) {
545 if (*idx % 4) {
546 writel_relaxed(val | ((QUP_OUT_DATA |
547 msg->buf[dev->pos]) << 16),
548 dev->base + QUP_OUT_FIFO_BASE);
549
550 qup_verify_fifo(dev, val | QUP_OUT_DATA << 16 |
551 msg->buf[dev->pos] << 16, (uint32_t)dev->base +
552 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
553 } else
554 val = QUP_OUT_DATA | msg->buf[dev->pos];
555 (*idx) += 2;
556 dev->pos++;
557 }
558 if (dev->pos < (msg->len - 1))
559 last_entry = QUP_OUT_DATA;
560 else if (rem > 1) /* not last array entry */
561 last_entry = QUP_OUT_DATA;
562 else
563 last_entry = QUP_OUT_STOP;
564 if ((*idx % 4) == 0) {
565 /*
566 * If read-start and read-command end up in different fifos, it
567 * may result in extra-byte being read due to extra-read cycle.
568 * Avoid that by inserting NOP as the last entry of fifo only
569 * if write command(s) leave 1 space in fifo.
570 */
571 if (rem > 1) {
572 struct i2c_msg *next = msg + 1;
Harini Jayaraman24bea432011-10-11 16:06:28 -0600573 if (next->addr == msg->addr && (next->flags & I2C_M_RD)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700574 && *idx == ((dev->wr_sz*2) - 4)) {
575 writel_relaxed(((last_entry |
576 msg->buf[dev->pos]) |
577 ((1 | QUP_OUT_NOP) << 16)), dev->base +
578 QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
579
580 qup_verify_fifo(dev,
581 ((last_entry | msg->buf[dev->pos]) |
582 ((1 | QUP_OUT_NOP) << 16)),
583 (uint32_t)dev->base +
584 QUP_OUT_FIFO_BASE + (*idx), 0);
585 *idx += 2;
586 } else if (next->flags == 0 && dev->pos == msg->len - 1
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600587 && *idx < (dev->wr_sz*2) &&
588 (next->addr != msg->addr)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700589 /* Last byte of an intermittent write */
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600590 writel_relaxed((QUP_OUT_STOP |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700591 msg->buf[dev->pos]),
592 dev->base + QUP_OUT_FIFO_BASE);
593
594 qup_verify_fifo(dev,
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600595 QUP_OUT_STOP | msg->buf[dev->pos],
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700596 (uint32_t)dev->base +
597 QUP_OUT_FIFO_BASE + (*idx), 0);
598 *idx += 2;
599 } else
600 *carry_over = (last_entry | msg->buf[dev->pos]);
601 } else {
602 writel_relaxed((last_entry | msg->buf[dev->pos]),
603 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
604
605 qup_verify_fifo(dev, last_entry | msg->buf[dev->pos],
606 (uint32_t)dev->base + QUP_OUT_FIFO_BASE +
607 (*idx), 0);
608 }
609 } else {
610 writel_relaxed(val | ((last_entry | msg->buf[dev->pos]) << 16),
611 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
612
613 qup_verify_fifo(dev, val | (last_entry << 16) |
614 (msg->buf[dev->pos] << 16), (uint32_t)dev->base +
615 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
616 }
617
618 *idx += 2;
619 dev->pos++;
620 dev->cnt = msg->len - dev->pos;
621}
622
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700623static void
624qup_set_read_mode(struct qup_i2c_dev *dev, int rd_len)
625{
626 uint32_t wr_mode = (dev->wr_sz < dev->out_fifo_sz) ?
627 QUP_WR_BLK_MODE : 0;
628 if (rd_len > 256) {
629 dev_dbg(dev->dev, "HW limit: Breaking reads in chunk of 256\n");
630 rd_len = 256;
631 }
632 if (rd_len <= dev->in_fifo_sz) {
633 writel_relaxed(wr_mode | QUP_PACK_EN | QUP_UNPACK_EN,
634 dev->base + QUP_IO_MODE);
635 writel_relaxed(rd_len, dev->base + QUP_MX_READ_CNT);
636 } else {
637 writel_relaxed(wr_mode | QUP_RD_BLK_MODE |
638 QUP_PACK_EN | QUP_UNPACK_EN, dev->base + QUP_IO_MODE);
639 writel_relaxed(rd_len, dev->base + QUP_MX_INPUT_CNT);
640 }
641}
642
643static int
644qup_set_wr_mode(struct qup_i2c_dev *dev, int rem)
645{
646 int total_len = 0;
647 int ret = 0;
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600648 int len = dev->msg->len;
649 struct i2c_msg *next = NULL;
650 if (rem > 1)
651 next = dev->msg + 1;
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600652 while (rem > 1 && next->flags == 0 && (next->addr == dev->msg->addr)) {
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600653 len += next->len + 1;
654 next = next + 1;
655 rem--;
656 }
657 if (len >= (dev->out_fifo_sz - 1)) {
658 total_len = len + 1 + (len/(dev->out_blk_sz-1));
659
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700660 writel_relaxed(QUP_WR_BLK_MODE | QUP_PACK_EN | QUP_UNPACK_EN,
661 dev->base + QUP_IO_MODE);
662 dev->wr_sz = dev->out_blk_sz;
663 } else
664 writel_relaxed(QUP_PACK_EN | QUP_UNPACK_EN,
665 dev->base + QUP_IO_MODE);
666
667 if (rem > 1) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700668 if (next->addr == dev->msg->addr &&
669 next->flags == I2C_M_RD) {
670 qup_set_read_mode(dev, next->len);
671 /* make sure read start & read command are in 1 blk */
672 if ((total_len % dev->out_blk_sz) ==
673 (dev->out_blk_sz - 1))
674 total_len += 3;
675 else
676 total_len += 2;
677 }
678 }
679 /* WRITE COUNT register valid/used only in block mode */
680 if (dev->wr_sz == dev->out_blk_sz)
681 writel_relaxed(total_len, dev->base + QUP_MX_WR_CNT);
682 return ret;
683}
684
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700685
686static void qup_i2c_recover_bus_busy(struct qup_i2c_dev *dev)
687{
688 int i;
689 int gpio_clk;
690 int gpio_dat;
691 bool gpio_clk_status = false;
692 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
693 struct gpiomux_setting old_gpio_setting;
694
695 if (dev->pdata->msm_i2c_config_gpio)
696 return;
697
698 if (!(status & (I2C_STATUS_BUS_ACTIVE)) ||
699 (status & (I2C_STATUS_BUS_MASTER)))
700 return;
701
702 gpio_clk = dev->i2c_gpios[0];
703 gpio_dat = dev->i2c_gpios[1];
704
705 if ((gpio_clk == -1) && (gpio_dat == -1)) {
706 dev_err(dev->dev, "Recovery failed due to undefined GPIO's\n");
707 return;
708 }
709
710 disable_irq(dev->err_irq);
711 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
712 if (msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
713 &recovery_config, &old_gpio_setting)) {
714 dev_err(dev->dev, "GPIO pins have no active setting\n");
715 goto recovery_end;
716 }
717 }
718
719 dev_warn(dev->dev, "i2c_scl: %d, i2c_sda: %d\n",
720 gpio_get_value(gpio_clk), gpio_get_value(gpio_dat));
721
722 for (i = 0; i < 9; i++) {
723 if (gpio_get_value(gpio_dat) && gpio_clk_status)
724 break;
725 gpio_direction_output(gpio_clk, 0);
726 udelay(5);
727 gpio_direction_output(gpio_dat, 0);
728 udelay(5);
729 gpio_direction_input(gpio_clk);
730 udelay(5);
731 if (!gpio_get_value(gpio_clk))
732 udelay(20);
733 if (!gpio_get_value(gpio_clk))
734 usleep_range(10000, 10000);
735 gpio_clk_status = gpio_get_value(gpio_clk);
736 gpio_direction_input(gpio_dat);
737 udelay(5);
738 }
739
740 /* Configure ALT funciton to QUP I2C*/
741 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
742 msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
743 &old_gpio_setting, NULL);
744 }
745
746 udelay(10);
747
748 status = readl_relaxed(dev->base + QUP_I2C_STATUS);
749 if (!(status & I2C_STATUS_BUS_ACTIVE)) {
750 dev_info(dev->dev, "Bus busy cleared after %d clock cycles, "
751 "status %x\n",
752 i, status);
753 goto recovery_end;
754 }
755
756 dev_warn(dev->dev, "Bus still busy, status %x\n", status);
757
758recovery_end:
759 enable_irq(dev->err_irq);
760}
761
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700762static int
763qup_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
764{
765 DECLARE_COMPLETION_ONSTACK(complete);
766 struct qup_i2c_dev *dev = i2c_get_adapdata(adap);
767 int ret;
768 int rem = num;
769 long timeout;
770 int err;
771
Alok Chauhancf2ce972012-11-19 21:53:12 +0530772 pm_runtime_get_sync(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700773 mutex_lock(&dev->mlock);
774
775 if (dev->suspended) {
776 mutex_unlock(&dev->mlock);
777 return -EIO;
778 }
779
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700780 /* Initialize QUP registers during first transfer */
781 if (dev->clk_ctl == 0) {
782 int fs_div;
783 int hs_div;
784 uint32_t fifo_reg;
785
786 if (dev->gsbi) {
787 writel_relaxed(0x2 << 4, dev->gsbi);
788 /* GSBI memory is not in the same 1K region as other
789 * QUP registers. mb() here ensures that the GSBI
790 * register is updated in correct order and that the
791 * write has gone through before programming QUP core
792 * registers
793 */
794 mb();
795 }
796
797 fs_div = ((dev->pdata->src_clk_rate
798 / dev->pdata->clk_freq) / 2) - 3;
799 hs_div = 3;
800 dev->clk_ctl = ((hs_div & 0x7) << 8) | (fs_div & 0xff);
801 fifo_reg = readl_relaxed(dev->base + QUP_IO_MODE);
802 if (fifo_reg & 0x3)
803 dev->out_blk_sz = (fifo_reg & 0x3) * 16;
804 else
805 dev->out_blk_sz = 16;
806 if (fifo_reg & 0x60)
807 dev->in_blk_sz = ((fifo_reg & 0x60) >> 5) * 16;
808 else
809 dev->in_blk_sz = 16;
810 /*
811 * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag'
812 * associated with each byte written/received
813 */
814 dev->out_blk_sz /= 2;
815 dev->in_blk_sz /= 2;
816 dev->out_fifo_sz = dev->out_blk_sz *
817 (2 << ((fifo_reg & 0x1C) >> 2));
818 dev->in_fifo_sz = dev->in_blk_sz *
819 (2 << ((fifo_reg & 0x380) >> 7));
820 dev_dbg(dev->dev, "QUP IN:bl:%d, ff:%d, OUT:bl:%d, ff:%d\n",
821 dev->in_blk_sz, dev->in_fifo_sz,
822 dev->out_blk_sz, dev->out_fifo_sz);
823 }
824
825 writel_relaxed(1, dev->base + QUP_SW_RESET);
Sagar Dharia518e2302011-08-05 11:03:03 -0600826 ret = qup_i2c_poll_state(dev, QUP_RESET_STATE, false);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700827 if (ret) {
828 dev_err(dev->dev, "QUP Busy:Trying to recover\n");
829 goto out_err;
830 }
831
832 if (dev->num_irqs == 3) {
833 enable_irq(dev->in_irq);
834 enable_irq(dev->out_irq);
835 }
836 enable_irq(dev->err_irq);
837
838 /* Initialize QUP registers */
839 writel_relaxed(0, dev->base + QUP_CONFIG);
840 writel_relaxed(QUP_OPERATIONAL_RESET, dev->base + QUP_OPERATIONAL);
841 writel_relaxed(QUP_STATUS_ERROR_FLAGS, dev->base + QUP_ERROR_FLAGS_EN);
842
843 writel_relaxed(I2C_MINI_CORE | I2C_N_VAL, dev->base + QUP_CONFIG);
844
845 /* Initialize I2C mini core registers */
846 writel_relaxed(0, dev->base + QUP_I2C_CLK_CTL);
847 writel_relaxed(QUP_I2C_STATUS_RESET, dev->base + QUP_I2C_STATUS);
848
849 while (rem) {
850 bool filled = false;
851
852 dev->cnt = msgs->len - dev->pos;
853 dev->msg = msgs;
854
855 dev->wr_sz = dev->out_fifo_sz;
856 dev->err = 0;
857 dev->complete = &complete;
858
Sagar Dharia518e2302011-08-05 11:03:03 -0600859 if (qup_i2c_poll_state(dev, QUP_I2C_MAST_GEN, false) != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700860 ret = -EIO;
861 goto out_err;
862 }
863
864 qup_print_status(dev);
865 /* HW limits Read upto 256 bytes in 1 read without stop */
866 if (dev->msg->flags & I2C_M_RD) {
867 qup_set_read_mode(dev, dev->cnt);
868 if (dev->cnt > 256)
869 dev->cnt = 256;
870 } else {
871 ret = qup_set_wr_mode(dev, rem);
872 if (ret != 0)
873 goto out_err;
874 /* Don't fill block till we get interrupt */
875 if (dev->wr_sz == dev->out_blk_sz)
876 filled = true;
877 }
878
879 err = qup_update_state(dev, QUP_RUN_STATE);
880 if (err < 0) {
881 ret = err;
882 goto out_err;
883 }
884
885 qup_print_status(dev);
886 writel_relaxed(dev->clk_ctl, dev->base + QUP_I2C_CLK_CTL);
887 /* CLK_CTL register is not in the same 1K region as other QUP
888 * registers. Ensure that clock control is written before
889 * programming other QUP registers
890 */
891 mb();
892
893 do {
894 int idx = 0;
895 uint32_t carry_over = 0;
896
897 /* Transition to PAUSE state only possible from RUN */
898 err = qup_update_state(dev, QUP_PAUSE_STATE);
899 if (err < 0) {
900 ret = err;
901 goto out_err;
902 }
903
904 qup_print_status(dev);
905 /* This operation is Write, check the next operation
906 * and decide mode
907 */
908 while (filled == false) {
909 if ((msgs->flags & I2C_M_RD))
910 qup_issue_read(dev, msgs, &idx,
911 carry_over);
912 else if (!(msgs->flags & I2C_M_RD))
913 qup_issue_write(dev, msgs, rem, &idx,
914 &carry_over);
915 if (idx >= (dev->wr_sz << 1))
916 filled = true;
917 /* Start new message */
918 if (filled == false) {
919 if (msgs->flags & I2C_M_RD)
920 filled = true;
921 else if (rem > 1) {
922 /* Only combine operations with
923 * same address
924 */
925 struct i2c_msg *next = msgs + 1;
926 if (next->addr != msgs->addr)
927 filled = true;
928 else {
929 rem--;
930 msgs++;
931 dev->msg = msgs;
932 dev->pos = 0;
933 dev->cnt = msgs->len;
934 if (msgs->len > 256)
935 dev->cnt = 256;
936 }
937 } else
938 filled = true;
939 }
940 }
941 err = qup_update_state(dev, QUP_RUN_STATE);
942 if (err < 0) {
943 ret = err;
944 goto out_err;
945 }
946 dev_dbg(dev->dev, "idx:%d, rem:%d, num:%d, mode:%d\n",
947 idx, rem, num, dev->mode);
948
949 qup_print_status(dev);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700950 timeout = wait_for_completion_timeout(&complete,
951 msecs_to_jiffies(dev->out_fifo_sz));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700952 if (!timeout) {
953 uint32_t istatus = readl_relaxed(dev->base +
954 QUP_I2C_STATUS);
955 uint32_t qstatus = readl_relaxed(dev->base +
956 QUP_ERROR_FLAGS);
957 uint32_t op_flgs = readl_relaxed(dev->base +
958 QUP_OPERATIONAL);
959
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700960 /*
961 * Dont wait for 1 sec if i2c sees the bus
962 * active and controller is not master.
963 * A slave has pulled line low. Try to recover
964 */
965 if (!(istatus & I2C_STATUS_BUS_ACTIVE) ||
966 (istatus & I2C_STATUS_BUS_MASTER)) {
967 timeout =
968 wait_for_completion_timeout(&complete,
969 HZ);
970 if (timeout)
971 goto timeout_err;
972 }
973 qup_i2c_recover_bus_busy(dev);
974 dev_err(dev->dev,
975 "Transaction timed out, SL-AD = 0x%x\n",
976 dev->msg->addr);
977
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700978 dev_err(dev->dev, "I2C Status: %x\n", istatus);
979 dev_err(dev->dev, "QUP Status: %x\n", qstatus);
980 dev_err(dev->dev, "OP Flags: %x\n", op_flgs);
981 writel_relaxed(1, dev->base + QUP_SW_RESET);
982 /* Make sure that the write has gone through
983 * before returning from the function
984 */
985 mb();
986 ret = -ETIMEDOUT;
987 goto out_err;
988 }
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700989timeout_err:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700990 if (dev->err) {
991 if (dev->err > 0 &&
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700992 dev->err & QUP_I2C_NACK_FLAG) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700993 dev_err(dev->dev,
994 "I2C slave addr:0x%x not connected\n",
995 dev->msg->addr);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700996 dev->err = ENOTCONN;
997 } else if (dev->err < 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700998 dev_err(dev->dev,
999 "QUP data xfer error %d\n", dev->err);
1000 ret = dev->err;
1001 goto out_err;
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -07001002 } else if (dev->err > 0) {
1003 /*
1004 * ISR returns +ve error if error code
1005 * is I2C related, e.g. unexpected start
1006 * So you may call recover-bus-busy when
1007 * this error happens
1008 */
1009 qup_i2c_recover_bus_busy(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001010 }
1011 ret = -dev->err;
1012 goto out_err;
1013 }
1014 if (dev->msg->flags & I2C_M_RD) {
1015 int i;
1016 uint32_t dval = 0;
1017 for (i = 0; dev->pos < dev->msg->len; i++,
1018 dev->pos++) {
1019 uint32_t rd_status =
1020 readl_relaxed(dev->base
1021 + QUP_OPERATIONAL);
1022 if (i % 2 == 0) {
1023 if ((rd_status &
1024 QUP_IN_NOT_EMPTY) == 0)
1025 break;
1026 dval = readl_relaxed(dev->base +
1027 QUP_IN_FIFO_BASE);
1028 dev->msg->buf[dev->pos] =
1029 dval & 0xFF;
1030 } else
1031 dev->msg->buf[dev->pos] =
1032 ((dval & 0xFF0000) >>
1033 16);
1034 }
1035 dev->cnt -= i;
1036 } else
1037 filled = false; /* refill output FIFO */
1038 dev_dbg(dev->dev, "pos:%d, len:%d, cnt:%d\n",
1039 dev->pos, msgs->len, dev->cnt);
1040 } while (dev->cnt > 0);
1041 if (dev->cnt == 0) {
1042 if (msgs->len == dev->pos) {
1043 rem--;
1044 msgs++;
1045 dev->pos = 0;
1046 }
1047 if (rem) {
1048 err = qup_i2c_poll_clock_ready(dev);
1049 if (err < 0) {
1050 ret = err;
1051 goto out_err;
1052 }
1053 err = qup_update_state(dev, QUP_RESET_STATE);
1054 if (err < 0) {
1055 ret = err;
1056 goto out_err;
1057 }
1058 }
1059 }
1060 /* Wait for I2C bus to be idle */
1061 ret = qup_i2c_poll_writeready(dev, rem);
1062 if (ret) {
1063 dev_err(dev->dev,
1064 "Error waiting for write ready\n");
1065 goto out_err;
1066 }
1067 }
1068
1069 ret = num;
1070 out_err:
1071 disable_irq(dev->err_irq);
1072 if (dev->num_irqs == 3) {
1073 disable_irq(dev->in_irq);
1074 disable_irq(dev->out_irq);
1075 }
1076 dev->complete = NULL;
1077 dev->msg = NULL;
1078 dev->pos = 0;
1079 dev->err = 0;
1080 dev->cnt = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001081 mutex_unlock(&dev->mlock);
Alok Chauhancf2ce972012-11-19 21:53:12 +05301082 pm_runtime_mark_last_busy(dev->dev);
1083 pm_runtime_put_autosuspend(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001084 return ret;
1085}
1086
1087static u32
1088qup_i2c_func(struct i2c_adapter *adap)
1089{
1090 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
1091}
1092
1093static const struct i2c_algorithm qup_i2c_algo = {
1094 .master_xfer = qup_i2c_xfer,
1095 .functionality = qup_i2c_func,
1096};
1097
1098static int __devinit
1099qup_i2c_probe(struct platform_device *pdev)
1100{
1101 struct qup_i2c_dev *dev;
1102 struct resource *qup_mem, *gsbi_mem, *qup_io, *gsbi_io, *res;
1103 struct resource *in_irq, *out_irq, *err_irq;
1104 struct clk *clk, *pclk;
1105 int ret = 0;
1106 int i;
1107 struct msm_i2c_platform_data *pdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001108
1109 gsbi_mem = NULL;
1110 dev_dbg(&pdev->dev, "qup_i2c_probe\n");
1111
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001112 if (pdev->dev.of_node) {
1113 struct device_node *node = pdev->dev.of_node;
1114 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
1115 if (!pdata)
1116 return -ENOMEM;
1117 ret = of_property_read_u32(node, "qcom,i2c-bus-freq",
1118 &pdata->clk_freq);
1119 if (ret)
1120 goto get_res_failed;
1121 ret = of_property_read_u32(node, "cell-index", &pdev->id);
1122 if (ret)
1123 goto get_res_failed;
1124 /* Optional property */
1125 of_property_read_u32(node, "qcom,i2c-src-freq",
1126 &pdata->src_clk_rate);
1127 } else
1128 pdata = pdev->dev.platform_data;
1129
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001130 if (!pdata) {
1131 dev_err(&pdev->dev, "platform data not initialized\n");
1132 return -ENOSYS;
1133 }
1134 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1135 "qup_phys_addr");
1136 if (!qup_mem) {
1137 dev_err(&pdev->dev, "no qup mem resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001138 ret = -ENODEV;
1139 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001140 }
1141
1142 /*
1143 * We only have 1 interrupt for new hardware targets and in_irq,
1144 * out_irq will be NULL for those platforms
1145 */
1146 in_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1147 "qup_in_intr");
1148
1149 out_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1150 "qup_out_intr");
1151
1152 err_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1153 "qup_err_intr");
1154 if (!err_irq) {
1155 dev_err(&pdev->dev, "no error irq resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001156 ret = -ENODEV;
1157 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001158 }
1159
1160 qup_io = request_mem_region(qup_mem->start, resource_size(qup_mem),
1161 pdev->name);
1162 if (!qup_io) {
1163 dev_err(&pdev->dev, "QUP region already claimed\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001164 ret = -EBUSY;
1165 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001166 }
1167 if (!pdata->use_gsbi_shared_mode) {
1168 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1169 "gsbi_qup_i2c_addr");
1170 if (!gsbi_mem) {
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001171 dev_dbg(&pdev->dev, "Assume BLSP\n");
1172 /*
1173 * BLSP core does not need protocol programming so this
1174 * resource is not expected
1175 */
1176 goto blsp_core_init;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001177 }
1178 gsbi_io = request_mem_region(gsbi_mem->start,
1179 resource_size(gsbi_mem),
1180 pdev->name);
1181 if (!gsbi_io) {
1182 dev_err(&pdev->dev, "GSBI region already claimed\n");
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001183 ret = -EBUSY;
1184 goto err_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001185 }
1186 }
1187
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001188blsp_core_init:
Matt Wagantallac294852011-08-17 15:44:58 -07001189 clk = clk_get(&pdev->dev, "core_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001190 if (IS_ERR(clk)) {
Matt Wagantallac294852011-08-17 15:44:58 -07001191 dev_err(&pdev->dev, "Could not get core_clk\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001192 ret = PTR_ERR(clk);
1193 goto err_clk_get_failed;
1194 }
1195
Matt Wagantallac294852011-08-17 15:44:58 -07001196 pclk = clk_get(&pdev->dev, "iface_clk");
1197 if (IS_ERR(pclk)) {
1198 dev_err(&pdev->dev, "Could not get iface_clk\n");
1199 ret = PTR_ERR(pclk);
1200 clk_put(clk);
1201 goto err_clk_get_failed;
1202 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001203
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001204 /* We support frequencies upto FAST Mode(400KHz) */
1205 if (pdata->clk_freq <= 0 ||
1206 pdata->clk_freq > 400000) {
1207 dev_err(&pdev->dev, "clock frequency not supported\n");
1208 ret = -EIO;
1209 goto err_config_failed;
1210 }
1211
1212 dev = kzalloc(sizeof(struct qup_i2c_dev), GFP_KERNEL);
1213 if (!dev) {
1214 ret = -ENOMEM;
1215 goto err_alloc_dev_failed;
1216 }
1217
1218 dev->dev = &pdev->dev;
1219 if (in_irq)
1220 dev->in_irq = in_irq->start;
1221 if (out_irq)
1222 dev->out_irq = out_irq->start;
1223 dev->err_irq = err_irq->start;
1224 if (in_irq && out_irq)
1225 dev->num_irqs = 3;
1226 else
1227 dev->num_irqs = 1;
1228 dev->clk = clk;
1229 dev->pclk = pclk;
1230 dev->base = ioremap(qup_mem->start, resource_size(qup_mem));
1231 if (!dev->base) {
1232 ret = -ENOMEM;
1233 goto err_ioremap_failed;
1234 }
1235
1236 /* Configure GSBI block to use I2C functionality */
1237 if (gsbi_mem) {
1238 dev->gsbi = ioremap(gsbi_mem->start, resource_size(gsbi_mem));
1239 if (!dev->gsbi) {
1240 ret = -ENOMEM;
1241 goto err_gsbi_failed;
1242 }
1243 }
1244
1245 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
1246 res = platform_get_resource_byname(pdev, IORESOURCE_IO,
1247 i2c_rsrcs[i]);
1248 dev->i2c_gpios[i] = res ? res->start : -1;
1249 }
1250
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001251 platform_set_drvdata(pdev, dev);
1252
Harini Jayaramand997b3b2011-10-11 14:25:29 -06001253 dev->one_bit_t = (USEC_PER_SEC/pdata->clk_freq) + 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001254 dev->pdata = pdata;
1255 dev->clk_ctl = 0;
1256 dev->pos = 0;
1257
1258 /*
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001259 * If bootloaders leave a pending interrupt on certain GSBI's,
1260 * then we reset the core before registering for interrupts.
1261 */
Harini Jayaramand59ee0a2012-04-06 10:43:44 -06001262
1263 if (dev->pdata->src_clk_rate > 0)
1264 clk_set_rate(dev->clk, dev->pdata->src_clk_rate);
1265 else
1266 dev->pdata->src_clk_rate = 19200000;
1267
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001268 clk_prepare_enable(dev->clk);
1269 clk_prepare_enable(dev->pclk);
1270 writel_relaxed(1, dev->base + QUP_SW_RESET);
1271 if (qup_i2c_poll_state(dev, 0, true) != 0)
1272 goto err_reset_failed;
1273 clk_disable_unprepare(dev->clk);
1274 clk_disable_unprepare(dev->pclk);
1275
1276 /*
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001277 * We use num_irqs to also indicate if we got 3 interrupts or just 1.
1278 * If we have just 1, we use err_irq as the general purpose irq
1279 * and handle the changes in ISR accordingly
1280 * Per Hardware guidelines, if we have 3 interrupts, they are always
1281 * edge triggering, and if we have 1, it's always level-triggering
1282 */
1283 if (dev->num_irqs == 3) {
1284 ret = request_irq(dev->in_irq, qup_i2c_interrupt,
1285 IRQF_TRIGGER_RISING, "qup_in_intr", dev);
1286 if (ret) {
1287 dev_err(&pdev->dev, "request_in_irq failed\n");
1288 goto err_request_irq_failed;
1289 }
1290 /*
1291 * We assume out_irq exists if in_irq does since platform
1292 * configuration either has 3 interrupts assigned to QUP or 1
1293 */
1294 ret = request_irq(dev->out_irq, qup_i2c_interrupt,
1295 IRQF_TRIGGER_RISING, "qup_out_intr", dev);
1296 if (ret) {
1297 dev_err(&pdev->dev, "request_out_irq failed\n");
1298 free_irq(dev->in_irq, dev);
1299 goto err_request_irq_failed;
1300 }
1301 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1302 IRQF_TRIGGER_RISING, "qup_err_intr", dev);
1303 if (ret) {
1304 dev_err(&pdev->dev, "request_err_irq failed\n");
1305 free_irq(dev->out_irq, dev);
1306 free_irq(dev->in_irq, dev);
1307 goto err_request_irq_failed;
1308 }
1309 } else {
1310 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1311 IRQF_TRIGGER_HIGH, "qup_err_intr", dev);
1312 if (ret) {
1313 dev_err(&pdev->dev, "request_err_irq failed\n");
1314 goto err_request_irq_failed;
1315 }
1316 }
1317 disable_irq(dev->err_irq);
1318 if (dev->num_irqs == 3) {
1319 disable_irq(dev->in_irq);
1320 disable_irq(dev->out_irq);
1321 }
1322 i2c_set_adapdata(&dev->adapter, dev);
1323 dev->adapter.algo = &qup_i2c_algo;
1324 strlcpy(dev->adapter.name,
1325 "QUP I2C adapter",
1326 sizeof(dev->adapter.name));
1327 dev->adapter.nr = pdev->id;
Harini Jayaramance67cf82011-08-05 09:26:06 -06001328 if (pdata->msm_i2c_config_gpio)
1329 pdata->msm_i2c_config_gpio(dev->adapter.nr, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001330
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001331 mutex_init(&dev->mlock);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301332 dev->pwr_state = 0;
Kiran Gundab4696c72012-08-16 18:37:46 +05301333 /* If the same AHB clock is used on Modem side
1334 * switch it on here itself and don't switch it
1335 * on and off during suspend and resume.
1336 */
1337 if (dev->pdata->keep_ahb_clk_on)
Alok Chauhancf2ce972012-11-19 21:53:12 +05301338 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001339
1340 ret = i2c_add_numbered_adapter(&dev->adapter);
1341 if (ret) {
1342 dev_err(&pdev->dev, "i2c_add_adapter failed\n");
1343 if (dev->num_irqs == 3) {
1344 free_irq(dev->out_irq, dev);
1345 free_irq(dev->in_irq, dev);
1346 }
1347 free_irq(dev->err_irq, dev);
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001348 } else {
Amy Malochef8f1a462012-08-13 22:55:26 -07001349 if (dev->dev->of_node) {
1350 dev->adapter.dev.of_node = pdev->dev.of_node;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001351 of_i2c_register_devices(&dev->adapter);
Amy Malochef8f1a462012-08-13 22:55:26 -07001352 }
Alok Chauhancf2ce972012-11-19 21:53:12 +05301353
1354 pm_runtime_set_autosuspend_delay(&pdev->dev, MSEC_PER_SEC);
1355 pm_runtime_use_autosuspend(&pdev->dev);
1356 pm_runtime_enable(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001357 return 0;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001358 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001359
1360
1361err_request_irq_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001362 if (dev->gsbi)
1363 iounmap(dev->gsbi);
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001364err_reset_failed:
1365 clk_disable_unprepare(dev->clk);
1366 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001367err_gsbi_failed:
1368 iounmap(dev->base);
1369err_ioremap_failed:
1370 kfree(dev);
1371err_alloc_dev_failed:
1372err_config_failed:
1373 clk_put(clk);
Matt Wagantallac294852011-08-17 15:44:58 -07001374 clk_put(pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001375err_clk_get_failed:
1376 if (gsbi_mem)
1377 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001378err_res_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001379 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001380get_res_failed:
1381 if (pdev->dev.of_node)
1382 kfree(pdata);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001383 return ret;
1384}
1385
1386static int __devexit
1387qup_i2c_remove(struct platform_device *pdev)
1388{
1389 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1390 struct resource *qup_mem, *gsbi_mem;
1391
1392 /* Grab mutex to ensure ongoing transaction is over */
1393 mutex_lock(&dev->mlock);
1394 dev->suspended = 1;
1395 mutex_unlock(&dev->mlock);
1396 mutex_destroy(&dev->mlock);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301397 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001398 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301399 qup_i2c_free_gpios(dev);
1400 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001401 platform_set_drvdata(pdev, NULL);
1402 if (dev->num_irqs == 3) {
1403 free_irq(dev->out_irq, dev);
1404 free_irq(dev->in_irq, dev);
1405 }
1406 free_irq(dev->err_irq, dev);
1407 i2c_del_adapter(&dev->adapter);
Kiran Gundab4696c72012-08-16 18:37:46 +05301408 if (!dev->pdata->keep_ahb_clk_on) {
Kiran Gundab4696c72012-08-16 18:37:46 +05301409 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 if (dev->gsbi)
1413 iounmap(dev->gsbi);
1414 iounmap(dev->base);
1415
1416 pm_runtime_disable(&pdev->dev);
Alok Chauhancf2ce972012-11-19 21:53:12 +05301417 pm_runtime_set_suspended(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001418
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
Alok Chauhancf2ce972012-11-19 21:53:12 +05301434static int i2c_qup_pm_suspend_runtime(struct device *device)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001435{
1436 struct platform_device *pdev = to_platform_device(device);
1437 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhancf2ce972012-11-19 21:53:12 +05301438 dev_dbg(device, "pm_runtime: suspending...\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001439 /* Grab mutex to ensure ongoing transaction is over */
1440 mutex_lock(&dev->mlock);
1441 dev->suspended = 1;
1442 mutex_unlock(&dev->mlock);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301443 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001444 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301445 qup_i2c_free_gpios(dev);
1446 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001447 return 0;
1448}
1449
Alok Chauhancf2ce972012-11-19 21:53:12 +05301450static int i2c_qup_pm_resume_runtime(struct device *device)
1451{
1452 struct platform_device *pdev = to_platform_device(device);
1453 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301454 int ret = 0;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301455 dev_dbg(device, "pm_runtime: resuming...\n");
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301456 if (dev->pwr_state == 0) {
1457 ret = qup_i2c_request_gpios(dev);
1458 if (ret != 0)
1459 return ret;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301460 qup_i2c_pwr_mgmt(dev, 1);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301461 }
Alok Chauhancf2ce972012-11-19 21:53:12 +05301462 dev->suspended = 0;
1463 return 0;
1464}
1465
1466static int qup_i2c_suspend(struct device *device)
1467{
1468 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1469 dev_dbg(device, "system suspend");
1470 i2c_qup_pm_suspend_runtime(device);
1471 }
1472 return 0;
1473}
1474
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001475static int qup_i2c_resume(struct device *device)
1476{
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301477 int ret = 0;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301478 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1479 dev_dbg(device, "system resume");
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301480 ret = i2c_qup_pm_resume_runtime(device);
1481 if (!ret) {
1482 pm_runtime_mark_last_busy(device);
1483 pm_request_autosuspend(device);
1484 }
1485 return ret;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301486 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001487 return 0;
1488}
1489#endif /* CONFIG_PM */
1490
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001491static const struct dev_pm_ops i2c_qup_dev_pm_ops = {
1492 SET_SYSTEM_SLEEP_PM_OPS(
1493 qup_i2c_suspend,
1494 qup_i2c_resume
1495 )
1496 SET_RUNTIME_PM_OPS(
Alok Chauhancf2ce972012-11-19 21:53:12 +05301497 i2c_qup_pm_suspend_runtime,
1498 i2c_qup_pm_resume_runtime,
1499 NULL
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001500 )
1501};
1502
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001503static struct of_device_id i2c_qup_dt_match[] = {
1504 {
1505 .compatible = "qcom,i2c-qup",
1506 },
1507 {}
1508};
1509
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001510static struct platform_driver qup_i2c_driver = {
1511 .probe = qup_i2c_probe,
1512 .remove = __devexit_p(qup_i2c_remove),
1513 .driver = {
1514 .name = "qup_i2c",
1515 .owner = THIS_MODULE,
1516 .pm = &i2c_qup_dev_pm_ops,
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001517 .of_match_table = i2c_qup_dt_match,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001518 },
1519};
1520
1521/* QUP may be needed to bring up other drivers */
1522static int __init
1523qup_i2c_init_driver(void)
1524{
1525 return platform_driver_register(&qup_i2c_driver);
1526}
1527arch_initcall(qup_i2c_init_driver);
1528
1529static void __exit qup_i2c_exit_driver(void)
1530{
1531 platform_driver_unregister(&qup_i2c_driver);
1532}
1533module_exit(qup_i2c_exit_driver);
1534