blob: 82abb439f0c17f569e6da4e94fa7e3d6ee6b3e6b [file] [log] [blame]
Dirk Eibachb46226b2014-07-03 09:28:18 +02001/*
2 * (C) Copyright 2013
Mario Sixd38826a2018-03-06 08:04:58 +01003 * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
Dirk Eibachb46226b2014-07-03 09:28:18 +02004 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
9#include <i2c.h>
Mario Six92164212018-01-15 11:08:11 +010010#ifdef CONFIG_DM_I2C
11#include <dm.h>
12#include <fpgamap.h>
13#include "../misc/gdsys_soc.h"
14#else
Dirk Eibachb46226b2014-07-03 09:28:18 +020015#include <gdsys_fpga.h>
Mario Six92164212018-01-15 11:08:11 +010016#endif
Mario Six64ef0942018-01-15 11:08:10 +010017#include <asm/unaligned.h>
Dirk Eibachb46226b2014-07-03 09:28:18 +020018
Mario Six92164212018-01-15 11:08:11 +010019#ifdef CONFIG_DM_I2C
20struct ihs_i2c_priv {
21 uint speed;
22 phys_addr_t addr;
23};
24
25enum {
26 REG_INTERRUPT_STATUS = 0x00,
27 REG_INTERRUPT_ENABLE_CONTROL = 0x02,
28 REG_WRITE_MAILBOX_EXT = 0x04,
29 REG_WRITE_MAILBOX = 0x06,
30 REG_READ_MAILBOX_EXT = 0x08,
31 REG_READ_MAILBOX = 0x0A,
32};
33
34#else /* !CONFIG_DM_I2C */
Dirk Eibachb46226b2014-07-03 09:28:18 +020035DECLARE_GLOBAL_DATA_PTR;
36
Dirk Eibach071be892015-10-28 11:46:22 +010037#ifdef CONFIG_SYS_I2C_IHS_DUAL
Mario Six92164212018-01-15 11:08:11 +010038
Dirk Eibach071be892015-10-28 11:46:22 +010039#define I2C_SET_REG(fld, val) \
Dirk Eibach3af0cdb2015-10-28 11:46:23 +010040 do { \
41 if (I2C_ADAP_HWNR & 0x10) \
42 FPGA_SET_REG(I2C_ADAP_HWNR & 0xf, i2c1.fld, val); \
43 else \
44 FPGA_SET_REG(I2C_ADAP_HWNR, i2c0.fld, val); \
45 } while (0)
Dirk Eibach071be892015-10-28 11:46:22 +010046#else
47#define I2C_SET_REG(fld, val) \
Dirk Eibach3af0cdb2015-10-28 11:46:23 +010048 FPGA_SET_REG(I2C_ADAP_HWNR, i2c0.fld, val)
Dirk Eibach071be892015-10-28 11:46:22 +010049#endif
50
51#ifdef CONFIG_SYS_I2C_IHS_DUAL
52#define I2C_GET_REG(fld, val) \
Dirk Eibach3af0cdb2015-10-28 11:46:23 +010053 do { \
54 if (I2C_ADAP_HWNR & 0x10) \
55 FPGA_GET_REG(I2C_ADAP_HWNR & 0xf, i2c1.fld, val); \
56 else \
57 FPGA_GET_REG(I2C_ADAP_HWNR, i2c0.fld, val); \
58 } while (0)
Dirk Eibach071be892015-10-28 11:46:22 +010059#else
60#define I2C_GET_REG(fld, val) \
Dirk Eibach3af0cdb2015-10-28 11:46:23 +010061 FPGA_GET_REG(I2C_ADAP_HWNR, i2c0.fld, val)
Dirk Eibach071be892015-10-28 11:46:22 +010062#endif
Mario Six92164212018-01-15 11:08:11 +010063#endif /* CONFIG_DM_I2C */
Dirk Eibach071be892015-10-28 11:46:22 +010064
Dirk Eibachb46226b2014-07-03 09:28:18 +020065enum {
Mario Six64ef0942018-01-15 11:08:10 +010066 I2CINT_ERROR_EV = BIT(13),
67 I2CINT_TRANSMIT_EV = BIT(14),
68 I2CINT_RECEIVE_EV = BIT(15),
Dirk Eibachb46226b2014-07-03 09:28:18 +020069};
70
71enum {
Mario Six64ef0942018-01-15 11:08:10 +010072 I2CMB_READ = 0 << 10,
Dirk Eibachb46226b2014-07-03 09:28:18 +020073 I2CMB_WRITE = 1 << 10,
Mario Six64ef0942018-01-15 11:08:10 +010074 I2CMB_1BYTE = 0 << 11,
Dirk Eibachb46226b2014-07-03 09:28:18 +020075 I2CMB_2BYTE = 1 << 11,
Mario Six64ef0942018-01-15 11:08:10 +010076 I2CMB_DONT_HOLD_BUS = 0 << 13,
Dirk Eibachb46226b2014-07-03 09:28:18 +020077 I2CMB_HOLD_BUS = 1 << 13,
78 I2CMB_NATIVE = 2 << 14,
79};
80
Mario Six64ef0942018-01-15 11:08:10 +010081enum {
82 I2COP_WRITE = 0,
83 I2COP_READ = 1,
84};
85
Mario Six92164212018-01-15 11:08:11 +010086#ifdef CONFIG_DM_I2C
87static int wait_for_int(struct udevice *dev, int read)
88#else
Dirk Eibachb46226b2014-07-03 09:28:18 +020089static int wait_for_int(bool read)
Mario Six92164212018-01-15 11:08:11 +010090#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +020091{
92 u16 val;
Mario Six64ef0942018-01-15 11:08:10 +010093 uint ctr = 0;
Mario Six92164212018-01-15 11:08:11 +010094#ifdef CONFIG_DM_I2C
95 struct ihs_i2c_priv *priv = dev_get_priv(dev);
96 struct udevice *fpga;
Dirk Eibachb46226b2014-07-03 09:28:18 +020097
Mario Six92164212018-01-15 11:08:11 +010098 gdsys_soc_get_fpga(dev, &fpga);
99#endif
100
101#ifdef CONFIG_DM_I2C
Mario Six2df71d62018-03-28 14:37:42 +0200102 fpgamap_read(fpga, priv->addr + REG_INTERRUPT_STATUS, &val,
103 FPGAMAP_SIZE_16);
Mario Six92164212018-01-15 11:08:11 +0100104#else
Dirk Eibach071be892015-10-28 11:46:22 +0100105 I2C_GET_REG(interrupt_status, &val);
Mario Six92164212018-01-15 11:08:11 +0100106#endif
Mario Six64ef0942018-01-15 11:08:10 +0100107 /* Wait until error or receive/transmit interrupt was raised */
Dirk Eibachb46226b2014-07-03 09:28:18 +0200108 while (!(val & (I2CINT_ERROR_EV
109 | (read ? I2CINT_RECEIVE_EV : I2CINT_TRANSMIT_EV)))) {
110 udelay(10);
Mario Six64ef0942018-01-15 11:08:10 +0100111 if (ctr++ > 5000)
Dirk Eibachb46226b2014-07-03 09:28:18 +0200112 return 1;
Mario Six92164212018-01-15 11:08:11 +0100113#ifdef CONFIG_DM_I2C
Mario Six2df71d62018-03-28 14:37:42 +0200114 fpgamap_read(fpga, priv->addr + REG_INTERRUPT_STATUS, &val,
115 FPGAMAP_SIZE_16);
Mario Six92164212018-01-15 11:08:11 +0100116#else
Dirk Eibach071be892015-10-28 11:46:22 +0100117 I2C_GET_REG(interrupt_status, &val);
Mario Six92164212018-01-15 11:08:11 +0100118#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200119 }
120
121 return (val & I2CINT_ERROR_EV) ? 1 : 0;
122}
123
Mario Six92164212018-01-15 11:08:11 +0100124#ifdef CONFIG_DM_I2C
125static int ihs_i2c_transfer(struct udevice *dev, uchar chip,
126 uchar *buffer, int len, int read, bool is_last)
127#else
Dirk Eibachb46226b2014-07-03 09:28:18 +0200128static int ihs_i2c_transfer(uchar chip, uchar *buffer, int len, bool read,
129 bool is_last)
Mario Six92164212018-01-15 11:08:11 +0100130#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200131{
132 u16 val;
Mario Six2df71d62018-03-28 14:37:42 +0200133 u16 data;
Mario Six92164212018-01-15 11:08:11 +0100134#ifdef CONFIG_DM_I2C
135 struct ihs_i2c_priv *priv = dev_get_priv(dev);
136 struct udevice *fpga;
137
138 gdsys_soc_get_fpga(dev, &fpga);
139#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200140
Mario Six64ef0942018-01-15 11:08:10 +0100141 /* Clear interrupt status */
Mario Six2df71d62018-03-28 14:37:42 +0200142 data = I2CINT_ERROR_EV | I2CINT_RECEIVE_EV | I2CINT_TRANSMIT_EV;
Mario Six92164212018-01-15 11:08:11 +0100143#ifdef CONFIG_DM_I2C
Mario Six2df71d62018-03-28 14:37:42 +0200144 fpgamap_write(fpga, priv->addr + REG_INTERRUPT_STATUS, &data,
145 FPGAMAP_SIZE_16);
146 fpgamap_read(fpga, priv->addr + REG_INTERRUPT_STATUS, &val,
147 FPGAMAP_SIZE_16);
Mario Six92164212018-01-15 11:08:11 +0100148#else
Mario Six2df71d62018-03-28 14:37:42 +0200149 I2C_SET_REG(interrupt_status, data);
Dirk Eibach071be892015-10-28 11:46:22 +0100150 I2C_GET_REG(interrupt_status, &val);
Mario Six92164212018-01-15 11:08:11 +0100151#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200152
Mario Six64ef0942018-01-15 11:08:10 +0100153 /* If we want to write and have data, write the bytes to the mailbox */
Dirk Eibachb46226b2014-07-03 09:28:18 +0200154 if (!read && len) {
155 val = buffer[0];
156
157 if (len > 1)
158 val |= buffer[1] << 8;
Mario Six92164212018-01-15 11:08:11 +0100159#ifdef CONFIG_DM_I2C
Mario Six2df71d62018-03-28 14:37:42 +0200160 fpgamap_write(fpga, priv->addr + REG_WRITE_MAILBOX_EXT, &val,
161 FPGAMAP_SIZE_16);
Mario Six92164212018-01-15 11:08:11 +0100162#else
Dirk Eibach071be892015-10-28 11:46:22 +0100163 I2C_SET_REG(write_mailbox_ext, val);
Mario Six92164212018-01-15 11:08:11 +0100164#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200165 }
166
Mario Six2df71d62018-03-28 14:37:42 +0200167 data = I2CMB_NATIVE
168 | (read ? 0 : I2CMB_WRITE)
169 | (chip << 1)
170 | ((len > 1) ? I2CMB_2BYTE : 0)
171 | (is_last ? 0 : I2CMB_HOLD_BUS);
172
Mario Six92164212018-01-15 11:08:11 +0100173#ifdef CONFIG_DM_I2C
Mario Six2df71d62018-03-28 14:37:42 +0200174 fpgamap_write(fpga, priv->addr + REG_WRITE_MAILBOX, &data,
175 FPGAMAP_SIZE_16);
Mario Six92164212018-01-15 11:08:11 +0100176#else
Mario Six2df71d62018-03-28 14:37:42 +0200177 I2C_SET_REG(write_mailbox, data);
Mario Six92164212018-01-15 11:08:11 +0100178#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200179
Mario Six92164212018-01-15 11:08:11 +0100180#ifdef CONFIG_DM_I2C
181 if (wait_for_int(dev, read))
182#else
Dirk Eibachb46226b2014-07-03 09:28:18 +0200183 if (wait_for_int(read))
Mario Six92164212018-01-15 11:08:11 +0100184#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200185 return 1;
186
Mario Six64ef0942018-01-15 11:08:10 +0100187 /* If we want to read, get the bytes from the mailbox */
Dirk Eibachb46226b2014-07-03 09:28:18 +0200188 if (read) {
Mario Six92164212018-01-15 11:08:11 +0100189#ifdef CONFIG_DM_I2C
Mario Six2df71d62018-03-28 14:37:42 +0200190 fpgamap_read(fpga, priv->addr + REG_READ_MAILBOX_EXT, &val,
191 FPGAMAP_SIZE_16);
Mario Six92164212018-01-15 11:08:11 +0100192#else
Dirk Eibach071be892015-10-28 11:46:22 +0100193 I2C_GET_REG(read_mailbox_ext, &val);
Mario Six92164212018-01-15 11:08:11 +0100194#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200195 buffer[0] = val & 0xff;
196 if (len > 1)
197 buffer[1] = val >> 8;
198 }
199
200 return 0;
201}
202
Mario Six92164212018-01-15 11:08:11 +0100203#ifdef CONFIG_DM_I2C
Mario Six9cef9832018-01-15 11:08:12 +0100204static int ihs_i2c_send_buffer(struct udevice *dev, uchar chip, u8 *data, int len, bool hold_bus, int read)
205#else
206static int ihs_i2c_send_buffer(uchar chip, u8 *data, int len, bool hold_bus,
207 int read)
208#endif
209{
210 while (len) {
211 int transfer = min(len, 2);
212 bool is_last = len <= transfer;
213
214#ifdef CONFIG_DM_I2C
215 if (ihs_i2c_transfer(dev, chip, data, transfer, read,
216 hold_bus ? false : is_last))
217 return 1;
218#else
219 if (ihs_i2c_transfer(chip, data, transfer, read,
220 hold_bus ? false : is_last))
221 return 1;
222#endif
223
224 data += transfer;
225 len -= transfer;
226 }
227
228 return 0;
229}
230
231#ifdef CONFIG_DM_I2C
232static int ihs_i2c_address(struct udevice *dev, uchar chip, u8 *addr, int alen,
233 bool hold_bus)
Mario Six92164212018-01-15 11:08:11 +0100234#else
Mario Six64ef0942018-01-15 11:08:10 +0100235static int ihs_i2c_address(uchar chip, u8 *addr, int alen, bool hold_bus)
Mario Six92164212018-01-15 11:08:11 +0100236#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200237{
Mario Six92164212018-01-15 11:08:11 +0100238#ifdef CONFIG_DM_I2C
Mario Six9cef9832018-01-15 11:08:12 +0100239 return ihs_i2c_send_buffer(dev, chip, addr, alen, hold_bus, I2COP_WRITE);
Mario Six92164212018-01-15 11:08:11 +0100240#else
Mario Six9cef9832018-01-15 11:08:12 +0100241 return ihs_i2c_send_buffer(chip, addr, alen, hold_bus, I2COP_WRITE);
Mario Six92164212018-01-15 11:08:11 +0100242#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200243}
244
Mario Six92164212018-01-15 11:08:11 +0100245#ifdef CONFIG_DM_I2C
246static int ihs_i2c_access(struct udevice *dev, uchar chip, u8 *addr,
247 int alen, uchar *buffer, int len, int read)
248#else
Mario Six64ef0942018-01-15 11:08:10 +0100249static int ihs_i2c_access(struct i2c_adapter *adap, uchar chip, u8 *addr,
250 int alen, uchar *buffer, int len, int read)
Mario Six92164212018-01-15 11:08:11 +0100251#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200252{
Mario Six64ef0942018-01-15 11:08:10 +0100253 /* Don't hold the bus if length of data to send/receive is zero */
Mario Six92164212018-01-15 11:08:11 +0100254#ifdef CONFIG_DM_I2C
255 if (len <= 0 || ihs_i2c_address(dev, chip, addr, alen, len))
256 return 1;
257#else
Mario Six64ef0942018-01-15 11:08:10 +0100258 if (len <= 0 || ihs_i2c_address(chip, addr, alen, len))
Dirk Eibachb46226b2014-07-03 09:28:18 +0200259 return 1;
Mario Six92164212018-01-15 11:08:11 +0100260#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200261
Mario Six92164212018-01-15 11:08:11 +0100262#ifdef CONFIG_DM_I2C
Mario Six9cef9832018-01-15 11:08:12 +0100263 return ihs_i2c_send_buffer(dev, chip, buffer, len, false, read);
Mario Six92164212018-01-15 11:08:11 +0100264#else
Mario Six9cef9832018-01-15 11:08:12 +0100265 return ihs_i2c_send_buffer(chip, buffer, len, false, read);
Mario Six92164212018-01-15 11:08:11 +0100266#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200267}
268
Mario Six92164212018-01-15 11:08:11 +0100269#ifdef CONFIG_DM_I2C
270
271int ihs_i2c_probe(struct udevice *bus)
272{
273 struct ihs_i2c_priv *priv = dev_get_priv(bus);
274 int addr;
275
276 addr = dev_read_u32_default(bus, "reg", -1);
277
278 priv->addr = addr;
279
280 return 0;
281}
282
283static int ihs_i2c_set_bus_speed(struct udevice *bus, uint speed)
284{
285 struct ihs_i2c_priv *priv = dev_get_priv(bus);
286
287 if (speed != priv->speed && priv->speed != 0)
288 return 1;
289
290 priv->speed = speed;
291
292 return 0;
293}
294
295static int ihs_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
296{
297 struct i2c_msg *dmsg, *omsg, dummy;
298
299 memset(&dummy, 0, sizeof(struct i2c_msg));
300
301 /* We expect either two messages (one with an offset and one with the
302 * actucal data) or one message (just data)
303 */
304 if (nmsgs > 2 || nmsgs == 0) {
305 debug("%s: Only one or two messages are supported.", __func__);
306 return -1;
307 }
308
309 omsg = nmsgs == 1 ? &dummy : msg;
310 dmsg = nmsgs == 1 ? msg : msg + 1;
311
312 if (dmsg->flags & I2C_M_RD)
313 return ihs_i2c_access(bus, dmsg->addr, omsg->buf,
314 omsg->len, dmsg->buf, dmsg->len,
315 I2COP_READ);
316 else
317 return ihs_i2c_access(bus, dmsg->addr, omsg->buf,
318 omsg->len, dmsg->buf, dmsg->len,
319 I2COP_WRITE);
320}
321
322static int ihs_i2c_probe_chip(struct udevice *bus, u32 chip_addr,
323 u32 chip_flags)
324{
325 uchar buffer[2];
326
327 if (ihs_i2c_transfer(bus, chip_addr, buffer, 0, I2COP_READ, true))
328 return 1;
329
330 return 0;
331}
332
333static const struct dm_i2c_ops ihs_i2c_ops = {
334 .xfer = ihs_i2c_xfer,
335 .probe_chip = ihs_i2c_probe_chip,
336 .set_bus_speed = ihs_i2c_set_bus_speed,
337};
338
339static const struct udevice_id ihs_i2c_ids[] = {
340 { .compatible = "gdsys,ihs_i2cmaster", },
341 { /* sentinel */ }
342};
343
344U_BOOT_DRIVER(i2c_ihs) = {
345 .name = "i2c_ihs",
346 .id = UCLASS_I2C,
347 .of_match = ihs_i2c_ids,
348 .probe = ihs_i2c_probe,
349 .priv_auto_alloc_size = sizeof(struct ihs_i2c_priv),
350 .ops = &ihs_i2c_ops,
351};
352
353#else /* CONFIG_DM_I2C */
354
Dirk Eibachb46226b2014-07-03 09:28:18 +0200355static void ihs_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
356{
357#ifdef CONFIG_SYS_I2C_INIT_BOARD
358 /*
359 * Call board specific i2c bus reset routine before accessing the
360 * environment, which might be in a chip on that bus. For details
361 * about this problem see doc/I2C_Edge_Conditions.
362 */
363 i2c_init_board();
364#endif
365}
366
367static int ihs_i2c_probe(struct i2c_adapter *adap, uchar chip)
368{
369 uchar buffer[2];
370
Mario Six64ef0942018-01-15 11:08:10 +0100371 if (ihs_i2c_transfer(chip, buffer, 0, I2COP_READ, true))
Dirk Eibachb46226b2014-07-03 09:28:18 +0200372 return 1;
373
374 return 0;
375}
376
377static int ihs_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr,
378 int alen, uchar *buffer, int len)
379{
Mario Six64ef0942018-01-15 11:08:10 +0100380 u8 addr_bytes[4];
381
382 put_unaligned_le32(addr, addr_bytes);
383
384 return ihs_i2c_access(adap, chip, addr_bytes, alen, buffer, len,
385 I2COP_READ);
Dirk Eibachb46226b2014-07-03 09:28:18 +0200386}
387
388static int ihs_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
389 int alen, uchar *buffer, int len)
390{
Mario Six64ef0942018-01-15 11:08:10 +0100391 u8 addr_bytes[4];
392
393 put_unaligned_le32(addr, addr_bytes);
394
395 return ihs_i2c_access(adap, chip, addr_bytes, alen, buffer, len,
396 I2COP_WRITE);
Dirk Eibachb46226b2014-07-03 09:28:18 +0200397}
398
399static unsigned int ihs_i2c_set_bus_speed(struct i2c_adapter *adap,
Dirk Eibach071be892015-10-28 11:46:22 +0100400 unsigned int speed)
Dirk Eibachb46226b2014-07-03 09:28:18 +0200401{
402 if (speed != adap->speed)
403 return 1;
404 return speed;
405}
406
407/*
408 * Register IHS i2c adapters
409 */
410#ifdef CONFIG_SYS_I2C_IHS_CH0
411U_BOOT_I2C_ADAP_COMPLETE(ihs0, ihs_i2c_init, ihs_i2c_probe,
412 ihs_i2c_read, ihs_i2c_write,
413 ihs_i2c_set_bus_speed,
414 CONFIG_SYS_I2C_IHS_SPEED_0,
415 CONFIG_SYS_I2C_IHS_SLAVE_0, 0)
Dirk Eibach071be892015-10-28 11:46:22 +0100416#ifdef CONFIG_SYS_I2C_IHS_DUAL
417U_BOOT_I2C_ADAP_COMPLETE(ihs0_1, ihs_i2c_init, ihs_i2c_probe,
418 ihs_i2c_read, ihs_i2c_write,
419 ihs_i2c_set_bus_speed,
420 CONFIG_SYS_I2C_IHS_SPEED_0_1,
421 CONFIG_SYS_I2C_IHS_SLAVE_0_1, 16)
422#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200423#endif
424#ifdef CONFIG_SYS_I2C_IHS_CH1
425U_BOOT_I2C_ADAP_COMPLETE(ihs1, ihs_i2c_init, ihs_i2c_probe,
426 ihs_i2c_read, ihs_i2c_write,
427 ihs_i2c_set_bus_speed,
428 CONFIG_SYS_I2C_IHS_SPEED_1,
429 CONFIG_SYS_I2C_IHS_SLAVE_1, 1)
Dirk Eibach071be892015-10-28 11:46:22 +0100430#ifdef CONFIG_SYS_I2C_IHS_DUAL
431U_BOOT_I2C_ADAP_COMPLETE(ihs1_1, ihs_i2c_init, ihs_i2c_probe,
432 ihs_i2c_read, ihs_i2c_write,
433 ihs_i2c_set_bus_speed,
434 CONFIG_SYS_I2C_IHS_SPEED_1_1,
435 CONFIG_SYS_I2C_IHS_SLAVE_1_1, 17)
436#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200437#endif
438#ifdef CONFIG_SYS_I2C_IHS_CH2
439U_BOOT_I2C_ADAP_COMPLETE(ihs2, ihs_i2c_init, ihs_i2c_probe,
440 ihs_i2c_read, ihs_i2c_write,
441 ihs_i2c_set_bus_speed,
442 CONFIG_SYS_I2C_IHS_SPEED_2,
443 CONFIG_SYS_I2C_IHS_SLAVE_2, 2)
Dirk Eibach071be892015-10-28 11:46:22 +0100444#ifdef CONFIG_SYS_I2C_IHS_DUAL
445U_BOOT_I2C_ADAP_COMPLETE(ihs2_1, ihs_i2c_init, ihs_i2c_probe,
446 ihs_i2c_read, ihs_i2c_write,
447 ihs_i2c_set_bus_speed,
448 CONFIG_SYS_I2C_IHS_SPEED_2_1,
449 CONFIG_SYS_I2C_IHS_SLAVE_2_1, 18)
450#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200451#endif
452#ifdef CONFIG_SYS_I2C_IHS_CH3
453U_BOOT_I2C_ADAP_COMPLETE(ihs3, ihs_i2c_init, ihs_i2c_probe,
454 ihs_i2c_read, ihs_i2c_write,
455 ihs_i2c_set_bus_speed,
456 CONFIG_SYS_I2C_IHS_SPEED_3,
457 CONFIG_SYS_I2C_IHS_SLAVE_3, 3)
Dirk Eibach071be892015-10-28 11:46:22 +0100458#ifdef CONFIG_SYS_I2C_IHS_DUAL
459U_BOOT_I2C_ADAP_COMPLETE(ihs3_1, ihs_i2c_init, ihs_i2c_probe,
460 ihs_i2c_read, ihs_i2c_write,
461 ihs_i2c_set_bus_speed,
462 CONFIG_SYS_I2C_IHS_SPEED_3_1,
463 CONFIG_SYS_I2C_IHS_SLAVE_3_1, 19)
464#endif
Dirk Eibachb46226b2014-07-03 09:28:18 +0200465#endif
Mario Six92164212018-01-15 11:08:11 +0100466#endif /* CONFIG_DM_I2C */