134374699SSimon Glass /* 234374699SSimon Glass * (C) Copyright 2015 Google, Inc 334374699SSimon Glass * 434374699SSimon Glass * (C) Copyright 2008-2014 Rockchip Electronics 534374699SSimon Glass * Peter, Software Engineering, <superpeter.cai@gmail.com>. 634374699SSimon Glass * 734374699SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 834374699SSimon Glass */ 934374699SSimon Glass 1034374699SSimon Glass #include <common.h> 1134374699SSimon Glass #include <clk.h> 1234374699SSimon Glass #include <dm.h> 1334374699SSimon Glass #include <errno.h> 1434374699SSimon Glass #include <i2c.h> 1534374699SSimon Glass #include <asm/io.h> 1634374699SSimon Glass #include <asm/arch/clock.h> 1734374699SSimon Glass #include <asm/arch/i2c.h> 1834374699SSimon Glass #include <asm/arch/periph.h> 1934374699SSimon Glass #include <dm/pinctrl.h> 2034374699SSimon Glass #include <linux/sizes.h> 2134374699SSimon Glass 2234374699SSimon Glass DECLARE_GLOBAL_DATA_PTR; 2334374699SSimon Glass 2434374699SSimon Glass /* i2c timerout */ 2534374699SSimon Glass #define I2C_TIMEOUT_MS 100 2634374699SSimon Glass #define I2C_RETRY_COUNT 3 2734374699SSimon Glass 2834374699SSimon Glass /* rk i2c fifo max transfer bytes */ 2934374699SSimon Glass #define RK_I2C_FIFO_SIZE 32 3034374699SSimon Glass 3134374699SSimon Glass struct rk_i2c { 32135aa950SStephen Warren struct clk clk; 3334374699SSimon Glass struct i2c_regs *regs; 3434374699SSimon Glass unsigned int speed; 3534374699SSimon Glass }; 3634374699SSimon Glass 3734374699SSimon Glass static inline void rk_i2c_get_div(int div, int *divh, int *divl) 3834374699SSimon Glass { 3934374699SSimon Glass *divl = div / 2; 4034374699SSimon Glass if (div % 2 == 0) 4134374699SSimon Glass *divh = div / 2; 4234374699SSimon Glass else 4334374699SSimon Glass *divh = DIV_ROUND_UP(div, 2); 4434374699SSimon Glass } 4534374699SSimon Glass 4634374699SSimon Glass /* 4734374699SSimon Glass * SCL Divisor = 8 * (CLKDIVL+1 + CLKDIVH+1) 4834374699SSimon Glass * SCL = PCLK / SCLK Divisor 4934374699SSimon Glass * i2c_rate = PCLK 5034374699SSimon Glass */ 5134374699SSimon Glass static void rk_i2c_set_clk(struct rk_i2c *i2c, uint32_t scl_rate) 5234374699SSimon Glass { 5334374699SSimon Glass uint32_t i2c_rate; 5434374699SSimon Glass int div, divl, divh; 5534374699SSimon Glass 5634374699SSimon Glass /* First get i2c rate from pclk */ 57135aa950SStephen Warren i2c_rate = clk_get_rate(&i2c->clk); 5834374699SSimon Glass 5934374699SSimon Glass div = DIV_ROUND_UP(i2c_rate, scl_rate * 8) - 2; 6034374699SSimon Glass divh = 0; 6134374699SSimon Glass divl = 0; 6234374699SSimon Glass if (div >= 0) 6334374699SSimon Glass rk_i2c_get_div(div, &divh, &divl); 6434374699SSimon Glass writel(I2C_CLKDIV_VAL(divl, divh), &i2c->regs->clkdiv); 6534374699SSimon Glass 6634374699SSimon Glass debug("rk_i2c_set_clk: i2c rate = %d, scl rate = %d\n", i2c_rate, 6734374699SSimon Glass scl_rate); 6834374699SSimon Glass debug("set i2c clk div = %d, divh = %d, divl = %d\n", div, divh, divl); 6934374699SSimon Glass debug("set clk(I2C_CLKDIV: 0x%08x)\n", readl(&i2c->regs->clkdiv)); 7034374699SSimon Glass } 7134374699SSimon Glass 7234374699SSimon Glass static void rk_i2c_show_regs(struct i2c_regs *regs) 7334374699SSimon Glass { 7434374699SSimon Glass #ifdef DEBUG 7534374699SSimon Glass uint i; 7634374699SSimon Glass 7734374699SSimon Glass debug("i2c_con: 0x%08x\n", readl(®s->con)); 7834374699SSimon Glass debug("i2c_clkdiv: 0x%08x\n", readl(®s->clkdiv)); 7934374699SSimon Glass debug("i2c_mrxaddr: 0x%08x\n", readl(®s->mrxaddr)); 8034374699SSimon Glass debug("i2c_mrxraddR: 0x%08x\n", readl(®s->mrxraddr)); 8134374699SSimon Glass debug("i2c_mtxcnt: 0x%08x\n", readl(®s->mtxcnt)); 8234374699SSimon Glass debug("i2c_mrxcnt: 0x%08x\n", readl(®s->mrxcnt)); 8334374699SSimon Glass debug("i2c_ien: 0x%08x\n", readl(®s->ien)); 8434374699SSimon Glass debug("i2c_ipd: 0x%08x\n", readl(®s->ipd)); 8534374699SSimon Glass debug("i2c_fcnt: 0x%08x\n", readl(®s->fcnt)); 8634374699SSimon Glass for (i = 0; i < 8; i++) 8734374699SSimon Glass debug("i2c_txdata%d: 0x%08x\n", i, readl(®s->txdata[i])); 8834374699SSimon Glass for (i = 0; i < 8; i++) 8934374699SSimon Glass debug("i2c_rxdata%d: 0x%08x\n", i, readl(®s->rxdata[i])); 9034374699SSimon Glass #endif 9134374699SSimon Glass } 9234374699SSimon Glass 9334374699SSimon Glass static int rk_i2c_send_start_bit(struct rk_i2c *i2c) 9434374699SSimon Glass { 9534374699SSimon Glass struct i2c_regs *regs = i2c->regs; 9634374699SSimon Glass ulong start; 9734374699SSimon Glass 9834374699SSimon Glass debug("I2c Send Start bit.\n"); 9934374699SSimon Glass writel(I2C_IPD_ALL_CLEAN, ®s->ipd); 10034374699SSimon Glass 10134374699SSimon Glass writel(I2C_CON_EN | I2C_CON_START, ®s->con); 10234374699SSimon Glass writel(I2C_STARTIEN, ®s->ien); 10334374699SSimon Glass 10434374699SSimon Glass start = get_timer(0); 10534374699SSimon Glass while (1) { 10634374699SSimon Glass if (readl(®s->ipd) & I2C_STARTIPD) { 10734374699SSimon Glass writel(I2C_STARTIPD, ®s->ipd); 10834374699SSimon Glass break; 10934374699SSimon Glass } 11034374699SSimon Glass if (get_timer(start) > I2C_TIMEOUT_MS) { 11134374699SSimon Glass debug("I2C Send Start Bit Timeout\n"); 11234374699SSimon Glass rk_i2c_show_regs(regs); 11334374699SSimon Glass return -ETIMEDOUT; 11434374699SSimon Glass } 11534374699SSimon Glass udelay(1); 11634374699SSimon Glass } 11734374699SSimon Glass 11834374699SSimon Glass return 0; 11934374699SSimon Glass } 12034374699SSimon Glass 12134374699SSimon Glass static int rk_i2c_send_stop_bit(struct rk_i2c *i2c) 12234374699SSimon Glass { 12334374699SSimon Glass struct i2c_regs *regs = i2c->regs; 12434374699SSimon Glass ulong start; 12534374699SSimon Glass 12634374699SSimon Glass debug("I2c Send Stop bit.\n"); 12734374699SSimon Glass writel(I2C_IPD_ALL_CLEAN, ®s->ipd); 12834374699SSimon Glass 12934374699SSimon Glass writel(I2C_CON_EN | I2C_CON_STOP, ®s->con); 13034374699SSimon Glass writel(I2C_CON_STOP, ®s->ien); 13134374699SSimon Glass 13234374699SSimon Glass start = get_timer(0); 13334374699SSimon Glass while (1) { 13434374699SSimon Glass if (readl(®s->ipd) & I2C_STOPIPD) { 13534374699SSimon Glass writel(I2C_STOPIPD, ®s->ipd); 13634374699SSimon Glass break; 13734374699SSimon Glass } 13834374699SSimon Glass if (get_timer(start) > I2C_TIMEOUT_MS) { 13934374699SSimon Glass debug("I2C Send Start Bit Timeout\n"); 14034374699SSimon Glass rk_i2c_show_regs(regs); 14134374699SSimon Glass return -ETIMEDOUT; 14234374699SSimon Glass } 14334374699SSimon Glass udelay(1); 14434374699SSimon Glass } 14534374699SSimon Glass 14634374699SSimon Glass return 0; 14734374699SSimon Glass } 14834374699SSimon Glass 14934374699SSimon Glass static inline void rk_i2c_disable(struct rk_i2c *i2c) 15034374699SSimon Glass { 151*7ef28ab6SDavid Wu writel(0, &i2c->regs->ien); 152*7ef28ab6SDavid Wu writel(I2C_IPD_ALL_CLEAN, &i2c->regs->ipd); 15334374699SSimon Glass writel(0, &i2c->regs->con); 15434374699SSimon Glass } 15534374699SSimon Glass 15634374699SSimon Glass static int rk_i2c_read(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len, 15734374699SSimon Glass uchar *buf, uint b_len) 15834374699SSimon Glass { 15934374699SSimon Glass struct i2c_regs *regs = i2c->regs; 16034374699SSimon Glass uchar *pbuf = buf; 16134374699SSimon Glass uint bytes_remain_len = b_len; 16234374699SSimon Glass uint bytes_xferred = 0; 16334374699SSimon Glass uint words_xferred = 0; 16434374699SSimon Glass ulong start; 16534374699SSimon Glass uint con = 0; 16634374699SSimon Glass uint rxdata; 16734374699SSimon Glass uint i, j; 16834374699SSimon Glass int err; 1695deaa530SWadim Egorov bool snd_chunk = false; 17034374699SSimon Glass 17134374699SSimon Glass debug("rk_i2c_read: chip = %d, reg = %d, r_len = %d, b_len = %d\n", 17234374699SSimon Glass chip, reg, r_len, b_len); 17334374699SSimon Glass 17434374699SSimon Glass err = rk_i2c_send_start_bit(i2c); 17534374699SSimon Glass if (err) 17634374699SSimon Glass return err; 17734374699SSimon Glass 17834374699SSimon Glass writel(I2C_MRXADDR_SET(1, chip << 1 | 1), ®s->mrxaddr); 17934374699SSimon Glass if (r_len == 0) { 18034374699SSimon Glass writel(0, ®s->mrxraddr); 18134374699SSimon Glass } else if (r_len < 4) { 18234374699SSimon Glass writel(I2C_MRXRADDR_SET(r_len, reg), ®s->mrxraddr); 18334374699SSimon Glass } else { 18434374699SSimon Glass debug("I2C Read: addr len %d not supported\n", r_len); 18534374699SSimon Glass return -EIO; 18634374699SSimon Glass } 18734374699SSimon Glass 18834374699SSimon Glass while (bytes_remain_len) { 18934374699SSimon Glass if (bytes_remain_len > RK_I2C_FIFO_SIZE) { 1905deaa530SWadim Egorov con = I2C_CON_EN; 19134374699SSimon Glass bytes_xferred = 32; 19234374699SSimon Glass } else { 1935deaa530SWadim Egorov /* 1945deaa530SWadim Egorov * The hw can read up to 32 bytes at a time. If we need 1955deaa530SWadim Egorov * more than one chunk, send an ACK after the last byte. 1965deaa530SWadim Egorov */ 1975deaa530SWadim Egorov con = I2C_CON_EN | I2C_CON_LASTACK; 19834374699SSimon Glass bytes_xferred = bytes_remain_len; 19934374699SSimon Glass } 20034374699SSimon Glass words_xferred = DIV_ROUND_UP(bytes_xferred, 4); 20134374699SSimon Glass 2025deaa530SWadim Egorov /* 2035deaa530SWadim Egorov * make sure we are in plain RX mode if we read a second chunk 2045deaa530SWadim Egorov */ 2055deaa530SWadim Egorov if (snd_chunk) 2065deaa530SWadim Egorov con |= I2C_CON_MOD(I2C_MODE_RX); 2075deaa530SWadim Egorov else 2085deaa530SWadim Egorov con |= I2C_CON_MOD(I2C_MODE_TRX); 2095deaa530SWadim Egorov 21034374699SSimon Glass writel(con, ®s->con); 21134374699SSimon Glass writel(bytes_xferred, ®s->mrxcnt); 21234374699SSimon Glass writel(I2C_MBRFIEN | I2C_NAKRCVIEN, ®s->ien); 21334374699SSimon Glass 21434374699SSimon Glass start = get_timer(0); 21534374699SSimon Glass while (1) { 21634374699SSimon Glass if (readl(®s->ipd) & I2C_NAKRCVIPD) { 21734374699SSimon Glass writel(I2C_NAKRCVIPD, ®s->ipd); 21834374699SSimon Glass err = -EREMOTEIO; 21934374699SSimon Glass } 22034374699SSimon Glass if (readl(®s->ipd) & I2C_MBRFIPD) { 22134374699SSimon Glass writel(I2C_MBRFIPD, ®s->ipd); 22234374699SSimon Glass break; 22334374699SSimon Glass } 22434374699SSimon Glass if (get_timer(start) > I2C_TIMEOUT_MS) { 22534374699SSimon Glass debug("I2C Read Data Timeout\n"); 22634374699SSimon Glass err = -ETIMEDOUT; 22734374699SSimon Glass rk_i2c_show_regs(regs); 22834374699SSimon Glass goto i2c_exit; 22934374699SSimon Glass } 23034374699SSimon Glass udelay(1); 23134374699SSimon Glass } 23234374699SSimon Glass 23334374699SSimon Glass for (i = 0; i < words_xferred; i++) { 23434374699SSimon Glass rxdata = readl(®s->rxdata[i]); 23534374699SSimon Glass debug("I2c Read RXDATA[%d] = 0x%x\n", i, rxdata); 23634374699SSimon Glass for (j = 0; j < 4; j++) { 23734374699SSimon Glass if ((i * 4 + j) == bytes_xferred) 23834374699SSimon Glass break; 23934374699SSimon Glass *pbuf++ = (rxdata >> (j * 8)) & 0xff; 24034374699SSimon Glass } 24134374699SSimon Glass } 24234374699SSimon Glass 24334374699SSimon Glass bytes_remain_len -= bytes_xferred; 2445deaa530SWadim Egorov snd_chunk = true; 24534374699SSimon Glass debug("I2C Read bytes_remain_len %d\n", bytes_remain_len); 24634374699SSimon Glass } 24734374699SSimon Glass 24834374699SSimon Glass i2c_exit: 24934374699SSimon Glass rk_i2c_disable(i2c); 25034374699SSimon Glass 25134374699SSimon Glass return err; 25234374699SSimon Glass } 25334374699SSimon Glass 25434374699SSimon Glass static int rk_i2c_write(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len, 25534374699SSimon Glass uchar *buf, uint b_len) 25634374699SSimon Glass { 25734374699SSimon Glass struct i2c_regs *regs = i2c->regs; 25834374699SSimon Glass int err; 25934374699SSimon Glass uchar *pbuf = buf; 26034374699SSimon Glass uint bytes_remain_len = b_len + r_len + 1; 26134374699SSimon Glass uint bytes_xferred = 0; 26234374699SSimon Glass uint words_xferred = 0; 26334374699SSimon Glass ulong start; 26434374699SSimon Glass uint txdata; 26534374699SSimon Glass uint i, j; 26634374699SSimon Glass 26734374699SSimon Glass debug("rk_i2c_write: chip = %d, reg = %d, r_len = %d, b_len = %d\n", 26834374699SSimon Glass chip, reg, r_len, b_len); 26934374699SSimon Glass err = rk_i2c_send_start_bit(i2c); 27034374699SSimon Glass if (err) 27134374699SSimon Glass return err; 27234374699SSimon Glass 27334374699SSimon Glass while (bytes_remain_len) { 27434374699SSimon Glass if (bytes_remain_len > RK_I2C_FIFO_SIZE) 27580333fd8SJohn Keeping bytes_xferred = RK_I2C_FIFO_SIZE; 27634374699SSimon Glass else 27734374699SSimon Glass bytes_xferred = bytes_remain_len; 27834374699SSimon Glass words_xferred = DIV_ROUND_UP(bytes_xferred, 4); 27934374699SSimon Glass 28034374699SSimon Glass for (i = 0; i < words_xferred; i++) { 28134374699SSimon Glass txdata = 0; 28234374699SSimon Glass for (j = 0; j < 4; j++) { 28334374699SSimon Glass if ((i * 4 + j) == bytes_xferred) 28434374699SSimon Glass break; 28534374699SSimon Glass 28621d4b7d4SJohn Keeping if (i == 0 && j == 0 && pbuf == buf) { 28734374699SSimon Glass txdata |= (chip << 1); 28821d4b7d4SJohn Keeping } else if (i == 0 && j <= r_len && pbuf == buf) { 28934374699SSimon Glass txdata |= (reg & 29034374699SSimon Glass (0xff << ((j - 1) * 8))) << 8; 29134374699SSimon Glass } else { 29234374699SSimon Glass txdata |= (*pbuf++)<<(j * 8); 29334374699SSimon Glass } 29434374699SSimon Glass } 295551288bdSJohn Keeping writel(txdata, ®s->txdata[i]); 296551288bdSJohn Keeping debug("I2c Write TXDATA[%d] = 0x%08x\n", i, txdata); 29734374699SSimon Glass } 29834374699SSimon Glass 29934374699SSimon Glass writel(I2C_CON_EN | I2C_CON_MOD(I2C_MODE_TX), ®s->con); 30034374699SSimon Glass writel(bytes_xferred, ®s->mtxcnt); 30134374699SSimon Glass writel(I2C_MBTFIEN | I2C_NAKRCVIEN, ®s->ien); 30234374699SSimon Glass 30334374699SSimon Glass start = get_timer(0); 30434374699SSimon Glass while (1) { 30534374699SSimon Glass if (readl(®s->ipd) & I2C_NAKRCVIPD) { 30634374699SSimon Glass writel(I2C_NAKRCVIPD, ®s->ipd); 30734374699SSimon Glass err = -EREMOTEIO; 30834374699SSimon Glass } 30934374699SSimon Glass if (readl(®s->ipd) & I2C_MBTFIPD) { 31034374699SSimon Glass writel(I2C_MBTFIPD, ®s->ipd); 31134374699SSimon Glass break; 31234374699SSimon Glass } 31334374699SSimon Glass if (get_timer(start) > I2C_TIMEOUT_MS) { 31434374699SSimon Glass debug("I2C Write Data Timeout\n"); 31534374699SSimon Glass err = -ETIMEDOUT; 31634374699SSimon Glass rk_i2c_show_regs(regs); 31734374699SSimon Glass goto i2c_exit; 31834374699SSimon Glass } 31934374699SSimon Glass udelay(1); 32034374699SSimon Glass } 32134374699SSimon Glass 32234374699SSimon Glass bytes_remain_len -= bytes_xferred; 32334374699SSimon Glass debug("I2C Write bytes_remain_len %d\n", bytes_remain_len); 32434374699SSimon Glass } 32534374699SSimon Glass 32634374699SSimon Glass i2c_exit: 32734374699SSimon Glass rk_i2c_disable(i2c); 32834374699SSimon Glass 32934374699SSimon Glass return err; 33034374699SSimon Glass } 33134374699SSimon Glass 33234374699SSimon Glass static int rockchip_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, 33334374699SSimon Glass int nmsgs) 33434374699SSimon Glass { 33534374699SSimon Glass struct rk_i2c *i2c = dev_get_priv(bus); 33634374699SSimon Glass int ret; 33734374699SSimon Glass 33834374699SSimon Glass debug("i2c_xfer: %d messages\n", nmsgs); 33934374699SSimon Glass for (; nmsgs > 0; nmsgs--, msg++) { 34034374699SSimon Glass debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len); 34134374699SSimon Glass if (msg->flags & I2C_M_RD) { 34234374699SSimon Glass ret = rk_i2c_read(i2c, msg->addr, 0, 0, msg->buf, 34334374699SSimon Glass msg->len); 34434374699SSimon Glass } else { 34534374699SSimon Glass ret = rk_i2c_write(i2c, msg->addr, 0, 0, msg->buf, 34634374699SSimon Glass msg->len); 34734374699SSimon Glass } 34834374699SSimon Glass if (ret) { 34934374699SSimon Glass debug("i2c_write: error sending\n"); 35034374699SSimon Glass return -EREMOTEIO; 35134374699SSimon Glass } 35234374699SSimon Glass } 35334374699SSimon Glass 354133495afSVasily Khoruzhick rk_i2c_send_stop_bit(i2c); 355133495afSVasily Khoruzhick rk_i2c_disable(i2c); 356133495afSVasily Khoruzhick 35734374699SSimon Glass return 0; 35834374699SSimon Glass } 35934374699SSimon Glass 36034374699SSimon Glass int rockchip_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) 36134374699SSimon Glass { 36234374699SSimon Glass struct rk_i2c *i2c = dev_get_priv(bus); 36334374699SSimon Glass 36434374699SSimon Glass rk_i2c_set_clk(i2c, speed); 36534374699SSimon Glass 36634374699SSimon Glass return 0; 36734374699SSimon Glass } 36834374699SSimon Glass 369930bc374SSimon Glass static int rockchip_i2c_ofdata_to_platdata(struct udevice *bus) 37034374699SSimon Glass { 371930bc374SSimon Glass struct rk_i2c *priv = dev_get_priv(bus); 37234374699SSimon Glass int ret; 37334374699SSimon Glass 374930bc374SSimon Glass ret = clk_get_by_index(bus, 0, &priv->clk); 375930bc374SSimon Glass if (ret < 0) { 376930bc374SSimon Glass debug("%s: Could not get clock for %s: %d\n", __func__, 377930bc374SSimon Glass bus->name, ret); 37834374699SSimon Glass return ret; 379930bc374SSimon Glass } 380930bc374SSimon Glass 381930bc374SSimon Glass return 0; 382930bc374SSimon Glass } 383930bc374SSimon Glass 384930bc374SSimon Glass static int rockchip_i2c_probe(struct udevice *bus) 385930bc374SSimon Glass { 386930bc374SSimon Glass struct rk_i2c *priv = dev_get_priv(bus); 387930bc374SSimon Glass 388e2186db8SPhilipp Tomsich priv->regs = dev_read_addr_ptr(bus); 389930bc374SSimon Glass 390930bc374SSimon Glass return 0; 39134374699SSimon Glass } 39234374699SSimon Glass 39334374699SSimon Glass static const struct dm_i2c_ops rockchip_i2c_ops = { 39434374699SSimon Glass .xfer = rockchip_i2c_xfer, 39534374699SSimon Glass .set_bus_speed = rockchip_i2c_set_bus_speed, 39634374699SSimon Glass }; 39734374699SSimon Glass 39834374699SSimon Glass static const struct udevice_id rockchip_i2c_ids[] = { 39902a7d833SHeiko Stübner { .compatible = "rockchip,rk3066-i2c" }, 40002a7d833SHeiko Stübner { .compatible = "rockchip,rk3188-i2c" }, 40134374699SSimon Glass { .compatible = "rockchip,rk3288-i2c" }, 4024d786a23SElaine Zhang { .compatible = "rockchip,rk3328-i2c" }, 403b644354aSeric.gao@rock-chips.com { .compatible = "rockchip,rk3399-i2c" }, 404f312c7e4SShunqing Chen { .compatible = "rockchip,rk3228-i2c" }, 4052fe2ebadSElaine Zhang { .compatible = "rockchip,rv1108-i2c" }, 40634374699SSimon Glass { } 40734374699SSimon Glass }; 40834374699SSimon Glass 40934374699SSimon Glass U_BOOT_DRIVER(i2c_rockchip) = { 41034374699SSimon Glass .name = "i2c_rockchip", 41134374699SSimon Glass .id = UCLASS_I2C, 41234374699SSimon Glass .of_match = rockchip_i2c_ids, 413930bc374SSimon Glass .ofdata_to_platdata = rockchip_i2c_ofdata_to_platdata, 41434374699SSimon Glass .probe = rockchip_i2c_probe, 41534374699SSimon Glass .priv_auto_alloc_size = sizeof(struct rk_i2c), 41634374699SSimon Glass .ops = &rockchip_i2c_ops, 41734374699SSimon Glass }; 418