1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2b46226bdSDirk Eibach /*
3b46226bdSDirk Eibach * (C) Copyright 2013
4d38826a3SMario Six * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
5b46226bdSDirk Eibach */
6b46226bdSDirk Eibach
7b46226bdSDirk Eibach #include <common.h>
8b46226bdSDirk Eibach #include <i2c.h>
992164216SMario Six #ifdef CONFIG_DM_I2C
1092164216SMario Six #include <dm.h>
1192164216SMario Six #include <fpgamap.h>
1292164216SMario Six #include "../misc/gdsys_soc.h"
1392164216SMario Six #else
14b46226bdSDirk Eibach #include <gdsys_fpga.h>
1592164216SMario Six #endif
1664ef094bSMario Six #include <asm/unaligned.h>
17b46226bdSDirk Eibach
1892164216SMario Six #ifdef CONFIG_DM_I2C
1992164216SMario Six struct ihs_i2c_priv {
2092164216SMario Six uint speed;
2192164216SMario Six phys_addr_t addr;
2292164216SMario Six };
2392164216SMario Six
2492164216SMario Six enum {
2592164216SMario Six REG_INTERRUPT_STATUS = 0x00,
2692164216SMario Six REG_INTERRUPT_ENABLE_CONTROL = 0x02,
2792164216SMario Six REG_WRITE_MAILBOX_EXT = 0x04,
2892164216SMario Six REG_WRITE_MAILBOX = 0x06,
2992164216SMario Six REG_READ_MAILBOX_EXT = 0x08,
3092164216SMario Six REG_READ_MAILBOX = 0x0A,
3192164216SMario Six };
3292164216SMario Six
3392164216SMario Six #else /* !CONFIG_DM_I2C */
34b46226bdSDirk Eibach DECLARE_GLOBAL_DATA_PTR;
35b46226bdSDirk Eibach
36071be896SDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_DUAL
3792164216SMario Six
38071be896SDirk Eibach #define I2C_SET_REG(fld, val) \
393af0cdb1SDirk Eibach do { \
403af0cdb1SDirk Eibach if (I2C_ADAP_HWNR & 0x10) \
41071be896SDirk Eibach FPGA_SET_REG(I2C_ADAP_HWNR & 0xf, i2c1.fld, val); \
42071be896SDirk Eibach else \
433af0cdb1SDirk Eibach FPGA_SET_REG(I2C_ADAP_HWNR, i2c0.fld, val); \
443af0cdb1SDirk Eibach } while (0)
45071be896SDirk Eibach #else
46071be896SDirk Eibach #define I2C_SET_REG(fld, val) \
473af0cdb1SDirk Eibach FPGA_SET_REG(I2C_ADAP_HWNR, i2c0.fld, val)
48071be896SDirk Eibach #endif
49071be896SDirk Eibach
50071be896SDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_DUAL
51071be896SDirk Eibach #define I2C_GET_REG(fld, val) \
523af0cdb1SDirk Eibach do { \
533af0cdb1SDirk Eibach if (I2C_ADAP_HWNR & 0x10) \
54071be896SDirk Eibach FPGA_GET_REG(I2C_ADAP_HWNR & 0xf, i2c1.fld, val); \
55071be896SDirk Eibach else \
563af0cdb1SDirk Eibach FPGA_GET_REG(I2C_ADAP_HWNR, i2c0.fld, val); \
573af0cdb1SDirk Eibach } while (0)
58071be896SDirk Eibach #else
59071be896SDirk Eibach #define I2C_GET_REG(fld, val) \
603af0cdb1SDirk Eibach FPGA_GET_REG(I2C_ADAP_HWNR, i2c0.fld, val)
61071be896SDirk Eibach #endif
6292164216SMario Six #endif /* CONFIG_DM_I2C */
63071be896SDirk Eibach
64b46226bdSDirk Eibach enum {
6564ef094bSMario Six I2CINT_ERROR_EV = BIT(13),
6664ef094bSMario Six I2CINT_TRANSMIT_EV = BIT(14),
6764ef094bSMario Six I2CINT_RECEIVE_EV = BIT(15),
68b46226bdSDirk Eibach };
69b46226bdSDirk Eibach
70b46226bdSDirk Eibach enum {
7164ef094bSMario Six I2CMB_READ = 0 << 10,
72b46226bdSDirk Eibach I2CMB_WRITE = 1 << 10,
7364ef094bSMario Six I2CMB_1BYTE = 0 << 11,
74b46226bdSDirk Eibach I2CMB_2BYTE = 1 << 11,
7564ef094bSMario Six I2CMB_DONT_HOLD_BUS = 0 << 13,
76b46226bdSDirk Eibach I2CMB_HOLD_BUS = 1 << 13,
77b46226bdSDirk Eibach I2CMB_NATIVE = 2 << 14,
78b46226bdSDirk Eibach };
79b46226bdSDirk Eibach
8064ef094bSMario Six enum {
8164ef094bSMario Six I2COP_WRITE = 0,
8264ef094bSMario Six I2COP_READ = 1,
8364ef094bSMario Six };
8464ef094bSMario Six
8592164216SMario Six #ifdef CONFIG_DM_I2C
wait_for_int(struct udevice * dev,int read)8692164216SMario Six static int wait_for_int(struct udevice *dev, int read)
8792164216SMario Six #else
88b46226bdSDirk Eibach static int wait_for_int(bool read)
8992164216SMario Six #endif
90b46226bdSDirk Eibach {
91b46226bdSDirk Eibach u16 val;
9264ef094bSMario Six uint ctr = 0;
9392164216SMario Six #ifdef CONFIG_DM_I2C
9492164216SMario Six struct ihs_i2c_priv *priv = dev_get_priv(dev);
9592164216SMario Six struct udevice *fpga;
96b46226bdSDirk Eibach
9792164216SMario Six gdsys_soc_get_fpga(dev, &fpga);
9892164216SMario Six #endif
9992164216SMario Six
10092164216SMario Six #ifdef CONFIG_DM_I2C
1012df71d6dSMario Six fpgamap_read(fpga, priv->addr + REG_INTERRUPT_STATUS, &val,
1022df71d6dSMario Six FPGAMAP_SIZE_16);
10392164216SMario Six #else
104071be896SDirk Eibach I2C_GET_REG(interrupt_status, &val);
10592164216SMario Six #endif
10664ef094bSMario Six /* Wait until error or receive/transmit interrupt was raised */
107b46226bdSDirk Eibach while (!(val & (I2CINT_ERROR_EV
108b46226bdSDirk Eibach | (read ? I2CINT_RECEIVE_EV : I2CINT_TRANSMIT_EV)))) {
109b46226bdSDirk Eibach udelay(10);
11064ef094bSMario Six if (ctr++ > 5000)
111b46226bdSDirk Eibach return 1;
11292164216SMario Six #ifdef CONFIG_DM_I2C
1132df71d6dSMario Six fpgamap_read(fpga, priv->addr + REG_INTERRUPT_STATUS, &val,
1142df71d6dSMario Six FPGAMAP_SIZE_16);
11592164216SMario Six #else
116071be896SDirk Eibach I2C_GET_REG(interrupt_status, &val);
11792164216SMario Six #endif
118b46226bdSDirk Eibach }
119b46226bdSDirk Eibach
120b46226bdSDirk Eibach return (val & I2CINT_ERROR_EV) ? 1 : 0;
121b46226bdSDirk Eibach }
122b46226bdSDirk Eibach
12392164216SMario Six #ifdef CONFIG_DM_I2C
ihs_i2c_transfer(struct udevice * dev,uchar chip,uchar * buffer,int len,int read,bool is_last)12492164216SMario Six static int ihs_i2c_transfer(struct udevice *dev, uchar chip,
12592164216SMario Six uchar *buffer, int len, int read, bool is_last)
12692164216SMario Six #else
127b46226bdSDirk Eibach static int ihs_i2c_transfer(uchar chip, uchar *buffer, int len, bool read,
128b46226bdSDirk Eibach bool is_last)
12992164216SMario Six #endif
130b46226bdSDirk Eibach {
131b46226bdSDirk Eibach u16 val;
1322df71d6dSMario Six u16 data;
13392164216SMario Six #ifdef CONFIG_DM_I2C
13492164216SMario Six struct ihs_i2c_priv *priv = dev_get_priv(dev);
13592164216SMario Six struct udevice *fpga;
13692164216SMario Six
13792164216SMario Six gdsys_soc_get_fpga(dev, &fpga);
13892164216SMario Six #endif
139b46226bdSDirk Eibach
14064ef094bSMario Six /* Clear interrupt status */
1412df71d6dSMario Six data = I2CINT_ERROR_EV | I2CINT_RECEIVE_EV | I2CINT_TRANSMIT_EV;
14292164216SMario Six #ifdef CONFIG_DM_I2C
1432df71d6dSMario Six fpgamap_write(fpga, priv->addr + REG_INTERRUPT_STATUS, &data,
1442df71d6dSMario Six FPGAMAP_SIZE_16);
1452df71d6dSMario Six fpgamap_read(fpga, priv->addr + REG_INTERRUPT_STATUS, &val,
1462df71d6dSMario Six FPGAMAP_SIZE_16);
14792164216SMario Six #else
1482df71d6dSMario Six I2C_SET_REG(interrupt_status, data);
149071be896SDirk Eibach I2C_GET_REG(interrupt_status, &val);
15092164216SMario Six #endif
151b46226bdSDirk Eibach
15264ef094bSMario Six /* If we want to write and have data, write the bytes to the mailbox */
153b46226bdSDirk Eibach if (!read && len) {
154b46226bdSDirk Eibach val = buffer[0];
155b46226bdSDirk Eibach
156b46226bdSDirk Eibach if (len > 1)
157b46226bdSDirk Eibach val |= buffer[1] << 8;
15892164216SMario Six #ifdef CONFIG_DM_I2C
1592df71d6dSMario Six fpgamap_write(fpga, priv->addr + REG_WRITE_MAILBOX_EXT, &val,
1602df71d6dSMario Six FPGAMAP_SIZE_16);
16192164216SMario Six #else
162071be896SDirk Eibach I2C_SET_REG(write_mailbox_ext, val);
16392164216SMario Six #endif
164b46226bdSDirk Eibach }
165b46226bdSDirk Eibach
1662df71d6dSMario Six data = I2CMB_NATIVE
167b46226bdSDirk Eibach | (read ? 0 : I2CMB_WRITE)
168b46226bdSDirk Eibach | (chip << 1)
169b46226bdSDirk Eibach | ((len > 1) ? I2CMB_2BYTE : 0)
1702df71d6dSMario Six | (is_last ? 0 : I2CMB_HOLD_BUS);
1712df71d6dSMario Six
1722df71d6dSMario Six #ifdef CONFIG_DM_I2C
1732df71d6dSMario Six fpgamap_write(fpga, priv->addr + REG_WRITE_MAILBOX, &data,
1742df71d6dSMario Six FPGAMAP_SIZE_16);
1752df71d6dSMario Six #else
1762df71d6dSMario Six I2C_SET_REG(write_mailbox, data);
17792164216SMario Six #endif
178b46226bdSDirk Eibach
17992164216SMario Six #ifdef CONFIG_DM_I2C
18092164216SMario Six if (wait_for_int(dev, read))
18192164216SMario Six #else
182b46226bdSDirk Eibach if (wait_for_int(read))
18392164216SMario Six #endif
184b46226bdSDirk Eibach return 1;
185b46226bdSDirk Eibach
18664ef094bSMario Six /* If we want to read, get the bytes from the mailbox */
187b46226bdSDirk Eibach if (read) {
18892164216SMario Six #ifdef CONFIG_DM_I2C
1892df71d6dSMario Six fpgamap_read(fpga, priv->addr + REG_READ_MAILBOX_EXT, &val,
1902df71d6dSMario Six FPGAMAP_SIZE_16);
19192164216SMario Six #else
192071be896SDirk Eibach I2C_GET_REG(read_mailbox_ext, &val);
19392164216SMario Six #endif
194b46226bdSDirk Eibach buffer[0] = val & 0xff;
195b46226bdSDirk Eibach if (len > 1)
196b46226bdSDirk Eibach buffer[1] = val >> 8;
197b46226bdSDirk Eibach }
198b46226bdSDirk Eibach
199b46226bdSDirk Eibach return 0;
200b46226bdSDirk Eibach }
201b46226bdSDirk Eibach
20292164216SMario Six #ifdef CONFIG_DM_I2C
ihs_i2c_send_buffer(struct udevice * dev,uchar chip,u8 * data,int len,bool hold_bus,int read)2039cef983dSMario Six static int ihs_i2c_send_buffer(struct udevice *dev, uchar chip, u8 *data, int len, bool hold_bus, int read)
2049cef983dSMario Six #else
2059cef983dSMario Six static int ihs_i2c_send_buffer(uchar chip, u8 *data, int len, bool hold_bus,
2069cef983dSMario Six int read)
2079cef983dSMario Six #endif
2089cef983dSMario Six {
2099cef983dSMario Six while (len) {
2109cef983dSMario Six int transfer = min(len, 2);
2119cef983dSMario Six bool is_last = len <= transfer;
2129cef983dSMario Six
2139cef983dSMario Six #ifdef CONFIG_DM_I2C
2149cef983dSMario Six if (ihs_i2c_transfer(dev, chip, data, transfer, read,
2159cef983dSMario Six hold_bus ? false : is_last))
2169cef983dSMario Six return 1;
2179cef983dSMario Six #else
2189cef983dSMario Six if (ihs_i2c_transfer(chip, data, transfer, read,
2199cef983dSMario Six hold_bus ? false : is_last))
2209cef983dSMario Six return 1;
2219cef983dSMario Six #endif
2229cef983dSMario Six
2239cef983dSMario Six data += transfer;
2249cef983dSMario Six len -= transfer;
2259cef983dSMario Six }
2269cef983dSMario Six
2279cef983dSMario Six return 0;
2289cef983dSMario Six }
2299cef983dSMario Six
2309cef983dSMario Six #ifdef CONFIG_DM_I2C
ihs_i2c_address(struct udevice * dev,uchar chip,u8 * addr,int alen,bool hold_bus)2319cef983dSMario Six static int ihs_i2c_address(struct udevice *dev, uchar chip, u8 *addr, int alen,
2329cef983dSMario Six bool hold_bus)
23392164216SMario Six #else
23464ef094bSMario Six static int ihs_i2c_address(uchar chip, u8 *addr, int alen, bool hold_bus)
23592164216SMario Six #endif
236b46226bdSDirk Eibach {
23792164216SMario Six #ifdef CONFIG_DM_I2C
2389cef983dSMario Six return ihs_i2c_send_buffer(dev, chip, addr, alen, hold_bus, I2COP_WRITE);
23992164216SMario Six #else
2409cef983dSMario Six return ihs_i2c_send_buffer(chip, addr, alen, hold_bus, I2COP_WRITE);
24192164216SMario Six #endif
242b46226bdSDirk Eibach }
243b46226bdSDirk Eibach
24492164216SMario Six #ifdef CONFIG_DM_I2C
ihs_i2c_access(struct udevice * dev,uchar chip,u8 * addr,int alen,uchar * buffer,int len,int read)24592164216SMario Six static int ihs_i2c_access(struct udevice *dev, uchar chip, u8 *addr,
24692164216SMario Six int alen, uchar *buffer, int len, int read)
24792164216SMario Six #else
24864ef094bSMario Six static int ihs_i2c_access(struct i2c_adapter *adap, uchar chip, u8 *addr,
24964ef094bSMario Six int alen, uchar *buffer, int len, int read)
25092164216SMario Six #endif
251b46226bdSDirk Eibach {
25264ef094bSMario Six /* Don't hold the bus if length of data to send/receive is zero */
25392164216SMario Six #ifdef CONFIG_DM_I2C
25492164216SMario Six if (len <= 0 || ihs_i2c_address(dev, chip, addr, alen, len))
25592164216SMario Six return 1;
25692164216SMario Six #else
25764ef094bSMario Six if (len <= 0 || ihs_i2c_address(chip, addr, alen, len))
258b46226bdSDirk Eibach return 1;
25992164216SMario Six #endif
260b46226bdSDirk Eibach
26192164216SMario Six #ifdef CONFIG_DM_I2C
2629cef983dSMario Six return ihs_i2c_send_buffer(dev, chip, buffer, len, false, read);
26392164216SMario Six #else
2649cef983dSMario Six return ihs_i2c_send_buffer(chip, buffer, len, false, read);
26592164216SMario Six #endif
266b46226bdSDirk Eibach }
267b46226bdSDirk Eibach
26892164216SMario Six #ifdef CONFIG_DM_I2C
26992164216SMario Six
ihs_i2c_probe(struct udevice * bus)27092164216SMario Six int ihs_i2c_probe(struct udevice *bus)
27192164216SMario Six {
27292164216SMario Six struct ihs_i2c_priv *priv = dev_get_priv(bus);
27392164216SMario Six int addr;
27492164216SMario Six
27592164216SMario Six addr = dev_read_u32_default(bus, "reg", -1);
27692164216SMario Six
27792164216SMario Six priv->addr = addr;
27892164216SMario Six
27992164216SMario Six return 0;
28092164216SMario Six }
28192164216SMario Six
ihs_i2c_set_bus_speed(struct udevice * bus,uint speed)28292164216SMario Six static int ihs_i2c_set_bus_speed(struct udevice *bus, uint speed)
28392164216SMario Six {
28492164216SMario Six struct ihs_i2c_priv *priv = dev_get_priv(bus);
28592164216SMario Six
28692164216SMario Six if (speed != priv->speed && priv->speed != 0)
28792164216SMario Six return 1;
28892164216SMario Six
28992164216SMario Six priv->speed = speed;
29092164216SMario Six
29192164216SMario Six return 0;
29292164216SMario Six }
29392164216SMario Six
ihs_i2c_xfer(struct udevice * bus,struct i2c_msg * msg,int nmsgs)29492164216SMario Six static int ihs_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
29592164216SMario Six {
29692164216SMario Six struct i2c_msg *dmsg, *omsg, dummy;
29792164216SMario Six
29892164216SMario Six memset(&dummy, 0, sizeof(struct i2c_msg));
29992164216SMario Six
30092164216SMario Six /* We expect either two messages (one with an offset and one with the
30192164216SMario Six * actucal data) or one message (just data)
30292164216SMario Six */
30392164216SMario Six if (nmsgs > 2 || nmsgs == 0) {
30492164216SMario Six debug("%s: Only one or two messages are supported.", __func__);
30592164216SMario Six return -1;
30692164216SMario Six }
30792164216SMario Six
30892164216SMario Six omsg = nmsgs == 1 ? &dummy : msg;
30992164216SMario Six dmsg = nmsgs == 1 ? msg : msg + 1;
31092164216SMario Six
31192164216SMario Six if (dmsg->flags & I2C_M_RD)
31292164216SMario Six return ihs_i2c_access(bus, dmsg->addr, omsg->buf,
31392164216SMario Six omsg->len, dmsg->buf, dmsg->len,
31492164216SMario Six I2COP_READ);
31592164216SMario Six else
31692164216SMario Six return ihs_i2c_access(bus, dmsg->addr, omsg->buf,
31792164216SMario Six omsg->len, dmsg->buf, dmsg->len,
31892164216SMario Six I2COP_WRITE);
31992164216SMario Six }
32092164216SMario Six
ihs_i2c_probe_chip(struct udevice * bus,u32 chip_addr,u32 chip_flags)32192164216SMario Six static int ihs_i2c_probe_chip(struct udevice *bus, u32 chip_addr,
32292164216SMario Six u32 chip_flags)
32392164216SMario Six {
32492164216SMario Six uchar buffer[2];
32592164216SMario Six
32692164216SMario Six if (ihs_i2c_transfer(bus, chip_addr, buffer, 0, I2COP_READ, true))
32792164216SMario Six return 1;
32892164216SMario Six
32992164216SMario Six return 0;
33092164216SMario Six }
33192164216SMario Six
33292164216SMario Six static const struct dm_i2c_ops ihs_i2c_ops = {
33392164216SMario Six .xfer = ihs_i2c_xfer,
33492164216SMario Six .probe_chip = ihs_i2c_probe_chip,
33592164216SMario Six .set_bus_speed = ihs_i2c_set_bus_speed,
33692164216SMario Six };
33792164216SMario Six
33892164216SMario Six static const struct udevice_id ihs_i2c_ids[] = {
33992164216SMario Six { .compatible = "gdsys,ihs_i2cmaster", },
34092164216SMario Six { /* sentinel */ }
34192164216SMario Six };
34292164216SMario Six
34392164216SMario Six U_BOOT_DRIVER(i2c_ihs) = {
34492164216SMario Six .name = "i2c_ihs",
34592164216SMario Six .id = UCLASS_I2C,
34692164216SMario Six .of_match = ihs_i2c_ids,
34792164216SMario Six .probe = ihs_i2c_probe,
34892164216SMario Six .priv_auto_alloc_size = sizeof(struct ihs_i2c_priv),
34992164216SMario Six .ops = &ihs_i2c_ops,
35092164216SMario Six };
35192164216SMario Six
35292164216SMario Six #else /* CONFIG_DM_I2C */
35392164216SMario Six
ihs_i2c_init(struct i2c_adapter * adap,int speed,int slaveaddr)354b46226bdSDirk Eibach static void ihs_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
355b46226bdSDirk Eibach {
356b46226bdSDirk Eibach #ifdef CONFIG_SYS_I2C_INIT_BOARD
357b46226bdSDirk Eibach /*
358b46226bdSDirk Eibach * Call board specific i2c bus reset routine before accessing the
359b46226bdSDirk Eibach * environment, which might be in a chip on that bus. For details
360b46226bdSDirk Eibach * about this problem see doc/I2C_Edge_Conditions.
361b46226bdSDirk Eibach */
362b46226bdSDirk Eibach i2c_init_board();
363b46226bdSDirk Eibach #endif
364b46226bdSDirk Eibach }
365b46226bdSDirk Eibach
ihs_i2c_probe(struct i2c_adapter * adap,uchar chip)366b46226bdSDirk Eibach static int ihs_i2c_probe(struct i2c_adapter *adap, uchar chip)
367b46226bdSDirk Eibach {
368b46226bdSDirk Eibach uchar buffer[2];
369b46226bdSDirk Eibach
37064ef094bSMario Six if (ihs_i2c_transfer(chip, buffer, 0, I2COP_READ, true))
371b46226bdSDirk Eibach return 1;
372b46226bdSDirk Eibach
373b46226bdSDirk Eibach return 0;
374b46226bdSDirk Eibach }
375b46226bdSDirk Eibach
ihs_i2c_read(struct i2c_adapter * adap,uchar chip,uint addr,int alen,uchar * buffer,int len)376b46226bdSDirk Eibach static int ihs_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr,
377b46226bdSDirk Eibach int alen, uchar *buffer, int len)
378b46226bdSDirk Eibach {
37964ef094bSMario Six u8 addr_bytes[4];
38064ef094bSMario Six
38164ef094bSMario Six put_unaligned_le32(addr, addr_bytes);
38264ef094bSMario Six
38364ef094bSMario Six return ihs_i2c_access(adap, chip, addr_bytes, alen, buffer, len,
38464ef094bSMario Six I2COP_READ);
385b46226bdSDirk Eibach }
386b46226bdSDirk Eibach
ihs_i2c_write(struct i2c_adapter * adap,uchar chip,uint addr,int alen,uchar * buffer,int len)387b46226bdSDirk Eibach static int ihs_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
388b46226bdSDirk Eibach int alen, uchar *buffer, int len)
389b46226bdSDirk Eibach {
39064ef094bSMario Six u8 addr_bytes[4];
39164ef094bSMario Six
39264ef094bSMario Six put_unaligned_le32(addr, addr_bytes);
39364ef094bSMario Six
39464ef094bSMario Six return ihs_i2c_access(adap, chip, addr_bytes, alen, buffer, len,
39564ef094bSMario Six I2COP_WRITE);
396b46226bdSDirk Eibach }
397b46226bdSDirk Eibach
ihs_i2c_set_bus_speed(struct i2c_adapter * adap,unsigned int speed)398b46226bdSDirk Eibach static unsigned int ihs_i2c_set_bus_speed(struct i2c_adapter *adap,
399b46226bdSDirk Eibach unsigned int speed)
400b46226bdSDirk Eibach {
401b46226bdSDirk Eibach if (speed != adap->speed)
402b46226bdSDirk Eibach return 1;
403b46226bdSDirk Eibach return speed;
404b46226bdSDirk Eibach }
405b46226bdSDirk Eibach
406b46226bdSDirk Eibach /*
407b46226bdSDirk Eibach * Register IHS i2c adapters
408b46226bdSDirk Eibach */
409b46226bdSDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_CH0
410b46226bdSDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs0, ihs_i2c_init, ihs_i2c_probe,
411b46226bdSDirk Eibach ihs_i2c_read, ihs_i2c_write,
412b46226bdSDirk Eibach ihs_i2c_set_bus_speed,
413b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_0,
414b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_0, 0)
415071be896SDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_DUAL
416071be896SDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs0_1, ihs_i2c_init, ihs_i2c_probe,
417071be896SDirk Eibach ihs_i2c_read, ihs_i2c_write,
418071be896SDirk Eibach ihs_i2c_set_bus_speed,
419071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_0_1,
420071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_0_1, 16)
421071be896SDirk Eibach #endif
422b46226bdSDirk Eibach #endif
423b46226bdSDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_CH1
424b46226bdSDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs1, ihs_i2c_init, ihs_i2c_probe,
425b46226bdSDirk Eibach ihs_i2c_read, ihs_i2c_write,
426b46226bdSDirk Eibach ihs_i2c_set_bus_speed,
427b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_1,
428b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_1, 1)
429071be896SDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_DUAL
430071be896SDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs1_1, ihs_i2c_init, ihs_i2c_probe,
431071be896SDirk Eibach ihs_i2c_read, ihs_i2c_write,
432071be896SDirk Eibach ihs_i2c_set_bus_speed,
433071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_1_1,
434071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_1_1, 17)
435071be896SDirk Eibach #endif
436b46226bdSDirk Eibach #endif
437b46226bdSDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_CH2
438b46226bdSDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs2, ihs_i2c_init, ihs_i2c_probe,
439b46226bdSDirk Eibach ihs_i2c_read, ihs_i2c_write,
440b46226bdSDirk Eibach ihs_i2c_set_bus_speed,
441b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_2,
442b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_2, 2)
443071be896SDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_DUAL
444071be896SDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs2_1, ihs_i2c_init, ihs_i2c_probe,
445071be896SDirk Eibach ihs_i2c_read, ihs_i2c_write,
446071be896SDirk Eibach ihs_i2c_set_bus_speed,
447071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_2_1,
448071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_2_1, 18)
449071be896SDirk Eibach #endif
450b46226bdSDirk Eibach #endif
451b46226bdSDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_CH3
452b46226bdSDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs3, ihs_i2c_init, ihs_i2c_probe,
453b46226bdSDirk Eibach ihs_i2c_read, ihs_i2c_write,
454b46226bdSDirk Eibach ihs_i2c_set_bus_speed,
455b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_3,
456b46226bdSDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_3, 3)
457071be896SDirk Eibach #ifdef CONFIG_SYS_I2C_IHS_DUAL
458071be896SDirk Eibach U_BOOT_I2C_ADAP_COMPLETE(ihs3_1, ihs_i2c_init, ihs_i2c_probe,
459071be896SDirk Eibach ihs_i2c_read, ihs_i2c_write,
460071be896SDirk Eibach ihs_i2c_set_bus_speed,
461071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SPEED_3_1,
462071be896SDirk Eibach CONFIG_SYS_I2C_IHS_SLAVE_3_1, 19)
463071be896SDirk Eibach #endif
464b46226bdSDirk Eibach #endif
46592164216SMario Six #endif /* CONFIG_DM_I2C */
466