xref: /openbmc/u-boot/drivers/i2c/sh_i2c.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
23dab3e0eSNobuhiro Iwamatsu /*
3b55b8eefSNobuhiro Iwamatsu  * Copyright (C) 2011, 2013 Renesas Solutions Corp.
4b55b8eefSNobuhiro Iwamatsu  * Copyright (C) 2011, 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
53dab3e0eSNobuhiro Iwamatsu  *
628527096SSimon Glass  * NOTE: This driver should be converted to driver model before June 2017.
728527096SSimon Glass  * Please see doc/driver-model/i2c-howto.txt for instructions.
83dab3e0eSNobuhiro Iwamatsu  */
93dab3e0eSNobuhiro Iwamatsu 
103dab3e0eSNobuhiro Iwamatsu #include <common.h>
112035d77dSNobuhiro Iwamatsu #include <i2c.h>
123dab3e0eSNobuhiro Iwamatsu #include <asm/io.h>
133dab3e0eSNobuhiro Iwamatsu 
14b55b8eefSNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
15b55b8eefSNobuhiro Iwamatsu 
163dab3e0eSNobuhiro Iwamatsu /* Every register is 32bit aligned, but only 8bits in size */
173dab3e0eSNobuhiro Iwamatsu #define ureg(name) u8 name; u8 __pad_##name##0; u16 __pad_##name##1;
183dab3e0eSNobuhiro Iwamatsu struct sh_i2c {
193dab3e0eSNobuhiro Iwamatsu 	ureg(icdr);
203dab3e0eSNobuhiro Iwamatsu 	ureg(iccr);
213dab3e0eSNobuhiro Iwamatsu 	ureg(icsr);
223dab3e0eSNobuhiro Iwamatsu 	ureg(icic);
233dab3e0eSNobuhiro Iwamatsu 	ureg(iccl);
243dab3e0eSNobuhiro Iwamatsu 	ureg(icch);
253dab3e0eSNobuhiro Iwamatsu };
263dab3e0eSNobuhiro Iwamatsu #undef ureg
273dab3e0eSNobuhiro Iwamatsu 
283dab3e0eSNobuhiro Iwamatsu /* ICCR */
293dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_ICE		(1 << 7)
303dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RACK	(1 << 6)
313dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RTS		(1 << 4)
323dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_BUSY	(1 << 2)
333dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_SCP		(1 << 0)
343dab3e0eSNobuhiro Iwamatsu 
353dab3e0eSNobuhiro Iwamatsu /* ICSR / ICIC */
3657d7c804STetsuyuki Kobayashi #define SH_IC_BUSY	(1 << 4)
373dab3e0eSNobuhiro Iwamatsu #define SH_IC_TACK	(1 << 2)
383dab3e0eSNobuhiro Iwamatsu #define SH_IC_WAIT	(1 << 1)
393dab3e0eSNobuhiro Iwamatsu #define SH_IC_DTE	(1 << 0)
403dab3e0eSNobuhiro Iwamatsu 
41b1af67feSTetsuyuki Kobayashi #ifdef CONFIG_SH_I2C_8BIT
42b1af67feSTetsuyuki Kobayashi /* store 8th bit of iccl and icch in ICIC register */
43b1af67feSTetsuyuki Kobayashi #define SH_I2C_ICIC_ICCLB8	(1 << 7)
44b1af67feSTetsuyuki Kobayashi #define SH_I2C_ICIC_ICCHB8	(1 << 6)
45b1af67feSTetsuyuki Kobayashi #endif
46b1af67feSTetsuyuki Kobayashi 
472035d77dSNobuhiro Iwamatsu static const struct sh_i2c *i2c_dev[CONFIG_SYS_I2C_SH_NUM_CONTROLLERS] = {
482035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE0,
492035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE1
502035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE1,
512035d77dSNobuhiro Iwamatsu #endif
522035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE2
532035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE2,
542035d77dSNobuhiro Iwamatsu #endif
552035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE3
562035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE3,
572035d77dSNobuhiro Iwamatsu #endif
582035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE4
592035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE4,
602035d77dSNobuhiro Iwamatsu #endif
612035d77dSNobuhiro Iwamatsu };
622035d77dSNobuhiro Iwamatsu 
63b1af67feSTetsuyuki Kobayashi static u16 iccl, icch;
643dab3e0eSNobuhiro Iwamatsu 
653dab3e0eSNobuhiro Iwamatsu #define IRQ_WAIT 1000
663dab3e0eSNobuhiro Iwamatsu 
sh_irq_dte(struct sh_i2c * dev)672035d77dSNobuhiro Iwamatsu static void sh_irq_dte(struct sh_i2c *dev)
683dab3e0eSNobuhiro Iwamatsu {
693dab3e0eSNobuhiro Iwamatsu 	int i;
703dab3e0eSNobuhiro Iwamatsu 
713dab3e0eSNobuhiro Iwamatsu 	for (i = 0; i < IRQ_WAIT; i++) {
722035d77dSNobuhiro Iwamatsu 		if (SH_IC_DTE & readb(&dev->icsr))
733dab3e0eSNobuhiro Iwamatsu 			break;
743dab3e0eSNobuhiro Iwamatsu 		udelay(10);
753dab3e0eSNobuhiro Iwamatsu 	}
763dab3e0eSNobuhiro Iwamatsu }
773dab3e0eSNobuhiro Iwamatsu 
sh_irq_dte_with_tack(struct sh_i2c * dev)782035d77dSNobuhiro Iwamatsu static int sh_irq_dte_with_tack(struct sh_i2c *dev)
79d042d712STetsuyuki Kobayashi {
80d042d712STetsuyuki Kobayashi 	int i;
81d042d712STetsuyuki Kobayashi 
82d042d712STetsuyuki Kobayashi 	for (i = 0; i < IRQ_WAIT; i++) {
832035d77dSNobuhiro Iwamatsu 		if (SH_IC_DTE & readb(&dev->icsr))
84d042d712STetsuyuki Kobayashi 			break;
852035d77dSNobuhiro Iwamatsu 		if (SH_IC_TACK & readb(&dev->icsr))
86d042d712STetsuyuki Kobayashi 			return -1;
87d042d712STetsuyuki Kobayashi 		udelay(10);
88d042d712STetsuyuki Kobayashi 	}
89d042d712STetsuyuki Kobayashi 	return 0;
90d042d712STetsuyuki Kobayashi }
91d042d712STetsuyuki Kobayashi 
sh_irq_busy(struct sh_i2c * dev)922035d77dSNobuhiro Iwamatsu static void sh_irq_busy(struct sh_i2c *dev)
933dab3e0eSNobuhiro Iwamatsu {
943dab3e0eSNobuhiro Iwamatsu 	int i;
953dab3e0eSNobuhiro Iwamatsu 
963dab3e0eSNobuhiro Iwamatsu 	for (i = 0; i < IRQ_WAIT; i++) {
972035d77dSNobuhiro Iwamatsu 		if (!(SH_IC_BUSY & readb(&dev->icsr)))
983dab3e0eSNobuhiro Iwamatsu 			break;
993dab3e0eSNobuhiro Iwamatsu 		udelay(10);
1003dab3e0eSNobuhiro Iwamatsu 	}
1013dab3e0eSNobuhiro Iwamatsu }
1023dab3e0eSNobuhiro Iwamatsu 
sh_i2c_set_addr(struct sh_i2c * dev,u8 chip,u8 addr,int stop)1032035d77dSNobuhiro Iwamatsu static int sh_i2c_set_addr(struct sh_i2c *dev, u8 chip, u8 addr, int stop)
1043dab3e0eSNobuhiro Iwamatsu {
105d042d712STetsuyuki Kobayashi 	u8 icic = SH_IC_TACK;
106b1af67feSTetsuyuki Kobayashi 
1072035d77dSNobuhiro Iwamatsu 	debug("%s: chip: %x, addr: %x iccl: %x, icch %x\n",
1082035d77dSNobuhiro Iwamatsu 				__func__, chip, addr, iccl, icch);
1092035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1102035d77dSNobuhiro Iwamatsu 	setbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1113dab3e0eSNobuhiro Iwamatsu 
1122035d77dSNobuhiro Iwamatsu 	writeb(iccl & 0xff, &dev->iccl);
1132035d77dSNobuhiro Iwamatsu 	writeb(icch & 0xff, &dev->icch);
114b1af67feSTetsuyuki Kobayashi #ifdef CONFIG_SH_I2C_8BIT
115b1af67feSTetsuyuki Kobayashi 	if (iccl > 0xff)
116b1af67feSTetsuyuki Kobayashi 		icic |= SH_I2C_ICIC_ICCLB8;
117b1af67feSTetsuyuki Kobayashi 	if (icch > 0xff)
118b1af67feSTetsuyuki Kobayashi 		icic |= SH_I2C_ICIC_ICCHB8;
119b1af67feSTetsuyuki Kobayashi #endif
1202035d77dSNobuhiro Iwamatsu 	writeb(icic, &dev->icic);
1213dab3e0eSNobuhiro Iwamatsu 
1222035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &dev->iccr);
1232035d77dSNobuhiro Iwamatsu 	sh_irq_dte(dev);
1243dab3e0eSNobuhiro Iwamatsu 
1252035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->icsr, SH_IC_TACK);
1262035d77dSNobuhiro Iwamatsu 	writeb(chip << 1, &dev->icdr);
1272035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
128d042d712STetsuyuki Kobayashi 		return -1;
1293dab3e0eSNobuhiro Iwamatsu 
1302035d77dSNobuhiro Iwamatsu 	writeb(addr, &dev->icdr);
1313dab3e0eSNobuhiro Iwamatsu 	if (stop)
1322035d77dSNobuhiro Iwamatsu 		writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS), &dev->iccr);
1333dab3e0eSNobuhiro Iwamatsu 
1342035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
135d042d712STetsuyuki Kobayashi 		return -1;
136d042d712STetsuyuki Kobayashi 	return 0;
1373dab3e0eSNobuhiro Iwamatsu }
1383dab3e0eSNobuhiro Iwamatsu 
sh_i2c_finish(struct sh_i2c * dev)1392035d77dSNobuhiro Iwamatsu static void sh_i2c_finish(struct sh_i2c *dev)
1403dab3e0eSNobuhiro Iwamatsu {
1412035d77dSNobuhiro Iwamatsu 	writeb(0, &dev->icsr);
1422035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1433dab3e0eSNobuhiro Iwamatsu }
1443dab3e0eSNobuhiro Iwamatsu 
1452035d77dSNobuhiro Iwamatsu static int
sh_i2c_raw_write(struct sh_i2c * dev,u8 chip,uint addr,u8 val)1462035d77dSNobuhiro Iwamatsu sh_i2c_raw_write(struct sh_i2c *dev, u8 chip, uint addr, u8 val)
1473dab3e0eSNobuhiro Iwamatsu {
1480e5fb33cSTetsuyuki Kobayashi 	int ret = -1;
1492035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 0) != 0)
1500e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1513dab3e0eSNobuhiro Iwamatsu 	udelay(10);
1523dab3e0eSNobuhiro Iwamatsu 
1532035d77dSNobuhiro Iwamatsu 	writeb(val, &dev->icdr);
1542035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1550e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1563dab3e0eSNobuhiro Iwamatsu 
1572035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE | SH_I2C_ICCR_RTS), &dev->iccr);
1582035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1590e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1602035d77dSNobuhiro Iwamatsu 	sh_irq_busy(dev);
1610e5fb33cSTetsuyuki Kobayashi 	ret = 0;
1622035d77dSNobuhiro Iwamatsu 
1630e5fb33cSTetsuyuki Kobayashi exit0:
1642035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
1650e5fb33cSTetsuyuki Kobayashi 	return ret;
1663dab3e0eSNobuhiro Iwamatsu }
1673dab3e0eSNobuhiro Iwamatsu 
sh_i2c_raw_read(struct sh_i2c * dev,u8 chip,u8 addr)1682035d77dSNobuhiro Iwamatsu static int sh_i2c_raw_read(struct sh_i2c *dev, u8 chip, u8 addr)
1693dab3e0eSNobuhiro Iwamatsu {
1700e5fb33cSTetsuyuki Kobayashi 	int ret = -1;
1713dab3e0eSNobuhiro Iwamatsu 
1723ce2703dSTetsuyuki Kobayashi #if defined(CONFIG_SH73A0)
1732035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 0) != 0)
1740e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1753ce2703dSTetsuyuki Kobayashi #else
1762035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 1) != 0)
1770e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1783dab3e0eSNobuhiro Iwamatsu 	udelay(100);
1793ce2703dSTetsuyuki Kobayashi #endif
1803dab3e0eSNobuhiro Iwamatsu 
1812035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &dev->iccr);
1822035d77dSNobuhiro Iwamatsu 	sh_irq_dte(dev);
1833dab3e0eSNobuhiro Iwamatsu 
1842035d77dSNobuhiro Iwamatsu 	writeb(chip << 1 | 0x01, &dev->icdr);
1852035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1860e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1873dab3e0eSNobuhiro Iwamatsu 
1882035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_SCP), &dev->iccr);
1892035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1900e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1913dab3e0eSNobuhiro Iwamatsu 
1922035d77dSNobuhiro Iwamatsu 	ret = readb(&dev->icdr) & 0xff;
1933dab3e0eSNobuhiro Iwamatsu 
1942035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RACK), &dev->iccr);
1952035d77dSNobuhiro Iwamatsu 	readb(&dev->icdr); /* Dummy read */
1962035d77dSNobuhiro Iwamatsu 	sh_irq_busy(dev);
1972035d77dSNobuhiro Iwamatsu 
1980e5fb33cSTetsuyuki Kobayashi exit0:
1992035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
2003dab3e0eSNobuhiro Iwamatsu 
2013dab3e0eSNobuhiro Iwamatsu 	return ret;
2023dab3e0eSNobuhiro Iwamatsu }
2033dab3e0eSNobuhiro Iwamatsu 
2042035d77dSNobuhiro Iwamatsu static void
sh_i2c_init(struct i2c_adapter * adap,int speed,int slaveadd)2052035d77dSNobuhiro Iwamatsu sh_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
2063dab3e0eSNobuhiro Iwamatsu {
2073dab3e0eSNobuhiro Iwamatsu 	int num, denom, tmp;
2083dab3e0eSNobuhiro Iwamatsu 
209b55b8eefSNobuhiro Iwamatsu 	/* No i2c support prior to relocation */
210b55b8eefSNobuhiro Iwamatsu 	if (!(gd->flags & GD_FLG_RELOC))
211b55b8eefSNobuhiro Iwamatsu 		return;
212b55b8eefSNobuhiro Iwamatsu 
2133dab3e0eSNobuhiro Iwamatsu 	/*
2143dab3e0eSNobuhiro Iwamatsu 	 * Calculate the value for iccl. From the data sheet:
2153dab3e0eSNobuhiro Iwamatsu 	 * iccl = (p-clock / transfer-rate) * (L / (L + H))
2163dab3e0eSNobuhiro Iwamatsu 	 * where L and H are the SCL low and high ratio.
2173dab3e0eSNobuhiro Iwamatsu 	 */
2183dab3e0eSNobuhiro Iwamatsu 	num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_LOW;
2193dab3e0eSNobuhiro Iwamatsu 	denom = speed * (CONFIG_SH_I2C_DATA_HIGH + CONFIG_SH_I2C_DATA_LOW);
2203dab3e0eSNobuhiro Iwamatsu 	tmp = num * 10 / denom;
2213dab3e0eSNobuhiro Iwamatsu 	if (tmp % 10 >= 5)
222b1af67feSTetsuyuki Kobayashi 		iccl = (u16)((num/denom) + 1);
2233dab3e0eSNobuhiro Iwamatsu 	else
224b1af67feSTetsuyuki Kobayashi 		iccl = (u16)(num/denom);
2253dab3e0eSNobuhiro Iwamatsu 
2263dab3e0eSNobuhiro Iwamatsu 	/* Calculate the value for icch. From the data sheet:
2273dab3e0eSNobuhiro Iwamatsu 	   icch = (p clock / transfer rate) * (H / (L + H)) */
2283dab3e0eSNobuhiro Iwamatsu 	num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_HIGH;
2293dab3e0eSNobuhiro Iwamatsu 	tmp = num * 10 / denom;
2303dab3e0eSNobuhiro Iwamatsu 	if (tmp % 10 >= 5)
231b1af67feSTetsuyuki Kobayashi 		icch = (u16)((num/denom) + 1);
2323dab3e0eSNobuhiro Iwamatsu 	else
233b1af67feSTetsuyuki Kobayashi 		icch = (u16)(num/denom);
2342035d77dSNobuhiro Iwamatsu 
2352035d77dSNobuhiro Iwamatsu 	debug("clock: %d, speed %d, iccl: %x, icch: %x\n",
2362035d77dSNobuhiro Iwamatsu 			CONFIG_SH_I2C_CLOCK, speed, iccl, icch);
2373dab3e0eSNobuhiro Iwamatsu }
2383dab3e0eSNobuhiro Iwamatsu 
sh_i2c_read(struct i2c_adapter * adap,uint8_t chip,uint addr,int alen,u8 * data,int len)2392035d77dSNobuhiro Iwamatsu static int sh_i2c_read(struct i2c_adapter *adap, uint8_t chip,
2402035d77dSNobuhiro Iwamatsu 				uint addr, int alen, u8 *data, int len)
2413dab3e0eSNobuhiro Iwamatsu {
2422035d77dSNobuhiro Iwamatsu 	int ret, i;
2432035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
2442035d77dSNobuhiro Iwamatsu 
2450e5fb33cSTetsuyuki Kobayashi 	for (i = 0; i < len; i++) {
2462035d77dSNobuhiro Iwamatsu 		ret = sh_i2c_raw_read(dev, chip, addr + i);
2470e5fb33cSTetsuyuki Kobayashi 		if (ret < 0)
2480e5fb33cSTetsuyuki Kobayashi 			return -1;
2492035d77dSNobuhiro Iwamatsu 
2502035d77dSNobuhiro Iwamatsu 		data[i] = ret & 0xff;
2512035d77dSNobuhiro Iwamatsu 		debug("%s: data[%d]: %02x\n", __func__, i, data[i]);
2520e5fb33cSTetsuyuki Kobayashi 	}
2532035d77dSNobuhiro Iwamatsu 
2543dab3e0eSNobuhiro Iwamatsu 	return 0;
2553dab3e0eSNobuhiro Iwamatsu }
2563dab3e0eSNobuhiro Iwamatsu 
sh_i2c_write(struct i2c_adapter * adap,uint8_t chip,uint addr,int alen,u8 * data,int len)2572035d77dSNobuhiro Iwamatsu static int sh_i2c_write(struct i2c_adapter *adap, uint8_t chip, uint addr,
2582035d77dSNobuhiro Iwamatsu 				int alen, u8 *data, int len)
2593dab3e0eSNobuhiro Iwamatsu {
2602035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
2612035d77dSNobuhiro Iwamatsu 	int i;
2622035d77dSNobuhiro Iwamatsu 
2632035d77dSNobuhiro Iwamatsu 	for (i = 0; i < len; i++) {
2642035d77dSNobuhiro Iwamatsu 		debug("%s: data[%d]: %02x\n", __func__, i, data[i]);
2652035d77dSNobuhiro Iwamatsu 		if (sh_i2c_raw_write(dev, chip, addr + i, data[i]) != 0)
2660e5fb33cSTetsuyuki Kobayashi 			return -1;
2672035d77dSNobuhiro Iwamatsu 	}
2682035d77dSNobuhiro Iwamatsu 	return 0;
2692035d77dSNobuhiro Iwamatsu }
2702035d77dSNobuhiro Iwamatsu 
2712035d77dSNobuhiro Iwamatsu static int
sh_i2c_probe(struct i2c_adapter * adap,u8 dev)2722035d77dSNobuhiro Iwamatsu sh_i2c_probe(struct i2c_adapter *adap, u8 dev)
2732035d77dSNobuhiro Iwamatsu {
2747a657689STetsuyuki Kobayashi 	u8 dummy[1];
2757a657689STetsuyuki Kobayashi 
2767a657689STetsuyuki Kobayashi 	return sh_i2c_read(adap, dev, 0, 0, dummy, sizeof dummy);
2772035d77dSNobuhiro Iwamatsu }
2782035d77dSNobuhiro Iwamatsu 
sh_i2c_set_bus_speed(struct i2c_adapter * adap,unsigned int speed)2792035d77dSNobuhiro Iwamatsu static unsigned int sh_i2c_set_bus_speed(struct i2c_adapter *adap,
2802035d77dSNobuhiro Iwamatsu 			unsigned int speed)
2812035d77dSNobuhiro Iwamatsu {
2822035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
2832035d77dSNobuhiro Iwamatsu 
2842035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
2852035d77dSNobuhiro Iwamatsu 	sh_i2c_init(adap, speed, 0);
2862035d77dSNobuhiro Iwamatsu 
2873dab3e0eSNobuhiro Iwamatsu 	return 0;
2883dab3e0eSNobuhiro Iwamatsu }
2893dab3e0eSNobuhiro Iwamatsu 
2903dab3e0eSNobuhiro Iwamatsu /*
2912035d77dSNobuhiro Iwamatsu  * Register RCAR i2c adapters
2923dab3e0eSNobuhiro Iwamatsu  */
2932035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_0, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
2942035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED0, 0, 0)
2952035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE1
2962035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_1, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
2972035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED1, 0, 1)
2982035d77dSNobuhiro Iwamatsu #endif
2992035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE2
3002035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_2, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
3012035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED2, 0, 2)
3022035d77dSNobuhiro Iwamatsu #endif
3032035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE3
3042035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_3, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
3052035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED3, 0, 3)
3062035d77dSNobuhiro Iwamatsu #endif
3072035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE4
3082035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_4, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
3092035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED4, 0, 4)
3102035d77dSNobuhiro Iwamatsu #endif
311