Lines Matching +full:rk3188 +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0+
5 * (C) Copyright 2008-2014 Rockchip Electronics
13 #include <i2c.h>
16 #include <asm/arch/i2c.h>
21 /* i2c timerout */
25 /* rk i2c fifo max transfer bytes */
40 * @controller_type: i2c controller type
60 static void rk_i2c_set_clk(struct rk_i2c *i2c, uint32_t scl_rate) in rk_i2c_set_clk() argument
65 /* First get i2c rate from pclk */ in rk_i2c_set_clk()
66 i2c_rate = clk_get_rate(&i2c->clk); in rk_i2c_set_clk()
68 div = DIV_ROUND_UP(i2c_rate, scl_rate * 8) - 2; in rk_i2c_set_clk()
73 writel(I2C_CLKDIV_VAL(divl, divh), &i2c->regs->clkdiv); in rk_i2c_set_clk()
75 debug("rk_i2c_set_clk: i2c rate = %d, scl rate = %d\n", i2c_rate, in rk_i2c_set_clk()
77 debug("set i2c clk div = %d, divh = %d, divl = %d\n", div, divh, divl); in rk_i2c_set_clk()
78 debug("set clk(I2C_CLKDIV: 0x%08x)\n", readl(&i2c->regs->clkdiv)); in rk_i2c_set_clk()
86 debug("i2c_con: 0x%08x\n", readl(&regs->con)); in rk_i2c_show_regs()
87 debug("i2c_clkdiv: 0x%08x\n", readl(&regs->clkdiv)); in rk_i2c_show_regs()
88 debug("i2c_mrxaddr: 0x%08x\n", readl(&regs->mrxaddr)); in rk_i2c_show_regs()
89 debug("i2c_mrxraddR: 0x%08x\n", readl(&regs->mrxraddr)); in rk_i2c_show_regs()
90 debug("i2c_mtxcnt: 0x%08x\n", readl(&regs->mtxcnt)); in rk_i2c_show_regs()
91 debug("i2c_mrxcnt: 0x%08x\n", readl(&regs->mrxcnt)); in rk_i2c_show_regs()
92 debug("i2c_ien: 0x%08x\n", readl(&regs->ien)); in rk_i2c_show_regs()
93 debug("i2c_ipd: 0x%08x\n", readl(&regs->ipd)); in rk_i2c_show_regs()
94 debug("i2c_fcnt: 0x%08x\n", readl(&regs->fcnt)); in rk_i2c_show_regs()
96 debug("i2c_txdata%d: 0x%08x\n", i, readl(&regs->txdata[i])); in rk_i2c_show_regs()
98 debug("i2c_rxdata%d: 0x%08x\n", i, readl(&regs->rxdata[i])); in rk_i2c_show_regs()
102 static int rk_i2c_send_start_bit(struct rk_i2c *i2c) in rk_i2c_send_start_bit() argument
104 struct i2c_regs *regs = i2c->regs; in rk_i2c_send_start_bit()
107 debug("I2c Send Start bit.\n"); in rk_i2c_send_start_bit()
108 writel(I2C_IPD_ALL_CLEAN, &regs->ipd); in rk_i2c_send_start_bit()
110 writel(I2C_CON_EN | I2C_CON_START, &regs->con); in rk_i2c_send_start_bit()
111 writel(I2C_STARTIEN, &regs->ien); in rk_i2c_send_start_bit()
115 if (readl(&regs->ipd) & I2C_STARTIPD) { in rk_i2c_send_start_bit()
116 writel(I2C_STARTIPD, &regs->ipd); in rk_i2c_send_start_bit()
120 debug("I2C Send Start Bit Timeout\n"); in rk_i2c_send_start_bit()
122 return -ETIMEDOUT; in rk_i2c_send_start_bit()
130 static int rk_i2c_send_stop_bit(struct rk_i2c *i2c) in rk_i2c_send_stop_bit() argument
132 struct i2c_regs *regs = i2c->regs; in rk_i2c_send_stop_bit()
135 debug("I2c Send Stop bit.\n"); in rk_i2c_send_stop_bit()
136 writel(I2C_IPD_ALL_CLEAN, &regs->ipd); in rk_i2c_send_stop_bit()
138 writel(I2C_CON_EN | I2C_CON_STOP, &regs->con); in rk_i2c_send_stop_bit()
139 writel(I2C_CON_STOP, &regs->ien); in rk_i2c_send_stop_bit()
143 if (readl(&regs->ipd) & I2C_STOPIPD) { in rk_i2c_send_stop_bit()
144 writel(I2C_STOPIPD, &regs->ipd); in rk_i2c_send_stop_bit()
148 debug("I2C Send Start Bit Timeout\n"); in rk_i2c_send_stop_bit()
150 return -ETIMEDOUT; in rk_i2c_send_stop_bit()
158 static inline void rk_i2c_disable(struct rk_i2c *i2c) in rk_i2c_disable() argument
160 writel(0, &i2c->regs->con); in rk_i2c_disable()
163 static int rk_i2c_read(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len, in rk_i2c_read() argument
166 struct i2c_regs *regs = i2c->regs; in rk_i2c_read()
181 err = rk_i2c_send_start_bit(i2c); in rk_i2c_read()
185 writel(I2C_MRXADDR_SET(1, chip << 1 | 1), &regs->mrxaddr); in rk_i2c_read()
187 writel(0, &regs->mrxraddr); in rk_i2c_read()
189 writel(I2C_MRXRADDR_SET(r_len, reg), &regs->mrxraddr); in rk_i2c_read()
191 debug("I2C Read: addr len %d not supported\n", r_len); in rk_i2c_read()
192 return -EIO; in rk_i2c_read()
217 writel(con, &regs->con); in rk_i2c_read()
218 writel(bytes_xferred, &regs->mrxcnt); in rk_i2c_read()
219 writel(I2C_MBRFIEN | I2C_NAKRCVIEN, &regs->ien); in rk_i2c_read()
223 if (readl(&regs->ipd) & I2C_NAKRCVIPD) { in rk_i2c_read()
224 writel(I2C_NAKRCVIPD, &regs->ipd); in rk_i2c_read()
225 err = -EREMOTEIO; in rk_i2c_read()
227 if (readl(&regs->ipd) & I2C_MBRFIPD) { in rk_i2c_read()
228 writel(I2C_MBRFIPD, &regs->ipd); in rk_i2c_read()
232 debug("I2C Read Data Timeout\n"); in rk_i2c_read()
233 err = -ETIMEDOUT; in rk_i2c_read()
241 rxdata = readl(&regs->rxdata[i]); in rk_i2c_read()
242 debug("I2c Read RXDATA[%d] = 0x%x\n", i, rxdata); in rk_i2c_read()
250 bytes_remain_len -= bytes_xferred; in rk_i2c_read()
252 debug("I2C Read bytes_remain_len %d\n", bytes_remain_len); in rk_i2c_read()
256 rk_i2c_send_stop_bit(i2c); in rk_i2c_read()
257 rk_i2c_disable(i2c); in rk_i2c_read()
262 static int rk_i2c_write(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len, in rk_i2c_write() argument
265 struct i2c_regs *regs = i2c->regs; in rk_i2c_write()
277 err = rk_i2c_send_start_bit(i2c); in rk_i2c_write()
298 (0xff << ((j - 1) * 8))) << 8; in rk_i2c_write()
303 writel(txdata, &regs->txdata[i]); in rk_i2c_write()
304 debug("I2c Write TXDATA[%d] = 0x%08x\n", i, txdata); in rk_i2c_write()
307 writel(I2C_CON_EN | I2C_CON_MOD(I2C_MODE_TX), &regs->con); in rk_i2c_write()
308 writel(bytes_xferred, &regs->mtxcnt); in rk_i2c_write()
309 writel(I2C_MBTFIEN | I2C_NAKRCVIEN, &regs->ien); in rk_i2c_write()
313 if (readl(&regs->ipd) & I2C_NAKRCVIPD) { in rk_i2c_write()
314 writel(I2C_NAKRCVIPD, &regs->ipd); in rk_i2c_write()
315 err = -EREMOTEIO; in rk_i2c_write()
317 if (readl(&regs->ipd) & I2C_MBTFIPD) { in rk_i2c_write()
318 writel(I2C_MBTFIPD, &regs->ipd); in rk_i2c_write()
322 debug("I2C Write Data Timeout\n"); in rk_i2c_write()
323 err = -ETIMEDOUT; in rk_i2c_write()
330 bytes_remain_len -= bytes_xferred; in rk_i2c_write()
331 debug("I2C Write bytes_remain_len %d\n", bytes_remain_len); in rk_i2c_write()
335 rk_i2c_send_stop_bit(i2c); in rk_i2c_write()
336 rk_i2c_disable(i2c); in rk_i2c_write()
344 struct rk_i2c *i2c = dev_get_priv(bus); in rockchip_i2c_xfer() local
348 for (; nmsgs > 0; nmsgs--, msg++) { in rockchip_i2c_xfer()
349 debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len); in rockchip_i2c_xfer()
350 if (msg->flags & I2C_M_RD) { in rockchip_i2c_xfer()
351 ret = rk_i2c_read(i2c, msg->addr, 0, 0, msg->buf, in rockchip_i2c_xfer()
352 msg->len); in rockchip_i2c_xfer()
354 ret = rk_i2c_write(i2c, msg->addr, 0, 0, msg->buf, in rockchip_i2c_xfer()
355 msg->len); in rockchip_i2c_xfer()
359 return -EREMOTEIO; in rockchip_i2c_xfer()
368 struct rk_i2c *i2c = dev_get_priv(bus); in rockchip_i2c_set_bus_speed() local
370 rk_i2c_set_clk(i2c, speed); in rockchip_i2c_set_bus_speed()
380 ret = clk_get_by_index(bus, 0, &priv->clk); in rockchip_i2c_ofdata_to_platdata()
383 bus->name, ret); in rockchip_i2c_ofdata_to_platdata()
398 priv->regs = dev_read_addr_ptr(bus); in rockchip_i2c_probe()
402 if (soc_data->controller_type == RK_I2C_LEGACY) { in rockchip_i2c_probe()
406 __func__, bus->name, ret); in rockchip_i2c_probe()
416 /* pinctrl will switch I2C to new type */ in rockchip_i2c_probe()
419 debug("%s: Failed to switch I2C to new type %s: %d\n", in rockchip_i2c_probe()
420 __func__, bus->name, ret); in rockchip_i2c_probe()
459 .compatible = "rockchip,rk3066-i2c",
463 .compatible = "rockchip,rk3188-i2c",
467 .compatible = "rockchip,rk3228-i2c",
471 .compatible = "rockchip,rk3288-i2c",
475 .compatible = "rockchip,rk3328-i2c",
479 .compatible = "rockchip,rk3399-i2c",