Lines Matching +full:rk3188 +full:- +full:i2c
4 * (C) Copyright 2008-2014 Rockchip Electronics
7 * SPDX-License-Identifier: GPL-2.0+
14 #include <i2c.h>
17 #include <asm/arch/i2c.h>
24 /* i2c timerout */
28 /* rk i2c fifo max transfer bytes */
89 debug("i2c_con: 0x%08x\n", readl(®s->con)); in rk_i2c_show_regs()
90 debug("i2c_clkdiv: 0x%08x\n", readl(®s->clkdiv)); in rk_i2c_show_regs()
91 debug("i2c_mrxaddr: 0x%08x\n", readl(®s->mrxaddr)); in rk_i2c_show_regs()
92 debug("i2c_mrxraddR: 0x%08x\n", readl(®s->mrxraddr)); in rk_i2c_show_regs()
93 debug("i2c_mtxcnt: 0x%08x\n", readl(®s->mtxcnt)); in rk_i2c_show_regs()
94 debug("i2c_mrxcnt: 0x%08x\n", readl(®s->mrxcnt)); in rk_i2c_show_regs()
95 debug("i2c_ien: 0x%08x\n", readl(®s->ien)); in rk_i2c_show_regs()
96 debug("i2c_ipd: 0x%08x\n", readl(®s->ipd)); in rk_i2c_show_regs()
97 debug("i2c_fcnt: 0x%08x\n", readl(®s->fcnt)); in rk_i2c_show_regs()
99 debug("i2c_txdata%d: 0x%08x\n", i, readl(®s->txdata[i])); in rk_i2c_show_regs()
101 debug("i2c_rxdata%d: 0x%08x\n", i, readl(®s->rxdata[i])); in rk_i2c_show_regs()
119 static void rk_i2c_set_clk(struct rk_i2c *i2c, unsigned int scl_rate) in rk_i2c_set_clk() argument
124 /* First get i2c rate from pclk */ in rk_i2c_set_clk()
125 i2c_rate = clk_get_rate(&i2c->clk); in rk_i2c_set_clk()
127 div = DIV_ROUND_UP(i2c_rate, scl_rate * 8) - 2; in rk_i2c_set_clk()
132 writel(I2C_CLKDIV_VAL(divl, divh), &i2c->regs->clkdiv); in rk_i2c_set_clk()
134 debug("rk_i2c_set_clk: i2c rate = %d, scl rate = %d\n", i2c_rate, in rk_i2c_set_clk()
136 debug("set i2c clk div = %d, divh = %d, divl = %d\n", div, divh, divl); in rk_i2c_set_clk()
137 debug("set clk(I2C_CLKDIV: 0x%08x)\n", readl(&i2c->regs->clkdiv)); in rk_i2c_set_clk()
140 static int rk_i2c_adapter_clk(struct rk_i2c *i2c, unsigned int scl_rate) in rk_i2c_adapter_clk() argument
147 unsigned int i2c_rate = clk_get_rate(&i2c->clk); in rk_i2c_adapter_clk()
150 debug("rk_i2c_set_clk: i2c rate = %d, scl rate = %d\n", i2c_rate, in rk_i2c_adapter_clk()
161 debug("invalid i2c speed : %d\n", scl_rate); in rk_i2c_adapter_clk()
162 return -EINVAL; in rk_i2c_adapter_clk()
171 min_high_ns = spec->max_rise_ns + spec->min_high_ns; in rk_i2c_adapter_clk()
174 min_low_ns = spec->max_fall_ns + spec->min_low_ns; in rk_i2c_adapter_clk()
186 extra_div = min_total_div - min_hold_div; in rk_i2c_adapter_clk()
191 high_div = min_high_div + (extra_div - extra_low_div); in rk_i2c_adapter_clk()
194 high_div--; in rk_i2c_adapter_clk()
195 low_div--; in rk_i2c_adapter_clk()
198 return -EINVAL; in rk_i2c_adapter_clk()
201 i2c->cfg = I2C_CON_SDA_CFG(1) | I2C_CON_STA_CFG(start_setup); in rk_i2c_adapter_clk()
203 &i2c->regs->clkdiv); in rk_i2c_adapter_clk()
205 debug("set clk(I2C_TIMING: 0x%08x)\n", i2c->cfg); in rk_i2c_adapter_clk()
206 debug("set clk(I2C_CLKDIV: 0x%08x)\n", readl(&i2c->regs->clkdiv)); in rk_i2c_adapter_clk()
211 static int rk_i2c_send_start_bit(struct rk_i2c *i2c, u32 con) in rk_i2c_send_start_bit() argument
213 struct i2c_regs *regs = i2c->regs; in rk_i2c_send_start_bit()
216 debug("I2c Send Start bit.\n"); in rk_i2c_send_start_bit()
217 writel(I2C_IPD_ALL_CLEAN, ®s->ipd); in rk_i2c_send_start_bit()
219 writel(I2C_STARTIEN, ®s->ien); in rk_i2c_send_start_bit()
220 writel(I2C_CON_EN | I2C_CON_START | i2c->cfg | con, ®s->con); in rk_i2c_send_start_bit()
224 if (readl(®s->ipd) & I2C_STARTIPD) { in rk_i2c_send_start_bit()
225 writel(I2C_STARTIPD, ®s->ipd); in rk_i2c_send_start_bit()
229 debug("I2C Send Start Bit Timeout\n"); in rk_i2c_send_start_bit()
231 return -ETIMEDOUT; in rk_i2c_send_start_bit()
237 writel(I2C_CON_EN | i2c->cfg | con, ®s->con); in rk_i2c_send_start_bit()
242 static int rk_i2c_send_stop_bit(struct rk_i2c *i2c) in rk_i2c_send_stop_bit() argument
244 struct i2c_regs *regs = i2c->regs; in rk_i2c_send_stop_bit()
247 debug("I2c Send Stop bit.\n"); in rk_i2c_send_stop_bit()
248 writel(I2C_IPD_ALL_CLEAN, ®s->ipd); in rk_i2c_send_stop_bit()
250 writel(I2C_CON_EN | i2c->cfg | I2C_CON_STOP, ®s->con); in rk_i2c_send_stop_bit()
251 writel(I2C_CON_STOP, ®s->ien); in rk_i2c_send_stop_bit()
255 if (readl(®s->ipd) & I2C_STOPIPD) { in rk_i2c_send_stop_bit()
256 writel(I2C_STOPIPD, ®s->ipd); in rk_i2c_send_stop_bit()
260 debug("I2C Send Start Bit Timeout\n"); in rk_i2c_send_stop_bit()
262 return -ETIMEDOUT; in rk_i2c_send_stop_bit()
271 static inline void rk_i2c_disable(struct rk_i2c *i2c) in rk_i2c_disable() argument
273 writel(0, &i2c->regs->ien); in rk_i2c_disable()
274 writel(I2C_IPD_ALL_CLEAN, &i2c->regs->ipd); in rk_i2c_disable()
275 writel(0, &i2c->regs->con); in rk_i2c_disable()
278 static int rk_i2c_read(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len, in rk_i2c_read() argument
281 struct i2c_regs *regs = i2c->regs; in rk_i2c_read()
298 writel(0, ®s->con); in rk_i2c_read()
300 writel(I2C_MRXADDR_SET(1, chip << 1 | 1), ®s->mrxaddr); in rk_i2c_read()
302 writel(0, ®s->mrxraddr); in rk_i2c_read()
304 writel(I2C_MRXRADDR_SET(r_len, reg), ®s->mrxraddr); in rk_i2c_read()
306 debug("I2C Read: addr len %d not supported\n", r_len); in rk_i2c_read()
307 return -EIO; in rk_i2c_read()
330 writel(con | i2c->cfg, ®s->con); in rk_i2c_read()
333 err = rk_i2c_send_start_bit(i2c, con); in rk_i2c_read()
338 writel(I2C_MBRFIEN | I2C_NAKRCVIEN, ®s->ien); in rk_i2c_read()
339 writel(bytes_xferred, ®s->mrxcnt); in rk_i2c_read()
343 if (readl(®s->ipd) & I2C_NAKRCVIPD) { in rk_i2c_read()
344 writel(I2C_NAKRCVIPD, ®s->ipd); in rk_i2c_read()
345 err = -EREMOTEIO; in rk_i2c_read()
348 if (readl(®s->ipd) & I2C_MBRFIPD) { in rk_i2c_read()
349 writel(I2C_MBRFIPD, ®s->ipd); in rk_i2c_read()
353 debug("I2C Read Data Timeout\n"); in rk_i2c_read()
354 err = -ETIMEDOUT; in rk_i2c_read()
362 rxdata = readl(®s->rxdata[i]); in rk_i2c_read()
363 debug("I2c Read RXDATA[%d] = 0x%x\n", i, rxdata); in rk_i2c_read()
371 bytes_remain_len -= bytes_xferred; in rk_i2c_read()
373 debug("I2C Read bytes_remain_len %d\n", bytes_remain_len); in rk_i2c_read()
380 static int rk_i2c_write(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len, in rk_i2c_write() argument
383 struct i2c_regs *regs = i2c->regs; in rk_i2c_write()
414 (0xff << ((j - 1) * 8))) << 8; in rk_i2c_write()
419 writel(txdata, ®s->txdata[i]); in rk_i2c_write()
420 debug("I2c Write TXDATA[%d] = 0x%08x\n", i, txdata); in rk_i2c_write()
425 err = rk_i2c_send_start_bit(i2c, I2C_CON_EN | in rk_i2c_write()
431 writel(I2C_CON_EN | I2C_CON_MOD(I2C_MODE_TX) | i2c->cfg, in rk_i2c_write()
432 ®s->con); in rk_i2c_write()
434 writel(I2C_MBTFIEN | I2C_NAKRCVIEN, ®s->ien); in rk_i2c_write()
435 writel(bytes_xferred, ®s->mtxcnt); in rk_i2c_write()
439 if (readl(®s->ipd) & I2C_NAKRCVIPD) { in rk_i2c_write()
440 writel(I2C_NAKRCVIPD, ®s->ipd); in rk_i2c_write()
441 err = -EREMOTEIO; in rk_i2c_write()
444 if (readl(®s->ipd) & I2C_MBTFIPD) { in rk_i2c_write()
445 writel(I2C_MBTFIPD, ®s->ipd); in rk_i2c_write()
449 debug("I2C Write Data Timeout\n"); in rk_i2c_write()
450 err = -ETIMEDOUT; in rk_i2c_write()
457 bytes_remain_len -= bytes_xferred; in rk_i2c_write()
458 debug("I2C Write bytes_remain_len %d\n", bytes_remain_len); in rk_i2c_write()
468 struct rk_i2c *i2c = dev_get_priv(bus); in rockchip_i2c_xfer() local
476 if (nmsgs > 2 || ((nmsgs == 2) && (msg->flags & I2C_M_RD))) { in rockchip_i2c_xfer()
478 return -EINVAL; in rockchip_i2c_xfer()
485 i2c->cfg |= I2C_CON_ACTACK; in rockchip_i2c_xfer()
486 for (; nmsgs > 0; nmsgs--, msg++) { in rockchip_i2c_xfer()
487 debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len); in rockchip_i2c_xfer()
489 if (msg->flags & I2C_M_RD) { in rockchip_i2c_xfer()
491 ret = rk_i2c_read(i2c, msg->addr, 0, 0, msg->buf, in rockchip_i2c_xfer()
492 msg->len, snd); in rockchip_i2c_xfer()
495 ret = rk_i2c_write(i2c, msg->addr, 0, 0, msg->buf, in rockchip_i2c_xfer()
496 msg->len); in rockchip_i2c_xfer()
506 rk_i2c_send_stop_bit(i2c); in rockchip_i2c_xfer()
507 rk_i2c_disable(i2c); in rockchip_i2c_xfer()
514 static unsigned int rk3x_i2c_get_version(struct rk_i2c *i2c) in rk3x_i2c_get_version() argument
516 struct i2c_regs *regs = i2c->regs; in rk3x_i2c_get_version()
519 version = readl(®s->con) & I2C_CON_VERSION; in rk3x_i2c_get_version()
526 struct rk_i2c *i2c = dev_get_priv(bus); in rockchip_i2c_set_bus_speed() local
528 if (rk3x_i2c_get_version(i2c) >= RK_I2C_VERSION1) in rockchip_i2c_set_bus_speed()
529 rk_i2c_adapter_clk(i2c, speed); in rockchip_i2c_set_bus_speed()
531 rk_i2c_set_clk(i2c, speed); in rockchip_i2c_set_bus_speed()
541 ret = clk_get_by_index(bus, 0, &priv->clk); in rockchip_i2c_ofdata_to_platdata()
544 bus->name, ret); in rockchip_i2c_ofdata_to_platdata()
555 priv->regs = dev_read_addr_ptr(bus); in rockchip_i2c_probe()
566 { .compatible = "rockchip,rk3066-i2c" },
567 { .compatible = "rockchip,rk3188-i2c" },
568 { .compatible = "rockchip,rk3288-i2c" },
569 { .compatible = "rockchip,rk3328-i2c" },
570 { .compatible = "rockchip,rk3399-i2c" },
571 { .compatible = "rockchip,rk3228-i2c" },
572 { .compatible = "rockchip,rv1108-i2c" },