blob: 6b69b7007f00ea6861c834ec985030de6ff2f136 [file] [log] [blame]
Colin Crossdb811ca2011-02-20 17:14:21 -08001/*
2 * drivers/i2c/busses/i2c-tegra.c
3 *
4 * Copyright (C) 2010 Google, Inc.
5 * Author: Colin Cross <ccross@android.com>
6 *
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18#include <linux/kernel.h>
19#include <linux/init.h>
20#include <linux/platform_device.h>
21#include <linux/clk.h>
22#include <linux/err.h>
23#include <linux/i2c.h>
24#include <linux/io.h>
25#include <linux/interrupt.h>
26#include <linux/delay.h>
27#include <linux/slab.h>
28#include <linux/i2c-tegra.h>
29
30#include <asm/unaligned.h>
31
32#include <mach/clk.h>
33
34#define TEGRA_I2C_TIMEOUT (msecs_to_jiffies(1000))
35#define BYTES_PER_FIFO_WORD 4
36
37#define I2C_CNFG 0x000
38#define I2C_CNFG_PACKET_MODE_EN (1<<10)
39#define I2C_CNFG_NEW_MASTER_FSM (1<<11)
Todd Poynorcb63c622011-04-25 15:32:25 -060040#define I2C_STATUS 0x01C
Colin Crossdb811ca2011-02-20 17:14:21 -080041#define I2C_SL_CNFG 0x020
42#define I2C_SL_CNFG_NEWSL (1<<2)
43#define I2C_SL_ADDR1 0x02c
44#define I2C_TX_FIFO 0x050
45#define I2C_RX_FIFO 0x054
46#define I2C_PACKET_TRANSFER_STATUS 0x058
47#define I2C_FIFO_CONTROL 0x05c
48#define I2C_FIFO_CONTROL_TX_FLUSH (1<<1)
49#define I2C_FIFO_CONTROL_RX_FLUSH (1<<0)
50#define I2C_FIFO_CONTROL_TX_TRIG_SHIFT 5
51#define I2C_FIFO_CONTROL_RX_TRIG_SHIFT 2
52#define I2C_FIFO_STATUS 0x060
53#define I2C_FIFO_STATUS_TX_MASK 0xF0
54#define I2C_FIFO_STATUS_TX_SHIFT 4
55#define I2C_FIFO_STATUS_RX_MASK 0x0F
56#define I2C_FIFO_STATUS_RX_SHIFT 0
57#define I2C_INT_MASK 0x064
58#define I2C_INT_STATUS 0x068
59#define I2C_INT_PACKET_XFER_COMPLETE (1<<7)
60#define I2C_INT_ALL_PACKETS_XFER_COMPLETE (1<<6)
61#define I2C_INT_TX_FIFO_OVERFLOW (1<<5)
62#define I2C_INT_RX_FIFO_UNDERFLOW (1<<4)
63#define I2C_INT_NO_ACK (1<<3)
64#define I2C_INT_ARBITRATION_LOST (1<<2)
65#define I2C_INT_TX_FIFO_DATA_REQ (1<<1)
66#define I2C_INT_RX_FIFO_DATA_REQ (1<<0)
67#define I2C_CLK_DIVISOR 0x06c
68
69#define DVC_CTRL_REG1 0x000
70#define DVC_CTRL_REG1_INTR_EN (1<<10)
71#define DVC_CTRL_REG2 0x004
72#define DVC_CTRL_REG3 0x008
73#define DVC_CTRL_REG3_SW_PROG (1<<26)
74#define DVC_CTRL_REG3_I2C_DONE_INTR_EN (1<<30)
75#define DVC_STATUS 0x00c
76#define DVC_STATUS_I2C_DONE_INTR (1<<30)
77
78#define I2C_ERR_NONE 0x00
79#define I2C_ERR_NO_ACK 0x01
80#define I2C_ERR_ARBITRATION_LOST 0x02
Todd Poynorcb63c622011-04-25 15:32:25 -060081#define I2C_ERR_UNKNOWN_INTERRUPT 0x04
Colin Crossdb811ca2011-02-20 17:14:21 -080082
83#define PACKET_HEADER0_HEADER_SIZE_SHIFT 28
84#define PACKET_HEADER0_PACKET_ID_SHIFT 16
85#define PACKET_HEADER0_CONT_ID_SHIFT 12
86#define PACKET_HEADER0_PROTOCOL_I2C (1<<4)
87
88#define I2C_HEADER_HIGHSPEED_MODE (1<<22)
89#define I2C_HEADER_CONT_ON_NAK (1<<21)
90#define I2C_HEADER_SEND_START_BYTE (1<<20)
91#define I2C_HEADER_READ (1<<19)
92#define I2C_HEADER_10BIT_ADDR (1<<18)
93#define I2C_HEADER_IE_ENABLE (1<<17)
94#define I2C_HEADER_REPEAT_START (1<<16)
95#define I2C_HEADER_MASTER_ADDR_SHIFT 12
96#define I2C_HEADER_SLAVE_ADDR_SHIFT 1
97
98/**
99 * struct tegra_i2c_dev - per device i2c context
100 * @dev: device reference for power management
101 * @adapter: core i2c layer adapter information
102 * @clk: clock reference for i2c controller
103 * @i2c_clk: clock reference for i2c bus
104 * @iomem: memory resource for registers
105 * @base: ioremapped registers cookie
106 * @cont_id: i2c controller id, used for for packet header
107 * @irq: irq number of transfer complete interrupt
108 * @is_dvc: identifies the DVC i2c controller, has a different register layout
109 * @msg_complete: transfer completion notifier
110 * @msg_err: error code for completed message
111 * @msg_buf: pointer to current message data
112 * @msg_buf_remaining: size of unsent data in the message buffer
113 * @msg_read: identifies read transfers
114 * @bus_clk_rate: current i2c bus clock rate
115 * @is_suspended: prevents i2c controller accesses after suspend is called
116 */
117struct tegra_i2c_dev {
118 struct device *dev;
119 struct i2c_adapter adapter;
120 struct clk *clk;
121 struct clk *i2c_clk;
122 struct resource *iomem;
123 void __iomem *base;
124 int cont_id;
125 int irq;
Todd Poynorcb63c622011-04-25 15:32:25 -0600126 bool irq_disabled;
Colin Crossdb811ca2011-02-20 17:14:21 -0800127 int is_dvc;
128 struct completion msg_complete;
129 int msg_err;
130 u8 *msg_buf;
131 size_t msg_buf_remaining;
132 int msg_read;
133 unsigned long bus_clk_rate;
134 bool is_suspended;
135};
136
137static void dvc_writel(struct tegra_i2c_dev *i2c_dev, u32 val, unsigned long reg)
138{
139 writel(val, i2c_dev->base + reg);
140}
141
142static u32 dvc_readl(struct tegra_i2c_dev *i2c_dev, unsigned long reg)
143{
144 return readl(i2c_dev->base + reg);
145}
146
147/*
148 * i2c_writel and i2c_readl will offset the register if necessary to talk
149 * to the I2C block inside the DVC block
150 */
151static unsigned long tegra_i2c_reg_addr(struct tegra_i2c_dev *i2c_dev,
152 unsigned long reg)
153{
154 if (i2c_dev->is_dvc)
155 reg += (reg >= I2C_TX_FIFO) ? 0x10 : 0x40;
156 return reg;
157}
158
159static void i2c_writel(struct tegra_i2c_dev *i2c_dev, u32 val,
160 unsigned long reg)
161{
162 writel(val, i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg));
163}
164
165static u32 i2c_readl(struct tegra_i2c_dev *i2c_dev, unsigned long reg)
166{
167 return readl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg));
168}
169
170static void i2c_writesl(struct tegra_i2c_dev *i2c_dev, void *data,
171 unsigned long reg, int len)
172{
173 writesl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len);
174}
175
176static void i2c_readsl(struct tegra_i2c_dev *i2c_dev, void *data,
177 unsigned long reg, int len)
178{
179 readsl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len);
180}
181
182static void tegra_i2c_mask_irq(struct tegra_i2c_dev *i2c_dev, u32 mask)
183{
184 u32 int_mask = i2c_readl(i2c_dev, I2C_INT_MASK);
185 int_mask &= ~mask;
186 i2c_writel(i2c_dev, int_mask, I2C_INT_MASK);
187}
188
189static void tegra_i2c_unmask_irq(struct tegra_i2c_dev *i2c_dev, u32 mask)
190{
191 u32 int_mask = i2c_readl(i2c_dev, I2C_INT_MASK);
192 int_mask |= mask;
193 i2c_writel(i2c_dev, int_mask, I2C_INT_MASK);
194}
195
196static int tegra_i2c_flush_fifos(struct tegra_i2c_dev *i2c_dev)
197{
198 unsigned long timeout = jiffies + HZ;
199 u32 val = i2c_readl(i2c_dev, I2C_FIFO_CONTROL);
200 val |= I2C_FIFO_CONTROL_TX_FLUSH | I2C_FIFO_CONTROL_RX_FLUSH;
201 i2c_writel(i2c_dev, val, I2C_FIFO_CONTROL);
202
203 while (i2c_readl(i2c_dev, I2C_FIFO_CONTROL) &
204 (I2C_FIFO_CONTROL_TX_FLUSH | I2C_FIFO_CONTROL_RX_FLUSH)) {
205 if (time_after(jiffies, timeout)) {
206 dev_warn(i2c_dev->dev, "timeout waiting for fifo flush\n");
207 return -ETIMEDOUT;
208 }
209 msleep(1);
210 }
211 return 0;
212}
213
214static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_dev *i2c_dev)
215{
216 u32 val;
217 int rx_fifo_avail;
218 u8 *buf = i2c_dev->msg_buf;
219 size_t buf_remaining = i2c_dev->msg_buf_remaining;
220 int words_to_transfer;
221
222 val = i2c_readl(i2c_dev, I2C_FIFO_STATUS);
223 rx_fifo_avail = (val & I2C_FIFO_STATUS_RX_MASK) >>
224 I2C_FIFO_STATUS_RX_SHIFT;
225
226 /* Rounds down to not include partial word at the end of buf */
227 words_to_transfer = buf_remaining / BYTES_PER_FIFO_WORD;
228 if (words_to_transfer > rx_fifo_avail)
229 words_to_transfer = rx_fifo_avail;
230
231 i2c_readsl(i2c_dev, buf, I2C_RX_FIFO, words_to_transfer);
232
233 buf += words_to_transfer * BYTES_PER_FIFO_WORD;
234 buf_remaining -= words_to_transfer * BYTES_PER_FIFO_WORD;
235 rx_fifo_avail -= words_to_transfer;
236
237 /*
238 * If there is a partial word at the end of buf, handle it manually to
239 * prevent overwriting past the end of buf
240 */
241 if (rx_fifo_avail > 0 && buf_remaining > 0) {
242 BUG_ON(buf_remaining > 3);
243 val = i2c_readl(i2c_dev, I2C_RX_FIFO);
244 memcpy(buf, &val, buf_remaining);
245 buf_remaining = 0;
246 rx_fifo_avail--;
247 }
248
249 BUG_ON(rx_fifo_avail > 0 && buf_remaining > 0);
250 i2c_dev->msg_buf_remaining = buf_remaining;
251 i2c_dev->msg_buf = buf;
252 return 0;
253}
254
255static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_dev *i2c_dev)
256{
257 u32 val;
258 int tx_fifo_avail;
259 u8 *buf = i2c_dev->msg_buf;
260 size_t buf_remaining = i2c_dev->msg_buf_remaining;
261 int words_to_transfer;
262
263 val = i2c_readl(i2c_dev, I2C_FIFO_STATUS);
264 tx_fifo_avail = (val & I2C_FIFO_STATUS_TX_MASK) >>
265 I2C_FIFO_STATUS_TX_SHIFT;
266
267 /* Rounds down to not include partial word at the end of buf */
268 words_to_transfer = buf_remaining / BYTES_PER_FIFO_WORD;
269 if (words_to_transfer > tx_fifo_avail)
270 words_to_transfer = tx_fifo_avail;
271
272 i2c_writesl(i2c_dev, buf, I2C_TX_FIFO, words_to_transfer);
273
274 buf += words_to_transfer * BYTES_PER_FIFO_WORD;
275 buf_remaining -= words_to_transfer * BYTES_PER_FIFO_WORD;
276 tx_fifo_avail -= words_to_transfer;
277
278 /*
279 * If there is a partial word at the end of buf, handle it manually to
280 * prevent reading past the end of buf, which could cross a page
281 * boundary and fault.
282 */
283 if (tx_fifo_avail > 0 && buf_remaining > 0) {
284 BUG_ON(buf_remaining > 3);
285 memcpy(&val, buf, buf_remaining);
286 i2c_writel(i2c_dev, val, I2C_TX_FIFO);
287 buf_remaining = 0;
288 tx_fifo_avail--;
289 }
290
291 BUG_ON(tx_fifo_avail > 0 && buf_remaining > 0);
292 i2c_dev->msg_buf_remaining = buf_remaining;
293 i2c_dev->msg_buf = buf;
294 return 0;
295}
296
297/*
298 * One of the Tegra I2C blocks is inside the DVC (Digital Voltage Controller)
299 * block. This block is identical to the rest of the I2C blocks, except that
300 * it only supports master mode, it has registers moved around, and it needs
301 * some extra init to get it into I2C mode. The register moves are handled
302 * by i2c_readl and i2c_writel
303 */
304static void tegra_dvc_init(struct tegra_i2c_dev *i2c_dev)
305{
306 u32 val = 0;
307 val = dvc_readl(i2c_dev, DVC_CTRL_REG3);
308 val |= DVC_CTRL_REG3_SW_PROG;
309 val |= DVC_CTRL_REG3_I2C_DONE_INTR_EN;
310 dvc_writel(i2c_dev, val, DVC_CTRL_REG3);
311
312 val = dvc_readl(i2c_dev, DVC_CTRL_REG1);
313 val |= DVC_CTRL_REG1_INTR_EN;
314 dvc_writel(i2c_dev, val, DVC_CTRL_REG1);
315}
316
317static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
318{
319 u32 val;
320 int err = 0;
321
322 clk_enable(i2c_dev->clk);
323
324 tegra_periph_reset_assert(i2c_dev->clk);
325 udelay(2);
326 tegra_periph_reset_deassert(i2c_dev->clk);
327
328 if (i2c_dev->is_dvc)
329 tegra_dvc_init(i2c_dev);
330
331 val = I2C_CNFG_NEW_MASTER_FSM | I2C_CNFG_PACKET_MODE_EN;
332 i2c_writel(i2c_dev, val, I2C_CNFG);
333 i2c_writel(i2c_dev, 0, I2C_INT_MASK);
334 clk_set_rate(i2c_dev->clk, i2c_dev->bus_clk_rate * 8);
335
Kenneth Waters65a1a0a2011-04-25 12:29:54 -0600336 if (!i2c_dev->is_dvc) {
337 u32 sl_cfg = i2c_readl(i2c_dev, I2C_SL_CNFG);
338 i2c_writel(i2c_dev, sl_cfg | I2C_SL_CNFG_NEWSL, I2C_SL_CNFG);
339 }
340
Colin Crossdb811ca2011-02-20 17:14:21 -0800341 val = 7 << I2C_FIFO_CONTROL_TX_TRIG_SHIFT |
342 0 << I2C_FIFO_CONTROL_RX_TRIG_SHIFT;
343 i2c_writel(i2c_dev, val, I2C_FIFO_CONTROL);
344
345 if (tegra_i2c_flush_fifos(i2c_dev))
346 err = -ETIMEDOUT;
347
348 clk_disable(i2c_dev->clk);
Todd Poynorcb63c622011-04-25 15:32:25 -0600349
350 if (i2c_dev->irq_disabled) {
351 i2c_dev->irq_disabled = 0;
352 enable_irq(i2c_dev->irq);
353 }
354
Colin Crossdb811ca2011-02-20 17:14:21 -0800355 return err;
356}
357
358static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
359{
360 u32 status;
361 const u32 status_err = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
362 struct tegra_i2c_dev *i2c_dev = dev_id;
363
364 status = i2c_readl(i2c_dev, I2C_INT_STATUS);
365
366 if (status == 0) {
Todd Poynorcb63c622011-04-25 15:32:25 -0600367 dev_warn(i2c_dev->dev, "irq status 0 %08x %08x %08x\n",
368 i2c_readl(i2c_dev, I2C_PACKET_TRANSFER_STATUS),
369 i2c_readl(i2c_dev, I2C_STATUS),
370 i2c_readl(i2c_dev, I2C_CNFG));
371 i2c_dev->msg_err |= I2C_ERR_UNKNOWN_INTERRUPT;
372
373 if (!i2c_dev->irq_disabled) {
374 disable_irq_nosync(i2c_dev->irq);
375 i2c_dev->irq_disabled = 1;
376 }
377
378 complete(&i2c_dev->msg_complete);
379 goto err;
Colin Crossdb811ca2011-02-20 17:14:21 -0800380 }
381
382 if (unlikely(status & status_err)) {
383 if (status & I2C_INT_NO_ACK)
384 i2c_dev->msg_err |= I2C_ERR_NO_ACK;
385 if (status & I2C_INT_ARBITRATION_LOST)
386 i2c_dev->msg_err |= I2C_ERR_ARBITRATION_LOST;
387 complete(&i2c_dev->msg_complete);
388 goto err;
389 }
390
391 if (i2c_dev->msg_read && (status & I2C_INT_RX_FIFO_DATA_REQ)) {
392 if (i2c_dev->msg_buf_remaining)
393 tegra_i2c_empty_rx_fifo(i2c_dev);
394 else
395 BUG();
396 }
397
398 if (!i2c_dev->msg_read && (status & I2C_INT_TX_FIFO_DATA_REQ)) {
399 if (i2c_dev->msg_buf_remaining)
400 tegra_i2c_fill_tx_fifo(i2c_dev);
401 else
402 tegra_i2c_mask_irq(i2c_dev, I2C_INT_TX_FIFO_DATA_REQ);
403 }
404
405 if ((status & I2C_INT_PACKET_XFER_COMPLETE) &&
406 !i2c_dev->msg_buf_remaining)
407 complete(&i2c_dev->msg_complete);
408
409 i2c_writel(i2c_dev, status, I2C_INT_STATUS);
410 if (i2c_dev->is_dvc)
411 dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
412 return IRQ_HANDLED;
413err:
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300414 /* An error occurred, mask all interrupts */
Colin Crossdb811ca2011-02-20 17:14:21 -0800415 tegra_i2c_mask_irq(i2c_dev, I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST |
416 I2C_INT_PACKET_XFER_COMPLETE | I2C_INT_TX_FIFO_DATA_REQ |
417 I2C_INT_RX_FIFO_DATA_REQ);
418 i2c_writel(i2c_dev, status, I2C_INT_STATUS);
Todd Poynorcb63c622011-04-25 15:32:25 -0600419 if (i2c_dev->is_dvc)
420 dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
Colin Crossdb811ca2011-02-20 17:14:21 -0800421 return IRQ_HANDLED;
422}
423
424static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
425 struct i2c_msg *msg, int stop)
426{
427 u32 packet_header;
428 u32 int_mask;
429 int ret;
430
431 tegra_i2c_flush_fifos(i2c_dev);
432 i2c_writel(i2c_dev, 0xFF, I2C_INT_STATUS);
433
434 if (msg->len == 0)
435 return -EINVAL;
436
437 i2c_dev->msg_buf = msg->buf;
438 i2c_dev->msg_buf_remaining = msg->len;
439 i2c_dev->msg_err = I2C_ERR_NONE;
440 i2c_dev->msg_read = (msg->flags & I2C_M_RD);
441 INIT_COMPLETION(i2c_dev->msg_complete);
442
443 packet_header = (0 << PACKET_HEADER0_HEADER_SIZE_SHIFT) |
444 PACKET_HEADER0_PROTOCOL_I2C |
445 (i2c_dev->cont_id << PACKET_HEADER0_CONT_ID_SHIFT) |
446 (1 << PACKET_HEADER0_PACKET_ID_SHIFT);
447 i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO);
448
449 packet_header = msg->len - 1;
450 i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO);
451
452 packet_header = msg->addr << I2C_HEADER_SLAVE_ADDR_SHIFT;
453 packet_header |= I2C_HEADER_IE_ENABLE;
Erik Gilling2078cf32011-04-25 15:32:26 -0600454 if (!stop)
455 packet_header |= I2C_HEADER_REPEAT_START;
Colin Crossdb811ca2011-02-20 17:14:21 -0800456 if (msg->flags & I2C_M_TEN)
457 packet_header |= I2C_HEADER_10BIT_ADDR;
458 if (msg->flags & I2C_M_IGNORE_NAK)
459 packet_header |= I2C_HEADER_CONT_ON_NAK;
Colin Crossdb811ca2011-02-20 17:14:21 -0800460 if (msg->flags & I2C_M_RD)
461 packet_header |= I2C_HEADER_READ;
462 i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO);
463
464 if (!(msg->flags & I2C_M_RD))
465 tegra_i2c_fill_tx_fifo(i2c_dev);
466
467 int_mask = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST;
468 if (msg->flags & I2C_M_RD)
469 int_mask |= I2C_INT_RX_FIFO_DATA_REQ;
470 else if (i2c_dev->msg_buf_remaining)
471 int_mask |= I2C_INT_TX_FIFO_DATA_REQ;
472 tegra_i2c_unmask_irq(i2c_dev, int_mask);
473 dev_dbg(i2c_dev->dev, "unmasked irq: %02x\n",
474 i2c_readl(i2c_dev, I2C_INT_MASK));
475
476 ret = wait_for_completion_timeout(&i2c_dev->msg_complete, TEGRA_I2C_TIMEOUT);
477 tegra_i2c_mask_irq(i2c_dev, int_mask);
478
479 if (WARN_ON(ret == 0)) {
480 dev_err(i2c_dev->dev, "i2c transfer timed out\n");
481
482 tegra_i2c_init(i2c_dev);
483 return -ETIMEDOUT;
484 }
485
486 dev_dbg(i2c_dev->dev, "transfer complete: %d %d %d\n",
487 ret, completion_done(&i2c_dev->msg_complete), i2c_dev->msg_err);
488
489 if (likely(i2c_dev->msg_err == I2C_ERR_NONE))
490 return 0;
491
492 tegra_i2c_init(i2c_dev);
493 if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
494 if (msg->flags & I2C_M_IGNORE_NAK)
495 return 0;
496 return -EREMOTEIO;
497 }
498
499 return -EIO;
500}
501
502static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
503 int num)
504{
505 struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
506 int i;
507 int ret = 0;
508
509 if (i2c_dev->is_suspended)
510 return -EBUSY;
511
512 clk_enable(i2c_dev->clk);
513 for (i = 0; i < num; i++) {
514 int stop = (i == (num - 1)) ? 1 : 0;
515 ret = tegra_i2c_xfer_msg(i2c_dev, &msgs[i], stop);
516 if (ret)
517 break;
518 }
519 clk_disable(i2c_dev->clk);
520 return ret ?: i;
521}
522
523static u32 tegra_i2c_func(struct i2c_adapter *adap)
524{
525 return I2C_FUNC_I2C;
526}
527
528static const struct i2c_algorithm tegra_i2c_algo = {
529 .master_xfer = tegra_i2c_xfer,
530 .functionality = tegra_i2c_func,
531};
532
533static int tegra_i2c_probe(struct platform_device *pdev)
534{
535 struct tegra_i2c_dev *i2c_dev;
536 struct tegra_i2c_platform_data *pdata = pdev->dev.platform_data;
537 struct resource *res;
538 struct resource *iomem;
539 struct clk *clk;
540 struct clk *i2c_clk;
541 void *base;
542 int irq;
543 int ret = 0;
544
545 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
546 if (!res) {
547 dev_err(&pdev->dev, "no mem resource\n");
548 return -EINVAL;
549 }
550 iomem = request_mem_region(res->start, resource_size(res), pdev->name);
551 if (!iomem) {
552 dev_err(&pdev->dev, "I2C region already claimed\n");
553 return -EBUSY;
554 }
555
556 base = ioremap(iomem->start, resource_size(iomem));
557 if (!base) {
558 dev_err(&pdev->dev, "Cannot ioremap I2C region\n");
559 return -ENOMEM;
560 }
561
562 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
563 if (!res) {
564 dev_err(&pdev->dev, "no irq resource\n");
565 ret = -EINVAL;
566 goto err_iounmap;
567 }
568 irq = res->start;
569
570 clk = clk_get(&pdev->dev, NULL);
571 if (IS_ERR(clk)) {
572 dev_err(&pdev->dev, "missing controller clock");
573 ret = PTR_ERR(clk);
574 goto err_release_region;
575 }
576
577 i2c_clk = clk_get(&pdev->dev, "i2c");
578 if (IS_ERR(i2c_clk)) {
579 dev_err(&pdev->dev, "missing bus clock");
580 ret = PTR_ERR(i2c_clk);
581 goto err_clk_put;
582 }
583
584 i2c_dev = kzalloc(sizeof(struct tegra_i2c_dev), GFP_KERNEL);
585 if (!i2c_dev) {
586 ret = -ENOMEM;
587 goto err_i2c_clk_put;
588 }
589
590 i2c_dev->base = base;
591 i2c_dev->clk = clk;
592 i2c_dev->i2c_clk = i2c_clk;
593 i2c_dev->iomem = iomem;
594 i2c_dev->adapter.algo = &tegra_i2c_algo;
595 i2c_dev->irq = irq;
596 i2c_dev->cont_id = pdev->id;
597 i2c_dev->dev = &pdev->dev;
598 i2c_dev->bus_clk_rate = pdata ? pdata->bus_clk_rate : 100000;
599
600 if (pdev->id == 3)
601 i2c_dev->is_dvc = 1;
602 init_completion(&i2c_dev->msg_complete);
603
604 platform_set_drvdata(pdev, i2c_dev);
605
606 ret = tegra_i2c_init(i2c_dev);
607 if (ret) {
608 dev_err(&pdev->dev, "Failed to initialize i2c controller");
609 goto err_free;
610 }
611
612 ret = request_irq(i2c_dev->irq, tegra_i2c_isr, 0, pdev->name, i2c_dev);
613 if (ret) {
614 dev_err(&pdev->dev, "Failed to request irq %i\n", i2c_dev->irq);
615 goto err_free;
616 }
617
618 clk_enable(i2c_dev->i2c_clk);
619
620 i2c_set_adapdata(&i2c_dev->adapter, i2c_dev);
621 i2c_dev->adapter.owner = THIS_MODULE;
622 i2c_dev->adapter.class = I2C_CLASS_HWMON;
623 strlcpy(i2c_dev->adapter.name, "Tegra I2C adapter",
624 sizeof(i2c_dev->adapter.name));
625 i2c_dev->adapter.algo = &tegra_i2c_algo;
626 i2c_dev->adapter.dev.parent = &pdev->dev;
627 i2c_dev->adapter.nr = pdev->id;
628
629 ret = i2c_add_numbered_adapter(&i2c_dev->adapter);
630 if (ret) {
631 dev_err(&pdev->dev, "Failed to add I2C adapter\n");
632 goto err_free_irq;
633 }
634
635 return 0;
636err_free_irq:
637 free_irq(i2c_dev->irq, i2c_dev);
638err_free:
639 kfree(i2c_dev);
640err_i2c_clk_put:
641 clk_put(i2c_clk);
642err_clk_put:
643 clk_put(clk);
644err_release_region:
645 release_mem_region(iomem->start, resource_size(iomem));
646err_iounmap:
647 iounmap(base);
648 return ret;
649}
650
651static int tegra_i2c_remove(struct platform_device *pdev)
652{
653 struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
654 i2c_del_adapter(&i2c_dev->adapter);
655 free_irq(i2c_dev->irq, i2c_dev);
656 clk_put(i2c_dev->i2c_clk);
657 clk_put(i2c_dev->clk);
658 release_mem_region(i2c_dev->iomem->start,
659 resource_size(i2c_dev->iomem));
660 iounmap(i2c_dev->base);
661 kfree(i2c_dev);
662 return 0;
663}
664
665#ifdef CONFIG_PM
666static int tegra_i2c_suspend(struct platform_device *pdev, pm_message_t state)
667{
668 struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
669
670 i2c_lock_adapter(&i2c_dev->adapter);
671 i2c_dev->is_suspended = true;
672 i2c_unlock_adapter(&i2c_dev->adapter);
673
674 return 0;
675}
676
677static int tegra_i2c_resume(struct platform_device *pdev)
678{
679 struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
680 int ret;
681
682 i2c_lock_adapter(&i2c_dev->adapter);
683
684 ret = tegra_i2c_init(i2c_dev);
685
686 if (ret) {
687 i2c_unlock_adapter(&i2c_dev->adapter);
688 return ret;
689 }
690
691 i2c_dev->is_suspended = false;
692
693 i2c_unlock_adapter(&i2c_dev->adapter);
694
695 return 0;
696}
697#endif
698
699static struct platform_driver tegra_i2c_driver = {
700 .probe = tegra_i2c_probe,
701 .remove = tegra_i2c_remove,
702#ifdef CONFIG_PM
703 .suspend = tegra_i2c_suspend,
704 .resume = tegra_i2c_resume,
705#endif
706 .driver = {
707 .name = "tegra-i2c",
708 .owner = THIS_MODULE,
709 },
710};
711
712static int __init tegra_i2c_init_driver(void)
713{
714 return platform_driver_register(&tegra_i2c_driver);
715}
716
717static void __exit tegra_i2c_exit_driver(void)
718{
719 platform_driver_unregister(&tegra_i2c_driver);
720}
721
722subsys_initcall(tegra_i2c_init_driver);
723module_exit(tegra_i2c_exit_driver);
724
725MODULE_DESCRIPTION("nVidia Tegra2 I2C Bus Controller driver");
726MODULE_AUTHOR("Colin Cross");
727MODULE_LICENSE("GPL v2");