xref: /rk3399_rockchip-uboot/drivers/i2c/sh_i2c.c (revision f2465934b46235287e07473fa4919035ba1a2b68)
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+
6*28527096SSimon Glass  *
7*28527096SSimon Glass  * NOTE: This driver should be converted to driver model before June 2017.
8*28527096SSimon Glass  * Please see doc/driver-model/i2c-howto.txt for instructions.
93dab3e0eSNobuhiro Iwamatsu  */
103dab3e0eSNobuhiro Iwamatsu 
113dab3e0eSNobuhiro Iwamatsu #include <common.h>
122035d77dSNobuhiro Iwamatsu #include <i2c.h>
133dab3e0eSNobuhiro Iwamatsu #include <asm/io.h>
143dab3e0eSNobuhiro Iwamatsu 
15b55b8eefSNobuhiro Iwamatsu DECLARE_GLOBAL_DATA_PTR;
16b55b8eefSNobuhiro Iwamatsu 
173dab3e0eSNobuhiro Iwamatsu /* Every register is 32bit aligned, but only 8bits in size */
183dab3e0eSNobuhiro Iwamatsu #define ureg(name) u8 name; u8 __pad_##name##0; u16 __pad_##name##1;
193dab3e0eSNobuhiro Iwamatsu struct sh_i2c {
203dab3e0eSNobuhiro Iwamatsu 	ureg(icdr);
213dab3e0eSNobuhiro Iwamatsu 	ureg(iccr);
223dab3e0eSNobuhiro Iwamatsu 	ureg(icsr);
233dab3e0eSNobuhiro Iwamatsu 	ureg(icic);
243dab3e0eSNobuhiro Iwamatsu 	ureg(iccl);
253dab3e0eSNobuhiro Iwamatsu 	ureg(icch);
263dab3e0eSNobuhiro Iwamatsu };
273dab3e0eSNobuhiro Iwamatsu #undef ureg
283dab3e0eSNobuhiro Iwamatsu 
293dab3e0eSNobuhiro Iwamatsu /* ICCR */
303dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_ICE		(1 << 7)
313dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RACK	(1 << 6)
323dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RTS		(1 << 4)
333dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_BUSY	(1 << 2)
343dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_SCP		(1 << 0)
353dab3e0eSNobuhiro Iwamatsu 
363dab3e0eSNobuhiro Iwamatsu /* ICSR / ICIC */
3757d7c804STetsuyuki Kobayashi #define SH_IC_BUSY	(1 << 4)
383dab3e0eSNobuhiro Iwamatsu #define SH_IC_TACK	(1 << 2)
393dab3e0eSNobuhiro Iwamatsu #define SH_IC_WAIT	(1 << 1)
403dab3e0eSNobuhiro Iwamatsu #define SH_IC_DTE	(1 << 0)
413dab3e0eSNobuhiro Iwamatsu 
42b1af67feSTetsuyuki Kobayashi #ifdef CONFIG_SH_I2C_8BIT
43b1af67feSTetsuyuki Kobayashi /* store 8th bit of iccl and icch in ICIC register */
44b1af67feSTetsuyuki Kobayashi #define SH_I2C_ICIC_ICCLB8	(1 << 7)
45b1af67feSTetsuyuki Kobayashi #define SH_I2C_ICIC_ICCHB8	(1 << 6)
46b1af67feSTetsuyuki Kobayashi #endif
47b1af67feSTetsuyuki Kobayashi 
482035d77dSNobuhiro Iwamatsu static const struct sh_i2c *i2c_dev[CONFIG_SYS_I2C_SH_NUM_CONTROLLERS] = {
492035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE0,
502035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE1
512035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE1,
522035d77dSNobuhiro Iwamatsu #endif
532035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE2
542035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE2,
552035d77dSNobuhiro Iwamatsu #endif
562035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE3
572035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE3,
582035d77dSNobuhiro Iwamatsu #endif
592035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE4
602035d77dSNobuhiro Iwamatsu 	(struct sh_i2c *)CONFIG_SYS_I2C_SH_BASE4,
612035d77dSNobuhiro Iwamatsu #endif
622035d77dSNobuhiro Iwamatsu };
632035d77dSNobuhiro Iwamatsu 
64b1af67feSTetsuyuki Kobayashi static u16 iccl, icch;
653dab3e0eSNobuhiro Iwamatsu 
663dab3e0eSNobuhiro Iwamatsu #define IRQ_WAIT 1000
673dab3e0eSNobuhiro Iwamatsu 
sh_irq_dte(struct sh_i2c * dev)682035d77dSNobuhiro Iwamatsu static void sh_irq_dte(struct sh_i2c *dev)
693dab3e0eSNobuhiro Iwamatsu {
703dab3e0eSNobuhiro Iwamatsu 	int i;
713dab3e0eSNobuhiro Iwamatsu 
723dab3e0eSNobuhiro Iwamatsu 	for (i = 0; i < IRQ_WAIT; i++) {
732035d77dSNobuhiro Iwamatsu 		if (SH_IC_DTE & readb(&dev->icsr))
743dab3e0eSNobuhiro Iwamatsu 			break;
753dab3e0eSNobuhiro Iwamatsu 		udelay(10);
763dab3e0eSNobuhiro Iwamatsu 	}
773dab3e0eSNobuhiro Iwamatsu }
783dab3e0eSNobuhiro Iwamatsu 
sh_irq_dte_with_tack(struct sh_i2c * dev)792035d77dSNobuhiro Iwamatsu static int sh_irq_dte_with_tack(struct sh_i2c *dev)
80d042d712STetsuyuki Kobayashi {
81d042d712STetsuyuki Kobayashi 	int i;
82d042d712STetsuyuki Kobayashi 
83d042d712STetsuyuki Kobayashi 	for (i = 0; i < IRQ_WAIT; i++) {
842035d77dSNobuhiro Iwamatsu 		if (SH_IC_DTE & readb(&dev->icsr))
85d042d712STetsuyuki Kobayashi 			break;
862035d77dSNobuhiro Iwamatsu 		if (SH_IC_TACK & readb(&dev->icsr))
87d042d712STetsuyuki Kobayashi 			return -1;
88d042d712STetsuyuki Kobayashi 		udelay(10);
89d042d712STetsuyuki Kobayashi 	}
90d042d712STetsuyuki Kobayashi 	return 0;
91d042d712STetsuyuki Kobayashi }
92d042d712STetsuyuki Kobayashi 
sh_irq_busy(struct sh_i2c * dev)932035d77dSNobuhiro Iwamatsu static void sh_irq_busy(struct sh_i2c *dev)
943dab3e0eSNobuhiro Iwamatsu {
953dab3e0eSNobuhiro Iwamatsu 	int i;
963dab3e0eSNobuhiro Iwamatsu 
973dab3e0eSNobuhiro Iwamatsu 	for (i = 0; i < IRQ_WAIT; i++) {
982035d77dSNobuhiro Iwamatsu 		if (!(SH_IC_BUSY & readb(&dev->icsr)))
993dab3e0eSNobuhiro Iwamatsu 			break;
1003dab3e0eSNobuhiro Iwamatsu 		udelay(10);
1013dab3e0eSNobuhiro Iwamatsu 	}
1023dab3e0eSNobuhiro Iwamatsu }
1033dab3e0eSNobuhiro Iwamatsu 
sh_i2c_set_addr(struct sh_i2c * dev,u8 chip,u8 addr,int stop)1042035d77dSNobuhiro Iwamatsu static int sh_i2c_set_addr(struct sh_i2c *dev, u8 chip, u8 addr, int stop)
1053dab3e0eSNobuhiro Iwamatsu {
106d042d712STetsuyuki Kobayashi 	u8 icic = SH_IC_TACK;
107b1af67feSTetsuyuki Kobayashi 
1082035d77dSNobuhiro Iwamatsu 	debug("%s: chip: %x, addr: %x iccl: %x, icch %x\n",
1092035d77dSNobuhiro Iwamatsu 				__func__, chip, addr, iccl, icch);
1102035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1112035d77dSNobuhiro Iwamatsu 	setbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1123dab3e0eSNobuhiro Iwamatsu 
1132035d77dSNobuhiro Iwamatsu 	writeb(iccl & 0xff, &dev->iccl);
1142035d77dSNobuhiro Iwamatsu 	writeb(icch & 0xff, &dev->icch);
115b1af67feSTetsuyuki Kobayashi #ifdef CONFIG_SH_I2C_8BIT
116b1af67feSTetsuyuki Kobayashi 	if (iccl > 0xff)
117b1af67feSTetsuyuki Kobayashi 		icic |= SH_I2C_ICIC_ICCLB8;
118b1af67feSTetsuyuki Kobayashi 	if (icch > 0xff)
119b1af67feSTetsuyuki Kobayashi 		icic |= SH_I2C_ICIC_ICCHB8;
120b1af67feSTetsuyuki Kobayashi #endif
1212035d77dSNobuhiro Iwamatsu 	writeb(icic, &dev->icic);
1223dab3e0eSNobuhiro Iwamatsu 
1232035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &dev->iccr);
1242035d77dSNobuhiro Iwamatsu 	sh_irq_dte(dev);
1253dab3e0eSNobuhiro Iwamatsu 
1262035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->icsr, SH_IC_TACK);
1272035d77dSNobuhiro Iwamatsu 	writeb(chip << 1, &dev->icdr);
1282035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
129d042d712STetsuyuki Kobayashi 		return -1;
1303dab3e0eSNobuhiro Iwamatsu 
1312035d77dSNobuhiro Iwamatsu 	writeb(addr, &dev->icdr);
1323dab3e0eSNobuhiro Iwamatsu 	if (stop)
1332035d77dSNobuhiro Iwamatsu 		writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS), &dev->iccr);
1343dab3e0eSNobuhiro Iwamatsu 
1352035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
136d042d712STetsuyuki Kobayashi 		return -1;
137d042d712STetsuyuki Kobayashi 	return 0;
1383dab3e0eSNobuhiro Iwamatsu }
1393dab3e0eSNobuhiro Iwamatsu 
sh_i2c_finish(struct sh_i2c * dev)1402035d77dSNobuhiro Iwamatsu static void sh_i2c_finish(struct sh_i2c *dev)
1413dab3e0eSNobuhiro Iwamatsu {
1422035d77dSNobuhiro Iwamatsu 	writeb(0, &dev->icsr);
1432035d77dSNobuhiro Iwamatsu 	clrbits_8(&dev->iccr, SH_I2C_ICCR_ICE);
1443dab3e0eSNobuhiro Iwamatsu }
1453dab3e0eSNobuhiro Iwamatsu 
1462035d77dSNobuhiro Iwamatsu static int
sh_i2c_raw_write(struct sh_i2c * dev,u8 chip,uint addr,u8 val)1472035d77dSNobuhiro Iwamatsu sh_i2c_raw_write(struct sh_i2c *dev, u8 chip, uint addr, u8 val)
1483dab3e0eSNobuhiro Iwamatsu {
1490e5fb33cSTetsuyuki Kobayashi 	int ret = -1;
1502035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 0) != 0)
1510e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1523dab3e0eSNobuhiro Iwamatsu 	udelay(10);
1533dab3e0eSNobuhiro Iwamatsu 
1542035d77dSNobuhiro Iwamatsu 	writeb(val, &dev->icdr);
1552035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1560e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1573dab3e0eSNobuhiro Iwamatsu 
1582035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE | SH_I2C_ICCR_RTS), &dev->iccr);
1592035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1600e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1612035d77dSNobuhiro Iwamatsu 	sh_irq_busy(dev);
1620e5fb33cSTetsuyuki Kobayashi 	ret = 0;
1632035d77dSNobuhiro Iwamatsu 
1640e5fb33cSTetsuyuki Kobayashi exit0:
1652035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
1660e5fb33cSTetsuyuki Kobayashi 	return ret;
1673dab3e0eSNobuhiro Iwamatsu }
1683dab3e0eSNobuhiro Iwamatsu 
sh_i2c_raw_read(struct sh_i2c * dev,u8 chip,u8 addr)1692035d77dSNobuhiro Iwamatsu static int sh_i2c_raw_read(struct sh_i2c *dev, u8 chip, u8 addr)
1703dab3e0eSNobuhiro Iwamatsu {
1710e5fb33cSTetsuyuki Kobayashi 	int ret = -1;
1723dab3e0eSNobuhiro Iwamatsu 
1733ce2703dSTetsuyuki Kobayashi #if defined(CONFIG_SH73A0)
1742035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 0) != 0)
1750e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1763ce2703dSTetsuyuki Kobayashi #else
1772035d77dSNobuhiro Iwamatsu 	if (sh_i2c_set_addr(dev, chip, addr, 1) != 0)
1780e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1793dab3e0eSNobuhiro Iwamatsu 	udelay(100);
1803ce2703dSTetsuyuki Kobayashi #endif
1813dab3e0eSNobuhiro Iwamatsu 
1822035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &dev->iccr);
1832035d77dSNobuhiro Iwamatsu 	sh_irq_dte(dev);
1843dab3e0eSNobuhiro Iwamatsu 
1852035d77dSNobuhiro Iwamatsu 	writeb(chip << 1 | 0x01, &dev->icdr);
1862035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1870e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1883dab3e0eSNobuhiro Iwamatsu 
1892035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_SCP), &dev->iccr);
1902035d77dSNobuhiro Iwamatsu 	if (sh_irq_dte_with_tack(dev) != 0)
1910e5fb33cSTetsuyuki Kobayashi 		goto exit0;
1923dab3e0eSNobuhiro Iwamatsu 
1932035d77dSNobuhiro Iwamatsu 	ret = readb(&dev->icdr) & 0xff;
1943dab3e0eSNobuhiro Iwamatsu 
1952035d77dSNobuhiro Iwamatsu 	writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RACK), &dev->iccr);
1962035d77dSNobuhiro Iwamatsu 	readb(&dev->icdr); /* Dummy read */
1972035d77dSNobuhiro Iwamatsu 	sh_irq_busy(dev);
1982035d77dSNobuhiro Iwamatsu 
1990e5fb33cSTetsuyuki Kobayashi exit0:
2002035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
2013dab3e0eSNobuhiro Iwamatsu 
2023dab3e0eSNobuhiro Iwamatsu 	return ret;
2033dab3e0eSNobuhiro Iwamatsu }
2043dab3e0eSNobuhiro Iwamatsu 
2052035d77dSNobuhiro Iwamatsu static void
sh_i2c_init(struct i2c_adapter * adap,int speed,int slaveadd)2062035d77dSNobuhiro Iwamatsu sh_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
2073dab3e0eSNobuhiro Iwamatsu {
2083dab3e0eSNobuhiro Iwamatsu 	int num, denom, tmp;
2093dab3e0eSNobuhiro Iwamatsu 
210b55b8eefSNobuhiro Iwamatsu 	/* No i2c support prior to relocation */
211b55b8eefSNobuhiro Iwamatsu 	if (!(gd->flags & GD_FLG_RELOC))
212b55b8eefSNobuhiro Iwamatsu 		return;
213b55b8eefSNobuhiro Iwamatsu 
2143dab3e0eSNobuhiro Iwamatsu 	/*
2153dab3e0eSNobuhiro Iwamatsu 	 * Calculate the value for iccl. From the data sheet:
2163dab3e0eSNobuhiro Iwamatsu 	 * iccl = (p-clock / transfer-rate) * (L / (L + H))
2173dab3e0eSNobuhiro Iwamatsu 	 * where L and H are the SCL low and high ratio.
2183dab3e0eSNobuhiro Iwamatsu 	 */
2193dab3e0eSNobuhiro Iwamatsu 	num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_LOW;
2203dab3e0eSNobuhiro Iwamatsu 	denom = speed * (CONFIG_SH_I2C_DATA_HIGH + CONFIG_SH_I2C_DATA_LOW);
2213dab3e0eSNobuhiro Iwamatsu 	tmp = num * 10 / denom;
2223dab3e0eSNobuhiro Iwamatsu 	if (tmp % 10 >= 5)
223b1af67feSTetsuyuki Kobayashi 		iccl = (u16)((num/denom) + 1);
2243dab3e0eSNobuhiro Iwamatsu 	else
225b1af67feSTetsuyuki Kobayashi 		iccl = (u16)(num/denom);
2263dab3e0eSNobuhiro Iwamatsu 
2273dab3e0eSNobuhiro Iwamatsu 	/* Calculate the value for icch. From the data sheet:
2283dab3e0eSNobuhiro Iwamatsu 	   icch = (p clock / transfer rate) * (H / (L + H)) */
2293dab3e0eSNobuhiro Iwamatsu 	num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_HIGH;
2303dab3e0eSNobuhiro Iwamatsu 	tmp = num * 10 / denom;
2313dab3e0eSNobuhiro Iwamatsu 	if (tmp % 10 >= 5)
232b1af67feSTetsuyuki Kobayashi 		icch = (u16)((num/denom) + 1);
2333dab3e0eSNobuhiro Iwamatsu 	else
234b1af67feSTetsuyuki Kobayashi 		icch = (u16)(num/denom);
2352035d77dSNobuhiro Iwamatsu 
2362035d77dSNobuhiro Iwamatsu 	debug("clock: %d, speed %d, iccl: %x, icch: %x\n",
2372035d77dSNobuhiro Iwamatsu 			CONFIG_SH_I2C_CLOCK, speed, iccl, icch);
2383dab3e0eSNobuhiro Iwamatsu }
2393dab3e0eSNobuhiro Iwamatsu 
sh_i2c_read(struct i2c_adapter * adap,uint8_t chip,uint addr,int alen,u8 * data,int len)2402035d77dSNobuhiro Iwamatsu static int sh_i2c_read(struct i2c_adapter *adap, uint8_t chip,
2412035d77dSNobuhiro Iwamatsu 				uint addr, int alen, u8 *data, int len)
2423dab3e0eSNobuhiro Iwamatsu {
2432035d77dSNobuhiro Iwamatsu 	int ret, i;
2442035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
2452035d77dSNobuhiro Iwamatsu 
2460e5fb33cSTetsuyuki Kobayashi 	for (i = 0; i < len; i++) {
2472035d77dSNobuhiro Iwamatsu 		ret = sh_i2c_raw_read(dev, chip, addr + i);
2480e5fb33cSTetsuyuki Kobayashi 		if (ret < 0)
2490e5fb33cSTetsuyuki Kobayashi 			return -1;
2502035d77dSNobuhiro Iwamatsu 
2512035d77dSNobuhiro Iwamatsu 		data[i] = ret & 0xff;
2522035d77dSNobuhiro Iwamatsu 		debug("%s: data[%d]: %02x\n", __func__, i, data[i]);
2530e5fb33cSTetsuyuki Kobayashi 	}
2542035d77dSNobuhiro Iwamatsu 
2553dab3e0eSNobuhiro Iwamatsu 	return 0;
2563dab3e0eSNobuhiro Iwamatsu }
2573dab3e0eSNobuhiro Iwamatsu 
sh_i2c_write(struct i2c_adapter * adap,uint8_t chip,uint addr,int alen,u8 * data,int len)2582035d77dSNobuhiro Iwamatsu static int sh_i2c_write(struct i2c_adapter *adap, uint8_t chip, uint addr,
2592035d77dSNobuhiro Iwamatsu 				int alen, u8 *data, int len)
2603dab3e0eSNobuhiro Iwamatsu {
2612035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
2622035d77dSNobuhiro Iwamatsu 	int i;
2632035d77dSNobuhiro Iwamatsu 
2642035d77dSNobuhiro Iwamatsu 	for (i = 0; i < len; i++) {
2652035d77dSNobuhiro Iwamatsu 		debug("%s: data[%d]: %02x\n", __func__, i, data[i]);
2662035d77dSNobuhiro Iwamatsu 		if (sh_i2c_raw_write(dev, chip, addr + i, data[i]) != 0)
2670e5fb33cSTetsuyuki Kobayashi 			return -1;
2682035d77dSNobuhiro Iwamatsu 	}
2692035d77dSNobuhiro Iwamatsu 	return 0;
2702035d77dSNobuhiro Iwamatsu }
2712035d77dSNobuhiro Iwamatsu 
2722035d77dSNobuhiro Iwamatsu static int
sh_i2c_probe(struct i2c_adapter * adap,u8 dev)2732035d77dSNobuhiro Iwamatsu sh_i2c_probe(struct i2c_adapter *adap, u8 dev)
2742035d77dSNobuhiro Iwamatsu {
2757a657689STetsuyuki Kobayashi 	u8 dummy[1];
2767a657689STetsuyuki Kobayashi 
2777a657689STetsuyuki Kobayashi 	return sh_i2c_read(adap, dev, 0, 0, dummy, sizeof dummy);
2782035d77dSNobuhiro Iwamatsu }
2792035d77dSNobuhiro Iwamatsu 
sh_i2c_set_bus_speed(struct i2c_adapter * adap,unsigned int speed)2802035d77dSNobuhiro Iwamatsu static unsigned int sh_i2c_set_bus_speed(struct i2c_adapter *adap,
2812035d77dSNobuhiro Iwamatsu 			unsigned int speed)
2822035d77dSNobuhiro Iwamatsu {
2832035d77dSNobuhiro Iwamatsu 	struct sh_i2c *dev = (struct sh_i2c *)i2c_dev[adap->hwadapnr];
2842035d77dSNobuhiro Iwamatsu 
2852035d77dSNobuhiro Iwamatsu 	sh_i2c_finish(dev);
2862035d77dSNobuhiro Iwamatsu 	sh_i2c_init(adap, speed, 0);
2872035d77dSNobuhiro Iwamatsu 
2883dab3e0eSNobuhiro Iwamatsu 	return 0;
2893dab3e0eSNobuhiro Iwamatsu }
2903dab3e0eSNobuhiro Iwamatsu 
2913dab3e0eSNobuhiro Iwamatsu /*
2922035d77dSNobuhiro Iwamatsu  * Register RCAR i2c adapters
2933dab3e0eSNobuhiro Iwamatsu  */
2942035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_0, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
2952035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED0, 0, 0)
2962035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE1
2972035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_1, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
2982035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED1, 0, 1)
2992035d77dSNobuhiro Iwamatsu #endif
3002035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE2
3012035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_2, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
3022035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED2, 0, 2)
3032035d77dSNobuhiro Iwamatsu #endif
3042035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE3
3052035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_3, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
3062035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED3, 0, 3)
3072035d77dSNobuhiro Iwamatsu #endif
3082035d77dSNobuhiro Iwamatsu #ifdef CONFIG_SYS_I2C_SH_BASE4
3092035d77dSNobuhiro Iwamatsu U_BOOT_I2C_ADAP_COMPLETE(sh_4, sh_i2c_init, sh_i2c_probe, sh_i2c_read,
3102035d77dSNobuhiro Iwamatsu 	sh_i2c_write, sh_i2c_set_bus_speed, CONFIG_SYS_I2C_SH_SPEED4, 0, 4)
3112035d77dSNobuhiro Iwamatsu #endif
312