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