xref: /openbmc/u-boot/drivers/i2c/sh_i2c.c (revision 2035d77d)
13dab3e0eSNobuhiro Iwamatsu /*
2b55b8eefSNobuhiro Iwamatsu  * Copyright (C) 2011, 2013 Renesas Solutions Corp.
3b55b8eefSNobuhiro Iwamatsu  * Copyright (C) 2011, 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
43dab3e0eSNobuhiro Iwamatsu  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
63dab3e0eSNobuhiro Iwamatsu  */
73dab3e0eSNobuhiro Iwamatsu 
83dab3e0eSNobuhiro Iwamatsu #include <common.h>
9*2035d77dSNobuhiro Iwamatsu #include <i2c.h>
103dab3e0eSNobuhiro Iwamatsu #include <asm/io.h>
113dab3e0eSNobuhiro Iwamatsu 
12b55b8eefSNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
13b55b8eefSNobuhiro Iwamatsu 
143dab3e0eSNobuhiro Iwamatsu /* Every register is 32bit aligned, but only 8bits in size */
153dab3e0eSNobuhiro Iwamatsu #define ureg(name) u8 name; u8 __pad_##name##0; u16 __pad_##name##1;
163dab3e0eSNobuhiro Iwamatsu struct sh_i2c {
173dab3e0eSNobuhiro Iwamatsu 	ureg(icdr);
183dab3e0eSNobuhiro Iwamatsu 	ureg(iccr);
193dab3e0eSNobuhiro Iwamatsu 	ureg(icsr);
203dab3e0eSNobuhiro Iwamatsu 	ureg(icic);
213dab3e0eSNobuhiro Iwamatsu 	ureg(iccl);
223dab3e0eSNobuhiro Iwamatsu 	ureg(icch);
233dab3e0eSNobuhiro Iwamatsu };
243dab3e0eSNobuhiro Iwamatsu #undef ureg
253dab3e0eSNobuhiro Iwamatsu 
263dab3e0eSNobuhiro Iwamatsu /* ICCR */
273dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_ICE		(1 << 7)
283dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RACK	(1 << 6)
293dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RTS		(1 << 4)
303dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_BUSY	(1 << 2)
313dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_SCP		(1 << 0)
323dab3e0eSNobuhiro Iwamatsu 
333dab3e0eSNobuhiro Iwamatsu /* ICSR / ICIC */
3457d7c804STetsuyuki Kobayashi #define SH_IC_BUSY	(1 << 4)
353dab3e0eSNobuhiro Iwamatsu #define SH_IC_TACK	(1 << 2)
363dab3e0eSNobuhiro Iwamatsu #define SH_IC_WAIT	(1 << 1)
373dab3e0eSNobuhiro Iwamatsu #define SH_IC_DTE	(1 << 0)
383dab3e0eSNobuhiro Iwamatsu 
39b1af67feSTetsuyuki Kobayashi #ifdef CONFIG_SH_I2C_8BIT
40b1af67feSTetsuyuki Kobayashi /* store 8th bit of iccl and icch in ICIC register */
41b1af67feSTetsuyuki Kobayashi #define SH_I2C_ICIC_ICCLB8	(1 << 7)
42b1af67feSTetsuyuki Kobayashi #define SH_I2C_ICIC_ICCHB8	(1 << 6)
43b1af67feSTetsuyuki Kobayashi #endif
44b1af67feSTetsuyuki Kobayashi 
45*2035d77dSNobuhiro Iwamatsu static const struct sh_i2c *i2c_dev[CONFIG_SYS_I2C_SH_NUM_CONTROLLERS] = {
46*2035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE0,
47*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE1
48*2035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE1,
49*2035d77dSNobuhiro Iwamatsu #endif
50*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE2
51*2035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE2,
52*2035d77dSNobuhiro Iwamatsu #endif
53*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE3
54*2035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE3,
55*2035d77dSNobuhiro Iwamatsu #endif
56*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE4
57*2035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE4,
58*2035d77dSNobuhiro Iwamatsu #endif
59*2035d77dSNobuhiro Iwamatsu };
60*2035d77dSNobuhiro Iwamatsu 
61b1af67feSTetsuyuki Kobayashi static u16 iccl, icch;
623dab3e0eSNobuhiro Iwamatsu 
633dab3e0eSNobuhiro Iwamatsu #define IRQ_WAIT 1000
643dab3e0eSNobuhiro Iwamatsu 
65*2035d77dSNobuhiro Iwamatsu static void sh_irq_dte(struct sh_i2c *dev)
663dab3e0eSNobuhiro Iwamatsu {
673dab3e0eSNobuhiro Iwamatsu 	int i;
683dab3e0eSNobuhiro Iwamatsu 
693dab3e0eSNobuhiro Iwamatsu 	for (i = 0; i < IRQ_WAIT; i++) {
70*2035d77dSNobuhiro Iwamatsu 		if (SH_IC_DTE & readb(&dev->icsr))
713dab3e0eSNobuhiro Iwamatsu 			break;
723dab3e0eSNobuhiro Iwamatsu 		udelay(10);
733dab3e0eSNobuhiro Iwamatsu 	}
743dab3e0eSNobuhiro Iwamatsu }
753dab3e0eSNobuhiro Iwamatsu 
76*2035d77dSNobuhiro Iwamatsu static int sh_irq_dte_with_tack(struct sh_i2c *dev)
77d042d712STetsuyuki Kobayashi {
78d042d712STetsuyuki Kobayashi 	int i;
79d042d712STetsuyuki Kobayashi 
80d042d712STetsuyuki Kobayashi 	for (i = 0; i < IRQ_WAIT; i++) {
81*2035d77dSNobuhiro Iwamatsu 		if (SH_IC_DTE & readb(&dev->icsr))
82d042d712STetsuyuki Kobayashi 			break;
83*2035d77dSNobuhiro Iwamatsu 		if (SH_IC_TACK & readb(&dev->icsr))
84d042d712STetsuyuki Kobayashi 			return -1;
85d042d712STetsuyuki Kobayashi 		udelay(10);
86d042d712STetsuyuki Kobayashi 	}
87d042d712STetsuyuki Kobayashi 	return 0;
88d042d712STetsuyuki Kobayashi }
89d042d712STetsuyuki Kobayashi 
90*2035d77dSNobuhiro Iwamatsu static void sh_irq_busy(struct sh_i2c *dev)
913dab3e0eSNobuhiro Iwamatsu {
923dab3e0eSNobuhiro Iwamatsu 	int i;
933dab3e0eSNobuhiro Iwamatsu 
943dab3e0eSNobuhiro Iwamatsu 	for (i = 0; i < IRQ_WAIT; i++) {
95*2035d77dSNobuhiro Iwamatsu 		if (!(SH_IC_BUSY & readb(&dev->icsr)))
963dab3e0eSNobuhiro Iwamatsu 			break;
973dab3e0eSNobuhiro Iwamatsu 		udelay(10);
983dab3e0eSNobuhiro Iwamatsu 	}
993dab3e0eSNobuhiro Iwamatsu }
1003dab3e0eSNobuhiro Iwamatsu 
101*2035d77dSNobuhiro Iwamatsu static int sh_i2c_set_addr(struct sh_i2c *dev, u8 chip, u8 addr, int stop)
1023dab3e0eSNobuhiro Iwamatsu {
103d042d712STetsuyuki Kobayashi 	u8 icic = SH_IC_TACK;
104b1af67feSTetsuyuki Kobayashi 
105*2035d77dSNobuhiro Iwamatsu 	debug("%s: chip: %x, addr: %x iccl: %x, icch %x\n",
106*2035d77dSNobuhiro Iwamatsu 				__func__, chip, addr, iccl, icch);
107*2035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
108*2035d77dSNobuhiro Iwamatsu 	setbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1093dab3e0eSNobuhiro Iwamatsu 
110*2035d77dSNobuhiro Iwamatsu 	writeb(iccl & 0xff, &dev->iccl);
111*2035d77dSNobuhiro Iwamatsu 	writeb(icch & 0xff, &dev->icch);
112b1af67feSTetsuyuki Kobayashi #ifdef CONFIG_SH_I2C_8BIT
113b1af67feSTetsuyuki Kobayashi 	if (iccl > 0xff)
114b1af67feSTetsuyuki Kobayashi 		icic |= SH_I2C_ICIC_ICCLB8;
115b1af67feSTetsuyuki Kobayashi 	if (icch > 0xff)
116b1af67feSTetsuyuki Kobayashi 		icic |= SH_I2C_ICIC_ICCHB8;
117b1af67feSTetsuyuki Kobayashi #endif
118*2035d77dSNobuhiro Iwamatsu 	writeb(icic, &dev->icic);
1193dab3e0eSNobuhiro Iwamatsu 
120*2035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &dev->iccr);
121*2035d77dSNobuhiro Iwamatsu 	sh_irq_dte(dev);
1223dab3e0eSNobuhiro Iwamatsu 
123*2035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->icsr, SH_IC_TACK);
124*2035d77dSNobuhiro Iwamatsu 	writeb(chip << 1, &dev->icdr);
125*2035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
126d042d712STetsuyuki Kobayashi 		return -1;
1273dab3e0eSNobuhiro Iwamatsu 
128*2035d77dSNobuhiro Iwamatsu 	writeb(addr, &dev->icdr);
1293dab3e0eSNobuhiro Iwamatsu 	if (stop)
130*2035d77dSNobuhiro Iwamatsu 		writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS), &dev->iccr);
1313dab3e0eSNobuhiro Iwamatsu 
132*2035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
133d042d712STetsuyuki Kobayashi 		return -1;
134d042d712STetsuyuki Kobayashi 	return 0;
1353dab3e0eSNobuhiro Iwamatsu }
1363dab3e0eSNobuhiro Iwamatsu 
137*2035d77dSNobuhiro Iwamatsu static void sh_i2c_finish(struct sh_i2c *dev)
1383dab3e0eSNobuhiro Iwamatsu {
139*2035d77dSNobuhiro Iwamatsu 	writeb(0, &dev->icsr);
140*2035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1413dab3e0eSNobuhiro Iwamatsu }
1423dab3e0eSNobuhiro Iwamatsu 
143*2035d77dSNobuhiro Iwamatsu static int
144*2035d77dSNobuhiro Iwamatsu sh_i2c_raw_write(struct sh_i2c *dev, u8 chip, uint addr, u8 val)
1453dab3e0eSNobuhiro Iwamatsu {
1460e5fb33cSTetsuyuki Kobayashi 	int ret = -1;
147*2035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 0) != 0)
1480e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1493dab3e0eSNobuhiro Iwamatsu 	udelay(10);
1503dab3e0eSNobuhiro Iwamatsu 
151*2035d77dSNobuhiro Iwamatsu 	writeb(val, &dev->icdr);
152*2035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1530e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1543dab3e0eSNobuhiro Iwamatsu 
155*2035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE | SH_I2C_ICCR_RTS), &dev->iccr);
156*2035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1570e5fb33cSTetsuyuki Kobayashi 		goto exit0;
158*2035d77dSNobuhiro Iwamatsu 	sh_irq_busy(dev);
1590e5fb33cSTetsuyuki Kobayashi 	ret = 0;
160*2035d77dSNobuhiro Iwamatsu 
1610e5fb33cSTetsuyuki Kobayashi exit0:
162*2035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
1630e5fb33cSTetsuyuki Kobayashi 	return ret;
1643dab3e0eSNobuhiro Iwamatsu }
1653dab3e0eSNobuhiro Iwamatsu 
166*2035d77dSNobuhiro Iwamatsu static int sh_i2c_raw_read(struct sh_i2c *dev, u8 chip, u8 addr)
1673dab3e0eSNobuhiro Iwamatsu {
1680e5fb33cSTetsuyuki Kobayashi 	int ret = -1;
1693dab3e0eSNobuhiro Iwamatsu 
1703ce2703dSTetsuyuki Kobayashi #if defined(CONFIG_SH73A0)
171*2035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 0) != 0)
1720e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1733ce2703dSTetsuyuki Kobayashi #else
174*2035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 1) != 0)
1750e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1763dab3e0eSNobuhiro Iwamatsu 	udelay(100);
1773ce2703dSTetsuyuki Kobayashi #endif
1783dab3e0eSNobuhiro Iwamatsu 
179*2035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &dev->iccr);
180*2035d77dSNobuhiro Iwamatsu 	sh_irq_dte(dev);
1813dab3e0eSNobuhiro Iwamatsu 
182*2035d77dSNobuhiro Iwamatsu 	writeb(chip << 1 | 0x01, &dev->icdr);
183*2035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1840e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1853dab3e0eSNobuhiro Iwamatsu 
186*2035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_SCP), &dev->iccr);
187*2035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1880e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1893dab3e0eSNobuhiro Iwamatsu 
190*2035d77dSNobuhiro Iwamatsu 	ret = readb(&dev->icdr) & 0xff;
1913dab3e0eSNobuhiro Iwamatsu 
192*2035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RACK), &dev->iccr);
193*2035d77dSNobuhiro Iwamatsu 	readb(&dev->icdr); /* Dummy read */
194*2035d77dSNobuhiro Iwamatsu 	sh_irq_busy(dev);
195*2035d77dSNobuhiro Iwamatsu 
1960e5fb33cSTetsuyuki Kobayashi exit0:
197*2035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
1983dab3e0eSNobuhiro Iwamatsu 
1993dab3e0eSNobuhiro Iwamatsu 	return ret;
2003dab3e0eSNobuhiro Iwamatsu }
2013dab3e0eSNobuhiro Iwamatsu 
202*2035d77dSNobuhiro Iwamatsu static void
203*2035d77dSNobuhiro Iwamatsu sh_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
2043dab3e0eSNobuhiro Iwamatsu {
2053dab3e0eSNobuhiro Iwamatsu 	int num, denom, tmp;
2063dab3e0eSNobuhiro Iwamatsu 
207b55b8eefSNobuhiro Iwamatsu 	/* No i2c support prior to relocation */
208b55b8eefSNobuhiro Iwamatsu 	if (!(gd->flags & GD_FLG_RELOC))
209b55b8eefSNobuhiro Iwamatsu 		return;
210b55b8eefSNobuhiro Iwamatsu 
2113dab3e0eSNobuhiro Iwamatsu 	/*
2123dab3e0eSNobuhiro Iwamatsu 	 * Calculate the value for iccl. From the data sheet:
2133dab3e0eSNobuhiro Iwamatsu 	 * iccl = (p-clock / transfer-rate) * (L / (L + H))
2143dab3e0eSNobuhiro Iwamatsu 	 * where L and H are the SCL low and high ratio.
2153dab3e0eSNobuhiro Iwamatsu 	 */
2163dab3e0eSNobuhiro Iwamatsu 	num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_LOW;
2173dab3e0eSNobuhiro Iwamatsu 	denom = speed * (CONFIG_SH_I2C_DATA_HIGH + CONFIG_SH_I2C_DATA_LOW);
2183dab3e0eSNobuhiro Iwamatsu 	tmp = num * 10 / denom;
2193dab3e0eSNobuhiro Iwamatsu 	if (tmp % 10 >= 5)
220b1af67feSTetsuyuki Kobayashi 		iccl = (u16)((num/denom) + 1);
2213dab3e0eSNobuhiro Iwamatsu 	else
222b1af67feSTetsuyuki Kobayashi 		iccl = (u16)(num/denom);
2233dab3e0eSNobuhiro Iwamatsu 
2243dab3e0eSNobuhiro Iwamatsu 	/* Calculate the value for icch. From the data sheet:
2253dab3e0eSNobuhiro Iwamatsu 	   icch = (p clock / transfer rate) * (H / (L + H)) */
2263dab3e0eSNobuhiro Iwamatsu 	num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_HIGH;
2273dab3e0eSNobuhiro Iwamatsu 	tmp = num * 10 / denom;
2283dab3e0eSNobuhiro Iwamatsu 	if (tmp % 10 >= 5)
229b1af67feSTetsuyuki Kobayashi 		icch = (u16)((num/denom) + 1);
2303dab3e0eSNobuhiro Iwamatsu 	else
231b1af67feSTetsuyuki Kobayashi 		icch = (u16)(num/denom);
232*2035d77dSNobuhiro Iwamatsu 
233*2035d77dSNobuhiro Iwamatsu 	debug("clock: %d, speed %d, iccl: %x, icch: %x\n",
234*2035d77dSNobuhiro Iwamatsu 			CONFIG_SH_I2C_CLOCK, speed, iccl, icch);
2353dab3e0eSNobuhiro Iwamatsu }
2363dab3e0eSNobuhiro Iwamatsu 
237*2035d77dSNobuhiro Iwamatsu static int sh_i2c_read(struct i2c_adapter *adap, uint8_t chip,
238*2035d77dSNobuhiro Iwamatsu 				uint addr, int alen, u8 *data, int len)
2393dab3e0eSNobuhiro Iwamatsu {
240*2035d77dSNobuhiro Iwamatsu 	int ret, i;
241*2035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
242*2035d77dSNobuhiro Iwamatsu 
2430e5fb33cSTetsuyuki Kobayashi 	for (i = 0; i < len; i++) {
244*2035d77dSNobuhiro Iwamatsu 		ret = sh_i2c_raw_read(dev, chip, addr + i);
2450e5fb33cSTetsuyuki Kobayashi 		if (ret < 0)
2460e5fb33cSTetsuyuki Kobayashi 			return -1;
247*2035d77dSNobuhiro Iwamatsu 
248*2035d77dSNobuhiro Iwamatsu 		data[i] = ret & 0xff;
249*2035d77dSNobuhiro Iwamatsu 		debug("%s: data[%d]: %02x\n", __func__, i, data[i]);
2500e5fb33cSTetsuyuki Kobayashi 	}
251*2035d77dSNobuhiro Iwamatsu 
2523dab3e0eSNobuhiro Iwamatsu 	return 0;
2533dab3e0eSNobuhiro Iwamatsu }
2543dab3e0eSNobuhiro Iwamatsu 
255*2035d77dSNobuhiro Iwamatsu static int sh_i2c_write(struct i2c_adapter *adap, uint8_t chip, uint addr,
256*2035d77dSNobuhiro Iwamatsu 				int alen, u8 *data, int len)
2573dab3e0eSNobuhiro Iwamatsu {
258*2035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
259*2035d77dSNobuhiro Iwamatsu 	int i;
260*2035d77dSNobuhiro Iwamatsu 
261*2035d77dSNobuhiro Iwamatsu 	for (i = 0; i < len; i++) {
262*2035d77dSNobuhiro Iwamatsu 		debug("%s: data[%d]: %02x\n", __func__, i, data[i]);
263*2035d77dSNobuhiro Iwamatsu 		if (sh_i2c_raw_write(dev, chip, addr + i, data[i]) != 0)
2640e5fb33cSTetsuyuki Kobayashi 			return -1;
265*2035d77dSNobuhiro Iwamatsu 	}
266*2035d77dSNobuhiro Iwamatsu 	return 0;
267*2035d77dSNobuhiro Iwamatsu }
268*2035d77dSNobuhiro Iwamatsu 
269*2035d77dSNobuhiro Iwamatsu static int
270*2035d77dSNobuhiro Iwamatsu sh_i2c_probe(struct i2c_adapter *adap, u8 dev)
271*2035d77dSNobuhiro Iwamatsu {
272*2035d77dSNobuhiro Iwamatsu 	return sh_i2c_read(adap, dev, 0, 0, NULL, 0);
273*2035d77dSNobuhiro Iwamatsu }
274*2035d77dSNobuhiro Iwamatsu 
275*2035d77dSNobuhiro Iwamatsu static unsigned int sh_i2c_set_bus_speed(struct i2c_adapter *adap,
276*2035d77dSNobuhiro Iwamatsu 			unsigned int speed)
277*2035d77dSNobuhiro Iwamatsu {
278*2035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
279*2035d77dSNobuhiro Iwamatsu 
280*2035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
281*2035d77dSNobuhiro Iwamatsu 	sh_i2c_init(adap, speed, 0);
282*2035d77dSNobuhiro Iwamatsu 
2833dab3e0eSNobuhiro Iwamatsu 	return 0;
2843dab3e0eSNobuhiro Iwamatsu }
2853dab3e0eSNobuhiro Iwamatsu 
2863dab3e0eSNobuhiro Iwamatsu /*
287*2035d77dSNobuhiro Iwamatsu  * Register RCAR i2c adapters
2883dab3e0eSNobuhiro Iwamatsu  */
289*2035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_0, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
290*2035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED0, 0, 0)
291*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE1
292*2035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_1, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
293*2035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED1, 0, 1)
294*2035d77dSNobuhiro Iwamatsu #endif
295*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE2
296*2035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_2, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
297*2035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED2, 0, 2)
298*2035d77dSNobuhiro Iwamatsu #endif
299*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE3
300*2035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_3, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
301*2035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED3, 0, 3)
302*2035d77dSNobuhiro Iwamatsu #endif
303*2035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE4
304*2035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_4, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
305*2035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED4, 0, 4)
306*2035d77dSNobuhiro Iwamatsu #endif
307