xref: /rk3399_rockchip-uboot/drivers/i2c/lpc32xx_i2c.c (revision eddac8e9fe80c020fa86d462cd616ba4d4f9f6a5)
15e862b95SAlbert ARIBAUD \(3ADEV\) /*
25e862b95SAlbert ARIBAUD \(3ADEV\)  * LPC32xx I2C interface driver
35e862b95SAlbert ARIBAUD \(3ADEV\)  *
41933af15SSylvain Lemieux  * (C) Copyright 2014-2015  DENX Software Engineering GmbH
55e862b95SAlbert ARIBAUD \(3ADEV\)  * Written-by: Albert ARIBAUD - 3ADEV <albert.aribaud@3adev.fr>
65e862b95SAlbert ARIBAUD \(3ADEV\)  *
75e862b95SAlbert ARIBAUD \(3ADEV\)  * SPDX-License-Identifier:	GPL-2.0+
828527096SSimon Glass  *
928527096SSimon Glass  * NOTE: This driver should be converted to driver model before June 2017.
1028527096SSimon Glass  * Please see doc/driver-model/i2c-howto.txt for instructions.
115e862b95SAlbert ARIBAUD \(3ADEV\)  */
125e862b95SAlbert ARIBAUD \(3ADEV\) 
135e862b95SAlbert ARIBAUD \(3ADEV\) #include <common.h>
145e862b95SAlbert ARIBAUD \(3ADEV\) #include <asm/io.h>
155e862b95SAlbert ARIBAUD \(3ADEV\) #include <i2c.h>
161221ce45SMasahiro Yamada #include <linux/errno.h>
175e862b95SAlbert ARIBAUD \(3ADEV\) #include <asm/arch/clk.h>
185e862b95SAlbert ARIBAUD \(3ADEV\) 
195e862b95SAlbert ARIBAUD \(3ADEV\) /*
205e862b95SAlbert ARIBAUD \(3ADEV\)  * Provide default speed and slave if target did not
215e862b95SAlbert ARIBAUD \(3ADEV\)  */
225e862b95SAlbert ARIBAUD \(3ADEV\) 
235e862b95SAlbert ARIBAUD \(3ADEV\) #if !defined(CONFIG_SYS_I2C_LPC32XX_SPEED)
245e862b95SAlbert ARIBAUD \(3ADEV\) #define CONFIG_SYS_I2C_LPC32XX_SPEED 350000
255e862b95SAlbert ARIBAUD \(3ADEV\) #endif
265e862b95SAlbert ARIBAUD \(3ADEV\) 
275e862b95SAlbert ARIBAUD \(3ADEV\) #if !defined(CONFIG_SYS_I2C_LPC32XX_SLAVE)
285e862b95SAlbert ARIBAUD \(3ADEV\) #define CONFIG_SYS_I2C_LPC32XX_SLAVE 0
295e862b95SAlbert ARIBAUD \(3ADEV\) #endif
305e862b95SAlbert ARIBAUD \(3ADEV\) 
315e862b95SAlbert ARIBAUD \(3ADEV\) /* i2c register set */
32*eddac8e9SLiam Beguin struct lpc32xx_i2c_base {
335e862b95SAlbert ARIBAUD \(3ADEV\) 	union {
345e862b95SAlbert ARIBAUD \(3ADEV\) 		u32 rx;
355e862b95SAlbert ARIBAUD \(3ADEV\) 		u32 tx;
365e862b95SAlbert ARIBAUD \(3ADEV\) 	};
375e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 stat;
385e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 ctrl;
395e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 clk_hi;
405e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 clk_lo;
415e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 adr;
425e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 rxfl;
435e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 txfl;
445e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 rxb;
455e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 txb;
465e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 stx;
475e862b95SAlbert ARIBAUD \(3ADEV\) 	u32 stxfl;
485e862b95SAlbert ARIBAUD \(3ADEV\) };
495e862b95SAlbert ARIBAUD \(3ADEV\) 
505e862b95SAlbert ARIBAUD \(3ADEV\) /* TX register fields */
515e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_TX_START		0x00000100
525e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_TX_STOP		0x00000200
535e862b95SAlbert ARIBAUD \(3ADEV\) 
545e862b95SAlbert ARIBAUD \(3ADEV\) /* Control register values */
555e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_SOFT_RESET		0x00000100
565e862b95SAlbert ARIBAUD \(3ADEV\) 
575e862b95SAlbert ARIBAUD \(3ADEV\) /* Status register values */
585e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_STAT_TFF		0x00000400
595e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_STAT_RFE		0x00000200
605e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_STAT_DRMI		0x00000008
615e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_STAT_NAI		0x00000004
625e862b95SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_I2C_STAT_TDI		0x00000001
635e862b95SAlbert ARIBAUD \(3ADEV\) 
64*eddac8e9SLiam Beguin static struct lpc32xx_i2c_base *lpc32xx_i2c[] = {
65*eddac8e9SLiam Beguin 	(struct lpc32xx_i2c_base *)I2C1_BASE,
66*eddac8e9SLiam Beguin 	(struct lpc32xx_i2c_base *)I2C2_BASE,
67*eddac8e9SLiam Beguin 	(struct lpc32xx_i2c_base *)(USB_BASE + 0x300)
685e862b95SAlbert ARIBAUD \(3ADEV\) };
695e862b95SAlbert ARIBAUD \(3ADEV\) 
705e862b95SAlbert ARIBAUD \(3ADEV\) /* Set I2C bus speed */
71*eddac8e9SLiam Beguin static unsigned int __i2c_set_bus_speed(struct lpc32xx_i2c_base *base,
72*eddac8e9SLiam Beguin 					unsigned int speed, unsigned int chip)
735e862b95SAlbert ARIBAUD \(3ADEV\) {
745e862b95SAlbert ARIBAUD \(3ADEV\) 	int half_period;
755e862b95SAlbert ARIBAUD \(3ADEV\) 
765e862b95SAlbert ARIBAUD \(3ADEV\) 	if (speed == 0)
775e862b95SAlbert ARIBAUD \(3ADEV\) 		return -EINVAL;
785e862b95SAlbert ARIBAUD \(3ADEV\) 
79ea16c6a1SVladimir Zapolskiy 	/* OTG I2C clock source and CLK registers are different */
80*eddac8e9SLiam Beguin 	if (chip == 2) {
81ea16c6a1SVladimir Zapolskiy 		half_period = (get_periph_clk_rate() / speed) / 2;
82ea16c6a1SVladimir Zapolskiy 		if (half_period > 0xFF)
835e862b95SAlbert ARIBAUD \(3ADEV\) 			return -EINVAL;
84ea16c6a1SVladimir Zapolskiy 	} else {
85ea16c6a1SVladimir Zapolskiy 		half_period = (get_hclk_clk_rate() / speed) / 2;
86ea16c6a1SVladimir Zapolskiy 		if (half_period > 0x3FF)
87ea16c6a1SVladimir Zapolskiy 			return -EINVAL;
88ea16c6a1SVladimir Zapolskiy 	}
895e862b95SAlbert ARIBAUD \(3ADEV\) 
90*eddac8e9SLiam Beguin 	writel(half_period, &base->clk_hi);
91*eddac8e9SLiam Beguin 	writel(half_period, &base->clk_lo);
925e862b95SAlbert ARIBAUD \(3ADEV\) 	return 0;
935e862b95SAlbert ARIBAUD \(3ADEV\) }
945e862b95SAlbert ARIBAUD \(3ADEV\) 
955e862b95SAlbert ARIBAUD \(3ADEV\) /* I2C init called by cmd_i2c when doing 'i2c reset'. */
96*eddac8e9SLiam Beguin static void __i2c_init(struct lpc32xx_i2c_base *base,
97*eddac8e9SLiam Beguin 		       int requested_speed, int slaveadd, unsigned int chip)
985e862b95SAlbert ARIBAUD \(3ADEV\) {
995e862b95SAlbert ARIBAUD \(3ADEV\) 	/* soft reset (auto-clears) */
100*eddac8e9SLiam Beguin 	writel(LPC32XX_I2C_SOFT_RESET, &base->ctrl);
101ea16c6a1SVladimir Zapolskiy 	/* set HI and LO periods for half of the default speed */
102*eddac8e9SLiam Beguin 	__i2c_set_bus_speed(base, requested_speed, chip);
1035e862b95SAlbert ARIBAUD \(3ADEV\) }
1045e862b95SAlbert ARIBAUD \(3ADEV\) 
1055e862b95SAlbert ARIBAUD \(3ADEV\) /* I2C probe called by cmd_i2c when doing 'i2c probe'. */
106*eddac8e9SLiam Beguin static int __i2c_probe_chip(struct lpc32xx_i2c_base *base, u8 dev)
1075e862b95SAlbert ARIBAUD \(3ADEV\) {
1085e862b95SAlbert ARIBAUD \(3ADEV\) 	int stat;
1095e862b95SAlbert ARIBAUD \(3ADEV\) 
1105e862b95SAlbert ARIBAUD \(3ADEV\) 	/* Soft-reset the controller */
111*eddac8e9SLiam Beguin 	writel(LPC32XX_I2C_SOFT_RESET, &base->ctrl);
112*eddac8e9SLiam Beguin 	while (readl(&base->ctrl) & LPC32XX_I2C_SOFT_RESET)
1135e862b95SAlbert ARIBAUD \(3ADEV\) 		;
1145e862b95SAlbert ARIBAUD \(3ADEV\) 	/* Addre slave for write with start before and stop after */
1155e862b95SAlbert ARIBAUD \(3ADEV\) 	writel((dev<<1) | LPC32XX_I2C_TX_START | LPC32XX_I2C_TX_STOP,
116*eddac8e9SLiam Beguin 	       &base->tx);
1175e862b95SAlbert ARIBAUD \(3ADEV\) 	/* wait for end of transation */
118*eddac8e9SLiam Beguin 	while (!((stat = readl(&base->stat)) & LPC32XX_I2C_STAT_TDI))
1195e862b95SAlbert ARIBAUD \(3ADEV\) 		;
1205e862b95SAlbert ARIBAUD \(3ADEV\) 	/* was there no acknowledge? */
1215e862b95SAlbert ARIBAUD \(3ADEV\) 	return (stat & LPC32XX_I2C_STAT_NAI) ? -1 : 0;
1225e862b95SAlbert ARIBAUD \(3ADEV\) }
1235e862b95SAlbert ARIBAUD \(3ADEV\) 
1245e862b95SAlbert ARIBAUD \(3ADEV\) /*
1255e862b95SAlbert ARIBAUD \(3ADEV\)  * I2C read called by cmd_i2c when doing 'i2c read' and by cmd_eeprom.c
1265e862b95SAlbert ARIBAUD \(3ADEV\)  * Begin write, send address byte(s), begin read, receive data bytes, end.
1275e862b95SAlbert ARIBAUD \(3ADEV\)  */
128*eddac8e9SLiam Beguin static int __i2c_read(struct lpc32xx_i2c_base *base, u8 dev, uint addr,
1295e862b95SAlbert ARIBAUD \(3ADEV\) 		      int alen, u8 *data, int length)
1305e862b95SAlbert ARIBAUD \(3ADEV\) {
1315e862b95SAlbert ARIBAUD \(3ADEV\) 	int stat, wlen;
1325e862b95SAlbert ARIBAUD \(3ADEV\) 
1335e862b95SAlbert ARIBAUD \(3ADEV\) 	/* Soft-reset the controller */
134*eddac8e9SLiam Beguin 	writel(LPC32XX_I2C_SOFT_RESET, &base->ctrl);
135*eddac8e9SLiam Beguin 	while (readl(&base->ctrl) & LPC32XX_I2C_SOFT_RESET)
1365e862b95SAlbert ARIBAUD \(3ADEV\) 		;
1375e862b95SAlbert ARIBAUD \(3ADEV\) 	/* do we need to write an address at all? */
1385e862b95SAlbert ARIBAUD \(3ADEV\) 	if (alen) {
1395e862b95SAlbert ARIBAUD \(3ADEV\) 		/* Address slave in write mode */
140*eddac8e9SLiam Beguin 		writel((dev<<1) | LPC32XX_I2C_TX_START, &base->tx);
1415e862b95SAlbert ARIBAUD \(3ADEV\) 		/* write address bytes */
1425e862b95SAlbert ARIBAUD \(3ADEV\) 		while (alen--) {
1435e862b95SAlbert ARIBAUD \(3ADEV\) 			/* compute address byte + stop for the last one */
1445e862b95SAlbert ARIBAUD \(3ADEV\) 			int a = (addr >> (8 * alen)) & 0xff;
1455e862b95SAlbert ARIBAUD \(3ADEV\) 			if (!alen)
1465e862b95SAlbert ARIBAUD \(3ADEV\) 				a |= LPC32XX_I2C_TX_STOP;
1475e862b95SAlbert ARIBAUD \(3ADEV\) 			/* Send address byte */
148*eddac8e9SLiam Beguin 			writel(a, &base->tx);
1495e862b95SAlbert ARIBAUD \(3ADEV\) 		}
1505e862b95SAlbert ARIBAUD \(3ADEV\) 		/* wait for end of transation */
151*eddac8e9SLiam Beguin 		while (!((stat = readl(&base->stat)) & LPC32XX_I2C_STAT_TDI))
1525e862b95SAlbert ARIBAUD \(3ADEV\) 			;
1535e862b95SAlbert ARIBAUD \(3ADEV\) 		/* clear end-of-transaction flag */
154*eddac8e9SLiam Beguin 		writel(1, &base->stat);
1555e862b95SAlbert ARIBAUD \(3ADEV\) 	}
1565e862b95SAlbert ARIBAUD \(3ADEV\) 	/* do we have to read data at all? */
1575e862b95SAlbert ARIBAUD \(3ADEV\) 	if (length) {
1585e862b95SAlbert ARIBAUD \(3ADEV\) 		/* Address slave in read mode */
159*eddac8e9SLiam Beguin 		writel(1 | (dev<<1) | LPC32XX_I2C_TX_START, &base->tx);
1605e862b95SAlbert ARIBAUD \(3ADEV\) 		wlen = length;
1615e862b95SAlbert ARIBAUD \(3ADEV\) 		/* get data */
1625e862b95SAlbert ARIBAUD \(3ADEV\) 		while (length | wlen) {
1635e862b95SAlbert ARIBAUD \(3ADEV\) 			/* read status for TFF and RFE */
164*eddac8e9SLiam Beguin 			stat = readl(&base->stat);
1655e862b95SAlbert ARIBAUD \(3ADEV\) 			/* must we, can we write a trigger byte? */
1665e862b95SAlbert ARIBAUD \(3ADEV\) 			if ((wlen > 0)
1675e862b95SAlbert ARIBAUD \(3ADEV\) 			   & (!(stat & LPC32XX_I2C_STAT_TFF))) {
1685e862b95SAlbert ARIBAUD \(3ADEV\) 				wlen--;
1695e862b95SAlbert ARIBAUD \(3ADEV\) 				/* write trigger byte + stop if last */
1705e862b95SAlbert ARIBAUD \(3ADEV\) 				writel(wlen ? 0 :
171*eddac8e9SLiam Beguin 				LPC32XX_I2C_TX_STOP, &base->tx);
1725e862b95SAlbert ARIBAUD \(3ADEV\) 			}
1735e862b95SAlbert ARIBAUD \(3ADEV\) 			/* must we, can we read a data byte? */
1745e862b95SAlbert ARIBAUD \(3ADEV\) 			if ((length > 0)
1755e862b95SAlbert ARIBAUD \(3ADEV\) 			   & (!(stat & LPC32XX_I2C_STAT_RFE))) {
1765e862b95SAlbert ARIBAUD \(3ADEV\) 				length--;
1775e862b95SAlbert ARIBAUD \(3ADEV\) 				/* read byte */
178*eddac8e9SLiam Beguin 				*(data++) = readl(&base->rx);
1795e862b95SAlbert ARIBAUD \(3ADEV\) 			}
1805e862b95SAlbert ARIBAUD \(3ADEV\) 		}
1815e862b95SAlbert ARIBAUD \(3ADEV\) 		/* wait for end of transation */
182*eddac8e9SLiam Beguin 		while (!((stat = readl(&base->stat)) & LPC32XX_I2C_STAT_TDI))
1835e862b95SAlbert ARIBAUD \(3ADEV\) 			;
1845e862b95SAlbert ARIBAUD \(3ADEV\) 		/* clear end-of-transaction flag */
185*eddac8e9SLiam Beguin 		writel(1, &base->stat);
1863d2b6a2eSSylvain Lemieux 	}
1875e862b95SAlbert ARIBAUD \(3ADEV\) 	/* success */
1885e862b95SAlbert ARIBAUD \(3ADEV\) 	return 0;
1895e862b95SAlbert ARIBAUD \(3ADEV\) }
1905e862b95SAlbert ARIBAUD \(3ADEV\) 
1915e862b95SAlbert ARIBAUD \(3ADEV\) /*
1925e862b95SAlbert ARIBAUD \(3ADEV\)  * I2C write called by cmd_i2c when doing 'i2c write' and by cmd_eeprom.c
1935e862b95SAlbert ARIBAUD \(3ADEV\)  * Begin write, send address byte(s), send data bytes, end.
1945e862b95SAlbert ARIBAUD \(3ADEV\)  */
195*eddac8e9SLiam Beguin static int __i2c_write(struct lpc32xx_i2c_base *base, u8 dev, uint addr,
1965e862b95SAlbert ARIBAUD \(3ADEV\) 		       int alen, u8 *data, int length)
1975e862b95SAlbert ARIBAUD \(3ADEV\) {
1985e862b95SAlbert ARIBAUD \(3ADEV\) 	int stat;
1995e862b95SAlbert ARIBAUD \(3ADEV\) 
2005e862b95SAlbert ARIBAUD \(3ADEV\) 	/* Soft-reset the controller */
201*eddac8e9SLiam Beguin 	writel(LPC32XX_I2C_SOFT_RESET, &base->ctrl);
202*eddac8e9SLiam Beguin 	while (readl(&base->ctrl) & LPC32XX_I2C_SOFT_RESET)
2035e862b95SAlbert ARIBAUD \(3ADEV\) 		;
2045e862b95SAlbert ARIBAUD \(3ADEV\) 	/* do we need to write anything at all? */
2055e862b95SAlbert ARIBAUD \(3ADEV\) 	if (alen | length)
2065e862b95SAlbert ARIBAUD \(3ADEV\) 		/* Address slave in write mode */
207*eddac8e9SLiam Beguin 		writel((dev<<1) | LPC32XX_I2C_TX_START, &base->tx);
20858243001SSylvain Lemieux 	else
20958243001SSylvain Lemieux 		return 0;
2105e862b95SAlbert ARIBAUD \(3ADEV\) 	/* write address bytes */
2115e862b95SAlbert ARIBAUD \(3ADEV\) 	while (alen) {
2125e862b95SAlbert ARIBAUD \(3ADEV\) 		/* wait for transmit fifo not full */
213*eddac8e9SLiam Beguin 		stat = readl(&base->stat);
2145e862b95SAlbert ARIBAUD \(3ADEV\) 		if (!(stat & LPC32XX_I2C_STAT_TFF)) {
2155e862b95SAlbert ARIBAUD \(3ADEV\) 			alen--;
2165e862b95SAlbert ARIBAUD \(3ADEV\) 			int a = (addr >> (8 * alen)) & 0xff;
2175e862b95SAlbert ARIBAUD \(3ADEV\) 			if (!(alen | length))
2185e862b95SAlbert ARIBAUD \(3ADEV\) 				a |= LPC32XX_I2C_TX_STOP;
2195e862b95SAlbert ARIBAUD \(3ADEV\) 			/* Send address byte */
220*eddac8e9SLiam Beguin 			writel(a, &base->tx);
2215e862b95SAlbert ARIBAUD \(3ADEV\) 		}
2225e862b95SAlbert ARIBAUD \(3ADEV\) 	}
2235e862b95SAlbert ARIBAUD \(3ADEV\) 	while (length) {
2245e862b95SAlbert ARIBAUD \(3ADEV\) 		/* wait for transmit fifo not full */
225*eddac8e9SLiam Beguin 		stat = readl(&base->stat);
2265e862b95SAlbert ARIBAUD \(3ADEV\) 		if (!(stat & LPC32XX_I2C_STAT_TFF)) {
2275e862b95SAlbert ARIBAUD \(3ADEV\) 			/* compute data byte, add stop if length==0 */
2285e862b95SAlbert ARIBAUD \(3ADEV\) 			length--;
2295e862b95SAlbert ARIBAUD \(3ADEV\) 			int d = *(data++);
2305e862b95SAlbert ARIBAUD \(3ADEV\) 			if (!length)
2315e862b95SAlbert ARIBAUD \(3ADEV\) 				d |= LPC32XX_I2C_TX_STOP;
2325e862b95SAlbert ARIBAUD \(3ADEV\) 			/* Send data byte */
233*eddac8e9SLiam Beguin 			writel(d, &base->tx);
2345e862b95SAlbert ARIBAUD \(3ADEV\) 		}
2355e862b95SAlbert ARIBAUD \(3ADEV\) 	}
2365e862b95SAlbert ARIBAUD \(3ADEV\) 	/* wait for end of transation */
237*eddac8e9SLiam Beguin 	while (!((stat = readl(&base->stat)) & LPC32XX_I2C_STAT_TDI))
2385e862b95SAlbert ARIBAUD \(3ADEV\) 		;
2395e862b95SAlbert ARIBAUD \(3ADEV\) 	/* clear end-of-transaction flag */
240*eddac8e9SLiam Beguin 	writel(1, &base->stat);
2415e862b95SAlbert ARIBAUD \(3ADEV\) 	return 0;
2425e862b95SAlbert ARIBAUD \(3ADEV\) }
2435e862b95SAlbert ARIBAUD \(3ADEV\) 
244552531e4SLiam Beguin static void lpc32xx_i2c_init(struct i2c_adapter *adap,
245552531e4SLiam Beguin 			     int requested_speed, int slaveadd)
246552531e4SLiam Beguin {
247*eddac8e9SLiam Beguin 	__i2c_init(lpc32xx_i2c[adap->hwadapnr], requested_speed, slaveadd,
248*eddac8e9SLiam Beguin 		   adap->hwadapnr);
249552531e4SLiam Beguin }
250552531e4SLiam Beguin 
251552531e4SLiam Beguin static int lpc32xx_i2c_probe_chip(struct i2c_adapter *adap, u8 dev)
252552531e4SLiam Beguin {
253*eddac8e9SLiam Beguin 	return __i2c_probe_chip(lpc32xx_i2c[adap->hwadapnr], dev);
254552531e4SLiam Beguin }
255552531e4SLiam Beguin 
256552531e4SLiam Beguin static int lpc32xx_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
257552531e4SLiam Beguin 			    int alen, u8 *data, int length)
258552531e4SLiam Beguin {
259*eddac8e9SLiam Beguin 	return __i2c_read(lpc32xx_i2c[adap->hwadapnr], dev, addr,
260*eddac8e9SLiam Beguin 			 alen, data, length);
261552531e4SLiam Beguin }
262552531e4SLiam Beguin 
263552531e4SLiam Beguin static int lpc32xx_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
264552531e4SLiam Beguin 			     int alen, u8 *data, int length)
265552531e4SLiam Beguin {
266*eddac8e9SLiam Beguin 	return __i2c_write(lpc32xx_i2c[adap->hwadapnr], dev, addr,
267*eddac8e9SLiam Beguin 			  alen, data, length);
268552531e4SLiam Beguin }
269552531e4SLiam Beguin 
270552531e4SLiam Beguin static unsigned int lpc32xx_i2c_set_bus_speed(struct i2c_adapter *adap,
271552531e4SLiam Beguin 					      unsigned int speed)
272552531e4SLiam Beguin {
273*eddac8e9SLiam Beguin 	return __i2c_set_bus_speed(lpc32xx_i2c[adap->hwadapnr], speed,
274*eddac8e9SLiam Beguin 				  adap->hwadapnr);
275552531e4SLiam Beguin }
276552531e4SLiam Beguin 
277552531e4SLiam Beguin U_BOOT_I2C_ADAP_COMPLETE(lpc32xx_0, lpc32xx_i2c_init, lpc32xx_i2c_probe_chip,
2785e862b95SAlbert ARIBAUD \(3ADEV\) 			 lpc32xx_i2c_read, lpc32xx_i2c_write,
2795e862b95SAlbert ARIBAUD \(3ADEV\) 			 lpc32xx_i2c_set_bus_speed,
2805e862b95SAlbert ARIBAUD \(3ADEV\) 			 CONFIG_SYS_I2C_LPC32XX_SPEED,
2815e862b95SAlbert ARIBAUD \(3ADEV\) 			 CONFIG_SYS_I2C_LPC32XX_SLAVE,
2825e862b95SAlbert ARIBAUD \(3ADEV\) 			 0)
2835e862b95SAlbert ARIBAUD \(3ADEV\) 
284552531e4SLiam Beguin U_BOOT_I2C_ADAP_COMPLETE(lpc32xx_1, lpc32xx_i2c_init, lpc32xx_i2c_probe_chip,
2855e862b95SAlbert ARIBAUD \(3ADEV\) 			 lpc32xx_i2c_read, lpc32xx_i2c_write,
2865e862b95SAlbert ARIBAUD \(3ADEV\) 			 lpc32xx_i2c_set_bus_speed,
2875e862b95SAlbert ARIBAUD \(3ADEV\) 			 CONFIG_SYS_I2C_LPC32XX_SPEED,
2885e862b95SAlbert ARIBAUD \(3ADEV\) 			 CONFIG_SYS_I2C_LPC32XX_SLAVE,
2895e862b95SAlbert ARIBAUD \(3ADEV\) 			 1)
2901933af15SSylvain Lemieux 
291552531e4SLiam Beguin U_BOOT_I2C_ADAP_COMPLETE(lpc32xx_2, lpc32xx_i2c_init, NULL,
2921933af15SSylvain Lemieux 			 lpc32xx_i2c_read, lpc32xx_i2c_write,
2931933af15SSylvain Lemieux 			 lpc32xx_i2c_set_bus_speed,
2941933af15SSylvain Lemieux 			 100000,
2951933af15SSylvain Lemieux 			 0,
2961933af15SSylvain Lemieux 			 2)
297