xref: /openbmc/u-boot/drivers/i2c/i2c-gpio.c (revision 9b643e312d528f291966c1f30b0d90bf3b1d43dc)
1c54473cbSPrzemyslaw Marczak /*
2c54473cbSPrzemyslaw Marczak  * (C) Copyright 2015, Samsung Electronics
3c54473cbSPrzemyslaw Marczak  * Przemyslaw Marczak <p.marczak@samsung.com>
4c54473cbSPrzemyslaw Marczak  *
5c54473cbSPrzemyslaw Marczak  * This file is based on: drivers/i2c/soft-i2c.c,
6c54473cbSPrzemyslaw Marczak  * with added driver-model support and code cleanup.
7c54473cbSPrzemyslaw Marczak  */
8c54473cbSPrzemyslaw Marczak #include <common.h>
9c54473cbSPrzemyslaw Marczak #include <errno.h>
10c54473cbSPrzemyslaw Marczak #include <dm.h>
11c54473cbSPrzemyslaw Marczak #include <i2c.h>
12c54473cbSPrzemyslaw Marczak #include <asm/gpio.h>
13c54473cbSPrzemyslaw Marczak 
14c54473cbSPrzemyslaw Marczak #define DEFAULT_UDELAY	5
15c54473cbSPrzemyslaw Marczak #define RETRIES		0
16c54473cbSPrzemyslaw Marczak #define I2C_ACK		0
17c54473cbSPrzemyslaw Marczak #define I2C_NOACK	1
18c54473cbSPrzemyslaw Marczak 
19c54473cbSPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR;
20c54473cbSPrzemyslaw Marczak 
21c54473cbSPrzemyslaw Marczak enum {
22c54473cbSPrzemyslaw Marczak 	PIN_SDA = 0,
23c54473cbSPrzemyslaw Marczak 	PIN_SCL,
24c54473cbSPrzemyslaw Marczak 	PIN_COUNT,
25c54473cbSPrzemyslaw Marczak };
26c54473cbSPrzemyslaw Marczak 
27c54473cbSPrzemyslaw Marczak struct i2c_gpio_bus {
28c54473cbSPrzemyslaw Marczak 	/**
29c54473cbSPrzemyslaw Marczak 	  * udelay - delay [us] between GPIO toggle operations,
30c54473cbSPrzemyslaw Marczak 	  * which is 1/4 of I2C speed clock period.
31c54473cbSPrzemyslaw Marczak 	 */
32c54473cbSPrzemyslaw Marczak 	int udelay;
33c54473cbSPrzemyslaw Marczak 	 /* sda, scl */
34c54473cbSPrzemyslaw Marczak 	struct gpio_desc gpios[PIN_COUNT];
35c54473cbSPrzemyslaw Marczak };
36c54473cbSPrzemyslaw Marczak 
i2c_gpio_sda_get(struct gpio_desc * sda)37c54473cbSPrzemyslaw Marczak static int i2c_gpio_sda_get(struct gpio_desc *sda)
38c54473cbSPrzemyslaw Marczak {
39c54473cbSPrzemyslaw Marczak 	return dm_gpio_get_value(sda);
40c54473cbSPrzemyslaw Marczak }
41c54473cbSPrzemyslaw Marczak 
i2c_gpio_sda_set(struct gpio_desc * sda,int bit)42c54473cbSPrzemyslaw Marczak static void i2c_gpio_sda_set(struct gpio_desc *sda, int bit)
43c54473cbSPrzemyslaw Marczak {
4476382aa2SAxel Lin 	if (bit)
45c54473cbSPrzemyslaw Marczak 		dm_gpio_set_dir_flags(sda, GPIOD_IS_IN);
4676382aa2SAxel Lin 	else
47c54473cbSPrzemyslaw Marczak 		dm_gpio_set_dir_flags(sda, GPIOD_IS_OUT);
48c54473cbSPrzemyslaw Marczak }
49c54473cbSPrzemyslaw Marczak 
i2c_gpio_scl_set(struct gpio_desc * scl,int bit)50c54473cbSPrzemyslaw Marczak static void i2c_gpio_scl_set(struct gpio_desc *scl, int bit)
51c54473cbSPrzemyslaw Marczak {
5276382aa2SAxel Lin 	ulong flags = GPIOD_IS_OUT;
5376382aa2SAxel Lin 
5476382aa2SAxel Lin 	if (bit)
5576382aa2SAxel Lin 		flags |= GPIOD_IS_OUT_ACTIVE;
5676382aa2SAxel Lin 	dm_gpio_set_dir_flags(scl, flags);
57c54473cbSPrzemyslaw Marczak }
58c54473cbSPrzemyslaw Marczak 
i2c_gpio_write_bit(struct gpio_desc * scl,struct gpio_desc * sda,int delay,uchar bit)59c54473cbSPrzemyslaw Marczak static void i2c_gpio_write_bit(struct gpio_desc *scl, struct gpio_desc *sda,
60c54473cbSPrzemyslaw Marczak 			       int delay, uchar bit)
61c54473cbSPrzemyslaw Marczak {
62c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 0);
63c54473cbSPrzemyslaw Marczak 	udelay(delay);
64c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_set(sda, bit);
65c54473cbSPrzemyslaw Marczak 	udelay(delay);
66c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 1);
67c54473cbSPrzemyslaw Marczak 	udelay(2 * delay);
68c54473cbSPrzemyslaw Marczak }
69c54473cbSPrzemyslaw Marczak 
i2c_gpio_read_bit(struct gpio_desc * scl,struct gpio_desc * sda,int delay)70c54473cbSPrzemyslaw Marczak static int i2c_gpio_read_bit(struct gpio_desc *scl, struct gpio_desc *sda,
71c54473cbSPrzemyslaw Marczak 			     int delay)
72c54473cbSPrzemyslaw Marczak {
73c54473cbSPrzemyslaw Marczak 	int value;
74c54473cbSPrzemyslaw Marczak 
75c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 1);
76c54473cbSPrzemyslaw Marczak 	udelay(delay);
77c54473cbSPrzemyslaw Marczak 	value = i2c_gpio_sda_get(sda);
78c54473cbSPrzemyslaw Marczak 	udelay(delay);
79c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 0);
80c54473cbSPrzemyslaw Marczak 	udelay(2 * delay);
81c54473cbSPrzemyslaw Marczak 
82c54473cbSPrzemyslaw Marczak 	return value;
83c54473cbSPrzemyslaw Marczak }
84c54473cbSPrzemyslaw Marczak 
85c54473cbSPrzemyslaw Marczak /* START: High -> Low on SDA while SCL is High */
i2c_gpio_send_start(struct gpio_desc * scl,struct gpio_desc * sda,int delay)86c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_start(struct gpio_desc *scl, struct gpio_desc *sda,
87c54473cbSPrzemyslaw Marczak 				int delay)
88c54473cbSPrzemyslaw Marczak {
89c54473cbSPrzemyslaw Marczak 	udelay(delay);
90c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_set(sda, 1);
91c54473cbSPrzemyslaw Marczak 	udelay(delay);
92c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 1);
93c54473cbSPrzemyslaw Marczak 	udelay(delay);
94c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_set(sda, 0);
95c54473cbSPrzemyslaw Marczak 	udelay(delay);
96c54473cbSPrzemyslaw Marczak }
97c54473cbSPrzemyslaw Marczak 
98c54473cbSPrzemyslaw Marczak /* STOP: Low -> High on SDA while SCL is High */
i2c_gpio_send_stop(struct gpio_desc * scl,struct gpio_desc * sda,int delay)99c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_stop(struct gpio_desc *scl, struct gpio_desc *sda,
100c54473cbSPrzemyslaw Marczak 			       int delay)
101c54473cbSPrzemyslaw Marczak {
102c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 0);
103c54473cbSPrzemyslaw Marczak 	udelay(delay);
104c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_set(sda, 0);
105c54473cbSPrzemyslaw Marczak 	udelay(delay);
106c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 1);
107c54473cbSPrzemyslaw Marczak 	udelay(delay);
108c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_set(sda, 1);
109c54473cbSPrzemyslaw Marczak 	udelay(delay);
110c54473cbSPrzemyslaw Marczak }
111c54473cbSPrzemyslaw Marczak 
112c54473cbSPrzemyslaw Marczak /* ack should be I2C_ACK or I2C_NOACK */
i2c_gpio_send_ack(struct gpio_desc * scl,struct gpio_desc * sda,int delay,int ack)113c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_ack(struct gpio_desc *scl, struct gpio_desc *sda,
114c54473cbSPrzemyslaw Marczak 			      int delay, int ack)
115c54473cbSPrzemyslaw Marczak {
116c54473cbSPrzemyslaw Marczak 	i2c_gpio_write_bit(scl, sda, delay, ack);
117c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 0);
118c54473cbSPrzemyslaw Marczak 	udelay(delay);
119c54473cbSPrzemyslaw Marczak }
120c54473cbSPrzemyslaw Marczak 
121c54473cbSPrzemyslaw Marczak /**
122c54473cbSPrzemyslaw Marczak  * Send a reset sequence consisting of 9 clocks with the data signal high
123c54473cbSPrzemyslaw Marczak  * to clock any confused device back into an idle state.  Also send a
124c54473cbSPrzemyslaw Marczak  * <stop> at the end of the sequence for belts & suspenders.
125c54473cbSPrzemyslaw Marczak  */
i2c_gpio_send_reset(struct gpio_desc * scl,struct gpio_desc * sda,int delay)126c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_reset(struct gpio_desc *scl, struct gpio_desc *sda,
127c54473cbSPrzemyslaw Marczak 				int delay)
128c54473cbSPrzemyslaw Marczak {
129c54473cbSPrzemyslaw Marczak 	int j;
130c54473cbSPrzemyslaw Marczak 
131c54473cbSPrzemyslaw Marczak 	for (j = 0; j < 9; j++)
132c54473cbSPrzemyslaw Marczak 		i2c_gpio_write_bit(scl, sda, delay, 1);
133c54473cbSPrzemyslaw Marczak 
134c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_stop(scl, sda, delay);
135c54473cbSPrzemyslaw Marczak }
136c54473cbSPrzemyslaw Marczak 
137c54473cbSPrzemyslaw Marczak /* Set sda high with low clock, before reading slave data */
i2c_gpio_sda_high(struct gpio_desc * scl,struct gpio_desc * sda,int delay)138c54473cbSPrzemyslaw Marczak static void i2c_gpio_sda_high(struct gpio_desc *scl, struct gpio_desc *sda,
139c54473cbSPrzemyslaw Marczak 			      int delay)
140c54473cbSPrzemyslaw Marczak {
141c54473cbSPrzemyslaw Marczak 	i2c_gpio_scl_set(scl, 0);
142c54473cbSPrzemyslaw Marczak 	udelay(delay);
143c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_set(sda, 1);
144c54473cbSPrzemyslaw Marczak 	udelay(delay);
145c54473cbSPrzemyslaw Marczak }
146c54473cbSPrzemyslaw Marczak 
147c54473cbSPrzemyslaw Marczak /* Send 8 bits and look for an acknowledgement */
i2c_gpio_write_byte(struct gpio_desc * scl,struct gpio_desc * sda,int delay,uchar data)148c54473cbSPrzemyslaw Marczak static int i2c_gpio_write_byte(struct gpio_desc *scl, struct gpio_desc *sda,
149c54473cbSPrzemyslaw Marczak 			       int delay, uchar data)
150c54473cbSPrzemyslaw Marczak {
151c54473cbSPrzemyslaw Marczak 	int j;
152c54473cbSPrzemyslaw Marczak 	int nack;
153c54473cbSPrzemyslaw Marczak 
154c54473cbSPrzemyslaw Marczak 	for (j = 0; j < 8; j++) {
155c54473cbSPrzemyslaw Marczak 		i2c_gpio_write_bit(scl, sda, delay, data & 0x80);
156c54473cbSPrzemyslaw Marczak 		data <<= 1;
157c54473cbSPrzemyslaw Marczak 	}
158c54473cbSPrzemyslaw Marczak 
159c54473cbSPrzemyslaw Marczak 	udelay(delay);
160c54473cbSPrzemyslaw Marczak 
161c54473cbSPrzemyslaw Marczak 	/* Look for an <ACK>(negative logic) and return it */
162c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_high(scl, sda, delay);
163c54473cbSPrzemyslaw Marczak 	nack = i2c_gpio_read_bit(scl, sda, delay);
164c54473cbSPrzemyslaw Marczak 
165c54473cbSPrzemyslaw Marczak 	return nack;	/* not a nack is an ack */
166c54473cbSPrzemyslaw Marczak }
167c54473cbSPrzemyslaw Marczak 
168c54473cbSPrzemyslaw Marczak /**
169c54473cbSPrzemyslaw Marczak  * if ack == I2C_ACK, ACK the byte so can continue reading, else
170c54473cbSPrzemyslaw Marczak  * send I2C_NOACK to end the read.
171c54473cbSPrzemyslaw Marczak  */
i2c_gpio_read_byte(struct gpio_desc * scl,struct gpio_desc * sda,int delay,int ack)172c54473cbSPrzemyslaw Marczak static uchar i2c_gpio_read_byte(struct gpio_desc *scl, struct gpio_desc *sda,
173c54473cbSPrzemyslaw Marczak 				int delay, int ack)
174c54473cbSPrzemyslaw Marczak {
175c54473cbSPrzemyslaw Marczak 	int  data;
176c54473cbSPrzemyslaw Marczak 	int  j;
177c54473cbSPrzemyslaw Marczak 
178c54473cbSPrzemyslaw Marczak 	i2c_gpio_sda_high(scl, sda, delay);
179c54473cbSPrzemyslaw Marczak 	data = 0;
180c54473cbSPrzemyslaw Marczak 	for (j = 0; j < 8; j++) {
181c54473cbSPrzemyslaw Marczak 		data <<= 1;
182c54473cbSPrzemyslaw Marczak 		data |= i2c_gpio_read_bit(scl, sda, delay);
183c54473cbSPrzemyslaw Marczak 	}
184c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_ack(scl, sda, delay, ack);
185c54473cbSPrzemyslaw Marczak 
186c54473cbSPrzemyslaw Marczak 	return data;
187c54473cbSPrzemyslaw Marczak }
188c54473cbSPrzemyslaw Marczak 
189c54473cbSPrzemyslaw Marczak /* send start and the slave chip address */
i2c_send_slave_addr(struct gpio_desc * scl,struct gpio_desc * sda,int delay,uchar chip)190c54473cbSPrzemyslaw Marczak int i2c_send_slave_addr(struct gpio_desc *scl, struct gpio_desc *sda, int delay,
191c54473cbSPrzemyslaw Marczak 			uchar chip)
192c54473cbSPrzemyslaw Marczak {
193c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_start(scl, sda, delay);
194c54473cbSPrzemyslaw Marczak 
195c54473cbSPrzemyslaw Marczak 	if (i2c_gpio_write_byte(scl, sda, delay, chip)) {
196c54473cbSPrzemyslaw Marczak 		i2c_gpio_send_stop(scl, sda, delay);
197c54473cbSPrzemyslaw Marczak 		return -EIO;
198c54473cbSPrzemyslaw Marczak 	}
199c54473cbSPrzemyslaw Marczak 
200c54473cbSPrzemyslaw Marczak 	return 0;
201c54473cbSPrzemyslaw Marczak }
202c54473cbSPrzemyslaw Marczak 
i2c_gpio_write_data(struct i2c_gpio_bus * bus,uchar chip,uchar * buffer,int len,bool end_with_repeated_start)203c54473cbSPrzemyslaw Marczak static int i2c_gpio_write_data(struct i2c_gpio_bus *bus, uchar chip,
204c54473cbSPrzemyslaw Marczak 			       uchar *buffer, int len,
205c54473cbSPrzemyslaw Marczak 			       bool end_with_repeated_start)
206c54473cbSPrzemyslaw Marczak {
207c54473cbSPrzemyslaw Marczak 	struct gpio_desc *scl = &bus->gpios[PIN_SCL];
208c54473cbSPrzemyslaw Marczak 	struct gpio_desc *sda = &bus->gpios[PIN_SDA];
209c54473cbSPrzemyslaw Marczak 	unsigned int delay = bus->udelay;
210c54473cbSPrzemyslaw Marczak 	int failures = 0;
211c54473cbSPrzemyslaw Marczak 
212c54473cbSPrzemyslaw Marczak 	debug("%s: chip %x buffer %p len %d\n", __func__, chip, buffer, len);
213c54473cbSPrzemyslaw Marczak 
214c54473cbSPrzemyslaw Marczak 	if (i2c_send_slave_addr(scl, sda, delay, chip << 1)) {
215c54473cbSPrzemyslaw Marczak 		debug("i2c_write, no chip responded %02X\n", chip);
216c54473cbSPrzemyslaw Marczak 		return -EIO;
217c54473cbSPrzemyslaw Marczak 	}
218c54473cbSPrzemyslaw Marczak 
219c54473cbSPrzemyslaw Marczak 	while (len-- > 0) {
220c54473cbSPrzemyslaw Marczak 		if (i2c_gpio_write_byte(scl, sda, delay, *buffer++))
221c54473cbSPrzemyslaw Marczak 			failures++;
222c54473cbSPrzemyslaw Marczak 	}
223c54473cbSPrzemyslaw Marczak 
224c54473cbSPrzemyslaw Marczak 	if (!end_with_repeated_start) {
225c54473cbSPrzemyslaw Marczak 		i2c_gpio_send_stop(scl, sda, delay);
226c54473cbSPrzemyslaw Marczak 		return failures;
227c54473cbSPrzemyslaw Marczak 	}
228c54473cbSPrzemyslaw Marczak 
229c54473cbSPrzemyslaw Marczak 	if (i2c_send_slave_addr(scl, sda, delay, (chip << 1) | 0x1)) {
230c54473cbSPrzemyslaw Marczak 		debug("i2c_write, no chip responded %02X\n", chip);
231c54473cbSPrzemyslaw Marczak 		return -EIO;
232c54473cbSPrzemyslaw Marczak 	}
233c54473cbSPrzemyslaw Marczak 
234c54473cbSPrzemyslaw Marczak 	return failures;
235c54473cbSPrzemyslaw Marczak }
236c54473cbSPrzemyslaw Marczak 
i2c_gpio_read_data(struct i2c_gpio_bus * bus,uchar chip,uchar * buffer,int len)237c54473cbSPrzemyslaw Marczak static int i2c_gpio_read_data(struct i2c_gpio_bus *bus, uchar chip,
238c54473cbSPrzemyslaw Marczak 			      uchar *buffer, int len)
239c54473cbSPrzemyslaw Marczak {
240c54473cbSPrzemyslaw Marczak 	struct gpio_desc *scl = &bus->gpios[PIN_SCL];
241c54473cbSPrzemyslaw Marczak 	struct gpio_desc *sda = &bus->gpios[PIN_SDA];
242c54473cbSPrzemyslaw Marczak 	unsigned int delay = bus->udelay;
243c54473cbSPrzemyslaw Marczak 
244c54473cbSPrzemyslaw Marczak 	debug("%s: chip %x buffer: %p len %d\n", __func__, chip, buffer, len);
245c54473cbSPrzemyslaw Marczak 
246c54473cbSPrzemyslaw Marczak 	while (len-- > 0)
247c54473cbSPrzemyslaw Marczak 		*buffer++ = i2c_gpio_read_byte(scl, sda, delay, len == 0);
248c54473cbSPrzemyslaw Marczak 
249c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_stop(scl, sda, delay);
250c54473cbSPrzemyslaw Marczak 
251c54473cbSPrzemyslaw Marczak 	return 0;
252c54473cbSPrzemyslaw Marczak }
253c54473cbSPrzemyslaw Marczak 
i2c_gpio_xfer(struct udevice * dev,struct i2c_msg * msg,int nmsgs)254c54473cbSPrzemyslaw Marczak static int i2c_gpio_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs)
255c54473cbSPrzemyslaw Marczak {
256c54473cbSPrzemyslaw Marczak 	struct i2c_gpio_bus *bus = dev_get_priv(dev);
257c54473cbSPrzemyslaw Marczak 	int ret;
258c54473cbSPrzemyslaw Marczak 
259c54473cbSPrzemyslaw Marczak 	for (; nmsgs > 0; nmsgs--, msg++) {
260c54473cbSPrzemyslaw Marczak 		bool next_is_read = nmsgs > 1 && (msg[1].flags & I2C_M_RD);
261c54473cbSPrzemyslaw Marczak 
262c54473cbSPrzemyslaw Marczak 		if (msg->flags & I2C_M_RD) {
263c54473cbSPrzemyslaw Marczak 			ret = i2c_gpio_read_data(bus, msg->addr, msg->buf,
264c54473cbSPrzemyslaw Marczak 						 msg->len);
265c54473cbSPrzemyslaw Marczak 		} else {
266c54473cbSPrzemyslaw Marczak 			ret = i2c_gpio_write_data(bus, msg->addr, msg->buf,
267c54473cbSPrzemyslaw Marczak 						  msg->len, next_is_read);
268c54473cbSPrzemyslaw Marczak 		}
269c54473cbSPrzemyslaw Marczak 
270c54473cbSPrzemyslaw Marczak 		if (ret)
271c54473cbSPrzemyslaw Marczak 			return -EREMOTEIO;
272c54473cbSPrzemyslaw Marczak 	}
273c54473cbSPrzemyslaw Marczak 
274c54473cbSPrzemyslaw Marczak 	return 0;
275c54473cbSPrzemyslaw Marczak }
276c54473cbSPrzemyslaw Marczak 
i2c_gpio_probe(struct udevice * dev,uint chip,uint chip_flags)277c54473cbSPrzemyslaw Marczak static int i2c_gpio_probe(struct udevice *dev, uint chip, uint chip_flags)
278c54473cbSPrzemyslaw Marczak {
279c54473cbSPrzemyslaw Marczak 	struct i2c_gpio_bus *bus = dev_get_priv(dev);
280c54473cbSPrzemyslaw Marczak 	struct gpio_desc *scl = &bus->gpios[PIN_SCL];
281c54473cbSPrzemyslaw Marczak 	struct gpio_desc *sda = &bus->gpios[PIN_SDA];
282c54473cbSPrzemyslaw Marczak 	unsigned int delay = bus->udelay;
283c54473cbSPrzemyslaw Marczak 	int ret;
284c54473cbSPrzemyslaw Marczak 
285c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_start(scl, sda, delay);
286c54473cbSPrzemyslaw Marczak 	ret = i2c_gpio_write_byte(scl, sda, delay, (chip << 1) | 0);
287c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_stop(scl, sda, delay);
288c54473cbSPrzemyslaw Marczak 
289c54473cbSPrzemyslaw Marczak 	debug("%s: bus: %d (%s) chip: %x flags: %x ret: %d\n",
290c54473cbSPrzemyslaw Marczak 	      __func__, dev->seq, dev->name, chip, chip_flags, ret);
291c54473cbSPrzemyslaw Marczak 
292c54473cbSPrzemyslaw Marczak 	return ret;
293c54473cbSPrzemyslaw Marczak }
294c54473cbSPrzemyslaw Marczak 
i2c_gpio_set_bus_speed(struct udevice * dev,unsigned int speed_hz)295c54473cbSPrzemyslaw Marczak static int i2c_gpio_set_bus_speed(struct udevice *dev, unsigned int speed_hz)
296c54473cbSPrzemyslaw Marczak {
297c54473cbSPrzemyslaw Marczak 	struct i2c_gpio_bus *bus = dev_get_priv(dev);
298c54473cbSPrzemyslaw Marczak 	struct gpio_desc *scl = &bus->gpios[PIN_SCL];
299c54473cbSPrzemyslaw Marczak 	struct gpio_desc *sda = &bus->gpios[PIN_SDA];
300c54473cbSPrzemyslaw Marczak 
301c54473cbSPrzemyslaw Marczak 	bus->udelay = 1000000 / (speed_hz << 2);
302c54473cbSPrzemyslaw Marczak 
303c54473cbSPrzemyslaw Marczak 	i2c_gpio_send_reset(scl, sda, bus->udelay);
304c54473cbSPrzemyslaw Marczak 
305c54473cbSPrzemyslaw Marczak 	return 0;
306c54473cbSPrzemyslaw Marczak }
307c54473cbSPrzemyslaw Marczak 
i2c_gpio_ofdata_to_platdata(struct udevice * dev)308c54473cbSPrzemyslaw Marczak static int i2c_gpio_ofdata_to_platdata(struct udevice *dev)
309c54473cbSPrzemyslaw Marczak {
310c54473cbSPrzemyslaw Marczak 	struct i2c_gpio_bus *bus = dev_get_priv(dev);
311c54473cbSPrzemyslaw Marczak 	const void *blob = gd->fdt_blob;
312e160f7d4SSimon Glass 	int node = dev_of_offset(dev);
313c54473cbSPrzemyslaw Marczak 	int ret;
314c54473cbSPrzemyslaw Marczak 
315c54473cbSPrzemyslaw Marczak 	ret = gpio_request_list_by_name(dev, "gpios", bus->gpios,
316c54473cbSPrzemyslaw Marczak 					ARRAY_SIZE(bus->gpios), 0);
317c54473cbSPrzemyslaw Marczak 	if (ret < 0)
318c54473cbSPrzemyslaw Marczak 		goto error;
319c54473cbSPrzemyslaw Marczak 
320c54473cbSPrzemyslaw Marczak 	bus->udelay = fdtdec_get_int(blob, node, "i2c-gpio,delay-us",
321c54473cbSPrzemyslaw Marczak 				     DEFAULT_UDELAY);
322c54473cbSPrzemyslaw Marczak 
323c54473cbSPrzemyslaw Marczak 	return 0;
324c54473cbSPrzemyslaw Marczak error:
325*9b643e31SMasahiro Yamada 	pr_err("Can't get %s gpios! Error: %d", dev->name, ret);
326c54473cbSPrzemyslaw Marczak 	return ret;
327c54473cbSPrzemyslaw Marczak }
328c54473cbSPrzemyslaw Marczak 
329c54473cbSPrzemyslaw Marczak static const struct dm_i2c_ops i2c_gpio_ops = {
330c54473cbSPrzemyslaw Marczak 	.xfer		= i2c_gpio_xfer,
331c54473cbSPrzemyslaw Marczak 	.probe_chip	= i2c_gpio_probe,
332c54473cbSPrzemyslaw Marczak 	.set_bus_speed	= i2c_gpio_set_bus_speed,
333c54473cbSPrzemyslaw Marczak };
334c54473cbSPrzemyslaw Marczak 
335c54473cbSPrzemyslaw Marczak static const struct udevice_id i2c_gpio_ids[] = {
336c54473cbSPrzemyslaw Marczak 	{ .compatible = "i2c-gpio" },
337c54473cbSPrzemyslaw Marczak 	{ }
338c54473cbSPrzemyslaw Marczak };
339c54473cbSPrzemyslaw Marczak 
340c54473cbSPrzemyslaw Marczak U_BOOT_DRIVER(i2c_gpio) = {
341c54473cbSPrzemyslaw Marczak 	.name	= "i2c-gpio",
342c54473cbSPrzemyslaw Marczak 	.id	= UCLASS_I2C,
343c54473cbSPrzemyslaw Marczak 	.of_match = i2c_gpio_ids,
344c54473cbSPrzemyslaw Marczak 	.ofdata_to_platdata = i2c_gpio_ofdata_to_platdata,
345c54473cbSPrzemyslaw Marczak 	.priv_auto_alloc_size = sizeof(struct i2c_gpio_bus),
346c54473cbSPrzemyslaw Marczak 	.ops	= &i2c_gpio_ops,
347c54473cbSPrzemyslaw Marczak };
348