1 /* drivers/i2c/busses/i2c-rk30-adapter.c
3 * Copyright (C) 2012 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
17 /* Control register */
27 //send ACK to slave when the last byte received in RX only mode
28 #define LAST_SEND_ACK 0
29 //send NAK to slave when the last byte received in RX only mode
30 #define LAST_SEND_NAK 1
31 #define LAST_SEND_TYPE LAST_SEND_ACK //LAST_SEND_NAK
33 #define I2C_MOD_MASK (3 << I2C_MOD_BIT)
40 /* Clock dividor register */
41 #define I2C_CLKDIV 0x004
42 #define I2C_CLKDIV_VAL(divl, divh) (((divl) & 0xffff) | (((divh) << 16) & 0xffff0000))
43 /* the slave address accessed for master rx mode */
44 #define I2C_MRXADDR 0x008
45 #define I2C_MRXADDR_LOW (1 << 24)
46 #define I2C_MRXADDR_MID (1 << 25)
47 #define I2C_MRXADDR_HIGH (1 << 26)
48 /* the slave register address accessed for master rx mode */
49 #define I2C_MRXRADDR 0x00c
50 #define I2C_MRXRADDR_LOW (1 << 24)
51 #define I2C_MRXRADDR_MID (1 << 25)
52 #define I2C_MRXRADDR_HIGH (1 << 26)
54 #define I2C_MTXCNT 0x010
56 #define I2C_MRXCNT 0x014
57 /* interrupt enable register */
59 #define I2C_BTFIEN (1 << 0)
60 #define I2C_BRFIEN (1 << 1)
61 #define I2C_MBTFIEN (1 << 2)
62 #define I2C_MBRFIEN (1 << 3)
63 #define I2C_STARTIEN (1 << 4)
64 #define I2C_STOPIEN (1 << 5)
65 #define I2C_NAKRCVIEN (1 << 6)
66 #define IRQ_MST_ENABLE (I2C_MBTFIEN | I2C_MBRFIEN | I2C_NAKRCVIEN | I2C_STARTIEN | I2C_STOPIEN)
67 #define IRQ_ALL_DISABLE 0
68 /* interrupt pending register */
70 #define I2C_BTFIPD (1 << 0)
71 #define I2C_BRFIPD (1 << 1)
72 #define I2C_MBTFIPD (1 << 2)
73 #define I2C_MBRFIPD (1 << 3)
74 #define I2C_STARTIPD (1 << 4)
75 #define I2C_STOPIPD (1 << 5)
76 #define I2C_NAKRCVIPD (1 << 6)
78 #define I2C_FCNT 0x020
79 /* I2C tx data register */
80 #define I2C_TXDATA_BASE 0X100
81 /* I2C rx data register */
82 #define I2C_RXDATA_BASE 0x200
83 static void rk30_show_regs(struct rk30_i2c *i2c)
85 i2c_dbg(i2c->dev, "I2C_CON: 0x%08x\n", readl(i2c->regs + I2C_CON));
86 i2c_dbg(i2c->dev, "I2C_CLKDIV: 0x%08x\n", readl(i2c->regs + I2C_CLKDIV));
87 i2c_dbg(i2c->dev, "I2C_MRXADDR: 0x%08x\n", readl(i2c->regs + I2C_MRXADDR));
88 i2c_dbg(i2c->dev, "I2C_MRXRADDR: 0x%08x\n", readl(i2c->regs + I2C_MRXRADDR));
89 i2c_dbg(i2c->dev, "I2C_MTXCNT: 0x%08x\n", readl(i2c->regs + I2C_MTXCNT));
90 i2c_dbg(i2c->dev, "I2C_MRXCNT: 0x%08x\n", readl(i2c->regs + I2C_MRXCNT));
91 i2c_dbg(i2c->dev, "I2C_IEN: 0x%08x\n", readl(i2c->regs + I2C_IEN));
92 i2c_dbg(i2c->dev, "I2C_IPD: 0x%08x\n", readl(i2c->regs + I2C_IPD));
93 i2c_dbg(i2c->dev, "I2C_FCNT: 0x%08x\n", readl(i2c->regs + I2C_FCNT));
94 i2c_dbg(i2c->dev, "I2C_TXDATA0: 0x%08x\n", readl(i2c->regs + I2C_TXDATA_BASE + 0));
95 i2c_dbg(i2c->dev, "I2C_RXDATA0: 0x%08x\n", readl(i2c->regs + I2C_RXDATA_BASE + 0));
97 static inline void rk30_i2c_last_ack(struct rk30_i2c *i2c, int enable)
99 unsigned int p = readl(i2c->regs + I2C_CON);
101 p = rk30_set_bit(p, 0, I2C_START_BIT);
102 p = rk30_set_bit(p, 0, I2C_STOP_BIT);
103 writel(rk30_set_bit(p, enable, I2C_LAST_ACK_BIT), i2c->regs + I2C_CON);
105 static inline void rk30_i2c_act2ack(struct rk30_i2c *i2c, int enable)
107 unsigned int p = readl(i2c->regs + I2C_CON);
109 p = rk30_set_bit(p, 0, I2C_START_BIT);
110 p = rk30_set_bit(p, 0, I2C_STOP_BIT);
111 writel(rk30_set_bit(p, enable, I2C_ACT2ACK_BIT), i2c->regs + I2C_CON);
113 static inline void rk30_i2c_enable(struct rk30_i2c *i2c, int enable)
115 unsigned int p = readl(i2c->regs + I2C_CON);
117 p = rk30_set_bit(p, 0, I2C_START_BIT);
118 p = rk30_set_bit(p, 0, I2C_STOP_BIT);
120 writel(rk30_set_bit(p, enable, I2C_EN_BIT), i2c->regs + I2C_CON);
122 static inline void rk30_i2c_set_mode(struct rk30_i2c *i2c)
124 unsigned int p = readl(i2c->regs + I2C_CON);
126 p = rk30_set_bit(p, 0, I2C_START_BIT);
127 p = rk30_set_bit(p, 0, I2C_STOP_BIT);
128 writel(rk30_set_bits(p, i2c->mode, I2C_MOD_BIT, I2C_MOD_MASK), i2c->regs + I2C_CON);
130 static inline void rk30_i2c_disable_irq(struct rk30_i2c *i2c)
132 writel(IRQ_ALL_DISABLE, i2c->regs + I2C_IEN);
135 static inline void rk30_i2c_enable_irq(struct rk30_i2c *i2c)
137 writel(IRQ_MST_ENABLE, i2c->regs + I2C_IEN);
140 static inline void rk30_i2c_send_start(struct rk30_i2c *i2c)
142 unsigned int p = readl(i2c->regs + I2C_CON);
144 p = rk30_set_bit(p, 1, I2C_START_BIT);
145 p = rk30_set_bit(p, 0, I2C_STOP_BIT);
146 writel(p, i2c->regs + I2C_CON);
148 static inline void rk30_i2c_send_stop(struct rk30_i2c *i2c)
150 unsigned int p = readl(i2c->regs + I2C_CON);
152 p = rk30_set_bit(p, 0, I2C_START_BIT);
153 p = rk30_set_bit(p, 1, I2C_STOP_BIT);
154 writel(p, i2c->regs + I2C_CON);
157 /* SCL Divisor = 8 * (CLKDIVL + CLKDIVH)
158 * SCL = i2c_rate/ SCLK Divisor
160 static void rk30_i2c_set_clk(struct rk30_i2c *i2c, unsigned long scl_rate)
162 unsigned long i2c_rate = clk_get_rate(i2c->clk);
164 unsigned int div, divl, divh;
166 if((scl_rate == i2c->scl_rate) && (i2c_rate == i2c->i2c_rate))
168 i2c->i2c_rate = i2c_rate;
169 i2c->scl_rate = scl_rate;
170 div = rk30_ceil(i2c_rate, scl_rate * 8);
171 divh = divl = rk30_ceil(div, 2);
172 i2c_dbg(i2c->dev, "div divh divl: %d %d %d\n", div, divh, divl);
173 writel(I2C_CLKDIV_VAL(divl, divh), i2c->regs + I2C_CLKDIV);
176 static void rk30_i2c_init_hw(struct rk30_i2c *i2c, unsigned long scl_rate)
178 rk30_i2c_set_clk(i2c, scl_rate);
181 /* returns TRUE if we this is the last byte in the current message */
182 static inline int is_msglast(struct rk30_i2c *i2c)
184 return i2c->msg_ptr == i2c->msg->len-1;
187 /* returns TRUE if we reached the end of the current message */
188 static inline int is_msgend(struct rk30_i2c *i2c)
190 return i2c->msg_ptr >= i2c->msg->len;
193 static void rk30_i2c_stop(struct rk30_i2c *i2c, int ret)
204 i2c->state = STATE_STOP;
205 rk30_i2c_send_stop(i2c);
207 static void rk30_irq_read_prepare(struct rk30_i2c *i2c)
209 unsigned int cnt, len = i2c->msg->len - i2c->msg_ptr;
212 rk30_i2c_stop(i2c, 0);
220 writel(cnt, i2c->regs + I2C_MRXCNT);
222 static void rk30_irq_read_get_data(struct rk30_i2c *i2c)
224 unsigned int i, len = i2c->msg->len - i2c->msg_ptr;
227 len = (len >= 32)?32:len;
229 for(i = 0; i < len; i++){
231 p = readl(i2c->regs + I2C_RXDATA_BASE + (i/4) * 4);
232 i2c->msg->buf[i2c->msg_ptr++] = (p >>((i%4) * 8)) & 0xff;
237 static void rk30_irq_write_prepare(struct rk30_i2c *i2c)
239 unsigned int data = 0, cnt = 0, i, j;
243 rk30_i2c_stop(i2c, 0);
246 for(i = 0; i < 8; i++){
248 for(j = 0; j < 4; j++) {
251 if(i2c->msg_ptr == 0 && cnt == 0)
252 byte = (i2c->addr & 0x7f) << 1;
254 byte = i2c->msg->buf[i2c->msg_ptr++];
256 data |= (byte << (j * 8));
258 writel(data, i2c->regs + I2C_TXDATA_BASE + 4 * i);
262 writel(cnt, i2c->regs + I2C_MTXCNT);
264 static void rk30_i2c_irq_nextblock(struct rk30_i2c *i2c, unsigned int ipd)
266 switch (i2c->state) {
268 dev_err(i2c->dev, "Addr[0x%02x] called in STATE_IDLE\n", i2c->addr);
271 if(!(ipd & I2C_STARTIPD)){
272 if(ipd & I2C_STOPIPD){
273 writel(I2C_STOPIPD, i2c->regs + I2C_IPD);
276 rk30_i2c_stop(i2c, -ENXIO);
277 dev_err(i2c->dev, "Addr[0x%02x] no start irq in STATE_START\n", i2c->addr);
282 writel(I2C_STARTIPD, i2c->regs + I2C_IPD);
283 if(i2c->mode == I2C_MOD_TX){
284 i2c->state = STATE_WRITE;
288 i2c->state = STATE_READ;
292 if(!(ipd & I2C_MBTFIPD)){
295 writel(I2C_MBTFIPD, i2c->regs + I2C_IPD);
297 rk30_irq_write_prepare(i2c);
300 if(!(ipd & I2C_MBRFIPD)){
303 writel(I2C_MBRFIPD, i2c->regs + I2C_IPD);
304 rk30_irq_read_get_data(i2c);
306 rk30_irq_read_prepare(i2c);
309 if(ipd & I2C_STOPIPD){
310 writel(0xff, i2c->regs + I2C_IPD);
311 i2c->state = STATE_IDLE;
312 rk30_i2c_disable_irq(i2c);
322 static irqreturn_t rk30_i2c_irq(int irq, void *dev_id)
324 struct rk30_i2c *i2c = dev_id;
326 spin_lock(&i2c->lock);
327 ipd = readl(i2c->regs + I2C_IPD);
329 if(ipd & I2C_NAKRCVIPD) {
330 writel(I2C_NAKRCVIPD, i2c->regs + I2C_IPD);
331 rk30_i2c_stop(i2c, -EAGAIN);
332 dev_dbg(i2c->dev, "Addr[0x%02x] ack was not received\n", i2c->addr);
337 rk30_i2c_irq_nextblock(i2c, ipd);
339 spin_unlock(&i2c->lock);
344 static int rk30_i2c_set_master(struct rk30_i2c *i2c, struct i2c_msg *msgs, int num)
346 unsigned int addr = (msgs[0].addr & 0x7f) << 1;
347 unsigned int reg_valid_bits = 0;
348 unsigned int reg_addr = 0;
351 if(!(msgs[0].flags & I2C_M_RD)){
353 i2c->mode = I2C_MOD_TX;
358 writel(addr | I2C_MRXADDR_LOW, i2c->regs + I2C_MRXADDR);
359 i2c->mode = I2C_MOD_RX;
365 reg_addr = msgs[0].buf[0];
366 reg_valid_bits |= I2C_MRXADDR_LOW;
369 reg_addr = msgs[0].buf[0] | (msgs[0].buf[1] << 8);
370 reg_valid_bits |= I2C_MRXADDR_LOW | I2C_MRXADDR_MID;
373 reg_addr = msgs[0].buf[0] | (msgs[0].buf[1] << 8) | (msgs[0].buf[2] << 16);
374 reg_valid_bits |= I2C_MRXADDR_LOW | I2C_MRXADDR_MID | I2C_MRXADDR_HIGH;
379 if((msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD)) {
382 writel(addr | I2C_MRXADDR_LOW, i2c->regs + I2C_MRXADDR);
383 writel(reg_addr | reg_valid_bits, i2c->regs + I2C_MRXRADDR);
384 i2c->mode = I2C_MOD_RRX;
386 else if(!(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD)) {
388 writel(addr | I2C_MRXADDR_LOW, i2c->regs + I2C_MRXADDR);
389 writel(reg_addr | reg_valid_bits, i2c->regs + I2C_MRXRADDR);
390 i2c->mode = I2C_MOD_TRX;
396 dev_err(i2c->dev, "This case(num > 2) has not been support now\n");
399 rk30_i2c_set_mode(i2c);
400 rk30_i2c_last_ack(i2c, LAST_SEND_TYPE);
401 if(msgs[0].flags & I2C_M_IGNORE_NAK)
402 rk30_i2c_act2ack(i2c, 0);
404 rk30_i2c_act2ack(i2c, 1);
410 * this starts an i2c transfer
412 static int rk30_i2c_doxfer(struct rk30_i2c *i2c,
413 struct i2c_msg *msgs, int num)
415 unsigned long timeout;
421 ret = rk30_i2c_set_master(i2c, msgs, num);
423 dev_err(i2c->dev, "addr[0x%02x] set master error\n", msgs[0].addr);
426 spin_lock_irq(&i2c->lock);
428 i2c->addr = msgs[0].addr;
432 i2c->state = STATE_START;
434 spin_unlock_irq(&i2c->lock);
436 rk30_i2c_enable_irq(i2c);
437 rk30_i2c_send_start(i2c);
439 timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, msecs_to_jiffies(I2C_WAIT_TIMEOUT));
444 dev_err(i2c->dev, "addr[0x%02x] wait event timeout, state = %d\n", msgs[0].addr, i2c->state);
446 writel(0xff, i2c->regs + I2C_IPD);
447 rk30_i2c_disable_irq(i2c);
448 rk30_i2c_send_stop(i2c);
460 * first port of call from the i2c bus code when an message needs
461 * transferring across the i2c bus.
464 static int rk30_i2c_xfer(struct i2c_adapter *adap,
465 struct i2c_msg *msgs, int num)
468 unsigned long scl_rate;
469 struct rk30_i2c *i2c = (struct rk30_i2c *)adap->algo_data;
471 if(msgs[0].scl_rate <= 400000 && msgs[0].scl_rate >= 10000)
472 scl_rate = msgs[0].scl_rate;
473 else if(msgs[0].scl_rate > 400000){
474 dev_warn(i2c->dev, "Warning: addr[0x%x] msg[0].scl_rate( = %dKhz) is too high!",
475 msgs[0].addr, msgs[0].scl_rate/1000);
479 dev_warn(i2c->dev, "Warning: addr[0x%x] msg[0].scl_rate( = %dKhz) is too low!",
480 msgs[0].addr, msgs[0].scl_rate/1000);
483 if(i2c->is_div_from_arm[i2c->adap.nr])
484 wake_lock(&i2c->idlelock[i2c->adap.nr]);
486 rk30_i2c_enable(i2c, 1);
487 rk30_i2c_set_clk(i2c, scl_rate);
488 udelay(i2c->tx_setup);
490 i2c_dbg(i2c->dev, "i2c transfer: addr[0x%x], scl_reate[%ldKhz]\n", msgs[0].addr, scl_rate/1000);
491 ret = rk30_i2c_doxfer(i2c, msgs, num);
493 rk30_i2c_enable(i2c, 0);
494 i2c->state = STATE_IDLE;
495 if(i2c->is_div_from_arm[i2c->adap.nr])
496 wake_unlock(&i2c->idlelock[i2c->adap.nr]);
500 /* declare our i2c functionality */
501 static u32 rk30_i2c_func(struct i2c_adapter *adap)
503 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;
506 /* i2c bus registration info */
508 static const struct i2c_algorithm rk30_i2c_algorithm = {
509 .master_xfer = rk30_i2c_xfer,
510 .functionality = rk30_i2c_func,
513 int i2c_add_rk30_adapter(struct i2c_adapter *adap)
516 struct rk30_i2c *i2c = (struct rk30_i2c *)adap->algo_data;
518 adap->algo = &rk30_i2c_algorithm;
520 i2c->i2c_init_hw = &rk30_i2c_init_hw;
521 i2c->i2c_set_clk = &rk30_i2c_set_clk;
522 i2c->i2c_irq = &rk30_i2c_irq;
524 ret = i2c_add_numbered_adapter(adap);