blob: 5e6f1eed4f83f233da76202c70d7564f773d3e1c [file] [log] [blame]
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301/*
Linus Walleij1804edd2010-09-23 09:03:40 +02002 * Copyright (C) 2009 ST-Ericsson SA
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05303 * Copyright (C) 2009 STMicroelectronics
4 *
5 * I2C master mode controller driver, used in Nomadik 8815
6 * and Ux500 platforms.
7 *
8 * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
9 * Author: Sachin Verma <sachin.verma@st.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2, as
13 * published by the Free Software Foundation.
14 */
15#include <linux/init.h>
16#include <linux/module.h>
Alessandro Rubini23560212012-06-11 22:56:38 +020017#include <linux/amba/bus.h>
18#include <linux/atomic.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090019#include <linux/slab.h>
srinidhi kasagar3f9900f2010-02-01 19:44:54 +053020#include <linux/interrupt.h>
21#include <linux/i2c.h>
22#include <linux/err.h>
23#include <linux/clk.h>
24#include <linux/io.h>
Jonas Aberga20d2392011-05-13 12:29:02 +020025#include <linux/regulator/consumer.h>
Rabin Vincentb0e751a2011-05-13 12:30:07 +020026#include <linux/pm_runtime.h>
Alessandro Rubiniaf97bac2012-06-11 22:56:26 +020027#include <linux/platform_data/i2c-nomadik.h>
srinidhi kasagar3f9900f2010-02-01 19:44:54 +053028
29#define DRIVER_NAME "nmk-i2c"
30
31/* I2C Controller register offsets */
32#define I2C_CR (0x000)
33#define I2C_SCR (0x004)
34#define I2C_HSMCR (0x008)
35#define I2C_MCR (0x00C)
36#define I2C_TFR (0x010)
37#define I2C_SR (0x014)
38#define I2C_RFR (0x018)
39#define I2C_TFTR (0x01C)
40#define I2C_RFTR (0x020)
41#define I2C_DMAR (0x024)
42#define I2C_BRCR (0x028)
43#define I2C_IMSCR (0x02C)
44#define I2C_RISR (0x030)
45#define I2C_MISR (0x034)
46#define I2C_ICR (0x038)
47
48/* Control registers */
49#define I2C_CR_PE (0x1 << 0) /* Peripheral Enable */
50#define I2C_CR_OM (0x3 << 1) /* Operating mode */
51#define I2C_CR_SAM (0x1 << 3) /* Slave addressing mode */
52#define I2C_CR_SM (0x3 << 4) /* Speed mode */
53#define I2C_CR_SGCM (0x1 << 6) /* Slave general call mode */
54#define I2C_CR_FTX (0x1 << 7) /* Flush Transmit */
55#define I2C_CR_FRX (0x1 << 8) /* Flush Receive */
56#define I2C_CR_DMA_TX_EN (0x1 << 9) /* DMA Tx enable */
57#define I2C_CR_DMA_RX_EN (0x1 << 10) /* DMA Rx Enable */
58#define I2C_CR_DMA_SLE (0x1 << 11) /* DMA sync. logic enable */
59#define I2C_CR_LM (0x1 << 12) /* Loopback mode */
60#define I2C_CR_FON (0x3 << 13) /* Filtering on */
61#define I2C_CR_FS (0x3 << 15) /* Force stop enable */
62
63/* Master controller (MCR) register */
64#define I2C_MCR_OP (0x1 << 0) /* Operation */
65#define I2C_MCR_A7 (0x7f << 1) /* 7-bit address */
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +020066#define I2C_MCR_EA10 (0x7 << 8) /* 10-bit Extended address */
srinidhi kasagar3f9900f2010-02-01 19:44:54 +053067#define I2C_MCR_SB (0x1 << 11) /* Extended address */
68#define I2C_MCR_AM (0x3 << 12) /* Address type */
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +020069#define I2C_MCR_STOP (0x1 << 14) /* Stop condition */
70#define I2C_MCR_LENGTH (0x7ff << 15) /* Transaction length */
srinidhi kasagar3f9900f2010-02-01 19:44:54 +053071
72/* Status register (SR) */
73#define I2C_SR_OP (0x3 << 0) /* Operation */
74#define I2C_SR_STATUS (0x3 << 2) /* controller status */
75#define I2C_SR_CAUSE (0x7 << 4) /* Abort cause */
76#define I2C_SR_TYPE (0x3 << 7) /* Receive type */
77#define I2C_SR_LENGTH (0x7ff << 9) /* Transfer length */
78
79/* Interrupt mask set/clear (IMSCR) bits */
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +020080#define I2C_IT_TXFE (0x1 << 0)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +053081#define I2C_IT_TXFNE (0x1 << 1)
82#define I2C_IT_TXFF (0x1 << 2)
83#define I2C_IT_TXFOVR (0x1 << 3)
84#define I2C_IT_RXFE (0x1 << 4)
85#define I2C_IT_RXFNF (0x1 << 5)
86#define I2C_IT_RXFF (0x1 << 6)
87#define I2C_IT_RFSR (0x1 << 16)
88#define I2C_IT_RFSE (0x1 << 17)
89#define I2C_IT_WTSR (0x1 << 18)
90#define I2C_IT_MTD (0x1 << 19)
91#define I2C_IT_STD (0x1 << 20)
92#define I2C_IT_MAL (0x1 << 24)
93#define I2C_IT_BERR (0x1 << 25)
94#define I2C_IT_MTDWS (0x1 << 28)
95
96#define GEN_MASK(val, mask, sb) (((val) << (sb)) & (mask))
97
98/* some bits in ICR are reserved */
99#define I2C_CLEAR_ALL_INTS 0x131f007f
100
101/* first three msb bits are reserved */
102#define IRQ_MASK(mask) (mask & 0x1fffffff)
103
104/* maximum threshold value */
105#define MAX_I2C_FIFO_THRESHOLD 15
106
107enum i2c_status {
108 I2C_NOP,
109 I2C_ON_GOING,
110 I2C_OK,
111 I2C_ABORT
112};
113
114/* operation */
115enum i2c_operation {
116 I2C_NO_OPERATION = 0xff,
117 I2C_WRITE = 0x00,
118 I2C_READ = 0x01
119};
120
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530121/**
122 * struct i2c_nmk_client - client specific data
123 * @slave_adr: 7-bit slave address
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300124 * @count: no. bytes to be transferred
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530125 * @buffer: client data buffer
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300126 * @xfer_bytes: bytes transferred till now
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530127 * @operation: current I2C operation
128 */
129struct i2c_nmk_client {
130 unsigned short slave_adr;
131 unsigned long count;
132 unsigned char *buffer;
133 unsigned long xfer_bytes;
134 enum i2c_operation operation;
135};
136
137/**
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200138 * struct nmk_i2c_dev - private data structure of the controller.
Alessandro Rubini23560212012-06-11 22:56:38 +0200139 * @adev: parent amba device.
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200140 * @adap: corresponding I2C adapter.
141 * @irq: interrupt line for the controller.
142 * @virtbase: virtual io memory area.
143 * @clk: hardware i2c block clock.
144 * @cfg: machine provided controller configuration.
145 * @cli: holder of client specific data.
146 * @stop: stop condition.
147 * @xfer_complete: acknowledge completion for a I2C message.
148 * @result: controller propogated result.
149 * @regulator: pointer to i2c regulator.
150 * @busy: Busy doing transfer.
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530151 */
152struct nmk_i2c_dev {
Alessandro Rubini23560212012-06-11 22:56:38 +0200153 struct amba_device *adev;
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200154 struct i2c_adapter adap;
155 int irq;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530156 void __iomem *virtbase;
157 struct clk *clk;
158 struct nmk_i2c_controller cfg;
159 struct i2c_nmk_client cli;
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200160 int stop;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530161 struct completion xfer_complete;
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200162 int result;
Jonas Aberga20d2392011-05-13 12:29:02 +0200163 struct regulator *regulator;
164 bool busy;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530165};
166
167/* controller's abort causes */
168static const char *abort_causes[] = {
169 "no ack received after address transmission",
170 "no ack received during data phase",
171 "ack received after xmission of master code",
172 "master lost arbitration",
173 "slave restarts",
174 "slave reset",
175 "overflow, maxsize is 2047 bytes",
176};
177
178static inline void i2c_set_bit(void __iomem *reg, u32 mask)
179{
180 writel(readl(reg) | mask, reg);
181}
182
183static inline void i2c_clr_bit(void __iomem *reg, u32 mask)
184{
185 writel(readl(reg) & ~mask, reg);
186}
187
188/**
189 * flush_i2c_fifo() - This function flushes the I2C FIFO
190 * @dev: private data of I2C Driver
191 *
192 * This function flushes the I2C Tx and Rx FIFOs. It returns
193 * 0 on successful flushing of FIFO
194 */
195static int flush_i2c_fifo(struct nmk_i2c_dev *dev)
196{
197#define LOOP_ATTEMPTS 10
198 int i;
199 unsigned long timeout;
200
201 /*
202 * flush the transmit and receive FIFO. The flushing
203 * operation takes several cycles before to be completed.
204 * On the completion, the I2C internal logic clears these
205 * bits, until then no one must access Tx, Rx FIFO and
206 * should poll on these bits waiting for the completion.
207 */
208 writel((I2C_CR_FTX | I2C_CR_FRX), dev->virtbase + I2C_CR);
209
210 for (i = 0; i < LOOP_ATTEMPTS; i++) {
Virupax Sadashivpetimathcd20e4fa2011-05-13 12:29:46 +0200211 timeout = jiffies + dev->adap.timeout;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530212
213 while (!time_after(jiffies, timeout)) {
214 if ((readl(dev->virtbase + I2C_CR) &
215 (I2C_CR_FTX | I2C_CR_FRX)) == 0)
216 return 0;
217 }
218 }
219
Alessandro Rubini23560212012-06-11 22:56:38 +0200220 dev_err(&dev->adev->dev,
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200221 "flushing operation timed out giving up after %d attempts",
222 LOOP_ATTEMPTS);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530223
224 return -ETIMEDOUT;
225}
226
227/**
228 * disable_all_interrupts() - Disable all interrupts of this I2c Bus
229 * @dev: private data of I2C Driver
230 */
231static void disable_all_interrupts(struct nmk_i2c_dev *dev)
232{
233 u32 mask = IRQ_MASK(0);
234 writel(mask, dev->virtbase + I2C_IMSCR);
235}
236
237/**
238 * clear_all_interrupts() - Clear all interrupts of I2C Controller
239 * @dev: private data of I2C Driver
240 */
241static void clear_all_interrupts(struct nmk_i2c_dev *dev)
242{
243 u32 mask;
244 mask = IRQ_MASK(I2C_CLEAR_ALL_INTS);
245 writel(mask, dev->virtbase + I2C_ICR);
246}
247
248/**
249 * init_hw() - initialize the I2C hardware
250 * @dev: private data of I2C Driver
251 */
252static int init_hw(struct nmk_i2c_dev *dev)
253{
254 int stat;
255
256 stat = flush_i2c_fifo(dev);
257 if (stat)
Jonas Aberga20d2392011-05-13 12:29:02 +0200258 goto exit;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530259
260 /* disable the controller */
261 i2c_clr_bit(dev->virtbase + I2C_CR , I2C_CR_PE);
262
263 disable_all_interrupts(dev);
264
265 clear_all_interrupts(dev);
266
267 dev->cli.operation = I2C_NO_OPERATION;
268
Jonas Aberga20d2392011-05-13 12:29:02 +0200269exit:
Jonas Aberga20d2392011-05-13 12:29:02 +0200270 return stat;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530271}
272
273/* enable peripheral, master mode operation */
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200274#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530275
276/**
277 * load_i2c_mcr_reg() - load the MCR register
278 * @dev: private data of controller
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530279 * @flags: message flags
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530280 */
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530281static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *dev, u16 flags)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530282{
283 u32 mcr = 0;
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530284 unsigned short slave_adr_3msb_bits;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530285
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530286 mcr |= GEN_MASK(dev->cli.slave_adr, I2C_MCR_A7, 1);
287
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530288 if (unlikely(flags & I2C_M_TEN)) {
289 /* 10-bit address transaction */
290 mcr |= GEN_MASK(2, I2C_MCR_AM, 12);
291 /*
292 * Get the top 3 bits.
293 * EA10 represents extended address in MCR. This includes
294 * the extension (MSB bits) of the 7 bit address loaded
295 * in A7
296 */
297 slave_adr_3msb_bits = (dev->cli.slave_adr >> 7) & 0x7;
298
299 mcr |= GEN_MASK(slave_adr_3msb_bits, I2C_MCR_EA10, 8);
300 } else {
301 /* 7-bit address transaction */
302 mcr |= GEN_MASK(1, I2C_MCR_AM, 12);
303 }
304
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530305 /* start byte procedure not applied */
306 mcr |= GEN_MASK(0, I2C_MCR_SB, 11);
307
308 /* check the operation, master read/write? */
309 if (dev->cli.operation == I2C_WRITE)
310 mcr |= GEN_MASK(I2C_WRITE, I2C_MCR_OP, 0);
311 else
312 mcr |= GEN_MASK(I2C_READ, I2C_MCR_OP, 0);
313
314 /* stop or repeated start? */
315 if (dev->stop)
316 mcr |= GEN_MASK(1, I2C_MCR_STOP, 14);
317 else
318 mcr &= ~(GEN_MASK(1, I2C_MCR_STOP, 14));
319
320 mcr |= GEN_MASK(dev->cli.count, I2C_MCR_LENGTH, 15);
321
322 return mcr;
323}
324
325/**
326 * setup_i2c_controller() - setup the controller
327 * @dev: private data of controller
328 */
329static void setup_i2c_controller(struct nmk_i2c_dev *dev)
330{
331 u32 brcr1, brcr2;
332 u32 i2c_clk, div;
333
334 writel(0x0, dev->virtbase + I2C_CR);
335 writel(0x0, dev->virtbase + I2C_HSMCR);
336 writel(0x0, dev->virtbase + I2C_TFTR);
337 writel(0x0, dev->virtbase + I2C_RFTR);
338 writel(0x0, dev->virtbase + I2C_DMAR);
339
340 /*
341 * set the slsu:
342 *
343 * slsu defines the data setup time after SCL clock
344 * stretching in terms of i2c clk cycles. The
345 * needed setup time for the three modes are 250ns,
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300346 * 100ns, 10ns respectively thus leading to the values
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530347 * of 14, 6, 2 for a 48 MHz i2c clk.
348 */
349 writel(dev->cfg.slsu << 16, dev->virtbase + I2C_SCR);
350
351 i2c_clk = clk_get_rate(dev->clk);
352
353 /* fallback to std. mode if machine has not provided it */
354 if (dev->cfg.clk_freq == 0)
355 dev->cfg.clk_freq = 100000;
356
357 /*
358 * The spec says, in case of std. mode the divider is
359 * 2 whereas it is 3 for fast and fastplus mode of
360 * operation. TODO - high speed support.
361 */
362 div = (dev->cfg.clk_freq > 100000) ? 3 : 2;
363
364 /*
365 * generate the mask for baud rate counters. The controller
366 * has two baud rate counters. One is used for High speed
367 * operation, and the other is for std, fast mode, fast mode
368 * plus operation. Currently we do not supprt high speed mode
369 * so set brcr1 to 0.
370 */
371 brcr1 = 0 << 16;
372 brcr2 = (i2c_clk/(dev->cfg.clk_freq * div)) & 0xffff;
373
374 /* set the baud rate counter register */
375 writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR);
376
377 /*
378 * set the speed mode. Currently we support
379 * only standard and fast mode of operation
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300380 * TODO - support for fast mode plus (up to 1Mb/s)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530381 * and high speed (up to 3.4 Mb/s)
382 */
383 if (dev->cfg.sm > I2C_FREQ_MODE_FAST) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200384 dev_err(&dev->adev->dev,
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200385 "do not support this mode defaulting to std. mode\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530386 brcr2 = i2c_clk/(100000 * 2) & 0xffff;
387 writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR);
388 writel(I2C_FREQ_MODE_STANDARD << 4,
389 dev->virtbase + I2C_CR);
390 }
391 writel(dev->cfg.sm << 4, dev->virtbase + I2C_CR);
392
393 /* set the Tx and Rx FIFO threshold */
394 writel(dev->cfg.tft, dev->virtbase + I2C_TFTR);
395 writel(dev->cfg.rft, dev->virtbase + I2C_RFTR);
396}
397
398/**
399 * read_i2c() - Read from I2C client device
400 * @dev: private data of I2C Driver
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530401 * @flags: message flags
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530402 *
403 * This function reads from i2c client device when controller is in
404 * master mode. There is a completion timeout. If there is no transfer
405 * before timeout error is returned.
406 */
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530407static int read_i2c(struct nmk_i2c_dev *dev, u16 flags)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530408{
409 u32 status = 0;
410 u32 mcr;
411 u32 irq_mask = 0;
412 int timeout;
413
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530414 mcr = load_i2c_mcr_reg(dev, flags);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530415 writel(mcr, dev->virtbase + I2C_MCR);
416
417 /* load the current CR value */
418 writel(readl(dev->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR,
419 dev->virtbase + I2C_CR);
420
421 /* enable the controller */
422 i2c_set_bit(dev->virtbase + I2C_CR, I2C_CR_PE);
423
424 init_completion(&dev->xfer_complete);
425
426 /* enable interrupts by setting the mask */
427 irq_mask = (I2C_IT_RXFNF | I2C_IT_RXFF |
428 I2C_IT_MAL | I2C_IT_BERR);
429
430 if (dev->stop)
431 irq_mask |= I2C_IT_MTD;
432 else
433 irq_mask |= I2C_IT_MTDWS;
434
435 irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask);
436
437 writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask,
438 dev->virtbase + I2C_IMSCR);
439
srinidhi kasagar4b723a42011-08-09 20:17:22 +0200440 timeout = wait_for_completion_timeout(
Virupax Sadashivpetimathcd20e4fa2011-05-13 12:29:46 +0200441 &dev->xfer_complete, dev->adap.timeout);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530442
443 if (timeout < 0) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200444 dev_err(&dev->adev->dev,
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200445 "wait_for_completion_timeout "
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530446 "returned %d waiting for event\n", timeout);
447 status = timeout;
448 }
449
450 if (timeout == 0) {
Virupax Sadashivpetimath0511f642011-05-13 12:30:53 +0200451 /* Controller timed out */
Alessandro Rubini23560212012-06-11 22:56:38 +0200452 dev_err(&dev->adev->dev, "read from slave 0x%x timed out\n",
Virupax Sadashivpetimath4cb3f532011-05-13 12:29:55 +0200453 dev->cli.slave_adr);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530454 status = -ETIMEDOUT;
455 }
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530456 return status;
457}
458
Virupax Sadashivpetimath55355342011-05-13 12:30:34 +0200459static void fill_tx_fifo(struct nmk_i2c_dev *dev, int no_bytes)
460{
461 int count;
462
463 for (count = (no_bytes - 2);
464 (count > 0) &&
465 (dev->cli.count != 0);
466 count--) {
467 /* write to the Tx FIFO */
468 writeb(*dev->cli.buffer,
469 dev->virtbase + I2C_TFR);
470 dev->cli.buffer++;
471 dev->cli.count--;
472 dev->cli.xfer_bytes++;
473 }
474
475}
476
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530477/**
478 * write_i2c() - Write data to I2C client.
479 * @dev: private data of I2C Driver
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530480 * @flags: message flags
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530481 *
482 * This function writes data to I2C client
483 */
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530484static int write_i2c(struct nmk_i2c_dev *dev, u16 flags)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530485{
486 u32 status = 0;
487 u32 mcr;
488 u32 irq_mask = 0;
489 int timeout;
490
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530491 mcr = load_i2c_mcr_reg(dev, flags);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530492
493 writel(mcr, dev->virtbase + I2C_MCR);
494
495 /* load the current CR value */
496 writel(readl(dev->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR,
497 dev->virtbase + I2C_CR);
498
499 /* enable the controller */
500 i2c_set_bit(dev->virtbase + I2C_CR , I2C_CR_PE);
501
502 init_completion(&dev->xfer_complete);
503
504 /* enable interrupts by settings the masks */
Virupax Sadashivpetimath55355342011-05-13 12:30:34 +0200505 irq_mask = (I2C_IT_TXFOVR | I2C_IT_MAL | I2C_IT_BERR);
506
507 /* Fill the TX FIFO with transmit data */
508 fill_tx_fifo(dev, MAX_I2C_FIFO_THRESHOLD);
509
510 if (dev->cli.count != 0)
511 irq_mask |= I2C_IT_TXFNE;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530512
513 /*
514 * check if we want to transfer a single or multiple bytes, if so
515 * set the MTDWS bit (Master Transaction Done Without Stop)
516 * to start repeated start operation
517 */
518 if (dev->stop)
519 irq_mask |= I2C_IT_MTD;
520 else
521 irq_mask |= I2C_IT_MTDWS;
522
523 irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask);
524
525 writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask,
526 dev->virtbase + I2C_IMSCR);
527
srinidhi kasagar4b723a42011-08-09 20:17:22 +0200528 timeout = wait_for_completion_timeout(
Virupax Sadashivpetimathcd20e4fa2011-05-13 12:29:46 +0200529 &dev->xfer_complete, dev->adap.timeout);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530530
531 if (timeout < 0) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200532 dev_err(&dev->adev->dev,
Linus Walleijc8d47631a2011-08-09 20:17:29 +0200533 "wait_for_completion_timeout "
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530534 "returned %d waiting for event\n", timeout);
535 status = timeout;
536 }
537
538 if (timeout == 0) {
Virupax Sadashivpetimath0511f642011-05-13 12:30:53 +0200539 /* Controller timed out */
Alessandro Rubini23560212012-06-11 22:56:38 +0200540 dev_err(&dev->adev->dev, "write to slave 0x%x timed out\n",
Virupax Sadashivpetimath4cb3f532011-05-13 12:29:55 +0200541 dev->cli.slave_adr);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530542 status = -ETIMEDOUT;
543 }
544
545 return status;
546}
547
548/**
Linus Walleij82a44132011-05-13 12:31:01 +0200549 * nmk_i2c_xfer_one() - transmit a single I2C message
550 * @dev: device with a message encoded into it
551 * @flags: message flags
552 */
553static int nmk_i2c_xfer_one(struct nmk_i2c_dev *dev, u16 flags)
554{
555 int status;
556
557 if (flags & I2C_M_RD) {
558 /* read operation */
559 dev->cli.operation = I2C_READ;
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530560 status = read_i2c(dev, flags);
Linus Walleij82a44132011-05-13 12:31:01 +0200561 } else {
562 /* write operation */
563 dev->cli.operation = I2C_WRITE;
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530564 status = write_i2c(dev, flags);
Linus Walleij82a44132011-05-13 12:31:01 +0200565 }
566
567 if (status || (dev->result)) {
568 u32 i2c_sr;
569 u32 cause;
570
571 i2c_sr = readl(dev->virtbase + I2C_SR);
572 /*
573 * Check if the controller I2C operation status
574 * is set to ABORT(11b).
575 */
576 if (((i2c_sr >> 2) & 0x3) == 0x3) {
577 /* get the abort cause */
578 cause = (i2c_sr >> 4) & 0x7;
Alessandro Rubini23560212012-06-11 22:56:38 +0200579 dev_err(&dev->adev->dev, "%s\n",
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200580 cause >= ARRAY_SIZE(abort_causes) ?
Linus Walleij82a44132011-05-13 12:31:01 +0200581 "unknown reason" :
582 abort_causes[cause]);
583 }
584
585 (void) init_hw(dev);
586
587 status = status ? status : dev->result;
588 }
589
590 return status;
591}
592
593/**
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530594 * nmk_i2c_xfer() - I2C transfer function used by kernel framework
Linus Walleij1804edd2010-09-23 09:03:40 +0200595 * @i2c_adap: Adapter pointer to the controller
596 * @msgs: Pointer to data to be written.
597 * @num_msgs: Number of messages to be executed
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530598 *
599 * This is the function called by the generic kernel i2c_transfer()
600 * or i2c_smbus...() API calls. Note that this code is protected by the
601 * semaphore set in the kernel i2c_transfer() function.
602 *
603 * NOTE:
604 * READ TRANSFER : We impose a restriction of the first message to be the
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200605 * index message for any read transaction.
606 * - a no index is coded as '0',
607 * - 2byte big endian index is coded as '3'
608 * !!! msg[0].buf holds the actual index.
609 * This is compatible with generic messages of smbus emulator
610 * that send a one byte index.
611 * eg. a I2C transation to read 2 bytes from index 0
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530612 * idx = 0;
613 * msg[0].addr = client->addr;
614 * msg[0].flags = 0x0;
615 * msg[0].len = 1;
616 * msg[0].buf = &idx;
617 *
618 * msg[1].addr = client->addr;
619 * msg[1].flags = I2C_M_RD;
620 * msg[1].len = 2;
621 * msg[1].buf = rd_buff
622 * i2c_transfer(adap, msg, 2);
623 *
624 * WRITE TRANSFER : The I2C standard interface interprets all data as payload.
625 * If you want to emulate an SMBUS write transaction put the
626 * index as first byte(or first and second) in the payload.
627 * eg. a I2C transation to write 2 bytes from index 1
628 * wr_buff[0] = 0x1;
629 * wr_buff[1] = 0x23;
630 * wr_buff[2] = 0x46;
631 * msg[0].flags = 0x0;
632 * msg[0].len = 3;
633 * msg[0].buf = wr_buff;
634 * i2c_transfer(adap, msg, 1);
635 *
636 * To read or write a block of data (multiple bytes) using SMBUS emulation
637 * please use the i2c_smbus_read_i2c_block_data()
638 * or i2c_smbus_write_i2c_block_data() API
639 */
640static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap,
641 struct i2c_msg msgs[], int num_msgs)
642{
643 int status;
644 int i;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530645 struct nmk_i2c_dev *dev = i2c_get_adapdata(i2c_adap);
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200646 int j;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530647
Jonas Aberga20d2392011-05-13 12:29:02 +0200648 dev->busy = true;
649
650 if (dev->regulator)
651 regulator_enable(dev->regulator);
Alessandro Rubini23560212012-06-11 22:56:38 +0200652 pm_runtime_get_sync(&dev->adev->dev);
Jonas Aberga20d2392011-05-13 12:29:02 +0200653
Linus Walleij8ef4f4e2010-09-23 09:03:55 +0200654 clk_enable(dev->clk);
655
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200656 status = init_hw(dev);
657 if (status)
658 goto out;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530659
Linus Walleij82a44132011-05-13 12:31:01 +0200660 /* Attempt three times to send the message queue */
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200661 for (j = 0; j < 3; j++) {
662 /* setup the i2c controller */
663 setup_i2c_controller(dev);
Jonas Aberga20d2392011-05-13 12:29:02 +0200664
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200665 for (i = 0; i < num_msgs; i++) {
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200666 dev->cli.slave_adr = msgs[i].addr;
667 dev->cli.buffer = msgs[i].buf;
668 dev->cli.count = msgs[i].len;
669 dev->stop = (i < (num_msgs - 1)) ? 0 : 1;
670 dev->result = 0;
671
Linus Walleij82a44132011-05-13 12:31:01 +0200672 status = nmk_i2c_xfer_one(dev, msgs[i].flags);
673 if (status != 0)
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200674 break;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530675 }
Virupax Sadashivpetimathebd10e02011-05-13 12:30:23 +0200676 if (status == 0)
677 break;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530678 }
Jonas Aberga20d2392011-05-13 12:29:02 +0200679
680out:
Linus Walleij8ef4f4e2010-09-23 09:03:55 +0200681 clk_disable(dev->clk);
Alessandro Rubini23560212012-06-11 22:56:38 +0200682 pm_runtime_put_sync(&dev->adev->dev);
Jonas Aberga20d2392011-05-13 12:29:02 +0200683 if (dev->regulator)
684 regulator_disable(dev->regulator);
685
686 dev->busy = false;
Linus Walleij8ef4f4e2010-09-23 09:03:55 +0200687
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530688 /* return the no. messages processed */
689 if (status)
690 return status;
691 else
692 return num_msgs;
693}
694
695/**
696 * disable_interrupts() - disable the interrupts
697 * @dev: private data of controller
Linus Walleij1804edd2010-09-23 09:03:40 +0200698 * @irq: interrupt number
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530699 */
700static int disable_interrupts(struct nmk_i2c_dev *dev, u32 irq)
701{
702 irq = IRQ_MASK(irq);
703 writel(readl(dev->virtbase + I2C_IMSCR) & ~(I2C_CLEAR_ALL_INTS & irq),
704 dev->virtbase + I2C_IMSCR);
705 return 0;
706}
707
708/**
709 * i2c_irq_handler() - interrupt routine
710 * @irq: interrupt number
711 * @arg: data passed to the handler
712 *
713 * This is the interrupt handler for the i2c driver. Currently
714 * it handles the major interrupts like Rx & Tx FIFO management
715 * interrupts, master transaction interrupts, arbitration and
716 * bus error interrupts. The rest of the interrupts are treated as
717 * unhandled.
718 */
719static irqreturn_t i2c_irq_handler(int irq, void *arg)
720{
721 struct nmk_i2c_dev *dev = arg;
722 u32 tft, rft;
723 u32 count;
724 u32 misr;
725 u32 src = 0;
726
727 /* load Tx FIFO and Rx FIFO threshold values */
728 tft = readl(dev->virtbase + I2C_TFTR);
729 rft = readl(dev->virtbase + I2C_RFTR);
730
731 /* read interrupt status register */
732 misr = readl(dev->virtbase + I2C_MISR);
733
734 src = __ffs(misr);
735 switch ((1 << src)) {
736
737 /* Transmit FIFO nearly empty interrupt */
738 case I2C_IT_TXFNE:
739 {
740 if (dev->cli.operation == I2C_READ) {
741 /*
742 * in read operation why do we care for writing?
743 * so disable the Transmit FIFO interrupt
744 */
745 disable_interrupts(dev, I2C_IT_TXFNE);
746 } else {
Virupax Sadashivpetimath55355342011-05-13 12:30:34 +0200747 fill_tx_fifo(dev, (MAX_I2C_FIFO_THRESHOLD - tft));
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530748 /*
749 * if done, close the transfer by disabling the
750 * corresponding TXFNE interrupt
751 */
752 if (dev->cli.count == 0)
753 disable_interrupts(dev, I2C_IT_TXFNE);
754 }
755 }
756 break;
757
758 /*
759 * Rx FIFO nearly full interrupt.
760 * This is set when the numer of entries in Rx FIFO is
761 * greater or equal than the threshold value programmed
762 * in RFT
763 */
764 case I2C_IT_RXFNF:
765 for (count = rft; count > 0; count--) {
766 /* Read the Rx FIFO */
767 *dev->cli.buffer = readb(dev->virtbase + I2C_RFR);
768 dev->cli.buffer++;
769 }
770 dev->cli.count -= rft;
771 dev->cli.xfer_bytes += rft;
772 break;
773
774 /* Rx FIFO full */
775 case I2C_IT_RXFF:
776 for (count = MAX_I2C_FIFO_THRESHOLD; count > 0; count--) {
777 *dev->cli.buffer = readb(dev->virtbase + I2C_RFR);
778 dev->cli.buffer++;
779 }
780 dev->cli.count -= MAX_I2C_FIFO_THRESHOLD;
781 dev->cli.xfer_bytes += MAX_I2C_FIFO_THRESHOLD;
782 break;
783
784 /* Master Transaction Done with/without stop */
785 case I2C_IT_MTD:
786 case I2C_IT_MTDWS:
787 if (dev->cli.operation == I2C_READ) {
Rabin Vincent1df3ab12010-04-27 10:31:08 +0530788 while (!(readl(dev->virtbase + I2C_RISR)
789 & I2C_IT_RXFE)) {
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530790 if (dev->cli.count == 0)
791 break;
792 *dev->cli.buffer =
793 readb(dev->virtbase + I2C_RFR);
794 dev->cli.buffer++;
795 dev->cli.count--;
796 dev->cli.xfer_bytes++;
797 }
798 }
799
Virupax Sadashivpetimathb5e890f2011-05-13 12:30:42 +0200800 disable_all_interrupts(dev);
801 clear_all_interrupts(dev);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530802
803 if (dev->cli.count) {
Virupax Sadashivpetimath99381be2011-05-13 12:29:28 +0200804 dev->result = -EIO;
Alessandro Rubini23560212012-06-11 22:56:38 +0200805 dev_err(&dev->adev->dev,
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200806 "%lu bytes still remain to be xfered\n",
807 dev->cli.count);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530808 (void) init_hw(dev);
809 }
810 complete(&dev->xfer_complete);
811
812 break;
813
814 /* Master Arbitration lost interrupt */
815 case I2C_IT_MAL:
Virupax Sadashivpetimath99381be2011-05-13 12:29:28 +0200816 dev->result = -EIO;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530817 (void) init_hw(dev);
818
819 i2c_set_bit(dev->virtbase + I2C_ICR, I2C_IT_MAL);
820 complete(&dev->xfer_complete);
821
822 break;
823
824 /*
825 * Bus Error interrupt.
826 * This happens when an unexpected start/stop condition occurs
827 * during the transaction.
828 */
829 case I2C_IT_BERR:
Virupax Sadashivpetimath99381be2011-05-13 12:29:28 +0200830 dev->result = -EIO;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530831 /* get the status */
832 if (((readl(dev->virtbase + I2C_SR) >> 2) & 0x3) == I2C_ABORT)
833 (void) init_hw(dev);
834
835 i2c_set_bit(dev->virtbase + I2C_ICR, I2C_IT_BERR);
836 complete(&dev->xfer_complete);
837
838 break;
839
840 /*
841 * Tx FIFO overrun interrupt.
842 * This is set when a write operation in Tx FIFO is performed and
843 * the Tx FIFO is full.
844 */
845 case I2C_IT_TXFOVR:
Virupax Sadashivpetimath99381be2011-05-13 12:29:28 +0200846 dev->result = -EIO;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530847 (void) init_hw(dev);
848
Alessandro Rubini23560212012-06-11 22:56:38 +0200849 dev_err(&dev->adev->dev, "Tx Fifo Over run\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530850 complete(&dev->xfer_complete);
851
852 break;
853
854 /* unhandled interrupts by this driver - TODO*/
855 case I2C_IT_TXFE:
856 case I2C_IT_TXFF:
857 case I2C_IT_RXFE:
858 case I2C_IT_RFSR:
859 case I2C_IT_RFSE:
860 case I2C_IT_WTSR:
861 case I2C_IT_STD:
Alessandro Rubini23560212012-06-11 22:56:38 +0200862 dev_err(&dev->adev->dev, "unhandled Interrupt\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530863 break;
864 default:
Alessandro Rubini23560212012-06-11 22:56:38 +0200865 dev_err(&dev->adev->dev, "spurious Interrupt..\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530866 break;
867 }
868
869 return IRQ_HANDLED;
870}
871
Jonas Aberga20d2392011-05-13 12:29:02 +0200872
873#ifdef CONFIG_PM
Rabin Vincentb0e751a2011-05-13 12:30:07 +0200874static int nmk_i2c_suspend(struct device *dev)
Jonas Aberga20d2392011-05-13 12:29:02 +0200875{
Alessandro Rubini23560212012-06-11 22:56:38 +0200876 struct amba_device *adev = to_amba_device(dev);
877 struct nmk_i2c_dev *nmk_i2c = amba_get_drvdata(adev);
Jonas Aberga20d2392011-05-13 12:29:02 +0200878
Rabin Vincentb0e751a2011-05-13 12:30:07 +0200879 if (nmk_i2c->busy)
Jonas Aberga20d2392011-05-13 12:29:02 +0200880 return -EBUSY;
Rabin Vincentb0e751a2011-05-13 12:30:07 +0200881
882 return 0;
883}
884
885static int nmk_i2c_resume(struct device *dev)
886{
887 return 0;
Jonas Aberga20d2392011-05-13 12:29:02 +0200888}
889#else
890#define nmk_i2c_suspend NULL
Rabin Vincentb0e751a2011-05-13 12:30:07 +0200891#define nmk_i2c_resume NULL
Jonas Aberga20d2392011-05-13 12:29:02 +0200892#endif
893
Rabin Vincentb0e751a2011-05-13 12:30:07 +0200894/*
895 * We use noirq so that we suspend late and resume before the wakeup interrupt
896 * to ensure that we do the !pm_runtime_suspended() check in resume before
897 * there has been a regular pm runtime resume (via pm_runtime_get_sync()).
898 */
899static const struct dev_pm_ops nmk_i2c_pm = {
900 .suspend_noirq = nmk_i2c_suspend,
901 .resume_noirq = nmk_i2c_resume,
902};
903
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530904static unsigned int nmk_i2c_functionality(struct i2c_adapter *adap)
905{
Virupax Sadashivpetimath51a0c8d2012-06-25 17:56:07 +0530906 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530907}
908
909static const struct i2c_algorithm nmk_i2c_algo = {
910 .master_xfer = nmk_i2c_xfer,
911 .functionality = nmk_i2c_functionality
912};
913
Alessandro Rubini23560212012-06-11 22:56:38 +0200914static atomic_t adapter_id = ATOMIC_INIT(0);
915
916static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530917{
918 int ret = 0;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530919 struct nmk_i2c_controller *pdata =
Alessandro Rubini23560212012-06-11 22:56:38 +0200920 adev->dev.platform_data;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530921 struct nmk_i2c_dev *dev;
922 struct i2c_adapter *adap;
923
Alessandro Rubini23560212012-06-11 22:56:38 +0200924 if (!pdata) {
925 dev_warn(&adev->dev, "no platform data\n");
926 return -ENODEV;
927 }
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530928 dev = kzalloc(sizeof(struct nmk_i2c_dev), GFP_KERNEL);
929 if (!dev) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200930 dev_err(&adev->dev, "cannot allocate memory\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530931 ret = -ENOMEM;
932 goto err_no_mem;
933 }
Jonas Aberga20d2392011-05-13 12:29:02 +0200934 dev->busy = false;
Alessandro Rubini23560212012-06-11 22:56:38 +0200935 dev->adev = adev;
936 amba_set_drvdata(adev, dev);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530937
Alessandro Rubini23560212012-06-11 22:56:38 +0200938 dev->virtbase = ioremap(adev->res.start, resource_size(&adev->res));
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530939 if (!dev->virtbase) {
940 ret = -ENOMEM;
941 goto err_no_ioremap;
942 }
943
Alessandro Rubini23560212012-06-11 22:56:38 +0200944 dev->irq = adev->irq[0];
Yong Zhang43110512011-09-21 17:28:33 +0800945 ret = request_irq(dev->irq, i2c_irq_handler, 0,
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530946 DRIVER_NAME, dev);
947 if (ret) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200948 dev_err(&adev->dev, "cannot claim the irq %d\n", dev->irq);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530949 goto err_irq;
950 }
951
Alessandro Rubini23560212012-06-11 22:56:38 +0200952 dev->regulator = regulator_get(&adev->dev, "v-i2c");
Jonas Aberga20d2392011-05-13 12:29:02 +0200953 if (IS_ERR(dev->regulator)) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200954 dev_warn(&adev->dev, "could not get i2c regulator\n");
Jonas Aberga20d2392011-05-13 12:29:02 +0200955 dev->regulator = NULL;
956 }
957
Alessandro Rubini23560212012-06-11 22:56:38 +0200958 pm_suspend_ignore_children(&adev->dev, true);
Rabin Vincentb0e751a2011-05-13 12:30:07 +0200959
Alessandro Rubini23560212012-06-11 22:56:38 +0200960 dev->clk = clk_get(&adev->dev, NULL);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530961 if (IS_ERR(dev->clk)) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200962 dev_err(&adev->dev, "could not get i2c clock\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530963 ret = PTR_ERR(dev->clk);
964 goto err_no_clk;
965 }
966
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530967 adap = &dev->adap;
Alessandro Rubini23560212012-06-11 22:56:38 +0200968 adap->dev.parent = &adev->dev;
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530969 adap->owner = THIS_MODULE;
970 adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
971 adap->algo = &nmk_i2c_algo;
Lee Jones98582d92012-04-17 15:52:26 +0100972 adap->timeout = msecs_to_jiffies(pdata->timeout);
Alessandro Rubini23560212012-06-11 22:56:38 +0200973 adap->nr = atomic_read(&adapter_id);
Linus Walleij6d779a42010-11-30 16:59:29 +0100974 snprintf(adap->name, sizeof(adap->name),
Alessandro Rubini23560212012-06-11 22:56:38 +0200975 "Nomadik I2C%d at %pR", adap->nr, &adev->res);
976 atomic_inc(&adapter_id);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530977
978 /* fetch the controller configuration from machine */
979 dev->cfg.clk_freq = pdata->clk_freq;
980 dev->cfg.slsu = pdata->slsu;
981 dev->cfg.tft = pdata->tft;
982 dev->cfg.rft = pdata->rft;
983 dev->cfg.sm = pdata->sm;
984
985 i2c_set_adapdata(adap, dev);
986
Alessandro Rubini23560212012-06-11 22:56:38 +0200987 dev_info(&adev->dev,
Jonas Aaberg8abf6fbb2011-10-20 18:23:01 +0200988 "initialize %s on virtual base %p\n",
989 adap->name, dev->virtbase);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530990
991 ret = i2c_add_numbered_adapter(adap);
992 if (ret) {
Alessandro Rubini23560212012-06-11 22:56:38 +0200993 dev_err(&adev->dev, "failed to add adapter\n");
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530994 goto err_add_adap;
995 }
996
Alessandro Rubini23560212012-06-11 22:56:38 +0200997 pm_runtime_put(&adev->dev);
998
srinidhi kasagar3f9900f2010-02-01 19:44:54 +0530999 return 0;
1000
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301001 err_add_adap:
1002 clk_put(dev->clk);
1003 err_no_clk:
Jonas Aberga20d2392011-05-13 12:29:02 +02001004 if (dev->regulator)
1005 regulator_put(dev->regulator);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301006 free_irq(dev->irq, dev);
1007 err_irq:
1008 iounmap(dev->virtbase);
1009 err_no_ioremap:
Alessandro Rubini23560212012-06-11 22:56:38 +02001010 amba_set_drvdata(adev, NULL);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301011 kfree(dev);
1012 err_no_mem:
1013
1014 return ret;
1015}
1016
Alessandro Rubini23560212012-06-11 22:56:38 +02001017static int nmk_i2c_remove(struct amba_device *adev)
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301018{
Alessandro Rubini23560212012-06-11 22:56:38 +02001019 struct resource *res = &adev->res;
1020 struct nmk_i2c_dev *dev = amba_get_drvdata(adev);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301021
1022 i2c_del_adapter(&dev->adap);
1023 flush_i2c_fifo(dev);
1024 disable_all_interrupts(dev);
1025 clear_all_interrupts(dev);
1026 /* disable the controller */
1027 i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE);
1028 free_irq(dev->irq, dev);
1029 iounmap(dev->virtbase);
Rabin Vincenta1c27672010-04-27 10:31:07 +05301030 if (res)
1031 release_mem_region(res->start, resource_size(res));
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301032 clk_put(dev->clk);
Jonas Aberga20d2392011-05-13 12:29:02 +02001033 if (dev->regulator)
1034 regulator_put(dev->regulator);
Alessandro Rubini23560212012-06-11 22:56:38 +02001035 pm_runtime_disable(&adev->dev);
1036 amba_set_drvdata(adev, NULL);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301037 kfree(dev);
1038
1039 return 0;
1040}
1041
Alessandro Rubini23560212012-06-11 22:56:38 +02001042static struct amba_id nmk_i2c_ids[] = {
1043 {
1044 .id = 0x00180024,
1045 .mask = 0x00ffffff,
1046 },
1047 {
1048 .id = 0x00380024,
1049 .mask = 0x00ffffff,
1050 },
1051 {},
1052};
1053
1054MODULE_DEVICE_TABLE(amba, nmk_i2c_ids);
1055
1056static struct amba_driver nmk_i2c_driver = {
1057 .drv = {
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301058 .owner = THIS_MODULE,
1059 .name = DRIVER_NAME,
Rabin Vincentb0e751a2011-05-13 12:30:07 +02001060 .pm = &nmk_i2c_pm,
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301061 },
Alessandro Rubini23560212012-06-11 22:56:38 +02001062 .id_table = nmk_i2c_ids,
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301063 .probe = nmk_i2c_probe,
Alessandro Rubini23560212012-06-11 22:56:38 +02001064 .remove = nmk_i2c_remove,
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301065};
1066
1067static int __init nmk_i2c_init(void)
1068{
Alessandro Rubini23560212012-06-11 22:56:38 +02001069 return amba_driver_register(&nmk_i2c_driver);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301070}
1071
1072static void __exit nmk_i2c_exit(void)
1073{
Alessandro Rubini23560212012-06-11 22:56:38 +02001074 amba_driver_unregister(&nmk_i2c_driver);
srinidhi kasagar3f9900f2010-02-01 19:44:54 +05301075}
1076
1077subsys_initcall(nmk_i2c_init);
1078module_exit(nmk_i2c_exit);
1079
1080MODULE_AUTHOR("Sachin Verma, Srinidhi KASAGAR");
1081MODULE_DESCRIPTION("Nomadik/Ux500 I2C driver");
1082MODULE_LICENSE("GPL");