blob: 69a54bf285b94b9084108193a346c4a31fcd02a9 [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;
Alok Chauhan303d4ac2013-02-21 20:14:54 +0530197 uint32_t status = 0;
198 uint32_t status1 = 0;
199 uint32_t op_flgs = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700200 int err = 0;
201
Alok Chauhancf2ce972012-11-19 21:53:12 +0530202 if (pm_runtime_suspended(dev->dev))
203 return IRQ_NONE;
204
Alok Chauhan303d4ac2013-02-21 20:14:54 +0530205 status = readl_relaxed(dev->base + QUP_I2C_STATUS);
206 status1 = readl_relaxed(dev->base + QUP_ERROR_FLAGS);
207 op_flgs = readl_relaxed(dev->base + QUP_OPERATIONAL);
208
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700209 if (!dev->msg || !dev->complete) {
210 /* Clear Error interrupt if it's a level triggered interrupt*/
211 if (dev->num_irqs == 1) {
212 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
213 /* Ensure that state is written before ISR exits */
214 mb();
215 }
216 return IRQ_HANDLED;
217 }
218
219 if (status & I2C_STATUS_ERROR_MASK) {
220 dev_err(dev->dev, "QUP: I2C status flags :0x%x, irq:%d\n",
221 status, irq);
222 err = status;
223 /* Clear Error interrupt if it's a level triggered interrupt*/
224 if (dev->num_irqs == 1) {
225 writel_relaxed(QUP_RESET_STATE, dev->base+QUP_STATE);
226 /* Ensure that state is written before ISR exits */
227 mb();
228 }
229 goto intr_done;
230 }
231
232 if (status1 & 0x7F) {
233 dev_err(dev->dev, "QUP: QUP status flags :0x%x\n", status1);
234 err = -status1;
235 /* Clear Error interrupt if it's a level triggered interrupt*/
236 if (dev->num_irqs == 1) {
237 writel_relaxed((status1 & QUP_STATUS_ERROR_FLAGS),
238 dev->base + QUP_ERROR_FLAGS);
239 /* Ensure that error flags are cleared before ISR
240 * exits
241 */
242 mb();
243 }
244 goto intr_done;
245 }
246
247 if ((dev->num_irqs == 3) && (dev->msg->flags == I2C_M_RD)
248 && (irq == dev->out_irq))
249 return IRQ_HANDLED;
250 if (op_flgs & QUP_OUT_SVC_FLAG) {
251 writel_relaxed(QUP_OUT_SVC_FLAG, dev->base + QUP_OPERATIONAL);
252 /* Ensure that service flag is acknowledged before ISR exits */
253 mb();
254 }
255 if (dev->msg->flags == I2C_M_RD) {
256 if ((op_flgs & QUP_MX_INPUT_DONE) ||
257 (op_flgs & QUP_IN_SVC_FLAG)) {
258 writel_relaxed(QUP_IN_SVC_FLAG, dev->base
259 + QUP_OPERATIONAL);
260 /* Ensure that service flag is acknowledged before ISR
261 * exits
262 */
263 mb();
264 } else
265 return IRQ_HANDLED;
266 }
267
268intr_done:
269 dev_dbg(dev->dev, "QUP intr= %d, i2c status=0x%x, qup status = 0x%x\n",
270 irq, status, status1);
271 qup_print_status(dev);
272 dev->err = err;
273 complete(dev->complete);
274 return IRQ_HANDLED;
275}
276
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600277static int
278qup_i2c_poll_state(struct qup_i2c_dev *dev, uint32_t req_state, bool only_valid)
279{
280 uint32_t retries = 0;
281
282 dev_dbg(dev->dev, "Polling for state:0x%x, or valid-only:%d\n",
283 req_state, only_valid);
284
285 while (retries != 2000) {
286 uint32_t status = readl_relaxed(dev->base + QUP_STATE);
287
288 /*
289 * If only valid bit needs to be checked, requested state is
290 * 'don't care'
291 */
292 if (status & QUP_STATE_VALID) {
293 if (only_valid)
294 return 0;
295 else if ((req_state & QUP_I2C_MAST_GEN) &&
296 (status & QUP_I2C_MAST_GEN))
297 return 0;
298 else if ((status & QUP_STATE_MASK) == req_state)
299 return 0;
300 }
301 if (retries++ == 1000)
302 udelay(100);
303 }
304 return -ETIMEDOUT;
305}
306
307static int
308qup_update_state(struct qup_i2c_dev *dev, uint32_t state)
309{
310 if (qup_i2c_poll_state(dev, 0, true) != 0)
311 return -EIO;
312 writel_relaxed(state, dev->base + QUP_STATE);
313 if (qup_i2c_poll_state(dev, state, false) != 0)
314 return -EIO;
315 return 0;
316}
317
Trilok Sonif0274f12011-08-19 12:26:13 +0530318/*
319 * Before calling qup_config_core_on_en(), please make
320 * sure that QuPE core is in RESET state.
Trilok Sonif0274f12011-08-19 12:26:13 +0530321 */
322static void
323qup_config_core_on_en(struct qup_i2c_dev *dev)
324{
325 uint32_t status;
326
Trilok Sonif0274f12011-08-19 12:26:13 +0530327 status = readl_relaxed(dev->base + QUP_CONFIG);
328 status |= BIT(13);
329 writel_relaxed(status, dev->base + QUP_CONFIG);
330 /* making sure that write has really gone through */
331 mb();
332}
333
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700334static void
335qup_i2c_pwr_mgmt(struct qup_i2c_dev *dev, unsigned int state)
336{
Alok Chauhanb5dd0b42012-12-17 12:32:14 +0530337 dev->pwr_state = state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700338 if (state != 0) {
Alok Chauhancf2ce972012-11-19 21:53:12 +0530339 clk_prepare_enable(dev->clk);
Kiran Gundab4696c72012-08-16 18:37:46 +0530340 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhancf2ce972012-11-19 21:53:12 +0530341 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700342 } else {
Sagar Dharia57ac1ac2011-08-06 15:12:44 -0600343 qup_update_state(dev, QUP_RESET_STATE);
Alok Chauhancf2ce972012-11-19 21:53:12 +0530344 clk_disable_unprepare(dev->clk);
Trilok Sonif0274f12011-08-19 12:26:13 +0530345 qup_config_core_on_en(dev);
Kiran Gundab4696c72012-08-16 18:37:46 +0530346 if (!dev->pdata->keep_ahb_clk_on)
Alok Chauhancf2ce972012-11-19 21:53:12 +0530347 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700348 }
349}
350
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700351static 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;
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530385 uint32_t op_flgs = -1, clk_state = -1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700386
387 /*
388 * Wait for the clock state to transition to either IDLE or FORCED
389 * LOW. This will usually happen within one cycle of the i2c clock.
390 */
391
392 while (retries++ < QUP_MAX_CLK_STATE_RETRIES) {
393 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530394 clk_state = (status >> I2C_STATUS_CLK_STATE) & 0x7;
395 /* Read the operational register */
396 op_flgs = readl_relaxed(dev->base +
397 QUP_OPERATIONAL) & QUP_OUT_FIFO_NOT_EMPTY;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700398
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530399 /*
400 * In very corner case when slave do clock stretching and
401 * output fifo will have 1 block of data space empty at
402 * the same time. So i2c qup will get output service
403 * interrupt and as it doesn't have more data to be written.
404 * This can lead to issue where output fifo is not empty.
405 */
406 if (op_flgs == 0 &&
407 (clk_state == I2C_CLK_RESET_BUSIDLE_STATE ||
408 clk_state == I2C_CLK_FORCED_LOW_STATE)){
409 dev_dbg(dev->dev, "clk_state 0x%x op_flgs [%x]\n",
410 clk_state, op_flgs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700411 return 0;
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530412 }
413
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700414 /* 1-bit delay before we check again */
415 udelay(dev->one_bit_t);
416 }
417
Alok Chauhan4a0d1f62013-02-26 15:11:00 +0530418 dev_err(dev->dev, "Error waiting for clk ready clk_state: 0x%x op_flgs: 0x%x\n",
419 clk_state, op_flgs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700420 return -ETIMEDOUT;
421}
422
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700423static inline int qup_i2c_request_gpios(struct qup_i2c_dev *dev)
424{
425 int i;
426 int result = 0;
427
428 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
429 if (dev->i2c_gpios[i] >= 0) {
430 result = gpio_request(dev->i2c_gpios[i], i2c_rsrcs[i]);
431 if (result) {
432 dev_err(dev->dev,
433 "gpio_request for pin %d failed\
434 with error %d\n", dev->i2c_gpios[i],
435 result);
436 goto error;
437 }
438 }
439 }
440 return 0;
441
442error:
443 for (; --i >= 0;) {
444 if (dev->i2c_gpios[i] >= 0)
445 gpio_free(dev->i2c_gpios[i]);
446 }
447 return result;
448}
449
450static inline void qup_i2c_free_gpios(struct qup_i2c_dev *dev)
451{
452 int i;
453
454 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
455 if (dev->i2c_gpios[i] >= 0)
456 gpio_free(dev->i2c_gpios[i]);
457 }
458}
459
460#ifdef DEBUG
461static void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
462 uint32_t addr, int rdwr)
463{
464 if (rdwr)
465 dev_dbg(dev->dev, "RD:Wrote 0x%x to out_ff:0x%x\n", val, addr);
466 else
467 dev_dbg(dev->dev, "WR:Wrote 0x%x to out_ff:0x%x\n", val, addr);
468}
469#else
470static inline void qup_verify_fifo(struct qup_i2c_dev *dev, uint32_t val,
471 uint32_t addr, int rdwr)
472{
473}
474#endif
475
476static void
477qup_issue_read(struct qup_i2c_dev *dev, struct i2c_msg *msg, int *idx,
478 uint32_t carry_over)
479{
480 uint16_t addr = (msg->addr << 1) | 1;
481 /* QUP limit 256 bytes per read. By HW design, 0 in the 8-bit field
482 * is treated as 256 byte read.
483 */
484 uint16_t rd_len = ((dev->cnt == 256) ? 0 : dev->cnt);
485
486 if (*idx % 4) {
487 writel_relaxed(carry_over | ((QUP_OUT_START | addr) << 16),
488 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx-2)); */
489
490 qup_verify_fifo(dev, carry_over |
491 ((QUP_OUT_START | addr) << 16), (uint32_t)dev->base
492 + QUP_OUT_FIFO_BASE + (*idx - 2), 1);
493 writel_relaxed((QUP_OUT_REC | rd_len),
494 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx+2)); */
495
496 qup_verify_fifo(dev, (QUP_OUT_REC | rd_len),
497 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx + 2), 1);
498 } else {
499 writel_relaxed(((QUP_OUT_REC | rd_len) << 16)
500 | QUP_OUT_START | addr,
501 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx)); */
502
503 qup_verify_fifo(dev, QUP_OUT_REC << 16 | rd_len << 16 |
504 QUP_OUT_START | addr,
505 (uint32_t)dev->base + QUP_OUT_FIFO_BASE + (*idx), 1);
506 }
507 *idx += 4;
508}
509
510static void
511qup_issue_write(struct qup_i2c_dev *dev, struct i2c_msg *msg, int rem,
512 int *idx, uint32_t *carry_over)
513{
514 int entries = dev->cnt;
515 int empty_sl = dev->wr_sz - ((*idx) >> 1);
516 int i = 0;
517 uint32_t val = 0;
518 uint32_t last_entry = 0;
519 uint16_t addr = msg->addr << 1;
520
521 if (dev->pos == 0) {
522 if (*idx % 4) {
523 writel_relaxed(*carry_over | ((QUP_OUT_START |
524 addr) << 16),
525 dev->base + QUP_OUT_FIFO_BASE);
526
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600527 qup_verify_fifo(dev, *carry_over | QUP_OUT_START << 16 |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700528 addr << 16, (uint32_t)dev->base +
529 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
530 } else
531 val = QUP_OUT_START | addr;
532 *idx += 2;
533 i++;
534 entries++;
535 } else {
536 /* Avoid setp time issue by adding 1 NOP when number of bytes
537 * are more than FIFO/BLOCK size. setup time issue can't appear
538 * otherwise since next byte to be written will always be ready
539 */
540 val = (QUP_OUT_NOP | 1);
541 *idx += 2;
542 i++;
543 entries++;
544 }
545 if (entries > empty_sl)
546 entries = empty_sl;
547
548 for (; i < (entries - 1); i++) {
549 if (*idx % 4) {
550 writel_relaxed(val | ((QUP_OUT_DATA |
551 msg->buf[dev->pos]) << 16),
552 dev->base + QUP_OUT_FIFO_BASE);
553
554 qup_verify_fifo(dev, val | QUP_OUT_DATA << 16 |
555 msg->buf[dev->pos] << 16, (uint32_t)dev->base +
556 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
557 } else
558 val = QUP_OUT_DATA | msg->buf[dev->pos];
559 (*idx) += 2;
560 dev->pos++;
561 }
562 if (dev->pos < (msg->len - 1))
563 last_entry = QUP_OUT_DATA;
564 else if (rem > 1) /* not last array entry */
565 last_entry = QUP_OUT_DATA;
566 else
567 last_entry = QUP_OUT_STOP;
568 if ((*idx % 4) == 0) {
569 /*
570 * If read-start and read-command end up in different fifos, it
571 * may result in extra-byte being read due to extra-read cycle.
572 * Avoid that by inserting NOP as the last entry of fifo only
573 * if write command(s) leave 1 space in fifo.
574 */
575 if (rem > 1) {
576 struct i2c_msg *next = msg + 1;
Harini Jayaraman24bea432011-10-11 16:06:28 -0600577 if (next->addr == msg->addr && (next->flags & I2C_M_RD)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700578 && *idx == ((dev->wr_sz*2) - 4)) {
579 writel_relaxed(((last_entry |
580 msg->buf[dev->pos]) |
581 ((1 | QUP_OUT_NOP) << 16)), dev->base +
582 QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
583
584 qup_verify_fifo(dev,
585 ((last_entry | msg->buf[dev->pos]) |
586 ((1 | QUP_OUT_NOP) << 16)),
587 (uint32_t)dev->base +
588 QUP_OUT_FIFO_BASE + (*idx), 0);
589 *idx += 2;
590 } else if (next->flags == 0 && dev->pos == msg->len - 1
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600591 && *idx < (dev->wr_sz*2) &&
592 (next->addr != msg->addr)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700593 /* Last byte of an intermittent write */
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600594 writel_relaxed((QUP_OUT_STOP |
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700595 msg->buf[dev->pos]),
596 dev->base + QUP_OUT_FIFO_BASE);
597
598 qup_verify_fifo(dev,
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600599 QUP_OUT_STOP | msg->buf[dev->pos],
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700600 (uint32_t)dev->base +
601 QUP_OUT_FIFO_BASE + (*idx), 0);
602 *idx += 2;
603 } else
604 *carry_over = (last_entry | msg->buf[dev->pos]);
605 } else {
606 writel_relaxed((last_entry | msg->buf[dev->pos]),
607 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
608
609 qup_verify_fifo(dev, last_entry | msg->buf[dev->pos],
610 (uint32_t)dev->base + QUP_OUT_FIFO_BASE +
611 (*idx), 0);
612 }
613 } else {
614 writel_relaxed(val | ((last_entry | msg->buf[dev->pos]) << 16),
615 dev->base + QUP_OUT_FIFO_BASE);/* + (*idx) - 2); */
616
617 qup_verify_fifo(dev, val | (last_entry << 16) |
618 (msg->buf[dev->pos] << 16), (uint32_t)dev->base +
619 QUP_OUT_FIFO_BASE + (*idx) - 2, 0);
620 }
621
622 *idx += 2;
623 dev->pos++;
624 dev->cnt = msg->len - dev->pos;
625}
626
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700627static void
628qup_set_read_mode(struct qup_i2c_dev *dev, int rd_len)
629{
630 uint32_t wr_mode = (dev->wr_sz < dev->out_fifo_sz) ?
631 QUP_WR_BLK_MODE : 0;
632 if (rd_len > 256) {
633 dev_dbg(dev->dev, "HW limit: Breaking reads in chunk of 256\n");
634 rd_len = 256;
635 }
636 if (rd_len <= dev->in_fifo_sz) {
637 writel_relaxed(wr_mode | QUP_PACK_EN | QUP_UNPACK_EN,
638 dev->base + QUP_IO_MODE);
639 writel_relaxed(rd_len, dev->base + QUP_MX_READ_CNT);
640 } else {
641 writel_relaxed(wr_mode | QUP_RD_BLK_MODE |
642 QUP_PACK_EN | QUP_UNPACK_EN, dev->base + QUP_IO_MODE);
643 writel_relaxed(rd_len, dev->base + QUP_MX_INPUT_CNT);
644 }
645}
646
647static int
648qup_set_wr_mode(struct qup_i2c_dev *dev, int rem)
649{
650 int total_len = 0;
651 int ret = 0;
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600652 int len = dev->msg->len;
653 struct i2c_msg *next = NULL;
654 if (rem > 1)
655 next = dev->msg + 1;
Harini Jayaramanbe7e45d2011-11-02 12:12:03 -0600656 while (rem > 1 && next->flags == 0 && (next->addr == dev->msg->addr)) {
Kenneth Heitke6a852e92011-10-20 17:56:03 -0600657 len += next->len + 1;
658 next = next + 1;
659 rem--;
660 }
661 if (len >= (dev->out_fifo_sz - 1)) {
662 total_len = len + 1 + (len/(dev->out_blk_sz-1));
663
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700664 writel_relaxed(QUP_WR_BLK_MODE | QUP_PACK_EN | QUP_UNPACK_EN,
665 dev->base + QUP_IO_MODE);
666 dev->wr_sz = dev->out_blk_sz;
667 } else
668 writel_relaxed(QUP_PACK_EN | QUP_UNPACK_EN,
669 dev->base + QUP_IO_MODE);
670
671 if (rem > 1) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700672 if (next->addr == dev->msg->addr &&
673 next->flags == I2C_M_RD) {
674 qup_set_read_mode(dev, next->len);
675 /* make sure read start & read command are in 1 blk */
676 if ((total_len % dev->out_blk_sz) ==
677 (dev->out_blk_sz - 1))
678 total_len += 3;
679 else
680 total_len += 2;
681 }
682 }
683 /* WRITE COUNT register valid/used only in block mode */
684 if (dev->wr_sz == dev->out_blk_sz)
685 writel_relaxed(total_len, dev->base + QUP_MX_WR_CNT);
686 return ret;
687}
688
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700689
690static void qup_i2c_recover_bus_busy(struct qup_i2c_dev *dev)
691{
692 int i;
693 int gpio_clk;
694 int gpio_dat;
695 bool gpio_clk_status = false;
696 uint32_t status = readl_relaxed(dev->base + QUP_I2C_STATUS);
Alok Chauhan7257fe12013-02-01 13:06:41 +0530697 struct gpiomux_setting old_gpio_setting[ARRAY_SIZE(i2c_rsrcs)];
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700698
699 if (dev->pdata->msm_i2c_config_gpio)
700 return;
701
702 if (!(status & (I2C_STATUS_BUS_ACTIVE)) ||
703 (status & (I2C_STATUS_BUS_MASTER)))
704 return;
705
706 gpio_clk = dev->i2c_gpios[0];
707 gpio_dat = dev->i2c_gpios[1];
708
709 if ((gpio_clk == -1) && (gpio_dat == -1)) {
710 dev_err(dev->dev, "Recovery failed due to undefined GPIO's\n");
711 return;
712 }
713
714 disable_irq(dev->err_irq);
715 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
716 if (msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
Alok Chauhan7257fe12013-02-01 13:06:41 +0530717 &recovery_config, &old_gpio_setting[i])) {
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700718 dev_err(dev->dev, "GPIO pins have no active setting\n");
719 goto recovery_end;
720 }
721 }
722
723 dev_warn(dev->dev, "i2c_scl: %d, i2c_sda: %d\n",
724 gpio_get_value(gpio_clk), gpio_get_value(gpio_dat));
725
726 for (i = 0; i < 9; i++) {
727 if (gpio_get_value(gpio_dat) && gpio_clk_status)
728 break;
729 gpio_direction_output(gpio_clk, 0);
730 udelay(5);
731 gpio_direction_output(gpio_dat, 0);
732 udelay(5);
733 gpio_direction_input(gpio_clk);
734 udelay(5);
735 if (!gpio_get_value(gpio_clk))
736 udelay(20);
737 if (!gpio_get_value(gpio_clk))
738 usleep_range(10000, 10000);
739 gpio_clk_status = gpio_get_value(gpio_clk);
740 gpio_direction_input(gpio_dat);
741 udelay(5);
742 }
743
744 /* Configure ALT funciton to QUP I2C*/
745 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
746 msm_gpiomux_write(dev->i2c_gpios[i], GPIOMUX_ACTIVE,
Alok Chauhan7257fe12013-02-01 13:06:41 +0530747 &old_gpio_setting[i], NULL);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700748 }
749
750 udelay(10);
751
752 status = readl_relaxed(dev->base + QUP_I2C_STATUS);
753 if (!(status & I2C_STATUS_BUS_ACTIVE)) {
754 dev_info(dev->dev, "Bus busy cleared after %d clock cycles, "
755 "status %x\n",
756 i, status);
757 goto recovery_end;
758 }
759
760 dev_warn(dev->dev, "Bus still busy, status %x\n", status);
761
762recovery_end:
763 enable_irq(dev->err_irq);
764}
765
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700766static int
767qup_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
768{
769 DECLARE_COMPLETION_ONSTACK(complete);
770 struct qup_i2c_dev *dev = i2c_get_adapdata(adap);
771 int ret;
772 int rem = num;
773 long timeout;
774 int err;
775
Alok Chauhancf2ce972012-11-19 21:53:12 +0530776 pm_runtime_get_sync(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700777 mutex_lock(&dev->mlock);
778
779 if (dev->suspended) {
780 mutex_unlock(&dev->mlock);
781 return -EIO;
782 }
783
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700784 /* Initialize QUP registers during first transfer */
785 if (dev->clk_ctl == 0) {
786 int fs_div;
787 int hs_div;
788 uint32_t fifo_reg;
789
790 if (dev->gsbi) {
791 writel_relaxed(0x2 << 4, dev->gsbi);
792 /* GSBI memory is not in the same 1K region as other
793 * QUP registers. mb() here ensures that the GSBI
794 * register is updated in correct order and that the
795 * write has gone through before programming QUP core
796 * registers
797 */
798 mb();
799 }
800
801 fs_div = ((dev->pdata->src_clk_rate
802 / dev->pdata->clk_freq) / 2) - 3;
803 hs_div = 3;
804 dev->clk_ctl = ((hs_div & 0x7) << 8) | (fs_div & 0xff);
805 fifo_reg = readl_relaxed(dev->base + QUP_IO_MODE);
806 if (fifo_reg & 0x3)
807 dev->out_blk_sz = (fifo_reg & 0x3) * 16;
808 else
809 dev->out_blk_sz = 16;
810 if (fifo_reg & 0x60)
811 dev->in_blk_sz = ((fifo_reg & 0x60) >> 5) * 16;
812 else
813 dev->in_blk_sz = 16;
814 /*
815 * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag'
816 * associated with each byte written/received
817 */
818 dev->out_blk_sz /= 2;
819 dev->in_blk_sz /= 2;
820 dev->out_fifo_sz = dev->out_blk_sz *
821 (2 << ((fifo_reg & 0x1C) >> 2));
822 dev->in_fifo_sz = dev->in_blk_sz *
823 (2 << ((fifo_reg & 0x380) >> 7));
824 dev_dbg(dev->dev, "QUP IN:bl:%d, ff:%d, OUT:bl:%d, ff:%d\n",
825 dev->in_blk_sz, dev->in_fifo_sz,
826 dev->out_blk_sz, dev->out_fifo_sz);
827 }
828
829 writel_relaxed(1, dev->base + QUP_SW_RESET);
Sagar Dharia518e2302011-08-05 11:03:03 -0600830 ret = qup_i2c_poll_state(dev, QUP_RESET_STATE, false);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700831 if (ret) {
832 dev_err(dev->dev, "QUP Busy:Trying to recover\n");
833 goto out_err;
834 }
835
836 if (dev->num_irqs == 3) {
837 enable_irq(dev->in_irq);
838 enable_irq(dev->out_irq);
839 }
840 enable_irq(dev->err_irq);
841
842 /* Initialize QUP registers */
843 writel_relaxed(0, dev->base + QUP_CONFIG);
844 writel_relaxed(QUP_OPERATIONAL_RESET, dev->base + QUP_OPERATIONAL);
845 writel_relaxed(QUP_STATUS_ERROR_FLAGS, dev->base + QUP_ERROR_FLAGS_EN);
846
847 writel_relaxed(I2C_MINI_CORE | I2C_N_VAL, dev->base + QUP_CONFIG);
848
849 /* Initialize I2C mini core registers */
850 writel_relaxed(0, dev->base + QUP_I2C_CLK_CTL);
851 writel_relaxed(QUP_I2C_STATUS_RESET, dev->base + QUP_I2C_STATUS);
852
853 while (rem) {
854 bool filled = false;
855
856 dev->cnt = msgs->len - dev->pos;
857 dev->msg = msgs;
858
859 dev->wr_sz = dev->out_fifo_sz;
860 dev->err = 0;
861 dev->complete = &complete;
862
Sagar Dharia518e2302011-08-05 11:03:03 -0600863 if (qup_i2c_poll_state(dev, QUP_I2C_MAST_GEN, false) != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700864 ret = -EIO;
865 goto out_err;
866 }
867
868 qup_print_status(dev);
869 /* HW limits Read upto 256 bytes in 1 read without stop */
870 if (dev->msg->flags & I2C_M_RD) {
871 qup_set_read_mode(dev, dev->cnt);
872 if (dev->cnt > 256)
873 dev->cnt = 256;
874 } else {
875 ret = qup_set_wr_mode(dev, rem);
876 if (ret != 0)
877 goto out_err;
878 /* Don't fill block till we get interrupt */
879 if (dev->wr_sz == dev->out_blk_sz)
880 filled = true;
881 }
882
883 err = qup_update_state(dev, QUP_RUN_STATE);
884 if (err < 0) {
885 ret = err;
886 goto out_err;
887 }
888
889 qup_print_status(dev);
890 writel_relaxed(dev->clk_ctl, dev->base + QUP_I2C_CLK_CTL);
891 /* CLK_CTL register is not in the same 1K region as other QUP
892 * registers. Ensure that clock control is written before
893 * programming other QUP registers
894 */
895 mb();
896
897 do {
898 int idx = 0;
899 uint32_t carry_over = 0;
900
901 /* Transition to PAUSE state only possible from RUN */
902 err = qup_update_state(dev, QUP_PAUSE_STATE);
903 if (err < 0) {
904 ret = err;
905 goto out_err;
906 }
907
908 qup_print_status(dev);
909 /* This operation is Write, check the next operation
910 * and decide mode
911 */
912 while (filled == false) {
913 if ((msgs->flags & I2C_M_RD))
914 qup_issue_read(dev, msgs, &idx,
915 carry_over);
916 else if (!(msgs->flags & I2C_M_RD))
917 qup_issue_write(dev, msgs, rem, &idx,
918 &carry_over);
919 if (idx >= (dev->wr_sz << 1))
920 filled = true;
921 /* Start new message */
922 if (filled == false) {
923 if (msgs->flags & I2C_M_RD)
924 filled = true;
925 else if (rem > 1) {
926 /* Only combine operations with
927 * same address
928 */
929 struct i2c_msg *next = msgs + 1;
930 if (next->addr != msgs->addr)
931 filled = true;
932 else {
933 rem--;
934 msgs++;
935 dev->msg = msgs;
936 dev->pos = 0;
937 dev->cnt = msgs->len;
938 if (msgs->len > 256)
939 dev->cnt = 256;
940 }
941 } else
942 filled = true;
943 }
944 }
945 err = qup_update_state(dev, QUP_RUN_STATE);
946 if (err < 0) {
947 ret = err;
948 goto out_err;
949 }
950 dev_dbg(dev->dev, "idx:%d, rem:%d, num:%d, mode:%d\n",
951 idx, rem, num, dev->mode);
952
953 qup_print_status(dev);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700954 timeout = wait_for_completion_timeout(&complete,
955 msecs_to_jiffies(dev->out_fifo_sz));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700956 if (!timeout) {
957 uint32_t istatus = readl_relaxed(dev->base +
958 QUP_I2C_STATUS);
959 uint32_t qstatus = readl_relaxed(dev->base +
960 QUP_ERROR_FLAGS);
961 uint32_t op_flgs = readl_relaxed(dev->base +
962 QUP_OPERATIONAL);
963
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700964 /*
965 * Dont wait for 1 sec if i2c sees the bus
966 * active and controller is not master.
967 * A slave has pulled line low. Try to recover
968 */
969 if (!(istatus & I2C_STATUS_BUS_ACTIVE) ||
970 (istatus & I2C_STATUS_BUS_MASTER)) {
971 timeout =
972 wait_for_completion_timeout(&complete,
973 HZ);
974 if (timeout)
975 goto timeout_err;
976 }
977 qup_i2c_recover_bus_busy(dev);
978 dev_err(dev->dev,
979 "Transaction timed out, SL-AD = 0x%x\n",
980 dev->msg->addr);
981
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700982 dev_err(dev->dev, "I2C Status: %x\n", istatus);
983 dev_err(dev->dev, "QUP Status: %x\n", qstatus);
984 dev_err(dev->dev, "OP Flags: %x\n", op_flgs);
985 writel_relaxed(1, dev->base + QUP_SW_RESET);
986 /* Make sure that the write has gone through
987 * before returning from the function
988 */
989 mb();
990 ret = -ETIMEDOUT;
991 goto out_err;
992 }
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700993timeout_err:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700994 if (dev->err) {
995 if (dev->err > 0 &&
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -0700996 dev->err & QUP_I2C_NACK_FLAG) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700997 dev_err(dev->dev,
998 "I2C slave addr:0x%x not connected\n",
999 dev->msg->addr);
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -07001000 dev->err = ENOTCONN;
1001 } else if (dev->err < 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001002 dev_err(dev->dev,
1003 "QUP data xfer error %d\n", dev->err);
1004 ret = dev->err;
1005 goto out_err;
Harini Jayaraman17f8e0e2011-12-01 18:01:43 -07001006 } else if (dev->err > 0) {
1007 /*
1008 * ISR returns +ve error if error code
1009 * is I2C related, e.g. unexpected start
1010 * So you may call recover-bus-busy when
1011 * this error happens
1012 */
1013 qup_i2c_recover_bus_busy(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001014 }
1015 ret = -dev->err;
1016 goto out_err;
1017 }
1018 if (dev->msg->flags & I2C_M_RD) {
1019 int i;
1020 uint32_t dval = 0;
1021 for (i = 0; dev->pos < dev->msg->len; i++,
1022 dev->pos++) {
1023 uint32_t rd_status =
1024 readl_relaxed(dev->base
1025 + QUP_OPERATIONAL);
1026 if (i % 2 == 0) {
1027 if ((rd_status &
1028 QUP_IN_NOT_EMPTY) == 0)
1029 break;
1030 dval = readl_relaxed(dev->base +
1031 QUP_IN_FIFO_BASE);
1032 dev->msg->buf[dev->pos] =
1033 dval & 0xFF;
1034 } else
1035 dev->msg->buf[dev->pos] =
1036 ((dval & 0xFF0000) >>
1037 16);
1038 }
1039 dev->cnt -= i;
1040 } else
1041 filled = false; /* refill output FIFO */
1042 dev_dbg(dev->dev, "pos:%d, len:%d, cnt:%d\n",
1043 dev->pos, msgs->len, dev->cnt);
1044 } while (dev->cnt > 0);
1045 if (dev->cnt == 0) {
1046 if (msgs->len == dev->pos) {
1047 rem--;
1048 msgs++;
1049 dev->pos = 0;
1050 }
1051 if (rem) {
1052 err = qup_i2c_poll_clock_ready(dev);
1053 if (err < 0) {
1054 ret = err;
1055 goto out_err;
1056 }
1057 err = qup_update_state(dev, QUP_RESET_STATE);
1058 if (err < 0) {
1059 ret = err;
1060 goto out_err;
1061 }
1062 }
1063 }
1064 /* Wait for I2C bus to be idle */
1065 ret = qup_i2c_poll_writeready(dev, rem);
1066 if (ret) {
1067 dev_err(dev->dev,
1068 "Error waiting for write ready\n");
1069 goto out_err;
1070 }
1071 }
1072
1073 ret = num;
1074 out_err:
1075 disable_irq(dev->err_irq);
1076 if (dev->num_irqs == 3) {
1077 disable_irq(dev->in_irq);
1078 disable_irq(dev->out_irq);
1079 }
1080 dev->complete = NULL;
1081 dev->msg = NULL;
1082 dev->pos = 0;
1083 dev->err = 0;
1084 dev->cnt = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001085 mutex_unlock(&dev->mlock);
Alok Chauhancf2ce972012-11-19 21:53:12 +05301086 pm_runtime_mark_last_busy(dev->dev);
1087 pm_runtime_put_autosuspend(dev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001088 return ret;
1089}
1090
1091static u32
1092qup_i2c_func(struct i2c_adapter *adap)
1093{
1094 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
1095}
1096
1097static const struct i2c_algorithm qup_i2c_algo = {
1098 .master_xfer = qup_i2c_xfer,
1099 .functionality = qup_i2c_func,
1100};
1101
1102static int __devinit
1103qup_i2c_probe(struct platform_device *pdev)
1104{
1105 struct qup_i2c_dev *dev;
1106 struct resource *qup_mem, *gsbi_mem, *qup_io, *gsbi_io, *res;
1107 struct resource *in_irq, *out_irq, *err_irq;
1108 struct clk *clk, *pclk;
1109 int ret = 0;
1110 int i;
1111 struct msm_i2c_platform_data *pdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001112
1113 gsbi_mem = NULL;
1114 dev_dbg(&pdev->dev, "qup_i2c_probe\n");
1115
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001116 if (pdev->dev.of_node) {
1117 struct device_node *node = pdev->dev.of_node;
1118 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
1119 if (!pdata)
1120 return -ENOMEM;
1121 ret = of_property_read_u32(node, "qcom,i2c-bus-freq",
1122 &pdata->clk_freq);
1123 if (ret)
1124 goto get_res_failed;
1125 ret = of_property_read_u32(node, "cell-index", &pdev->id);
1126 if (ret)
1127 goto get_res_failed;
1128 /* Optional property */
1129 of_property_read_u32(node, "qcom,i2c-src-freq",
1130 &pdata->src_clk_rate);
1131 } else
1132 pdata = pdev->dev.platform_data;
1133
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001134 if (!pdata) {
1135 dev_err(&pdev->dev, "platform data not initialized\n");
1136 return -ENOSYS;
1137 }
1138 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1139 "qup_phys_addr");
1140 if (!qup_mem) {
1141 dev_err(&pdev->dev, "no qup mem resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001142 ret = -ENODEV;
1143 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001144 }
1145
1146 /*
1147 * We only have 1 interrupt for new hardware targets and in_irq,
1148 * out_irq will be NULL for those platforms
1149 */
1150 in_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1151 "qup_in_intr");
1152
1153 out_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1154 "qup_out_intr");
1155
1156 err_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1157 "qup_err_intr");
1158 if (!err_irq) {
1159 dev_err(&pdev->dev, "no error irq resource?\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001160 ret = -ENODEV;
1161 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001162 }
1163
1164 qup_io = request_mem_region(qup_mem->start, resource_size(qup_mem),
1165 pdev->name);
1166 if (!qup_io) {
1167 dev_err(&pdev->dev, "QUP region already claimed\n");
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001168 ret = -EBUSY;
1169 goto get_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001170 }
1171 if (!pdata->use_gsbi_shared_mode) {
1172 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1173 "gsbi_qup_i2c_addr");
1174 if (!gsbi_mem) {
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001175 dev_dbg(&pdev->dev, "Assume BLSP\n");
1176 /*
1177 * BLSP core does not need protocol programming so this
1178 * resource is not expected
1179 */
1180 goto blsp_core_init;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001181 }
1182 gsbi_io = request_mem_region(gsbi_mem->start,
1183 resource_size(gsbi_mem),
1184 pdev->name);
1185 if (!gsbi_io) {
1186 dev_err(&pdev->dev, "GSBI region already claimed\n");
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001187 ret = -EBUSY;
1188 goto err_res_failed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001189 }
1190 }
1191
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001192blsp_core_init:
Matt Wagantallac294852011-08-17 15:44:58 -07001193 clk = clk_get(&pdev->dev, "core_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001194 if (IS_ERR(clk)) {
Matt Wagantallac294852011-08-17 15:44:58 -07001195 dev_err(&pdev->dev, "Could not get core_clk\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001196 ret = PTR_ERR(clk);
1197 goto err_clk_get_failed;
1198 }
1199
Matt Wagantallac294852011-08-17 15:44:58 -07001200 pclk = clk_get(&pdev->dev, "iface_clk");
1201 if (IS_ERR(pclk)) {
1202 dev_err(&pdev->dev, "Could not get iface_clk\n");
1203 ret = PTR_ERR(pclk);
1204 clk_put(clk);
1205 goto err_clk_get_failed;
1206 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001207
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001208 /* We support frequencies upto FAST Mode(400KHz) */
1209 if (pdata->clk_freq <= 0 ||
1210 pdata->clk_freq > 400000) {
1211 dev_err(&pdev->dev, "clock frequency not supported\n");
1212 ret = -EIO;
1213 goto err_config_failed;
1214 }
1215
1216 dev = kzalloc(sizeof(struct qup_i2c_dev), GFP_KERNEL);
1217 if (!dev) {
1218 ret = -ENOMEM;
1219 goto err_alloc_dev_failed;
1220 }
1221
1222 dev->dev = &pdev->dev;
1223 if (in_irq)
1224 dev->in_irq = in_irq->start;
1225 if (out_irq)
1226 dev->out_irq = out_irq->start;
1227 dev->err_irq = err_irq->start;
1228 if (in_irq && out_irq)
1229 dev->num_irqs = 3;
1230 else
1231 dev->num_irqs = 1;
1232 dev->clk = clk;
1233 dev->pclk = pclk;
1234 dev->base = ioremap(qup_mem->start, resource_size(qup_mem));
1235 if (!dev->base) {
1236 ret = -ENOMEM;
1237 goto err_ioremap_failed;
1238 }
1239
1240 /* Configure GSBI block to use I2C functionality */
1241 if (gsbi_mem) {
1242 dev->gsbi = ioremap(gsbi_mem->start, resource_size(gsbi_mem));
1243 if (!dev->gsbi) {
1244 ret = -ENOMEM;
1245 goto err_gsbi_failed;
1246 }
1247 }
1248
1249 for (i = 0; i < ARRAY_SIZE(i2c_rsrcs); ++i) {
1250 res = platform_get_resource_byname(pdev, IORESOURCE_IO,
1251 i2c_rsrcs[i]);
1252 dev->i2c_gpios[i] = res ? res->start : -1;
1253 }
1254
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001255 platform_set_drvdata(pdev, dev);
1256
Harini Jayaramand997b3b2011-10-11 14:25:29 -06001257 dev->one_bit_t = (USEC_PER_SEC/pdata->clk_freq) + 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001258 dev->pdata = pdata;
1259 dev->clk_ctl = 0;
1260 dev->pos = 0;
1261
1262 /*
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001263 * If bootloaders leave a pending interrupt on certain GSBI's,
1264 * then we reset the core before registering for interrupts.
1265 */
Harini Jayaramand59ee0a2012-04-06 10:43:44 -06001266
1267 if (dev->pdata->src_clk_rate > 0)
1268 clk_set_rate(dev->clk, dev->pdata->src_clk_rate);
1269 else
1270 dev->pdata->src_clk_rate = 19200000;
1271
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001272 clk_prepare_enable(dev->clk);
1273 clk_prepare_enable(dev->pclk);
1274 writel_relaxed(1, dev->base + QUP_SW_RESET);
1275 if (qup_i2c_poll_state(dev, 0, true) != 0)
1276 goto err_reset_failed;
1277 clk_disable_unprepare(dev->clk);
1278 clk_disable_unprepare(dev->pclk);
1279
1280 /*
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001281 * We use num_irqs to also indicate if we got 3 interrupts or just 1.
1282 * If we have just 1, we use err_irq as the general purpose irq
1283 * and handle the changes in ISR accordingly
1284 * Per Hardware guidelines, if we have 3 interrupts, they are always
1285 * edge triggering, and if we have 1, it's always level-triggering
1286 */
1287 if (dev->num_irqs == 3) {
1288 ret = request_irq(dev->in_irq, qup_i2c_interrupt,
1289 IRQF_TRIGGER_RISING, "qup_in_intr", dev);
1290 if (ret) {
1291 dev_err(&pdev->dev, "request_in_irq failed\n");
1292 goto err_request_irq_failed;
1293 }
1294 /*
1295 * We assume out_irq exists if in_irq does since platform
1296 * configuration either has 3 interrupts assigned to QUP or 1
1297 */
1298 ret = request_irq(dev->out_irq, qup_i2c_interrupt,
1299 IRQF_TRIGGER_RISING, "qup_out_intr", dev);
1300 if (ret) {
1301 dev_err(&pdev->dev, "request_out_irq failed\n");
1302 free_irq(dev->in_irq, dev);
1303 goto err_request_irq_failed;
1304 }
1305 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1306 IRQF_TRIGGER_RISING, "qup_err_intr", dev);
1307 if (ret) {
1308 dev_err(&pdev->dev, "request_err_irq failed\n");
1309 free_irq(dev->out_irq, dev);
1310 free_irq(dev->in_irq, dev);
1311 goto err_request_irq_failed;
1312 }
1313 } else {
1314 ret = request_irq(dev->err_irq, qup_i2c_interrupt,
1315 IRQF_TRIGGER_HIGH, "qup_err_intr", dev);
1316 if (ret) {
1317 dev_err(&pdev->dev, "request_err_irq failed\n");
1318 goto err_request_irq_failed;
1319 }
1320 }
1321 disable_irq(dev->err_irq);
1322 if (dev->num_irqs == 3) {
1323 disable_irq(dev->in_irq);
1324 disable_irq(dev->out_irq);
1325 }
1326 i2c_set_adapdata(&dev->adapter, dev);
1327 dev->adapter.algo = &qup_i2c_algo;
1328 strlcpy(dev->adapter.name,
1329 "QUP I2C adapter",
1330 sizeof(dev->adapter.name));
1331 dev->adapter.nr = pdev->id;
Harini Jayaramance67cf82011-08-05 09:26:06 -06001332 if (pdata->msm_i2c_config_gpio)
1333 pdata->msm_i2c_config_gpio(dev->adapter.nr, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001334
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001335 mutex_init(&dev->mlock);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301336 dev->pwr_state = 0;
Kiran Gundab4696c72012-08-16 18:37:46 +05301337 /* If the same AHB clock is used on Modem side
1338 * switch it on here itself and don't switch it
1339 * on and off during suspend and resume.
1340 */
1341 if (dev->pdata->keep_ahb_clk_on)
Alok Chauhancf2ce972012-11-19 21:53:12 +05301342 clk_prepare_enable(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001343
1344 ret = i2c_add_numbered_adapter(&dev->adapter);
1345 if (ret) {
1346 dev_err(&pdev->dev, "i2c_add_adapter failed\n");
1347 if (dev->num_irqs == 3) {
1348 free_irq(dev->out_irq, dev);
1349 free_irq(dev->in_irq, dev);
1350 }
1351 free_irq(dev->err_irq, dev);
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001352 } else {
Amy Malochef8f1a462012-08-13 22:55:26 -07001353 if (dev->dev->of_node) {
1354 dev->adapter.dev.of_node = pdev->dev.of_node;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001355 of_i2c_register_devices(&dev->adapter);
Amy Malochef8f1a462012-08-13 22:55:26 -07001356 }
Alok Chauhancf2ce972012-11-19 21:53:12 +05301357
1358 pm_runtime_set_autosuspend_delay(&pdev->dev, MSEC_PER_SEC);
1359 pm_runtime_use_autosuspend(&pdev->dev);
1360 pm_runtime_enable(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001361 return 0;
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001362 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001363
1364
1365err_request_irq_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001366 if (dev->gsbi)
1367 iounmap(dev->gsbi);
Harini Jayaraman65c6cbe2012-03-27 17:06:32 -06001368err_reset_failed:
1369 clk_disable_unprepare(dev->clk);
1370 clk_disable_unprepare(dev->pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001371err_gsbi_failed:
1372 iounmap(dev->base);
1373err_ioremap_failed:
1374 kfree(dev);
1375err_alloc_dev_failed:
1376err_config_failed:
1377 clk_put(clk);
Matt Wagantallac294852011-08-17 15:44:58 -07001378 clk_put(pclk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001379err_clk_get_failed:
1380 if (gsbi_mem)
1381 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001382err_res_failed:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001383 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001384get_res_failed:
1385 if (pdev->dev.of_node)
1386 kfree(pdata);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001387 return ret;
1388}
1389
1390static int __devexit
1391qup_i2c_remove(struct platform_device *pdev)
1392{
1393 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
1394 struct resource *qup_mem, *gsbi_mem;
1395
1396 /* Grab mutex to ensure ongoing transaction is over */
1397 mutex_lock(&dev->mlock);
1398 dev->suspended = 1;
1399 mutex_unlock(&dev->mlock);
1400 mutex_destroy(&dev->mlock);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301401 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001402 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301403 qup_i2c_free_gpios(dev);
1404 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001405 platform_set_drvdata(pdev, NULL);
1406 if (dev->num_irqs == 3) {
1407 free_irq(dev->out_irq, dev);
1408 free_irq(dev->in_irq, dev);
1409 }
1410 free_irq(dev->err_irq, dev);
1411 i2c_del_adapter(&dev->adapter);
Kiran Gundab4696c72012-08-16 18:37:46 +05301412 if (!dev->pdata->keep_ahb_clk_on) {
Kiran Gundab4696c72012-08-16 18:37:46 +05301413 clk_put(dev->pclk);
1414 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001415 clk_put(dev->clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001416 if (dev->gsbi)
1417 iounmap(dev->gsbi);
1418 iounmap(dev->base);
1419
1420 pm_runtime_disable(&pdev->dev);
Alok Chauhancf2ce972012-11-19 21:53:12 +05301421 pm_runtime_set_suspended(&pdev->dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001422
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001423 if (!(dev->pdata->use_gsbi_shared_mode)) {
1424 gsbi_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1425 "gsbi_qup_i2c_addr");
1426 release_mem_region(gsbi_mem->start, resource_size(gsbi_mem));
1427 }
1428 qup_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1429 "qup_phys_addr");
1430 release_mem_region(qup_mem->start, resource_size(qup_mem));
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001431 if (dev->dev->of_node)
1432 kfree(dev->pdata);
Harini Jayaramanee31ae92011-09-20 18:32:34 -06001433 kfree(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001434 return 0;
1435}
1436
1437#ifdef CONFIG_PM
Alok Chauhancf2ce972012-11-19 21:53:12 +05301438static int i2c_qup_pm_suspend_runtime(struct device *device)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001439{
1440 struct platform_device *pdev = to_platform_device(device);
1441 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhancf2ce972012-11-19 21:53:12 +05301442 dev_dbg(device, "pm_runtime: suspending...\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001443 /* Grab mutex to ensure ongoing transaction is over */
1444 mutex_lock(&dev->mlock);
1445 dev->suspended = 1;
1446 mutex_unlock(&dev->mlock);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301447 if (dev->pwr_state != 0) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001448 qup_i2c_pwr_mgmt(dev, 0);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301449 qup_i2c_free_gpios(dev);
1450 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001451 return 0;
1452}
1453
Alok Chauhancf2ce972012-11-19 21:53:12 +05301454static int i2c_qup_pm_resume_runtime(struct device *device)
1455{
1456 struct platform_device *pdev = to_platform_device(device);
1457 struct qup_i2c_dev *dev = platform_get_drvdata(pdev);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301458 int ret = 0;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301459 dev_dbg(device, "pm_runtime: resuming...\n");
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301460 if (dev->pwr_state == 0) {
1461 ret = qup_i2c_request_gpios(dev);
1462 if (ret != 0)
1463 return ret;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301464 qup_i2c_pwr_mgmt(dev, 1);
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301465 }
Alok Chauhancf2ce972012-11-19 21:53:12 +05301466 dev->suspended = 0;
1467 return 0;
1468}
1469
1470static int qup_i2c_suspend(struct device *device)
1471{
1472 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1473 dev_dbg(device, "system suspend");
1474 i2c_qup_pm_suspend_runtime(device);
1475 }
1476 return 0;
1477}
1478
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001479static int qup_i2c_resume(struct device *device)
1480{
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301481 int ret = 0;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301482 if (!pm_runtime_enabled(device) || !pm_runtime_suspended(device)) {
1483 dev_dbg(device, "system resume");
Alok Chauhanb5dd0b42012-12-17 12:32:14 +05301484 ret = i2c_qup_pm_resume_runtime(device);
1485 if (!ret) {
1486 pm_runtime_mark_last_busy(device);
1487 pm_request_autosuspend(device);
1488 }
1489 return ret;
Alok Chauhancf2ce972012-11-19 21:53:12 +05301490 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001491 return 0;
1492}
1493#endif /* CONFIG_PM */
1494
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001495static const struct dev_pm_ops i2c_qup_dev_pm_ops = {
1496 SET_SYSTEM_SLEEP_PM_OPS(
1497 qup_i2c_suspend,
1498 qup_i2c_resume
1499 )
1500 SET_RUNTIME_PM_OPS(
Alok Chauhancf2ce972012-11-19 21:53:12 +05301501 i2c_qup_pm_suspend_runtime,
1502 i2c_qup_pm_resume_runtime,
1503 NULL
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001504 )
1505};
1506
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001507static struct of_device_id i2c_qup_dt_match[] = {
1508 {
1509 .compatible = "qcom,i2c-qup",
1510 },
1511 {}
1512};
1513
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001514static struct platform_driver qup_i2c_driver = {
1515 .probe = qup_i2c_probe,
1516 .remove = __devexit_p(qup_i2c_remove),
1517 .driver = {
1518 .name = "qup_i2c",
1519 .owner = THIS_MODULE,
1520 .pm = &i2c_qup_dev_pm_ops,
Sagar Dharia4c5bef32012-03-14 17:00:29 -06001521 .of_match_table = i2c_qup_dt_match,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001522 },
1523};
1524
1525/* QUP may be needed to bring up other drivers */
1526static int __init
1527qup_i2c_init_driver(void)
1528{
1529 return platform_driver_register(&qup_i2c_driver);
1530}
1531arch_initcall(qup_i2c_init_driver);
1532
1533static void __exit qup_i2c_exit_driver(void)
1534{
1535 platform_driver_unregister(&qup_i2c_driver);
1536}
1537module_exit(qup_i2c_exit_driver);
1538